diff --git a/Adapt/Adapt.h b/Adapt/Adapt.h
new file mode 100644
index 0000000000000000000000000000000000000000..93535a75d1280bff6c936c57980a3c17a049347c
--- /dev/null
+++ b/Adapt/Adapt.h
@@ -0,0 +1,20 @@
+#ifndef _ADAPT_H_
+#define _ADAPT_H_
+
+#define ADAPT_P1 1
+#define ADAPT_P2 2
+#define ADAPT_H1 3
+#define ADAPT_H2 4
+
+double optimesh (
+		 int N,        /* Nombre d'elements a traiter        */
+		 int method,   /* H1 , P1 , H2 ou P2                 */
+		 int dim,      /* 2 pour 2D et 3 pour 3D             */
+		 double *err,  /* erreurs elementaires               */
+		 double *h,    /* tailles de mailles elementaires    */
+		 double *p,    /* exposante elementaires             */
+		 double e0,    /* erreur prescrite par l'utilisateur */
+		 double N0     /* nbre d'elements ds le maillage opt */
+		 );
+
+#endif
diff --git a/Adapt/Makefile b/Adapt/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..11dde31017aa475a8601fb9e272415365a5d6be8
--- /dev/null
+++ b/Adapt/Makefile
@@ -0,0 +1,71 @@
+#
+# Makefile for "libAdapt.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g
+
+OS_FLAGS  = -D_UNIX
+
+RM        = rm
+RMFLAGS   = -f
+RANLIB    = ranlib
+
+LIB       = ../lib/libAdapt.a
+INCLUDE   = -I../Common -I../DataStr
+
+CFLAGS    = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) 
+
+SRC = brent.cpp \
+      mnbrak.cpp \
+      nrutil.cpp \
+      optimesh.cpp \
+      dsvdcmp.cpp \
+      newt.cpp \
+      fmin.cpp \
+      fdjac.cpp \
+      lnsrch.cpp \
+      lubksb.cpp \
+      ludcmp.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ)
+	ar ruvs $(LIB) $(OBJ)
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o 
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+brent.o: brent.cpp nrutil.h ../Common/Const.h
+mnbrak.o: mnbrak.cpp nrutil.h ../Common/Const.h
+nrutil.o: nrutil.cpp
+optimesh.o: optimesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Adapt.h nrutil.h ../Common/Const.h
+dsvdcmp.o: dsvdcmp.cpp nrutil.h ../Common/Const.h
+newt.o: newt.cpp nrutil.h ../Common/Const.h
+fmin.o: fmin.cpp nrutil.h ../Common/Const.h
+fdjac.o: fdjac.cpp nrutil.h ../Common/Const.h
+lnsrch.o: lnsrch.cpp nrutil.h ../Common/Const.h
+lubksb.o: lubksb.cpp
+ludcmp.o: ludcmp.cpp nrutil.h ../Common/Const.h
diff --git a/Adapt/brent.cpp b/Adapt/brent.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..63adc4bc809253719e23e47872146417ccac8127
--- /dev/null
+++ b/Adapt/brent.cpp
@@ -0,0 +1,98 @@
+
+
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define ITMAX 100
+#define CGOLD 0.3819660
+#define ZEPS 1.0e-10
+#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+
+double 
+brent (double ax, double bx, double cx, double (*f) (double), double tol,
+       double *xmin)
+{
+  int iter;
+  double a, b, d=0.0, etemp, fu, fv, fw, fx, p, q, r, tol1, tol2, u, v, w,
+    x, xm;
+  double e = 0.0;
+
+  a = (ax < cx ? ax : cx);
+  b = (ax > cx ? ax : cx);
+  x = w = v = bx;
+  fw = fv = fx = (*f) (x);
+  for (iter = 1; iter <= ITMAX; iter++)
+    {
+      xm = 0.5 * (a + b);
+      tol2 = 2.0 * (tol1 = tol * fabs (x) + ZEPS);
+      if (fabs (x - xm) <= (tol2 - 0.5 * (b - a)))
+	{
+	  *xmin = x;
+	  return fx;
+	}
+      if (fabs (e) > tol1)
+	{
+	  r = (x - w) * (fx - fv);
+	  q = (x - v) * (fx - fw);
+	  p = (x - v) * q - (x - w) * r;
+	  q = 2.0 * (q - r);
+	  if (q > 0.0)
+	    p = -p;
+	  q = fabs (q);
+	  etemp = e;
+	  e = d;
+	  if (fabs (p) >= fabs (0.5 * q * etemp) || p <= q * (a - x) || p >= q * (b - x))
+	    d = CGOLD * (e = (x >= xm ? a - x : b - x));
+	  else
+	    {
+	      d = p / q;
+	      u = x + d;
+	      if (u - a < tol2 || b - u < tol2)
+		d = SIGN (tol1, xm - x);
+	    }
+	}
+      else
+	{
+	  d = CGOLD * (e = (x >= xm ? a - x : b - x));
+	}
+      u = (fabs (d) >= tol1 ? x + d : x + SIGN (tol1, d));
+      fu = (*f) (u);
+      if (fu <= fx)
+	{
+	  if (u >= x)
+	    a = x;
+	  else
+	    b = x;
+	  SHFT (v, w, x, u)
+	    SHFT (fv, fw, fx, fu)
+	}
+      else
+	{
+	  if (u < x)
+	    a = u;
+	  else
+	    b = u;
+	  if (fu <= fw || w == x)
+	    {
+	      v = w;
+	      w = u;
+	      fv = fw;
+	      fw = fu;
+	    }
+	  else if (fu <= fv || v == x || v == w)
+	    {
+	      v = u;
+	      fv = fu;
+	    }
+	}
+    }
+  nrerror ("Too many iterations in brent");
+  *xmin = x;
+  return fx;
+}
+#undef ITMAX
+#undef CGOLD
+#undef ZEPS
+#undef SHFT
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/dsvdcmp.cpp b/Adapt/dsvdcmp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b105aff243c2eb3443477398bd9847e5ed7a6613
--- /dev/null
+++ b/Adapt/dsvdcmp.cpp
@@ -0,0 +1,239 @@
+#include <math.h>
+
+#include "nrutil.h"
+
+double dpythag(double a, double b)
+{
+  double absa,absb;
+  absa=fabs(a);
+  absb=fabs(b);
+  if (absa > absb) return absa*sqrt(1.0+SQR(absb/absa));
+  else return (absb == 0.0 ? 0.0 : absb*sqrt(1.0+SQR(absa/absb)));
+}
+
+void dsvdcmp(double **a, int m, int n, double w[], double **v)
+{
+  double dpythag(double a, double b);
+  int flag,i,its,j,jj,k,l,nm;
+  double anorm,c,f,g,h,s,scale,x,y,z,*rv1;
+
+  rv1=dvector(1,n);
+  g=scale=anorm=0.0;
+  for (i=1;i<=n;i++) {
+    l=i+1;
+    rv1[i]=scale*g;
+    g=s=scale=0.0;
+    if (i <= m) {
+      for (k=i;k<=m;k++) scale += fabs(a[k][i]);
+      if (scale) {
+	for (k=i;k<=m;k++) {
+	  a[k][i] /= scale;
+	  s += a[k][i]*a[k][i];
+	}
+	f=a[i][i];
+	g = -SIGN(sqrt(s),f);
+	h=f*g-s;
+	a[i][i]=f-g;
+	for (j=l;j<=n;j++) {
+	  for (s=0.0,k=i;k<=m;k++) s += a[k][i]*a[k][j];
+	  f=s/h;
+	  for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
+	}
+	for (k=i;k<=m;k++) a[k][i] *= scale;
+      }
+    }
+    w[i]=scale *g;
+    g=s=scale=0.0;
+    if (i <= m && i != n) {
+      for (k=l;k<=n;k++) scale += fabs(a[i][k]);
+      if (scale) {
+	for (k=l;k<=n;k++) {
+	  a[i][k] /= scale;
+	  s += a[i][k]*a[i][k];
+	}
+	f=a[i][l];
+	g = -SIGN(sqrt(s),f);
+	h=f*g-s;
+	a[i][l]=f-g;
+	for (k=l;k<=n;k++) rv1[k]=a[i][k]/h;
+	for (j=l;j<=m;j++) {
+	  for (s=0.0,k=l;k<=n;k++) s += a[j][k]*a[i][k];
+	  for (k=l;k<=n;k++) a[j][k] += s*rv1[k];
+	}
+	for (k=l;k<=n;k++) a[i][k] *= scale;
+      }
+    }
+    anorm=DMAX(anorm,(fabs(w[i])+fabs(rv1[i])));
+  }
+  for (i=n;i>=1;i--) {
+    if (i < n) {
+      if (g) {
+	for (j=l;j<=n;j++) v[j][i]=(a[i][j]/a[i][l])/g;
+	for (j=l;j<=n;j++) {
+	  for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j];
+	  for (k=l;k<=n;k++) v[k][j] += s*v[k][i];
+	}
+      }
+      for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0;
+    }
+    v[i][i]=1.0;
+    g=rv1[i];
+    l=i;
+  }
+  for (i=IMIN(m,n);i>=1;i--) {
+    l=i+1;
+    g=w[i];
+    for (j=l;j<=n;j++) a[i][j]=0.0;
+    if (g) {
+      g=1.0/g;
+      for (j=l;j<=n;j++) {
+	for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j];
+	f=(s/a[i][i])*g;
+	for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
+      }
+      for (j=i;j<=m;j++) a[j][i] *= g;
+    } else for (j=i;j<=m;j++) a[j][i]=0.0;
+    ++a[i][i];
+  }
+  for (k=n;k>=1;k--) {
+    for (its=1;its<=30;its++) {
+      flag=1;
+      for (l=k;l>=1;l--) {
+	nm=l-1;
+	if ((double)(fabs(rv1[l])+anorm) == anorm) {
+	  flag=0;
+	  break;
+	}
+	if ((double)(fabs(w[nm])+anorm) == anorm) break;
+      }
+      if (flag) {
+	c=0.0;
+	s=1.0;
+	for (i=l;i<=k;i++) {
+	  f=s*rv1[i];
+	  rv1[i]=c*rv1[i];
+	  if ((double)(fabs(f)+anorm) == anorm) break;
+	  g=w[i];
+	  h=dpythag(f,g);
+	  w[i]=h;
+	  h=1.0/h;
+	  c=g*h;
+	  s = -f*h;
+	  for (j=1;j<=m;j++) {
+	    y=a[j][nm];
+	    z=a[j][i];
+	    a[j][nm]=y*c+z*s;
+	    a[j][i]=z*c-y*s;
+	  }
+	}
+      }
+      z=w[k];
+      if (l == k) {
+	if (z < 0.0) {
+	  w[k] = -z;
+	  for (j=1;j<=n;j++) v[j][k] = -v[j][k];
+	}
+	break;
+      }
+      if (its == 30) nrerror("no convergence in 30 dsvdcmp iterations");
+      x=w[l];
+      nm=k-1;
+      y=w[nm];
+      g=rv1[nm];
+      h=rv1[k];
+      f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
+      g=dpythag(f,1.0);
+      f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x;
+      c=s=1.0;
+      for (j=l;j<=nm;j++) {
+	i=j+1;
+	g=rv1[i];
+	y=w[i];
+	h=s*g;
+	g=c*g;
+	z=dpythag(f,h);
+	rv1[j]=z;
+	c=f/z;
+	s=h/z;
+	f=x*c+g*s;
+	g = g*c-x*s;
+	h=y*s;
+	y *= c;
+	for (jj=1;jj<=n;jj++) {
+	  x=v[jj][j];
+	  z=v[jj][i];
+	  v[jj][j]=x*c+z*s;
+	  v[jj][i]=z*c-x*s;
+	}
+	z=dpythag(f,h);
+	w[j]=z;
+	if (z) {
+	  z=1.0/z;
+	  c=f*z;
+	  s=h*z;
+	}
+	f=c*g+s*y;
+	x=c*y-s*g;
+	for (jj=1;jj<=m;jj++) {
+	  y=a[jj][j];
+	  z=a[jj][i];
+	  a[jj][j]=y*c+z*s;
+	  a[jj][i]=z*c-y*s;
+	}
+      }
+      rv1[l]=0.0;
+      rv1[k]=f;
+      w[k]=x;
+    }
+  }
+  free_dvector(rv1,1,n);
+}
+
+
+/* cf. Numerical Recipes in C, p. 62 */
+
+#define PREC   1.e-16
+
+void invert_singular_matrix(double **M, int n, double **I){
+  double  **V, **T, *W;
+  int     i, j, k; 
+
+  V = dmatrix(1,n,1,n);
+  T = dmatrix(1,n,1,n);
+  W = dvector(1,n);
+
+  dsvdcmp(M, n, n, W, V);
+
+  for(i=1 ; i<=n ; i++){
+    for(j=1 ; j<=n ; j++){
+      I[i][j] = 0.0 ;
+      T[i][j] = 0.0 ;
+    }
+  }
+
+  for(i=1 ; i<=n ; i++){
+    for(j=1 ; j<=n ; j++){
+      if(fabs(W[i]) > PREC){
+	T[i][j] += M[j][i] / W[i] ;
+      }
+      /*
+      else{
+	T[i][j] += 0.0 ;
+      }
+      */
+    }
+  }
+  for(i=1 ; i<=n ; i++){
+    for(j=1 ; j<=n ; j++){
+      for(k=1 ; k<=n ; k++){
+	I[i][j] += V[i][k] * T[k][j] ;
+      }
+    }
+  }
+
+  free_dmatrix(V,1,n,1,n);
+  free_dmatrix(T,1,n,1,n);
+  free_dvector(W,1,n);
+}
+
+#undef PREC 
diff --git a/Adapt/fdjac.cpp b/Adapt/fdjac.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d433da408d9a4e1c01caf8ae3a1aeafd7f9ba026
--- /dev/null
+++ b/Adapt/fdjac.cpp
@@ -0,0 +1,31 @@
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define EPS 1.0e-4
+
+void 
+fdjac (int n, float x[], float fvec[], float **df,
+       void (*vecfunc) (int, float[], float[]))
+{
+  int i, j;
+  float h, temp, *f;
+
+  f = vector (1, n);
+  for (j = 1; j <= n; j++)
+    {
+      temp = x[j];
+      h = EPS * fabs (temp);
+      if (h == 0.0)
+	h = EPS;
+      x[j] = temp + h;
+      h = x[j] - temp;
+      (*vecfunc) (n, x, f);
+      x[j] = temp;
+      for (i = 1; i <= n; i++)
+	df[i][j] = (f[i] - fvec[i]) / h;
+    }
+  free_vector (f, 1, n);
+}
+#undef EPS
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/fmin.cpp b/Adapt/fmin.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..12db64bfa16ffdd494271f9d98caee19df1a71a9
--- /dev/null
+++ b/Adapt/fmin.cpp
@@ -0,0 +1,20 @@
+#define NRANSI
+#include "nrutil.h"
+
+extern int nn;
+extern float *fvec;
+extern void (*nrfuncv) (int n, float v[], float f[]);
+
+float 
+fmin (float x[])
+{
+  int i;
+  float sum;
+
+  (*nrfuncv) (nn, x, fvec);
+  for (sum = 0.0, i = 1; i <= nn; i++)
+    sum += SQR (fvec[i]);
+  return 0.5 * sum;
+}
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/lnsrch.cpp b/Adapt/lnsrch.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6b4d87d454a2e18d0d9ef453206289c4b19f18bd
--- /dev/null
+++ b/Adapt/lnsrch.cpp
@@ -0,0 +1,80 @@
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define ALF 1.0e-4
+#define TOLX 1.0e-7
+
+void 
+lnsrch (int n, float xold[], float fold, float g[], float p[], float x[],
+	float *f, float stpmax, int *check, float (*func) (float[]))
+{
+  int i;
+  float a, alam, alam2, alamin, b, disc, f2, fold2, rhs1, rhs2, slope,
+    sum, temp, test, tmplam;
+
+  *check = 0;
+  for (sum = 0.0, i = 1; i <= n; i++)
+    sum += p[i] * p[i];
+  sum = sqrt (sum);
+  if (sum > stpmax)
+    for (i = 1; i <= n; i++)
+      p[i] *= stpmax / sum;
+  for (slope = 0.0, i = 1; i <= n; i++)
+    slope += g[i] * p[i];
+  test = 0.0;
+  for (i = 1; i <= n; i++)
+    {
+      temp = fabs (p[i]) / FMAX (fabs (xold[i]), 1.0);
+      if (temp > test)
+	test = temp;
+    }
+  alamin = TOLX / test;
+  alam = 1.0;
+  for (;;)
+    {
+      for (i = 1; i <= n; i++)
+	x[i] = xold[i] + alam * p[i];
+      *f = (*func) (x);
+      if (alam < alamin)
+	{
+	  for (i = 1; i <= n; i++)
+	    x[i] = xold[i];
+	  *check = 1;
+	  return;
+	}
+      else if (*f <= fold + ALF * alam * slope)
+	return;
+      else
+	{
+	  if (alam == 1.0)
+	    tmplam = -slope / (2.0 * (*f - fold - slope));
+	  else
+	    {
+	      rhs1 = *f - fold - alam * slope;
+	      rhs2 = f2 - fold2 - alam2 * slope;
+	      a = (rhs1 / (alam * alam) - rhs2 / (alam2 * alam2)) / (alam - alam2);
+	      b = (-alam2 * rhs1 / (alam * alam) + alam * rhs2 / (alam2 * alam2)) / (alam - alam2);
+	      if (a == 0.0)
+		tmplam = -slope / (2.0 * b);
+	      else
+		{
+		  disc = b * b - 3.0 * a * slope;
+		  if (disc < 0.0)
+		    nrerror ("Roundoff problem in lnsrch.");
+		  else
+		    tmplam = (-b + sqrt (disc)) / (3.0 * a);
+		}
+	      if (tmplam > 0.5 * alam)
+		tmplam = 0.5 * alam;
+	    }
+	}
+      alam2 = alam;
+      f2 = *f;
+      fold2 = fold;
+      alam = FMAX (tmplam, 0.1 * alam);
+    }
+}
+#undef ALF
+#undef TOLX
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/lubksb.cpp b/Adapt/lubksb.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..31c5164188f585b111ca3b8280e268f4b0843837
--- /dev/null
+++ b/Adapt/lubksb.cpp
@@ -0,0 +1,27 @@
+void 
+lubksb (float **a, int n, int *indx, float b[])
+{
+  int i, ii = 0, ip, j;
+  float sum;
+
+  for (i = 1; i <= n; i++)
+    {
+      ip = indx[i];
+      sum = b[ip];
+      b[ip] = b[i];
+      if (ii)
+	for (j = ii; j <= i - 1; j++)
+	  sum -= a[i][j] * b[j];
+      else if (sum)
+	ii = i;
+      b[i] = sum;
+    }
+  for (i = n; i >= 1; i--)
+    {
+      sum = b[i];
+      for (j = i + 1; j <= n; j++)
+	sum -= a[i][j] * b[j];
+      b[i] = sum / a[i][i];
+    }
+}
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/ludcmp.cpp b/Adapt/ludcmp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8b77834dbfa1a86fd0467af0f67181d4f1ca31f0
--- /dev/null
+++ b/Adapt/ludcmp.cpp
@@ -0,0 +1,72 @@
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define TINY 1.0e-20;
+
+void 
+ludcmp (float **a, int n, int *indx, float *d)
+{
+  int i, imax, j, k;
+  float big, dum, sum, temp;
+  float *vv;
+
+  vv = vector (1, n);
+  *d = 1.0;
+  for (i = 1; i <= n; i++)
+    {
+      big = 0.0;
+      for (j = 1; j <= n; j++)
+	if ((temp = fabs (a[i][j])) > big)
+	  big = temp;
+      if (big == 0.0)
+	nrerror ("Singular matrix in routine ludcmp");
+      vv[i] = 1.0 / big;
+    }
+  for (j = 1; j <= n; j++)
+    {
+      for (i = 1; i < j; i++)
+	{
+	  sum = a[i][j];
+	  for (k = 1; k < i; k++)
+	    sum -= a[i][k] * a[k][j];
+	  a[i][j] = sum;
+	}
+      big = 0.0;
+      for (i = j; i <= n; i++)
+	{
+	  sum = a[i][j];
+	  for (k = 1; k < j; k++)
+	    sum -= a[i][k] * a[k][j];
+	  a[i][j] = sum;
+	  if ((dum = vv[i] * fabs (sum)) >= big)
+	    {
+	      big = dum;
+	      imax = i;
+	    }
+	}
+      if (j != imax)
+	{
+	  for (k = 1; k <= n; k++)
+	    {
+	      dum = a[imax][k];
+	      a[imax][k] = a[j][k];
+	      a[j][k] = dum;
+	    }
+	  *d = -(*d);
+	  vv[imax] = vv[j];
+	}
+      indx[j] = imax;
+      if (a[j][j] == 0.0)
+	a[j][j] = TINY;
+      if (j != n)
+	{
+	  dum = 1.0 / (a[j][j]);
+	  for (i = j + 1; i <= n; i++)
+	    a[i][j] *= dum;
+	}
+    }
+  free_vector (vv, 1, n);
+}
+#undef TINY
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/mnbrak.cpp b/Adapt/mnbrak.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..85d839633572b94ff7a81eb8317fd09e0056e037
--- /dev/null
+++ b/Adapt/mnbrak.cpp
@@ -0,0 +1,79 @@
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define GOLD 1.618034
+#define GLIMIT 100.0
+#define TINY 1.0e-20
+#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+
+void 
+mnbrak (double *ax, double *bx, double *cx, double *fa, double *fb, double *fc,
+	double (*func) (double))
+{
+  double ulim, u, r, q, fu, dum;
+
+  *fa = (*func) (*ax);
+  *fb = (*func) (*bx);
+  if (*fb > *fa)
+    {
+      SHFT (dum, *ax, *bx, dum)
+	SHFT (dum, *fb, *fa, dum)
+    }
+  *cx = (*bx) + GOLD * (*bx - *ax);
+  *fc = (*func) (*cx);
+  while (*fb > *fc)
+    {
+      r = (*bx - *ax) * (*fb - *fc);
+      q = (*bx - *cx) * (*fb - *fa);
+      u = (*bx) - ((*bx - *cx) * q - (*bx - *ax) * r) /
+	(2.0 * SIGN (FMAX (fabs (q - r), TINY), q - r));
+      ulim = (*bx) + GLIMIT * (*cx - *bx);
+      if ((*bx - u) * (u - *cx) > 0.0)
+	{
+	  fu = (*func) (u);
+	  if (fu < *fc)
+	    {
+	      *ax = (*bx);
+	      *bx = u;
+	      *fa = (*fb);
+	      *fb = fu;
+	      return;
+	    }
+	  else if (fu > *fb)
+	    {
+	      *cx = u;
+	      *fc = fu;
+	      return;
+	    }
+	  u = (*cx) + GOLD * (*cx - *bx);
+	  fu = (*func) (u);
+	}
+      else if ((*cx - u) * (u - ulim) > 0.0)
+	{
+	  fu = (*func) (u);
+	  if (fu < *fc)
+	    {
+	      SHFT (*bx, *cx, u, *cx + GOLD * (*cx - *bx))
+		SHFT (*fb, *fc, fu, (*func) (u))
+	    }
+	}
+      else if ((u - ulim) * (ulim - *cx) >= 0.0)
+	{
+	  u = ulim;
+	  fu = (*func) (u);
+	}
+      else
+	{
+	  u = (*cx) + GOLD * (*cx - *bx);
+	  fu = (*func) (u);
+	}
+      SHFT (*ax, *bx, *cx, u)
+	SHFT (*fa, *fb, *fc, fu)
+    }
+}
+#undef GOLD
+#undef GLIMIT
+#undef TINY
+#undef SHFT
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/newt.cpp b/Adapt/newt.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ece185703ea5fb00224149c4bef1caa78332f2f3
--- /dev/null
+++ b/Adapt/newt.cpp
@@ -0,0 +1,107 @@
+#include <math.h>
+#define NRANSI
+#include "nrutil.h"
+#define MAXITS 200
+#define TOLF 1.0e-4
+#define TOLMIN 1.0e-6
+#define TOLX 1.0e-7
+#define STPMX 100.0
+
+int nn;
+float *fvec;
+void (*nrfuncv) (int n, float v[], float f[]);
+#define FREERETURN {free_vector(fvec,1,n);free_vector(xold,1,n);\
+	free_vector(p,1,n);free_vector(g,1,n);free_matrix(fjac,1,n,1,n);\
+	free_ivector(indx,1,n);return;}
+
+void 
+newt (float x[], int n, int *check,
+      void (*vecfunc) (int, float[], float[]))
+{
+  void fdjac (int n, float x[], float fvec[], float **df,
+	      void (*vecfunc) (int, float[], float[]));
+  float fmin (float x[]);
+  void lnsrch (int n, float xold[], float fold, float g[], float p[], float x[],
+	       float *f, float stpmax, int *check, float (*func) (float[]));
+  void lubksb (float **a, int n, int *indx, float b[]);
+  void ludcmp (float **a, int n, int *indx, float *d);
+  int i, its, j, *indx;
+  float d, den, f, fold, stpmax, sum, temp, test, **fjac, *g, *p, *xold;
+
+  indx = ivector (1, n);
+  fjac = matrix (1, n, 1, n);
+  g = vector (1, n);
+  p = vector (1, n);
+  xold = vector (1, n);
+  fvec = vector (1, n);
+  nn = n;
+  nrfuncv = vecfunc;
+  f = fmin (x);
+  test = 0.0;
+  for (i = 1; i <= n; i++)
+    if (fabs (fvec[i]) > test)
+      test = fabs (fvec[i]);
+  if (test < 0.01 * TOLF)
+    FREERETURN
+      for (sum = 0.0, i = 1; i <= n; i++)
+      sum += SQR (x[i]);
+  stpmax = STPMX * FMAX (sqrt (sum), (float) n);
+  for (its = 1; its <= MAXITS; its++)
+    {
+      fdjac (n, x, fvec, fjac, vecfunc);
+      for (i = 1; i <= n; i++)
+	{
+	  for (sum = 0.0, j = 1; j <= n; j++)
+	    sum += fjac[j][i] * fvec[j];
+	  g[i] = sum;
+	}
+      for (i = 1; i <= n; i++)
+	xold[i] = x[i];
+      fold = f;
+      for (i = 1; i <= n; i++)
+	p[i] = -fvec[i];
+      ludcmp (fjac, n, indx, &d);
+      lubksb (fjac, n, indx, p);
+      lnsrch (n, xold, fold, g, p, x, &f, stpmax, check, fmin);
+      test = 0.0;
+      for (i = 1; i <= n; i++)
+	if (fabs (fvec[i]) > test)
+	  test = fabs (fvec[i]);
+      if (test < TOLF)
+	{
+	  *check = 0;
+	  FREERETURN
+	}
+      if (*check)
+	{
+	  test = 0.0;
+	  den = FMAX (f, 0.5 * n);
+	  for (i = 1; i <= n; i++)
+	    {
+	      temp = fabs (g[i]) * FMAX (fabs (x[i]), 1.0) / den;
+	      if (temp > test)
+		test = temp;
+	    }
+	  *check = (test < TOLMIN ? 1 : 0);
+	  FREERETURN
+	}
+      test = 0.0;
+      for (i = 1; i <= n; i++)
+	{
+	  temp = (fabs (x[i] - xold[i])) / FMAX (fabs (x[i]), 1.0);
+	  if (temp > test)
+	    test = temp;
+	}
+      if (test < TOLX)
+	FREERETURN
+	}
+	nrerror ("MAXITS exceeded in newt");
+    }
+#undef MAXITS
+#undef TOLF
+#undef TOLMIN
+#undef TOLX
+#undef STPMX
+#undef FREERETURN
+#undef NRANSI
+/* (C) Copr. 1986-92 Numerical Recipes Software J!0. */
diff --git a/Adapt/nrutil.cpp b/Adapt/nrutil.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b6b7b8fb82d43863c6249d26db33f489bccc489
--- /dev/null
+++ b/Adapt/nrutil.cpp
@@ -0,0 +1,290 @@
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <malloc.h>
+
+
+#define NR_END 1
+#define FREE_ARG char*
+
+void nrerror(char error_text[])
+/* Numerical Recipes standard error handler */
+{
+	fprintf(stderr,"Numerical Recipes run-time error...\n");
+	fprintf(stderr,"%s\n",error_text);
+	fprintf(stderr,"...now exiting to system...\n");
+	exit(1);
+}
+
+float *vector(long nl, long nh)
+/* allocate a float vector with subscript range v[nl..nh] */
+{
+	float *v;
+
+	v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
+	if (!v) nrerror("allocation failure in vector()");
+	return v-nl+NR_END;
+}
+
+int *ivector(long nl, long nh)
+/* allocate an int vector with subscript range v[nl..nh] */
+{
+	int *v;
+
+	v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int)));
+	if (!v) nrerror("allocation failure in ivector()");
+	return v-nl+NR_END;
+}
+
+unsigned char *cvector(long nl, long nh)
+/* allocate an unsigned char vector with subscript range v[nl..nh] */
+{
+	unsigned char *v;
+
+	v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
+	if (!v) nrerror("allocation failure in cvector()");
+	return v-nl+NR_END;
+}
+
+unsigned long *lvector(long nl, long nh)
+/* allocate an unsigned long vector with subscript range v[nl..nh] */
+{
+	unsigned long *v;
+
+	v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long)));
+	if (!v) nrerror("allocation failure in lvector()");
+	return v-nl+NR_END;
+}
+
+double *dvector(long nl, long nh)
+/* allocate a double vector with subscript range v[nl..nh] */
+{
+	double *v;
+
+	v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
+	if (!v) nrerror("allocation failure in dvector()");
+	return v-nl+NR_END;
+}
+
+float **matrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+	float **m;
+
+	/* allocate pointers to rows */
+	m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
+	if (!m) nrerror("allocation failure 1 in matrix()");
+	m += NR_END;
+	m -= nrl;
+
+	/* allocate rows and set pointers to them */
+	m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
+	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+	m[nrl] += NR_END;
+	m[nrl] -= ncl;
+
+	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+	/* return pointer to array of pointers to rows */
+	return m;
+}
+
+double **dmatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+	double **m;
+
+	/* allocate pointers to rows */
+	m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
+	if (!m) nrerror("allocation failure 1 in matrix()");
+	m += NR_END;
+	m -= nrl;
+
+	/* allocate rows and set pointers to them */
+	m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
+	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+	m[nrl] += NR_END;
+	m[nrl] -= ncl;
+
+	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+	/* return pointer to array of pointers to rows */
+	return m;
+}
+
+int **imatrix(long nrl, long nrh, long ncl, long nch)
+/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+	int **m;
+
+	/* allocate pointers to rows */
+	m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
+	if (!m) nrerror("allocation failure 1 in matrix()");
+	m += NR_END;
+	m -= nrl;
+
+
+	/* allocate rows and set pointers to them */
+	m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
+	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+	m[nrl] += NR_END;
+	m[nrl] -= ncl;
+
+	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+	/* return pointer to array of pointers to rows */
+	return m;
+}
+
+float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
+	long newrl, long newcl)
+/* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
+{
+	long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
+	float **m;
+
+	/* allocate array of pointers to rows */
+	m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
+	if (!m) nrerror("allocation failure in submatrix()");
+	m += NR_END;
+	m -= newrl;
+
+	/* set pointers to rows */
+	for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
+
+	/* return pointer to array of pointers to rows */
+	return m;
+}
+
+float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
+/* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
+declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
+and ncol=nch-ncl+1. The routine should be called with the address
+&a[0][0] as the first argument. */
+{
+	long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
+	float **m;
+
+	/* allocate pointers to rows */
+	m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
+	if (!m) nrerror("allocation failure in convert_matrix()");
+	m += NR_END;
+	m -= nrl;
+
+	/* set pointers to rows */
+	m[nrl]=a-ncl;
+	for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
+	/* return pointer to array of pointers to rows */
+	return m;
+}
+
+float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
+/* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
+{
+	long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
+	float ***t;
+
+	/* allocate pointers to pointers to rows */
+	t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**)));
+	if (!t) nrerror("allocation failure 1 in f3tensor()");
+	t += NR_END;
+	t -= nrl;
+
+	/* allocate pointers to rows and set pointers to them */
+	t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*)));
+	if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
+	t[nrl] += NR_END;
+	t[nrl] -= ncl;
+
+	/* allocate rows and set pointers to them */
+	t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float)));
+	if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
+	t[nrl][ncl] += NR_END;
+	t[nrl][ncl] -= ndl;
+
+	for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
+	for(i=nrl+1;i<=nrh;i++) {
+		t[i]=t[i-1]+ncol;
+		t[i][ncl]=t[i-1][ncl]+ncol*ndep;
+		for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
+	}
+
+	/* return pointer to array of pointers to rows */
+	return t;
+}
+
+void free_vector(float *v, long nl, long nh)
+/* free a float vector allocated with vector() */
+{
+	free((FREE_ARG) (v+nl-NR_END));
+}
+
+void free_ivector(int *v, long nl, long nh)
+/* free an int vector allocated with ivector() */
+{
+	free((FREE_ARG) (v+nl-NR_END));
+}
+
+void free_cvector(unsigned char *v, long nl, long nh)
+/* free an unsigned char vector allocated with cvector() */
+{
+	free((FREE_ARG) (v+nl-NR_END));
+}
+
+void free_lvector(unsigned long *v, long nl, long nh)
+/* free an unsigned long vector allocated with lvector() */
+{
+	free((FREE_ARG) (v+nl-NR_END));
+}
+
+void free_dvector(double *v, long nl, long nh)
+/* free a double vector allocated with dvector() */
+{
+	free((FREE_ARG) (v+nl-NR_END));
+}
+
+void free_matrix(float **m, long nrl, long nrh, long ncl, long nch)
+/* free a float matrix allocated by matrix() */
+{
+	free((FREE_ARG) (m[nrl]+ncl-NR_END));
+	free((FREE_ARG) (m+nrl-NR_END));
+}
+
+void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
+/* free a double matrix allocated by dmatrix() */
+{
+	free((FREE_ARG) (m[nrl]+ncl-NR_END));
+	free((FREE_ARG) (m+nrl-NR_END));
+}
+
+void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch)
+/* free an int matrix allocated by imatrix() */
+{
+	free((FREE_ARG) (m[nrl]+ncl-NR_END));
+	free((FREE_ARG) (m+nrl-NR_END));
+}
+
+void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch)
+/* free a submatrix allocated by submatrix() */
+{
+	free((FREE_ARG) (b+nrl-NR_END));
+}
+
+void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch)
+/* free a matrix allocated by convert_matrix() */
+{
+	free((FREE_ARG) (b+nrl-NR_END));
+}
+
+void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
+	long ndl, long ndh)
+/* free a float f3tensor allocated by f3tensor() */
+{
+	free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END));
+	free((FREE_ARG) (t[nrl]+ncl-NR_END));
+	free((FREE_ARG) (t+nrl-NR_END));
+}
+
diff --git a/Adapt/nrutil.h b/Adapt/nrutil.h
new file mode 100644
index 0000000000000000000000000000000000000000..5eb39aac0b5df638ff735364fe4d919b0f845a7d
--- /dev/null
+++ b/Adapt/nrutil.h
@@ -0,0 +1,35 @@
+#ifndef _NR_UTILS_H_
+#define _NR_UTILS_H_
+
+#include "Const.h"
+
+#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))
+
+void nrerror (char error_text[]);
+float *vector (long nl, long nh);
+int *ivector (long nl, long nh);
+unsigned char *cvector (long nl, long nh);
+unsigned long *lvector (long nl, long nh);
+double *dvector (long nl, long nh);
+float **matrix (long nrl, long nrh, long ncl, long nch);
+double **dmatrix (long nrl, long nrh, long ncl, long nch);
+int **imatrix (long nrl, long nrh, long ncl, long nch);
+float **submatrix (float **a, long oldrl, long oldrh, long oldcl, long oldch,
+		   long newrl, long newcl);
+float **convert_matrix (float *a, long nrl, long nrh, long ncl, long nch);
+float ***f3tensor (long nrl, long nrh, long ncl, long nch, long ndl, long ndh);
+void free_vector (float *v, long nl, long nh);
+void free_ivector (int *v, long nl, long nh);
+void free_cvector (unsigned char *v, long nl, long nh);
+void free_lvector (unsigned long *v, long nl, long nh);
+void free_dvector (double *v, long nl, long nh);
+void free_matrix (float **m, long nrl, long nrh, long ncl, long nch);
+void free_dmatrix (double **m, long nrl, long nrh, long ncl, long nch);
+void free_imatrix (int **m, long nrl, long nrh, long ncl, long nch);
+void free_submatrix (float **b, long nrl, long nrh, long ncl, long nch);
+void free_convert_matrix (float **b, long nrl, long nrh, long ncl, long nch);
+void free_f3tensor (float ***t, long nrl, long nrh, long ncl, long nch,
+		    long ndl, long ndh);
+
+
+#endif /* _NR_UTILS_H_ */
diff --git a/Adapt/optimesh.cpp b/Adapt/optimesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..486809ebcea5b5322c31782623814748a16ed25a
--- /dev/null
+++ b/Adapt/optimesh.cpp
@@ -0,0 +1,238 @@
+
+#include "Gmsh.h"
+#include "Adapt.h"
+#include "nrutil.h"
+
+#define TOL 1.e-08
+#define MAXDEG 999
+
+void frprmn(double p[], int n, double ftol, int *iter, double *fret,
+	double (*func)(double []), void (*dfunc)(double [], double []));
+
+extern void SetError(char *, char *);
+
+static int NN,METHOD;
+static double MINH , *ERR , *HH , *PP , E0, DIM ;
+
+/* METODE H VERSION 1 : MINIMISER LE NOMBRE D'ELEMENTS
+   TOUT EN GARDANT UNE ERREUR GLOBALE DONNEE.  ON MODIFIE
+   ICI LE VECTEUR TAILLE DE MAILLE
+*/
+
+double fH1 ( double l ){
+
+  int i;
+  double val1,val2;
+
+  val1 = 0.0;
+
+  for(i=1;i<=NN;i++){
+    val1 += pow(2.*l*DSQR(ERR[i])*PP[i]/DIM,(DIM/(2.*PP[i]+DIM)));
+  }
+  val2 = 0.0;
+  for(i=1;i<=NN;i++){
+    val2 += DSQR(ERR[i])*pow(2.*l*DSQR(ERR[i])*PP[i]/DIM,(-2.*PP[i]/(2.*PP[i]+DIM)));
+  }
+  return -(val1 + l * ( val2 - DSQR(E0)));
+}
+
+/* METODE H VERSION 2 : MINIMISER L'ERREUR
+   TOUT EN GARDANT UN NOMBRE D'ELEMENTS DONNE.  ON MODIFIE
+   ICI LE VECTEUR TAILLE DE MAILLE
+*/
+
+double fH2 ( double l ){
+
+  int i;
+  double val1,val2,qi;
+
+  val1 = val2 = 0.0;
+  for(i=1;i<=NN;i++){
+    qi = pow((DIM*l)/(2.*PP[i] * DSQR(ERR[i])) 
+	     ,-DIM/(DIM+2.*PP[i]));
+    val1 += DSQR(ERR[i]) * pow(qi,-2.*PP[i]/DIM);
+    val2 += qi;
+  }
+/*
+  printf( "%12.5e %12.5e\n",l,val1 + l * ( val2 - E0));
+*/
+  return -(val1 + l * ( val2 - E0));
+}
+
+
+/* METODE P VERSION 1 : MINIMISER LE NOMBRE D'ELEMENTS
+   TOUT EN GARDANT UNE ERREUR GLOBALE DONNEE.  ON MODIFIE
+   ICI LE VECTEUR DEGRE D'INTERPOLATION
+*/
+
+double fP1 ( double l ){
+
+  int i;
+  double val1,val2,qi,e;
+
+  val1 = val2 = 0.0;
+  for(i=1;i<=NN;i++){
+    e = ERR[i];
+    if(e==0.0)e=1.e-12;
+    qi = - log (2. * l * log (HH[i]/MINH) * DSQR(e)) / log (HH[i]/MINH);
+    val1 -= .5 * qi;
+    val2 += pow(HH[i]/MINH,qi) * DSQR(e);
+  }
+/*
+  printf( "%12.5e %12.5e\n",l,val1 + l * ( val2 - DSQR(E0)));
+*/
+  return -(val1 + l * ( val2 - DSQR(E0)));
+}
+
+
+double min1d ( double (*funct)(double), double *xmin){
+  double brent(double ax, double bx, double cx,
+	      double (*f)(double), double tol, double *xmin);
+  void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb,
+		double *fc, double (*func)(double));
+  double xx,fx,fb,fa,bx,ax;
+
+  switch(METHOD){
+  case ADAPT_H1:
+  case ADAPT_P1:
+    ax=1.e-12;
+    xx=1.e2;
+    break;
+  default:
+    ax=1.e-15;
+    xx=1.e-12;
+    break;
+  }    
+  mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,funct);
+  return brent(ax,xx,bx,funct,TOL,xmin);
+}
+  
+
+/* optimesh renvoie la contrainte (N0 ou e0) pour le probleme optimise */
+
+double optimesh (int N,        /* Nombre d'elements a traiter        */
+		 int method,   /* ADAPT_H1 , ADAPT_P1 , ADAPT_H2 ou ADAPT_P2 */
+		 int dim,      /* 2 pour 2D et 3 pour 3D             */
+		 double *err,  /* erreurs elementaires               */
+		 double *h,    /* tailles de mailles elementaires    */
+		 double *p,    /* exposante elementaires             */
+		 double e0,    /* erreur prescrite par l'utilisateur */
+		 double N0     /* nbre d'elements ds le maillage opt */
+		 )
+{
+
+  int i;
+  double contr,pivrai,lambda,minf,qi,ri,pi,obj,obj2,minri,maxri;
+  double errmin,errmax;
+
+
+  Msg(INFOS, "N=%d Meth=%d dim=%d err[1]=%g err[2]=%g p[1]=%g p[2]=%g prescr=%g",
+      N,method,dim,err[1],err[2],p[1],p[2],e0);
+
+  METHOD = method;
+
+  h[N+1] = 1.0;
+  p[N+1] = 1.0;
+
+  NN  = N;
+  ERR = err;
+  HH  = h;
+  PP = p;
+  NN = N;
+  E0 = e0;
+  DIM = (double)dim;
+
+  
+  for(i=1;i<=N;i++){
+    if(i==1){
+      errmin=errmax=err[i];
+    }
+    else{
+      errmin = DMIN(errmin,err[i]);
+      errmax = DMAX(errmax,err[i]);
+    }
+  }
+
+  switch (method) {
+  case ADAPT_H1 :
+
+    minf = min1d (fH1,&lambda);
+    obj = 0.0;
+    for(i=1;i<=N;i++){
+      qi = pow(2.*lambda*DSQR(err[i])*p[i]/DIM,DIM/(2.*p[i]+DIM));
+      ri = pow(qi,1./DIM);
+      if(i==1){
+		minri=maxri=ri;
+      }
+      if(err[i]==0.0)ri = .5;
+
+      minri = DMIN(minri,ri);
+      maxri = DMAX(maxri,ri);
+      obj += DSQR(err[i]) * pow(ri,-2.*p[i]) ; 
+      h[i-1] = sqrt(2.) * h[i]/ri;
+      p[i-1] = ri;
+    }
+
+    contr = fabs(minf);
+
+    Msg(INFOS, "Constraint  : asked %g <==> obtained %g",e0,sqrt(obj));
+    Msg(INFOS, "Objective function (Nb. of elements) : %g",-minf);
+    Msg(INFOS, "Minimum reduction factor : %g maximum : %g",minri,maxri);
+    break;
+
+  case ADAPT_P1 :
+    MINH=h[1];
+    for(i=1;i<=N;i++){
+      MINH =DMIN(h[i],MINH);
+    }
+    MINH/=2.;
+
+    minf = min1d (fP1,&lambda);
+    obj = obj2 = 0.0;
+    for(i=1;i<=N;i++){
+      qi = -log(2.*lambda*DSQR(err[i])*log(h[i]/MINH))/log(h[i]/MINH);
+      pi = p[i] - .5 * qi;
+      pivrai = DMIN(DMAX(1.,(double)(int)(pi+.99)),MAXDEG);
+      obj2 += pow(h[i]/MINH,2.*(p[i]-pivrai))*DSQR(err[i]);
+      obj += DSQR(err[i]) * pow(h[i]/MINH,qi) ; 
+      h[i-1] = h[i];
+      p[i-1] = pi;
+    }
+    Msg(INFOS, "Constraint : %g = %g ==> %g",e0,sqrt(obj),sqrt(obj2));
+    Msg(INFOS, "Objective function : %g",minf);
+    contr = fabs(minf);
+    break;
+
+  case ADAPT_H2 :
+    minf = min1d (fH2,&lambda);
+    obj = 0.0;
+    for(i=1;i<=N;i++){
+      qi = pow((DIM*lambda)/(2.*DSQR(err[i])*p[i])
+	       ,-DIM/(DIM+2.*p[i]));
+      ri = pow(qi,1./DIM);
+      if(i==1){
+	minri=maxri=ri;
+      }
+      minri = DMIN(minri,ri);
+      maxri = DMAX(maxri,ri);
+      obj += pow(ri,DIM) ; 
+      h[i-1] = h[i]/ri;
+      p[i-1] = p[i];
+    }
+
+    Msg(INFOS, "Constraint : %g = %g",e0,obj);
+    Msg(INFOS, "Objective function (Error in %%) : %g", 100. * sqrt(fabs(minf)));
+    Msg(INFOS, "Minri : %g maximum %g",minri,maxri);
+    contr = sqrt(fabs(minf));
+    break;
+
+  case ADAPT_P2 :
+    minf = min1d (fH1,&lambda);
+    break;
+
+  default :
+    Msg(WARNING, "Unknown mesh optimisation method");
+  }
+
+  return contr;
+}
diff --git a/Box/Box.cpp b/Box/Box.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9249fcb401a7f8dc421271f2d9dc00acb8717f72
--- /dev/null
+++ b/Box/Box.cpp
@@ -0,0 +1,387 @@
+
+#include <signal.h>
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Views.h"
+#include "Parser.h"
+#include "Context.h"
+#include "Main.h"
+#include "MinMax.h"
+
+#include "Static.h"
+
+int VERBOSE = 0 ;
+
+char progname[]  = "This is Gmsh (non-interactive)" ;
+char copyright[] = "Copyright (C) 1997-2000 C. Geuzaine, J.-F. Remacle" ;
+char clargs[]    = 
+  "Usage: %s [options] [files]\n"
+  "Mesh options:\n"
+  "  -0                    parse input and exit\n"
+  "  -1, -2, -3            batch 1-, 2- or 3-dimensional mesh\n"
+  "  -smooth int           mesh smoothing (default: 3)\n"
+  "  -degree int           mesh degree (default: 1)\n"
+  "  -format msh|unv|gref  mesh format (default: msh)\n"
+  "  -algo iso|aniso       mesh algorithm (default: iso)\n"
+  "  -scale float          scaling factor (default: 1.0)\n"
+  "  -recombine            recombine extruded meshes\n"
+  "  -bgm file             load backround mesh from file\n"
+  "Other options:\n"	  
+  "  -v                    print debug information\n"
+  "  -path string          set path for included files\n"
+  "  -version              show version number\n"
+  "  -info                 show detailed version information\n"
+  "  -help                 show this message\n"
+  ;
+
+
+/* dummy defs for link purposes */
+
+void color_table_init_param (int number, ColorTable * ct, int rgb_flag, int alpha_flag){;}
+void color_table_recompute (ColorTable * ct, int rgb_flag, int alpha_flag){;}
+void ZeroHighlight(Mesh *){;}
+void AddView(int, char *, int){;}
+void draw_polygon_2d (double, double, double, int, double *, double *, double *){;}
+
+/* ------------------------------------------------------------------------ */
+/*  p a r s e                                                               */
+/* ------------------------------------------------------------------------ */
+
+void ParseFile(char *f){
+  strncpy(yyname,f,NAME_STR_L);
+  yyerrorstate=0;
+  yylineno=1;
+  if(!(yyin = fopen(yyname,"r"))){
+    Msg(INFO, "File '%s' dos not exist", f);
+    return;
+  }
+  while(!feof(yyin)) yyparse();
+  fclose(yyin);
+}
+
+void MergeProblem(char *name){
+  Msg(INFOS, "Merging %s",name); 
+
+  ParseFile(name);  
+  if (yyerrorstate) return;
+}
+
+void OpenProblem(char *name){
+  char ext[6];
+  
+  InitSymbols();
+  Init_Mesh(&M, 1);
+  BD_EXISTS = 1;
+
+  strncpy(TheFileName,name,NAME_STR_L);
+  strncpy(TheBaseFileName,name,NAME_STR_L);
+
+  strcpy(ext,name+(strlen(name)-4));
+  if(!strcmp(ext,".GEO") || 
+     !strcmp(ext,".geo") || 
+     !strcmp(ext,".msh") || 
+     !strcmp(ext,".pos")){
+    TheBaseFileName[strlen(name)-4] = '\0';
+  }
+  else{
+    strcat(TheFileName,".geo");
+  }
+
+  strncpy(THEM->name, TheBaseFileName,NAME_STR_L);
+
+  Msg(INFOS, "Opening %s", TheFileName); 
+
+  ParseFile(TheFileName);  
+
+  mai3d(THEM,0);  
+  
+  Maillage_Dimension_0(&M);
+  ZeroHighlight(&M); 
+  CalculateMinMax(THEM->Points);  
+}
+
+/* ------------------------------------------------------------------------ */
+/*  G e t _ O p t i o n s                                                   */
+/* ------------------------------------------------------------------------ */
+
+void Get_Options (int argc, char *argv[]) {
+  int i=1;
+
+  if(argc < 2) Info(0,argv[0]);
+
+  strncpy(TheFileNameTab[0], "unnamed.geo",NAME_STR_L);
+  
+  while (i < argc) {
+    
+    if (argv[i][0] == '-') {
+      
+      if(!strcmp(argv[i]+1, "0")){ 
+	CTX.interactive = -1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "1")){ 
+	CTX.interactive = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "2")){ 
+	CTX.interactive = 2; i++;
+      }
+      else if(!strcmp(argv[i]+1, "3")){ 
+	CTX.interactive = 3; i++;
+      }
+      else if(!strcmp(argv[i]+1, "v")){ 
+	VERBOSE = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "path")){ 
+	i++;
+	if(argv[i] != NULL){
+	  strncpy(ThePathForIncludes,argv[i++],NAME_STR_L);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "bgm")){ 
+	i++;
+	if(argv[i] != NULL){
+	  strncpy(TheBgmFileName,argv[i++],NAME_STR_L);
+	  INITIALBGMESH = ONFILE;
+	}
+      }
+      else if(!strcmp(argv[i]+1, "smooth")){ 
+	i++;
+	LISSAGE = atoi(argv[i]); i++;
+      }
+      else if(!strcmp(argv[i]+1, "scale")){
+	i++;
+	GLOBALSCALINGFACTOR = atof(argv[i]); i++;
+      }
+      else if(!strcmp(argv[i]+1, "degree")){  
+	i++;
+	if(argv[i]!=NULL){
+	  CTX.mesh.degree = atoi(argv[i]); i++;
+	  if(CTX.mesh.degree != 1 || CTX.mesh.degree != 2){
+	    fprintf(stderr, "Error: Wrong degree\n");
+	    exit(1);
+	  }
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing Number\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "format")){  
+	i++;
+	if(argv[i]!=NULL){
+	  if(!strcmp(argv[i],"msh"))
+	    CTX.mesh.format = FORMAT_MSH ;
+	  else if(!strcmp(argv[i],"unv"))
+	    CTX.mesh.format = FORMAT_UNV ;
+	  else if(!strcmp(argv[i],"gref"))
+	    CTX.mesh.format = FORMAT_GREF ;
+	  else{
+	    fprintf(stderr, "Error: Unknown mesh format\n");
+	    exit(1);
+	  }
+	  i++;
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing format\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "algo")){  
+	i++;
+	if(argv[i]!=NULL){
+	  if(!strcmp(argv[i],"iso"))
+	    CTX.mesh.algo = DELAUNAY_OLDALGO ;
+	  else if(!strcmp(argv[i],"aniso"))
+	    CTX.mesh.algo = DELAUNAY_NEWALGO ;
+	  else{
+	    fprintf(stderr, "Error: Unknown mesh algorithm\n");
+	    exit(1);
+	  }
+	  i++;
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing algorithm\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "info")){
+	Info(2,argv[0]); 
+      }
+      else if(!strcmp(argv[i]+1, "version")){
+	Info(1,argv[0]); 
+      }
+      else if(!strcmp(argv[i]+1, "help")){
+	Info(0,argv[0]);
+      }
+      else{
+	fprintf(stderr, "Warning: Unknown option '%s'\n", argv[i]);
+	Info(0,argv[0]);
+      }
+    }
+
+    else {
+      if(NbFileName<MAX_OPEN_FILES){
+	strncpy(TheFileNameTab[NbFileName++], argv[i++], NAME_STR_L); 
+      }
+      else{
+	fprintf(stderr, "Error: Too many input files\n");
+	exit(1);
+      }
+    }
+
+  }
+
+  strncpy(TheFileName, TheFileNameTab[0], NAME_STR_L);
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  m a i n                                                                 */
+/* ------------------------------------------------------------------------ */
+
+int main(int argc, char *argv[]){
+  int     i;
+
+  InitContext(&CTX);
+  Get_Options(argc, argv);
+
+  signal(SIGINT,  Signal); 
+  signal(SIGSEGV, Signal);
+  signal(SIGFPE,  Signal); 
+
+  OpenProblem(TheFileName);
+  if(yyerrorstate)
+    exit(1);
+  else{
+    if(NbFileName>1){
+      for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]);
+    }
+    if(INITIALBGMESH == ONFILE){
+      MergeProblem(TheBgmFileName);
+      if(List_Nbr(Post_ViewList)){
+	BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1));
+	TYPBGMESH = ONFILE; 
+	Create_BgMesh(TYPBGMESH,.2,THEM);
+      }
+      else{
+	fprintf(stderr, "Error: invalid BGM (no view)\n"); exit(1);
+      }
+    }
+    if(CTX.interactive > 0){
+      mai3d(THEM, CTX.interactive);
+      Print_Mesh(THEM,NULL,CTX.mesh.format);
+    }
+    exit(1);
+  }    
+
+}
+
+
+
+/* ------------------------------------------------------------------------ */
+/*  I n f o                                                                 */
+/* ------------------------------------------------------------------------ */
+
+void Info (int level, char *arg0){
+  switch(level){
+  case 0 :
+    fprintf(stderr, "%s\n", progname);
+    fprintf(stderr, "%s\n", copyright);
+    fprintf(stderr, clargs, arg0);
+    exit(1);
+  case 1:
+    fprintf(stderr, "%g\n", GMSH_VERSION);
+    exit(1) ; 
+  case 2:
+    fprintf(stderr, "Version    : %g\n", GMSH_VERSION);
+    fprintf(stderr, "OS         : %s\n", GMSH_OS);
+    fprintf(stderr, "Build Date : %s\n", GMSH_DATE);
+    fprintf(stderr, "Build Host : %s\n", GMSH_HOST);
+    fprintf(stderr, "Packager   : %s\n", GMSH_PACKAGER);
+    exit(1) ; 
+  default :
+    break;
+  }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  S i g n a l                                                             */
+/* ------------------------------------------------------------------------ */
+
+
+void Signal (int sig_num){
+
+  switch (sig_num){
+  case SIGSEGV : Msg(ERROR, "Segmentation Violation (invalid memory reference)"); break;
+  case SIGFPE  : Msg(ERROR, "Floating point exception (division by zero?)"); break;
+  case SIGINT  : Msg(ERROR, "Interrupt (generated from terminal special char)"); break;
+  default      : Msg(ERROR, "Unknown signal"); break;
+  }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  M s g                                                                   */
+/* ------------------------------------------------------------------------ */
+
+void Msg(int level, char *fmt, ...){
+  va_list  args;
+  int      abort=0;
+  int      nb, nbvis;
+
+  va_start (args, fmt);
+
+  switch(level){
+
+  case PARSER_ERROR :
+    fprintf(stderr, "Parse Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    break ;
+
+  case PARSER_INFO :
+    if(VERBOSE){
+      fprintf(stderr, "Parse Info: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    break ;
+
+  case ERROR :
+    fprintf(stderr, "Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    abort = 1 ;
+    break ;
+
+  case WARNING :
+    fprintf(stderr, "Warning: "); vfprintf(stderr, fmt,args); fprintf(stderr, "\n");
+    break;
+
+  case INFOS :
+  case INFO :
+  case SELECT :
+  case STATUS :
+    if(VERBOSE){
+      vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    break;
+  }
+
+  va_end (args);
+
+  if(abort) exit(1);
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  C p u                                                                   */
+/* ------------------------------------------------------------------------ */
+
+double Cpu(void){
+  return 0.;
+}
+
+/* ------------------------------------------------------------------------ */
+/*  P r o g r e s s                                                         */
+/* ------------------------------------------------------------------------ */
+
+void Progress(int i){
+}
diff --git a/Box/Makefile b/Box/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4d7d25b51dbac6d45abb5b59da902b82662a9d69
--- /dev/null
+++ b/Box/Makefile
@@ -0,0 +1,57 @@
+#
+# Makefile for ".a"
+#
+
+.IGNORE:
+
+CC            = c++
+C_FLAGS       = -g
+
+VERSION_FLAGS = 
+OS_FLAGS      = -D_UNIX 
+
+RM       = rm
+RMFLAGS  = -f
+RANLIB   = ranlib
+
+LIB      = ../lib/libBox.a
+INCLUDE  = -I../Common -I../DataStr -I../Geo\
+           -I../Graphics -I../Mesh -I../Parser -I../Unix
+
+CFLAGS   = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE) 
+
+SRC = Box.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ) 
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+box.o: box.cpp ../includes/msh_Include.h ../GmshDataStr/listman.h \
+ ../GmshDataStr/treeman.h ../GmshDataStr/avl.h ../GmshDataStr/ualloc.h \
+ ../GmshDataStr/outil.h ../base/base.h ../geo/geo.h \
+ ../GmshUnix/message.h ../includes/msh_Const.h ../mesh/structure.h \
+ ../includes/msh_Tree.h ../includes/msh_Proto.h \
+ ../includes/msh_Version.h ../geo/context.h ../GmshGL/Draw_Post.h \
+ ../GmshGL/colortable.h
diff --git a/Common/Colors.h b/Common/Colors.h
new file mode 100644
index 0000000000000000000000000000000000000000..7f410cbbbb23df407d176daab8dc1e96db820287
--- /dev/null
+++ b/Common/Colors.h
@@ -0,0 +1,724 @@
+#ifndef _COLORS_H_
+#define _COLORS_H_
+
+#include "Context.h"
+
+extern Context_T   CTX ;
+
+StringXPointer ColorGeneral[] = {
+  { "Background" , &CTX.color.bg          },
+  { "Foreground" , &CTX.color.fg          },
+  { "Text"       , &CTX.color.text        },
+  { "Axes"       , &CTX.color.axes        },
+  { "SmallAxes"  , &CTX.color.little_axes },
+  { NULL         , NULL                }
+} ;
+
+StringXPointer ColorGeometry[] = {
+  { "Points"             , &CTX.color.geom.point        },
+  { "Lines"              , &CTX.color.geom.line         },
+  { "Surfaces"           , &CTX.color.geom.surface      },
+  { "Volumes"            , &CTX.color.geom.volume       },
+  { "PointsSelect"       , &CTX.color.geom.point_sel    },
+  { "LinesSelect"        , &CTX.color.geom.line_sel     },
+  { "SurfacesSelect"     , &CTX.color.geom.surface_sel  },
+  { "VolumesSelect"      , &CTX.color.geom.volume_sel   },
+  { "PointsHighlight"    , &CTX.color.geom.point_hlt    },
+  { "LinesHighlight"     , &CTX.color.geom.line_hlt     },
+  { "SurfacesHighlight"  , &CTX.color.geom.surface_hlt  },
+  { "VolumesHighlight"   , &CTX.color.geom.volume_hlt   },
+  { "Tangents"           , &CTX.color.geom.tangents     },
+  { "Normals"            , &CTX.color.geom.normals      },
+  { NULL                 , NULL                         }
+} ;
+
+StringXPointer ColorMesh[] = {
+  { "Points"             , &CTX.color.mesh.vertex       },
+  { "PointsSupp"         , &CTX.color.mesh.vertex_supp  },
+  { "Lines"              , &CTX.color.mesh.line         },
+  { "Triangles"          , &CTX.color.mesh.triangle     },
+  { "Quadrangles"        , &CTX.color.mesh.quadrangle   },
+  { "Tetrahedra"         , &CTX.color.mesh.tetrahedron  },
+  { "Hexahedra"          , &CTX.color.mesh.hexahedron   },
+  { "Prisms"             , &CTX.color.mesh.prism        },
+  { "Pyramids"           , &CTX.color.mesh.pyramid      },
+  { "Tangents"           , &CTX.color.mesh.tangents     },
+  { "Normals"            , &CTX.color.mesh.normals      },
+  { "One"                , &CTX.color.mesh.carousel[0]  },
+  { "Two"                , &CTX.color.mesh.carousel[1]  },
+  { "Three"              , &CTX.color.mesh.carousel[2]  },
+  { "Four"               , &CTX.color.mesh.carousel[3]  },
+  { "Five"               , &CTX.color.mesh.carousel[4]  },
+  { "Six"                , &CTX.color.mesh.carousel[5]  },
+  { "Seven"              , &CTX.color.mesh.carousel[6]  },
+  { "Eight"              , &CTX.color.mesh.carousel[7]  },
+  { "Nine"               , &CTX.color.mesh.carousel[8]  },
+  { "Ten"                , &CTX.color.mesh.carousel[9]  },
+  { NULL                 , NULL                         }
+} ;
+
+StringX4Int ColorString[] = {
+  { "Snow"                     ,  255, 250, 250, 255 } , 
+  { "GhostWhite"               ,  248, 248, 255, 255 } , 
+  { "WhiteSmoke"               ,  245, 245, 245, 255 } , 
+  { "Gainsboro"                ,  220, 220, 220, 255 } , 
+  { "FloralWhite"              ,  255, 250, 240, 255 } , 
+  { "OldLace"                  ,  253, 245, 230, 255 } , 
+  { "Linen"                    ,  250, 240, 230, 255 } , 
+  { "AntiqueWhite"             ,  250, 235, 215, 255 } , 
+  { "PapayaWhip"               ,  255, 239, 213, 255 } , 
+  { "BlanchedAlmond"           ,  255, 235, 205, 255 } , 
+  { "Bisque"                   ,  255, 228, 196, 255 } , 
+  { "PeachPuff"                ,  255, 218, 185, 255 } , 
+  { "Navajo white"             ,  255, 222, 173, 255 } , 
+  { "NavajoWhite"              ,  255, 222, 173, 255 } , 
+  { "Moccasin"                 ,  255, 228, 181, 255 } , 
+  { "Cornsilk"                 ,  255, 248, 220, 255 } , 
+  { "Ivory"                    ,  255, 255, 240, 255 } , 
+  { "LemonChiffon"             ,  255, 250, 205, 255 } , 
+  { "Seashell"                 ,  255, 245, 238, 255 } , 
+  { "Honeydew"                 ,  240, 255, 240, 255 } , 
+  { "MintCream"                ,  245, 255, 250, 255 } , 
+  { "Azure"                    ,  240, 255, 255, 255 } , 
+  { "AliceBlue"                ,  240, 248, 255, 255 } , 
+  { "Lavender"                 ,  230, 230, 250, 255 } , 
+  { "LavenderBlush"            ,  255, 240, 245, 255 } , 
+  { "MistyRose"                ,  255, 228, 225, 255 } , 
+  { "White"                    ,  255, 255, 255, 255 } , 
+  { "Black"                    ,    0,   0,   0, 255 } , 
+  { "DarkSlateGray"            ,   47,  79,  79, 255 } , 
+  { "DarkSlateGrey"            ,   47,  79,  79, 255 } , 
+  { "DimGray"                  ,  105, 105, 105, 255 } , 
+  { "DimGrey"                  ,  105, 105, 105, 255 } , 
+  { "SlateGray"                ,  112, 128, 144, 255 } , 
+  { "SlateGrey"                ,  112, 128, 144, 255 } , 
+  { "LightSlateGray"           ,  119, 136, 153, 255 } , 
+  { "LightSlateGrey"           ,  119, 136, 153, 255 } , 
+  { "Gray"                     ,  190, 190, 190, 255 } , 
+  { "Grey"                     ,  190, 190, 190, 255 } , 
+  { "LightGrey"                ,  211, 211, 211, 255 } , 
+  { "LightGray"                ,  211, 211, 211, 255 } , 
+  { "MidnightBlue"             ,   25,  25, 112, 255 } , 
+  { "Navy"                     ,    0,   0, 128, 255 } , 
+  { "NavyBlue"                 ,    0,   0, 128, 255 } , 
+  { "CornflowerBlue"           ,  100, 149, 237, 255 } , 
+  { "DarkSlateBlue"            ,   72,  61, 139, 255 } , 
+  { "SlateBlue"                ,  106,  90, 205, 255 } , 
+  { "MediumSlateBlue"          ,  123, 104, 238, 255 } , 
+  { "LightSlateBlue"           ,  132, 112, 255, 255 } , 
+  { "MediumBlue"               ,    0,   0, 205, 255 } , 
+  { "RoyalBlue"                ,   65, 105, 225, 255 } , 
+  { "Blue"                     ,    0,   0, 255, 255 } , 
+  { "DodgerBlue"               ,   30, 144, 255, 255 } , 
+  { "DeepSkyBlue"              ,    0, 191, 255, 255 } , 
+  { "SkyBlue"                  ,  135, 206, 235, 255 } , 
+  { "LightSkyBlue"             ,  135, 206, 250, 255 } , 
+  { "SteelBlue"                ,   70, 130, 180, 255 } , 
+  { "LightSteelBlue"           ,  176, 196, 222, 255 } , 
+  { "LightBlue"                ,  173, 216, 230, 255 } , 
+  { "PowderBlue"               ,  176, 224, 230, 255 } , 
+  { "PaleTurquoise"            ,  175, 238, 238, 255 } , 
+  { "DarkTurquoise"            ,    0, 206, 209, 255 } , 
+  { "MediumTurquoise"          ,   72, 209, 204, 255 } , 
+  { "Turquoise"                ,   64, 224, 208, 255 } , 
+  { "Cyan"                     ,    0, 255, 255, 255 } , 
+  { "LightCyan"                ,  224, 255, 255, 255 } , 
+  { "CadetBlue"                ,   95, 158, 160, 255 } , 
+  { "MediumAquamarine"         ,  102, 205, 170, 255 } , 
+  { "Aquamarine"               ,  127, 255, 212, 255 } , 
+  { "DarkGreen"                ,    0, 100,   0, 255 } , 
+  { "DarkOliveGreen"           ,   85, 107,  47, 255 } , 
+  { "DarkSeaGreen"             ,  143, 188, 143, 255 } , 
+  { "SeaGreen"                 ,   46, 139,  87, 255 } , 
+  { "MediumSeaGreen"           ,   60, 179, 113, 255 } , 
+  { "LightSeaGreen"            ,   32, 178, 170, 255 } , 
+  { "PaleGreen"                ,  152, 251, 152, 255 } , 
+  { "SpringGreen"              ,    0, 255, 127, 255 } , 
+  { "LawnGreen"                ,  124, 252,   0, 255 } , 
+  { "Green"                    ,    0, 255,   0, 255 } , 
+  { "chartreuse"               ,  127, 255,   0, 255 } , 
+  { "MediumSpringGreen"        ,    0, 250, 154, 255 } , 
+  { "GreenYellow"              ,  173, 255,  47, 255 } , 
+  { "LimeGreen"                ,   50, 205,  50, 255 } , 
+  { "YellowGreen"              ,  154, 205,  50, 255 } , 
+  { "ForestGreen"              ,   34, 139,  34, 255 } , 
+  { "OliveDrab"                ,  107, 142,  35, 255 } , 
+  { "DarkKhaki"                ,  189, 183, 107, 255 } , 
+  { "Khaki"                    ,  240, 230, 140, 255 } , 
+  { "PaleGoldenrod"            ,  238, 232, 170, 255 } , 
+  { "LightGoldenrodYellow"     ,  250, 250, 210, 255 } , 
+  { "LightYellow"              ,  255, 255, 224, 255 } , 
+  { "Yellow"                   ,  255, 255,   0, 255 } , 
+  { "Gold"                     ,  255, 215,   0, 255 } , 
+  { "LightGoldenrod"           ,  238, 221, 130, 255 } , 
+  { "Goldenrod"                ,  218, 165,  32, 255 } , 
+  { "DarkGoldenrod"            ,  184, 134,  11, 255 } , 
+  { "RosyBrown"                ,  188, 143, 143, 255 } , 
+  { "IndianRed"                ,  205,  92,  92, 255 } , 
+  { "SaddleBrown"              ,  139,  69,  19, 255 } , 
+  { "Sienna"                   ,  160,  82,  45, 255 } , 
+  { "Peru"                     ,  205, 133,  63, 255 } , 
+  { "Burlywood"                ,  222, 184, 135, 255 } , 
+  { "Beige"                    ,  245, 245, 220, 255 } , 
+  { "Wheat"                    ,  245, 222, 179, 255 } , 
+  { "SandyBrown"               ,  244, 164,  96, 255 } , 
+  { "Tan"                      ,  210, 180, 140, 255 } , 
+  { "Chocolate"                ,  210, 105,  30, 255 } , 
+  { "Firebrick"                ,  178,  34,  34, 255 } , 
+  { "Brown"                    ,  165,  42,  42, 255 } , 
+  { "DarkSalmon"               ,  233, 150, 122, 255 } , 
+  { "Salmon"                   ,  250, 128, 114, 255 } , 
+  { "LightSalmon"              ,  255, 160, 122, 255 } , 
+  { "Orange"                   ,  255, 165,   0, 255 } , 
+  { "DarkOrange"               ,  255, 140,   0, 255 } , 
+  { "Coral"                    ,  255, 127,  80, 255 } , 
+  { "LightCoral"               ,  240, 128, 128, 255 } , 
+  { "Tomato"                   ,  255,  99,  71, 255 } , 
+  { "OrangeRed"                ,  255,  69,   0, 255 } , 
+  { "Red"                      ,  255,   0,   0, 255 } , 
+  { "HotPink"                  ,  255, 105, 180, 255 } , 
+  { "DeepPink"                 ,  255,  20, 147, 255 } , 
+  { "Pink"                     ,  255, 192, 203, 255 } , 
+  { "LightPink"                ,  255, 182, 193, 255 } , 
+  { "PaleVioletRed"            ,  219, 112, 147, 255 } , 
+  { "Maroon"                   ,  176,  48,  96, 255 } , 
+  { "MediumVioletRed"          ,  199,  21, 133, 255 } , 
+  { "VioletRed"                ,  208,  32, 144, 255 } , 
+  { "Magenta"                  ,  255,   0, 255, 255 } , 
+  { "Violet"                   ,  238, 130, 238, 255 } , 
+  { "Plum"                     ,  221, 160, 221, 255 } , 
+  { "Orchid"                   ,  218, 112, 214, 255 } , 
+  { "MediumOrchid"             ,  186,  85, 211, 255 } , 
+  { "DarkOrchid"               ,  153,  50, 204, 255 } , 
+  { "DarkViolet"               ,  148,   0, 211, 255 } , 
+  { "BlueViolet"               ,  138,  43, 226, 255 } , 
+  { "Purple"                   ,  160,  32, 240, 255 } , 
+  { "MediumPurple"             ,  147, 112, 219, 255 } , 
+  { "Thistle"                  ,  216, 191, 216, 255 } , 
+  { "Snow1"                    ,  255, 250, 250, 255 } , 
+  { "Snow2"                    ,  238, 233, 233, 255 } , 
+  { "Snow3"                    ,  205, 201, 201, 255 } , 
+  { "Snow4"                    ,  139, 137, 137, 255 } , 
+  { "Seashell1"                ,  255, 245, 238, 255 } , 
+  { "Seashell2"                ,  238, 229, 222, 255 } , 
+  { "Seashell3"                ,  205, 197, 191, 255 } , 
+  { "Seashell4"                ,  139, 134, 130, 255 } , 
+  { "AntiqueWhite1"            ,  255, 239, 219, 255 } , 
+  { "AntiqueWhite2"            ,  238, 223, 204, 255 } , 
+  { "AntiqueWhite3"            ,  205, 192, 176, 255 } , 
+  { "AntiqueWhite4"            ,  139, 131, 120, 255 } , 
+  { "Bisque1"                  ,  255, 228, 196, 255 } , 
+  { "Bisque2"                  ,  238, 213, 183, 255 } , 
+  { "Bisque3"                  ,  205, 183, 158, 255 } , 
+  { "Bisque4"                  ,  139, 125, 107, 255 } , 
+  { "PeachPuff1"               ,  255, 218, 185, 255 } , 
+  { "PeachPuff2"               ,  238, 203, 173, 255 } , 
+  { "PeachPuff3"               ,  205, 175, 149, 255 } , 
+  { "PeachPuff4"               ,  139, 119, 101, 255 } , 
+  { "NavajoWhite1"             ,  255, 222, 173, 255 } , 
+  { "NavajoWhite2"             ,  238, 207, 161, 255 } , 
+  { "NavajoWhite3"             ,  205, 179, 139, 255 } , 
+  { "NavajoWhite4"             ,  139, 121,  94, 255 } , 
+  { "LemonChiffon1"            ,  255, 250, 205, 255 } , 
+  { "LemonChiffon2"            ,  238, 233, 191, 255 } , 
+  { "LemonChiffon3"            ,  205, 201, 165, 255 } , 
+  { "LemonChiffon4"            ,  139, 137, 112, 255 } , 
+  { "Cornsilk1"                ,  255, 248, 220, 255 } , 
+  { "Cornsilk2"                ,  238, 232, 205, 255 } , 
+  { "Cornsilk3"                ,  205, 200, 177, 255 } , 
+  { "Cornsilk4"                ,  139, 136, 120, 255 } , 
+  { "Ivory1"                   ,  255, 255, 240, 255 } , 
+  { "Ivory2"                   ,  238, 238, 224, 255 } , 
+  { "Ivory3"                   ,  205, 205, 193, 255 } , 
+  { "Ivory4"                   ,  139, 139, 131, 255 } , 
+  { "Honeydew1"                ,  240, 255, 240, 255 } , 
+  { "Honeydew2"                ,  224, 238, 224, 255 } , 
+  { "Honeydew3"                ,  193, 205, 193, 255 } , 
+  { "Honeydew4"                ,  131, 139, 131, 255 } , 
+  { "LavenderBlush1"           ,  255, 240, 245, 255 } , 
+  { "LavenderBlush2"           ,  238, 224, 229, 255 } , 
+  { "LavenderBlush3"           ,  205, 193, 197, 255 } , 
+  { "LavenderBlush4"           ,  139, 131, 134, 255 } , 
+  { "MistyRose1"               ,  255, 228, 225, 255 } , 
+  { "MistyRose2"               ,  238, 213, 210, 255 } , 
+  { "MistyRose3"               ,  205, 183, 181, 255 } , 
+  { "MistyRose4"               ,  139, 125, 123, 255 } , 
+  { "Azure1"                   ,  240, 255, 255, 255 } , 
+  { "Azure2"                   ,  224, 238, 238, 255 } , 
+  { "Azure3"                   ,  193, 205, 205, 255 } , 
+  { "Azure4"                   ,  131, 139, 139, 255 } , 
+  { "SlateBlue1"               ,  131, 111, 255, 255 } , 
+  { "SlateBlue2"               ,  122, 103, 238, 255 } , 
+  { "SlateBlue3"               ,  105,  89, 205, 255 } , 
+  { "SlateBlue4"               ,   71,  60, 139, 255 } , 
+  { "RoyalBlue1"               ,   72, 118, 255, 255 } , 
+  { "RoyalBlue2"               ,   67, 110, 238, 255 } , 
+  { "RoyalBlue3"               ,   58,  95, 205, 255 } , 
+  { "RoyalBlue4"               ,   39,  64, 139, 255 } , 
+  { "Blue1"                    ,    0,   0, 255, 255 } , 
+  { "Blue2"                    ,    0,   0, 238, 255 } , 
+  { "Blue3"                    ,    0,   0, 205, 255 } , 
+  { "Blue4"                    ,    0,   0, 139, 255 } , 
+  { "DodgerBlue1"              ,   30, 144, 255, 255 } , 
+  { "DodgerBlue2"              ,   28, 134, 238, 255 } , 
+  { "DodgerBlue3"              ,   24, 116, 205, 255 } , 
+  { "DodgerBlue4"              ,   16,  78, 139, 255 } , 
+  { "SteelBlue1"               ,   99, 184, 255, 255 } , 
+  { "SteelBlue2"               ,   92, 172, 238, 255 } , 
+  { "SteelBlue3"               ,   79, 148, 205, 255 } , 
+  { "SteelBlue4"               ,   54, 100, 139, 255 } , 
+  { "DeepSkyBlue1"             ,    0, 191, 255, 255 } , 
+  { "DeepSkyBlue2"             ,    0, 178, 238, 255 } , 
+  { "DeepSkyBlue3"             ,    0, 154, 205, 255 } , 
+  { "DeepSkyBlue4"             ,    0, 104, 139, 255 } , 
+  { "SkyBlue1"                 ,  135, 206, 255, 255 } , 
+  { "SkyBlue2"                 ,  126, 192, 238, 255 } , 
+  { "SkyBlue3"                 ,  108, 166, 205, 255 } , 
+  { "SkyBlue4"                 ,   74, 112, 139, 255 } , 
+  { "LightSkyBlue1"            ,  176, 226, 255, 255 } , 
+  { "LightSkyBlue2"            ,  164, 211, 238, 255 } , 
+  { "LightSkyBlue3"            ,  141, 182, 205, 255 } , 
+  { "LightSkyBlue4"            ,   96, 123, 139, 255 } , 
+  { "SlateGray1"               ,  198, 226, 255, 255 } , 
+  { "SlateGray2"               ,  185, 211, 238, 255 } , 
+  { "SlateGray3"               ,  159, 182, 205, 255 } , 
+  { "SlateGray4"               ,  108, 123, 139, 255 } , 
+  { "LightSteelBlue1"          ,  202, 225, 255, 255 } , 
+  { "LightSteelBlue2"          ,  188, 210, 238, 255 } , 
+  { "LightSteelBlue3"          ,  162, 181, 205, 255 } , 
+  { "LightSteelBlue4"          ,  110, 123, 139, 255 } , 
+  { "LightBlue1"               ,  191, 239, 255, 255 } , 
+  { "LightBlue2"               ,  178, 223, 238, 255 } , 
+  { "LightBlue3"               ,  154, 192, 205, 255 } , 
+  { "LightBlue4"               ,  104, 131, 139, 255 } , 
+  { "LightCyan1"               ,  224, 255, 255, 255 } , 
+  { "LightCyan2"               ,  209, 238, 238, 255 } , 
+  { "LightCyan3"               ,  180, 205, 205, 255 } , 
+  { "LightCyan4"               ,  122, 139, 139, 255 } , 
+  { "PaleTurquoise1"           ,  187, 255, 255, 255 } , 
+  { "PaleTurquoise2"           ,  174, 238, 238, 255 } , 
+  { "PaleTurquoise3"           ,  150, 205, 205, 255 } , 
+  { "PaleTurquoise4"           ,  102, 139, 139, 255 } , 
+  { "CadetBlue1"               ,  152, 245, 255, 255 } , 
+  { "CadetBlue2"               ,  142, 229, 238, 255 } , 
+  { "CadetBlue3"               ,  122, 197, 205, 255 } , 
+  { "CadetBlue4"               ,   83, 134, 139, 255 } , 
+  { "Turquoise1"               ,    0, 245, 255, 255 } , 
+  { "Turquoise2"               ,    0, 229, 238, 255 } , 
+  { "Turquoise3"               ,    0, 197, 205, 255 } , 
+  { "Turquoise4"               ,    0, 134, 139, 255 } , 
+  { "Cyan1"                    ,    0, 255, 255, 255 } , 
+  { "Cyan2"                    ,    0, 238, 238, 255 } , 
+  { "Cyan3"                    ,    0, 205, 205, 255 } , 
+  { "Cyan4"                    ,    0, 139, 139, 255 } , 
+  { "DarkSlateGray1"           ,  151, 255, 255, 255 } , 
+  { "DarkSlateGray2"           ,  141, 238, 238, 255 } , 
+  { "DarkSlateGray3"           ,  121, 205, 205, 255 } , 
+  { "DarkSlateGray4"           ,   82, 139, 139, 255 } , 
+  { "Aquamarine1"              ,  127, 255, 212, 255 } , 
+  { "Aquamarine2"              ,  118, 238, 198, 255 } , 
+  { "Aquamarine3"              ,  102, 205, 170, 255 } , 
+  { "Aquamarine4"              ,   69, 139, 116, 255 } , 
+  { "DarkSeaGreen1"            ,  193, 255, 193, 255 } , 
+  { "DarkSeaGreen2"            ,  180, 238, 180, 255 } , 
+  { "DarkSeaGreen3"            ,  155, 205, 155, 255 } , 
+  { "DarkSeaGreen4"            ,  105, 139, 105, 255 } , 
+  { "SeaGreen1"                ,   84, 255, 159, 255 } , 
+  { "SeaGreen2"                ,   78, 238, 148, 255 } , 
+  { "SeaGreen3"                ,   67, 205, 128, 255 } , 
+  { "SeaGreen4"                ,   46, 139,  87, 255 } , 
+  { "PaleGreen1"               ,  154, 255, 154, 255 } , 
+  { "PaleGreen2"               ,  144, 238, 144, 255 } , 
+  { "PaleGreen3"               ,  124, 205, 124, 255 } , 
+  { "PaleGreen4"               ,   84, 139,  84, 255 } , 
+  { "SpringGreen1"             ,    0, 255, 127, 255 } , 
+  { "SpringGreen2"             ,    0, 238, 118, 255 } , 
+  { "SpringGreen3"             ,    0, 205, 102, 255 } , 
+  { "SpringGreen4"             ,    0, 139,  69, 255 } , 
+  { "Green1"                   ,    0, 255,   0, 255 } , 
+  { "Green2"                   ,    0, 238,   0, 255 } , 
+  { "Green3"                   ,    0, 205,   0, 255 } , 
+  { "Green4"                   ,    0, 139,   0, 255 } , 
+  { "Chartreuse1"              ,  127, 255,   0, 255 } , 
+  { "Chartreuse2"              ,  118, 238,   0, 255 } , 
+  { "Chartreuse3"              ,  102, 205,   0, 255 } , 
+  { "Chartreuse4"              ,   69, 139,   0, 255 } , 
+  { "OliveDrab1"               ,  192, 255,  62, 255 } , 
+  { "OliveDrab2"               ,  179, 238,  58, 255 } , 
+  { "OliveDrab3"               ,  154, 205,  50, 255 } , 
+  { "OliveDrab4"               ,  105, 139,  34, 255 } , 
+  { "DarkOliveGreen1"          ,  202, 255, 112, 255 } , 
+  { "DarkOliveGreen2"          ,  188, 238, 104, 255 } , 
+  { "DarkOliveGreen3"          ,  162, 205,  90, 255 } , 
+  { "DarkOliveGreen4"          ,  110, 139,  61, 255 } , 
+  { "Khaki1"                   ,  255, 246, 143, 255 } , 
+  { "Khaki2"                   ,  238, 230, 133, 255 } , 
+  { "Khaki3"                   ,  205, 198, 115, 255 } , 
+  { "Khaki4"                   ,  139, 134,  78, 255 } , 
+  { "LightGoldenrod1"          ,  255, 236, 139, 255 } , 
+  { "LightGoldenrod2"          ,  238, 220, 130, 255 } , 
+  { "LightGoldenrod3"          ,  205, 190, 112, 255 } , 
+  { "LightGoldenrod4"          ,  139, 129,  76, 255 } , 
+  { "LightYellow1"             ,  255, 255, 224, 255 } , 
+  { "LightYellow2"             ,  238, 238, 209, 255 } , 
+  { "LightYellow3"             ,  205, 205, 180, 255 } , 
+  { "LightYellow4"             ,  139, 139, 122, 255 } , 
+  { "Yellow1"                  ,  255, 255,   0, 255 } , 
+  { "Yellow2"                  ,  238, 238,   0, 255 } , 
+  { "Yellow3"                  ,  205, 205,   0, 255 } , 
+  { "Yellow4"                  ,  139, 139,   0, 255 } , 
+  { "Gold1"                    ,  255, 215,   0, 255 } , 
+  { "Gold2"                    ,  238, 201,   0, 255 } , 
+  { "Gold3"                    ,  205, 173,   0, 255 } , 
+  { "Gold4"                    ,  139, 117,   0, 255 } , 
+  { "Goldenrod1"               ,  255, 193,  37, 255 } , 
+  { "Goldenrod2"               ,  238, 180,  34, 255 } , 
+  { "Goldenrod3"               ,  205, 155,  29, 255 } , 
+  { "Goldenrod4"               ,  139, 105,  20, 255 } , 
+  { "DarkGoldenrod1"           ,  255, 185,  15, 255 } , 
+  { "DarkGoldenrod2"           ,  238, 173,  14, 255 } , 
+  { "DarkGoldenrod3"           ,  205, 149,  12, 255 } , 
+  { "DarkGoldenrod4"           ,  139, 101,   8, 255 } , 
+  { "RosyBrown1"               ,  255, 193, 193, 255 } , 
+  { "RosyBrown2"               ,  238, 180, 180, 255 } , 
+  { "RosyBrown3"               ,  205, 155, 155, 255 } , 
+  { "RosyBrown4"               ,  139, 105, 105, 255 } , 
+  { "IndianRed1"               ,  255, 106, 106, 255 } , 
+  { "IndianRed2"               ,  238,  99,  99, 255 } , 
+  { "IndianRed3"               ,  205,  85,  85, 255 } , 
+  { "IndianRed4"               ,  139,  58,  58, 255 } , 
+  { "Sienna1"                  ,  255, 130,  71, 255 } , 
+  { "Sienna2"                  ,  238, 121,  66, 255 } , 
+  { "Sienna3"                  ,  205, 104,  57, 255 } , 
+  { "Sienna4"                  ,  139,  71,  38, 255 } , 
+  { "Burlywood1"               ,  255, 211, 155, 255 } , 
+  { "Burlywood2"               ,  238, 197, 145, 255 } , 
+  { "Burlywood3"               ,  205, 170, 125, 255 } , 
+  { "Burlywood4"               ,  139, 115,  85, 255 } , 
+  { "Wheat1"                   ,  255, 231, 186, 255 } , 
+  { "Wheat2"                   ,  238, 216, 174, 255 } , 
+  { "Wheat3"                   ,  205, 186, 150, 255 } , 
+  { "Wheat4"                   ,  139, 126, 102, 255 } , 
+  { "Tan1"                     ,  255, 165,  79, 255 } , 
+  { "Tan2"                     ,  238, 154,  73, 255 } , 
+  { "Tan3"                     ,  205, 133,  63, 255 } , 
+  { "Tan4"                     ,  139,  90,  43, 255 } , 
+  { "Chocolate1"               ,  255, 127,  36, 255 } , 
+  { "Chocolate2"               ,  238, 118,  33, 255 } , 
+  { "Chocolate3"               ,  205, 102,  29, 255 } , 
+  { "Chocolate4"               ,  139,  69,  19, 255 } , 
+  { "Firebrick1"               ,  255,  48,  48, 255 } , 
+  { "Firebrick2"               ,  238,  44,  44, 255 } , 
+  { "Firebrick3"               ,  205,  38,  38, 255 } , 
+  { "Firebrick4"               ,  139,  26,  26, 255 } , 
+  { "Brown1"                   ,  255,  64,  64, 255 } , 
+  { "Brown2"                   ,  238,  59,  59, 255 } , 
+  { "Brown3"                   ,  205,  51,  51, 255 } , 
+  { "Brown4"                   ,  139,  35,  35, 255 } , 
+  { "Salmon1"                  ,  255, 140, 105, 255 } , 
+  { "Salmon2"                  ,  238, 130,  98, 255 } , 
+  { "Salmon3"                  ,  205, 112,  84, 255 } , 
+  { "Salmon4"                  ,  139,  76,  57, 255 } , 
+  { "LightSalmon1"             ,  255, 160, 122, 255 } , 
+  { "LightSalmon2"             ,  238, 149, 114, 255 } , 
+  { "LightSalmon3"             ,  205, 129,  98, 255 } , 
+  { "LightSalmon4"             ,  139,  87,  66, 255 } , 
+  { "Orange1"                  ,  255, 165,   0, 255 } , 
+  { "Orange2"                  ,  238, 154,   0, 255 } , 
+  { "Orange3"                  ,  205, 133,   0, 255 } , 
+  { "Orange4"                  ,  139,  90,   0, 255 } , 
+  { "DarkOrange1"              ,  255, 127,   0, 255 } , 
+  { "DarkOrange2"              ,  238, 118,   0, 255 } , 
+  { "DarkOrange3"              ,  205, 102,   0, 255 } , 
+  { "DarkOrange4"              ,  139,  69,   0, 255 } , 
+  { "Coral1"                   ,  255, 114,  86, 255 } , 
+  { "Coral2"                   ,  238, 106,  80, 255 } , 
+  { "Coral3"                   ,  205,  91,  69, 255 } , 
+  { "Coral4"                   ,  139,  62,  47, 255 } , 
+  { "Tomato1"                  ,  255,  99,  71, 255 } , 
+  { "Tomato2"                  ,  238,  92,  66, 255 } , 
+  { "Tomato3"                  ,  205,  79,  57, 255 } , 
+  { "Tomato4"                  ,  139,  54,  38, 255 } , 
+  { "OrangeRed1"               ,  255,  69,   0, 255 } , 
+  { "OrangeRed2"               ,  238,  64,   0, 255 } , 
+  { "OrangeRed3"               ,  205,  55,   0, 255 } , 
+  { "OrangeRed4"               ,  139,  37,   0, 255 } , 
+  { "Red1"                     ,  255,   0,   0, 255 } , 
+  { "Red2"                     ,  238,   0,   0, 255 } , 
+  { "Red3"                     ,  205,   0,   0, 255 } , 
+  { "Red4"                     ,  139,   0,   0, 255 } , 
+  { "DeepPink1"                ,  255,  20, 147, 255 } , 
+  { "DeepPink2"                ,  238,  18, 137, 255 } , 
+  { "DeepPink3"                ,  205,  16, 118, 255 } , 
+  { "DeepPink4"                ,  139,  10,  80, 255 } , 
+  { "HotPink1"                 ,  255, 110, 180, 255 } , 
+  { "HotPink2"                 ,  238, 106, 167, 255 } , 
+  { "HotPink3"                 ,  205,  96, 144, 255 } , 
+  { "HotPink4"                 ,  139,  58,  98, 255 } , 
+  { "Pink1"                    ,  255, 181, 197, 255 } , 
+  { "Pink2"                    ,  238, 169, 184, 255 } , 
+  { "Pink3"                    ,  205, 145, 158, 255 } , 
+  { "Pink4"                    ,  139,  99, 108, 255 } , 
+  { "LightPink1"               ,  255, 174, 185, 255 } , 
+  { "LightPink2"               ,  238, 162, 173, 255 } , 
+  { "LightPink3"               ,  205, 140, 149, 255 } , 
+  { "LightPink4"               ,  139,  95, 101, 255 } , 
+  { "PaleVioletRed1"           ,  255, 130, 171, 255 } , 
+  { "PaleVioletRed2"           ,  238, 121, 159, 255 } , 
+  { "PaleVioletRed3"           ,  205, 104, 137, 255 } , 
+  { "PaleVioletRed4"           ,  139,  71,  93, 255 } , 
+  { "Maroon1"                  ,  255,  52, 179, 255 } , 
+  { "Maroon2"                  ,  238,  48, 167, 255 } , 
+  { "Maroon3"                  ,  205,  41, 144, 255 } , 
+  { "Maroon4"                  ,  139,  28,  98, 255 } , 
+  { "VioletRed1"               ,  255,  62, 150, 255 } , 
+  { "VioletRed2"               ,  238,  58, 140, 255 } , 
+  { "VioletRed3"               ,  205,  50, 120, 255 } , 
+  { "VioletRed4"               ,  139,  34,  82, 255 } , 
+  { "Magenta1"                 ,  255,   0, 255, 255 } , 
+  { "Magenta2"                 ,  238,   0, 238, 255 } , 
+  { "Magenta3"                 ,  205,   0, 205, 255 } , 
+  { "Magenta4"                 ,  139,   0, 139, 255 } , 
+  { "Orchid1"                  ,  255, 131, 250, 255 } , 
+  { "Orchid2"                  ,  238, 122, 233, 255 } , 
+  { "Orchid3"                  ,  205, 105, 201, 255 } , 
+  { "Orchid4"                  ,  139,  71, 137, 255 } , 
+  { "Plum1"                    ,  255, 187, 255, 255 } , 
+  { "Plum2"                    ,  238, 174, 238, 255 } , 
+  { "Plum3"                    ,  205, 150, 205, 255 } , 
+  { "Plum4"                    ,  139, 102, 139, 255 } , 
+  { "MediumOrchid1"            ,  224, 102, 255, 255 } , 
+  { "MediumOrchid2"            ,  209,  95, 238, 255 } , 
+  { "MediumOrchid3"            ,  180,  82, 205, 255 } , 
+  { "MediumOrchid4"            ,  122,  55, 139, 255 } , 
+  { "DarkOrchid1"              ,  191,  62, 255, 255 } , 
+  { "DarkOrchid2"              ,  178,  58, 238, 255 } , 
+  { "DarkOrchid3"              ,  154,  50, 205, 255 } , 
+  { "DarkOrchid4"              ,  104,  34, 139, 255 } , 
+  { "purple1"                  ,  155,  48, 255, 255 } , 
+  { "purple2"                  ,  145,  44, 238, 255 } , 
+  { "purple3"                  ,  125,  38, 205, 255 } , 
+  { "purple4"                  ,   85,  26, 139, 255 } , 
+  { "MediumPurple1"            ,  171, 130, 255, 255 } , 
+  { "MediumPurple2"            ,  159, 121, 238, 255 } , 
+  { "MediumPurple3"            ,  137, 104, 205, 255 } , 
+  { "MediumPurple4"            ,   93,  71, 139, 255 } , 
+  { "Thistle1"                 ,  255, 225, 255, 255 } , 
+  { "Thistle2"                 ,  238, 210, 238, 255 } , 
+  { "Thistle3"                 ,  205, 181, 205, 255 } , 
+  { "Thistle4"                 ,  139, 123, 139, 255 } , 
+  { "Gray0"                    ,    0,   0,   0, 255 } , 
+  { "Grey0"                    ,    0,   0,   0, 255 } , 
+  { "Gray1"                    ,    3,   3,   3, 255 } , 
+  { "Grey1"                    ,    3,   3,   3, 255 } , 
+  { "Gray2"                    ,    5,   5,   5, 255 } , 
+  { "Grey2"                    ,    5,   5,   5, 255 } , 
+  { "Gray3"                    ,    8,   8,   8, 255 } , 
+  { "Grey3"                    ,    8,   8,   8, 255 } , 
+  { "Gray4"                    ,   10,  10,  10, 255 } , 
+  { "Grey4"                    ,   10,  10,  10, 255 } , 
+  { "Gray5"                    ,   13,  13,  13, 255 } , 
+  { "Grey5"                    ,   13,  13,  13, 255 } , 
+  { "Gray6"                    ,   15,  15,  15, 255 } , 
+  { "Grey6"                    ,   15,  15,  15, 255 } , 
+  { "Gray7"                    ,   18,  18,  18, 255 } , 
+  { "Grey7"                    ,   18,  18,  18, 255 } , 
+  { "Gray8"                    ,   20,  20,  20, 255 } , 
+  { "Grey8"                    ,   20,  20,  20, 255 } , 
+  { "Gray9"                    ,   23,  23,  23, 255 } , 
+  { "Grey9"                    ,   23,  23,  23, 255 } , 
+  { "Gray10"                   ,   26,  26,  26, 255 } , 
+  { "Grey10"                   ,   26,  26,  26, 255 } , 
+  { "Gray11"                   ,   28,  28,  28, 255 } , 
+  { "Grey11"                   ,   28,  28,  28, 255 } , 
+  { "Gray12"                   ,   31,  31,  31, 255 } , 
+  { "Grey12"                   ,   31,  31,  31, 255 } , 
+  { "Gray13"                   ,   33,  33,  33, 255 } , 
+  { "Grey13"                   ,   33,  33,  33, 255 } , 
+  { "Gray14"                   ,   36,  36,  36, 255 } , 
+  { "Grey14"                   ,   36,  36,  36, 255 } , 
+  { "Gray15"                   ,   38,  38,  38, 255 } , 
+  { "Grey15"                   ,   38,  38,  38, 255 } , 
+  { "Gray16"                   ,   41,  41,  41, 255 } , 
+  { "Grey16"                   ,   41,  41,  41, 255 } , 
+  { "Gray17"                   ,   43,  43,  43, 255 } , 
+  { "Grey17"                   ,   43,  43,  43, 255 } , 
+  { "Gray18"                   ,   46,  46,  46, 255 } , 
+  { "Grey18"                   ,   46,  46,  46, 255 } , 
+  { "Gray19"                   ,   48,  48,  48, 255 } , 
+  { "Grey19"                   ,   48,  48,  48, 255 } , 
+  { "Gray20"                   ,   51,  51,  51, 255 } , 
+  { "Grey20"                   ,   51,  51,  51, 255 } , 
+  { "Gray21"                   ,   54,  54,  54, 255 } , 
+  { "Grey21"                   ,   54,  54,  54, 255 } , 
+  { "Gray22"                   ,   56,  56,  56, 255 } , 
+  { "Grey22"                   ,   56,  56,  56, 255 } , 
+  { "Gray23"                   ,   59,  59,  59, 255 } , 
+  { "Grey23"                   ,   59,  59,  59, 255 } , 
+  { "Gray24"                   ,   61,  61,  61, 255 } , 
+  { "Grey24"                   ,   61,  61,  61, 255 } , 
+  { "Gray25"                   ,   64,  64,  64, 255 } , 
+  { "Grey25"                   ,   64,  64,  64, 255 } , 
+  { "Gray26"                   ,   66,  66,  66, 255 } , 
+  { "Grey26"                   ,   66,  66,  66, 255 } , 
+  { "Gray27"                   ,   69,  69,  69, 255 } , 
+  { "Grey27"                   ,   69,  69,  69, 255 } , 
+  { "Gray28"                   ,   71,  71,  71, 255 } , 
+  { "Grey28"                   ,   71,  71,  71, 255 } , 
+  { "Gray29"                   ,   74,  74,  74, 255 } , 
+  { "Grey29"                   ,   74,  74,  74, 255 } , 
+  { "Gray30"                   ,   77,  77,  77, 255 } , 
+  { "Grey30"                   ,   77,  77,  77, 255 } , 
+  { "Gray31"                   ,   79,  79,  79, 255 } , 
+  { "Grey31"                   ,   79,  79,  79, 255 } , 
+  { "Gray32"                   ,   82,  82,  82, 255 } , 
+  { "Grey32"                   ,   82,  82,  82, 255 } , 
+  { "Gray33"                   ,   84,  84,  84, 255 } , 
+  { "Grey33"                   ,   84,  84,  84, 255 } , 
+  { "Gray34"                   ,   87,  87,  87, 255 } , 
+  { "Grey34"                   ,   87,  87,  87, 255 } , 
+  { "Gray35"                   ,   89,  89,  89, 255 } , 
+  { "Grey35"                   ,   89,  89,  89, 255 } , 
+  { "Gray36"                   ,   92,  92,  92, 255 } , 
+  { "Grey36"                   ,   92,  92,  92, 255 } , 
+  { "Gray37"                   ,   94,  94,  94, 255 } , 
+  { "Grey37"                   ,   94,  94,  94, 255 } , 
+  { "Gray38"                   ,   97,  97,  97, 255 } , 
+  { "Grey38"                   ,   97,  97,  97, 255 } , 
+  { "Gray39"                   ,   99,  99,  99, 255 } , 
+  { "Grey39"                   ,   99,  99,  99, 255 } , 
+  { "Gray40"                   ,  102, 102, 102, 255 } , 
+  { "Grey40"                   ,  102, 102, 102, 255 } , 
+  { "Gray41"                   ,  105, 105, 105, 255 } , 
+  { "Grey41"                   ,  105, 105, 105, 255 } , 
+  { "Gray42"                   ,  107, 107, 107, 255 } , 
+  { "Grey42"                   ,  107, 107, 107, 255 } , 
+  { "Gray43"                   ,  110, 110, 110, 255 } , 
+  { "Grey43"                   ,  110, 110, 110, 255 } , 
+  { "Gray44"                   ,  112, 112, 112, 255 } , 
+  { "Grey44"                   ,  112, 112, 112, 255 } , 
+  { "Gray45"                   ,  115, 115, 115, 255 } , 
+  { "Grey45"                   ,  115, 115, 115, 255 } , 
+  { "Gray46"                   ,  117, 117, 117, 255 } , 
+  { "Grey46"                   ,  117, 117, 117, 255 } , 
+  { "Gray47"                   ,  120, 120, 120, 255 } , 
+  { "Grey47"                   ,  120, 120, 120, 255 } , 
+  { "Gray48"                   ,  122, 122, 122, 255 } , 
+  { "Grey48"                   ,  122, 122, 122, 255 } , 
+  { "Gray49"                   ,  125, 125, 125, 255 } , 
+  { "Grey49"                   ,  125, 125, 125, 255 } , 
+  { "Gray50"                   ,  127, 127, 127, 255 } , 
+  { "Grey50"                   ,  127, 127, 127, 255 } , 
+  { "Gray51"                   ,  130, 130, 130, 255 } , 
+  { "Grey51"                   ,  130, 130, 130, 255 } , 
+  { "Gray52"                   ,  133, 133, 133, 255 } , 
+  { "Grey52"                   ,  133, 133, 133, 255 } , 
+  { "Gray53"                   ,  135, 135, 135, 255 } , 
+  { "Grey53"                   ,  135, 135, 135, 255 } , 
+  { "Gray54"                   ,  138, 138, 138, 255 } , 
+  { "Grey54"                   ,  138, 138, 138, 255 } , 
+  { "Gray55"                   ,  140, 140, 140, 255 } , 
+  { "Grey55"                   ,  140, 140, 140, 255 } , 
+  { "Gray56"                   ,  143, 143, 143, 255 } , 
+  { "Grey56"                   ,  143, 143, 143, 255 } , 
+  { "Gray57"                   ,  145, 145, 145, 255 } , 
+  { "Grey57"                   ,  145, 145, 145, 255 } , 
+  { "Gray58"                   ,  148, 148, 148, 255 } , 
+  { "Grey58"                   ,  148, 148, 148, 255 } , 
+  { "Gray59"                   ,  150, 150, 150, 255 } , 
+  { "Grey59"                   ,  150, 150, 150, 255 } , 
+  { "Gray60"                   ,  153, 153, 153, 255 } , 
+  { "Grey60"                   ,  153, 153, 153, 255 } , 
+  { "Gray61"                   ,  156, 156, 156, 255 } , 
+  { "Grey61"                   ,  156, 156, 156, 255 } , 
+  { "Gray62"                   ,  158, 158, 158, 255 } , 
+  { "Grey62"                   ,  158, 158, 158, 255 } , 
+  { "Gray63"                   ,  161, 161, 161, 255 } , 
+  { "Grey63"                   ,  161, 161, 161, 255 } , 
+  { "Gray64"                   ,  163, 163, 163, 255 } , 
+  { "Grey64"                   ,  163, 163, 163, 255 } , 
+  { "Gray65"                   ,  166, 166, 166, 255 } , 
+  { "Grey65"                   ,  166, 166, 166, 255 } , 
+  { "Gray66"                   ,  168, 168, 168, 255 } , 
+  { "Grey66"                   ,  168, 168, 168, 255 } , 
+  { "Gray67"                   ,  171, 171, 171, 255 } , 
+  { "Grey67"                   ,  171, 171, 171, 255 } , 
+  { "Gray68"                   ,  173, 173, 173, 255 } , 
+  { "Grey68"                   ,  173, 173, 173, 255 } , 
+  { "Gray69"                   ,  176, 176, 176, 255 } , 
+  { "Grey69"                   ,  176, 176, 176, 255 } , 
+  { "Gray70"                   ,  179, 179, 179, 255 } , 
+  { "Grey70"                   ,  179, 179, 179, 255 } , 
+  { "Gray71"                   ,  181, 181, 181, 255 } , 
+  { "Grey71"                   ,  181, 181, 181, 255 } , 
+  { "Gray72"                   ,  184, 184, 184, 255 } , 
+  { "Grey72"                   ,  184, 184, 184, 255 } , 
+  { "Gray73"                   ,  186, 186, 186, 255 } , 
+  { "Grey73"                   ,  186, 186, 186, 255 } , 
+  { "Gray74"                   ,  189, 189, 189, 255 } , 
+  { "Grey74"                   ,  189, 189, 189, 255 } , 
+  { "Gray75"                   ,  191, 191, 191, 255 } , 
+  { "Grey75"                   ,  191, 191, 191, 255 } , 
+  { "Gray76"                   ,  194, 194, 194, 255 } , 
+  { "Grey76"                   ,  194, 194, 194, 255 } , 
+  { "Gray77"                   ,  196, 196, 196, 255 } , 
+  { "Grey77"                   ,  196, 196, 196, 255 } , 
+  { "Gray78"                   ,  199, 199, 199, 255 } , 
+  { "Grey78"                   ,  199, 199, 199, 255 } , 
+  { "Gray79"                   ,  201, 201, 201, 255 } , 
+  { "Grey79"                   ,  201, 201, 201, 255 } , 
+  { "Gray80"                   ,  204, 204, 204, 255 } , 
+  { "Grey80"                   ,  204, 204, 204, 255 } , 
+  { "Gray81"                   ,  207, 207, 207, 255 } , 
+  { "Grey81"                   ,  207, 207, 207, 255 } , 
+  { "Gray82"                   ,  209, 209, 209, 255 } , 
+  { "Grey82"                   ,  209, 209, 209, 255 } , 
+  { "Gray83"                   ,  212, 212, 212, 255 } , 
+  { "Grey83"                   ,  212, 212, 212, 255 } , 
+  { "Gray84"                   ,  214, 214, 214, 255 } , 
+  { "Grey84"                   ,  214, 214, 214, 255 } , 
+  { "Gray85"                   ,  217, 217, 217, 255 } , 
+  { "Grey85"                   ,  217, 217, 217, 255 } , 
+  { "Gray86"                   ,  219, 219, 219, 255 } , 
+  { "Grey86"                   ,  219, 219, 219, 255 } , 
+  { "Gray87"                   ,  222, 222, 222, 255 } , 
+  { "Grey87"                   ,  222, 222, 222, 255 } , 
+  { "Gray88"                   ,  224, 224, 224, 255 } , 
+  { "Grey88"                   ,  224, 224, 224, 255 } , 
+  { "Gray89"                   ,  227, 227, 227, 255 } , 
+  { "Grey89"                   ,  227, 227, 227, 255 } , 
+  { "Gray90"                   ,  229, 229, 229, 255 } , 
+  { "Grey90"                   ,  229, 229, 229, 255 } , 
+  { "Gray91"                   ,  232, 232, 232, 255 } , 
+  { "Grey91"                   ,  232, 232, 232, 255 } , 
+  { "Gray92"                   ,  235, 235, 235, 255 } , 
+  { "Grey92"                   ,  235, 235, 235, 255 } , 
+  { "Gray93"                   ,  237, 237, 237, 255 } , 
+  { "Grey93"                   ,  237, 237, 237, 255 } , 
+  { "Gray94"                   ,  240, 240, 240, 255 } , 
+  { "Grey94"                   ,  240, 240, 240, 255 } , 
+  { "Gray95"                   ,  242, 242, 242, 255 } , 
+  { "Grey95"                   ,  242, 242, 242, 255 } , 
+  { "Gray96"                   ,  245, 245, 245, 255 } , 
+  { "Grey96"                   ,  245, 245, 245, 255 } , 
+  { "Gray97"                   ,  247, 247, 247, 255 } , 
+  { "Grey97"                   ,  247, 247, 247, 255 } , 
+  { "Gray98"                   ,  250, 250, 250, 255 } , 
+  { "Grey98"                   ,  250, 250, 250, 255 } , 
+  { "Gray99"                   ,  252, 252, 252, 255 } , 
+  { "Grey99"                   ,  252, 252, 252, 255 } , 
+  { "Gray100"                  ,  255, 255, 255, 255 } , 
+  { "Grey100"                  ,  255, 255, 255, 255 } , 
+  { "DarkGrey"                 ,  169, 169, 169, 255 } , 
+  { "DarkGray"                 ,  169, 169, 169, 255 } , 
+  { "DarkBlue"                 ,  0  ,   0, 139, 255 } , 
+  { "DarkCyan"                 ,  0  , 139, 139, 255 } , 
+  { "DarkMagenta"              ,  139,   0, 139, 255 } , 
+  { "DarkRed"                  ,  139,   0,   0, 255 } , 
+  { "LightGreen"               ,  144, 238, 144, 255 } , 
+  { NULL                       ,  0  ,   0,   0, 255 }
+} ;
+
+
+
+#endif
diff --git a/Common/Const.h b/Common/Const.h
new file mode 100644
index 0000000000000000000000000000000000000000..85f437715b28f6df85599247a70f7260adac9452
--- /dev/null
+++ b/Common/Const.h
@@ -0,0 +1,53 @@
+#ifndef _CONSTS_H_
+#define _CONSTS_H_
+
+//#define RAND_LONG    LC * ((rand()%1000)/1.E08)
+//#define RAND_LONG    LC * ((rand()%1000)/1.E08)/10.
+
+//RAND_LONG in [0, LC/1.e6]
+#define RAND_LONG    (LC/1.e6*rand()/RAND_MAX)
+
+//EPSILON_LONG in [0, LC/1.e12]
+#define EPSILON_LC   (LC/1.e12*rand()/RAND_MAX)
+
+#define RADTODEG      57.29578
+
+#define TEXT_BUFFER_SIZE       1024
+#define SELECTION_BUFFER_SIZE  1024
+#define LABEL_STR_L            16
+#define NAME_STR_L             256
+#define MAX_OPEN_FILES         20
+
+#define RacineDeDeux  1.41421356237
+#define RacineDeTrois 1.73205080757
+#define Pi            3.14159265359
+#define Deux_Pi       6.28318530718
+#define UnTiers       0.33333333333
+
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#define MAX(a,b) (((a)<(b))?(b):(a))
+#define SQR(a)   (((a)==0.0)?0.0:((a)*(a)))
+
+#define IMIN MIN
+#define LMIN MIN
+#define FMIN MIN
+#define DMIN MIN
+
+#define IMAX MAX
+#define LMAX MAX
+#define FMAX MAX
+#define DMAX MAX
+
+#define DSQR SQR
+#define FSQR SQU
+
+#define THRESHOLD(a,b,c) (((a)>(c))?(c):((a)<(b)?(b):(a)))
+
+#define myhypot(a,b) (sqrt((a)*(a)+(b)*(b)))
+
+#define sign(x)   (((x)>=0)?1:-1)
+#define Pred(x)   ((x)->prev)
+#define Succ(x)   ((x)->next)
+#define square(x) ((x)*(x))
+
+#endif
diff --git a/Common/Context.cpp b/Common/Context.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..86ac187a633126fb30803a0b6666d355b051b370
--- /dev/null
+++ b/Common/Context.cpp
@@ -0,0 +1,251 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+
+void InitColors(rgbacolors * col, int num){
+
+  if(col->id == num){
+    return ;
+  }
+
+  col->id = num ;
+
+  switch(num){
+
+  case 0 : /* default drawing colors: black background */
+  case 1 : /* alternative drawing colors: white background */
+    switch(num){
+    case 0 :
+      col->bg                 = PACK_COLOR(0,   0,   0,   255) ;
+      col->fg                 = PACK_COLOR(255, 255, 255, 255) ;
+      col->text               = PACK_COLOR(255, 255, 255, 255) ;
+      col->axes               = PACK_COLOR(255, 255, 0,   255) ;
+      col->little_axes        = PACK_COLOR(255, 255, 255, 255) ;
+      break;
+    case 1 :
+      col->bg                 = PACK_COLOR(255, 255, 255, 255) ;
+      col->fg                 = PACK_COLOR(0,   0,   0,   255) ;
+      col->text               = PACK_COLOR(0,   0,   0,   255) ;
+      col->axes               = PACK_COLOR(128, 128, 128, 255) ;
+      col->little_axes        = PACK_COLOR(0,   0,   0,   255) ;
+      break;
+    }
+    col->geom.point         = PACK_COLOR(178,   182, 129,   255) ;
+    col->geom.line          = PACK_COLOR(0,   0,   255, 255) ;
+    col->geom.surface       = PACK_COLOR(128, 128, 128, 255) ;
+    col->geom.volume        = PACK_COLOR(128, 128, 128, 255) ;
+    col->geom.point_sel     = PACK_COLOR(255, 0,   0,   255) ;
+    col->geom.line_sel      = PACK_COLOR(255, 0,   0,   255) ;
+    col->geom.surface_sel   = PACK_COLOR(255, 0,   0,   255) ;
+    col->geom.volume_sel    = PACK_COLOR(255, 0,   0,   255) ;
+    col->geom.point_hlt     = PACK_COLOR(0,   255, 0,   255) ;
+    col->geom.line_hlt      = PACK_COLOR(0,   0,   255, 255) ;
+    col->geom.surface_hlt   = PACK_COLOR(128, 128, 128, 255) ;
+    col->geom.volume_hlt    = PACK_COLOR(128, 128, 128, 255) ;
+    col->geom.tangents      = PACK_COLOR(255, 255, 0,   255) ;
+    col->geom.normals       = PACK_COLOR(255, 0,   0,   255) ;
+
+    col->mesh.vertex        = PACK_COLOR(0  , 123, 59 , 255) ;
+    col->mesh.vertex_supp   = PACK_COLOR(255, 0,   255, 255) ;
+    col->mesh.line          = PACK_COLOR(0,   255, 0,   255) ; 
+    col->mesh.triangle      = PACK_COLOR(0,   255, 0,   255) ;
+    col->mesh.quadrangle    = PACK_COLOR(0,   255, 0,   255) ; 
+    col->mesh.tetrahedron   = PACK_COLOR(0,   255, 0,   255) ;
+    col->mesh.hexahedron    = PACK_COLOR(128, 255, 0,   255) ;
+    col->mesh.prism         = PACK_COLOR(0,   255, 128, 255) ;
+    col->mesh.pyramid       = PACK_COLOR(128, 255, 128, 255) ;
+    col->mesh.tangents      = PACK_COLOR(128, 128, 128, 255) ;
+    col->mesh.normals       = PACK_COLOR(128, 128, 128, 255) ;
+
+    col->mesh.carousel[0]   = PACK_COLOR(0  , 82 , 138, 255) ;
+    col->mesh.carousel[1]   = PACK_COLOR(255, 0  , 0  , 255) ;
+    col->mesh.carousel[2]   = PACK_COLOR(31 , 110, 171, 255) ;
+    col->mesh.carousel[3]   = PACK_COLOR(255, 255, 0  , 255) ; 
+    col->mesh.carousel[4]   = PACK_COLOR(255, 0  , 255, 255) ; 
+    col->mesh.carousel[4]   = PACK_COLOR(0  , 255, 255, 255) ; 
+    col->mesh.carousel[5]   = PACK_COLOR(128, 128, 0  , 255) ; 
+    col->mesh.carousel[6]   = PACK_COLOR(128, 0  , 255, 255) ; 
+    col->mesh.carousel[7]   = PACK_COLOR(128, 128, 255, 255) ; 
+    col->mesh.carousel[8]   = PACK_COLOR(128, 128, 255, 255) ; 
+    col->mesh.carousel[9]   = PACK_COLOR(0  , 0  , 255, 255) ; 
+    break;
+    
+  case 2 : /* grayscale */
+    col->bg                 = PACK_COLOR(255, 255, 255, 255) ;
+    col->fg                 = PACK_COLOR(0,   0,   0,   255) ;
+    col->text               = PACK_COLOR(0,   0,   0,   255) ;
+    col->axes               = PACK_COLOR(0,   0,   0,   255) ;
+    col->little_axes        = PACK_COLOR(0,   0,   0,   255) ;
+    
+    col->geom.point         = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.line          = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.surface       = PACK_COLOR(0,   0,   0,   255) ; 
+    col->geom.volume        = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.point_sel     = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.line_sel      = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.surface_sel   = PACK_COLOR(0,   0,   0,   255) ; 
+    col->geom.volume_sel    = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.point_hlt     = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.line_hlt      = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.surface_hlt   = PACK_COLOR(0,   0,   0,   255) ; 
+    col->geom.volume_hlt    = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.tangents      = PACK_COLOR(0,   0,   0,   255) ;
+    col->geom.normals       = PACK_COLOR(0,   0,   0,   255) ;
+    
+    col->mesh.vertex        = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.vertex_supp   = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.line          = PACK_COLOR(0,   0,   0,   255) ; 
+    col->mesh.triangle      = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.quadrangle    = PACK_COLOR(0,   0,   0,   255) ; 
+    col->mesh.tetrahedron   = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.hexahedron    = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.prism         = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.pyramid       = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.tangents      = PACK_COLOR(0,   0,   0,   255) ;
+    col->mesh.normals       = PACK_COLOR(0,   0,   0,   255) ;
+
+    col->mesh.carousel[0]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[1]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[2]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[3]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[4]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[4]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[5]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[6]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[7]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[8]   = PACK_COLOR(255, 255, 255, 255) ;
+    col->mesh.carousel[9]   = PACK_COLOR(255, 255, 255, 255) ;
+
+  }
+
+}
+
+
+void InitContext(Context_T *ctx){
+
+  ctx->interactive       = 0 ;
+
+  ctx->r[0]              = 0.0 ;
+  ctx->r[1]              = 0.0 ;
+  ctx->r[2]              = 0.0 ;
+  ctx->t[0]              = 0.0 ;
+  ctx->t[1]              = 0.0 ;
+  ctx->t[2]              = 0.0 ;
+  ctx->s[0]              = 1.0 ;
+  ctx->s[1]              = 1.0 ;
+  ctx->s[2]              = 1.0 ;
+
+  ctx->min[0]          = 0.0 ;
+  ctx->min[1]          = 0.0 ;
+  ctx->min[2]          = 0.0 ;
+  ctx->max[0]          = 0.0 ;
+  ctx->max[1]          = 0.0 ;
+  ctx->max[2]          = 0.0 ;
+  ctx->range[0]          = 0.0 ;
+  ctx->range[1]          = 0.0 ;
+  ctx->range[2]          = 0.0 ;
+
+  ctx->viewport[0]       = 0 ;
+  ctx->viewport[1]       = 0 ;
+  ctx->viewport[2]       = 1 ;
+  ctx->viewport[3]       = 1 ;
+  ctx->render_mode       = GMSH_RENDER ;
+  ctx->pixel_equiv_x     = 0. ;
+  ctx->pixel_equiv_y     = 0. ; 
+
+#ifdef _UNIX
+  ctx->font_string          = "-*-helvetica-medium-r-*-*-*-*-*-*-*-*-*-*";
+  ctx->colorbar_font_string = "fixed";
+#else
+  ctx->font_string          = "dummy";
+  ctx->colorbar_font_string = "dummy";
+#endif
+
+  ctx->light0[0]         = 0.5 ;
+  ctx->light0[1]         = 0.3 ;
+  ctx->light0[2]         = 1.0 ;
+  ctx->light0[3]         = 0.0 ;
+  ctx->shine             = 0.4 ;
+  ctx->alpha             = 0 ; /* disable alpha blending by default */
+  ctx->flash             = 0 ;
+  ctx->same_visual       = 0 ;
+
+  ctx->db                = 1 ;
+  ctx->overlay           = 1 ;
+  ctx->stream            = TO_SCREEN ;
+  ctx->axes              = 1 ;
+  ctx->little_axes       = 1 ;
+  ctx->ortho             = 1 ;
+  ctx->fast              = 1 ;
+  ctx->display_lists     = 0 ; 
+  ctx->command_win       = 0 ;
+  ctx->threads           = 0 ; // bugge avec Open3D sur DEC ...
+  ctx->threads_lock      = 0 ;
+
+  ctx->geom.vis_type     = 0 ;
+  ctx->geom.points       = 1 ;
+  ctx->geom.lines        = 1 ;
+  ctx->geom.surfaces     = 0 ;
+  ctx->geom.volumes      = 0 ;
+  ctx->geom.points_num   = 0 ;
+  ctx->geom.lines_num    = 0 ;
+  ctx->geom.surfaces_num = 0 ;
+  ctx->geom.volumes_num  = 0 ;
+  ctx->geom.level        = ELEMENTARY ;
+  ctx->geom.normals      = 0.0 ;
+  ctx->geom.tangents     = 0.0 ;
+  ctx->geom.highlight    = 1 ;
+  ctx->geom.hidden       = 0 ;
+  ctx->geom.shade        = 0 ;
+
+  ctx->mesh.vis_type     = 0 ;
+  ctx->mesh.draw         = 1 ;  
+  ctx->mesh.points       = 1 ;
+  ctx->mesh.lines        = 1 ;
+  ctx->mesh.surfaces     = 1 ;
+  ctx->mesh.volumes      = 1 ;
+  ctx->mesh.points_num   = 0 ;
+  ctx->mesh.lines_num    = 0 ;
+  ctx->mesh.surfaces_num = 0 ;
+  ctx->mesh.volumes_num  = 0 ;
+  ctx->mesh.normals      = 0.0 ;
+  ctx->mesh.tangents     = 0.0 ;  
+  ctx->mesh.explode      = 1.0 ;
+  ctx->mesh.hidden       = 0 ;  
+  ctx->mesh.shade        = 0 ;  
+  ctx->mesh.format       = FORMAT_MSH ;
+  ctx->mesh.nb_smoothing = 0 ;
+  ctx->mesh.algo         = DELAUNAY_OLDALGO ;
+  ctx->mesh.degree       = 1 ;
+  ctx->mesh.is_limit_gamma = 0 ;
+  ctx->mesh.limit_gamma  = 0.1 ;
+  ctx->mesh.dual         = 0 ;
+  ctx->mesh.reco_extrude = 0 ;
+
+  ctx->post.draw         = 1 ;
+  ctx->post.scales       = 1 ;
+  ctx->post.link         = 0 ;
+  ctx->post.font         = "Courier" ;
+  ctx->post.fontsize     = 12 ;
+  ctx->post.initial_visibility = 1 ;
+  ctx->post.initial_intervals = DRAW_POST_ISO ;
+  ctx->post.initial_nbiso = 15 ;
+  ctx->post.anim_delay    = 0 ;
+
+#ifdef _UNIX
+  ctx->print.type        = GLPRPAINTER ;
+  ctx->print.format      = FORMAT_EPS ;
+#else
+  ctx->print.type        = -1 ;
+  ctx->print.format      = -1 ;
+#endif
+
+  ctx->color.id = -1;
+  InitColors(&ctx->color, 0) ;
+
+}
+
diff --git a/Common/Context.h b/Common/Context.h
new file mode 100644
index 0000000000000000000000000000000000000000..0f8140ee0ef32f9cb407e138b51acce69139279f
--- /dev/null
+++ b/Common/Context.h
@@ -0,0 +1,143 @@
+#ifndef _CONTEXT_H_
+#define _CONTEXT_H_
+
+/* 
+   Interface-independant context
+ */
+
+/* How RGBA values are packed and unpacked into/from a 4-byte integer */
+
+#  ifdef _LITTLE
+#    define PACK_COLOR(R,G,B,A)   ( (A)<<24 | (B)<<16 | (G)<<8 | (R) )
+#    define UNPACK_RED(X)         ( (X) & 0xff )
+#    define UNPACK_GREEN(X)       ( ( (X) >> 8 ) & 0xff )
+#    define UNPACK_BLUE(X)        ( ( (X) >> 16 ) & 0xff )
+#    define UNPACK_ALPHA(X)       ( ( (X) >> 24 ) & 0xff )
+#  else
+#    define PACK_COLOR(R,G,B,A)   ( (R)<<24 | (G)<<16 | (B)<<8 | (A) )
+#    define UNPACK_RED(X)         ( ( (X) >> 24 ) & 0xff )
+#    define UNPACK_GREEN(X)       ( ( (X) >> 16 ) & 0xff )
+#    define UNPACK_BLUE(X)        ( ( (X) >> 8 ) & 0xff )
+#    define UNPACK_ALPHA(X)       ( (X) & 0xff )
+#  endif
+
+typedef struct{
+  int id;			/* the current rgbacolors id */
+  
+  /* general colors */
+  unsigned int bg, fg, text, axes, little_axes;
+  
+  /* geometry colors */
+  struct{
+    unsigned int point, line, surface, volume;
+    unsigned int point_sel, line_sel, surface_sel, volume_sel;
+    unsigned int point_hlt, line_hlt, surface_hlt, volume_hlt;
+    unsigned int tangents, normals;
+  }
+  geom;
+  
+  /* mesh colors */
+  struct{
+    unsigned int vertex, vertex_supp, line, triangle, quadrangle;
+    unsigned int tetrahedron, hexahedron, prism, pyramid;
+    unsigned int carousel[10];
+    unsigned int tangents, normals;
+  }
+  mesh;
+  
+}rgbacolors;
+
+typedef struct {
+
+  int interactive;		/* 0=full gfx; -1=just parse; 1,2,3=batch mesh */
+
+  double r[3], t[3], s[3];	/* current rotation, translation and scale */
+  int rlock[3], tlock[3], slock[3];	/* locks for r, t and s */
+  
+  double min[3];		/* x, y and z min for the current geometry */
+  double max[3];		/* x, y and z max for the current geometry */
+  double range[3];		/* maximum range in the three directions */
+  
+  int db;			/* double buffer? */
+  int overlay;	   	        /* overlay graphic window? */
+  int stream;			/* output stream: TO_SCREEN or TO_FILE */
+  int ortho;			/* orthogonal projection? */
+  int fast;			/* inhibit mesh and postpro drawing when changing r,s,t */
+  int command_win;		/* command window? */
+  int display_lists;		/* use display lists? */
+  int font_base;		/* display list indice for the font */
+  int axes, little_axes;	/* draw axes? */
+  int threads, threads_lock;	/* threads?, lock (should be a mutex...) */
+  int alpha;                    /* enable alpha blending */
+  int flash;                    /* authorize colormap flashing (beek) */
+  int same_visual;              /* force same visual for GUI and Graphics */
+  
+  char *font_string;          /* main font */
+  char *colorbar_font_string; /* font for colorbar */
+
+  /* OpenGL stuff */
+  int viewport[4];
+  float light0[4];            /* light source position */
+  float shine;                /* specular value */
+  int render_mode;		/* RENDER, SELECT, FEEDBACK */
+
+  double pixel_equiv_x, pixel_equiv_y ; /* approximative equivalent model lenght of a pixel */
+  
+  /* all colors except postpro colormaps */
+  rgbacolors color;
+  
+  /* geometry options */
+  struct{
+    int vis_type;
+    int points, lines, surfaces, volumes;
+    int points_num, lines_num, surfaces_num, volumes_num;
+    int hidden, shade;
+    int highlight;
+    int level;
+    double normals, tangents;
+  } geom;
+
+  /* mesh options */
+  struct {
+    int vis_type;
+    int draw;
+    int points, lines, surfaces, volumes;
+    int points_num, lines_num, surfaces_num, volumes_num;
+    int is_limit_gamma, dual;
+    double limit_gamma;
+    int hidden, shade;
+    int format, nb_smoothing, algo, degree;
+    int reco_extrude;
+    double normals, tangents, explode;
+  } mesh;
+
+  /* post processing options */
+  struct{
+    int draw, scales, link ;
+    char *font;
+    int  fontsize;
+    int  initial_visibility, initial_nbiso, initial_intervals ;
+    long anim_delay ;
+  }post;
+
+  /* print options */
+  struct{
+    int format, type;
+  } print;
+
+} Context_T;
+
+typedef struct {
+  char *string ; 
+  int int1, int2, int3, int4 ;
+} StringX4Int;
+
+typedef struct {
+  char *string ; 
+  void *Pointer ;
+} StringXPointer ;
+
+void InitContext (Context_T * ctx);
+void InitColors (rgbacolors * col, int num);
+
+#endif
diff --git a/Common/Gmsh.h b/Common/Gmsh.h
new file mode 100644
index 0000000000000000000000000000000000000000..477f71c1c3d4ca50575324db8de7dd5580cbdea4
--- /dev/null
+++ b/Common/Gmsh.h
@@ -0,0 +1,25 @@
+#ifndef _GMSH_H_
+#define _GMSH_H_
+
+/* This header should be included in any Gmsh source file. Modify it
+   only if really necessary, since it will force the whole code to be
+   rebuilt... */
+
+#undef true
+#define true  1
+
+#undef false
+#define false 0
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "Message.h"
+#include "Malloc.h"
+#include "List.h"
+#include "Tree.h"
+#include "Tools.h"
+
+#endif
diff --git a/Common/GmshUI.h b/Common/GmshUI.h
new file mode 100644
index 0000000000000000000000000000000000000000..f759c73139f49248bea044cea81d51da30caefd7
--- /dev/null
+++ b/Common/GmshUI.h
@@ -0,0 +1,24 @@
+
+#ifdef _UNIX
+
+/* UNIX includes */
+
+#include <X11/keysym.h>
+#include <Xm/XmAll.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glx.h>
+#include <GL/GLwMDrawA.h>
+
+#else
+
+/* Windows includes */
+
+#include<windows.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+extern "C"{
+#include <GL/glaux.h>
+}
+
+#endif
diff --git a/Common/Makefile b/Common/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..b0a0b3c4f70e9a16b5c659cfb43f78cf3fbd7221
--- /dev/null
+++ b/Common/Makefile
@@ -0,0 +1,59 @@
+#
+# Makefile for "libCommon.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g -Wall
+
+OS_FLAGS  = -D_UNIX
+
+RANLIB   = /usr/bin/ranlib
+RM       = rm
+RMFLAGS  = -f
+
+LIB      = ../lib/libCommon.a
+INCLUDE  = -I../includes -I../Common -I../DataStr -I../Geo -I../Graphics\
+           -I../Mesh -I../Parser -I../Unix
+
+CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) $(GL_INCLUDE)
+
+SRC =  	Context.cpp\
+        Views.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ)
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+Context.o: Context.cpp Gmsh.h Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  Const.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \
+  ../Graphics/Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h Context.h
+Views.o: Views.cpp Gmsh.h Message.h ../DataStr/Malloc.h ../DataStr/List.h \
+  ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h Views.h Const.h \
+  ../Graphics/ColorTable.h Context.h
diff --git a/Common/Message.h b/Common/Message.h
new file mode 100644
index 0000000000000000000000000000000000000000..e8f7d194a00ca2c89607c91f9cf904b6d3c87a88
--- /dev/null
+++ b/Common/Message.h
@@ -0,0 +1,21 @@
+#ifndef _MESSAGE_H_
+#define _MESSAGE_H_
+
+#include <stdarg.h>
+
+#define ERROR           0
+#define WARNING         1
+#define INFO            2
+#define INFOS           3
+#define SELECT          4
+#define STATUS          5
+#define PARSER_ERROR    6
+#define PARSER_INFO     7
+
+void   Info (int level, char *arg0);
+void   Signal (int signum);
+void   Msg (int level, char *fmt, ...);
+double Cpu (void);
+void   Progress(int);
+
+#endif
diff --git a/Common/Static.h b/Common/Static.h
new file mode 100644
index 0000000000000000000000000000000000000000..1cf77d9a3638d7adb8d39c12ed8e7b4e5b39e46e
--- /dev/null
+++ b/Common/Static.h
@@ -0,0 +1,53 @@
+#ifndef _STATIC_H_
+#define _STATIC_H_
+
+#include "Version.h"
+
+char gmsh_progname[]  = "This is Gmsh" ;
+char gmsh_copyright[] = "Copyright (C) 1997-2000 J.-F. Remacle, C. Geuzaine";
+char gmsh_version[]   = "Version          : " ;
+char gmsh_os[]        = "Operating System : " GMSH_OS ;
+char gmsh_date[]      = "Build Date       : " GMSH_DATE ;
+char gmsh_host[]      = "Build Host       : " GMSH_HOST ;
+char gmsh_packager[]  = "Packager         : " GMSH_PACKAGER ;
+char gmsh_email[]     = "E-Mail           : "
+                        "Christophe.Geuzaine@ulg.ac.be, Remacle@scorec.rpi.edu";
+char gmsh_url[]       = "URL              : http://www.geuz.org/gmsh/";
+
+
+char  yyname[NAME_STR_L];
+int   yyerrorstate;
+
+char  TheFileNameTab[MAX_OPEN_FILES][NAME_STR_L], TheFileName[NAME_STR_L];
+char  TheBaseFileName[NAME_STR_L], TheMshFileName[NAME_STR_L], TheBgmFileName[NAME_STR_L];
+char  ThePathForIncludes[NAME_STR_L] = "";
+
+Context_T   CTX ;
+Mesh        M, *THEM, *LOCAL;
+Simplex     Boundary;
+
+Tree_T     *EntitesVisibles = NULL;
+List_T     *TrsfVolNum = NULL;
+List_T     *Post_ViewList = NULL;
+
+double      LC, MiddleLC, FACTEUR_MULTIPLICATIF=1.0;
+int         LC_ORDER;
+double      RANDOM_FACTOR=1.0, GLOBALSCALINGFACTOR=1.0;
+
+char       *TextBuffer, TextAbout[1024];
+
+int  NbFileName=0;
+int  EXPOSE = 0 ;
+int  WARNING_OVERRIDE=0;
+int  ACTUAL_ENTITY, SHOW_ALL;
+int  LocalNewPoint= CENTER_CIRCCIRC, FindQualityMethod=FEM_INTERPOLATION;
+int  Alerte_Point_Scabreux, Alerte_Point_Exterieur, Highlight_Selection=0;
+int  SPEED_MAX=0 ;
+int  LISSAGE=3; 
+int  INITIALBGMESH=NONE, TYPBGMESH=WITHPOINTS;
+int  CurrentNodeNumber, CurrentSimplexNumber;
+int  NbComplexVolumes=0, BD_EXISTS=0;
+int  FLAG_OLD_CIRCLE = 0 ; /* Pour David : cercles > Pi */
+
+
+#endif
diff --git a/Common/Version.h b/Common/Version.h
new file mode 100644
index 0000000000000000000000000000000000000000..05d5af1bcb0b8ab34f1ebd6e57ea97e9276b5ebd
--- /dev/null
+++ b/Common/Version.h
@@ -0,0 +1,5 @@
+#define GMSH_VERSION  0.995
+#define GMSH_DATE     "Thu Nov 23 00:50:59 CET 2000"
+#define GMSH_HOST     "geuz.montefiore.ulg.ac.be"
+#define GMSH_PACKAGER "geuzaine"
+#define GMSH_OS       "Linux 2.2.16-22"
diff --git a/Common/Views.cpp b/Common/Views.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9488d1ed7a20ac63fd8bbbfc2a53979813e3be53
--- /dev/null
+++ b/Common/Views.cpp
@@ -0,0 +1,488 @@
+
+#include "Gmsh.h"
+#include "Views.h"
+#include "Context.h"
+#include "ColorTable.h"
+
+extern Context_T   CTX ;
+
+extern List_T     *Post_ViewList;
+extern double      LC;
+
+static Post_View  *ActualView;
+static int         ActualViewNum=0;
+
+/* ------------------------------------------------------------------------ */
+/*  V i e w s                                                               */
+/* ------------------------------------------------------------------------ */
+
+void AddView(int , char *, int);
+
+void BeginView(int allocate){
+  ActualView = (Post_View*)Malloc(sizeof(Post_View));
+  ActualView->Num = ++ActualViewNum;
+  ActualView->Changed = 1;
+  if(allocate){
+    ActualView->Allocated = 1;
+    ActualView->Simplices = List_Create(100,100,sizeof(Post_Simplex));
+    ActualView->Triangles = List_Create(100,100,sizeof(Post_Triangle));
+    ActualView->Lines = List_Create(100,100,sizeof(Post_Line));
+    ActualView->Points = List_Create(100,100,sizeof(Post_Point));
+  }
+  else{
+    ActualView->Allocated = 0;
+  }
+  ActualView->NbIso = CTX.post.initial_nbiso;
+  ActualView->IntervalsType = CTX.post.initial_intervals;
+  ActualView->Light = 0;
+  ActualView->ShowElement = 0;
+  ActualView->Visible = CTX.post.initial_visibility;
+  ActualView->TimeStep = 0;
+  ActualView->ArrowScale = 100.; 
+  ActualView->ArrowType = DRAW_POST_ARROW; 
+  ActualView->ArrowLocation = DRAW_POST_LOCATE_COG; 
+  ActualView->RangeType = DRAW_POST_DEFAULT; 
+  ActualView->ShowScale = 1;
+  ActualView->TransparentScale = 1;
+  ActualView->ScaleType = DRAW_POST_LINEAR; 
+  ActualView->Raise[0] = 0.0;
+  ActualView->Raise[1] = 0.0;
+  ActualView->Raise[2] = 0.0;
+  ActualView->ScalarOnly = 1;
+  ActualView->Min = 1.e200;
+  ActualView->Max = -1.e200;
+  ActualView->NbTimeStep = 0;
+
+  ActualView->CT.size = 255;
+  ActualView->CT.ipar[COLORTABLE_MODE] = COLORTABLE_RGB;
+  color_table_init_param(1, &ActualView->CT, 1, 1);
+  color_table_recompute(&ActualView->CT, 1, 1);
+}
+
+void EndView(char *Name, double XOffset, double YOffset, double ZOffset){
+  strcpy(ActualView->Name,Name);
+  strcpy(ActualView->Format, "%.3e");
+  ActualView->CustomMin = ActualView->Min;
+  ActualView->CustomMax = ActualView->Max;
+
+  ActualView->Offset[0] = XOffset*(CTX.range[0]?CTX.range[0]:LC)*1.e-3;
+  ActualView->Offset[1] = YOffset*(CTX.range[1]?CTX.range[1]:LC)*1.e-3;
+  ActualView->Offset[2] = ZOffset*(CTX.range[2]?CTX.range[2]:LC)*1.e-3;
+
+  /* j'en alloue directement le max pour eviter les problemes avec 
+   * CurrentView: cf. rem dans cb_post.c 
+   */
+  if(!Post_ViewList) 
+    Post_ViewList = List_Create(20,1,sizeof(Post_View));
+
+  List_Add(Post_ViewList,ActualView);
+  
+  AddView(List_Nbr(Post_ViewList), ActualView->Name, 1);
+  ActualView = NULL;
+}
+
+/* ------------------------------------------------------------------------ */
+/*  S i m p l e x                                                           */
+/* ------------------------------------------------------------------------ */
+
+void AddView_ScalarSimplex(double x0,double y0,double z0,
+			   double x1,double y1,double z1,
+			   double x2,double y2,double z2,
+			   double x3,double y3,double z3,
+			   List_T *v){
+  Post_Simplex S;
+  int i,N ;
+  
+  S.Type = DRAW_POST_SCALAR;
+  S.X[0] = x0; S.X[1] = x1; S.X[2] = x2; S.X[3] = x3;
+  S.Y[0] = y0; S.Y[1] = y1; S.Y[2] = y2; S.Y[3] = y3; 
+  S.Z[0] = z0; S.Z[1] = z1; S.Z[2] = z2; S.Z[3] = z3; 
+
+  N = List_Nbr(v);
+  S.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=4){
+    List_Read(v,i,  &S.V[i]) ;
+    List_Read(v,i+1,&S.V[i+1]) ;
+    List_Read(v,i+2,&S.V[i+2]) ;
+    List_Read(v,i+3,&S.V[i+3]) ;
+
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(DMIN(DMIN(S.V[i],S.V[i+1]),S.V[i+2]),S.V[i+3]);
+      ActualView->Max = DMAX(DMAX(DMAX(S.V[i],S.V[i+1]),S.V[i+2]),S.V[i+3]);
+      ActualView->NbTimeStep = N/4;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(DMIN(DMIN(S.V[i],S.V[i+1]),S.V[i+2]),
+				  S.V[i+3]),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(DMAX(DMAX(S.V[i],S.V[i+1]),S.V[i+2]),
+				  S.V[i+3]),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/4,ActualView->NbTimeStep);
+    }
+  }
+  
+  List_Add(ActualView->Simplices,&S);
+}
+
+void AddView_VectorSimplex(double x0,double y0,double z0,
+			   double x1,double y1,double z1,
+			   double x2,double y2,double z2,
+			   double x3,double y3,double z3,
+			   List_T *v){
+  Post_Simplex S;
+  double l0,l1,l2,l3;
+  int i,N ;
+    
+  S.Type = DRAW_POST_VECTOR;
+  S.X[0] = x0; S.X[1] = x1; S.X[2] = x2; S.X[3] = x3;
+  S.Y[0] = y0; S.Y[1] = y1; S.Y[2] = y2; S.Y[3] = y3;
+  S.Z[0] = z0; S.Z[1] = z1; S.Z[2] = z2; S.Z[3] = z3;
+
+  N = List_Nbr(v);
+  S.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=12){
+    List_Read(v,i,  &S.V[i]);   List_Read(v,i+1,&S.V[i+1]);   List_Read(v,i+2,&S.V[i+2]);
+    List_Read(v,i+3,&S.V[i+3]); List_Read(v,i+4,&S.V[i+4]);   List_Read(v,i+5,&S.V[i+5]);
+    List_Read(v,i+6,&S.V[i+6]); List_Read(v,i+7,&S.V[i+7]);   List_Read(v,i+8,&S.V[i+8]);
+    List_Read(v,i+9,&S.V[i+9]); List_Read(v,i+10,&S.V[i+10]); List_Read(v,i+11,&S.V[i+11]);
+    
+    l0 = sqrt(S.V[i]  *S.V[i]  +S.V[i+1]*S.V[i+1]  +S.V[i+2]*S.V[i+2]);
+    l1 = sqrt(S.V[i+3]*S.V[i+3]+S.V[i+4]*S.V[i+4]  +S.V[i+5]*S.V[i+5]);
+    l2 = sqrt(S.V[i+6]*S.V[i+6]+S.V[i+7]*S.V[i+7]  +S.V[i+8]*S.V[i+8]);
+    l3 = sqrt(S.V[i+9]*S.V[i+9]+S.V[i+10]*S.V[i+10]+S.V[i+11]*S.V[i+11]);
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),l3);
+      ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),l3);
+      ActualView->NbTimeStep = N/12;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(DMIN(DMIN(l0,l1),l2),l3),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(DMAX(DMAX(l0,l1),l2),l3),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/12,ActualView->NbTimeStep);
+    }
+  }
+
+  ActualView->ScalarOnly = 0;
+  List_Add(ActualView->Simplices,&S);
+}
+
+void AddView_TensorSimplex(double x0,double y0,double z0,
+			   double x1,double y1,double z1,
+			   double x2,double y2,double z2,
+			   double x3,double y3,double z3,
+			   List_T *v){
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  T r i a n g l e                                                         */
+/* ------------------------------------------------------------------------ */
+
+void AddView_ScalarTriangle(double x0,double y0,double z0,
+			    double x1,double y1,double z1,
+			    double x2,double y2,double z2,
+			    List_T *v){
+  Post_Triangle T;
+  int i,N ;
+  
+  T.Type = DRAW_POST_SCALAR;
+  T.X[0] = x0; T.X[1] = x1; T.X[2] = x2;
+  T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2;
+  T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2;
+
+  N = List_Nbr(v);
+  T.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=3){
+    List_Read(v,i,  &T.V[i]) ;
+    List_Read(v,i+1,&T.V[i+1]) ;
+    List_Read(v,i+2,&T.V[i+2]) ;
+
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(DMIN(T.V[i],T.V[i+1]),T.V[i+2]);
+      ActualView->Max = DMAX(DMAX(T.V[i],T.V[i+1]),T.V[i+2]);
+      ActualView->NbTimeStep = N/3;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(DMIN(T.V[i],T.V[i+1]),T.V[i+2]),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(DMAX(T.V[i],T.V[i+1]),T.V[i+2]),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/3,ActualView->NbTimeStep);
+    }
+  }
+  
+  List_Add(ActualView->Triangles,&T);
+}
+
+void AddView_VectorTriangle(double x0,double y0,double z0,
+			    double x1,double y1,double z1,
+			    double x2,double y2,double z2,
+			    List_T *v){
+  Post_Triangle T;
+  double l0,l1,l2;
+  int i,N ;
+    
+  T.Type = DRAW_POST_VECTOR;
+  T.X[0] = x0; T.X[1] = x1; T.X[2] = x2;
+  T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2;
+  T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2;
+
+  N = List_Nbr(v);
+  T.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=9){
+    List_Read(v,i,  &T.V[i]);   List_Read(v,i+1,&T.V[i+1]); List_Read(v,i+2,&T.V[i+2]);
+    List_Read(v,i+3,&T.V[i+3]); List_Read(v,i+4,&T.V[i+4]); List_Read(v,i+5,&T.V[i+5]);
+    List_Read(v,i+6,&T.V[i+6]); List_Read(v,i+7,&T.V[i+7]); List_Read(v,i+8,&T.V[i+8]);
+    
+    l0 = sqrt(T.V[i]  *T.V[i]  +T.V[i+1]*T.V[i+1]+T.V[i+2]*T.V[i+2]);
+    l1 = sqrt(T.V[i+3]*T.V[i+3]+T.V[i+4]*T.V[i+4]+T.V[i+5]*T.V[i+5]);
+    l2 = sqrt(T.V[i+6]*T.V[i+6]+T.V[i+7]*T.V[i+7]+T.V[i+8]*T.V[i+8]);
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(DMIN(l0,l1),l2);
+      ActualView->Max = DMAX(DMAX(l0,l1),l2);
+      ActualView->NbTimeStep = N/9;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/9,ActualView->NbTimeStep);
+    }
+  }
+
+  ActualView->ScalarOnly = 0;
+  List_Add(ActualView->Triangles,&T);
+}
+
+void AddView_TensorTriangle(double x0,double y0,double z0,
+			    double x1,double y1,double z1,
+			    double x2,double y2,double z2,
+			    List_T *v){
+  Post_Triangle T;
+  double l0,l1,l2;
+  int i,N ;
+    
+  T.Type = DRAW_POST_TENSOR;
+  T.X[0] = x0; T.X[1] = x1; T.X[2] = x2;
+  T.Y[0] = y0; T.Y[1] = y1; T.Y[2] = y2;
+  T.Z[0] = z0; T.Z[1] = z1; T.Z[2] = z2;
+
+  N = List_Nbr(v);
+  T.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=27){
+    List_Read(v,i,  &T.V[i]);     List_Read(v,i+1,&T.V[i+1]);   List_Read(v,i+2,&T.V[i+2]);
+    List_Read(v,i+3,&T.V[i+3]);   List_Read(v,i+4,&T.V[i+4]);   List_Read(v,i+5,&T.V[i+5]);
+    List_Read(v,i+6,&T.V[i+6]);   List_Read(v,i+7,&T.V[i+7]);   List_Read(v,i+8,&T.V[i+8]);
+    List_Read(v,i+9,&T.V[i+9]);   List_Read(v,i+10,&T.V[i+10]); List_Read(v,i+11,&T.V[i+11]);
+    List_Read(v,i+12,&T.V[i+12]); List_Read(v,i+13,&T.V[i+13]); List_Read(v,i+14,&T.V[i+14]);
+    List_Read(v,i+15,&T.V[i+15]); List_Read(v,i+16,&T.V[i+16]); List_Read(v,i+17,&T.V[i+17]);
+    List_Read(v,i+18,&T.V[i+18]); List_Read(v,i+19,&T.V[i+19]); List_Read(v,i+20,&T.V[i+20]);
+    List_Read(v,i+21,&T.V[i+21]); List_Read(v,i+22,&T.V[i+22]); List_Read(v,i+23,&T.V[i+23]);
+    List_Read(v,i+24,&T.V[i+24]); List_Read(v,i+25,&T.V[i+25]); List_Read(v,i+26,&T.V[i+26]);
+    
+    l0 = sqrt(T.V[i]  *T.V[i]  +T.V[i+1]*T.V[i+1]+T.V[i+2]*T.V[i+2]);
+    l1 = sqrt(T.V[i+3]*T.V[i+3]+T.V[i+4]*T.V[i+4]+T.V[i+5]*T.V[i+5]);
+    l2 = sqrt(T.V[i+6]*T.V[i+6]+T.V[i+7]*T.V[i+7]+T.V[i+8]*T.V[i+8]);
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(DMIN(l0,l1),l2);
+      ActualView->Max = DMAX(DMAX(l0,l1),l2);
+      ActualView->NbTimeStep = N/9;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(DMIN(l0,l1),l2),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(DMAX(l0,l1),l2),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/9,ActualView->NbTimeStep);
+    }
+  }
+
+  ActualView->ScalarOnly = 0;
+  List_Add(ActualView->Triangles,&T);
+}
+
+/* ------------------------------------------------------------------------ */
+/*  L i n e                                                                 */
+/* ------------------------------------------------------------------------ */
+
+void AddView_ScalarLine(double x0,double y0,double z0,
+			double x1,double y1,double z1,
+			List_T *v){
+  Post_Line L;
+  int i,N ;
+  
+  L.Type = DRAW_POST_SCALAR;
+  L.X[0] = x0; L.X[1] = x1;  
+  L.Y[0] = y0; L.Y[1] = y1;  
+  L.Z[0] = z0; L.Z[1] = z1;  
+
+  N = List_Nbr(v);
+  L.V = (double*)Malloc(N*sizeof(double));
+  
+  for(i=0 ; i<N ; i+=2){
+    List_Read(v,i,&L.V[i]) ;
+    List_Read(v,i+1,&L.V[i+1]) ;
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(L.V[i],L.V[i+1]);
+      ActualView->Max = DMAX(L.V[i],L.V[i+1]);
+      ActualView->NbTimeStep = N/2;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(L.V[i],L.V[i+1]),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(L.V[i],L.V[i+1]),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/2,ActualView->NbTimeStep);
+    }
+  }
+
+  List_Add(ActualView->Lines,&L);
+}
+
+
+void AddView_VectorLine(double x0,double y0,double z0,
+			double x1,double y1,double z1,
+			List_T *v){
+  Post_Line L;
+  double l0,l1;
+  int i,N ;
+  
+  L.Type = DRAW_POST_VECTOR;
+  L.X[0] = x0; L.X[1] = x1; 
+  L.Y[0] = y0; L.Y[1] = y1; 
+  L.Z[0] = z0; L.Z[1] = z1; 
+
+  N = List_Nbr(v);
+  L.V = (double*)Malloc(N*sizeof(double));
+
+  for(i=0 ; i<N ; i+=6){
+    List_Read(v,i,  &L.V[i]);   List_Read(v,i+1,&L.V[i+1]); 
+    List_Read(v,i+2,&L.V[i+2]); List_Read(v,i+3,&L.V[i+3]); 
+    List_Read(v,i+4,&L.V[i+4]); List_Read(v,i+5,&L.V[i+5]); 
+
+    l0 = sqrt(L.V[i]  *L.V[i]  +L.V[i+1]*L.V[i+1]+L.V[i+2]*L.V[i+2]);
+    l1 = sqrt(L.V[i+3]*L.V[i+3]+L.V[i+4]*L.V[i+4]+L.V[i+5]*L.V[i+5]);
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = DMIN(l0,l1);
+      ActualView->Max = DMAX(l0,l1);
+      ActualView->NbTimeStep = N/6;
+    }
+    else{
+      ActualView->Min = DMIN(DMIN(l0,l1),ActualView->Min);
+      ActualView->Max = DMAX(DMAX(l0,l1),ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/6,ActualView->NbTimeStep);
+    }
+  }
+ 
+  ActualView->ScalarOnly = 0;
+  List_Add(ActualView->Lines,&L);
+}
+
+void AddView_TensorLine(double x0,double y0,double z0,
+			double x1,double y1,double z1,
+			List_T *v){
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  P o i n t                                                               */
+/* ------------------------------------------------------------------------ */
+
+void AddView_ScalarPoint(double x0,double y0,double z0,
+			 List_T *v){
+  Post_Point P;
+  double l;
+  int i,N ;
+  
+  P.Type = DRAW_POST_SCALAR; 
+  P.X = x0; 
+  P.Y = y0; 
+  P.Z = z0; 
+
+  N = List_Nbr(v); 
+  P.V = (double*)Malloc(N*sizeof(double));
+
+  for(i=0 ; i<N ; i++){
+    List_Read(v,i,  &P.V[i]); 
+    l = P.V[i];
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = l;
+      ActualView->Max = l;
+      ActualView->NbTimeStep = N/3;
+    }
+    else{
+      ActualView->Min = DMIN(l,ActualView->Min);
+      ActualView->Max = DMAX(l,ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N,ActualView->NbTimeStep);
+    }
+  }
+
+  ActualView->ScalarOnly = 1;
+  List_Add(ActualView->Points,&P);
+}
+
+
+void AddView_VectorPoint(double x0,double y0,double z0,
+			 List_T *v){
+  Post_Point P;
+  double l;
+  int i,N ;
+  
+  P.Type = DRAW_POST_VECTOR; 
+  P.X = x0; 
+  P.Y = y0; 
+  P.Z = z0; 
+
+  N = List_Nbr(v); 
+  P.V = (double*)Malloc(N*sizeof(double));
+
+  for(i=0 ; i<N ; i+=3){
+    List_Read(v,i,  &P.V[i]); 
+    List_Read(v,i+1,&P.V[i+1]); 
+    List_Read(v,i+2,&P.V[i+2]); 
+
+    l = sqrt(P.V[i]*P.V[i] + P.V[i+1]*P.V[i+1] + P.V[i+2]*P.V[i+2]);
+    if(!List_Nbr(ActualView->Points) && 
+       !List_Nbr(ActualView->Lines) && 
+       !List_Nbr(ActualView->Triangles) &&
+       !List_Nbr(ActualView->Simplices)){
+      ActualView->Min = l;
+      ActualView->Max = l;
+      ActualView->NbTimeStep = N/3;
+    }
+    else{
+      ActualView->Min = DMIN(l,ActualView->Min);
+      ActualView->Max = DMAX(l,ActualView->Max);
+      ActualView->NbTimeStep = IMIN(N/3,ActualView->NbTimeStep);
+    }
+  }
+
+  ActualView->ScalarOnly = 0;
+  List_Add(ActualView->Points,&P);
+}
+
+void AddView_TensorPoint(double x0,double y0,double z0,
+			 List_T *v){
+}
+
diff --git a/Common/Views.h b/Common/Views.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf2abfe112ec14854ae5e48908c283128190e80f
--- /dev/null
+++ b/Common/Views.h
@@ -0,0 +1,144 @@
+#ifndef _VIEWS_H_
+#define _VIEWS_H_
+
+#include "Const.h"
+
+typedef struct{
+  int Type;
+  double X[4], Y[4], Z[4];
+  double *V;
+}Post_Simplex;
+
+typedef struct{
+  int Type;
+  double X[3], Y[3], Z[3];
+  double *V;
+}Post_Triangle;
+
+typedef struct{
+  int Type;
+  double X[2], Y[2], Z[2];
+  double *V;
+}Post_Line;
+
+typedef struct{
+  int Type;
+  double X, Y, Z;
+  double *V;
+}Post_Point;
+
+/* Post_XXX.Type. The keys are important ! */
+#define DRAW_POST_SCALAR 1
+#define DRAW_POST_VECTOR 3
+#define DRAW_POST_TENSOR 9
+
+/* IntervalsType */
+#define DRAW_POST_ISO          1
+#define DRAW_POST_CONTINUOUS   2
+#define DRAW_POST_DISCRETE     3
+#define DRAW_POST_NUMERIC      4
+
+/* ArrowType */
+#define DRAW_POST_SEGMENT      1
+#define DRAW_POST_ARROW        2
+#define DRAW_POST_PYRAMID      3
+#define DRAW_POST_CONE         4
+#define DRAW_POST_DISPLACEMENT 5
+#define DRAW_POST_ARROW_HEAD   6
+
+/* ArrowLovation */
+#define DRAW_POST_LOCATE_COG     1
+#define DRAW_POST_LOCATE_VERTEX  2
+
+/* ScaleType */
+#define DRAW_POST_DEFAULT 1
+#define DRAW_POST_CUSTOM  2
+
+/* RangeType */
+#define DRAW_POST_LINEAR       1
+#define DRAW_POST_LOGARITHMIC  2
+
+#include "ColorTable.h"
+
+typedef struct{
+  int Num, Changed, Allocated;
+  char Name[NAME_STR_L], Format[NAME_STR_L];
+  double Min, Max, CustomMin, CustomMax;
+  double Offset[3], Raise[3], ArrowScale;
+  int Visible, ScalarOnly;
+  int IntervalsType, NbIso, Light, ShowElement;
+  int ShowScale, TransparentScale, ScaleType, RangeType;
+  int ArrowType, ArrowLocation;
+  int TimeStep, NbTimeStep;
+  ColorTable CT;
+  List_T *Simplices, *Triangles, *Lines, *Points;
+  
+  double (*GVFI) (double min, double max, int nb, int index);
+  int (*GIFV) (double min, double max, int nb, double value);
+}Post_View;
+
+
+
+void BeginView (int alloc);
+void EndView (char *Name, double XOffset, double YOffset, double ZOffset);
+
+void AddView_ScalarSimplex (double x0, double y0, double z0,
+			    double x1, double y1, double z1,
+			    double x2, double y2, double z2,
+			    double x3, double y3, double z3,
+			    List_T * v);
+
+void AddView_VectorSimplex (double x0, double y0, double z0,
+			    double x1, double y1, double z1,
+			    double x2, double y2, double z2,
+			    double x3, double y3, double z3,
+			    List_T * v);
+
+void AddView_TensorSimplex (double x0, double y0, double z0,
+			    double x1, double y1, double z1,
+			    double x2, double y2, double z2,
+			    double x3, double y3, double z3,
+			    List_T * v);
+
+void AddView_ScalarTriangle (double x0, double y0, double z0,
+			     double x1, double y1, double z1,
+			     double x2, double y2, double z2,
+			     List_T * v);
+
+void AddView_VectorTriangle (double x0, double y0, double z0,
+			     double x1, double y1, double z1,
+			     double x2, double y2, double z2,
+			     List_T * v);
+
+void AddView_TensorTriangle (double x0, double y0, double z0,
+			     double x1, double y1, double z1,
+			     double x2, double y2, double z2,
+			     List_T * v);
+
+void AddView_ScalarLine (double x0, double y0, double z0,
+			 double x1, double y1, double z1,
+			 List_T * v);
+
+void AddView_VectorLine (double x0, double y0, double z0,
+			 double x1, double y1, double z1,
+			 List_T * v);
+
+void AddView_TensorLine (double x0, double y0, double z0,
+			 double x1, double y1, double z1,
+			 List_T * v);
+
+void AddView_ScalarPoint(double x0,double y0,double z0,
+			List_T *v);
+
+void AddView_VectorPoint(double x0,double y0,double z0,
+			 List_T *v);
+
+void AddView_TensorPoint(double x0,double y0,double z0,
+			 List_T *v);
+
+int BGMWithView (Post_View *ErrView);
+int  CreateBGM(Post_View *ErrView, int OptiMethod, double Degree,
+	       double OptiValue, double *ObjFunct, char *OutFile);
+double ErrorInView(Post_View * ErrView, int *n);
+
+#endif
diff --git a/DataStr/List.cpp b/DataStr/List.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ae9d1b65422ca123ec65896124cf7ffd6c6a47a2
--- /dev/null
+++ b/DataStr/List.cpp
@@ -0,0 +1,333 @@
+#define RCSID "$Id: List.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $"
+/* Original author: Marc UME */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "Malloc.h"
+#include "List.h"
+#include "Message.h"
+
+static char *startptr;
+
+
+List_T *List_Create(int n, int incr, int size)
+{
+  List_T *liste;
+
+  if (n <= 0)  n = 1 ;
+  if (incr <= 0) incr = 1;
+
+  liste = (List_T *)Malloc(sizeof(List_T));
+
+  liste->nmax    = 0;
+  liste->incr    = incr;
+  liste->size    = size;
+  liste->n       = 0;
+  liste->isorder = 0;
+  liste->array   = NULL;
+
+  List_Realloc(liste,n);
+  return(liste);
+}
+
+void List_Delete(List_T *liste)
+{
+  Free(liste->array);
+  Free(liste);
+}
+
+void List_Realloc(List_T *liste,int n)
+{
+  if (n <= 0) return;
+
+  if (liste->array == NULL) {
+    liste->nmax = ((n - 1) / liste->incr + 1) * liste->incr;
+    liste->array = (char *)Malloc(liste->nmax * liste->size);
+  }
+  else
+    if (n > liste->nmax) {
+      liste->nmax = ((n - 1) / liste->incr + 1) * liste->incr;
+      liste->array = (char *)Realloc(liste->array,
+			 liste->nmax * liste->size);
+    }
+}
+
+void List_Add(List_T *liste, void *data)
+{
+  liste->n++;
+
+  List_Realloc(liste,liste->n);
+  liste->isorder = 0;
+  memcpy(&liste->array[(liste->n - 1) * liste->size],data,liste->size);
+}
+
+int List_Nbr(List_T *liste)
+{
+  return (liste)? liste->n : 0 ;
+}
+
+void List_Insert(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  if (List_Search(liste,data,fcmp) == 0)
+    List_Add(liste,data);
+}
+
+int List_Replace(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  void *ptr;
+
+  if (liste->isorder != 1) List_Sort(liste,fcmp);
+  liste->isorder = 1;
+  ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp);
+  if (ptr == NULL) {
+    List_Add(liste,data);
+    return(0);
+  }
+  else {
+    memcpy(ptr,data,liste->size);
+    return (1);
+  }
+}
+
+void List_Read(List_T *liste, int index, void *data)
+{
+  if ((index < 0) || (index >= liste->n))
+    Msg(ERROR, "Wrong List Index in List_Read");
+  memcpy(data,&liste->array[index * liste->size],liste->size);
+}
+
+void List_Write(List_T *liste, int index, void *data)
+{
+  if ((index < 0) || (index >= liste->n))
+    Msg(ERROR, "Wrong List Index in List_Write");
+  liste->isorder = 0;
+  memcpy(&liste->array[index * liste->size],data,liste->size);
+}
+
+void List_Put(List_T *liste, int index, void *data)
+{
+  if (index < 0)
+    Msg(ERROR, "Wrong List Index in List_Put");
+
+  if (index >= liste->n) {
+    liste->n = index + 1;
+    List_Realloc(liste,liste->n);
+    List_Write(liste,index,data);
+  } else {
+    List_Write(liste,index,data);
+  }
+}
+
+void List_Pop(List_T *liste)
+{
+  liste->n -- ;
+}
+
+void *List_Pointer(List_T *liste, int index)
+{
+  if ((index < 0) || (index >= liste->n))
+    Msg(ERROR, "Wrong List Index in List_Pointer");
+
+  liste->isorder = 0; /* getdp: a examiner... */
+  return(&liste->array[index * liste->size]);
+}
+
+void *List_Pointer_NoChange(List_T *liste, int index)
+{
+  if ((index < 0) || (index >= liste->n))
+    Msg(ERROR, "Wrong List Index in List_Pointer_NoChange");
+
+  return(&liste->array[index * liste->size]);
+}
+
+void List_Sort(List_T *liste, int (*fcmp)(const void *a, const void *b))
+{
+  qsort(liste->array,liste->n,liste->size,fcmp);
+}
+
+int List_Search(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  void *ptr;
+
+  if (liste->isorder != 1) { List_Sort(liste,fcmp) ; liste->isorder = 1 ; }
+  ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp);
+  if (ptr == NULL) return(0);
+  return (1);
+}
+
+int List_ISearch(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  void *ptr;
+
+  if (liste->isorder != 1) List_Sort(liste,fcmp);
+  liste->isorder = 1;
+  ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp);
+  if (ptr == NULL) return(-1);
+  return (((long)ptr - (long)liste->array) / liste->size);
+}
+
+int  List_ISearchSeq(List_T *liste, void * data,
+                     int (*fcmp)(const void *a, const void *b)) {
+  int i ;
+
+  if (!liste)  return -1 ;
+  i = 0 ;
+  while ((i < List_Nbr(liste)) &&
+         fcmp(data, (void *)List_Pointer(liste, i)) )  i++ ;
+  if (i == List_Nbr(liste))  i = -1 ;
+  return i ;
+}
+
+int  List_ISearchSeqPartial(List_T *liste, void * data, int i_Start,
+			    int (*fcmp)(const void *a, const void *b)) {
+  int i ;
+
+  if (!liste)  return -1 ;
+  i = i_Start ;
+  while ((i < List_Nbr(liste)) &&
+         fcmp(data, (void *)List_Pointer(liste, i)) )  i++ ;
+  if (i == List_Nbr(liste))  i = -1 ;
+  return i ;
+}
+
+int List_Query(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  void *ptr;
+
+  if (liste->isorder != 1) List_Sort(liste,fcmp);
+  liste->isorder = 1;
+  ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp);
+  if (ptr == NULL) return(0);
+
+  memcpy(data,ptr,liste->size);
+  return (1);
+}
+
+void *lolofind(void *data, void *array, int n, int size,
+	       int (*fcmp)(const void *a, const void *b) )
+{
+  char *ptr;
+  int i;
+
+  ptr = (char*)array;
+  for (i = 0; i < n; i++) {
+    if (fcmp(ptr,data) == 0) break;
+    ptr += size;
+  }
+  if (i < n) return(ptr);
+  return(NULL);
+}
+
+int List_LQuery(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b), int first)
+{
+  char *ptr;
+  
+  if (first == 1) { 
+    ptr = (char *) lolofind(data,liste->array,liste->n,liste->size,fcmp);
+  }
+  else {
+    if (startptr != NULL)
+      ptr = (char *) lolofind(data,startptr,liste->n,liste->size,fcmp);
+    else
+      return(0);
+  }
+
+  if (ptr == NULL) return(0);
+
+  startptr =  ptr + liste->size;
+  if ( startptr >= ( liste->array + liste->n * liste->size))
+    startptr = NULL;
+  memcpy(data,ptr,liste->size);
+  return (1);
+}
+
+void *List_PQuery(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  void *ptr;
+
+  if (liste->isorder != 1) List_Sort(liste,fcmp);
+  liste->isorder = 1;
+  ptr = (void *) bsearch(data,liste->array,liste->n,liste->size,fcmp);
+  return(ptr);
+}
+
+int List_Suppress(List_T *liste, void *data,
+		 int (*fcmp)(const void *a, const void *b))
+{
+  char *ptr;
+  int len;
+  
+  ptr = (char*)List_PQuery(liste,data,fcmp) ;
+  if (ptr == NULL) return(0);
+  
+  liste->n--;
+  len = liste->n - (((long)ptr - (long)liste->array) / liste->size);
+  if (len > 0) memmove(ptr, ptr + liste->size, len * liste->size);
+  return(1);
+}
+
+int List_PSuppress(List_T *liste, int index)
+{
+  char *ptr;
+  int len;
+  
+  ptr = (char*)List_Pointer_NoChange(liste,index) ;
+  if (ptr == NULL) return(0);
+  
+  liste->n--;
+  len = liste->n - (((long)ptr - (long)liste->array) / liste->size);
+  if (len > 0) memmove(ptr, ptr + liste->size, len * liste->size);
+  return(1);
+}
+
+void List_Invert(List_T *a , List_T *b)
+{
+  int i,N;
+  N = List_Nbr(a);
+  for(i=0;i<N;i++){
+    List_Add(b,List_Pointer(a,N-i-1));
+  }
+}
+
+void List_Reset(List_T *liste)
+{
+  liste->n = 0;
+}
+
+void List_Action(List_T *liste, void (*action)(void *data, void *dummy))
+{
+  int i,dummy;
+
+  for(i=0 ; i<List_Nbr(liste) ; i++){
+    (*action)(List_Pointer_NoChange(liste,i),&dummy);
+  }
+
+}
+
+void List_Action_Inverse(List_T *liste, void (*action)(void *data, void *dummy))
+{
+  int i,dummy;
+
+  for(i=List_Nbr(liste) ; i>0 ; i--){
+    (*action)(List_Pointer_NoChange(liste,i-1),&dummy);
+  }
+
+}
+
+void List_Copy(List_T *a , List_T *b){
+  int i,N;
+  N = List_Nbr(a);
+  for(i=0;i<N;i++){
+    List_Add(b,List_Pointer(a,i));
+  }
+}
diff --git a/DataStr/List.h b/DataStr/List.h
new file mode 100644
index 0000000000000000000000000000000000000000..abbba807c5e626cd5e34879f3095826815246665
--- /dev/null
+++ b/DataStr/List.h
@@ -0,0 +1,45 @@
+/* $Id: List.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */
+#ifndef _LIST_H_
+#define _LIST_H_
+
+typedef struct {
+  int nmax;
+  int size;
+  int incr;
+  int n;
+  int isorder;
+  char *array;
+} List_T;
+
+List_T *List_Create(int n, int incr, int size);
+void    List_Delete(List_T *liste);
+void    List_Realloc(List_T *liste,int n);
+void    List_Add(List_T *liste, void *data);
+int     List_Nbr(List_T *liste);
+void    List_Insert(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_Replace(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+void    List_Read(List_T *liste, int index, void *data);
+void    List_Write(List_T *liste, int index, void *data);
+void    List_Put(List_T *liste, int index, void *data);
+void    List_Pop(List_T *liste);
+void   *List_Pointer(List_T *liste, int index);
+void   *List_Pointer_NoChange(List_T *liste, int index);
+void    List_Sort(List_T *liste, int (*fcmp)(const void *a, const void *b));
+int     List_Search(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_ISearch(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_ISearchSeq(List_T *liste, void * data, int (*fcmp)(const void *a, const void *b));
+int     List_ISearchSeqPartial(List_T *liste, void * data, int i_Start,
+			       int (*fcmp)(const void *a, const void *b)) ;
+int     List_Query(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_LQuery(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b), int first);
+void   *List_PQuery(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_Suppress(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b));
+int     List_PSuppress(List_T *liste, int index);
+void    List_Invert(List_T *a, List_T *b);
+void    List_Reset(List_T *liste);
+void    List_Action(List_T *liste, void (*action)(void *data, void *dummy));
+void    List_Action_Inverse(List_T *liste, void (*action)(void *data, void *dummy));
+void    List_Copy(List_T *a , List_T *b);
+
+#endif
+
diff --git a/DataStr/Makefile b/DataStr/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..8a3278506e5badf547e113744ddc6903e878c099
--- /dev/null
+++ b/DataStr/Makefile
@@ -0,0 +1,54 @@
+#
+# Makefile for "libSataStr.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g -Wall
+
+RANLIB   = /usr/bin/ranlib
+
+LIB      = ../lib/libDataStr.a
+INCLUDE  = -I../Common
+
+CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE)
+
+SRC = List.cpp \
+      Malloc.cpp \
+      Tree.cpp \
+      avl.cpp \
+      Tools.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ)
+	ar ruvs $(LIB) $(OBJ)
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	lint $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) Makefile.new
+
+
+# DO NOT DELETE THIS LINE
+List.o: List.cpp Malloc.h List.h ../Common/Message.h
+Malloc.o: Malloc.cpp Malloc.h ../Common/Message.h
+Tree.o: Tree.cpp Malloc.h Tree.h avl.h ../Common/Message.h
+avl.o: avl.cpp avl.h Malloc.h
+Tools.o: Tools.cpp Tools.h List.h Tree.h avl.h
diff --git a/DataStr/Malloc.cpp b/DataStr/Malloc.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b716656dc7dc02b184413da924c2686fe45277d
--- /dev/null
+++ b/DataStr/Malloc.cpp
@@ -0,0 +1,44 @@
+#define RCSID "$Id: Malloc.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $"
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+
+#include "Malloc.h"
+#include "Message.h"
+
+void *Malloc(size_t size)
+{
+  void *ptr;
+
+  if (!size) return(NULL);
+  ptr = malloc(size);
+  if (ptr == NULL)
+    Msg(ERROR, "Out of Memory in Malloc");
+  return(ptr);
+}
+
+void *Calloc(size_t num, size_t size)
+{
+  void *ptr;
+
+  if (!size) return(NULL);
+  ptr = calloc(num, size);
+  if (ptr == NULL)
+    Msg(ERROR, "Out of Memory in Calloc");
+  return(ptr);
+}
+
+void *Realloc(void *ptr, size_t size)
+{
+  if (!size) return(NULL);
+  ptr = realloc(ptr,size);
+  if (ptr == NULL)
+    Msg(ERROR, "Out of Memory in Realloc");
+  return(ptr);
+}
+
+void Free(void *ptr)
+{
+  if (ptr == NULL) return;
+  free(ptr);
+}
diff --git a/DataStr/Malloc.h b/DataStr/Malloc.h
new file mode 100644
index 0000000000000000000000000000000000000000..6f840b7bae8405083b63fe6881b72269ed6560dc
--- /dev/null
+++ b/DataStr/Malloc.h
@@ -0,0 +1,13 @@
+/* $Id: Malloc.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */
+#ifndef _UALLOC_H_
+#define _UALLOC_H_
+
+/* #define size_t unsigned   */
+/* #define NULL ((char *) 0) */
+
+void *Malloc(size_t size);
+void *Calloc(size_t num, size_t size);
+void *Realloc(void *ptr, size_t size);
+void  Free(void *ptr);
+
+#endif
diff --git a/DataStr/Tools.cpp b/DataStr/Tools.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6660beb36783494da46be7aee7b2701ac91ec784
--- /dev/null
+++ b/DataStr/Tools.cpp
@@ -0,0 +1,98 @@
+#define RCSID "$Id: Tools.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $"
+#include <stdlib.h>
+#include <math.h>
+#include "Tools.h"
+
+/* Comparison functions */
+
+int fcmp_int(const void *a, const void *b){
+  return(*(int*)a - *(int*)b );
+}
+
+int fcmp_absint(const void *a, const void *b){
+  return( abs(*(int*)a) - abs(*(int*)b) );
+}
+
+int fcmp_double(const void *a, const void *b){
+  double cmp ;
+  
+  cmp = *(double*)a - *(double*)b ;
+  if      (cmp > 1.e-16)  return  1 ;
+  else if (cmp < -1.e-16) return -1 ;
+  else                    return  0 ;
+}
+
+/* Tree ==> List transfer */
+
+List_T *pListeTransfert;
+
+void TransfereListe(void *a,void *b){
+  List_Add(pListeTransfert,a);
+}
+List_T *Tree2List(Tree_T *pTree){
+  int Nb;
+  Nb = Tree_Nbr(pTree) ; if (Nb == 0) Nb = 1 ;
+  pListeTransfert = List_Create(Nb,Nb,Tree_Size(pTree));
+  Tree_Action(pTree,TransfereListe);
+  return(pListeTransfert);
+}
+
+/* Algebraic utilities */
+
+Tree_T *pTreeTransfert;
+Tree_T *pTreeTransfert2;
+
+void DupliqueArbre(void *a,void *b){
+  Tree_Add(pTreeTransfert,a);
+}
+Tree_T *Tree_Duplique(Tree_T *pTree){
+  pTreeTransfert = Tree_Create(pTree->size,pTree->root->compar);
+  Tree_Action(pTree,DupliqueArbre);
+  return(pTreeTransfert);
+}
+
+void UnitArbre(void *a,void *b){
+  Tree_Replace(pTreeTransfert,a);
+}
+Tree_T *Tree_Union(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert = Tree_Duplique(pTreeA);
+  Tree_Action(pTreeB,UnitArbre);
+  return(pTreeTransfert);
+}
+void Tree_Unit(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert = pTreeA;
+  Tree_Action(pTreeB,UnitArbre);
+}
+
+
+void SoustraitArbre(void *a,void *b){
+  Tree_Suppress(pTreeTransfert,a);
+}
+Tree_T *Tree_Soustraction(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert = Tree_Duplique(pTreeA);
+  Tree_Action(pTreeB,SoustraitArbre);
+  return(pTreeTransfert);
+}
+void Tree_Soustrait(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert = pTreeA;
+  Tree_Action(pTreeB,SoustraitArbre);
+}
+
+
+void IntersecteArbre(void *a,void *b){
+  if (Tree_Query(pTreeTransfert,a)) Tree_Add(pTreeTransfert2,a);
+}
+Tree_T *Tree_Intersection(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert = Tree_Duplique(pTreeA);
+  pTreeTransfert2= Tree_Create(pTreeA->size,pTreeA->root->compar);
+  Tree_Action(pTreeB,IntersecteArbre);
+  Tree_Delete(pTreeTransfert);
+  return(pTreeTransfert2);
+}
+void Tree_Intersecte(Tree_T *pTreeA, Tree_T *pTreeB){
+  pTreeTransfert2 = pTreeA;
+  pTreeTransfert  = Tree_Create(pTreeA->size,pTreeA->root->compar);
+  Tree_Action(pTreeB,IntersecteArbre);
+  pTreeA = pTreeTransfert2;
+  Tree_Delete(pTreeA);
+}
diff --git a/DataStr/Tools.h b/DataStr/Tools.h
new file mode 100644
index 0000000000000000000000000000000000000000..0032ac90498c6da888534e58dc72c08528b68d78
--- /dev/null
+++ b/DataStr/Tools.h
@@ -0,0 +1,23 @@
+/* $Id: Tools.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */
+#ifndef _TOOLS_H_
+#define _TOOLS_H_
+
+#include "List.h"
+#include "Tree.h"
+
+int fcmp_int(const void *a, const void *b);
+int fcmp_absint(const void *a, const void *b);
+int fcmp_double(const void *a, const void *b);
+
+List_T *Tree2List(Tree_T *pTree) ;
+
+Tree_T *Tree_Duplique(Tree_T *pTree) ;
+Tree_T *Tree_Union       (Tree_T *pTreeA, Tree_T *pTreeB) ;
+Tree_T *Tree_Soustraction(Tree_T *pTreeA, Tree_T *pTreeB) ;
+Tree_T *Tree_Intersection(Tree_T *pTreeA, Tree_T *pTreeB) ;
+
+void Tree_Unit      (Tree_T *pTreeA, Tree_T *pTreeB) ;
+void Tree_Soustrait (Tree_T *pTreeA, Tree_T *pTreeB) ;
+void Tree_Intersecte(Tree_T *pTreeA, Tree_T *pTreeB) ;
+
+#endif
diff --git a/DataStr/Tree.cpp b/DataStr/Tree.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cb90a7c4ce5ce41138b2724fa5aa16d251f152e3
--- /dev/null
+++ b/DataStr/Tree.cpp
@@ -0,0 +1,177 @@
+#define RCSID "$Id: Tree.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "Malloc.h"
+#include "Tree.h"
+#include "Message.h"
+
+Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b))
+{
+  Tree_T *tree;
+
+  tree = (Tree_T *) Malloc(sizeof(Tree_T));
+
+  tree->size = size;
+  tree->root = avl_init_table(fcmp);
+
+  return(tree);
+}
+
+void Tree_Delete(Tree_T *tree)
+{
+  if(!tree) return;
+  avl_free_table(tree->root, Free, 0);
+  Free(tree);
+}
+
+void Tree_Add(Tree_T *tree, void *data)
+{
+  void *ptr;
+
+  if(!tree) 
+    Msg(ERROR, "Impossible to Add in Unallocated Tree");
+  ptr = Malloc(tree->size);
+  memcpy(ptr,data,tree->size);
+  avl_insert(tree->root, ptr, ptr);
+}
+
+void * Tree_AddP(Tree_T *tree, void *data)
+{
+  void *ptr;
+
+  if(!tree) 
+    Msg(ERROR, "Impossible to Add in Unallocated Tree");
+  ptr = Malloc(tree->size);
+  memcpy(ptr,data,tree->size);
+  avl_insert(tree->root, ptr, ptr);
+  return ptr ;
+}
+
+int Tree_Nbr(Tree_T *tree)
+{
+  if(!tree) return 0;
+  return(avl_count(tree->root));
+}
+
+void Tree_Insert(Tree_T *tree, void *data)
+{
+  if (Tree_Search(tree,data) == 0)
+    Tree_Add(tree,data);
+}
+
+int Tree_Replace(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) 
+    Msg(ERROR, "Impossible to Replace in Unallocated Tree");
+  state = avl_lookup(tree->root, data, &ptr);
+  if (state == 0) {
+    Tree_Add(tree,data);
+    return(0);
+  }
+  else {
+    memcpy(ptr,data,tree->size);
+    return (1);
+  }
+}
+
+int Tree_Search(Tree_T *tree, void *data)
+{
+  void *ptr;
+
+  if(!tree) return 0;
+  return (avl_lookup(tree->root, data, &ptr));
+}
+
+int Tree_Query(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) return 0;
+
+  state = avl_lookup(tree->root, data, &ptr);
+
+  if (state == 0) return(0);
+
+  memcpy(data,ptr,tree->size);
+
+  return (1);
+}
+
+void *Tree_PQuery(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) return 0;
+
+  state = avl_lookup(tree->root, data, &ptr);
+
+  if (state == 0) return(NULL);
+  return (ptr);
+}
+
+int Tree_Suppress(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) return 0;
+
+  ptr = data;
+  state = avl_delete(tree->root, &ptr, &ptr) ;
+  if (state == 0) return(0);
+
+  Free(ptr);
+  return(1);
+}
+
+int Tree_Left(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) return 0;
+
+  state = avl_extremum(tree->root, AVL_MOST_LEFT, &ptr);
+
+  if (state == 0) return (0);
+
+  memcpy(data,ptr,tree->size);
+
+  return (1);
+}
+
+int Tree_Right(Tree_T *tree, void *data)
+{
+  void *ptr;
+  int state;
+
+  if(!tree) return 0;
+
+  state = avl_extremum(tree->root, AVL_MOST_RIGHT, &ptr);
+
+  if (state == 0) return (0);
+
+  memcpy(data,ptr,tree->size);
+
+  return (1);
+}
+
+void Tree_Action(Tree_T *tree, void (*action) (void *data, void *dummy))
+{
+  if(!tree) return;
+
+  avl_foreach(tree->root, action, AVL_FORWARD);
+}
+
+int Tree_Size(Tree_T *tree) {
+  if(!tree) return 0;
+
+  return(tree->size);
+}
diff --git a/DataStr/Tree.h b/DataStr/Tree.h
new file mode 100644
index 0000000000000000000000000000000000000000..82c8656ab782607f9555cd6e7f5543f42f5278e3
--- /dev/null
+++ b/DataStr/Tree.h
@@ -0,0 +1,29 @@
+/* $Id: Tree.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */
+#ifndef _TREE_H_
+#define _TREE_H_
+
+#include "avl.h"
+
+typedef struct {
+  int size;
+  avl_tree *root;
+} Tree_T;
+
+Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b));
+void    Tree_Delete(Tree_T *Tree);
+void    Tree_Add(Tree_T *tree, void *data);
+void   *Tree_AddP(Tree_T *tree, void *data);
+int     Tree_Nbr(Tree_T *Tree);
+void    Tree_Insert(Tree_T *Tree, void *data);
+int     Tree_Replace(Tree_T *Tree, void *data);
+int     Tree_Search(Tree_T *Tree, void *data);
+int     Tree_Query(Tree_T *Tree, void *data);
+void   *Tree_PQuery(Tree_T *Tree, void *data);
+int     Tree_Suppress(Tree_T *Tree, void *data);
+int     Tree_Left(Tree_T *tree, void *data);
+int     Tree_Right(Tree_T *tree, void *data);
+void    Tree_Action(Tree_T *tree, void (*action) (void *data, void *dummy));
+int     Tree_Size(Tree_T *tree) ;
+
+#endif
+
diff --git a/DataStr/avl.cpp b/DataStr/avl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f67e788304ce4db3a3123f5535fcf247fcae6d1
--- /dev/null
+++ b/DataStr/avl.cpp
@@ -0,0 +1,443 @@
+#define RCSID "$Id: avl.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $"
+
+/*
+ * This is a modified version for Gmsh (for c++, 64-bit architectures, etc.)
+ */
+
+/*
+ * avl package
+ *
+ * Copyright (c) 1988-1993, The Regents of the University of California.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the University of California not
+ * be used in advertising or publicity pertaining to distribution of 
+ * the software without specific, written prior permission.  The University
+ * of California makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * THE UNIVERSITY OF CALIFORNIA DISCLAIMS ALL WARRANTIES WITH REGARD TO 
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
+ * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR
+ * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+
+#include "avl.h"
+#include "Malloc.h"
+
+#define ALLOC(type, number)  (type *) Malloc((unsigned) sizeof(type) * number)
+#define NIL(type)            (type *) 0
+#define FREE(item)           (void) Free(item)
+#define XRNMAX(a,b)          ((a) > (b) ? (a) : (b))
+#define HEIGHT(node)         (node == NIL(avl_node) ? -1 : (node)->height)
+#define BALANCE(node)        (HEIGHT((node)->right) - HEIGHT((node)->left))
+
+#define compute_height(node) {				\
+    int x=HEIGHT(node->left), y=HEIGHT(node->right);	\
+    (node)->height = XRNMAX(x,y) + 1;			\
+}
+
+#define COMPARE(key, nodekey, compare)	 		\
+    ((compare == avl_numcmp) ? 				\
+	(long int) key - (long int) nodekey : 			\
+	(*compare)(key, nodekey))
+
+static void avl_record_gen_forward(avl_node *node, avl_generator *gen);
+static void avl_record_gen_backward(avl_node *node, avl_generator *gen);
+static avl_node *find_rightmost(avl_node **node_p);
+static void do_rebalance(avl_node ***stack_nodep, int stack_n);
+static void rotate_left(avl_node **node_p);
+static void rotate_right(avl_node **node_p);
+static void avl_walk_forward(avl_node *node, void (*func)(void *key, void *value));
+static void avl_walk_backward(avl_node *node, void (*func)(void *key, void *value));
+static void free_entry(avl_node *node, void (*key_free)(void *key), 
+		       void (*value_free)(void *value));
+static avl_node *new_node(void *key, void *value);
+static int do_check_tree(avl_node *node, int (*compar)(const void *key1, const void *key2),
+			 int *error);
+
+
+avl_tree *avl_init_table(int (*compar)(const void *key1, const void *key2))
+{
+    avl_tree *tree;
+
+    tree = ALLOC(avl_tree, 1);
+    tree->root = NIL(avl_node);
+    tree->compar = compar;
+    tree->num_entries = 0;
+    return tree;
+}
+
+int avl_lookup(avl_tree *tree, void *key, void **value_p)
+{
+    register avl_node *node;
+    register int (*compare)(const void*, const void *) = tree->compar, diff;
+
+    node = tree->root;
+    while (node != NIL(avl_node)) {
+	diff = COMPARE(key, node->key, compare);
+	if (diff == 0) {
+	    /* got a match, give the user a 'value' only if non-null */
+	    if (value_p != NIL(void *)) *value_p = node->value;
+	    return 1;
+	}
+	node = (diff < 0) ? node->left : node->right;
+    }
+    return 0;
+}
+
+int avl_insert(avl_tree *tree, void *key, void *value)
+{
+    register avl_node **node_p, *node;
+    register int stack_n = 0;
+    register int (*compare)(const void*, const void *) = tree->compar;
+    avl_node **stack_nodep[32];
+    int diff, status;
+
+    node_p = &tree->root;
+
+    /* walk down the tree (saving the path); stop at insertion point */
+    status = 0;
+    while ((node = *node_p) != NIL(avl_node)) {
+	stack_nodep[stack_n++] = node_p;
+	diff = COMPARE(key, node->key, compare);
+	if (diff == 0) status = 1;
+	node_p = (diff < 0) ? &node->left : &node->right;
+    }
+
+    /* insert the item and re-balance the tree */
+    *node_p = new_node(key, value);
+    do_rebalance(stack_nodep, stack_n);
+    tree->num_entries++;
+    tree->modified = 1;
+    return status;
+}
+
+int avl_delete(avl_tree *tree, void **key_p, void **value_p)
+{
+    register avl_node **node_p, *node, *rightmost;
+    register int stack_n = 0;
+    void *key = *key_p;
+    int (*compare)(const void*, const void*) = tree->compar, diff;
+    avl_node **stack_nodep[32];
+    
+    node_p = &tree->root;
+
+    /* Walk down the tree saving the path; return if not found */
+    while ((node = *node_p) != NIL(avl_node)) {
+	diff = COMPARE(key, node->key, compare);
+	if (diff == 0) goto delete_item;
+	stack_nodep[stack_n++] = node_p;
+	node_p = (diff < 0) ? &node->left : &node->right;
+    }
+    return 0;		/* not found */
+
+    /* prepare to delete node and replace it with rightmost of left tree */
+  delete_item:
+    *key_p = node->key;
+    if (value_p != 0) *value_p = node->value;
+    if (node->left == NIL(avl_node)) {
+	*node_p = node->right;
+    } else {
+	rightmost = find_rightmost(&node->left);
+	rightmost->left = node->left;
+	rightmost->right = node->right;
+	rightmost->height = -2; 	/* mark bogus height for do_rebal */
+	*node_p = rightmost;
+	stack_nodep[stack_n++] = node_p;
+    }
+    FREE(node);
+
+    /* work our way back up, re-balancing the tree */
+    do_rebalance(stack_nodep, stack_n);
+    tree->num_entries--;
+    tree->modified = 1;
+    return 1;
+}
+
+static void avl_record_gen_forward(avl_node *node, avl_generator *gen)
+{
+    if (node != NIL(avl_node)) {
+	avl_record_gen_forward(node->left, gen);
+	gen->nodelist[gen->count++] = node;
+	avl_record_gen_forward(node->right, gen);
+    }
+}
+
+static void avl_record_gen_backward(avl_node *node, avl_generator *gen)
+{
+    if (node != NIL(avl_node)) {
+	avl_record_gen_backward(node->right, gen);
+	gen->nodelist[gen->count++] = node;
+	avl_record_gen_backward(node->left, gen);
+    }
+}
+
+avl_generator *avl_init_gen(avl_tree *tree, int dir)
+{
+    avl_generator *gen;
+
+    /* what a hack */
+    gen = ALLOC(avl_generator, 1);
+    gen->tree = tree;
+    gen->nodelist = ALLOC(avl_node *, avl_count(tree));
+    gen->count = 0;
+    if (dir == AVL_FORWARD) {
+	avl_record_gen_forward(tree->root, gen);
+    } else {
+	avl_record_gen_backward(tree->root, gen);
+    }
+    gen->count = 0;
+
+    /* catch any attempt to modify the tree while we generate */
+    tree->modified = 0;
+    return gen;
+}
+
+int avl_gen(avl_generator *gen, void **key_p, void **value_p)
+{
+    avl_node *node;
+
+    if (gen->count == gen->tree->num_entries) {
+	return 0;
+    } else {
+	node = gen->nodelist[gen->count++];
+	if (key_p != NIL(void *)) *key_p = node->key;
+	if (value_p != NIL(void *)) *value_p = node->value;
+	return 1;
+    }
+}
+
+void avl_free_gen(avl_generator *gen)
+{
+    FREE(gen->nodelist);
+    FREE(gen);
+}
+
+static avl_node *find_rightmost(avl_node **node_p)
+{
+    register avl_node *node;
+    register int stack_n = 0;
+    avl_node **stack_nodep[32];
+
+    node = *node_p;
+    while (node->right != NIL(avl_node)) {
+	stack_nodep[stack_n++] = node_p;
+	node_p = &node->right;
+	node = *node_p;
+    }
+    *node_p = node->left;
+
+    do_rebalance(stack_nodep, stack_n);
+    return node;
+}
+
+static void do_rebalance(avl_node ***stack_nodep, int stack_n)
+{
+    register avl_node **node_p, *node;
+    register int hl, hr;
+    int height;
+
+    /* work our way back up, re-balancing the tree */
+    while (--stack_n >= 0) {
+	node_p = stack_nodep[stack_n];
+	node = *node_p;
+	hl = HEIGHT(node->left);		/* watch for NIL */
+	hr = HEIGHT(node->right);		/* watch for NIL */
+	if ((hr - hl) < -1) {
+	    rotate_right(node_p);
+	} else if ((hr - hl) > 1) {
+	    rotate_left(node_p);
+	} else {
+	    height = XRNMAX(hl, hr) + 1;
+	    if (height == node->height) break;
+	    node->height = height;
+	}
+    }
+}
+
+static void rotate_left(avl_node **node_p)
+{
+    register avl_node *old_root = *node_p, *new_root, *new_right;
+
+    if (BALANCE(old_root->right) >= 0) {
+	*node_p = new_root = old_root->right;
+	old_root->right = new_root->left;
+	new_root->left = old_root;
+    } else {
+	new_right = old_root->right;
+	*node_p = new_root = new_right->left;
+	old_root->right = new_root->left;
+	new_right->left = new_root->right;
+	new_root->right = new_right;
+	new_root->left = old_root;
+	compute_height(new_right);
+    }
+    compute_height(old_root);
+    compute_height(new_root);
+}
+
+static void rotate_right(avl_node **node_p)
+{
+    register avl_node *old_root = *node_p, *new_root, *new_left;
+
+    if (BALANCE(old_root->left) <= 0) {
+	*node_p = new_root = old_root->left;
+	old_root->left = new_root->right;
+	new_root->right = old_root;
+    } else {
+	new_left = old_root->left;
+	*node_p = new_root = new_left->right;
+	old_root->left = new_root->right;
+	new_left->right = new_root->left;
+	new_root->left = new_left;
+	new_root->right = old_root;
+	compute_height(new_left);
+    }
+    compute_height(old_root);
+    compute_height(new_root);
+}
+
+static void avl_walk_forward(avl_node *node, void (*func)(void *key, void *value))
+{
+    if (node != NIL(avl_node)) {
+	avl_walk_forward(node->left, func);
+	(*func)(node->key, node->value);
+	avl_walk_forward(node->right, func);
+    }
+}
+
+static void avl_walk_backward(avl_node *node, void (*func)(void *key, void *value))
+{
+    if (node != NIL(avl_node)) {
+	avl_walk_backward(node->right, func);
+	(*func)(node->key, node->value);
+	avl_walk_backward(node->left, func);
+    }
+}
+
+void avl_foreach(avl_tree *tree, void (*func)(void *key, void *value), int direction)
+{
+    if (direction == AVL_FORWARD) {
+	avl_walk_forward(tree->root, func);
+    } else {
+	avl_walk_backward(tree->root, func);
+    }
+}
+
+int avl_extremum(avl_tree *tree, int side, void **value_p)
+{
+    register avl_node *node;
+
+    node = tree->root;
+    if (node == NIL(avl_node)) return 0;
+
+    if (side == AVL_MOST_LEFT) 
+      while (node->left != NIL(avl_node)) node = node->left;
+    else
+      while (node->right != NIL(avl_node)) node = node->right;
+    
+    if (value_p != NIL(void *)) {
+      *value_p = node->value;
+      return 1;
+    }
+    return 0;
+}
+
+static void free_entry(avl_node *node, void (*key_free)(void *key), void (*value_free)(void *value))
+{
+    if (node != NIL(avl_node)) {
+	free_entry(node->left, key_free, value_free);
+	free_entry(node->right, key_free, value_free);
+	if (key_free != 0) (*key_free)(node->key);
+	if (value_free != 0) (*value_free)(node->value);
+	FREE(node);
+    }
+}
+    
+void avl_free_table(avl_tree *tree, void (*key_free)(void *key), void (*value_free)(void *value))
+{
+    free_entry(tree->root, key_free, value_free);
+    FREE(tree);
+}
+
+int avl_count(avl_tree *tree)
+{
+    return tree->num_entries;
+}
+
+static avl_node *new_node(void *key, void *value)
+{
+    register avl_node *newn;
+
+    newn = ALLOC(avl_node, 1);
+    newn->key = key;
+    newn->value = value;
+    newn->height = 0;
+    newn->left = newn->right = NIL(avl_node);
+    return newn;
+}
+int avl_numcmp(const void *x, const void*y)
+{
+    return (long int) x - (long int) y;
+}
+
+int avl_check_tree(avl_tree *tree)
+{
+    int error = 0;
+    (void) do_check_tree(tree->root, tree->compar, &error);
+    return error;
+}
+
+static int do_check_tree(avl_node *node, 
+			 int (*compar)(const void *key1, const void *key2), int *error)
+{
+    int l_height, r_height, comp_height, bal;
+    
+    if (node == NIL(avl_node)) {
+	return -1;
+    }
+
+    r_height = do_check_tree(node->right, compar, error);
+    l_height = do_check_tree(node->left, compar, error);
+
+    comp_height = XRNMAX(l_height, r_height) + 1;
+    bal = r_height - l_height;
+    
+    if (comp_height != node->height) {
+	(void) printf("Bad height for %p: computed=%d stored=%d\n",
+	    node, comp_height, node->height);
+	++*error;
+    }
+
+    if (bal > 1 || bal < -1) {
+	(void) printf("Out of balance at node %p, balance = %d\n", 
+	    node, bal);
+	++*error;
+    }
+
+    if (node->left != NIL(avl_node) && 
+		    (*compar)(node->left->key, node->key) > 0) {
+	(void) printf("Bad ordering between %p and %p", 
+	    node, node->left);
+	++*error;
+    }
+    
+    if (node->right != NIL(avl_node) && 
+		    (*compar)(node->key, node->right->key) > 0) {
+	(void) printf("Bad ordering between %p and %p", 
+	    node, node->right);
+	++*error;
+    }
+
+    return comp_height;
+}
diff --git a/DataStr/avl.h b/DataStr/avl.h
new file mode 100644
index 0000000000000000000000000000000000000000..a9acfe257c9b906f806ce31e798dc9eb0735f2ae
--- /dev/null
+++ b/DataStr/avl.h
@@ -0,0 +1,85 @@
+/* $Id: avl.h,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $ */
+#ifndef _AVL_H_
+#define _AVL_H_
+
+/*
+ * avl package
+ *
+ * Copyright (c) 1988-1993, The Regents of the University of California.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the University of California not
+ * be used in advertising or publicity pertaining to distribution of 
+ * the software without specific, written prior permission.  The University
+ * of California makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * THE UNIVERSITY OF CALIFORNIA DISCLAIMS ALL WARRANTIES WITH REGARD TO 
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
+ * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR
+ * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+typedef struct avl_node_struct avl_node;
+struct avl_node_struct {
+  avl_node *left, *right;
+  void *key;
+  void *value;
+  int height;
+};
+
+
+typedef struct avl_tree_struct avl_tree;
+struct avl_tree_struct {
+  avl_node *root;
+  int (*compar)(const void *key1, const void *key2);
+  int num_entries;
+  int modified;
+};
+
+
+typedef struct avl_generator_struct avl_generator;
+struct avl_generator_struct {
+  avl_tree *tree;
+  avl_node **nodelist;
+  int count;
+};
+
+
+#define AVL_FORWARD 	0
+#define AVL_BACKWARD 	1
+
+#define AVL_MOST_LEFT   0
+#define AVL_MOST_RIGHT  1
+
+#define avl_is_member(tree, key)   avl_lookup(tree, key, (void **) 0)
+
+#define avl_foreach_item(table, gen, dir, key_p, value_p)		\
+    for(gen = avl_init_gen(table, dir);					\
+	    avl_gen(gen, key_p, value_p) || (avl_free_gen(gen),0);)
+
+
+avl_tree *avl_init_table(int (*compar)(const void *key1, const void *key2));
+int avl_lookup(avl_tree *tree, void *key, void **value_p);
+int avl_insert(avl_tree *tree, void *key, void *value);
+int avl_delete(avl_tree *tree, void **key_p, void **value_p);
+void avl_foreach(avl_tree *tree, void (*func)(void *key, void *value), int direction);
+void avl_free_table(avl_tree *tree, void (*key_free)(void *key), void (*value_free)(void *value));
+int avl_count(avl_tree *tree);
+int avl_check_tree(avl_tree *tree);
+int avl_extremum(avl_tree *tree, int side, void **value_p);
+
+avl_generator *avl_init_gen(avl_tree *tree, int dir);
+int avl_gen(avl_generator *gen, void **key_p, void **value_p);
+void avl_free_gen(avl_generator *gen);
+
+int avl_numcmp(const void *x, const void*y);
+
+#endif
diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..265f9c33163edea603bcd36b5639c52a947c4881
--- /dev/null
+++ b/Geo/CAD.cpp
@@ -0,0 +1,1642 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "DataBase.h"
+#include "Interpolation.h"
+#include "Numeric.h"
+#include "Const.h"
+#include "Create.h"
+#include "CAD.h"
+                                    
+extern Mesh    *THEM;
+extern int      CurrentNodeNumber;
+extern double   LC ;
+
+static int      MAXREG,MAXPOINT;
+static List_T  *ListOfTransformedPoints;
+
+int compare2Lists (List_T *List1, List_T *List2,
+                   int (*fcmp)(const void *a, const void *b)){
+  int i,found;
+
+  if(List_Nbr(List1) != List_Nbr(List2))return  List_Nbr(List1) - List_Nbr(List2);
+  
+  List_T *List1Prime = List_Create(List_Nbr(List1),1,List1->size);
+  List_T *List2Prime = List_Create(List_Nbr(List2),1,List2->size);
+  List_Copy(List1,List1Prime);
+  List_Copy(List2,List2Prime);
+  List_Sort(List1Prime,fcmp);
+  List_Sort(List2Prime,fcmp);
+  
+  for(i=0;i<List_Nbr(List1Prime);i++){
+    found = fcmp(List_Pointer(List1Prime,i),
+                 List_Pointer(List2Prime,i));
+    if(found != 0){
+      List_Delete(List1Prime);
+      List_Delete(List2Prime);
+      return found;
+    }
+  }
+  List_Delete(List1Prime);
+  List_Delete(List2Prime);
+  return 0;
+}
+
+void MaxNumCurve(void *a, void *b){
+  Curve *c = *(Curve**)a;
+  MAXREG = (c->Num>MAXREG)?c->Num:MAXREG;
+}
+
+void MaxNumSurface(void *a, void *b){
+  Surface *s = *(Surface**)a;
+  MAXREG = (s->Num>MAXREG)?s->Num:MAXREG;
+}
+
+void MaxNumEdgeLoop(void *a, void *b){
+  EdgeLoop *s = *(EdgeLoop**)a;
+  MAXREG = (s->Num>MAXREG)?s->Num:MAXREG;
+}
+
+void MaxNumSurfaceLoop(void *a, void *b){
+  SurfaceLoop *s = *(SurfaceLoop**)a;
+  MAXREG = (s->Num>MAXREG)?s->Num:MAXREG;
+}
+
+void MaxNumPoint(void *a, void *b){
+  Vertex *v = *(Vertex**)a;
+  MAXPOINT = (v->Num>MAXPOINT)?v->Num:MAXPOINT;
+}
+
+void dist_ddg(double x1,double y1,double z1,
+              double x2,double y2,double z2,
+              double x3,double y3,double z3,
+              double x4,double y4,double z4,
+              double *x,double *y,double *z){
+
+  double v[3],u[3],d;
+
+  u[0] = x1-x3;
+  u[1] = y1-y3;
+  u[2] = z1-z3;
+
+  v[0] = x4-x3;
+  v[1] = y4-y3;
+  v[2] = z4-z3;
+
+  norme(v);
+  prosca(u,v,&d);
+
+  *x = d* x4 + x3 * (1.-d);
+  *y = d* y4 + y3 * (1.-d);
+  *z = d* z4 + z3 * (1.-d);
+}
+
+
+int NEWREG(void){
+  MAXREG = 0;
+  PhysicalGroup *p;
+  Tree_Action(THEM->Curves,MaxNumCurve);
+  Tree_Action(THEM->Surfaces,MaxNumSurface);
+  Tree_Action(THEM->EdgeLoops,MaxNumEdgeLoop);
+  Tree_Action(THEM->SurfaceLoops,MaxNumSurfaceLoop);
+  for(int i=0;i<List_Nbr(THEM->PhysicalGroups);i++){
+    List_Read( THEM->PhysicalGroups , i, &p);
+    MAXREG = IMAX(MAXREG,p->Num);
+  }
+  return MAXREG+1;
+}
+
+int NEWPOINT(void){
+  MAXPOINT = 0;
+  Tree_Action(THEM->Points,MaxNumPoint);
+  return MAXPOINT+1;
+}
+
+Vertex *FindVertex(int inum, Mesh *M){
+  Vertex  C,*pc;
+  pc = &C;
+  pc->Num = inum;
+  if(Tree_Query(M->Points,&pc)){
+    return pc;
+  }
+  return NULL;
+}
+
+
+
+Curve *FindCurve(int inum, Mesh *M){
+  Curve C,*pc;
+  pc = &C;
+  pc->Num = inum;
+  if(Tree_Query(M->Curves,&pc)){
+    return pc;
+  }
+  return NULL;
+}
+
+Surface *FindSurface(int inum, Mesh *M){
+  Surface S,*ps;
+  ps = &S;
+  ps->Num = inum;
+  if(Tree_Query(M->Surfaces,&ps)){
+    return ps;
+  }
+  return NULL;
+}
+
+Volume *FindVolume(int inum, Mesh *M){
+  Volume V,*pv;
+  pv = &V;
+  pv->Num = inum;
+  if(Tree_Query(M->Volumes,&pv)){
+    return pv;
+  }
+  return NULL;
+}
+
+EdgeLoop *FindEdgeLoop(int inum, Mesh *M){
+  EdgeLoop S,*ps;
+  ps = &S;
+  ps->Num = inum;
+  if(Tree_Query(M->EdgeLoops,&ps)){
+    return ps;
+  }
+  return NULL;
+}
+
+SurfaceLoop *FindSurfaceLoop(int inum, Mesh *M){
+  SurfaceLoop S,*ps;
+  ps = &S;
+  ps->Num = inum;
+  if(Tree_Query(M->SurfaceLoops,&ps)){
+    return ps;
+  }
+  return NULL;
+}
+
+/*
+  S = (sx(u,v),sy(u,v),sz(u,v))
+  C = (cx(w),cy(w),cz(w))
+
+  sx - cx = 0
+  sy - cy = 0
+  sz - cz = 0
+  
+  3eqs 3incs
+*/
+
+static Curve *CURVE, *CURVE_2;
+static Surface *SURFACE;
+static Vertex *VERTEX;
+extern double min1d ( double (*funct)(double), double *xmin);
+extern void newt(float x[], int n, int *check,
+                 void (*vecfunc)(int, float [], float []));
+
+static void intersectCS (int N, float x[], float res[]){
+  //x[1] = u x[2] = v x[3] = w
+  Vertex s,c;
+  s = InterpolateSurface(SURFACE,x[1],x[2],0,0);
+  c = InterpolateCurve (CURVE,x[3],0);
+  res[1] = s.Pos.X - c.Pos.X;
+  res[2] = s.Pos.Y - c.Pos.Y;
+  res[3] = s.Pos.Z - c.Pos.Z;
+}
+
+static void intersectCC (int N, float x[], float res[]){
+  //x[1] = u x[2] = v
+  Vertex c2,c;
+  c2 = InterpolateCurve(CURVE_2,x[2],0);
+  c = InterpolateCurve (CURVE,x[1],0);
+  res[1] = c2.Pos.X - c.Pos.X;
+  res[2] = c2.Pos.Y - c.Pos.Y;
+}
+
+static void projectPS (int N, float x[], float res[]){
+  //x[1] = u x[2] = v
+  Vertex du,dv,c;
+  c  = InterpolateSurface(SURFACE,x[1],x[2],0,0);
+  du = InterpolateSurface(SURFACE,x[1],x[2],1,1);
+  dv = InterpolateSurface(SURFACE,x[1],x[2],1,2);
+  res[1] =
+    (c.Pos.X - VERTEX->Pos.X)*du.Pos.X +
+    (c.Pos.Y - VERTEX->Pos.Y)*du.Pos.Y +
+    (c.Pos.Z - VERTEX->Pos.Z)*du.Pos.Z;
+  res[2] = 
+    (c.Pos.X - VERTEX->Pos.X)*dv.Pos.X +
+    (c.Pos.Y - VERTEX->Pos.Y)*dv.Pos.Y +
+    (c.Pos.Z - VERTEX->Pos.Z)*dv.Pos.Z;
+}
+
+static double projectPC (double u){
+  //x[1] = u x[2] = v
+  if(u<CURVE->ubeg)u = CURVE->ubeg;
+  if(u<CURVE->ubeg)u = CURVE->ubeg;
+  Vertex c;
+  c = InterpolateCurve(CURVE,u,0);
+  return sqrt(  DSQR(c.Pos.X -VERTEX->Pos.X)+
+                DSQR(c.Pos.Y -VERTEX->Pos.Y)+
+                DSQR(c.Pos.Z -VERTEX->Pos.Z));
+}
+
+static int UFIXED=0,VFIXED=0;
+static double FIX;
+static double projectPCS (double u){
+  //x[1] = u x[2] = v
+  double tmin,tmax;
+  if(UFIXED){
+    tmin = SURFACE->kv[0];
+    tmax = SURFACE->kv[SURFACE->Nv+SURFACE->OrderV];
+  }
+  else{
+    tmin = SURFACE->ku[0];
+    tmax = SURFACE->ku[SURFACE->Nu+SURFACE->OrderU];
+  }
+  
+  if(u<tmin)u = tmin;
+  if(u>tmax)u = tmax;
+  Vertex c;
+  if(UFIXED)
+    c = InterpolateSurface(SURFACE,FIX,u,0,0);
+  else
+    c = InterpolateSurface(SURFACE,u,FIX,0,0);
+  return sqrt(DSQR(c.Pos.X -VERTEX->Pos.X)+
+              DSQR(c.Pos.Y -VERTEX->Pos.Y)+
+              DSQR(c.Pos.Z -VERTEX->Pos.Z));
+}
+
+bool ProjectPointOnCurve (Curve *c, Vertex *v, Vertex *RES, Vertex *DER){
+  double x,xmin;
+  int check;
+  CURVE = c;
+  VERTEX = v;
+  x = min1d ( projectPC, &xmin);
+  *RES = InterpolateCurve(CURVE,xmin,0);
+  *DER = InterpolateCurve(CURVE,xmin,1);
+  if(xmin > c->uend){
+    *RES = InterpolateCurve(CURVE,c->uend,0);
+    *DER = InterpolateCurve(CURVE,c->uend,1);
+  }
+  else if(xmin < c->ubeg){
+    *RES = InterpolateCurve(CURVE,c->ubeg,0);
+    *DER = InterpolateCurve(CURVE,c->ubeg,1);
+  }
+  if(!check)return false;
+  return true;
+}
+
+bool search_in_boundary ( Surface *s, Vertex *p, double t, int Fixu, 
+                          double *uu, double *vv){
+  double l,umin,vmin,lmin = 1.e24;
+  int i,N;
+  Vertex vr;
+  double tmin, tmax,u,v;
+  
+  if(Fixu){
+    tmin = s->kv[0];
+    tmax = s->kv[s->Nv+s->OrderV];
+    N = 3*s->Nu;
+  }
+  else{
+    tmin = s->ku[0];
+    tmax = s->ku[s->Nu+s->OrderU];
+    N = 3*s->Nv;
+  }
+  for(i=0;i<N;i++){
+    if(Fixu){
+      u = t;
+      v = tmin + (tmax-tmin)*(double)(i)/(double)(N-1);
+    }
+    else {
+      v = t;
+      u = tmin + (tmax-tmin)*(double)(i)/(double)(N-1);
+    }
+    vr = InterpolateSurface(SURFACE,u,v,0,0);
+    l =  sqrt(DSQR(vr.Pos.X - p->Pos.X) +  
+              DSQR(vr.Pos.Y - p->Pos.Y) +
+              DSQR(vr.Pos.Z - p->Pos.Z));
+    if(l<lmin){
+      lmin = l;
+      umin = u;
+      vmin = v;
+    }
+  }
+
+  FIX = t;
+  UFIXED = Fixu;
+  VFIXED = !Fixu;
+  double xm,xq;
+  if(Fixu)xm = vmin;
+  else xm = umin;
+  if(lmin > 1.e-3)xq = min1d ( projectPCS, &xm);
+  if(Fixu){
+    *uu = t;
+    *vv = xm;
+  }
+  else{
+    *vv = t;
+    *uu = xm;
+  }
+  vr = InterpolateSurface(SURFACE,*uu,*vv,0,0);
+  l =  sqrt(DSQR(vr.Pos.X - p->Pos.X) +
+            DSQR(vr.Pos.Y - p->Pos.Y) +
+            DSQR(vr.Pos.Z - p->Pos.Z));
+  if(l<1.e-3)return true;
+  return false;
+}
+
+bool try_a_value(Surface *s, Vertex *p, double u, double v,double *uu, double *vv){
+  Vertex vr = InterpolateSurface(s,u,v,0,0);
+  double l =  sqrt(DSQR(vr.Pos.X - p->Pos.X) +  
+                   DSQR(vr.Pos.Y - p->Pos.Y) + 
+                   DSQR(vr.Pos.Z - p->Pos.Z));
+  *uu = u;*vv=v;
+  if(l<1.e-3)return true;
+  return false;
+}
+
+bool ProjectPointOnSurface (Surface *s, Vertex &p){
+  float x[3] = {0.5,0.5,0.5};
+  Vertex vv;
+  int check;
+  SURFACE = s;
+  VERTEX = &p;
+  double UMIN = 0.;
+  double UMAX = 1.;
+  double VMIN = 0.;
+  double VMAX = 1.;
+  while(1){
+    newt(x,2,&check,projectPS);
+    vv = InterpolateSurface(s,x[1],x[2],0,0);
+    if(x[1] >= UMIN && x[1] <= UMAX && x[2] >=VMIN && x[2] <= VMAX)break;
+    x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.);
+    x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.);
+  }
+  p.Pos.X = vv.Pos.X;
+  p.Pos.Y = vv.Pos.Y;
+  p.Pos.Z = vv.Pos.Z;
+  if(!check){
+    return false;
+  }
+  return true;
+}
+
+bool ProjectPointOnSurface (Surface *s, Vertex *p,double *u, double *v){
+  static float x[3];
+  int check;
+  static int deb = 1;
+  double VMIN,VMAX,UMIN,UMAX,l, lmin;
+  Vertex vv;
+
+  SURFACE = s;
+  VERTEX = p;
+  lmin = 1.e24;
+  UMAX = s->ku[s->Nu + s->OrderU];
+  UMIN = s->ku[0];
+  VMAX = s->kv[s->Nv + s->OrderV];
+  VMIN = s->kv[0];
+  if(deb){
+    x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.);
+    x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.);
+    deb = 0;
+  }
+
+  if(p->Num == 160){
+    lmin += 1.e90;
+    if(p->Num == 133)UMAX = s->ku[s->Nu + s->OrderU];
+  }
+  
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0]+VERTEX->u,
+                 SURFACE->kv[0],u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0]+VERTEX->u,
+                 SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU]-VERTEX->u,
+                 SURFACE->kv[0],u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU]-VERTEX->u,
+                 SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0],SURFACE->kv[0]+VERTEX->u,u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[0],
+                 SURFACE->kv[SURFACE->Nv+SURFACE->OrderV]-VERTEX->u,u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU],
+                 SURFACE->kv[0]+VERTEX->u,u,v))
+    return true;
+  if(try_a_value(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU],
+                 SURFACE->kv[SURFACE->Nv+SURFACE->OrderV]-VERTEX->u,u,v))
+    return true;
+ 
+  
+  if(search_in_boundary(SURFACE,VERTEX,SURFACE->kv[0],0,u,v))
+    return true;
+  if(search_in_boundary(SURFACE,VERTEX,SURFACE->kv[SURFACE->Nv+SURFACE->OrderV],0,u,v))
+    return true;
+  if(search_in_boundary(SURFACE,VERTEX,SURFACE->ku[0],1,u,v))
+    return true;
+  if(search_in_boundary(SURFACE,VERTEX,SURFACE->ku[SURFACE->Nu+SURFACE->OrderU],1,u,v))
+    return true;
+  
+  while(1){
+    newt(x,2,&check,projectPS);
+    vv = InterpolateSurface(s,x[1],x[2],0,0);
+    l =  sqrt(DSQR(vv.Pos.X - p->Pos.X) +
+              DSQR(vv.Pos.Y - p->Pos.Y) +
+              DSQR(vv.Pos.Z - p->Pos.Z));
+    if(l < 1.e-1)break;
+    else {
+      x[1] = UMIN + (UMAX-UMIN)*((rand() % 10000)/10000.);
+      x[2] = VMIN + (VMAX-VMIN)*((rand() % 10000)/10000.);
+    }
+  }
+  *u = x[1];
+  *v = x[2];
+  
+  if(!check){
+    return false;
+  }
+  return true;
+}
+
+bool IntersectCurveSurface (Curve *c, Surface *s){
+  float x[4];
+  int check;
+  SURFACE = s;
+  CURVE = c;
+  newt(x,3,&check,intersectCS);
+  if(!check)return false;
+  return true;
+}
+
+void CopyVertex (Vertex *v, Vertex *vv){
+  vv->lc = v->lc;
+  vv->u = v->u;
+  vv->Pos.X = v->Pos.X;
+  vv->Pos.Y = v->Pos.Y;
+  vv->Pos.Z = v->Pos.Z;
+  vv->Freeze.X = v->Freeze.X;
+  vv->Freeze.Y = v->Freeze.Y;
+  vv->Freeze.Z = v->Freeze.Z;
+}
+
+Vertex *DuplicateVertex (Vertex *v){
+  Vertex *pv;
+  pv = Create_Vertex(MAXPOINT++,0,0,0,0,0);
+  
+  CopyVertex (v,pv);
+  CurrentNodeNumber = (CurrentNodeNumber>pv->Num)?CurrentNodeNumber:pv->Num;
+  Tree_Insert(THEM->Points,&pv);
+  return pv;
+}
+
+void CopyCurve (Curve *c, Curve *cc){
+  int i,j;
+  cc->Typ = c->Typ;
+  cc->Method = c->Method;
+  for(i=0;i<4;i++)cc->ipar[i] = c->ipar[i];
+  for(i=0;i<4;i++)cc->dpar[i] = c->dpar[i];
+  cc->l = c->l;
+  for(i=0;i<4;i++)for(j=0;j<4;j++)cc->mat[i][j] = c->mat[i][j];
+  cc->beg = c->beg;
+  cc->end = c->end;
+  cc->ubeg = c->ubeg;
+  cc->uend = c->uend;
+  cc->Control_Points = List_Create(List_Nbr(c->Control_Points),1,sizeof(Vertex*));
+  List_Copy(c->Control_Points,cc->Control_Points);
+  End_Curve(cc);
+  Tree_Insert(THEM->Curves,&cc);
+}
+
+Curve *DuplicateCurve (Curve *c){
+  Curve *pc;
+  Vertex *v,*newv;
+  pc = Create_Curve(MAXREG++,0,1,NULL,NULL,-1,-1,0.,1.);
+  CopyCurve(c,pc);
+  for(int i=0;i<List_Nbr(c->Control_Points);i++){
+    List_Read(pc->Control_Points,i,&v);
+    newv = DuplicateVertex(v);
+    List_Write(pc->Control_Points,i,&newv);
+  }
+  pc->beg = DuplicateVertex(c->beg);
+  pc->end = DuplicateVertex(c->end);
+  CreateReversedCurve (THEM,pc);
+  
+  return pc;
+}
+
+void CopySurface (Surface *s, Surface *ss){
+  int i,j;
+  ss->Typ = s->Typ;
+  ss->Mat = s->Mat;
+  ss->Method = s->Method;
+  ss->Recombine = s->Recombine;
+  ss->RecombineAngle = s->RecombineAngle;
+  for(i=0;i<4;i++)ss->ipar[i] = s->ipar[i];
+  ss->Nu = s->Nu;
+  ss->Nv = s->Nv;
+  ss->a = s->a;ss->b = s->b;ss->c = s->c; ss->d = s->d;
+  for(i=0;i<3;i++)for(j=0;j<3;j++)ss->plan[i][j] = s->plan[i][j];
+  for(i=0;i<3;i++)for(j=0;j<3;j++)ss->invplan[i][j] = s->invplan[i][j];
+  ss->s.Generatrices = List_Create(List_Nbr(s->s.Generatrices),1,sizeof(Curve*));
+  List_Copy(s->s.Generatrices,ss->s.Generatrices);
+  if( s->Control_Points ){
+    ss->Control_Points = List_Create(List_Nbr(s->Control_Points),1,sizeof(Vertex*));
+    List_Copy(s->Control_Points,ss->Control_Points);
+  }
+  End_Surface(ss);
+  Tree_Insert(THEM->Surfaces,&ss);
+}
+
+Surface *DuplicateSurface (Surface *s, int addthesurf){
+  Surface *ps;
+  Curve *c,*newc;
+  Vertex *v,*newv;
+  ps = Create_Surface(addthesurf?MAXREG++:-MAXREG,0,0);
+  CopySurface(s,ps);
+  for(int i=0;i<List_Nbr(ps->s.Generatrices);i++){
+    List_Read(ps->s.Generatrices,i,&c);
+    newc = DuplicateCurve(c);
+    List_Write(ps->s.Generatrices,i,&newc);
+  }
+  
+  for(int i=0;i<List_Nbr(ps->Control_Points);i++){
+    List_Read(ps->Control_Points,i,&v);
+    newv = DuplicateVertex(v);
+    List_Write(ps->Control_Points,i,&newv);
+  }
+  return ps;
+}
+
+static void vecmat4x4(double mat[4][4],double vec[4], double res[4]){
+  int i,j;
+  for(i=0;i<4;i++){
+    res[i] = 0.0;
+    for(j=0;j<4;j++){
+      res[i] += mat[i][j] * vec[j];
+    }
+  }
+}
+
+void ApplyTransformationToPoint ( double matrix[4][4], Vertex *v ){
+  double pos[4],vec[4];
+
+  if(!ListOfTransformedPoints)ListOfTransformedPoints = List_Create(2,2,sizeof(int));
+  
+  if(!List_Search(ListOfTransformedPoints,&v->Num,fcmp_absint)){
+    List_Add(ListOfTransformedPoints,&v->Num);
+  }
+  else
+    return;
+  
+  vec[0] = v->Pos.X;
+  vec[1] = v->Pos.Y;
+  vec[2] = v->Pos.Z;
+  vec[3] = v->w;
+  vecmat4x4(matrix,vec,pos);
+  v->Pos.X = pos[0];
+  v->Pos.Y = pos[1];
+  v->Pos.Z = pos[2];
+  v->w = pos[3];
+}
+
+/* Linear Applications */
+
+void SetTranslationMatrix (double matrix[4][4],double T[3]){
+  for(int i=0;i<4;i++){
+    for(int j=0;j<4;j++){
+      matrix[i][j] = (i==j)? 1.0:0.0;
+    }
+  }
+  for(int i=0;i<3;i++)matrix[i][3] = T[i];
+}
+
+void SetSymmetryMatrix (double matrix[4][4],double A, double B, double C, double D){
+  double F = -2.0 / (A*A+B*B+C*C);
+  matrix[0][0] = 1. + A*A*F;
+  matrix[0][1] =      A*B*F;
+  matrix[0][2] =      A*C*F;
+  matrix[0][3] =      A*D*F;
+  matrix[1][0] =      A*B*F;
+  matrix[1][1] = 1. + B*B*F;
+  matrix[1][2] =      B*C*F;
+  matrix[1][3] =      B*D*F;
+  matrix[2][0] =      A*C*F;
+  matrix[2][1] =      B*C*F;
+  matrix[2][2] = 1. + C*C*F;
+  matrix[2][3] =      C*D*F;
+  matrix[3][0] =      B*C*F;
+  matrix[3][1] =      0.0;
+  matrix[3][2] =      0.0;
+  matrix[3][3] =      1.0;
+}
+
+void SetDilatationMatrix (double matrix[4][4],double T[3],double A){
+  matrix[0][0] = A;
+  matrix[0][1] = 0.0;
+  matrix[0][2] = 0.0;
+  matrix[0][3] = T[0]*(1.0-A);
+  matrix[1][0] = 0.0;
+  matrix[1][1] = A;
+  matrix[1][2] = 0.0;
+  matrix[1][3] = T[1]*(1.0-A);
+  matrix[2][0] = 0.0;
+  matrix[2][1] = 0.0;
+  matrix[2][2] = A;
+  matrix[2][3] = T[2]*(1.0-A);
+  matrix[3][0] = 0.0;
+  matrix[3][1] = 0.0;
+  matrix[3][2] = 0.0;
+  matrix[3][3] = 1.0;
+}
+
+void GramSchmidt (double v1[3], double v2[3], double v3[3]){
+  double tmp[3];
+  norme(v1);
+  prodve(v3,v1,tmp);
+  norme(tmp);
+  v2[0] = tmp[0];v2[1] = tmp[1];v2[2] = tmp[2];
+  prodve(v1,v2,v3);
+  norme(v3);
+}
+
+void SetRotationMatrix( double matrix[4][4],double Axe[3], double alpha){
+  double t1[3],t2[3];
+  if(Axe[0] != 0.0){
+    t1[0] = 0.0;
+    t1[1] = 1.0;
+    t1[2] = 0.0;
+    t2[0] = 0.0;
+    t2[1] = 0.0;
+    t2[2] = 1.0;
+  }
+  else if(Axe[1] != 0.0){
+    t1[0] = 1.0;
+    t1[1] = 0.0;
+    t1[2] = 0.0;
+    t2[0] = 0.0;
+    t2[1] = 0.0;
+    t2[2] = 1.0;
+  }
+  else {
+    t1[0] = 1.0;
+    t1[1] = 0.0;
+    t1[2] = 0.0;
+    t2[0] = 0.0;
+    t2[1] = 1.0;
+    t2[2] = 0.0;
+  }
+  GramSchmidt(Axe,t1,t2);
+  double rot[3][3],plan[3][3],invplan[3][3];
+  plan[0][0] = Axe[0]; plan[0][1] = Axe[1]; plan[0][2] = Axe[2];
+  plan[1][0] = t1[0] ; plan[1][1] = t1[1];  plan[1][2] = t1[2];
+  plan[2][0] = t2[0] ; plan[2][1] = t2[1];  plan[2][2] = t2[2];
+  rot[2][2] = cos(alpha) ; rot[2][1] =  sin(alpha) ; rot[2][0] = 0.;
+  rot[1][2] = -sin(alpha); rot[1][1] =  cos(alpha) ; rot[1][0] = 0.;
+  rot[0][2] = 0.         ; rot[0][1] = 0.          ; rot[0][0] = 1.;
+  int i,j,k;
+  for(i=0;i<3;i++)for(j=0;j<3;j++)invplan[i][j] = plan[j][i];
+  double interm[3][3];
+  for(i=0;i<3;i++)for(j=0;j<3;j++){
+    interm[i][j] = 0.0;
+    for(k=0;k<3;k++)interm[i][j] += invplan[i][k] * rot[k][j];
+  }
+  for(i=0;i<4;i++)for(j=0;j<4;j++)matrix[i][j] = 0.0;
+  for(i=0;i<3;i++)for(j=0;j<3;j++){
+    for(k=0;k<3;k++)matrix[i][j] += interm[i][k] * plan[k][j];
+  }
+  matrix[3][3] = 1.0;
+}
+
+void SetRotationMatrixs(double matrix[4][4],double Axe[3], double alpha){
+  double phi,C,S,C2,S2;
+  double teta;
+  double a,b,c,d,e,f,g,h,ii;
+  double Ax=Axe[0],Ay=Axe[1],Az=Axe[2];
+  if(Ax != 0.0){
+    phi = atan2(Ay,Ax);
+    teta = atan2(Az,myhypot(Ax,Ay));
+    C = cos(phi);
+    S = sin(phi);
+    C2= cos(teta);
+    S2= sin(teta);
+  }
+  else if(Ay != 0.0){
+    teta = atan2(Az,myhypot(Ax,Ay));
+    C = 0.0;
+    S = 1.0;
+    C2= cos(teta);
+    S2= sin(teta);
+  }
+  else{
+    C = 1.0;
+    S = 0.0;
+    C2= 0.0;
+    S2= 1.0;
+  }
+
+  a = C2*C;
+  b = -C2*S;
+  c = S2;
+  d = cos(alpha)*S + sin(alpha)*S2*C;
+  e = cos(alpha)*C - sin(alpha)*S*S2;
+  f = -sin(alpha)*C2;
+  g = sin(alpha)*S - cos(alpha)*S2*C;
+  h = sin(alpha)*C + cos(alpha)*S*S2;
+  ii=cos(alpha)*C2;
+
+  matrix[0][0] = a*a + S*d -C*S2*g;
+  matrix[0][1] = a*b+S*e-C*S2*h;
+  matrix[0][2] = a*c+S*f-C*S2*ii;
+  matrix[0][3] = 0.0;
+  matrix[1][0] = -S*C2*a+C*d+S*S2*g;
+  matrix[1][1] = -S*C2*b+C*e+S*S2*h;
+  matrix[1][2] = -S*C2*c+C*f+S*S2*ii;
+  matrix[1][3] = 0.0;
+  matrix[2][0] = S2*a+C2*g;
+  matrix[2][1] = S2*b+C2*h;
+  matrix[2][2] = S2*c+C2*ii;
+  matrix[2][3] = 0.0;
+  matrix[3][0] = 0.;
+  matrix[3][1] = 0.;
+  matrix[3][2] = 0.;
+  matrix[3][3] = 1.0;
+}
+
+void ApplyTransformationToCurve (double matrix[4][4],Curve *c){
+  Vertex *v;
+  
+  ApplyTransformationToPoint (matrix,c->beg);
+  ApplyTransformationToPoint (matrix,c->end);
+  
+  for(int i=0;i<List_Nbr(c->Control_Points);i++){
+    List_Read(c->Control_Points,i,&v);
+    ApplyTransformationToPoint (matrix,v);
+  }
+  End_Curve(c);
+}
+
+void ApplyTransformationToSurface (double matrix[4][4],Surface *s){
+  Curve *c;
+  Vertex *v;
+  
+  for(int i=0;i<List_Nbr(s->s.Generatrices);i++){
+    List_Read(s->s.Generatrices,i,&c);
+    ApplyTransformationToCurve (matrix,c);
+  }
+  for(int i=0;i<List_Nbr(s->Control_Points);i++){
+    List_Read(s->Control_Points,i,&v);
+    ApplyTransformationToPoint (matrix,v);
+  }
+  End_Surface(s);
+}
+
+void printCurve(Curve *c){
+  Vertex *v;
+  int N = List_Nbr(c->Control_Points);
+  Msg(INFO,"Curve %d %d cp (%d->%d)",c->Num,N,c->beg->Num,c->end->Num);
+  for(int i=0;i<N;i++){
+    List_Read(c->Control_Points,i,&v);
+    Msg(INFO,"Vertex %d (%f %f %f %f)",v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc);
+  }
+}
+
+void ProtudeXYZ ( double &x, double &y, double &z, ExtrudeParams *e){
+  double matrix[4][4];
+  double T[3];
+  Vertex v(x,y,z);
+  T[0] = -e->geo.pt[0];
+  T[1] = -e->geo.pt[1];
+  T[2] = -e->geo.pt[2];
+  List_Reset(ListOfTransformedPoints);
+  SetTranslationMatrix(matrix,T);
+  ApplyTransformationToPoint(matrix,&v);
+  List_Reset(ListOfTransformedPoints);
+  SetRotationMatrix(matrix,e->geo.axe,e->geo.angle);
+  ApplyTransformationToPoint(matrix,&v);
+  List_Reset(ListOfTransformedPoints);
+  T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2];
+  SetTranslationMatrix(matrix,T);
+  ApplyTransformationToPoint(matrix,&v);
+  List_Reset(ListOfTransformedPoints);
+  x = v.Pos.X;
+  y = v.Pos.Y;
+  z = v.Pos.Z;
+}
+
+void Extrude_ProtudePoint(int ep, int ip, double A, double B, double C,
+                          double X, double Y, double Z, double alpha,
+                          Curve **pc, Curve **prc, ExtrudeParams *e){
+  double xnew,ynew,znew,matrix[4][4],T[3],Ax[3];
+  Vertex V,*pv, *chapeau;
+  Curve *c;
+  
+  MAXREG = NEWREG();
+  MAXPOINT = NEWPOINT();
+  
+  pv= &V;
+  pv->Num = ip;
+  *pc = *prc = NULL;
+  if(!Tree_Query(THEM->Points, &pv) )return;
+
+  chapeau = DuplicateVertex(pv);
+  if(ep){
+    T[0] = A; T[1] = B; T[2] = C;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToPoint(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+  }
+  else{
+    T[0] = X; T[1] = Y; T[2] = Z;
+    Ax[0] = A; Ax[1] = B; Ax[2] = C;
+    T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2];
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToPoint(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    SetRotationMatrix(matrix,Ax,alpha);
+    ApplyTransformationToPoint(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    T[0] = -T[0]; T[1] = -T[1]; T[2] = -T[2];
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToPoint(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    Msg(INFO,"Angle %f point %f %f %f axe %f %f %f",alpha,X,Y,Z,A,B,C);
+  }
+
+  c = Create_Curve(MAXREG++,(ep)?MSH_SEGM_LINE:MSH_SEGM_CIRC,1,NULL,NULL,-1,-1,0.,1.);
+  c->Control_Points = List_Create((ep)?2:3,1,sizeof(Vertex*));
+
+  // je me souviens
+  c->Extrude = new ExtrudeParams;
+  c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+  if(e)c->Extrude->mesh = e->mesh;
+  
+  if(ep){
+    List_Add(c->Control_Points,&pv);
+    List_Add(c->Control_Points,&chapeau);
+    c->beg = pv;
+    c->end = chapeau;
+  }
+  else{
+    List_Add(c->Control_Points,&pv);
+    
+    dist_ddg(pv->Pos.X,pv->Pos.Y,pv->Pos.Z,
+             chapeau->Pos.X,chapeau->Pos.Y,chapeau->Pos.Z,
+             X,Y,Z,X+A,Y+B,Z+C,&xnew,&ynew,&znew);
+    Vertex *newp = DuplicateVertex(pv);
+    newp->Pos.X = xnew;
+    newp->Pos.Y = ynew;
+    newp->Pos.Z = znew;
+    List_Add(c->Control_Points,&newp);
+    List_Add(c->Control_Points,&chapeau);
+    c->beg = pv;
+    c->end = chapeau;
+    printCurve(c);
+  }
+  End_Curve(c);
+  Tree_Add(THEM->Curves,&c);
+  CreateReversedCurve (THEM,c);
+  *pc = c;
+  *prc = FindCurve(-c->Num,THEM);
+  
+}
+
+void printSurface(Surface*s){
+  Curve *c;
+  int N = List_Nbr(s->s.Generatrices);
+
+  Msg(INFO,"Surface %d %d generatrices",s->Num,N);
+  for(int i=0;i<N;i++){
+    List_Read(s->s.Generatrices,i,&c);
+    printCurve(c);
+  }
+}
+
+Surface *Extrude_ProtudeCurve(int ep, int ic,
+                              double A, double B, double C,
+                              double X, double Y, double Z,
+                              double alpha, ExtrudeParams *e){
+  double matrix[4][4],T[3],Ax[3];
+  Curve *CurveBeg,*CurveEnd;
+  Curve *ReverseChapeau,*ReverseBeg,*ReverseEnd;
+  Curve *pc, *revpc, *chapeau;
+  Surface *s;
+  
+  MAXREG = NEWREG();
+  MAXPOINT = NEWPOINT();
+  
+  pc    = FindCurve(ic,THEM);
+  revpc = FindCurve(-ic,THEM);
+  
+  if(!pc || !revpc){
+    return NULL;
+  }
+  chapeau = DuplicateCurve(pc);
+  
+  chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY);
+  chapeau->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+  chapeau->Extrude->geo.Source = pc->Num;
+  if(e)chapeau->Extrude->mesh = e->mesh;
+  
+  ReverseChapeau = FindCurve(-chapeau->Num,THEM);
+  if(ep){
+    T[0] = A; T[1] = B; T[2] = C;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToCurve(matrix,chapeau);
+  }
+  else{
+    T[0] = -X; T[1] = -Y; T[2] = -Z;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToCurve(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    
+    Ax[0] = A; Ax[1] = B; Ax[2] = C;
+    SetRotationMatrix(matrix,Ax,alpha);
+    ApplyTransformationToCurve(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    
+    T[0] = X; T[1] = Y; T[2] = Z;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToCurve(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+  }
+  Extrude_ProtudePoint(ep,pc->beg->Num,A,B,C,X,Y,Z,alpha,
+                       &CurveBeg,&ReverseBeg,e);
+  Extrude_ProtudePoint(ep,pc->end->Num,A,B,C,X,Y,Z,alpha,
+                       &CurveEnd,&ReverseEnd,e);
+  
+  s = Create_Surface(MAXREG++,MSH_SURF_REGL,0);
+  s->s.Generatrices = List_Create(4,1,sizeof(Curve*));
+  
+  // je me souviens
+  s->Extrude = new ExtrudeParams;
+  s->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+  s->Extrude->geo.Source = pc->Num;
+  if(e)s->Extrude->mesh = e->mesh;
+  
+  if(!pc)
+    Msg(INFO,"zarbi 1");
+  if(!CurveEnd)
+    Msg(INFO,"zarbi 2");
+  if(!ReverseChapeau)
+    Msg(INFO,"zarbi 3");
+  if(!ReverseBeg)
+    Msg(INFO,"zarbi 4");
+  
+  List_Add(s->s.Generatrices,&pc);
+  List_Add(s->s.Generatrices,&CurveEnd);
+  List_Add(s->s.Generatrices,&ReverseChapeau);
+  List_Add(s->s.Generatrices,&ReverseBeg);
+  End_Surface(s);
+  Tree_Add(THEM->Surfaces,&s);
+  List_Reset(ListOfTransformedPoints);
+  return s;
+}
+
+void Extrude_ProtudeSurface(int ep, int is,
+                            double A, double B, double C,
+                            double X, double Y, double Z,
+                            double alpha,
+                            int NewVolume, ExtrudeParams *e){
+  double matrix[4][4],T[3],Ax[3];
+  Curve *c,*c2;
+  int i;
+  Surface *s,*ps, *chapeau;
+  Volume *pv = NULL;
+  
+  if(!(ps = FindSurface(is,THEM)) )return;
+  
+  if(NewVolume){
+    pv = Create_Volume(NewVolume,0,0);
+    pv->Extrude = new ExtrudeParams;
+    pv->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+    pv->Extrude->geo.Source = is;
+    if(e)pv->Extrude->mesh = e->mesh;
+    if(pv)List_Add(pv->Surfaces,&ps);
+  }
+  
+  MAXREG = NEWREG();
+  MAXPOINT = NEWPOINT();
+  
+  chapeau = DuplicateSurface(ps,1);
+  chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY);
+  chapeau->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+  chapeau->Extrude->geo.Source = ps->Num;
+  if(e)chapeau->Extrude->mesh = e->mesh;
+  
+  for(i=0;i<List_Nbr(chapeau->s.Generatrices);i++) {
+    List_Read(ps->s.Generatrices,i,&c2);
+    List_Read(chapeau->s.Generatrices,i,&c);
+    if(c->Num<0)c = FindCurve(-c->Num,THEM);
+    c->Extrude = new ExtrudeParams(COPIED_ENTITY);
+    c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
+    c->Extrude->geo.Source = abs(c2->Num);
+    if(e)c->Extrude->mesh = e->mesh;
+  }
+  
+  if(pv)List_Add(pv->Surfaces,&chapeau);
+
+  // filling extrude params
+  
+  for(i=0;i<List_Nbr(ps->s.Generatrices);i++){
+    List_Read(ps->s.Generatrices,i,&c);
+    s = Extrude_ProtudeCurve(ep,c->Num,A,B,C,X,Y,Z,alpha,e);
+    if(pv)List_Add(pv->Surfaces,&s);
+    //printSurface(s);
+  }
+
+  if(ep){
+    T[0] = A; T[1] = B; T[2] = C;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToSurface(matrix,chapeau);
+  }
+  else{
+    T[0] = -X; T[1] = -Y; T[2] = -Z;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToSurface(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    
+    Ax[0] = A;Ax[1]=B;Ax[2]=C;
+    SetRotationMatrix(matrix,Ax,alpha);
+    ApplyTransformationToSurface(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+    
+    T[0] = X; T[1] = Y; T[2] = Z;
+    SetTranslationMatrix(matrix,T);
+    ApplyTransformationToSurface(matrix,chapeau);
+    List_Reset(ListOfTransformedPoints);
+  }
+  Tree_Suppress(THEM->Surfaces,&chapeau);
+  chapeau->Num = NEWREG();
+  Tree_Add(THEM->Surfaces,&chapeau);
+  
+  if(pv)Tree_Add(THEM->Volumes,&pv);
+  
+  ReplaceAllDuplicates ( THEM );
+  List_Reset(ListOfTransformedPoints);
+  
+}
+
+void DivideCurve (Curve *c , double u, Vertex *v, Curve **c1, Curve **c2){
+  (*c1) = Create_Curve(MAXREG++,c->Typ,1,NULL,NULL,-1,-1,0.,1.);
+  (*c2) = Create_Curve(MAXREG++,c->Typ,1,NULL,NULL,-1,-1,0.,1.);
+  CopyCurve(c,*c1);
+  CopyCurve(c,*c2);
+  (*c1)->uend = u;
+  (*c2)->ubeg = u;
+  (*c1)->end = v;
+  (*c2)->beg = v;
+}
+
+bool IntersectCurves (Curve *c1, Curve *c2,
+                      Curve **c11, Curve **c12,
+                      Curve **c21, Curve **c22, Vertex **v){
+  float x[3];
+  Vertex v1,v2;
+  Vertex V,*pv;
+  int check;
+  
+  if(!compareVertex(&c1->beg,&c2->beg))return false;
+  if(!compareVertex(&c1->end,&c2->end))return false;
+  if(!compareVertex(&c1->beg,&c2->end))return false;
+  if(!compareVertex(&c2->beg,&c1->end))return false;
+
+  CURVE_2 = c2;
+  CURVE = c1;
+  x[1] = x[2] =  0.0;
+  newt(x,2,&check,intersectCC);
+  if(check)return false;
+  v1 = InterpolateCurve(c1,x[1],0);
+  v2 = InterpolateCurve(c2,x[2],0);
+  if(x[1] <= c1->ubeg)return false;
+  if(x[1] >= c1->uend)return false;
+  if(x[2] <= c2->ubeg)return false;
+  if(x[2] >= c2->uend)return false;
+  if(fabs(v1.Pos.Z - v2.Pos.Z) > 1.e-06 * LC )return false;
+  pv = &V;
+  pv->Num = MAXPOINT++;
+  Cdbpts101(pv->Num,v1.Pos.X,v1.Pos.Y,v1.Pos.Z,v1.lc,x[1]);
+  v = (Vertex**)Tree_PQuery(THEM->Points,&pv);
+  DivideCurve(c1,x[1],*v,c11,c12);
+  DivideCurve(c2,x[2],*v,c21,c22);
+  return true;
+}
+
+bool IntersectAllSegmentsTogether (void) {
+  bool intersectionfound = true;
+  List_T *TempList;
+  Curve *c1,*c2,*c11,*c12,*c21,*c22;
+  Vertex *v;
+  int i,j;
+
+  while(intersectionfound){
+    TempList = Tree2List(THEM->Curves);
+    if(!List_Nbr(TempList))return true;
+    for(i=0;i<List_Nbr(TempList);i++){
+      List_Read(TempList,i,&c1);
+      intersectionfound = false;
+      for(j=0;j<List_Nbr(TempList);j++){
+        List_Read(TempList,j,&c2);
+        if(c1->Num > 0 && c2->Num >0 && i!=j && intersectionfound == false){
+          if(IntersectCurves(c1,c2,&c11,&c12,&c21,&c22,&v)){
+            Msg(INFO, "Intersection curve %d %d",c1->Num,c2->Num);
+            intersectionfound = true;
+            DeleteCurve(c1->Num);
+            DeleteCurve(c2->Num);
+            Tree_Add(THEM->Curves,&c11);
+            Tree_Add(THEM->Curves,&c12);
+            Tree_Add(THEM->Curves,&c21);
+            Tree_Add(THEM->Curves,&c22);
+            
+            CreateReversedCurve(THEM,c11);
+            CreateReversedCurve(THEM,c12);
+            CreateReversedCurve(THEM,c21);
+            CreateReversedCurve(THEM,c22);
+            return true;
+          }
+        }
+      }
+      if(intersectionfound) break;
+    }
+    List_Delete(TempList);
+  }
+  return false;
+
+}
+
+void IntersectSurfaces (Surface *s1, Surface *s2){
+
+
+}
+
+int compareTwoCurves (const void *a, const void *b){
+  Curve *c1, *c2;
+  c1 = *(Curve**)a;
+  c2 = *(Curve**)b;
+  int comp;
+  
+  if(c1->Typ != c2->Typ)return c1->Typ - c2->Typ;
+  comp = compareVertex(&c1->beg,&c2->beg);
+  if(comp)return comp;
+  comp = compareVertex(&c1->end,&c2->end);
+  if(comp)return comp;
+  // a finir pour des splines !!
+  return 0;
+  return c1->Num - c2->Num;
+}
+
+int compareAbsCurve (const void *a, const void *b){
+  Curve **q, **w;
+
+  q = (Curve **) a;
+  w = (Curve **) b;
+  return (abs((*q)->Num) - abs((*w)->Num));
+}
+
+int compareTwoSurfaces (const void *a, const void *b){
+  Surface *s1, *s2;
+  s1 = *(Surface**)a;
+  s2 = *(Surface**)b;
+  return compare2Lists(s1->s.Generatrices,
+                       s2->s.Generatrices,
+                       compareAbsCurve);
+}
+
+
+/* Fonction eliminant les doublons dans une
+   geometrie*/
+
+void Coherence_PS(void){
+  ReplaceAllDuplicates (THEM);
+}
+
+void ReplaceAllDuplicates ( Mesh *m ){
+  List_T *All = Tree2List(m->Points);
+  Vertex *v;
+  Curve *c,*c2;
+  Surface *s;
+  Volume *vol;
+  int i,j;
+  
+  /*Creation de points uniques*/
+  Tree_T *allNonDulpicatedPoints;
+  allNonDulpicatedPoints = Tree_Create(sizeof(Vertex*),comparePosition);
+  Msg(INFO, "Beginning with %d points",List_Nbr(All));
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&v);
+    if(!Tree_Search(allNonDulpicatedPoints,&v)){
+      Tree_Insert(allNonDulpicatedPoints,&v);
+    }
+    else{
+      Tree_Suppress(m->Points,&v);
+    }
+  }
+  
+  List_Delete(All);
+  Msg(INFO, "Ending with %d points",Tree_Nbr(m->Points));
+
+  /*Remplacement dans les courbes*/
+  All = Tree2List(m->Curves);
+  
+  Msg(INFO, "Beginning with %d curves",List_Nbr(All));
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&c);
+    Tree_Query( allNonDulpicatedPoints,&c->beg);
+    Tree_Query( allNonDulpicatedPoints,&c->end);
+    for(j=0;j<List_Nbr(c->Control_Points);j++){
+      List_Write(c->Control_Points,j,
+                 Tree_PQuery( allNonDulpicatedPoints,
+                              List_Pointer(c->Control_Points,j)));
+    }
+  }
+  List_Delete(All);
+  All = Tree2List(m->Surfaces);
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&s);
+    for(j=0;j<List_Nbr(s->Control_Points);j++){
+      List_Write(s->Control_Points,j,
+                 Tree_PQuery( allNonDulpicatedPoints,
+                              List_Pointer(s->Control_Points,j)));
+    }
+  }
+  
+  List_Delete(All);
+  All = Tree2List(m->Curves);
+
+  /*Creation de courbes uniques*/
+  Tree_T *allNonDulpicatedCurves;
+  allNonDulpicatedCurves = Tree_Create(sizeof(Curve*),compareTwoCurves);
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&c);
+    if(c->Num > 0){
+      if(!Tree_Search(allNonDulpicatedCurves,&c)){
+        Tree_Insert(allNonDulpicatedCurves,&c);
+        c2 = FindCurve(-c->Num,m);
+        Tree_Insert(allNonDulpicatedCurves,&c2);
+      }
+      else{
+        Tree_Suppress(m->Curves,&c);
+        c2 = FindCurve(-c->Num,m);
+        Tree_Suppress(m->Curves,&c2);
+      }
+    }
+  }
+  
+  List_Delete(All);
+  Msg(INFO, "Ending with %d curves",Tree_Nbr(m->Curves));
+
+  /*Remplacement dans les surfaces*/
+  All = Tree2List(m->Surfaces);
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&s);
+    for(j=0;j<List_Nbr(s->s.Generatrices);j++){
+      List_Write(s->s.Generatrices,j,
+                 Tree_PQuery( allNonDulpicatedCurves,
+                              List_Pointer(s->s.Generatrices,j)));
+    }
+  }
+  
+  /*Creation de surfaces uniques*/
+  Msg(INFO, "Beginning with %d surfaces",List_Nbr(All));
+  
+  Tree_T *allNonDulpicatedSurfaces;
+  allNonDulpicatedSurfaces = Tree_Create(sizeof(Curve*),compareTwoSurfaces);
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&s);
+    //printSurface(s);
+    if(s->Num > 0){
+      if(!Tree_Search(allNonDulpicatedSurfaces,&s)){
+        Tree_Insert(allNonDulpicatedSurfaces,&s);
+      }
+      else{
+        Tree_Suppress(m->Surfaces,&s);
+      }
+    }
+  }
+  List_Delete(All);
+  Msg(INFO, "Ending with %d surfaces",Tree_Nbr(m->Surfaces));
+
+  /*Remplacement dans les volumes*/
+  All = Tree2List(m->Volumes);
+  for(i=0;i<List_Nbr(All);i++){
+    List_Read(All,i,&vol);
+    for(j=0;j<List_Nbr(vol->Surfaces);j++){
+      List_Write(vol->Surfaces,j,
+                 Tree_PQuery( allNonDulpicatedSurfaces,
+                              List_Pointer(vol->Surfaces,j)));
+    }
+  }
+}
+
+/* NEW CAD FUNCTIONS */
+
+void ModifyLcPoint(int ip, double lc){
+  Vertex *v = FindVertex(ip,THEM);
+  if(v)v->lc = lc;
+}
+
+void ApplicationOnPoint(int ip,double matrix[4][4]){
+  Vertex *v = FindVertex(ip,THEM);
+  if(v)ApplyTransformationToPoint ( matrix, v );
+}
+
+void ApplicationOnLine(int ip, double matrix[4][4]){
+  Curve *c = FindCurve(ip,THEM);
+  if(c)ApplyTransformationToCurve ( matrix, c );
+}
+
+void ApplicationOnSurface(int ip, double matrix[4][4]){
+  Surface *s = FindSurface(ip,THEM);
+  if(s)ApplyTransformationToSurface ( matrix, s );
+}
+
+void ApplicationOnShapes(double matrix[4][4], List_T *ListShapes){
+  int i;
+  Shape O;
+  
+  for(i=0;i<List_Nbr(ListShapes);i++){
+    List_Read(ListShapes,i,&O);
+    switch(O.Type){
+    case MSH_POINT:
+      ApplicationOnPoint(O.Num,matrix);
+      break;
+    case MSH_SEGM_LINE:
+    case MSH_SEGM_SPLN:
+    case MSH_SEGM_CIRC:
+    case MSH_SEGM_ELLI:
+    case MSH_SEGM_NURBS:
+      ApplicationOnLine(O.Num,matrix);
+      break;
+    case MSH_SURF_NURBS :
+    case MSH_SURF_REGL :
+    case MSH_SURF_TRIC :
+    case MSH_SURF_PLAN :
+      ApplicationOnSurface(O.Num,matrix);
+      break;
+    default:
+      printf("Impossible de translater le truc %d de type %d\n",O.Num,O.Type);
+      break;
+    }
+  }
+  List_Reset(ListOfTransformedPoints);
+}
+
+void TranslateShapes(double X,double Y,double Z,
+                     List_T *ListShapes, int isFinal){
+  double T[3],matrix[4][4];
+  T[0] = X;T[1] = Y;T[2] = Z;
+  SetTranslationMatrix(matrix,T);
+  ApplicationOnShapes(matrix,ListShapes);
+  if(isFinal)ReplaceAllDuplicates ( THEM );
+}
+
+void DilatShapes(double X,double Y,double Z, double A,
+                 List_T *ListShapes, int isFinal){
+  double T[3],matrix[4][4];
+  T[0] = X;T[1] = Y;T[2] = Z;
+  SetDilatationMatrix(matrix,T,A);
+  ApplicationOnShapes(matrix,ListShapes);
+  ReplaceAllDuplicates ( THEM );
+}
+
+
+void RotateShapes (double Ax,double Ay,double Az,
+                   double Px,double Py, double Pz,
+                   double alpha, List_T *ListShapes){
+  double A[3],matrix[4][4];
+  A[0] = Ax;A[1] = Ay;A[2] = Az;
+  TranslateShapes(-Px,-Py,-Pz,ListShapes,0);
+  List_Reset(ListOfTransformedPoints);
+  SetRotationMatrix(matrix,A,alpha);
+  ApplicationOnShapes(matrix,ListShapes);
+  TranslateShapes(Px,Py,Pz,ListShapes,0);
+  List_Reset(ListOfTransformedPoints);
+  ReplaceAllDuplicates ( THEM );
+}
+
+void SymetryShapes (double A,double B,double C,
+                    double D, List_T *ListShapes, int x){
+  double matrix[4][4];
+  SetSymmetryMatrix(matrix,A,B,C,D);
+  ApplicationOnShapes(matrix,ListShapes);
+  ReplaceAllDuplicates ( THEM );
+}
+
+
+void CopyShape(int Type, int Num, int *New){
+  Surface *s,*news;
+  Curve *c, *newc;
+  Vertex *v,*newv;
+  
+  MAXREG = NEWREG();
+  MAXPOINT = NEWPOINT();
+
+  switch(Type){
+  case MSH_POINT:
+    v = FindVertex(Num,THEM);
+    newv = DuplicateVertex(v);
+    *New = newv->Num;
+    break;
+  case MSH_SEGM_LINE:
+  case MSH_SEGM_SPLN:
+  case MSH_SEGM_CIRC:
+  case MSH_SEGM_ELLI:
+  case MSH_SEGM_NURBS:
+    c = FindCurve(Num,THEM);
+    newc = DuplicateCurve(c);
+    *New = newc->Num;
+    break;
+  case MSH_SURF_NURBS:
+  case MSH_SURF_TRIC:
+  case MSH_SURF_REGL:
+  case MSH_SURF_PLAN:
+    s = FindSurface(Num,THEM);
+    news = DuplicateSurface(s,1);
+    *New = news->Num;
+    break;
+  default:
+    printf("Impossible de copier le truc %d de type %d\n",Num,Type);
+    break;
+  }
+}
+
+void DeletePoint(int ip){
+  Vertex *v = FindVertex(ip,THEM);
+  if(!v)return;
+  List_T *Curves = Tree2List(THEM->Curves);
+  for(int i=0;i<List_Nbr(Curves);i++){
+    Curve *c;
+    List_Read(Curves,i,&c);
+    for(int j=0;j<List_Nbr(c->Control_Points);j++){
+      if(!compareVertex(List_Pointer(c->Control_Points,j),&v))return;
+    }
+  }
+  List_Delete(Curves);
+  Tree_Suppress(THEM->Points,&v);
+}
+
+void DeleteCurve(int ip){
+  Curve *c = FindCurve(ip,THEM);
+  if(!c)return;
+  List_T *Surfs = Tree2List(THEM->Surfaces);
+  for(int i=0;i<List_Nbr(Surfs);i++){
+    Surface *s;
+    List_Read(Surfs,i,&s);
+    for(int j=0;j<List_Nbr(s->s.Generatrices);j++){
+      if(!compareCurve(List_Pointer(s->s.Generatrices,j),&c))return;
+    }
+  }
+  List_Delete(Surfs);
+  Tree_Suppress(THEM->Curves,&c);
+}
+
+void DeleteSurf( int is ){
+
+  // Il faut absolument coder une
+  // structure coherente pour les volumes.
+  Surface *s = FindSurface(is,THEM);
+  if(!s)return;
+  List_T *Vols = Tree2List(THEM->Volumes);
+  for(int i=0;i<List_Nbr(Vols);i++){
+    Volume *v;
+    List_Read(Vols,i,&v);
+    for(int j=0;j<List_Nbr(v->Surfaces);j++){
+      if(!compareCurve(List_Pointer(v->Surfaces,j),&s))return;
+    }
+  }
+  List_Delete(Vols);
+  //s->Num = 1000000000;
+  Tree_Suppress(THEM->Surfaces,&s);
+}
+
+void DeleteLine(int ip, int i){DeleteCurve(ip);}
+
+void DeleteShape(int Type, int Num){
+
+  switch(Type){
+  case MSH_POINT:
+    DeletePoint(Num);
+    break;
+  case MSH_SEGM_LINE:
+  case MSH_SEGM_SPLN:
+  case MSH_SEGM_CIRC:
+  case MSH_SEGM_ELLI:
+  case MSH_SEGM_NURBS:
+    DeleteCurve(Num);
+    break;
+  case MSH_SURF_NURBS:
+  case MSH_SURF_TRIC:
+  case MSH_SURF_REGL:
+  case MSH_SURF_PLAN:
+    DeleteSurf(Num);
+    break;
+  default:
+    printf("Impossible de copier le truc %d de type %d\n",Num,Type);
+    break;
+  }
+}
+
+Curve * CreateReversedCurve (Mesh *M,Curve *c){
+  Curve *newc;
+  Vertex *e1,*e2,*e3,*e4;
+  int i;
+  newc = Create_Curve(-c->Num, c->Typ,1,NULL,NULL,-1,-1,0.,1.);
+  newc->Control_Points = List_Create(List_Nbr(c->Control_Points), 1, sizeof(Vertex*));
+  if (c->Typ == MSH_SEGM_ELLI || c->Typ == MSH_SEGM_ELLI_INV){
+    List_Read(c->Control_Points,0,&e1);
+    List_Read(c->Control_Points,1,&e2);
+    List_Read(c->Control_Points,2,&e3);
+    List_Read(c->Control_Points,3,&e4);
+    List_Add(newc->Control_Points,&e4);
+    List_Add(newc->Control_Points,&e2);
+    List_Add(newc->Control_Points,&e3);
+    List_Add(newc->Control_Points,&e1);
+  }
+  else
+    List_Invert(c->Control_Points, newc->Control_Points);
+  
+  if (c->Typ == MSH_SEGM_NURBS && c->k){
+    newc->k = (float*)malloc((c->degre + List_Nbr(c->Control_Points)+1)*sizeof(float));
+    for(i=0;i<c->degre + List_Nbr(c->Control_Points)+1;i++)
+      newc->k[c->degre + List_Nbr(c->Control_Points)-i] = c->k[i];
+  }
+  
+  if (c->Typ == MSH_SEGM_CIRC) newc->Typ =  MSH_SEGM_CIRC_INV;
+  if (c->Typ == MSH_SEGM_CIRC_INV) newc->Typ =  MSH_SEGM_CIRC;
+  if (c->Typ == MSH_SEGM_ELLI) newc->Typ =  MSH_SEGM_ELLI_INV;
+  if (c->Typ == MSH_SEGM_ELLI_INV) newc->Typ =  MSH_SEGM_ELLI;
+  newc->Vertices = List_Create(10 ,1 ,sizeof(Vertex*));
+  newc->Method = c->Method;
+  newc->degre  = c->degre;
+  newc->beg = c->end;
+  newc->end = c->beg;
+  newc->ubeg = 1. - c->uend;
+  newc->uend = 1. - c->ubeg;
+  Tree_Insert(M->Curves, &newc);
+  End_Curve(newc);
+  return newc;
+}
+
+int recognize_seg(int typ, List_T * liste, int *seg){
+  int i,beg,end;
+  Curve *pc;
+
+  List_T *temp = Tree2List(THEM->Curves);
+  List_Read(liste,0,&beg);
+  List_Read(liste,List_Nbr(liste)-1,&end);
+  for(i=0;i<List_Nbr(temp);i++){
+    List_Read(temp,i,&pc);
+    if(pc->Typ == typ &&
+       pc->beg->Num == beg &&
+       pc->end->Num == end){
+      List_Delete(temp);
+      *seg = pc->Num;
+      return 1;
+    }
+  }
+  List_Delete(temp);
+  return 0;
+}
+
+
+
+int recognize_loop(List_T * liste, int *loop){
+  int i,res;
+  EdgeLoop *pe;
+
+  res = 0;
+  *loop = 0;
+  List_T *temp = Tree2List(THEM->EdgeLoops);
+  for(i=0;i<List_Nbr(temp);i++){
+    List_Read(temp,i,&pe);
+    if(!compare2Lists(pe->Curves,liste,fcmp_absint)){
+      res = 1;
+      *loop = pe->Num;
+      break;
+    }
+  }
+  List_Delete(temp);
+  return res;
+}
+
+int recognize_surfloop(List_T * liste, int *loop){
+  int i,res;
+  EdgeLoop *pe;
+
+  res = 0;
+  *loop = 0;
+  List_T *temp = Tree2List(THEM->SurfaceLoops);
+  for(i=0;i<List_Nbr(temp);i++){
+    List_Read(temp,i,&pe);
+    if(!compare2Lists(pe->Curves,liste,fcmp_absint)){
+      res = 1;
+      *loop = pe->Num;
+      break;
+    }
+  }
+  List_Delete(temp);
+  return res;
+}
+
diff --git a/Geo/CAD.h b/Geo/CAD.h
new file mode 100644
index 0000000000000000000000000000000000000000..cf1bc88644d897f73c176d1720c2e9a5165d9366
--- /dev/null
+++ b/Geo/CAD.h
@@ -0,0 +1,60 @@
+#ifndef _CAD_H_
+#define _CAD_H_
+
+#include "Mesh.h"
+
+int NEWREG(void);
+int NEWPOINT(void);
+
+Vertex *FindVertex(int inum, Mesh *M);
+Curve *FindCurve(int inum, Mesh *M);
+Surface *FindSurface(int inum, Mesh *M);
+Volume *FindVolume(int inum, Mesh *M);
+EdgeLoop *FindEdgeLoop(int inum, Mesh *M);
+SurfaceLoop *FindSurfaceLoop(int inum, Mesh *M);
+
+bool ProjectPointOnCurve (Curve *c, Vertex *v, Vertex *RES, Vertex *DER);
+bool ProjectPointOnSurface (Surface *s, Vertex &p);
+bool ProjectPointOnSurface (Surface *s, Vertex *p,double *u, double *v);
+
+void Extrude_ProtudePoint(int ep, int ip, double A, double B, double C,
+                          double X, double Y, double Z, double alpha,
+                          Curve **pc, Curve **prc, ExtrudeParams *e);
+Surface *Extrude_ProtudeCurve(int ep, int ic,
+                              double A, double B, double C,
+			      double X, double Y, double Z,
+                              double alpha, ExtrudeParams *e);
+void Extrude_ProtudeSurface(int ep, int is,
+                            double A, double B, double C,
+			    double X, double Y, double Z,
+                            double alpha,
+                            int NewVolume, ExtrudeParams *e);
+void ProtudeXYZ ( double &x, double &y, double &z, ExtrudeParams *e);
+void ReplaceAllDuplicates ( Mesh *m );
+void Coherence_PS(void);
+
+void ModifyLcPoint(int ip, double lc);
+void TranslateShapes(double X,double Y,double Z,
+		     List_T *ListShapes, int isFinal);
+void DilatShapes(double X,double Y,double Z, double A,
+		 List_T *ListShapes, int isFinal);
+void RotateShapes (double Ax,double Ay,double Az,
+		   double Px,double Py, double Pz,
+                   double alpha, List_T *ListShapes);
+void SymetryShapes (double A,double B,double C,
+		    double D, List_T *ListShapes, int x);
+void CopyShape(int Type, int Num, int *New);
+
+void DeletePoint(int ip);
+void DeleteCurve(int ip);
+void DeleteSurf( int is );
+void DeleteShape(int Type, int Num);
+
+Curve * CreateReversedCurve (Mesh *M,Curve *c);
+
+int recognize_seg(int typ, List_T * liste, int *seg);
+int recognize_loop(List_T * liste, int *loop);
+int recognize_surfloop(List_T * liste, int *loop);
+
+
+#endif
diff --git a/Geo/DataBase.cpp b/Geo/DataBase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..76a333c8b9cbba225d981d39bc618bf56fdc3f42
--- /dev/null
+++ b/Geo/DataBase.cpp
@@ -0,0 +1,459 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "CAD.h"
+#include "Create.h"
+#include "Verif.h"
+
+extern int    CurrentNodeNumber;
+extern Mesh  *THEM;
+
+/* POINTS */
+
+void Cdbpts101(int ip, double x, double y, double z, double l, double w){
+  Vertex *v;
+  CurrentNodeNumber = IMAX(CurrentNodeNumber, ip);
+  v = Create_Vertex(ip,x,y,z,l,0.0);
+  v->w = w;
+  Tree_Insert(THEM->Points,&v);
+}
+
+/* CURVES */
+
+void AddCurveInDataBase (int NumCurve, int TypCurve, int Order,
+                         List_T *ControlPoints, List_T *Knots,
+                         int VertexBeg, int VertexEnd,
+                         double uBeg, double uEnd){
+  Curve *c;
+
+  if(NumCurve<0) return; /* Negative Curves are reversed from positive ones*/
+
+  c = Create_Curve(NumCurve,TypCurve,Order,ControlPoints,Knots,
+                   VertexBeg,VertexEnd,uBeg,uEnd);
+
+  /* Courbe dans l'autre sens */
+  
+  Curve *rc = CreateReversedCurve(THEM,c);
+  Tree_Insert(THEM->Curves,&c);
+  Tree_Insert(THEM->Curves,&rc);
+}
+
+void AddCircleInDataBase (int NumCurve, int TypCurve, List_T *ControlPoints,
+                          double n[3]){
+  Curve *c;
+  
+  if(NumCurve<0) return; /* Negative Curves are reversed from positive ones*/
+
+  c = Create_Curve(NumCurve,TypCurve,2,ControlPoints,NULL,-1,-1,0.,1.);
+
+  c->Circle.n[0] = n[0];
+  c->Circle.n[1] = n[1];
+  c->Circle.n[2] = n[2];
+  
+  End_Curve(c);
+
+  /* Courbe dans l'autre sens */
+  
+  Curve *rc = CreateReversedCurve(THEM,c);
+  
+  rc->Circle.n[0] = n[0];
+  rc->Circle.n[1] = n[1];
+  rc->Circle.n[2] = n[2];
+  End_Curve(rc);
+  
+  Tree_Insert(THEM->Curves,&c);
+  Tree_Insert(THEM->Curves,&rc);
+}
+
+void Cdbseg101(int iseg, int typseg, int degre, List_T *liste, List_T *listint,
+               int i1,int i2,double u1 ,double u2,char *c1, char *c2, char *c3){
+  int i,j;
+  double d;
+  List_T *Temp;
+  if(listint){
+    AddCurveInDataBase (iseg,typseg,degre,listint,NULL,i1,i2,u1,u2);
+  }
+  else{
+    Temp = List_Create(List_Nbr(liste),1,sizeof(int));
+    for(i=0;i<List_Nbr(liste);i++){
+      List_Read(liste,i,&d);
+      j = (int)d;
+      List_Add(Temp,&j);
+    }
+    AddCurveInDataBase (iseg,typseg,degre,Temp,NULL,i1,i2,u1,u2);
+    List_Delete(Temp);
+  }
+  
+}
+
+
+/* SURFACES AND VOLUMES */
+
+void AddQuadricSurfaceInDataBase (int Typ, int NumQuadric, double zaxis[3],
+                                  double xaxis[3], double center[3],
+                                  double radius1, double radius2, List_T *loops){
+  int ic,i,j,NbLoop,iLoop;
+  Surface *s;
+  Curve *c;
+  EdgeLoop *el;
+  
+  s = Create_Surface(NumQuadric,Typ,0);
+  s->Method = LIBRE;
+  for(i=0;i<3;i++)s->Cyl.xaxis[i] = xaxis[i];
+  for(i=0;i<3;i++)s->Cyl.zaxis[i] = zaxis[i];
+  for(i=0;i<3;i++)s->Cyl.center[i] = center[i];
+  s->Cyl.radius1 = radius1;
+  s->Cyl.radius2 = radius2;
+  s->s.Generatrices = List_Create(4, 1, sizeof(Curve*));
+
+  NbLoop = List_Nbr(loops);
+  s->s.Generatrices = List_Create(4, 1, sizeof(Curve*));
+  for(i=0;i<NbLoop;i++){
+    List_Read(loops,i,&iLoop);
+    if(!(el = FindEdgeLoop(iLoop,THEM)))
+      Msg(ERROR, "Unknown Loop %d", iLoop);
+    else{
+      for(j=0;j<List_Nbr(el->Curves);j++){
+	List_Read(el->Curves,j,&ic);
+	if(!(c = FindCurve(ic,THEM)))
+	  Msg(ERROR, "Unknown Curve %d", ic);
+	else
+	  List_Add (s->s.Generatrices, &c);
+      }
+    }
+  }
+  s->Support = s;
+  End_Surface(s);
+  Tree_Insert (THEM->Surfaces , &s);
+}
+
+void CreateSurfaceFromOldCrappyDatabase (int izon, int typzon, int o1, int o2,
+                                         int nbu, int nbv, int sup,
+                                         List_T *liste, List_T *loops, Mesh *M){
+
+  int      ic,i,j,l,NbLoop,iLoop;
+  Surface *s,*pS;
+  Curve   *c;
+  Vertex V,*v;
+  EdgeLoop *el;
+
+  s = Create_Surface(izon,typzon,0);
+  s->Method = LIBRE;
+  
+  NbLoop = List_Nbr(loops);
+  s->s.Generatrices = List_Create(4, 1, sizeof(Curve*));
+  for(i=0;i<NbLoop;i++){
+    List_Read(loops,i,&iLoop);
+    if(!(el = FindEdgeLoop(iLoop,THEM)))
+      Msg(ERROR, "Unknown Line Loop %d", iLoop);
+    else{
+      for(j=0;j<List_Nbr(el->Curves);j++){
+	List_Read(el->Curves,j,&ic);
+	if(!(c = FindCurve(ic,THEM)))
+	  Msg(ERROR, "Unknown Curve %d", ic);
+	else
+	  List_Add (s->s.Generatrices, &c);
+      }
+    }
+  }
+  
+  if((pS = FindSurface(sup,THEM))){
+    s->Support = pS;
+  }
+  else{
+    s->Support = s;
+  }
+
+  if(typzon == MSH_SURF_NURBS && !pS){
+    s->Control_Points = List_Create(4, 1, sizeof(Vertex*));
+    s->OrderU = o1;
+    s->OrderV = o2;
+    s->Nu = nbu;
+    s->Nv = nbv;
+    for(l=0;l<List_Nbr(liste);l++){
+      List_Read(liste,l,&iLoop);
+      v = &V;
+      v->Num = iLoop;
+      List_Add (s->Control_Points, Tree_PQuery(M->Points, &v));
+    }
+  }
+
+  End_Surface(s);
+  Tree_Insert (M->Surfaces , &s);
+}
+
+void CreateVolumeFromOldCrappyDatabase (int izon, List_T *loops, Mesh *M){
+  SurfaceLoop *sl;
+  int i,j,iLoop,is;
+  Surface *s;
+  Volume *v;
+  
+  v = Create_Volume(izon,MSH_VOLUME,0);
+  v->Surfaces = List_Create(4, 1, sizeof(Surface*));
+  for(i=0;i<List_Nbr(loops);i++){
+    List_Read(loops,i,&iLoop);
+    if(!(sl = FindSurfaceLoop(iLoop,THEM)))
+      Msg(ERROR, "Unknown Surface Loop %d", iLoop);
+    else{
+      for(j=0;j<List_Nbr(sl->Surfaces);j++){
+	List_Read(sl->Surfaces,j,&is);
+	if(!(s = FindSurface(abs(is),THEM)))
+	  Msg(ERROR, "Unknown Surface %d", is);
+	else
+	  List_Add (v->Surfaces, &s);
+      }
+    }
+  }
+  Tree_Add(M->Volumes,&v);
+}
+
+
+void Cdbz101(int izon, int typzon,int o1, int o2, int nbu, int nbv,
+                int support, List_T *ListCP, List_T *liste,
+                List_T *intlist){
+
+  int      i,j;
+  double   f;
+  List_T *templist;
+
+  if(liste){
+    templist = List_Create(4,1,sizeof(int));
+    for(i=0;i<List_Nbr(liste);i++){
+      List_Read (liste, i, &f);
+      j = (int)f;
+      List_Add(templist,&j);
+    }
+  }
+  else if (intlist){
+    templist = intlist;
+  }
+
+  if(typzon == MSH_SURF_REGL || typzon == MSH_SURF_TRIC ||
+     typzon == MSH_SURF_PLAN || typzon == MSH_SURF_TRIMMED ||
+     typzon == MSH_SURF_NURBS ){
+    CreateSurfaceFromOldCrappyDatabase (izon, typzon, o1,o2, nbu, nbv,
+                                        support, ListCP,templist,THEM);
+  }
+  else if(typzon == MSH_SURF_LOOP){
+    Add_SurfaceLoop(izon,templist,THEM);
+  }
+  else  if(typzon == MSH_SEGM_LOOP){
+    Add_EdgeLoop(izon,templist,THEM);
+  }
+  else  if(typzon == MSH_VOLUME){
+    CreateVolumeFromOldCrappyDatabase (izon,templist,THEM);
+  }
+  else{
+    Add_PhysicalGroup(izon,typzon,templist,THEM);
+  }
+}
+
+void CreateNurbsSurfaceSupport (int Num , int Order1, int Order2 ,
+                                List_T *List, List_T *ku, List_T *kv){
+  
+  List_T *ListOfDouble_L;
+  List_T *ListCP;
+  int i,j,Nv,Nu,N;
+  Surface *s;
+  double d;
+  float f;
+  ListCP  = List_Create(2,2,sizeof(int));
+  
+  for(j=0;j<List_Nbr(List);j++){
+    List_Read(List,j,&ListOfDouble_L);
+    for(i=0;i<List_Nbr(ListOfDouble_L);i++){
+      List_Read(ListOfDouble_L,i,&d);
+      N = (int)d;
+      List_Add(ListCP,&N);
+    }
+  }
+  List_Read(List,0,&ListOfDouble_L);
+  Nu = List_Nbr(List);
+  Nv = List_Nbr(ListOfDouble_L);
+  Cdbz101(Num,MSH_SURF_NURBS,Order1,Order2,Nv,Nu,0,ListCP,NULL,NULL);
+
+  if(!(s = FindSurface(Num,THEM)))
+    Msg(ERROR, "Unknown Surface Loop %d", Num);
+  else{
+    s->ku = (float*)malloc(List_Nbr(ku)*sizeof(float));
+    s->kv = (float*)malloc(List_Nbr(kv)*sizeof(float));
+    s->Support = NULL;
+  
+    double kumin = 0., kumax = 1.;
+    double kvmin = 0., kvmax = 1.;
+    /*
+      List_Read(ku,0,&kumin);
+      List_Read(ku,List_Nbr(ku)-1,&kumax);
+      List_Read(kv,0,&kvmin);
+      List_Read(kv,List_Nbr(kv)-1,&kvmax);
+    */
+    
+    for(i=0;i<List_Nbr(ku);i++){
+      List_Read(ku,i,&d);
+      f = (float) ((d-kumin)/(kumax-kumin));
+      s->ku[i] = f;
+    }
+    for(i=0;i<List_Nbr(kv);i++) {
+      List_Read(kv,i,&d);
+      f = (float) ((d-kvmin)/(kvmax-kvmin));
+      s->kv[i] = f;
+    }
+  }
+
+  List_Delete(ListCP);
+}
+
+void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List,
+                         List_T *ku, List_T *kv ){
+  List_T *ListOfDouble_L;
+  List_T *Listint,*ListCP;
+  int i,j,Loop[4],N,Nu,Nv;
+  double d;
+  int TypLine = MSH_SEGM_NURBS;
+  Curve *cc;
+  
+  Listint = List_Create(2,2,sizeof(int));
+  ListCP  = List_Create(2,2,sizeof(int));
+
+  double kumin, kumax;
+  List_Read(ku,0,&kumin);
+  List_Read(ku,List_Nbr(ku)-1,&kumax);
+  double kvmin, kvmax;
+  List_Read(kv,0,&kvmin);
+  List_Read(kv,List_Nbr(kv)-1,&kvmax);
+  for(j=0;j<List_Nbr(List);j++){
+    List_Read(List,j,&ListOfDouble_L);
+    for(i=0;i<List_Nbr(ListOfDouble_L);i++){
+      List_Read(ListOfDouble_L,i,&d);
+      N = (int)d;
+      List_Add(ListCP,&N);
+    }
+  }
+  
+  List_Read(List,0,&ListOfDouble_L);
+  Nu = List_Nbr(List);
+  Nv = List_Nbr(ListOfDouble_L);
+  
+  for(i=0;i<List_Nbr(ListOfDouble_L);i++){
+    List_Read(ListOfDouble_L,i,&d);
+    j = (int)d;
+    List_Add(Listint,&j);
+  }
+  if(recognize_seg(TypLine,Listint,&Loop[0])){
+  }
+  else{
+    Loop[0] = NEWREG();
+    Cdbseg101(Loop[0],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL);
+    if(!(cc = FindCurve(Loop[0],THEM)))
+      Msg(ERROR, "Unknown Curve %d", Loop[0]);
+    else{
+      cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float));
+      for(i=0;i<List_Nbr(ku);i++){
+	List_Read(ku,i,&d);
+	cc->k[i] = (float)d/*((d-kumin)/(kumax-kumin))*/;
+      }
+    }
+  }
+  List_Reset(Listint);
+  
+  List_Read(List,List_Nbr(List)-1,&ListOfDouble_L);
+  for(i=0;i<List_Nbr(ListOfDouble_L);i++){
+    List_Read(ListOfDouble_L,i,&d);
+    j = (int)d;
+    List_Add(Listint,&j);
+  }
+  if(recognize_seg(TypLine,Listint,&Loop[2])){
+  }
+  else{
+    Loop[2] = NEWREG();
+    Cdbseg101(Loop[2],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL);
+    if(!(cc = FindCurve(Loop[2],THEM)))
+      Msg(ERROR, "Unknown Curve %d", Loop[2]);
+    else{
+      cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float));
+      for(i=0;i<List_Nbr(ku);i++){
+	List_Read(ku,i,&d);
+	cc->k[i] = (float)d/*((d-kumin)/(kumax-kumin))*/;
+      }
+    }
+  }
+  List_Reset(Listint);
+  
+  List_T *List1 = List_Create(List_Nbr(List),1,sizeof(double));
+  List_T *List2 = List_Create(List_Nbr(List),1,sizeof(double));
+  
+  for(i=0;i<List_Nbr(List);i++){
+    List_Read(List,i,&ListOfDouble_L);
+    List_Add(List1,List_Pointer(ListOfDouble_L,0));
+    List_Add(List2,List_Pointer(ListOfDouble_L,List_Nbr(ListOfDouble_L)-1));
+  }
+  
+  for(i=0;i<List_Nbr(List1);i++){
+    List_Read(List1,i,&d);
+    j = (int)d;
+    List_Add(Listint,&j);
+  }
+  if(recognize_seg(TypLine,Listint,&Loop[1])){
+  }
+  else{
+    Loop[1] = NEWREG();
+    Cdbseg101(Loop[1],TypLine,Order2,List1,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL);
+    if(!(cc = FindCurve(Loop[1],THEM)))
+      Msg(ERROR, "Unknown Curve %d", Loop[1]);
+    else{
+      cc->k = (float*)malloc(4*List_Nbr(kv) * sizeof(float));
+      for(i=0;i<List_Nbr(kv);i++){
+	List_Read(kv,i,&d);
+	cc->k[i] = (float)d/*((d-kvmin)/(kvmax-kvmin))*/;
+      }
+    }
+  }
+  List_Reset(Listint);
+  
+  for(i=0;i<List_Nbr(List2);i++){
+    List_Read(List2,i,&d);
+    j = (int)d;
+    List_Add(Listint,&j);
+  }
+  if(recognize_seg(TypLine,Listint,&Loop[3])){
+  }
+  else{
+    Loop[3] = NEWREG();
+    Cdbseg101(Loop[3],TypLine,Order2,List2,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL);
+    if(!(cc = FindCurve(Loop[3],THEM)))
+      Msg(ERROR, "Unknown Curve %d", Loop[3]);
+    else{
+      cc->k = (float*)malloc(4*List_Nbr(kv)*sizeof(float));
+      for(i=0;i<List_Nbr(kv);i++){
+	List_Read(kv,i,&d);
+	cc->k[i] = (float)d/*((d-kvmin)/(kvmax-kvmin))*/;
+      }
+    }
+  }
+  
+  List_Reset(Listint);
+  List_Delete(List1);
+  List_Reset(List2);
+  double f = (double)-Loop[0];
+  List_Add(List2,&f);
+  f = (double)Loop[1];
+  List_Add(List2,&f);
+  f = (double)Loop[2];
+  List_Add(List2,&f);
+  f = (double)-Loop[3];
+  List_Add(List2,&f);
+  
+  int topnew = NEWREG();
+  CreateNurbsSurfaceSupport (topnew,Order1 , Order2 ,List,ku,kv);
+  j = NEWREG();
+  Cdbz101(j,MSH_SEGM_LOOP,0,0,0,0,0,NULL,List2,NULL);
+  List_Delete(List2);
+  List_Add(Listint,&j);
+  j = NEWREG();
+  Cdbz101(j,MSH_SURF_TRIMMED,Order1,Order2,Nv,Nu,topnew,ListCP,NULL,Listint);
+  List_Delete(Listint);
+  List_Delete(ListCP);
+}
+
diff --git a/Geo/DataBase.h b/Geo/DataBase.h
new file mode 100644
index 0000000000000000000000000000000000000000..addbfb80f39d24687a4d06faa07c4b2480224daf
--- /dev/null
+++ b/Geo/DataBase.h
@@ -0,0 +1,33 @@
+#ifndef _DATABASE_H_
+#define _DATABASE_H_
+
+void Cdbpts101 (int ip, double x, double y, double z, double l, double w);
+void Cdbpts105 (int ip, double x, double y, double z, double l, double w);
+void Cdbseg102 (int iseg, int ip, int newp);
+void Cdbz102 (int izon, int ip, int newp, int oldp);
+void Cdbseg101 (int iseg, int typseg, int degre, List_T * liste, List_T * listint,
+		int, int, double, double, char *, char *, char *);
+void Cdbpts201 (int ip);
+void Cdbseg201 (int ip);
+void Cdbz201 (int ip);
+void Cdbz101 (int izon, int typzon, int o1, int o2, int nbu, int nbv,
+	      int support, List_T * ListCP, List_T * liste, List_T * intlist);
+void CreateNurbsSurface (int Num, int Order1, int Order2, List_T *, List_T *, List_T *);
+void CreateNurbsSurfaceSupport (int Num, int Order2, int Order1, 
+				List_T * List, List_T *, List_T *);
+void Cdbseg301 (int ip);
+void Cdbz301 (int ip);
+void Cdbn101 (int in, double X, double Y, double Z);
+void Cdbe101 (int nElm, int iEnt, int nnoe[4]);
+
+void AddCurveInDataBase (int NumCurve, int TypCurve, int Order, List_T * ControlPoints,
+			 List_T * Knots, int VertexBeg, int VertexEnd, double uBeg,
+			 double uEnd);
+void AddCircleInDataBase (int NumCurve, int TypCurve, List_T * ControlPoints,
+			  double n[3]);
+void AddQuadricSurfaceInDataBase (int Typ, int NumCyl, double zaxis[3], 
+				  double xaxis[3], double center[3],
+				  double radius1, double radius2,
+				  List_T * loops);
+
+#endif
diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ed9f19451d1eb4ea11fbe3145b7ee03dbb5dc8fb
--- /dev/null
+++ b/Geo/ExtrudeParams.cpp
@@ -0,0 +1,93 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "ExtrudeParams.h"
+
+void Projette (double p[3],double mat[3][3]) {
+  double X, Y, Z ;
+
+  X = p[0] * mat[0][0] + p[1] * mat[0][1] + p[2] * mat[0][2];
+  Y = p[0] * mat[1][0] + p[1] * mat[1][1] + p[2] * mat[1][2];
+  Z = p[0] * mat[2][0] + p[1] * mat[2][1] + p[2] * mat[2][2];
+  p[0] = X;
+  p[1] = Y;
+  p[2] = Z;
+}
+
+ExtrudeParams :: ExtrudeParams (int ModeEx){
+  mesh.ExtrudeMesh = false;
+  geo.Mode = ModeEx;
+  mesh.Simplexes = true;
+}
+
+
+void ExtrudeParams :: fill (int ep , double A, double B, double C,
+                            double X, double Y, double Z, double angle){
+  geo.axe[0] = A;
+  geo.axe[1] = B;
+  geo.axe[2] = C;
+  geo.pt[0] = X;
+  geo.pt[1] = Y;
+  geo.pt[2] = Z;
+  geo.angle = angle;
+  geo.Type = ep;
+}
+
+void ExtrudeParams :: Extrude ( int iLayer, int iElemLayer,
+                                double &x, double &y, double &z){
+
+  double dx0,dy0,dz0,dx1,dy1,dz1;
+  double dx,dy,dz;
+  if(!iLayer){
+    dx0=dy0=dz0=0.0;
+    dx1 = mesh.hLayer[0];
+    dy1 = mesh.hLayer[0];
+    dz1 = mesh.hLayer[0];
+  }
+  else{
+    dx0 = mesh.hLayer[iLayer-1];
+    dy0 = mesh.hLayer[iLayer-1];
+    dz0 = mesh.hLayer[iLayer-1];
+    dx1 = mesh.hLayer[iLayer];
+    dy1 = mesh.hLayer[iLayer];
+    dz1 = mesh.hLayer[iLayer];
+  }
+  double t = (double) iElemLayer /(double)mesh.NbElmLayer[iLayer];
+  if(geo.Type){
+    dx = geo.axe[0]*(dx0 + t * (dx1-dx0));
+    dy = geo.axe[1]*(dy0 + t * (dy1-dy0));
+    dz = geo.axe[2]*(dz0 + t * (dz1-dz0));
+    x+=dx;y+=dy;z+=dz;
+  }
+  else{
+    double angle = geo.angle;
+    geo.angle = geo.angle*(dx0 + t * (dx1-dx0));
+    ProtudeXYZ(x,y,z,this);
+    geo.angle = angle;
+  }
+}
+
+void ExtrudeParams :: Rotate(double matr[3][3]){
+  Projette(geo.axe,matr);
+  Projette(geo.pt,matr);
+  geo.angle = -geo.angle;
+}
+
+void ExtrudeParams :: Extrude (double t, double &x, double &y, double &z){
+
+  double dx,dy,dz;
+  if(geo.Type){
+    dx = geo.axe[0]*t;
+    dy = geo.axe[1]*t;
+    dz = geo.axe[2]*t;
+    x+=dx;y+=dy;z+=dz;
+  }
+  else{
+    double angle = geo.angle;
+    geo.angle = geo.angle*t;
+    ProtudeXYZ(x,y,z,this);
+    geo.angle = angle;
+  }
+}
+
diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h
new file mode 100644
index 0000000000000000000000000000000000000000..555451341a882191fc54c825dc36373343345acd
--- /dev/null
+++ b/Geo/ExtrudeParams.h
@@ -0,0 +1,37 @@
+#ifndef _EXTRUDE_PARAMS_H_
+#define _EXTRUDE_PARAMS_H_
+
+#define NB_LAYER_MAX 30
+
+#define EXTRUDED_ENTITY 1
+#define COPIED_ENTITY 2
+
+class ExtrudeParams{
+  public :
+
+    ExtrudeParams(int Mode = EXTRUDED_ENTITY);
+  void fill (int ep,double A, double B, double C,
+	     double X, double Y, double Z, double angle);
+  void Extrude (  int iLayer, int iElemLayer,
+		  double &dx, double &dy, double &dz);
+  void Extrude (double t, double &x, double &y, double &z);
+  void Rotate(double matr[3][3]);
+  struct{
+    bool    ExtrudeMesh;
+    bool    Simplexes;
+    int     NbLayer;
+    int     NbElmLayer [NB_LAYER_MAX];
+    int     ZonLayer   [NB_LAYER_MAX];
+    double  hLayer     [NB_LAYER_MAX];
+  }mesh;
+  struct{
+    int Mode;
+    int Type;
+    int Source;
+    double axe[3];
+    double pt[3];
+    double angle;
+  }geo;
+};
+
+#endif
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..24f7da0cc401b80bbf2254d8bbe80eda9686ff40
--- /dev/null
+++ b/Geo/Geo.cpp
@@ -0,0 +1,543 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "DataBase.h"
+#include "Parser.h"
+
+#define BUFFSIZE 32000
+
+char x_text[100]  = "0.0", y_text[100]  = "0.0", z_text[100]  = "0.0";
+char l_text[100] = "1.0" ;
+char tx_text[100] = "0.0", ty_text[100] = "0.0", tz_text[100] = "0.0";
+char attrx_text[100] = "1.0", attry_text[100] = "1.0", attrz_text[100] = "1.0" ;
+char attrdec_text[100] = "2.0";
+char px_text[100] = "0.0", py_text[100] = "0.0", pz_text[100] = "0.0" ;
+char angle_text[100] = "3.14159/2" ;
+char ax_text[100] = "0.0", ay_text[100] = "0.0", az_text[100] = "1.0";
+char dx_text[100] = "0.0", dy_text[100] = "0.0", dz_text[100] = "0.0";
+char df_text[100] = "1.0";
+char nb_pts[100] ="10", mode_value[100] = "1";
+char trsf_pts_text[100] = "2", trsf_type_text[100] = "Power 1.0";
+char trsf_vol_text[100] = "1";
+char char_length_text[100] = "1.0";
+
+int Mode_Transfinite = 0;
+
+double evaluate_scalarfunction (char *var, double val, char *funct){
+  FILE *tempf;
+  tempf = yyin;
+  yyin = fopen("gmsh.tmp","w");
+
+  /* On pose la variable = la fonction et on evalue la fonction */
+
+  fprintf(yyin,"%s = %g ;\n",var,val);
+  fprintf(yyin,"ValeurTemporaire__ = %s ;\n",funct);
+  fclose(yyin);
+  yyin = fopen("gmsh.tmp","r");
+  while(!feof(yyin)){
+    yyparse();
+  }
+  fclose(yyin);
+  Symbol TheSymbol;
+  TheSymbol.Name = (char*)malloc(100);
+  strcpy(TheSymbol.Name,"ValeurTemporaire__");
+  yyin = tempf;
+  if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) {
+    free(TheSymbol.Name);
+    return 0.0;
+  }
+  free(TheSymbol.Name);
+  return TheSymbol.val;
+}
+
+#ifndef _UNIX
+extern AddALineInTheEditGeometryForm (char* line);
+#endif
+
+void add_infile(char *text, char *fich){
+  FILE *file;
+
+  yyin = fopen("gmsh.tmp","w");
+  file = fopen(fich,"a");
+  fprintf(yyin,"%s\n",text);
+  fclose(yyin);
+  yyin = fopen("gmsh.tmp","r");
+  while(!feof(yyin)){
+    yyparse();
+  }
+  fclose(yyin);
+  fprintf(file,"%s\n",text);
+  fclose(file);
+#ifndef _UNIX
+  AddALineInTheEditGeometryForm (text);
+#endif
+}
+
+void del_pnt(int p1, char *fich){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Delete {\n Point(%d);\n}",p1);
+  add_infile(text,fich);
+}
+
+void del_seg(int p1, char *fich){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Delete {\n Line(%d);\n}",p1);
+  add_infile(text,fich);
+}
+
+void del_srf(int p1, char *fich){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Delete {\n Surface(%d);\n}",p1);
+  add_infile(text,fich);
+}
+
+void add_trsfsurf (int N, int *l, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+  sprintf(text,"Transfinite Surface {%d} = {",l[0]);
+  for(i=1;i<N;i++){
+    if(i==1)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  sprintf(text2,"};");
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+void add_ellipticsurf (int N, int *l, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+  sprintf(text,"Elliptic Surface {%d} = {",l[0]);
+  for(i=1;i<N;i++){
+    if(i==1)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  sprintf(text2,"};");
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+void add_charlength (int N, int *l, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+  sprintf(text,"Characteristic Length {");
+  for(i=0;i<N;i++){
+    if(i==0)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  sprintf(text2,"} = %s;", char_length_text);
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+void add_recosurf (int N, int *l, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+  sprintf(text,"Recombine Surface {");
+  for(i=0;i<N;i++){
+    if(i==0)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  sprintf(text2,"};");
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+
+void add_trsfline (int N, int *l, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+  sprintf(text,"Transfinite Line {");
+  for(i=0;i<N;i++){
+    if(!i)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  if(Mode_Transfinite == 0)
+    sprintf(text2,"} = %s;",nb_pts);
+  else if(Mode_Transfinite == 2)
+    sprintf(text2,"} = %s Using Bump %s;",nb_pts,mode_value);
+  else if(Mode_Transfinite == 1)
+   sprintf(text2,"} = %s Using Power %s;",nb_pts,mode_value);
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+
+void add_param (char *par, char *value, char *fich){
+  char text[BUFFSIZE];
+  sprintf(text,"%s = %s;",par,value);
+  add_infile(text,fich);
+}
+
+void add_point(char *fich){
+  char text[BUFFSIZE];
+  int ip;
+
+  ip = NEWPOINT();
+  sprintf(text,"Point(%d) = {%s,%s,%s,%s};",ip,x_text,y_text,z_text,l_text);
+  add_infile(text,fich);
+}
+
+void add_attractor(char *fich, int ip, int typ){
+  char text[BUFFSIZE];
+  if(typ == 0) {
+    sprintf(text,"Attractor Point (%s,%s,%s) = {%d};",
+	    attrx_text,attry_text,attrdec_text,ip);
+  }
+  else if(typ == 1){
+    sprintf(text,"Attractor Line (%s,%s,%s) = {%d};",
+	    attrx_text,attry_text,attrdec_text,ip);
+  }
+  else if(typ == 2) {
+    sprintf(text,"Attractor Surface (%s,%s,%s) = {%d};",
+	    attrx_text,attry_text,attrdec_text,ip);
+  }
+  add_infile(text,fich);
+}
+
+
+void add_line(int p1, int p2, char *fich){
+  char text[BUFFSIZE];
+  int iseg;
+  List_T *list = List_Create(2,2,sizeof(int));
+  List_Add(list,&p1);
+  List_Add(list,&p2);
+  if((recognize_seg(MSH_SEGM_LINE,list,&iseg))){
+    List_Delete(list);
+    return;
+  }
+  List_Delete(list);
+  
+  sprintf(text,"Line(%d) = {%d,%d};",NEWREG(),p1,p2);
+  add_infile(text,fich);
+}
+
+void add_circ(int p1, int p2, int p3, char *fich){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Circle(%d) = {%d,%d,%d};",NEWREG(),p1,p2,p3);
+  add_infile(text,fich);
+}
+
+void add_ell(int p1, int p2, int p3, int p4, char *fich){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Ellipsis(%d) = {%d,%d,%d,%d};",NEWREG(),p1,p2,p3,p4);
+  add_infile(text,fich);
+}
+
+void add_spline(int N, int *p, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+
+  sprintf(text,"CatmullRom(%d) = {",NEWREG());
+  for(i=0;i<N;i++){
+    if(i != N-1)
+      sprintf(text2,"%d,",p[i]);
+    else
+      sprintf(text2,"%d};",p[i]);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+void add_bezier(int N, int *p, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+
+  sprintf(text,"Bezier(%d) = {",NEWREG());
+  for(i=0;i<N;i++){
+    if(i != N-1)
+      sprintf(text2,"%d,",p[i]);
+    else
+      sprintf(text2,"%d};",p[i]);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+
+void add_bspline(int N, int *p, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+
+  sprintf(text,"BSpline(%d) = {",NEWREG());
+  for(i=0;i<N;i++){
+    if(i != N-1)
+      sprintf(text2,"%d,",p[i]);
+    else
+      sprintf(text2,"%d};",p[i]);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+void add_multline(int N, int *p, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i;
+
+  int iseg;
+  List_T *list = List_Create(N,2,sizeof(int));
+  for(i=0;i<N;i++)
+    List_Add(list,&p[i]);
+  if((recognize_seg(MSH_SEGM_LINE,list,&iseg))){
+    List_Delete(list);
+    return;
+  }
+  List_Delete(list);
+
+  sprintf(text,"Line(%d) = {",NEWREG());
+  for(i=0;i<N;i++){
+    if(i != N-1)
+      sprintf(text2,"%d,",p[i]);
+    else
+      sprintf(text2,"%d};",p[i]);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+
+int recognize_zone(int ityp,List_T *list){
+  return 0 ;
+}
+
+void add_loop(List_T *list, char *fich, int *numloop){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i,seg;
+
+  if((recognize_loop(list,numloop))) return;
+
+  *numloop = NEWREG();
+  sprintf(text,"Line Loop(%d) = {",NEWREG());
+  for(i=0;i<List_Nbr(list);i++){
+      List_Read(list,i,&seg);
+    if(i != List_Nbr(list)-1)
+      sprintf(text2,"%d,",seg);
+    else
+      sprintf(text2,"%d};",seg);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+
+void add_surf(List_T *list, char *fich, int support, int typ){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i,seg;
+
+  if((i = recognize_zone(MSH_SURF_PLAN,list)) != 0)return;
+  if((i = recognize_zone(MSH_SURF_REGL,list)) != 0)return;
+  if((i = recognize_zone(MSH_SURF_TRIMMED,list)) != 0)return;
+
+  if(typ ==1){
+    sprintf(text,"Ruled Surface(%d) = {",NEWREG());
+  }
+  else if (typ == 2){
+    sprintf(text,"Plane Surface(%d) = {",NEWREG());
+  }
+  else
+  {
+    sprintf(text,"Trimmed Surface(%d) = %d {",NEWREG(),support);
+  }
+  for(i=0;i<List_Nbr(list);i++){
+      List_Read(list,i,&seg);
+    if(i != List_Nbr(list)-1)
+      sprintf(text2,"%d,",seg);
+    else
+      sprintf(text2,"%d};",seg);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+void add_vol(List_T *list, char *fich, int *numvol){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i,seg;
+
+  if((recognize_surfloop(list,numvol))) return;
+
+  *numvol = NEWREG();
+  sprintf(text,"Surface Loop(%d) = {",*numvol);
+  for(i=0;i<List_Nbr(list);i++){
+    List_Read(list,i,&seg);
+    if(i != List_Nbr(list)-1)
+      sprintf(text2,"%d,",seg);
+    else
+      sprintf(text2,"%d};",seg);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+void add_multvol(List_T *list, char *fich){
+  char text[BUFFSIZE];
+  char text2[BUFFSIZE];
+  int i,seg;
+
+  if((i= recognize_zone(MSH_VOLUME,list)))return;
+  
+  sprintf(text,"Complex Volume(%d) = {",NEWREG());
+  for(i=0;i<List_Nbr(list);i++){
+    List_Read(list,i,&seg);
+    if(i != List_Nbr(list)-1)
+      sprintf(text2,"%d,",seg);
+    else
+      sprintf(text2,"%d};",seg);
+    strcat(text,text2);
+  }
+  add_infile(text,fich);
+}
+
+void add_trsfvol(int N, int *l, char *fich){
+  char text[TEXT_BUFFER_SIZE], text2[TEXT_BUFFER_SIZE];
+  int i;
+
+  sprintf(text,"Transfinite Volume{%s} = {", trsf_vol_text);
+  for(i=0;i<N;i++){
+    if(i==0)sprintf(text2,"%d ",l[i]);
+    else sprintf(text2,",%d ",l[i]);
+    strcat(text,text2);
+  }
+  sprintf(text2,"};");
+  strcat(text,text2);
+  add_infile(text,fich);
+}
+
+
+void add_physical_entity(List_T *list, char *fich, int type, int *num){
+  char text[BUFFSIZE], text2[BUFFSIZE];
+  int  i, elementary_entity;
+
+  if(((*num) = recognize_zone(MSH_PHYSICAL_LINE,list))) return;
+  if(((*num) = recognize_zone(MSH_PHYSICAL_SURFACE,list))) return;
+  if(((*num) = recognize_zone(MSH_PHYSICAL_VOLUME,list))) return;
+
+  *num = NEWREG();
+  if (type == 1)
+    sprintf(text, "Physical Line(%d) = {", *num);
+  else if (type == 2)
+    sprintf(text, "Physical Surface(%d) = {", *num);
+  else if (type == 0)
+    sprintf(text, "Physical Point(%d) = {", *num);
+  else
+    sprintf(text, "Physical Volume(%d) = {", *num);
+
+  for(i=0; i<List_Nbr(list); i++){
+    List_Read(list, i, &elementary_entity);
+    if(i != List_Nbr(list)-1)
+      sprintf(text2, "%d,", elementary_entity);
+    else
+      sprintf(text2, "%d};", elementary_entity);
+    strcat(text, text2);
+  }
+  add_infile(text, fich);
+}
+
+void extrude(int s, char *fich, char *what){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Extrude %s (%d, {%s,%s,%s});",what,s,tx_text,ty_text,tz_text);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+void translate_seg(int add, int s, char *fich){
+  char text[BUFFSIZE];
+
+  if(add)
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Duplicata { Line(%d); }\n}",
+	    tx_text,ty_text,tz_text,s);
+  else
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Line(%d);\n}",
+	    tx_text,ty_text,tz_text,s);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+
+void translate_surf(int add, int s, char *fich){
+  char text[BUFFSIZE];
+
+  if(add)
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Duplicata { Surface(%d); }\n}",
+	    tx_text,ty_text,tz_text,s);
+  else
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Surface(%d);\n}",
+	    tx_text,ty_text,tz_text,s);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+void translate_pt(int add, int s, char *fich){
+  char text[BUFFSIZE];
+
+  if(add)
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Duplicata { Point(%d); }\n}",
+	    tx_text,ty_text,tz_text,s);
+  else
+    sprintf(text,"Translate({%s,%s,%s}) {\n  Point(%d);\n}",
+	    tx_text,ty_text,tz_text,s);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+void rotate(int add, int s, char *fich, char *quoi){
+  char text[BUFFSIZE];
+
+  if(add)
+    sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n  Duplicata { %s(%d); }\n}",
+	    ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s);
+  else
+    sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n   %s(%d);\n  }",
+	    ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+void dilate(int add, int s, char *fich, char *quoi){
+  char text[BUFFSIZE];
+
+  if(add)
+    sprintf(text,"Dilate({%s,%s,%s},%s) {\n  Duplicata { %s(%d); }\n}",
+	    dx_text,dy_text,dz_text,df_text, quoi,s);
+  else
+    sprintf(text,"Dilate({%s,%s,%s},%s) {\n   %s(%d);\n  }",
+	    dx_text,dy_text,dz_text,df_text, quoi,s);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+
+void protude(int s, char *fich, char *what){
+  char text[BUFFSIZE];
+
+  sprintf(text,"Extrude %s(%d, {%s,%s,%s}, {%s,%s,%s}, %s);",what,s,ax_text,ay_text,
+	  az_text,px_text,py_text,pz_text,angle_text);
+  add_infile(text,fich);
+  add_infile("Coherence;",fich);
+}
+
+
+
diff --git a/Geo/Geo.h b/Geo/Geo.h
new file mode 100644
index 0000000000000000000000000000000000000000..c32f7de66e54abd66f23042c18aa66601990da99
--- /dev/null
+++ b/Geo/Geo.h
@@ -0,0 +1,113 @@
+#ifndef _GEO_H_
+#define _GEO_H_
+
+#define ELEMENTARY 1
+#define PHYSICAL   2
+
+#define INFILE     1
+#define INSTRING   2
+#define STRINGMAX  1024
+
+#define NMAX_SPLINE   100
+
+#define ENT_POINT    1
+#define ENT_LINE     2
+#define ENT_SURFACE  3
+#define ENT_VOLUME   4
+
+#define MSH_TRSF_LINE        1
+#define MSH_TRSF_SURFACE     2
+#define MSH_TRSF_VOLUME      3
+
+#define MSH_ASSOCIATION      6
+
+#define MSH_RECOMBINE        5
+
+#define MSH_POINT            1
+
+#define MSH_SEGM_LINE        2
+#define MSH_SEGM_SPLN        3
+#define MSH_SEGM_CIRC        4
+#define MSH_SEGM_CIRC_INV    5
+#define MSH_SEGM_ELLI        6
+#define MSH_SEGM_ELLI_INV    7
+#define MSH_SEGM_LOOP        8
+#define MSH_SEGM_PARAMETRIC  888
+#define MSH_SEGM_MERGEDSEGS  889
+
+#define MSH_SURF_PLAN        9
+#define MSH_SURF_REGL        10
+#define MSH_SURF_TRIC        11
+#define MSH_SURF_NURBS       12
+#define MSH_SURF_LOOP        13
+#define MSH_SURF_CYLNDR      1299
+#define MSH_SURF_TORUS       1399
+#define MSH_SURF_CONE        1499
+#define MSH_SURF_TRIMMED     1599
+#define MSH_SURF_STL         1599
+
+#define MSH_VOLUME		     14
+#define MSH_SEGM_BSPLN       15
+#define MSH_SEGM_URBS        16
+#define MSH_SEGM_NURBS       17
+#define MSH_SEGM_BEZIER      18
+
+#define MSH_PHYSICAL_POINT   300
+#define MSH_PHYSICAL_LINE    310
+#define MSH_PHYSICAL_SURFACE 320
+#define MSH_PHYSICAL_VOLUME  330
+
+typedef struct {
+  int Type;
+  int Num;
+  union {
+    int I;
+    double F;
+    double V[4];
+    List_T *ListDouble;
+  } obj;
+} Shape;
+
+
+double evaluate_scalarfunction (char *var, double val, char *funct);
+
+void del_pnt(int p1, char *fich);
+void del_seg(int p1, char *fich);
+void del_srf(int p1, char *fich);
+
+void add_infile(char *text, char *fich);
+void add_trsfsurf (int N, int *l, char *fich);
+void add_trsfvol (int N, int *l, char *fich);
+void add_ellipticsurf (int N, int *l, char *fich);
+void add_charlength (int N, int *l, char *fich);
+void add_recosurf (int N, int *l, char *fich);
+void add_trsfline (int N, int *l, char *fich);
+void add_param (char *par, char *value, char *fich);
+void add_point(char *fich);
+void add_attractor(char *fich, int ip, int typ);
+void add_line(int p1, int p2, char *fich);
+void add_circ(int p1, int p2, int p3, char *fich);
+void add_ell(int p1, int p2, int p3, int p4, char *fich);
+void add_spline(int N, int *p, char *fich);
+void add_bezier(int N, int *p, char *fich);
+void add_bspline(int N, int *p, char *fich);
+void add_multline(int N, int *p, char *fich);
+
+int recognize_zone(int ityp,List_T *list);
+
+void add_loop(List_T *list, char *fich, int *numloop);
+void add_surf(List_T *list, char *fich, int support, int typ);
+void add_vol(List_T *list, char *fich, int *numvol);
+void add_multvol(List_T *list, char *fich);
+void add_physical_entity(List_T *list, char *fich, int type, int *num);
+
+void extrude(int s, char *fich, char *what);
+void translate_seg(int add, int s, char *fich);
+void translate_surf(int add, int s, char *fich);
+void translate_pt(int add, int s, char *fich);
+void rotate(int add, int s, char *fich, char *quoi);
+void dilate(int add, int s, char *fich, char *quoi);
+void protude(int s, char *fich, char *what);
+
+
+#endif
diff --git a/Geo/Makefile b/Geo/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d1d252f8700cbee6fa86288ac031c214c4a667be
--- /dev/null
+++ b/Geo/Makefile
@@ -0,0 +1,94 @@
+#
+# Makefile for "libGeo.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g -Wall
+
+OS_FLAGS  = -D_UNIX
+
+RANLIB   = /usr/bin/ranlib
+RM       = rm
+RMFLAGS  = -f
+
+LIB         = ../lib/libGeo.a
+INCLUDE     = -I../Common -I../DataStr -I../Geo -I../Mesh -I../Parser -I../Unix
+
+CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE)
+
+SRC =  	CAD.cpp \
+        DataBase.cpp \
+        MinMax.cpp \
+        ExtrudeParams.cpp \
+        Geo.cpp \
+        StepGeomDatabase.cpp \
+	Verif.cpp \
+        Print_Geo.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ)
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+CAD.o: CAD.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h DataBase.h \
+  ../Mesh/Interpolation.h ../Mesh/Numeric.h ../Common/Const.h \
+  ../Mesh/Create.h CAD.h
+DataBase.o: DataBase.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h CAD.h ../Mesh/Create.h Verif.h
+MinMax.o: MinMax.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Mesh/Vertex.h \
+  ../Common/Context.h
+ExtrudeParams.o: ExtrudeParams.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Geo.h CAD.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ExtrudeParams.h
+Geo.o: Geo.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/Const.h Geo.h CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
+  ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Mesh/Metric.h DataBase.h ../Parser/Parser.h
+StepGeomDatabase.o: StepGeomDatabase.cpp ../Common/Gmsh.h \
+  ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \
+  ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h Geo.h \
+  StepGeomDatabase.h DataBase.h
+Verif.o: Verif.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Geo.h CAD.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h DataBase.h
+Print_Geo.o: Print_Geo.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Geo.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h CAD.h
diff --git a/Geo/MinMax.cpp b/Geo/MinMax.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a49df54ddc7f3c916f63c41feab90ff9c601c103
--- /dev/null
+++ b/Geo/MinMax.cpp
@@ -0,0 +1,108 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Vertex.h"
+#include "Context.h"
+
+extern Context_T    CTX ;
+
+extern double       LC, MiddleLC;
+extern int          LC_ORDER;
+
+/* ------------------------------------------------------------------------ */
+/*  m i n m a x                                                             */
+/* ------------------------------------------------------------------------ */
+
+void minmax(void *a , void*b){
+  Vertex *v;
+  v = *(Vertex**)a;
+  CTX.min[0] = (CTX.min[0] < v->Pos.X) ? CTX.min[0] : v->Pos.X;
+  CTX.max[0] = (CTX.max[0] > v->Pos.X) ? CTX.max[0] : v->Pos.X;
+  CTX.min[1] = (CTX.min[1] < v->Pos.Y) ? CTX.min[1] : v->Pos.Y;
+  CTX.max[1] = (CTX.max[1] > v->Pos.Y) ? CTX.max[1] : v->Pos.Y;
+  CTX.min[2] = (CTX.min[2] < v->Pos.Z) ? CTX.min[2] : v->Pos.Z;
+  CTX.max[2] = (CTX.max[2] > v->Pos.Z) ? CTX.max[2] : v->Pos.Z;
+}
+
+void CalculateMinMax (Tree_T *t){
+  Vertex   *v;
+  double   frac;
+  int      exp;
+
+  if(!Tree_Nbr(t)){
+    CTX.min[0] = CTX.min[1] = CTX.min[2] = -1.;
+    CTX.max[0] = CTX.max[1] = CTX.max[2] =  1.;
+    CTX.range[0] = CTX.range[1] = CTX.range[2] = 0.;
+    LC = MiddleLC = 1.;
+    return;
+  }
+
+  Tree_Right(t,&v);
+  CTX.min[0] = CTX.max[0] = v->Pos.X;
+  CTX.min[1] = CTX.max[1] = v->Pos.Y;
+  CTX.min[2] = CTX.max[2] = v->Pos.Z;
+  Tree_Action(t,minmax);
+
+  CTX.range[0] = CTX.max[0]-CTX.min[0]; 
+  CTX.range[1] = CTX.max[1]-CTX.min[1]; 
+  CTX.range[2] = CTX.max[2]-CTX.min[2];
+
+  if(CTX.range[0] == 0. && CTX.range[1] == 0. && CTX.range[2] == 0.){
+    CTX.min[0] -= 1. ; 
+    CTX.min[1] -= 1. ; 
+    CTX.max[0] += 1. ; 
+    CTX.max[1] += 1. ;
+    LC = 1.;
+    MiddleLC = 0.;
+  }
+  else if(CTX.range[0] == 0. && CTX.range[1] == 0.){
+    LC = MiddleLC = CTX.range[2];
+    CTX.min[0] -= LC; 
+    CTX.min[1] -= LC; 
+    CTX.max[0] += LC; 
+    CTX.max[1] += LC;
+  }
+  else if(CTX.range[0] == 0. && CTX.range[2] == 0.){
+    LC = MiddleLC = CTX.range[1];
+    CTX.min[0] -= LC; 
+    CTX.max[0] += LC;   
+  }
+  else if(CTX.range[1] == 0. && CTX.range[2] == 0.){
+    LC = MiddleLC = CTX.range[0];
+    CTX.min[1] -= LC; 
+    CTX.max[1] += LC;   
+  }
+  else if(CTX.range[0] == 0.){ 
+    LC = sqrt(DSQR(CTX.range[1])+DSQR(CTX.range[2]));
+    MiddleLC = DMIN(CTX.range[1], CTX.range[2]);
+    CTX.min[0] -= LC; 
+    CTX.max[0] += LC;
+  }
+  else if(CTX.range[1] == 0.){ 
+    LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[2]));
+    MiddleLC = DMIN(CTX.range[0], CTX.range[2]);
+    CTX.min[1] -= LC; 
+    CTX.max[1] += LC;
+  }
+  else if(CTX.range[2] == 0.){ 
+    LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[1]));
+    MiddleLC = DMIN(CTX.range[0], CTX.range[1]);
+  }
+  else{
+    LC = sqrt(DSQR(CTX.range[0])+DSQR(CTX.range[1])+DSQR(CTX.range[2]));
+    if((CTX.range[1] <= CTX.range[0] && CTX.range[0] <= CTX.range[2]) || 
+       (CTX.range[2] <= CTX.range[0] && CTX.range[0] <= CTX.range[1])) 
+      MiddleLC = CTX.range[0];
+    else if((CTX.range[0] <= CTX.range[1] && CTX.range[1] <= CTX.range[2]) || 
+	    (CTX.range[2] <= CTX.range[1] && CTX.range[1] <= CTX.range[0])) 
+      MiddleLC = CTX.range[1];
+    else
+      MiddleLC = CTX.range[2];
+  }
+
+  /* LC_ORDER : LC == f * 10^LC_ORDER with -1<f<1  */
+
+  frac = frexp(LC, &exp);     
+  LC_ORDER = (int)floor(log10(ldexp(frac,exp)));
+}
+
diff --git a/Geo/MinMax.h b/Geo/MinMax.h
new file mode 100644
index 0000000000000000000000000000000000000000..a2abe8b8b417e78f9b7f2608033c26a0c26cc4a1
--- /dev/null
+++ b/Geo/MinMax.h
@@ -0,0 +1,6 @@
+#ifndef _MINMAX_H_
+#define _MINMAX_H_
+
+void CalculateMinMax (Tree_T *t);
+
+#endif
diff --git a/Geo/Print_Geo.cpp b/Geo/Print_Geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..160e7ed16a2f62563dd1ad04c3cf4c2460e328da
--- /dev/null
+++ b/Geo/Print_Geo.cpp
@@ -0,0 +1,154 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Vertex.h"
+#include "CAD.h"
+
+FILE *FOUT;
+
+void Print_Point(void *a, void *b){
+  Vertex *v;
+  v = *(Vertex**)a;
+  fprintf(FOUT, "Point(%d) = {%g, %gE, %g, %g};\n",
+          v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc);
+}
+
+void Print_Nurbs (Curve *c, FILE *f){
+  int i,j;
+  Vertex *v;
+
+  fprintf(f,"Nurbs (%d) = {",c->Num);
+  for(i=0;i<List_Nbr(c->Control_Points);i++){
+    List_Read(c->Control_Points,i,&v);
+    if(!i)
+      fprintf(FOUT,"%3d",v->Num);
+    else
+      fprintf(FOUT,",%3d",v->Num);
+    if(i%8 == 7 && i!=List_Nbr(c->Control_Points)-1)fprintf(FOUT,"\n");
+  }
+  fprintf(f,"}\n");
+  fprintf(f,"Knots {");
+  for(j=0;j<List_Nbr(c->Control_Points)+c->degre+1;j++){
+    if(!j)fprintf(f,"%12.5E",c->k[j]);
+    else fprintf(f,",%12.5E",c->k[j]);
+    if(j%5 == 4 && j!=List_Nbr(c->Control_Points)+c->degre)fprintf(FOUT,"\n");
+  }
+  fprintf(f,"}");
+  fprintf(f,"Order %3d;\n\n",c->degre);
+}
+
+void Print_Curve(void *a, void *b){
+  Curve *c;
+  Vertex *v;
+  int i;
+  c = *(Curve**)a;
+
+  if(c->Num < 0)return;
+
+  switch(c->Typ){
+  case MSH_SEGM_LINE:
+    fprintf(FOUT,"Line (%d) = ",c->Num);
+    break;
+  case MSH_SEGM_CIRC:
+    fprintf(FOUT,"Circle (%d) = ",c->Num);
+    break;
+  case MSH_SEGM_NURBS:
+    Print_Nurbs(c,FOUT);
+    return;
+  case MSH_SEGM_SPLN:
+    fprintf(FOUT,"CatmullRom (%d) = ",c->Num);
+    break;
+  }
+  
+  for(i=0;i<List_Nbr(c->Control_Points);i++){
+    List_Read(c->Control_Points,i,&v);
+    if(i)
+      fprintf(FOUT,",%d",v->Num);
+    else
+      fprintf(FOUT,"{%d",v->Num);
+    if(i%6 == 7)fprintf(FOUT,"\n");
+  }
+  if(c->Typ != MSH_SEGM_CIRC)
+    fprintf(FOUT,"};\n");
+  else
+    fprintf(FOUT,"} Plane{%12.5E,%12.5E,%12.5E};\n",
+            c->Circle.n[0],c->Circle.n[1],c->Circle.n[2]);
+  
+}
+
+void Print_Surface(void *a, void *b){
+  Curve *c;
+  Surface *s;
+  Vertex *v;
+  int i,j;
+  s = *(Surface**)a;
+
+  int NUMLOOP = s->Num + 1000000;
+
+  if(s->Typ != MSH_SURF_NURBS){
+    fprintf(FOUT,"Line Loop (%d) = ",NUMLOOP);
+    
+    for(i=0;i<List_Nbr(s->s.Generatrices);i++){
+      List_Read(s->s.Generatrices,i,&c);
+      if(i)
+        fprintf(FOUT,",%3d",c->Num);
+      else
+        fprintf(FOUT,"{%3d",c->Num);
+    }
+    fprintf(FOUT,"};\n");
+  }
+
+  switch(s->Typ){
+  case MSH_SURF_REGL:
+    fprintf(FOUT,"Ruled Surface (%d) = {%d};\n",s->Num,NUMLOOP);
+    break;
+  case MSH_SURF_PLAN:
+    fprintf(FOUT,"Plane Surface (%d) = {%d};\n",s->Num,NUMLOOP);
+    break;
+  case MSH_SURF_TRIMMED:
+    fprintf(FOUT,"Trimmed Surface (%d) = %d {%d};\n",s->Num,s->Support->Num,NUMLOOP);
+    break;
+  case MSH_SURF_NURBS:
+    fprintf(FOUT,"Nurbs Surface (%d) = {\n",s->Num);
+    for(i=0;i<s->Nv;i++){
+      fprintf(FOUT,"\t\t{");
+      for(j=0;j<s->Nu;j++){
+        List_Read(s->Control_Points,j+s->Nu *i,&v);
+        if(!j)
+          fprintf(FOUT,"%3d",v->Num);
+        else
+          fprintf(FOUT,",%3d",v->Num);
+      }
+      if(i!=s->Nv-1)
+        fprintf(FOUT,"},\n");
+      else
+        fprintf(FOUT,"}}\n");
+    }
+    fprintf(FOUT,"\t\tKnots\n\t\t{");
+    for(j=0;j<s->Nu+s->OrderU+1;j++){
+      if(!j)fprintf(FOUT,"%12.5E",s->ku[j]);
+      else fprintf(FOUT,",%12.5E",s->ku[j]);
+      if(j%5 == 4 && j!=s->Nu + s->OrderU)fprintf(FOUT,"\n\t\t");
+    }
+    fprintf(FOUT,"}\n\t\t{");
+    for(j=0;j<s->Nv+s->OrderV+1;j++){
+      if(!j)fprintf(FOUT,"%12.5E",s->kv[j]);
+      else fprintf(FOUT,",%12.5E",s->kv[j]);
+      if(j%5 == 4 && j!=s->Nv + s->OrderV)fprintf(FOUT,"\n\t\t");
+    }
+    fprintf(FOUT,"}\n\t\tOrder %3d %3d;\n\n",s->OrderU,s->OrderV);
+    break;
+  }
+}
+
+void Print_Geo(Mesh *M, char *filename){
+  Coherence_PS();
+  FOUT = fopen(filename,"w");
+  if(!FOUT)return;
+  Tree_Action(M->Points,Print_Point);
+  Tree_Action(M->Curves,Print_Curve);
+  Tree_Action(M->Surfaces,Print_Surface);
+  fclose(FOUT);
+}
+
diff --git a/Geo/Print_Geo.h b/Geo/Print_Geo.h
new file mode 100644
index 0000000000000000000000000000000000000000..4b6de6998483c6aa332c648c103c046471d1423d
--- /dev/null
+++ b/Geo/Print_Geo.h
@@ -0,0 +1,7 @@
+#ifndef _PRINT_GEO_H_
+#define _PRINT_GEO_H_
+
+void Print_Geo(Mesh *M, char *filename);
+
+
+#endif
diff --git a/Geo/StepGeomDatabase.cpp b/Geo/StepGeomDatabase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b2a39b63595495c6bf5cdd1c4a2d15dd6657c28
--- /dev/null
+++ b/Geo/StepGeomDatabase.cpp
@@ -0,0 +1,674 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "StepGeomDatabase.h"
+#include "DataBase.h"
+
+#define MAX(A,B) ((A)<(B))?(B):(A);
+#define MIN(A,B) ((A)<(B))?(A):(B);
+#define SQR(A) (A)*(A)
+
+extern double LC ;
+
+static Step_Solid_BRep_t *BREP=NULL;
+
+Step_Solid_BRep_t *Create_Step_Solid_BRep(void){
+  Step_Solid_BRep_t *NEWBREP;
+  NEWBREP                       = (Step_Solid_BRep_t *)Malloc(sizeof(Step_Solid_BRep_t));
+  NEWBREP->AllDirections        = List_Create(10,10,sizeof(Step_Direction_t));
+  NEWBREP->AllVectors           = List_Create(10,10,sizeof(Step_Vector_t));
+  NEWBREP->AllCartesian_Points  = List_Create(10,10,sizeof(Step_Cartesian_Point_t));
+  NEWBREP->AllVertex_Points     = List_Create(10,10,sizeof(Step_Vertex_Point_t));
+  NEWBREP->AllCurves            = List_Create(10,10,sizeof(Step_Curve_t));
+  NEWBREP->AllSurfaces          = List_Create(10,10,sizeof(Step_Surface_t));
+  NEWBREP->AllClosed_Shells     = List_Create(10,10,sizeof(Step_Closed_Shell_t));
+  NEWBREP->AllFaces_Outer_Bound = List_Create(10,10,sizeof(Step_Face_Outer_Bound_t));
+  NEWBREP->AllOriented_Edges    = List_Create(10,10,sizeof(Step_Oriented_Edge_t));
+  NEWBREP->AllEdge_Loops        = List_Create(10,10,sizeof(Step_Edge_Loop_t));
+  NEWBREP->AllEdge_Curves       = List_Create(10,10,sizeof(Step_Edge_Curve_t));
+  NEWBREP->AllAdvanced_Faces    = List_Create(10,10,sizeof(Step_Advanced_Face_t));
+  NEWBREP->AllAxis2_Placement3D = List_Create(10,10,sizeof(Step_Axis2_Placement3D_t));
+  NEWBREP->AllClosed_Shells     = List_Create(10,10,sizeof(Step_Closed_Shell_t));
+  BREP = NEWBREP;
+  return NEWBREP;
+}
+
+/*---------------- Directions --------------------------------------------*/
+
+void Add_Direction (int Num , char *name , double x, double y, double z ){
+  Step_Direction_t Dir;
+  if(!BREP)return;
+  Dir.Pos.X = x;
+  Dir.Pos.Y = y;
+  Dir.Pos.Z = z;
+  Dir.Num = Num;
+  List_Add(BREP->AllDirections,&Dir);
+}
+
+static int comparedir  (const void *a, const void *b){
+  return (((Step_Direction_t *)a)->Num -
+          ((Step_Direction_t *)b)->Num);
+}
+
+Step_Direction_t *Get_Direction (int Num){
+  Step_Direction_t Dir;
+  if(!BREP)return NULL;
+  Dir.Num = Num;
+  return (Step_Direction_t*)List_PQuery ( BREP->AllDirections,&Dir, comparedir );
+}
+
+/*---------------- Axis2_Placement3D--------------------------------------*/
+
+void Add_Axis2_Placement3D (int Num, int dir1, int dir2, int ver){
+  Step_Axis2_Placement3D_t Axe;
+  if(!BREP)return;
+  Axe.Num = Num;
+  Axe.Step_Cartesian_Point = ver;
+  Axe.Step_Direction1 = dir1;
+  Axe.Step_Direction2 = dir2;
+  List_Add(BREP->AllAxis2_Placement3D,&Axe);
+}
+
+static int compareax  (const void *a, const void *b){
+  return (((Step_Axis2_Placement3D_t *)a)->Num -
+          ((Step_Axis2_Placement3D_t *)b)->Num);
+}
+
+Step_Axis2_Placement3D_t *Get_Axis2_Placement3D (int Num){
+  Step_Axis2_Placement3D_t Axe;
+  if(!BREP)return NULL;
+  Axe.Num = Num;
+  return (Step_Axis2_Placement3D_t*)List_PQuery ( BREP->AllAxis2_Placement3D,
+                                                  &Axe, compareax );
+}
+
+/*---------------- Vectors -----------------------------------------------*/
+
+void Add_Vector (int Num , char *name , int Dir, double l ){
+  Step_Vector_t Vec;
+  if(!BREP)return;
+  Vec.Lenght = l;
+  Vec.Step_Direction = Dir;
+  Vec.Num = Num;
+  List_Add(BREP->AllVectors,&Vec);
+}
+
+static int comparevec  (const void *a, const void *b){
+  return (((Step_Vector_t *)a)->Num -
+          ((Step_Vector_t *)b)->Num);
+}
+
+Step_Vector_t *Get_Vector (int Num){
+  Step_Vector_t Vec;
+  if(!BREP)return NULL;
+  Vec.Num = Num;
+  return (Step_Vector_t*)List_PQuery ( BREP->AllVectors,&Vec, comparevec );
+}
+
+/*---------------- Cartesian_Points --------------------------------------*/
+
+void Add_Cartesian_Point (int Num , char *name , double x, double y, double z){
+  Step_Cartesian_Point_t CP;
+
+  if(!BREP){
+    return;
+  }
+  CP.Pos.X = x;
+  CP.Pos.Y = y;
+  CP.Pos.Z = z;
+  CP.Num = Num;
+   
+  List_Add(BREP->AllCartesian_Points,&CP);
+}
+static int comparecp  (const void *a, const void *b){
+  return (((Step_Cartesian_Point_t *)a)->Num -
+          ((Step_Cartesian_Point_t *)b)->Num);
+}
+Step_Cartesian_Point_t *Get_Cartesian_Point (int Num){
+  Step_Cartesian_Point_t CP;
+  if(!BREP)return NULL;
+  CP.Num = Num;
+  return (Step_Cartesian_Point_t*)List_PQuery ( BREP->AllCartesian_Points,&CP, comparecp );
+}
+
+/*---------------- Vertex_Points -----------------------------------------*/
+
+void Add_Vertex_Point (int Num , char *name, int cp){
+  Step_Vertex_Point_t VP;
+  if(!BREP)return;
+  VP.Cartesian_Point = cp;
+  VP.Num = Num;
+  List_Add(BREP->AllVertex_Points,&VP);
+}
+static int comparevp  (const void *a, const void *b){
+  return (((Step_Vertex_Point_t *)a)->Num -
+          ((Step_Vertex_Point_t *)b)->Num);
+}
+Step_Vertex_Point_t *Get_Vertex_Point (int Num){
+  Step_Vertex_Point_t VP;
+  if(!BREP)return NULL;
+  VP.Num = Num;
+  return (Step_Vertex_Point_t*)List_PQuery ( BREP->AllVertex_Points,&VP, comparevp );
+}
+
+
+/*---------------- Curves ------------------------------------------------*/
+
+void Add_Line (int Num, char *name , int begin, int dir){
+  Step_Curve_t Curve;
+  if(!BREP)return;
+  Curve.Num = Num;
+  Curve.Typ = STEP_LINE;
+  Curve.Curve.Line.Step_Cartesian_Point = begin;
+  Curve.Curve.Line.Step_Vector = dir;
+  List_Add(BREP->AllCurves,&Curve);
+}
+
+void Add_Circle (int Num, char *name , int axis, double radius){
+  Step_Curve_t Curve;
+  if(!BREP)return;
+  Curve.Num = Num;
+  Curve.Typ = STEP_CIRC;
+  Curve.Curve.Circle.Radius1 = radius;
+  Curve.Curve.Circle.Radius2 = radius;
+  Curve.Curve.Circle.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllCurves,&Curve);
+}
+
+void Add_Ellipsis (int Num, char *name , int axis, double radius1, double radius2){
+  Step_Curve_t Curve;
+  if(!BREP)return;
+  Curve.Num = Num;
+  Curve.Typ = STEP_ELLP;
+  Curve.Curve.Circle.Radius1 = radius1;
+  Curve.Curve.Circle.Radius2 = radius2;
+  Curve.Curve.Circle.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllCurves,&Curve);
+}
+
+void Add_BSpline_Curve_With_Knots (int Num, char *name, int Order, List_T *lcp,
+                                   List_T *multk, List_T *knots, double udeb, double uend){
+  Step_Curve_t Curve;
+  int i,j,mult;
+  double d;
+
+  if(!BREP)return;
+  Curve.Num = Num;
+  Curve.Typ = STEP_BSPL;
+  Curve.Curve.BSpline.ListOf_Knots = List_Create (List_Nbr(lcp) + Order + 1
+                                                  ,1,sizeof(double));
+  /* Adding knots with their multiplicity */
+  for(i=0;i<List_Nbr(multk);i++){
+    List_Read(multk,i,&d);
+    mult = (int)d;
+    List_Read(knots,i,&d);
+    for(j=0;j<mult;j++){
+      List_Add(Curve.Curve.BSpline.ListOf_Knots,&d);
+    }
+  }
+  Curve.Curve.BSpline.ListOf_Cartesian_Points = List_Create(List_Nbr(lcp),1,sizeof(int));
+  for(i=0;i<List_Nbr(lcp);i++){
+    List_Read(lcp,i,&d);
+    j = (int)d;
+    List_Add(Curve.Curve.BSpline.ListOf_Cartesian_Points,&j);
+  }
+  Curve.Curve.BSpline.Order = Order;
+  Curve.Curve.BSpline.Ubeg = udeb;
+  Curve.Curve.BSpline.Uend = uend;
+  List_Add(BREP->AllCurves,&Curve);
+}
+
+static int comparecur  (const void *a, const void *b){
+  return (((Step_Curve_t *)a)->Num -
+          ((Step_Curve_t *)b)->Num);
+}
+Step_Curve_t *Get_Curve (int Num){
+  Step_Curve_t C;
+  if(!BREP)return NULL;
+  C.Num = Num;
+  return (Step_Curve_t*)List_PQuery ( BREP->AllCurves,&C, comparecur );
+}
+
+/*---------------- Edge_Curves -------------------------------------------*/
+
+void Add_Edge_Curve (int Num, char *name , int beg, int end, int curve ){
+  Step_Edge_Curve_t EC;
+  if(!BREP)return;
+  EC.Num = Num;
+  EC.Step_Vertex_Point_Begin = beg;
+  EC.Step_Vertex_Point_End   = end;
+  EC.Step_Curve = curve;
+  List_Add(BREP->AllEdge_Curves,&EC);
+}
+
+static int compareec  (const void *a, const void *b){
+  return (((Step_Edge_Curve_t *)a)->Num -
+          ((Step_Edge_Curve_t *)b)->Num);
+}
+Step_Edge_Curve_t *Get_Edge_Curve (int Num){
+  Step_Edge_Curve_t EC;
+  if(!BREP)return NULL;
+  EC.Num = Num;
+  return (Step_Edge_Curve_t*)List_PQuery ( BREP->AllEdge_Curves,&EC, compareec );
+}
+
+/*---------------- Oriented_Edges ----------------------------------------*/
+
+void Add_Oriented_Edge (int Num, char *name , int ec, bool dir ){
+  Step_Oriented_Edge_t OE;
+  if(!BREP)return;
+  OE.Num = Num;
+  OE.Step_Edge_Curve = ec;
+  OE.dir = dir;
+  List_Add(BREP->AllOriented_Edges,&OE);
+}
+
+static int compareoe  (const void *a, const void *b){
+  return (((Step_Oriented_Edge_t *)a)->Num -
+          ((Step_Oriented_Edge_t *)b)->Num);
+}
+Step_Oriented_Edge_t *Get_Oriented_Edge (int Num){
+  Step_Oriented_Edge_t OE;
+  if(!BREP)return NULL;
+  OE.Num = Num;
+  return (Step_Oriented_Edge_t*)List_PQuery ( BREP->AllOriented_Edges,&OE, compareoe );
+}
+
+/*---------------- Edge_Loops --------------------------------------------*/
+
+void Add_Edge_Loop (int Num, char *name , List_T *list ){
+  Step_Edge_Loop_t EL;
+  if(!BREP)return;
+  EL.Num = Num;
+  EL.ListOf_Step_Oriented_Edge = list;
+  List_Add(BREP->AllEdge_Loops,&EL);
+}
+
+static int compareel  (const void *a, const void *b){
+  return (((Step_Edge_Loop_t *)a)->Num -
+          ((Step_Edge_Loop_t *)b)->Num);
+}
+Step_Edge_Loop_t *Get_Edge_Loop (int Num){
+  Step_Edge_Loop_t EL;
+  if(!BREP)return NULL;
+  EL.Num = Num;
+  return (Step_Edge_Loop_t*)List_PQuery ( BREP->AllEdge_Loops,&EL, compareel );
+}
+
+/*---------------- Faces_Outer_Bounds ------------------------------------*/
+
+void Add_Face_Outer_Bound (int Num, char *name , int el, bool dir, bool outer ){
+  Step_Face_Outer_Bound_t F;
+  if(!BREP)return;
+  F.Num = Num;
+  F.Step_Edge_Loop = el;
+  F.dir = dir;
+  F.outer = outer;
+  List_Add(BREP->AllFaces_Outer_Bound,&F);
+}
+
+static int comparefab  (const void *a, const void *b){
+  return (((Step_Face_Outer_Bound_t *)a)->Num -
+          ((Step_Face_Outer_Bound_t *)b)->Num);
+}
+Step_Face_Outer_Bound_t *Get_Face_Outer_Bound (int Num){
+  Step_Face_Outer_Bound_t F;
+  if(!BREP)return NULL;
+  F.Num = Num;
+  return (Step_Face_Outer_Bound_t*)List_PQuery ( BREP->AllFaces_Outer_Bound,&F, comparefab );
+}
+
+/*---------------- Advanced_Faces ----------------------------------------*/
+
+void Add_Advanced_Face (int Num, char *name , List_T *el, int surf, bool dir ){
+  Step_Advanced_Face_t F;
+  if(!BREP)return;
+  F.Num = Num;
+  F.ListOf_Step_Face_Outer_Bound = el;
+  F.Step_Surface = surf;
+  F.dir = dir;
+  List_Add(BREP->AllAdvanced_Faces,&F);
+}
+
+static int compareaf  (const void *a, const void *b){
+  return (((Step_Advanced_Face_t *)a)->Num -
+          ((Step_Advanced_Face_t *)b)->Num);
+}
+Step_Advanced_Face_t *Get_Advanced_Face (int Num){
+  Step_Advanced_Face_t F;
+  if(!BREP)return NULL;
+  F.Num = Num;
+  return (Step_Advanced_Face_t*)List_PQuery ( BREP->AllAdvanced_Faces,&F, compareaf );
+}
+
+/*---------------- Surfaces ----------------------------------------------*/
+
+void Add_Plane (int Num, char *name , int axis){
+  Step_Surface_t Surface;
+  if(!BREP)return;
+  Surface.Num = Num;
+  Surface.Typ = STEP_PLAN;
+  Surface.Surface.Plane.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllSurfaces,&Surface);
+}
+
+void Add_Cylinder (int Num, char *name , int axis, double radius){
+  Step_Surface_t S;
+  if(!BREP)return;
+  S.Num = Num;
+  S.Typ = STEP_CYLD;
+  S.Surface.Quadric.Radius1 = radius;
+  S.Surface.Quadric.Radius2 = 0.0;
+  S.Surface.Quadric.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllSurfaces,&S);
+}
+
+void Add_Torus (int Num, char *name , int axis, double radius1, double radius2){
+  Step_Surface_t S;
+  if(!BREP)return;
+  S.Num = Num;
+  S.Typ = STEP_TORD;
+  S.Surface.Quadric.Radius1 = radius1;
+  S.Surface.Quadric.Radius2 = radius2;
+  S.Surface.Quadric.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllSurfaces,&S);
+}
+
+void Add_Cone (int Num, char *name , int axis, double radius1, double radius2){
+  Step_Surface_t S;
+  if(!BREP)return;
+  S.Num = Num;
+  S.Typ = STEP_CONE;
+  S.Surface.Quadric.Radius1 = radius1;
+  S.Surface.Quadric.Radius2 = radius2;
+  S.Surface.Quadric.Step_Axis2_Placement3D = axis;
+  List_Add(BREP->AllSurfaces,&S);
+}
+
+
+void Add_BSpline_Surface_With_Knots (int Num,char *name, int OrderU,int OrderV,
+                                     List_T *lcp,List_T *lmu, List_T *lmv, List_T *lku,
+                                     List_T *lkv, double udeb, double uend, double vdeb,
+                                     double vend){
+  Step_Surface_t Surface;
+  int i,j,mult;
+  double d;
+
+  if(!BREP)return;
+
+  Surface.Surface.BSpline.ListOf_KnotsU = 
+    List_Create (List_Nbr(lku) + OrderU + 1,1,sizeof(double));
+  Surface.Surface.BSpline.ListOf_KnotsV =
+    List_Create (List_Nbr(lkv) + OrderV + 1,1,sizeof(double));
+
+  /* Adding knots with their multiplicity */
+  for(i=0;i<List_Nbr(lmu);i++){
+    List_Read(lmu,i,&d);
+    mult = (int)d;
+    List_Read(lku,i,&d);
+    for(j=0;j<mult;j++){
+      List_Add(Surface.Surface.BSpline.ListOf_KnotsU,&d);
+    }
+  }
+  for(i=0;i<List_Nbr(lmv);i++){
+    List_Read(lmv,i,&d);
+    mult = (int)d;
+    List_Read(lkv,i,&d);
+    for(j=0;j<mult;j++){
+      List_Add(Surface.Surface.BSpline.ListOf_KnotsV,&d);
+    }
+  }
+
+  /*Adding the points !*/
+  Surface.Surface.BSpline.ListOf_Cartesian_Points = lcp;
+    
+  Surface.Num = Num;
+  Surface.Typ = STEP_BSPL;
+  Surface.Surface.BSpline.OrderU = OrderU;
+  Surface.Surface.BSpline.OrderV = OrderV;
+  Surface.Surface.BSpline.Ubeg = udeb;
+  Surface.Surface.BSpline.Uend = uend;
+  Surface.Surface.BSpline.Vbeg = vdeb;
+  Surface.Surface.BSpline.Vend = vend;
+  List_Add(BREP->AllSurfaces,&Surface);
+}
+
+static int comparesur  (const void *a, const void *b){
+  return (((Step_Surface_t *)a)->Num -
+          ((Step_Surface_t *)b)->Num);
+}
+Step_Surface_t *Get_Surface (int Num){
+  Step_Surface_t S;
+  if(!BREP)return NULL;
+  S.Num = Num;
+  return (Step_Surface_t*)List_PQuery ( BREP->AllSurfaces,&S, comparesur );
+}
+
+/*---------------- Closed_Shells ----------------------------------------*/
+
+void Add_Closed_Shell (int Num, char *name , List_T *list ){
+  Step_Closed_Shell_t S;
+  if(!BREP)return;
+  S.Num = Num;
+  S.ListOf_Step_Advanced_Face = list;
+  List_Add(BREP->AllClosed_Shells,&S);
+}
+
+static int comparecs  (const void *a, const void *b){
+  return (((Step_Closed_Shell_t *)a)->Num -
+          ((Step_Closed_Shell_t *)b)->Num);
+}
+Step_Closed_Shell_t *Get_Closed_Shell (int Num){
+  Step_Closed_Shell_t F;
+  if(!BREP)return NULL;
+  F.Num = Num;
+  return (Step_Closed_Shell_t*)List_PQuery ( BREP->AllClosed_Shells,&F, comparecs );
+}
+
+/*---------------- Closed_Shells ----------------------------------------*/
+
+void Resolve_BREP (void){
+  int i,j,k,l;
+  double d;
+  int obj,err,typ;
+  Step_Vertex_Point_t      vp;
+  Step_Direction_t         *d1,*d2;
+  Step_Cartesian_Point_t   *pcp,cp;
+  Step_Edge_Curve_t        ec;
+  Step_Curve_t             *pc;
+  Step_Advanced_Face_t     af, *paf;
+  Step_Surface_t           s;
+  Step_Surface_t           *ps;
+  Step_Face_Outer_Bound_t  *pfab;
+  Step_Edge_Loop_t         *pel;
+  Step_Oriented_Edge_t     *poe;
+  Step_Axis2_Placement3D_t *axs;
+  Step_Closed_Shell_t      cs;
+  List_T  *ListInt,*ListIntBis,*ListDouble;
+  double ubeg,uend,n[3],t[3],p[3],XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX,L;
+  int fob;
+
+  ListInt    = List_Create(2,2,sizeof(int));
+  ListIntBis = List_Create(2,2,sizeof(int));
+  ListDouble = List_Create(2,2,sizeof(double));
+
+  for(i=0;i<List_Nbr(BREP->AllCartesian_Points);i++){
+    List_Read(BREP->AllCartesian_Points,i,&cp);
+    XMAX = MAX(cp.Pos.X,XMAX);
+    YMAX = MAX(cp.Pos.Y,YMAX);
+    ZMAX = MAX(cp.Pos.Z,ZMAX);
+    XMIN = MIN(cp.Pos.X,XMIN);
+    YMIN = MIN(cp.Pos.Y,YMIN);
+    ZMIN = MIN(cp.Pos.Z,ZMIN);
+  }
+  L = sqrt(SQR(XMIN-XMAX) + SQR(YMIN-YMAX) + SQR(ZMIN-ZMAX));
+  LC = L;
+
+  /* resolving cartesian_points */
+  for(i=0;i<List_Nbr(BREP->AllCartesian_Points);i++){
+    List_Read(BREP->AllCartesian_Points,i,&cp);
+    Cdbpts101(cp.Num,cp.Pos.X,cp.Pos.Y,cp.Pos.Z,L*.01,1);
+  }
+
+  /* resolving vertex_points */
+  for(i=0;i<List_Nbr(BREP->AllVertex_Points);i++){
+    List_Read(BREP->AllVertex_Points,i,&vp);
+    if((pcp = Get_Cartesian_Point(vp.Cartesian_Point))){
+      Cdbpts101(vp.Num,pcp->Pos.X,pcp->Pos.Y,pcp->Pos.Z,L*.01,1);
+    }
+  }
+
+  /* resolving Edge_Curves*/
+  for(i=0;i<List_Nbr(BREP->AllEdge_Curves);i++){
+    List_Read(BREP->AllEdge_Curves,i,&ec);
+    if((pc = Get_Curve(ec.Step_Curve))){
+      if(pc->Typ == STEP_LINE){
+        List_Add(ListInt,&ec.Step_Vertex_Point_Begin);
+        List_Add(ListInt,&ec.Step_Vertex_Point_End);
+        Cdbseg101(ec.Num,MSH_SEGM_LINE,1,NULL,ListInt,-1,-1,0.,1.,NULL,NULL,NULL);
+        List_Reset(ListInt);
+      }
+      else if(pc->Typ == STEP_BSPL){
+        List_Read( pc->Curve.BSpline.ListOf_Knots , 0, &ubeg);
+        List_Read( pc->Curve.BSpline.ListOf_Knots ,
+                   List_Nbr(pc->Curve.BSpline.ListOf_Knots)-1, &uend);
+        AddCurveInDataBase (ec.Num,
+                            MSH_SEGM_NURBS,
+                            pc->Curve.BSpline.Order,
+                            pc->Curve.BSpline.ListOf_Cartesian_Points,
+                            pc->Curve.BSpline.ListOf_Knots,
+                            ec.Step_Vertex_Point_Begin,
+                            ec.Step_Vertex_Point_End,
+                            ubeg,
+                            uend);
+      }
+      else if(pc->Typ == STEP_CIRC || pc->Typ == STEP_ELLP){
+        axs =  Get_Axis2_Placement3D(pc->Curve.Circle.Step_Axis2_Placement3D);
+        pcp =  Get_Cartesian_Point(axs->Step_Cartesian_Point);
+        d1 =  Get_Direction(axs->Step_Direction1);
+        d2 =  Get_Direction(axs->Step_Direction2);
+        n[0] = d1->Pos.X;
+        n[1] = d1->Pos.Y;
+        n[2] = d1->Pos.Z;
+
+        List_Add(ListInt,&ec.Step_Vertex_Point_Begin);
+        List_Add(ListInt,&pcp->Num);
+        List_Add(ListInt,&ec.Step_Vertex_Point_End);
+        AddCircleInDataBase ( ec.Num,MSH_SEGM_CIRC ,
+                              ListInt,n);
+        /*Cdbseg101(ec.Num,MSH_SEGM_CIRC,1,NULL,
+          ListInt,-1,-1,0.,1.,NULL,NULL,NULL);
+          */
+        List_Reset(ListInt);
+      }
+    }
+  }
+
+  /* resolving Surfaces */
+  for(i=0;i<List_Nbr(BREP->AllSurfaces);i++){
+    List_Read(BREP->AllSurfaces,i,&s);
+    if(s.Typ == STEP_BSPL){
+      CreateNurbsSurfaceSupport (
+                                 s.Num ,
+                                 s.Surface.BSpline.OrderV ,
+                                 s.Surface.BSpline.OrderU ,
+                                 s.Surface.BSpline.ListOf_Cartesian_Points ,
+                                 s.Surface.BSpline.ListOf_KnotsV ,
+                                 s.Surface.BSpline.ListOf_KnotsU );
+
+    }
+  }
+
+  /*resolving Advanced_Faces*/
+
+  for(i=0;i<List_Nbr(BREP->AllAdvanced_Faces);i++){
+    err = 0;
+    List_Read(BREP->AllAdvanced_Faces,i,&af);
+    fob = 0;
+    for(j=0;j<List_Nbr(af.ListOf_Step_Face_Outer_Bound);j++){
+      List_Read(af.ListOf_Step_Face_Outer_Bound,j,&d);
+      obj = (int)d;
+      if((pfab = Get_Face_Outer_Bound(obj)) &&
+         (!j || fob)){
+        if(pfab->outer)fob = 1;
+        if((pel = Get_Edge_Loop(pfab->Step_Edge_Loop))){
+          for(k=0;k<List_Nbr(pel->ListOf_Step_Oriented_Edge);k++){
+            List_Read(pel->ListOf_Step_Oriented_Edge,k,&d);
+            obj = (int)d;
+            if((poe = Get_Oriented_Edge(obj))){
+              l = (poe->dir)?poe->Step_Edge_Curve:-poe->Step_Edge_Curve;
+              List_Add(ListInt,&l);
+            }
+            else err = 1;
+          }
+        }
+        else err = 1;
+        if(!err){
+          Cdbz101(pfab->Num,MSH_SEGM_LOOP,0,0,0,0,0,NULL,NULL,ListInt);
+          List_Add(ListIntBis,& pfab->Num);
+        }
+        List_Reset(ListInt);
+      }
+      else err = 0;
+    }
+    if(!err && (ps = Get_Surface(af.Step_Surface))){
+      if(ps->Typ == STEP_PLAN){
+        Cdbz101(af.Num,MSH_SURF_PLAN,0,0,0,0,0,NULL,NULL,ListIntBis);
+      }
+      else if(ps->Typ == STEP_CYLD || ps->Typ == STEP_CONE
+              /*|| ps->Typ == STEP_TORD || ps->Typ == STEP_CONE*/){
+        axs =  Get_Axis2_Placement3D(ps->Surface.Quadric.Step_Axis2_Placement3D);
+        pcp =  Get_Cartesian_Point(axs->Step_Cartesian_Point);
+        d1 =  Get_Direction(axs->Step_Direction1);
+        d2 =  Get_Direction(axs->Step_Direction2);
+        n[0] = d1->Pos.X;n[1] = d1->Pos.Y;n[2] = d1->Pos.Z;
+        t[0] = d2->Pos.X;t[1] = d2->Pos.Y;t[2] = d2->Pos.Z;
+        p[0] = pcp->Pos.X;p[1] = pcp->Pos.Y;p[2] = pcp->Pos.Z;
+        switch(ps->Typ){
+        case STEP_CYLD:
+          typ = MSH_SURF_CYLNDR;
+          break;
+        case STEP_TORD:
+          typ = MSH_SURF_TORUS;
+          break;
+        case STEP_CONE:
+          typ = MSH_SURF_CONE;
+          break;
+        }
+        AddQuadricSurfaceInDataBase (typ,
+                                     af.Num,
+                                     n,t,p,
+                                     ps->Surface.Quadric.Radius1,
+                                     ps->Surface.Quadric.Radius2,
+                                     ListIntBis);
+
+        //Cdbz101(af.Num,MSH_SURF_REGL,0,0,0,0,0,NULL,NULL,ListIntBis);
+      }
+
+      else if(ps->Typ == STEP_BSPL){
+        Cdbz101(af.Num,MSH_SURF_TRIMMED,0,0,0,0,af.Step_Surface,NULL,NULL,ListIntBis);
+      }
+    }
+    List_Reset(ListIntBis);
+  }
+    
+  /*resolving closed shells (sheila)*/
+  for(i=0;i<List_Nbr(BREP->AllClosed_Shells);i++){
+    List_Reset(ListInt);
+    List_Read(BREP->AllClosed_Shells,i,&cs);
+    for(j=0;j<List_Nbr(cs.ListOf_Step_Advanced_Face);j++){
+      List_Read(cs.ListOf_Step_Advanced_Face,j,&d);
+      obj = (int)d;
+      if((paf = Get_Advanced_Face(obj))){
+        List_Add(ListInt,&paf->Num);
+      }
+    }
+    Cdbz101(cs.Num+1000000,MSH_SURF_LOOP,0,0,0,0,0,NULL,NULL,ListInt);
+    List_Reset(ListInt);
+    j = cs.Num+1000000;
+    List_Add(ListInt,&j);
+    Cdbz101(cs.Num,MSH_VOLUME,0,0,0,0,0,NULL,NULL,ListInt);
+  }
+}
+
+
diff --git a/Geo/StepGeomDatabase.h b/Geo/StepGeomDatabase.h
new file mode 100644
index 0000000000000000000000000000000000000000..a763fcdd8666f41b9b62b1dd1f8d14780e260980
--- /dev/null
+++ b/Geo/StepGeomDatabase.h
@@ -0,0 +1,202 @@
+#ifndef _STEP_GEOM_DATABASE_H_
+#define _STEP_GEOM_DATABASE_H_
+
+typedef struct{
+  double X, Y, Z;
+} Step_Coord_t;
+
+typedef struct{
+  int Num;
+  char *Name;
+  Step_Coord_t Pos;
+}Step_Direction_t;
+
+typedef struct{
+  int Num;
+  char *Name;
+  int Step_Direction;
+  double Lenght;
+}Step_Vector_t;
+
+typedef struct{
+  int Num;
+  char *Name;
+  int Cartesian_Point;
+}Step_Vertex_Point_t;
+
+typedef struct{
+  int Num;
+  char *Name;
+  Step_Coord_t Pos;
+}Step_Cartesian_Point_t;
+
+
+#define STEP_LINE 1
+#define STEP_CIRC 3
+#define STEP_ELLP 6
+#define STEP_PARA 7
+#define STEP_HYPB 8
+
+typedef struct{
+  int Step_Cartesian_Point;
+  int Step_Vector;
+}Step_Line_t;
+
+typedef struct{
+  int Step_Axis2_Placement3D;
+  double Radius1;
+  double Radius2;
+}Step_Circle_t;
+
+typedef struct{
+  int Order;
+  List_T *ListOf_Cartesian_Points;
+  List_T *ListOf_Knots;
+  double Ubeg, Uend;
+}Step_BSpline_Curve_With_Knots_t;
+
+typedef struct{
+  int Num;
+  int Typ;
+  char *Name;
+  union{
+    Step_BSpline_Curve_With_Knots_t BSpline;
+    Step_Line_t Line;
+    Step_Circle_t Circle;
+  }Curve;
+}Step_Curve_t;
+
+
+#define STEP_PLAN 1
+#define STEP_CYLD 2
+#define STEP_TORD 3
+#define STEP_CONE 4
+#define STEP_BSPL 5
+
+typedef struct{
+  int Num;
+  int Step_Cartesian_Point;
+  int Step_Direction1;
+  int Step_Direction2;
+}Step_Axis2_Placement3D_t;
+
+typedef struct{
+  int Step_Axis2_Placement3D;
+}Step_Plane_t;
+
+typedef struct{
+  int Step_Axis2_Placement3D;
+  double Radius1;
+  double Radius2;
+}Step_Quadric_t;
+
+typedef struct{
+  int OrderU, OrderV;
+  List_T *ListOf_Cartesian_Points;
+  List_T *ListOf_KnotsU;
+  List_T *ListOf_KnotsV;
+  double Ubeg, Uend, Vbeg, Vend;
+}Step_BSpline_Surface_With_Knots_t;
+
+typedef struct{
+  int Num;
+  int Typ;
+  char *Name;
+  union{
+    Step_BSpline_Surface_With_Knots_t BSpline;
+    Step_Plane_t Plane;
+    Step_Quadric_t Quadric;
+  }Surface;
+}Step_Surface_t;
+
+typedef struct{
+  int Num;
+  char *Name;
+  int Step_Vertex_Point_Begin;
+  int Step_Vertex_Point_End;
+  int Step_Curve;
+}Step_Edge_Curve_t;
+
+typedef struct{
+  int Num;
+  char Name;
+  int Step_Edge_Curve;
+  bool dir;
+}Step_Oriented_Edge_t;
+
+typedef struct{
+  int Num;
+  char Name;
+  List_T *ListOf_Step_Oriented_Edge;
+}Step_Edge_Loop_t;
+
+typedef struct{
+  int Num;
+  char Name;
+  int Step_Edge_Loop;
+  bool dir;
+  bool outer;
+}Step_Face_Outer_Bound_t;
+
+typedef struct{
+  int Num;
+  char Name;
+  List_T *ListOf_Step_Face_Outer_Bound;
+  int Step_Surface;
+  bool dir;
+}Step_Advanced_Face_t;
+
+typedef struct{
+  int Num;
+  char Name;
+  List_T *ListOf_Step_Advanced_Face;
+}Step_Closed_Shell_t;
+
+typedef struct{
+  List_T *AllDirections;
+  List_T *AllVectors;
+  List_T *AllCartesian_Points;
+  List_T *AllVertex_Points;
+  List_T *AllCurves;
+  List_T *AllEdge_Curves;
+  List_T *AllSurfaces;
+  List_T *AllAxis2_Placement3D;
+  List_T *AllClosed_Shells;
+  List_T *AllFaces_Outer_Bound;
+  List_T *AllOriented_Edges;
+  List_T *AllEdge_Loops;
+  List_T *AllAdvanced_Faces;
+}Step_Solid_BRep_t;
+
+Step_Solid_BRep_t *Create_Step_Solid_BRep(void);
+
+void Add_Direction (int Num, char *name, double x, double y, double z);
+void Add_Vector (int Num, char *name, int Dir, double l);
+void Add_Cartesian_Point (int Num, char *name, double x, double y, double z);
+void Add_Vertex_Point (int Num, char *name, int cp);
+void Add_Line (int Num, char *name, int begin, int dir);
+void Add_Circle (int Num, char *name, int axis, double Radius);
+void Add_Ellipsis (int Num, char *name, int axis, double Radius, double r2);
+void Add_Cylinder (int Num, char *name, int axis, double Radius);
+void Add_Torus (int Num, char *name, int axis, double radius1, double radius2);
+void Add_Cone (int Num, char *name, int axis, double radius1, double radius2);
+void Add_Edge_Curve (int Num, char *name, int beg, int end, int curve);
+void Add_Vertex_Point (int num, char *name, int cp);
+void Add_Oriented_Edge (int Num, char *name, int ec, bool dir);
+void Add_Edge_Loop (int Num, char *name, List_T * list);
+void Add_Face_Outer_Bound (int Num, char *name, int el, bool dir, bool outer);
+void Add_Advanced_Face (int Num, char *name, List_T * lfob, int surf, bool dir);
+void Add_Closed_Shell (int Num, char *name, List_T * laf);
+void Add_BSpline_Curve_With_Knots (int Num, char *name, int Order, List_T * lcp,
+				   List_T * lm, List_T * lk, double udeb, double uend);
+void Add_Plane (int Num, char *name, int axis);
+void Add_Axis2_Placement3D (int Num, int cp, int dir1, int dir2);
+void Add_Closed_Shell (int Num, char *name, List_T * list);
+void Resolve_BREP (void);
+void Add_BSpline_Surface_With_Knots (int Num,char *name,int OrderU,int OrderV,
+				     List_T * lcp, List_T * lmu, List_T * lmv,
+				     List_T * lku,List_T * lkv,
+				     double udeb,double uend,
+				     double vdeb,double vend);
+
+#endif
diff --git a/Geo/Verif.cpp b/Geo/Verif.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..66bed8fa2339c343799e3083b0850fcf5890a979
--- /dev/null
+++ b/Geo/Verif.cpp
@@ -0,0 +1,366 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "DataBase.h"
+
+extern Mesh *THEM;
+
+/* Contour extraction by a tree method */
+
+static Tree_T *treelink;
+static Tree_T *treeedges;
+static Tree_T *treefaces;
+static List_T *listlink;
+
+typedef struct {
+  int n,a,arbre;
+}nxa;
+
+typedef struct {
+  int n,visited;
+  List_T *l;
+}lnk;
+
+int complink(const void*a, const void*b){
+  lnk *q,*w;
+  q = (lnk*)a;
+  w = (lnk*)b;
+  return q->n-w->n;
+}
+
+static int POINT_FINAL;
+static int CONTOUR_TROUVE;
+static List_T *VisitedNodes ; //geuz
+
+void recur_trouvecont(int ip , int ed , List_T *Liste, int gauche , List_T *old ){
+  lnk lk;
+  nxa a;
+  int i,rev;
+
+  lk.n = ip;
+  Tree_Query(treelink,&lk);
+  if(List_Nbr(lk.l) != 2 && !old)return;
+  for(i=0;i<List_Nbr(lk.l);i++){
+    List_Read(lk.l,i,&a);
+    if(abs(a.a) != abs(ed)){
+      if(!old || List_Search(old,&a.a,fcmp_absint) || List_Nbr(lk.l) == 2){
+        if(!gauche){
+          List_Add(Liste,&a.a);
+          if(List_Search(VisitedNodes, &a.n, fcmp_absint)){//geuz
+            CONTOUR_TROUVE =1;//end geuz
+            return;//end geuz
+          }//geuz
+        }
+        if(a.n == POINT_FINAL){
+          CONTOUR_TROUVE = 1;
+        }
+        else{
+          recur_trouvecont(a.n,abs(a.a),Liste,gauche,old);
+        }
+        if(gauche){
+          rev = -a.a;
+          List_Add(Liste,&rev);
+          List_Add(VisitedNodes, &a.n); //geuz
+        }
+      }
+    }
+  }
+}
+
+
+void recur_trouvevol(int ifac , int iedge, List_T *Liste, List_T *old ,
+                     Tree_T *treeedges, Tree_T *treefaces){
+
+  lnk lk;
+  nxa a;
+  int i,is,rev,l;
+  Curve *c;
+  Surface *s = FindSurface(abs(ifac),THEM);
+
+  for(l=0;l<List_Nbr(s->s.Generatrices);l++){
+    List_Read(s->s.Generatrices,l,&c);
+    lk.n = abs(c->Num);
+    is = lk.n;
+    if(!Tree_Search(treeedges,&is)){
+      Tree_Add(treeedges,&is);
+    }
+    else{
+      Tree_Suppress(treeedges,&is);
+    }
+    Tree_Query(treelink,&lk);
+    if(List_Nbr(lk.l) == 2 || old){
+      for(i=0;i<List_Nbr(lk.l);i++){
+        List_Read(lk.l,i,&a);
+        if(abs(a.a) != abs(ifac)){
+          if(!Tree_Search(treefaces,&a.a)){
+            Tree_Add(treefaces,&a.a);
+            if(!old || List_Search(old,&a.a,fcmp_absint) || List_Nbr(lk.l) == 2){
+              rev = abs(a.a);
+              List_Add(Liste,&rev);
+              recur_trouvevol(rev,is,Liste,old,treeedges,treefaces);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+
+void BegEndCurve (Curve *c, int *ip1, int *ip2){
+    *ip1 = c->beg->Num;
+    *ip2 = c->end->Num;
+}
+
+void CreeLiens ( void ) {
+  int i,is,ip1,ip2;
+  lnk li,*pli;
+  nxa  na1,na2;
+  Curve *ic;
+
+  treelink = Tree_Create(sizeof(lnk),complink);
+
+  List_T *temp = Tree2List(THEM->Curves);
+  for(i=0;i<List_Nbr(temp);i++){
+    List_Read(temp,i,&ic);
+    if(ic->Num > 0){
+     is = ic->Num;
+     BegEndCurve(ic,&ip1,&ip2);
+
+     na1.a = -is;
+     na2.a = is;
+     na2.arbre = na1.arbre = li.visited =  0;
+     na1.n = li.n = ip1;
+     na2.n = ip2;
+     if((pli = (lnk*)Tree_PQuery(treelink,&li))){
+       List_Add(pli->l,&na2);
+     }
+     else{
+       li.l = List_Create(20,1,sizeof(nxa));
+       List_Add(li.l,&na2);
+       Tree_Add(treelink,&li);
+     }
+     li.n = ip2;
+     if((pli = (lnk*)Tree_PQuery(treelink,&li))){
+       List_Add(pli->l,&na1);
+     }
+     else{
+       li.l = List_Create(20,1,sizeof(nxa));
+       List_Add(li.l,&na1);
+       Tree_Add(treelink,&li);
+     }
+   }
+  }
+  listlink = Tree2List(treelink);
+}
+
+
+void CreeLiens2 ( void ) {
+  int i,k;
+  lnk li,*pli;
+  nxa  na;
+  Surface *s;
+  Curve *c;
+
+  treelink = Tree_Create(sizeof(lnk),complink);
+  List_T *temp = Tree2List(THEM->Surfaces);
+
+  for(i=0;i<List_Nbr(temp);i++){
+    List_Read(temp,i,&s);
+    if(s->Num > 0)
+      na.a = s->Num;
+    for(k=0;k<List_Nbr(s->s.Generatrices);k++){
+      List_Read(s->s.Generatrices,k,&c);
+      li.n = abs(c->Num);
+      if((pli = (lnk*)Tree_PQuery(treelink,&li))){
+        List_Add(pli->l,&na);
+      }
+      else{
+        li.l = List_Create(20,1,sizeof(nxa));
+        List_Add(li.l,&na);
+        Tree_Add(treelink,&li);
+      }
+    }
+  }
+  List_Delete(temp);
+  listlink = Tree2List(treelink);
+}
+
+
+int alledgeslinked ( int ed , List_T *Liste , List_T *old){
+
+  int ip1,ip2,i,rev;
+  lnk lk;
+  nxa a;
+
+  VisitedNodes = List_Create(20,20,sizeof(int)); //geuz
+
+  CreeLiens();
+
+  Curve *c,C;
+  c = &C;
+  c->Num = ed;
+  Tree_Query(THEM->Curves,&c);
+
+  BegEndCurve(c,&ip1,&ip2);
+
+  CONTOUR_TROUVE = 0;
+
+  POINT_FINAL = ip2;
+  recur_trouvecont(ip1,ed,Liste,1,old);
+
+  if(old){
+    List_Sort(old,fcmp_absint);
+  }
+
+  lk.n = ip2;
+  Tree_Query(treelink,&lk);
+  for(i=0;i<List_Nbr(lk.l);i++){
+    List_Read(lk.l,i,&a);
+    if(abs(a.a) == abs(ed)){
+      rev = -a.a;
+      List_Add(Liste,&rev);
+    }
+  }
+
+
+  if(!CONTOUR_TROUVE){
+    POINT_FINAL = ip1;
+    recur_trouvecont(ip2,ed,Liste,0,old);
+  }
+
+  List_Delete(VisitedNodes); //geuz
+
+  return(CONTOUR_TROUVE);
+}
+
+
+int allfaceslinked (int iz , List_T *Liste , List_T *old){
+
+  CreeLiens2();
+  treeedges = Tree_Create(sizeof(int),fcmp_absint);
+  treefaces = Tree_Create(sizeof(int),fcmp_absint);
+
+  Tree_Add(treefaces,&iz);
+  List_Add(Liste,&iz);
+  recur_trouvevol(iz,0,Liste,old,treeedges,treefaces);
+
+  if(!Tree_Nbr(treeedges)){
+    CONTOUR_TROUVE = 1;
+  }
+  else{
+    CONTOUR_TROUVE = 0;
+  }
+
+  Tree_Delete(treeedges);
+  Tree_Delete(treefaces);
+
+  return(CONTOUR_TROUVE);
+}
+
+void PremierVolume(int iSurf, int *iVol){
+  int i,j;
+  Surface *sur;
+  Volume *vol;
+
+  *iVol = 0;
+
+  List_T *temp = Tree2List(THEM->Volumes);
+  for(i=0;i<List_Nbr(temp);i++){
+        List_Read(temp,i,&vol);
+    for(j=0;j<List_Nbr(vol->Surfaces);j++){
+        List_Read(vol->Surfaces,j,&sur);
+        if(abs(sur->Num) == iSurf){
+                List_Delete(temp);
+            *iVol = i+1;
+            return;
+        }
+    }
+  }
+  List_Delete(temp);
+}
+
+/* Gestion des entites visibles */
+
+extern Tree_T *EntitesVisibles;
+
+typedef struct{
+ int Entite;
+ int Visible;
+}EntiteVisible;
+
+int compareEntiteVisible(const void *a, const void *b){
+  EntiteVisible *q,*w;
+  q = (EntiteVisible*)a;
+  w = (EntiteVisible*)b;
+  return(q->Entite-w->Entite);
+}
+
+int EntiteEstElleVisible(int iEnt){
+  EntiteVisible e;
+  e.Entite = iEnt;
+  if(Tree_Query(EntitesVisibles,&e))
+    return e.Visible;
+  return 1;
+}
+
+void ToutesLesEntitesRelatives(int iEnt, Tree_T *Tree, int add_rem){
+  int i;
+  EntiteVisible e;
+
+  Surface *s;
+  Volume *v;
+  Curve *c;
+
+  if((c = FindCurve(iEnt,THEM))){
+  }
+  else if((s = FindSurface(iEnt,THEM))){
+    for(i=0;i<List_Nbr(s->s.Generatrices);i++){
+      List_Read(s->s.Generatrices,i,&c);
+      e.Entite = abs(c->Num);
+      e.Visible = add_rem;
+      Tree_Replace(Tree,&e);
+    }
+  }
+  else if((v = FindVolume(iEnt,THEM))){
+    for(i=0;i<List_Nbr(v->Surfaces);i++){
+      List_Read(v->Surfaces,i,&s);
+      e.Entite = abs(s->Num);
+      e.Visible = add_rem;
+      Tree_Replace(Tree,&e);
+    }
+  }
+
+  e.Entite = abs(iEnt);
+  e.Visible = add_rem;
+  Tree_Replace(Tree,&e);
+}
+
+void RemplirEntitesVisibles (int add_rem){
+  int i;
+  Volume *v;
+  Surface *s;
+  Curve *c;
+
+  List_T *ListVolumes = Tree2List (THEM->Volumes);
+  List_T *ListSurfaces = Tree2List (THEM->Surfaces);
+  List_T *ListCurves = Tree2List (THEM->Curves);
+  EntitesVisibles = Tree_Create(sizeof(EntiteVisible),compareEntiteVisible);
+  for(i=0;i<List_Nbr(ListVolumes);i++){
+    List_Read(ListVolumes,i,&v);
+    ToutesLesEntitesRelatives(v->Num,EntitesVisibles,add_rem);
+  }
+  for(i=0;i<List_Nbr(ListSurfaces);i++){
+    List_Read(ListSurfaces,i,&s);
+    ToutesLesEntitesRelatives(s->Num,EntitesVisibles,add_rem);
+  }
+  for(i=0;i<List_Nbr(ListCurves);i++){
+    List_Read(ListCurves,i,&c);
+    ToutesLesEntitesRelatives(c->Num,EntitesVisibles,add_rem);
+  }
+  List_Delete(ListVolumes);
+  List_Delete(ListSurfaces);
+  List_Delete(ListCurves);
+}
diff --git a/Geo/Verif.h b/Geo/Verif.h
new file mode 100644
index 0000000000000000000000000000000000000000..dc51b6d7fe00574d8b64f017a19e4ba1d3ed127a
--- /dev/null
+++ b/Geo/Verif.h
@@ -0,0 +1,11 @@
+#ifndef _VERIF_H_
+#define _VERIF_H_
+
+int alledgeslinked (int ed, List_T * Liste, List_T * old);
+int allfaceslinked (int iz, List_T * Liste, List_T * old);
+
+int EntiteEstElleVisible(int iEnt);
+void RemplirEntitesVisibles (int add_rem);
+void ToutesLesEntitesRelatives(int iEnt, Tree_T *Tree, int add_rem);
+
+#endif
diff --git a/Graphics/ColorTable.cpp b/Graphics/ColorTable.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..129a745f9297834c8c04f367695432a24cd139d3
--- /dev/null
+++ b/Graphics/ColorTable.cpp
@@ -0,0 +1,205 @@
+
+#include "Gmsh.h"
+#include "ColorTable.h"
+#include "Context.h"
+
+extern Context_T CTX ;
+
+void color_table_init_param(int number, ColorTable *ct, int rgb_flag, int alpha_flag){
+
+  ct->ipar[COLORTABLE_NUMBER] = number;
+
+  if(rgb_flag) {
+    ct->ipar[COLORTABLE_INVERT]   = 0;
+    ct->ipar[COLORTABLE_SWAP]     = 0;
+    ct->ipar[COLORTABLE_ROTATE]   = 0;
+
+    ct->fpar[COLORTABLE_CURVE]    = 0.0;
+    ct->fpar[COLORTABLE_BIAS]     = 0.0;
+    ct->fpar[COLORTABLE_BETA]     = 0.0;
+  }
+  if(alpha_flag) {
+    ct->fpar[COLORTABLE_ALPHAPOW] = 2.;
+    ct->fpar[COLORTABLE_ALPHAVAL] = 255.;
+  }
+
+}
+
+void color_table_recompute(ColorTable *ct, int rgb_flag, int alpha_flag){
+  float curve, bias;
+  double gamma;
+  int i,r,g,b,a,rotate;
+  float s,t;
+  
+  ct->ipar[COLORTABLE_CHANGED] = 1 ;
+
+  bias   = ct->fpar[COLORTABLE_BIAS];
+  curve  = ct->fpar[COLORTABLE_CURVE];
+  rotate = ct->ipar[COLORTABLE_ROTATE];
+
+  for (i=0 ; i<ct->size ; i++) {
+    
+    if(i+rotate<0)
+      s = (float) (i+rotate+ct->size) / (float) (ct->size-1);
+    else if(i+rotate>ct->size-1)
+      s = (float) (i+rotate-ct->size) / (float) (ct->size-1);
+    else
+      s = (float) (i+rotate) / (float) (ct->size-1);
+
+    if(ct->ipar[COLORTABLE_SWAP]) s = 1.0 - s;
+    
+    if (rgb_flag) {
+
+      switch(ct->ipar[COLORTABLE_NUMBER]){
+      case 1 : /* vis5d */
+	t = (curve+1.4) * (s - (1.+bias)/2.);
+	r = (int)( 128.0 + 127.0 * atan( 7.0*t ) / 1.57  );
+	g = (int)( 128.0 + 127.0 * (2 * exp(-7*t*t) - 1) );
+	b = (int)( 128.0 + 127.0 * atan( -7.0*t ) / 1.57 );
+	break;
+      case 2: /* samcef */
+	if (s-bias<=0.00){ 
+	  r = 0 ; g = 0 ; b = 255 ;
+	}
+	else if(s-bias<=0.40){
+	  r = 0 ; g = (int)((s-bias)*637.5) ; b = (int)(255.-(s-bias)*637.5) ;
+	}
+	else if(s-bias<=0.60){ 
+	  r = (int)(1275.*(s-bias-0.4)) ; g = 255 ; b = 0 ;
+	}
+	else if(s-bias<=1.00){ 
+	  r = 255 ; g = (int)(255.-637.5*(s-bias-0.6)) ; b = 0 ;
+	}
+	else {
+	  r = 255 ; g = 0 ; b = 0 ;
+	}
+	break;
+      case 3: /* rainbow */
+	if (s-bias<=0.00) {
+	  r = 0 ; g = 0 ; b = 255 ; 
+	}
+	else if(s-bias<=0.25+curve){ 
+	  r = 0 ; g = (int)((s-bias)*(255./(0.25+curve))) ; b = 255 ; 
+	}
+	else if(s-bias<=0.50) { 
+	  r = 0 ; g = 255 ; b = (int)(255.-(255./(0.25-curve))*(s-bias-0.25-curve)); 
+	}
+	else if(s-bias<=0.75-curve){ 
+	  r = (int)((s-bias-0.5)*(255./(0.25-curve))); g = 255 ; b = 0 ; 
+	}
+	else if(s-bias<=1.00) { 
+	  r = 255; g = (int)(255.-(255./(0.25+curve))*(s-bias-0.75+curve)) ; b = 0 ;
+	}
+	else { 
+	  r = 255 ; g = 0 ; b = 0 ; 
+	}
+	break;
+      case 4: /* blue-yellow-white */
+#define myfct(a,b,c,d) ((a)+\
+			(b)*(s-bias)+\
+			(c)*(s-bias)*(s-bias)+\
+			(d)*(s-bias)*(s-bias)*(s-bias))
+#define clamp(x) x = (x)<0?0:((x)>255?255:(x))
+	r = (int)(255. * myfct(-0.0506169, 2.81633, -1.87033, 0.0524573) ); 
+	g = (int)(255. * myfct(0.0485868,  -1.26109, 6.3074, -4.12498)   );
+	b = (int)(255. * myfct(0.364662,   1.50814, -7.36756, 6.51847 )  );	
+	clamp(r); clamp(g); clamp(b);
+#undef myfct
+#undef clamp
+	break;
+      case 5: /* grayscale */
+	if      (s-bias<=0.00){ r = g = b = 0 ; }
+	else if (s-bias<=1.00){ r = g = b = (int)(255*(s-bias)); }
+	else                  { r = g = b = 255 ; }
+	break;
+      case 6: /* monochrome */
+	r = g = b = 0 ;
+	break;
+      default: /* grayscale without white */
+	if      (s-bias<=0.00){ r = g = b = 0 ; }
+	else if (s-bias<=1.00){ r = g = b = (int)(220*(s-bias)); }
+	else                  { r = g = b = 220 ; }
+	break;
+      }
+
+      if(ct->fpar[COLORTABLE_BETA]){
+	if(ct->fpar[COLORTABLE_BETA] > 0.0)
+	  gamma = 1. - ct->fpar[COLORTABLE_BETA];
+	else
+	  gamma = 1./(1.001 + ct->fpar[COLORTABLE_BETA]);
+	r = (int)( 255. * pow((double)r/255.,gamma) );
+	g = (int)( 255. * pow((double)g/255.,gamma) );
+	b = (int)( 255. * pow((double)b/255.,gamma) );
+      }
+
+      if(ct->ipar[COLORTABLE_INVERT]){
+	r = 255-r ;
+	g = 255-g ;
+	b = 255-b ;
+      }
+
+    }
+    else {
+      r = UNPACK_RED(   ct->table[i] );
+      g = UNPACK_GREEN( ct->table[i] );
+      b = UNPACK_BLUE(  ct->table[i] );
+    }
+    
+    if (alpha_flag) {
+      if (ct->fpar[COLORTABLE_ALPHAVAL]<0) {
+	a = (int)( 255.0 * pow( s, ct->fpar[COLORTABLE_ALPHAPOW] ) );
+      }
+      else {
+	a = (int)( ct->fpar[COLORTABLE_ALPHAVAL] );
+      }
+    }
+    else {
+      a = UNPACK_ALPHA( ct->table[i] );
+    }
+    
+    ct->table[i] = PACK_COLOR( r, g, b, a );
+  }
+  
+}
+
+
+/*
+ * File format is ASCII:
+ *    $COL
+ *    <table_size>
+ *    <r> <g> <b> <a>    - n lines of rgba values as integers in [0,255]
+ *    .....
+ *    <r> <g> <b> <a>
+ */
+void save_color_table(FILE *fp, ColorTable *ct){
+  int i, r, g, b, a;  
+
+  fprintf(fp, "$COL\n");
+  fprintf(fp, "%d\n", ct->size);
+  for (i=0;i<ct->size;i++) {
+    r = UNPACK_RED( ct->table[i] );
+    g = UNPACK_GREEN( ct->table[i] );
+    b = UNPACK_BLUE( ct->table[i] );
+    a = UNPACK_ALPHA( ct->table[i] );
+    fprintf(fp, "%d %d %d %d\n", r, g, b, a );
+  }
+}
+
+void load_color_table(FILE *fp, ColorTable *ct){
+  int i, r, g, b, a;
+  
+  fscanf(fp, "$COL\n");
+  fscanf(fp, "%d\n", &ct->size);
+
+  if(ct->size>COLORTABLE_NBMAX_COLOR){
+    Msg(ERROR, "Too many colors in ColorTable (%d > %d)", 
+	ct->size, COLORTABLE_NBMAX_COLOR);
+    return;
+  }
+
+  for (i=0;i<ct->size;i++) {
+    fscanf(fp, "%d %d %d %d\n", &r, &g, &b, &a);
+    ct->table[i] = PACK_COLOR(r, g, b, a);
+  }
+}
+
diff --git a/Graphics/ColorTable.h b/Graphics/ColorTable.h
new file mode 100644
index 0000000000000000000000000000000000000000..c2dd893324ab37cfb5c9cfe63cfed6e3f47f0594
--- /dev/null
+++ b/Graphics/ColorTable.h
@@ -0,0 +1,43 @@
+#ifndef _COLORTABLE_H_
+#define _COLORTABLE_H_
+
+#define COLORTABLE_NBMAX_PARAM 10
+#define COLORTABLE_NBMAX_COLOR 255
+
+typedef struct{
+  unsigned int table[COLORTABLE_NBMAX_COLOR];
+  int size;
+  int ipar[COLORTABLE_NBMAX_PARAM];
+  float fpar[COLORTABLE_NBMAX_PARAM];
+}ColorTable;
+
+
+/* COLORTABLE_MODE */
+
+#define COLORTABLE_RGB  1
+#define COLORTABLE_HSV  2
+
+
+/* integrer parameters indices */
+
+#define COLORTABLE_NUMBER    0	/* predefined curve index */
+#define COLORTABLE_CHANGED   1	/* did the colortable change ? */
+#define COLORTABLE_INVERT    2	/* invert (rbg<->255-rgb) */
+#define COLORTABLE_SWAP      3	/* swap (min<->max) */
+#define COLORTABLE_ROTATE    4	/* rotate */
+#define COLORTABLE_MODE      5	/* mode (rgb, hsv) */
+
+/* float parameters indices */
+
+#define COLORTABLE_CURVE     0	/* curvature */
+#define COLORTABLE_BIAS      1	/* offset */
+#define COLORTABLE_ALPHAPOW  2	/* alpha channel power */
+#define COLORTABLE_ALPHAVAL  3	/* alpha channel value */
+#define COLORTABLE_BETA      4	/* beta coeff for brighten */
+
+void color_table_init_param (int number, ColorTable * ct, int rgb_flag, int alpha_flag);
+void color_table_recompute (ColorTable * ct, int rgb_flag, int alpha_flag);
+void load_color_table(FILE *fp, ColorTable *ct);
+void save_color_table(FILE *fp, ColorTable *ct) ;
+
+#endif
diff --git a/Graphics/Draw.cpp b/Graphics/Draw.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..81b4ac75b0d6f65b630dd1526a13640426c0955c
--- /dev/null
+++ b/Graphics/Draw.cpp
@@ -0,0 +1,449 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+#include "MinMax.h"
+
+#ifdef _UNIX
+#include "Widgets.h"
+#include "XContext.h"
+extern XContext_T   XCTX ;
+extern Widgets_T    WID ;
+#endif
+
+void set_r(int i, double val);
+void set_t(int i, double val);
+void set_s(int i, double val);
+
+extern Context_T    CTX ;
+extern GLdouble     vxmin, vxmax, vymin, vymax;
+extern Mesh         M;
+extern double       LC;
+extern int          BD_EXISTS, EXPOSE;
+extern List_T      *Post_ViewList;
+
+/* ------------------------------------------------------------------------ */
+/*  d r a w                                                                 */
+/* ------------------------------------------------------------------------ */
+
+void Draw3d(void){
+  if(CTX.alpha){
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glEnable(GL_BLEND);
+    glEnable(GL_ALPHA);
+  }
+  else{
+    glDisable(GL_BLEND);
+    glDisable(GL_ALPHA);
+  }
+  glPolygonOffset(1.0, 1);
+  glEnable(GL_CLIP_PLANE0);
+
+  /* This is sufficient, since we NEVER give different normals to nodes of one polygon */
+  glShadeModel(GL_FLAT);   //glShadeModel(GL_SMOOTH);
+  glDepthFunc(GL_LESS);
+  glEnable(GL_DEPTH_TEST);
+
+  /* glEnable(GL_CULL_FACE); */
+
+  glPushMatrix();
+  Draw_Mesh(&M);
+  glPopMatrix();  
+}
+
+void Draw2d(void){
+  glDisable(GL_CLIP_PLANE0);
+  glDisable(GL_DEPTH_TEST);
+  glDisable(GL_LIGHTING);
+  glShadeModel(GL_FLAT);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  /* to draw directly in screen coords */
+  glOrtho((double)CTX.viewport[0],
+	  (double)CTX.viewport[2],
+	  (double)CTX.viewport[1],
+	  (double)CTX.viewport[3],-1.,1.);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  glPushMatrix();
+  if(CTX.post.scales) Draw_Scales();
+  if(CTX.little_axes) Draw_SmallAxes();
+  glPopMatrix();
+}
+
+#ifdef _UNIX
+void Draw(void){
+  glClearColor(UNPACK_RED(CTX.color.bg)/255.,
+	       UNPACK_GREEN(CTX.color.bg)/255.,
+	       UNPACK_BLUE(CTX.color.bg)/255.,
+	       0.);
+  glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
+  if(CTX.db) glDrawBuffer(GL_BACK);    
+  Draw3d();
+  Draw2d();
+  glFlush();
+  if(CTX.db) glXSwapBuffers(XCTX.display,XtWindow(WID.G.glw));
+}
+#else
+void Draw(void){
+  if(CTX.db) glDrawBuffer(GL_BACK);
+  glClearColor(UNPACK_RED(CTX.color.bg)/255.,
+	       UNPACK_GREEN(CTX.color.bg)/255.,
+	       UNPACK_BLUE(CTX.color.bg)/255.,
+	       0.);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
+  Draw3d();
+  Draw2d();
+  glFlush();
+  if(CTX.db) MySwapBuffers();
+  if(CTX.db) glDrawBuffer(GL_FRONT);
+}
+#endif
+
+/* ------------------------------------------------------------------------ */
+/*  o r t h o                                                               */
+/* ------------------------------------------------------------------------ */
+
+void Orthogonalize(int x, int y){
+  double Va,Wa;
+  
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+
+  if(CTX.render_mode == GMSH_SELECT)
+    gluPickMatrix ((GLdouble)x, 
+		   (GLdouble)(CTX.viewport[3]-y),
+		   5.0,
+		   5.0,
+		   CTX.viewport);
+
+  Va = (GLdouble)(CTX.viewport[3]-CTX.viewport[1]) / 
+       (GLdouble)(CTX.viewport[2]-CTX.viewport[0]) ;
+  
+  Wa = (CTX.max[1]-CTX.min[1]) / (CTX.max[0]-CTX.min[0]);
+  
+  if(Va>Wa){
+    vxmin = CTX.min[0];
+    vxmax = CTX.max[0];
+    vymin = 0.5*(CTX.min[1]+CTX.max[1]-Va*(CTX.max[0]-CTX.min[0]));
+    vymax = 0.5*(CTX.min[1]+CTX.max[1]+Va*(CTX.max[0]-CTX.min[0]));
+  }
+  else{
+    vxmin = 0.5*(CTX.min[0]+CTX.max[0]-(CTX.max[1]-CTX.min[1])/Va);
+    vxmax = 0.5*(CTX.min[0]+CTX.max[0]+(CTX.max[1]-CTX.min[1])/Va);
+    vymin = CTX.min[1];
+    vymax = CTX.max[1];
+  }
+  vxmin -= (vxmax-vxmin)/3.; vxmax += 0.25*(vxmax-vxmin);
+  vymin -= (vymax-vymin)/3.; vymax += 0.25*(vymax-vymin);
+
+  CTX.pixel_equiv_x = (vxmax-vxmin)/(CTX.viewport[2]-CTX.viewport[0]);
+  CTX.pixel_equiv_y = (vymax-vymin)/(CTX.viewport[3]-CTX.viewport[1]);
+  
+  if(CTX.ortho) {
+    glOrtho(vxmin,vxmax,vymin,vymax,0,100*LC);
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();    
+    glTranslated(0.0, 0.0, -50*LC);
+  }
+  else{
+    glFrustum(vxmin,vxmax,vymin,vymax,LC,100*LC);
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();    
+    glTranslated(0.0, 0.0, -10*LC);
+    glScaled(10.,10.,10.);
+  }
+
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  i n i t                                                                 */
+/* ------------------------------------------------------------------------ */
+
+void Init(void){
+  /* 
+     Attention:
+     X11 interdit de changer le contexte (GLX) en mode GL_FEEDBACK ou GL_SELECT,
+     ce qui serait le cas pour les sorties postscript...
+  */
+#ifdef _UNIX
+  if(CTX.stream == TO_SCREEN)
+    glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+#endif
+  Orthogonalize(0,0);
+}
+
+void InitOv(void){
+#ifdef _UNIX
+  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+#endif
+  Orthogonalize(0,0);
+}
+
+void InitShading(void){
+  GLfloat specular[4];
+
+  glLightfv(GL_LIGHT0, GL_POSITION, CTX.light0);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_NORMALIZE);
+
+  /* simple color commands will automatically create appropriate materials */
+  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+  glEnable(GL_COLOR_MATERIAL);
+
+  /* let's add some shininess to all these automatically created materials */
+  glMaterialf(GL_FRONT, GL_SHININESS, 40.);
+  specular[0] = CTX.shine;
+  specular[1] = CTX.shine;
+  specular[2] = CTX.shine;
+  specular[3] = 1.0;
+  glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
+}
+
+
+void InitNoShading(void){
+  glDisable(GL_LIGHTING);
+}
+
+void InitPosition(void){
+  glScaled    (CTX.s[0], CTX.s[1], CTX.s[2]);
+  glTranslated(CTX.t[0], CTX.t[1], CTX.t[2]);
+  glRotated   (CTX.r[0], 1., 0., 0.);
+  glRotated   (CTX.r[1], 0., 1., 0.);
+  glRotated   (CTX.r[2], 0., 0., 1.);
+}
+
+/* ------------------------------------------------------------------------ */
+/*  r e p l o t                                                             */
+/* ------------------------------------------------------------------------ */
+
+/* n'est plus utilise que dans les cas ou des points peuvent etre
+   ajoutes dans la base de donnee -> dans cb_geom */
+void Replot(void){
+  CalculateMinMax(M.Points);
+  Init();
+  Draw();
+}
+
+/* ------------------------------------------------------------------------ */
+/*  e n t i t y   s e l e c t i o n                                         */
+/* ------------------------------------------------------------------------ */
+
+void process_selection(int x, int y, int *n, GLuint *ii, GLuint *jj){
+  GLuint selectBuf[SELECTION_BUFFER_SIZE];
+  GLint  i,j,hits,names,*ptr;
+
+  glSelectBuffer(SELECTION_BUFFER_SIZE, selectBuf);
+
+  glRenderMode(GL_SELECT); 
+  CTX.render_mode = GMSH_SELECT;
+
+  glInitNames();
+  glPushName(0);
+
+  glPushMatrix();
+  Orthogonalize(x,y);
+  Draw_Mesh(&M);
+  glPopMatrix ();
+
+  hits = glRenderMode(GL_RENDER);
+  CTX.render_mode = GMSH_RENDER ;
+  
+  if(hits<0) return; /* Selection Buffer Overflow */
+
+  ptr = (GLint*)selectBuf;
+  
+  for(i=0; i<hits; i++){ 
+    names = *ptr;
+    ptr++; ptr++; ptr++;
+    for(j=0; j<names; j++){
+      if (j==0)	ii[i] = *ptr;
+      else if (j==1) jj[i] = *ptr;
+      ptr++;
+    }
+  }
+  *n = hits;
+}
+
+void filtre_selection(int n, GLuint *typ, GLuint *ient, Vertex **thev,
+		      Curve **thec, Surface **thes, Mesh *m){
+
+  Vertex   *v=NULL, V;
+  Curve    *c=NULL, C;
+  Surface  *s=NULL, S;
+
+  int      i;
+  GLuint   typmin;
+
+  typmin = 4;
+  for(i=0;i<n;i++){
+    if(typ[i]<typmin) typmin = typ[i];
+  }
+  
+  for(i=0;i<n;i++){
+    if(typ[i] == typmin){
+      switch(typ[i]){
+      case 0:
+	v = &V;
+	v->Num = ient[i];
+	if(Tree_Query(m->Points,&v)){
+	  *thev = v;
+	}
+	break;
+      case 1:
+	c = &C;
+	c->Num = ient[i];
+	if(Tree_Query(m->Curves,&c)){
+	  *thec = c;
+	}
+	break;
+      case 2:
+	s = &S;
+	s->Num = ient[i];
+	if(Tree_Query(m->Surfaces,&s)){
+	  *thes = s;
+	}
+	break;
+      }
+    }
+  }
+}
+
+
+#ifdef _UNIX
+
+int check_type(int type, Vertex *v, Curve *c, Surface *s){
+  return ( (type==ENT_POINT   && v) ||
+	   (type==ENT_LINE    && c) ||
+	   (type==ENT_SURFACE && s) ) ;
+}
+
+int SelectEntity(int type, Vertex **v, Curve **c, Surface **s){
+  XEvent          event;
+  XComposeStatus  stat;
+  KeySym          keysym;
+  int             hits;
+  GLuint          ii[SELECTION_BUFFER_SIZE],jj[SELECTION_BUFFER_SIZE];
+  char            buf[100];
+
+  *v = NULL;
+  *c = NULL; 
+  *s = NULL;
+
+  while(1){
+    XtAppNextEvent(XCTX.AppContext,&event);
+    XtDispatchEvent(&event);
+    switch(event.type){
+    case KeyPress :
+      XLookupString(&event.xkey, buf, sizeof(buf), &keysym, &stat);
+      if(keysym == XK_q) return(0);
+      if(keysym == XK_e) return(-1);
+      break;
+    case ButtonPress :
+      process_selection(event.xbutton.x, event.xbutton.y, &hits, ii, jj);
+      filtre_selection(hits,ii,jj,v,c,s,&M);
+      if(check_type(type,*v,*c,*s)){
+	begin_highlight();
+	highlight_entity(*v,*c,*s,1);
+	end_highlight(1);
+	return(event.xbutton.button);
+      }
+    }
+  }
+}
+
+#else
+
+int SelectEntity(int x, int y, Vertex **v, Curve **c, Surface **s){
+  int             hits,i,j;
+  GLuint          ii[SELECTION_BUFFER_SIZE],jj[SELECTION_BUFFER_SIZE];
+
+  process_selection(x, y, &hits, ii, jj);
+  *v = NULL;
+  *s = NULL;
+  *c = NULL;
+  filtre_selection(hits,ii,jj,v,c,s,&M);
+  begin_highlight();
+  highlight_entity(*v,*c,*s,1);
+  end_highlight(1);
+  return(1);
+}
+
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/*  z o o m                                                                 */
+/* ------------------------------------------------------------------------ */
+
+
+void myZoom(GLdouble X1, GLdouble X2, GLdouble Y1, GLdouble Y2,
+	    GLdouble Xc1, GLdouble Xc2, GLdouble Yc1, GLdouble Yc2){
+  GLdouble  xscale1, yscale1;
+
+  xscale1 = CTX.s[0];
+  yscale1 = CTX.s[1];
+  set_s(0, CTX.s[0] * (vxmax-vxmin)/(X2-X1));
+  set_s(1, CTX.s[1] * (vymax-vymin)/(Y1-Y2));
+  /* bif bif bif */
+  set_s(2, 0.5*(CTX.s[0]+CTX.s[1]));
+  set_t(0, CTX.t[0] * (xscale1/CTX.s[0]) - ((Xc1+Xc2)/2.)*(1.-(xscale1/CTX.s[0])));
+  set_t(1, CTX.t[1] * (yscale1/CTX.s[1]) - ((Yc1+Yc2)/2.)*(1.-(yscale1/CTX.s[1])));
+  Init();
+  Draw();
+}
+
+/* ------------------------------------------------------------------------ */
+/*  InitCb, ResizeCb, ExposeCb                                              */
+/* ------------------------------------------------------------------------ */
+
+#ifdef _UNIX
+
+void InitCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){
+  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+  CTX.viewport[0] = 0 ;
+  CTX.viewport[1] = 0 ;
+  CTX.viewport[2] = cb->width ;
+  CTX.viewport[3] = cb->height ;
+  glViewport(CTX.viewport[0],
+	     CTX.viewport[1],
+	     CTX.viewport[2],
+	     CTX.viewport[3]);
+}
+
+void ResizeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){
+  CTX.viewport[0] = 0 ;
+  CTX.viewport[1] = 0 ;
+  CTX.viewport[2] = cb->width ;
+  CTX.viewport[3] = cb->height ;
+  glViewport(CTX.viewport[0],
+	     CTX.viewport[1],
+	     CTX.viewport[2],
+	     CTX.viewport[3]);
+  Init();
+  Draw();
+  if(CTX.overlay) InitOv();
+}
+
+void ExposeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){
+
+  /* compress incoming events as much as possible */
+  if(cb->event->xexpose.count != 0){
+    return;
+  }
+
+  if(!BD_EXISTS || !EXPOSE) return;
+  Init();
+  Draw(); 
+
+}
+
+#endif
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
new file mode 100644
index 0000000000000000000000000000000000000000..c3e2fb2a16a7cae3416152a3fdc76b5127dd060d
--- /dev/null
+++ b/Graphics/Draw.h
@@ -0,0 +1,114 @@
+#ifndef _DRAW_H_
+#define _DRAW_H_
+
+#include "Views.h"
+
+#define GMSH_RENDER    1
+#define GMSH_SELECT    2
+#define GMSH_FEEDBACK  3
+
+#define TO_SCREEN  1
+#define TO_FILE    2
+
+#define XDUMP         1
+#define GLPPAINTER    2
+#define GLPRECURSIVE  3
+#define GLPIMAGE      4
+#define GLPRPAINTER   5
+#define GLPRRECURSIVE 6
+#define GIF           7
+
+#define FORMAT_XPM  1
+#define FORMAT_PS   2
+#define FORMAT_EPS  3
+#define FORMAT_HPGL 4
+#define FORMAT_CGM  5
+#define FORMAT_BMP  6
+#define FORMAT_GIF  7
+
+#define FORMAT_MSH  1
+#define FORMAT_UNV  2
+#define FORMAT_GREF 3
+
+#define COLOR          1
+#define COLOR_INV      2
+#define GRAYSCALE      3
+#define GRAYSCALE_INV  4
+#define BLACKWHITE     5
+
+void Init(void);
+void InitOv(void);
+void InitShading(void);
+void InitNoShading(void);
+void InitPosition(void);
+
+void Replot(void);
+
+void RaiseFill (int i, double Val, double ValMin, double Raise[3][5]);
+void Palette (Post_View * View, int nbi, int i);
+void Palette2 (Post_View * View, double min, double max, double val);
+void ColorSwitch(int i);
+
+int SelectEntity(int type, Vertex **v, Curve **c, Surface **s);
+void ZeroHighlight(Mesh *m);
+void begin_highlight(void);
+void end_highlight(int permanent);
+void highlight_entity(Vertex *v,Curve *c, Surface *s, int permanent);
+void highlight_entity_num(int v, int c, int s, int permanant);
+
+void Draw3d(void);
+void Draw2d(void);
+void Draw(void);
+
+void Draw_String(char *s);
+void Draw_Geom (Mesh *m);
+void Draw_Mesh(Mesh *M);
+void Draw_Post(void);
+void Draw_Scales(void);
+void Draw_Axes (double s);
+void Draw_SmallAxes(void);
+
+void Draw_Point(double *x, double *y, double *z,
+		double *Offset, double Raise[3][5]);
+
+void Draw_Line (double *x, double *y, double *z,
+		double *Offset, double Raise[3][5]);
+
+void Draw_Triangle (double *x, double *y, double *z,
+		    double *Offset, double Raise[3][5], int shade);
+
+void Draw_Quadrangle (double *x, double *y, double *z,
+		      double *Offset, double Raise[3][5], int shade);
+
+void Draw_Polygon (int n, double *x, double *y, double *z,
+		   double *Offset, double Raise[3][5]);
+
+void Draw_Vector (int Type, int Fill,
+		  double x, double y, double z,
+		  double d, double dx, double dy, double dz,
+		  double *Offset, double Raise[3][5]);
+
+
+void Draw_Mesh_Volumes(void *a, void *b);
+void Draw_Mesh_Surfaces(void *a, void *b);
+void Draw_Mesh_Curves(void *a, void *b);
+void Draw_Mesh_Points(void *a, void *b);
+
+void Draw_Simplex_Surfaces (void *a, void *b);
+void Draw_Simplex_Points(void *a,void *b);
+void Draw_Extruded_Surfaces(void *a, void *b);
+
+void Draw_Simplex_Volume (void *a, void *b);
+void Draw_Hexahedron_Volume (void *a, void *b);
+void Draw_Prism_Volume (void *a, void *b);
+
+void Draw_Post_Simplex (Post_View * View, Post_Simplex * s,
+			double ValMin, double ValMax, double Raise[3][5]);
+void Draw_Post_Triangle (Post_View * View, Post_Triangle * t,
+			 double ValMin, double ValMax, double Raise[3][5]);
+void Draw_Post_Line (Post_View * View, Post_Line * l,
+		     double ValMin, double ValMax, double Raise[3][5]);
+void Draw_Post_Point (Post_View * View, Post_Point * p,
+		      double ValMin, double ValMax, double Raise[3][5]);
+
+#endif
diff --git a/Graphics/Entity.cpp b/Graphics/Entity.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8100459df0383bb3a2d29292e1d1e287c20d66a2
--- /dev/null
+++ b/Graphics/Entity.cpp
@@ -0,0 +1,387 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ P o i n t                                                     */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Point (double *x, double *y, double *z,
+		 double *Offset, double Raise[3][5]){
+  glBegin(GL_POINTS);
+  glVertex3d(x[0]+Offset[0]+Raise[0][0],
+	     y[0]+Offset[1]+Raise[1][0],
+	     z[0]+Offset[2]+Raise[2][0]);
+  glEnd();
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ L i n e                                                       */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Line (double *x, double *y, double *z,
+		double *Offset, double Raise[3][5]){
+  glBegin(GL_LINES);
+  glVertex3d(x[0]+Offset[0]+Raise[0][0],
+	     y[0]+Offset[1]+Raise[1][0],
+	     z[0]+Offset[2]+Raise[2][0]);
+  glVertex3d(x[1]+Offset[0]+Raise[0][1],
+	     y[1]+Offset[1]+Raise[1][1],
+	     z[1]+Offset[2]+Raise[2][1]);
+  glEnd();
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ T r i a n g l e                                               */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Triangle (double *x, double *y, double *z,
+		    double *Offset, double Raise[3][5], int shade){
+
+  double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3];
+
+  if (shade){
+    x1x0 = (x[1]+Raise[0][1]) - (x[0]+Raise[0][0]); 
+    y1y0 = (y[1]+Raise[1][1]) - (y[0]+Raise[1][0]);
+    z1z0 = (z[1]+Raise[2][1]) - (z[0]+Raise[2][0]); 
+    x2x0 = (x[2]+Raise[0][2]) - (x[0]+Raise[0][0]);
+    y2y0 = (y[2]+Raise[1][2]) - (y[0]+Raise[1][0]); 
+    z2z0 = (z[2]+Raise[2][2]) - (z[0]+Raise[2][0]);
+    nn[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    nn[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    nn[2]  = x1x0 * y2y0 - y1y0 * x2x0 ;
+    /* BOF BOF
+    if(nn[2] < -0.1){
+      nn[0] = -nn[0];
+      nn[1] = -nn[1];
+      nn[2] = -nn[2];
+    }
+    */
+    glNormal3dv(nn);
+  }
+
+  glBegin(GL_TRIANGLES);
+  glVertex3d(x[0]+Offset[0]+Raise[0][0],
+	     y[0]+Offset[1]+Raise[1][0],
+	     z[0]+Offset[2]+Raise[2][0]);
+  glVertex3d(x[1]+Offset[0]+Raise[0][1],
+	     y[1]+Offset[1]+Raise[1][1],
+	     z[1]+Offset[2]+Raise[2][1]);
+  glVertex3d(x[2]+Offset[0]+Raise[0][2],
+	     y[2]+Offset[1]+Raise[1][2],
+	     z[2]+Offset[2]+Raise[2][2]);
+  glEnd();
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ Q u a d r a n g l e                                           */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Quadrangle (double *x, double *y, double *z,
+		      double *Offset, double Raise[3][5], int shade){
+
+  double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3];
+
+  if (shade){
+    x1x0 = (x[1]+Raise[0][1]) - (x[0]+Raise[0][0]); 
+    y1y0 = (y[1]+Raise[1][1]) - (y[0]+Raise[1][0]);
+    z1z0 = (z[1]+Raise[2][1]) - (z[0]+Raise[2][0]); 
+    x2x0 = (x[2]+Raise[0][2]) - (x[0]+Raise[0][0]);
+    y2y0 = (y[2]+Raise[1][2]) - (y[0]+Raise[1][0]); 
+    z2z0 = (z[2]+Raise[2][2]) - (z[0]+Raise[2][0]);
+    nn[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    nn[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    nn[2]  = x1x0 * y2y0 - y1y0 * x2x0 ;
+    /* BOF BOF
+    if(nn[2] < -0.1){
+      nn[0] = -nn[0];
+      nn[1] = -nn[1];
+      nn[2] = -nn[2];
+    }
+    */
+    glNormal3dv(nn);
+  }
+  /* dessin de quandrangles "non convexes" */
+
+  glBegin(GL_TRIANGLE_FAN);
+  glVertex3d(x[0]+Offset[0]+Raise[0][0],
+	     y[0]+Offset[1]+Raise[1][0],
+	     z[0]+Offset[2]+Raise[2][0]);
+  glVertex3d(x[1]+Offset[0]+Raise[0][1],
+	     y[1]+Offset[1]+Raise[1][1],
+	     z[1]+Offset[2]+Raise[2][1]);
+  glVertex3d(x[2]+Offset[0]+Raise[0][2],
+	     y[2]+Offset[1]+Raise[1][2],
+	     z[2]+Offset[2]+Raise[2][2]);
+  glVertex3d(x[3]+Offset[0]+Raise[0][3],
+	     y[3]+Offset[1]+Raise[1][3],
+	     z[3]+Offset[2]+Raise[2][3]);
+  glVertex3d(x[1]+Offset[0]+Raise[0][1],
+	     y[1]+Offset[1]+Raise[1][1],
+	     z[1]+Offset[2]+Raise[2][1]);
+  glEnd();  
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ P o l y g o n                                                 */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Polygon (int n, double *x, double *y, double *z,
+		   double *Offset, double Raise[3][5]){
+  int i;
+  
+  glBegin(GL_POLYGON);
+  for(i=0;i<n;i++) glVertex3d(x[i]+Offset[0]+Raise[0][i],
+			      y[i]+Offset[1]+Raise[1][i],
+			      z[i]+Offset[2]+Raise[2][i]);
+  glEnd();
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ V e c t o r                                                   */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Vector (int Type, int Fill, 
+		  double x, double y, double z, 
+		  double d, double dx, double dy, double dz,
+		  double *Offset, double Raise[3][5]){
+
+  double  n[3],t[3],u[3];
+  double  l,b,c, f1, f2;
+
+  if(d == 0.0) return;
+  
+  if(Offset != NULL && Raise != NULL){
+    x += Offset[0]+Raise[0][0] ; 
+    y += Offset[1]+Raise[1][0] ; 
+    z += Offset[2]+Raise[2][0] ; 
+  }
+
+  if(Type ==  DRAW_POST_SEGMENT){
+    glBegin(GL_LINES);
+    glVertex3d(x,    y,    z);
+    glVertex3d(x+dx, y+dy, z+dz);
+    glEnd();
+    return;
+  }
+
+  n[0] = dx/d ; n[1] = dy/d ; n[2] = dz/d ;
+  
+  if( (fabs(n[0]) >= fabs(n[1]) && fabs(n[0]) >= fabs(n[2])) || 
+      (fabs(n[1]) >= fabs(n[0]) && fabs(n[1]) >= fabs(n[2])) ){
+    t[0] = n[1] ; t[1] = -n[0] ; t[2] = 0. ;
+  }
+  else{
+    t[0] = 0. ; t[1] = n[2] ; t[2] = -n[1] ;
+  }
+
+  l = sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);
+  t[0] /= l ; t[1] /= l ; t[2] /= l ;
+
+  u[0] = n[1]*t[2]-n[2]*t[1];
+  u[1] = n[2]*t[0]-n[0]*t[2];
+  u[2] = n[0]*t[1]-n[1]*t[0];
+
+  l = sqrt(u[0]*u[0]+u[1]*u[1]+u[2]*u[2]);
+  u[0] /= l ; u[1] /= l ; u[2] /= l ;
+
+  switch(Type){
+
+  case DRAW_POST_ARROW :
+
+    b = 0.0666 * d;
+
+    f1 = 0.85 ;
+    f2 = 0.8 ;
+
+
+    b *= 2 ;
+    f1 /= 1.5 ;
+    f2 /= 1.5 ;
+    
+    if(Fill){
+      glBegin(GL_LINES);
+      glVertex3d(x,                  y,                  z);
+      glVertex3d(x+dx,               y+dy,               z+dz);
+      glEnd();
+      
+      glBegin(GL_TRIANGLES);
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      glVertex3d(x+f2*dx+b*(t[0]), y+f2*dy+b*(t[1]), z+f2*dz+b*(t[2]));
+      glVertex3d(x+f1*dx,          y+f1*dy,          z+f1*dz);
+      
+      glVertex3d(x+dx,              y+dy,              z+dz);
+      glVertex3d(x+f2*dx+b*(-t[0]), y+f2*dy+b*(-t[1]), z+f2*dz+b*(-t[2]));
+      glVertex3d(x+f1*dx,           y+f1*dy,           z+f1*dz);
+      
+      glVertex3d(x+dx,              y+dy,              z+dz);
+      glVertex3d(x+f2*dx+b*(-u[0]), y+f2*dy+b*(-u[1]), z+f2*dz+b*(-u[2]));
+      glVertex3d(x+f1*dx,           y+f1*dy,           z+f1*dz);
+      
+      glVertex3d(x+dx,              y+dy,             z+dz);
+      glVertex3d(x+f2*dx+b*(u[0]),  y+f2*dy+b*(u[1]), z+f2*dz+b*(u[2]));
+      glVertex3d(x+f1*dx,           y+f1*dy,          z+f1*dz);
+      glEnd();
+    }
+    else{
+      glBegin(GL_LINE_STRIP);
+      glVertex3d(x,                 y,                 z);
+      glVertex3d(x+dx,              y+dy,              z+dz);
+      glVertex3d(x+f2*dx+b*(t[0]),  y+f2*dy+b*(t[1]),  z+f2*dz+b*(t[2]));
+      glVertex3d(x+f1*dx,           y+f1*dy,           z+f1*dz);
+      glVertex3d(x+f2*dx+b*(-t[0]), y+f2*dy+b*(-t[1]), z+f2*dz+b*(-t[2]));
+      glVertex3d(x+dx,              y+dy,              z+dz);
+      glVertex3d(x+f2*dx+b*(-u[0]), y+f2*dy+b*(-u[1]), z+f2*dz+b*(-u[2]));
+      glVertex3d(x+f1*dx,           y+f1*dy,           z+f1*dz);
+      glVertex3d(x+f2*dx+b*(u[0]),  y+f2*dy+b*(u[1]),  z+f2*dz+b*(u[2]));
+      glVertex3d(x+dx,              y+dy,              z+dz);
+      glEnd();
+    }
+    break ;
+    
+  case DRAW_POST_ARROW_HEAD :
+
+
+    break ;
+
+  case DRAW_POST_PYRAMID :
+
+    b = .1333 * d;
+    
+    if(Fill){
+      glBegin(GL_TRIANGLES);
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      glVertex3d(x+b*(t[0]),  y+b*(t[1]),  z+b*(t[2]));
+      glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2]));
+      
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2]));
+      glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2]));
+      
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2]));
+      glVertex3d(x+b*(u[0]),  y+b*(u[1]),  z+b*(u[2]));
+      
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      glVertex3d(x+b*(u[0]),  y+b*(u[1]),  z+b*(u[2]));
+      glVertex3d(x+b*(t[0]),  y+b*(t[1]),  z+b*(t[2]));
+      glEnd();
+    }
+    else{
+      glBegin(GL_LINE_LOOP);
+      glVertex3d(x+b*(t[0]),  y+b*(t[1]),  z+b*(t[2]));
+      glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2]));
+      glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2]));
+      glVertex3d(x+b*(u[0]),  y+b*(u[1]),  z+b*(u[2]));
+      glEnd();
+      
+      glBegin(GL_LINES);
+      glVertex3d(x+b*(t[0]),  y+b*(t[1]),  z+b*(t[2]));
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      
+      glVertex3d(x+b*(-u[0]), y+b*(-u[1]), z+b*(-u[2]));
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      
+      glVertex3d(x+b*(-t[0]), y+b*(-t[1]), z+b*(-t[2]));
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      
+      glVertex3d (x+b*(u[0]), y+b*(u[1]),  z+b*(u[2]));
+      glVertex3d(x+dx,        y+dy,        z+dz);
+      glEnd();
+    }
+    break ;
+
+  case DRAW_POST_CONE :
+
+    b = .1333 * d;
+    c = .7071 * b; 
+
+    if(Fill){
+      glBegin(GL_TRIANGLES);
+      glVertex3d(x+b*(t[0]),       y+b*(t[1]),       z+b*(t[2]));
+      glVertex3d(x+c*(t[0]-u[0]),  y+c*(t[1]-u[1]),  z+c*(t[2]-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(t[0]-u[0]),  y+c*(t[1]-u[1]),  z+c*(t[2]-u[2]));
+      glVertex3d(x+b*(-u[0]),      y+b*(-u[1]),      z+b*(-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(-u[0]),      y+b*(-u[1]),      z+b*(-u[2]));
+      glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2]));
+      glVertex3d(x+b*(-t[0]),      y+b*(-t[1]),      z+b*(-t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(-t[0]),      y+b*(-t[1]),      z+b*(-t[2]));
+      glVertex3d(x+c*(u[0]-t[0]),  y+c*(u[1]-t[1]),  z+c*(u[2]-t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(u[0]-t[0]),  y+c*(u[1]-t[1]),  z+c*(u[2]-t[2]));
+      glVertex3d(x+b*(u[0]),       y+b*(u[1]),       z+b*(u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(u[0]),       y+b*(u[1]),       z+b*(u[2]));
+      glVertex3d(x+c*(t[0]+u[0]),  y+c*(t[1]+u[1]),  z+c*(t[2]+u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(t[0]+u[0]),  y+c*(t[1]+u[1]),  z+c*(t[2]+u[2]));
+      glVertex3d(x+b*(t[0]),       y+b*(t[1]),       z+b*(t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      glEnd();
+    }
+    else{
+      glBegin(GL_LINE_LOOP);
+      glVertex3d(x+b*(t[0]),       y+b*(t[1]),       z+b*(t[2]));
+      glVertex3d(x+c*(t[0]-u[0]),  y+c*(t[1]-u[1]),  z+c*(t[2]-u[2]));
+      glVertex3d(x+b*(-u[0]),      y+b*(-u[1]),      z+b*(-u[2]));
+      glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2]));
+      glVertex3d(x+b*(-t[0]),      y+b*(-t[1]),      z+b*(-t[2]));
+      glVertex3d(x+c*(u[0]-t[0]),  y+c*(u[1]-t[1]),  z+c*(u[2]-t[2]));
+      glVertex3d(x+b*(u[0]),       y+b*(u[1]),       z+b*(u[2]));
+      glVertex3d(x+c*(t[0]+u[0]),  y+c*(t[1]+u[1]),  z+c*(t[2]+u[2]));
+      glEnd();
+      
+      glBegin(GL_LINES);
+      glVertex3d(x+b*(t[0]),       y+b*(t[1]),       z+b*(t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(t[0]-u[0]),  y+c*(t[1]-u[1]),  z+c*(t[2]-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(-u[0]),      y+b*(-u[1]),      z+b*(-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(-t[0]-u[0]), y+c*(-t[1]-u[1]), z+c*(-t[2]-u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(-t[0]),      y+b*(-t[1]),      z+b*(-t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(u[0]-t[0]),  y+c*(u[1]-t[1]),  z+c*(u[2]-t[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+b*(u[0]),       y+b*(u[1]),       z+b*(u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      
+      glVertex3d(x+c*(t[0]+u[0]),  y+c*(t[1]+u[1]),  z+c*(t[2]+u[2]));
+      glVertex3d(x+dx,             y+dy,             z+dz);
+      glEnd();
+    }
+    break ;
+
+  default :
+    //gprintf("Unknown Type of Vector Field Type : %d", Type); 
+    exit(1);
+    
+  }
+  
+}
+
diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d42c96054306d343cfdc5f17f0cfb0c969b7e521
--- /dev/null
+++ b/Graphics/Geom.cpp
@@ -0,0 +1,951 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+#include "Verif.h"
+#include "Interpolation.h"
+#include "Numeric.h"
+
+extern Context_T  CTX;
+
+extern Mesh      *THEM;
+extern double     LC;
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ P o i n t                                                     */
+/* ------------------------------------------------------------------------ */
+
+static int   Highlighted = 0; 
+
+void Draw_Point (void *a, void *b){
+  Vertex **v;
+  char Num[100];
+
+  v = (Vertex**)a;
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glLoadName(0);
+    glPushName((*v)->Num);
+  }
+
+  if((*v)->Frozen){
+    glPointSize(5);
+    glColor4ubv((GLubyte*)&CTX.color.geom.point_sel);
+  }
+  else if(Highlighted){
+    glPointSize(5);
+    glColor4ubv((GLubyte*)&CTX.color.geom.point_hlt);
+  }
+  else{
+    glPointSize(3);
+    glColor4ubv((GLubyte*)&CTX.color.geom.point);
+  }
+
+  if(CTX.geom.points){
+    glBegin(GL_POINTS);
+    glVertex3d((*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z);
+    glEnd();
+  }
+
+  if(CTX.geom.points_num){
+    sprintf(Num,"%d",(*v)->Num);
+    glRasterPos3d((*v)->Pos.X+3*CTX.pixel_equiv_x/CTX.s[0],
+		  (*v)->Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], 
+		  (*v)->Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glPopName();
+  }
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ C u r v e                                                     */
+/* ------------------------------------------------------------------------ */
+
+
+void Draw_Curve (void *a, void *b){
+  int     i,N;
+  double  mod,dd;
+  char    Num[100];
+  Curve  *c;
+  Vertex  v,dv;
+
+  c = *(Curve**)a;
+
+  if(c->Num<0 || !EntiteEstElleVisible(c->Num)) return;
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glLoadName(1);
+    glPushName(c->Num);
+  }
+
+  if((c)->ipar[3]){
+    glLineWidth(2.);
+    glColor4ubv((GLubyte*)&CTX.color.geom.line_sel);
+  }
+  else if(Highlighted){
+    glLineWidth(2.);
+    glColor4ubv((GLubyte*)&CTX.color.geom.line_hlt);
+  }
+  else{
+    glLineWidth(1.);
+    glColor4ubv((GLubyte*)&CTX.color.geom.line);
+  }
+
+  if(CTX.geom.lines){
+  
+    if(c->Typ == MSH_SEGM_LINE)
+      N = List_Nbr(c->Control_Points);
+    else
+      N = 50;
+
+    glBegin(GL_LINE_STRIP);
+    for(i=0;i<N;i++){
+      v = InterpolateCurve(c,(double)i/(double)(N-1),0);
+      glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z);
+    }
+    glEnd();
+
+  }
+
+  if(CTX.geom.lines_num){
+    v = InterpolateCurve(c,0.5,0);
+    sprintf(Num,"%d",c->Num);
+    glRasterPos3d(v.Pos.X+3*CTX.pixel_equiv_x/CTX.s[0],
+		  v.Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], 
+		  v.Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+  
+  if(CTX.geom.tangents){
+    v  = InterpolateCurve(c,0.5,0);
+    dv = InterpolateCurve(c,0.5,1);
+    mod = sqrt(dv.Pos.X*dv.Pos.X+dv.Pos.Y*dv.Pos.Y+dv.Pos.Z*dv.Pos.Z);
+    dv.Pos.X = dv.Pos.X / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[0] ;
+    dv.Pos.Y = dv.Pos.Y / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[1] ;
+    dv.Pos.Z = dv.Pos.Z / mod * CTX.geom.tangents * CTX.pixel_equiv_x/CTX.s[2] ;
+    dd = sqrt(dv.Pos.X*dv.Pos.X+dv.Pos.Y*dv.Pos.Y+dv.Pos.Z*dv.Pos.Z);
+    glColor4ubv((GLubyte*)&CTX.color.geom.tangents);
+    Draw_Vector(DRAW_POST_ARROW, 0, v.Pos.X,v.Pos.Y,v.Pos.Z,
+		dd, dv.Pos.X,dv.Pos.Y,dv.Pos.Z, NULL,NULL);
+  }
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glPopName ();
+  }
+
+}
+
+
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ S u r f a c e                                                 */
+/* ------------------------------------------------------------------------ */
+
+void put_Z (Vertex *v, Surface *s){
+  Vertex V;
+  V.Pos.X = s->a;
+  V.Pos.Y = s->b;
+  V.Pos.Z = s->c; 
+  Projette(&V,s->plan);
+  if(V.Pos.Z != 0.0)
+    v->Pos.Z = (s->d - V.Pos.X * v->Pos.X - V.Pos.Y * v->Pos.Y)/V.Pos.Z;
+  else v->Pos.Z = 0.0;
+
+  Projette(v,s->invplan);
+}
+
+int isPointOnPlanarSurface (Surface *S, double X, double Y, double Z, double n[3]){
+  Curve *C;
+  Vertex V,P1,P2;
+  int i,j,N;
+  double Angle,u1,u2;
+
+  Angle = 0.0;
+  V.Pos.X = X;
+  V.Pos.Y = Y;
+  V.Pos.Z = Z;
+
+  for(i=0;i<List_Nbr(S->s.Generatrices);i++){
+    List_Read(S->s.Generatrices,i,&C);
+
+    switch(C->Typ){
+    case MSH_SEGM_LINE:
+      N = 1;
+      break;
+    default:
+      N = 10;
+      break;
+    }
+    for(j=0;j<N;j++){
+      u1 = (double)j/(double)(N);
+      u2 = (double)(j+1)/(double)(N);
+      P1 = InterpolateCurve(C,u1,0);
+      P2 = InterpolateCurve(C,u2,0);
+      Angle += angle_plan(&V,&P1,&P2,n);
+    }
+  }
+
+  if(fabs(Angle) > 6.0 && fabs(Angle) < 7.)return 1;
+  return 0;
+
+}
+
+void Plan_SurfPlane (void *data,void *dum){
+  Surface **pS , *s;
+  Curve    *pC;
+  Vertex   *v;
+  int       ix,iy,iz,i,j,N;
+  double    det,sys[3][3],b[3],res[3],mod,t1[3],t2[3],ex[3],s2s[2][2],r2[2],X,Y,Z;
+
+  static List_T *points;
+  static int deb=1;
+
+  pS = (Surface**)data;
+  s = *pS;
+
+  if(deb){
+    points = List_Create(10,10,sizeof(Vertex*));
+    deb = 0;
+  }
+
+  if(s->Typ == MSH_SURF_PLAN){
+    for(i=0;i<List_Nbr(s->s.Generatrices);i++){
+      List_Read(s->s.Generatrices,i,&pC);
+      for(j=0;j<List_Nbr(pC->Control_Points);j++){
+	     List_Add(points,List_Pointer(pC->Control_Points,j));
+      }
+    }
+  }
+  else{
+    return;
+  }
+  
+  N = List_Nbr(points);
+
+  for(i=0;i<3;i++){
+    b[i] = 0.0;
+    for(j=0;j<3;j++){
+      sys[i][j] = 0.0;
+    }
+  }
+
+  /* ax + by + cz = 1 */
+
+  ix=iy=iz=0;
+
+  for(i=0;i<N;i++){
+    List_Read(points,i,&v);
+    if(!i){
+      X = v->Pos.X;
+      Y = v->Pos.Y;
+      Z = v->Pos.Z;
+    }
+    else{
+      if(X != v->Pos.X ) ix = 1;
+      if(Y != v->Pos.Y ) iy = 1;
+      if(Z != v->Pos.Z ) iz = 1;
+    }
+
+    sys[0][0] += v->Pos.X * v->Pos.X;
+    sys[1][1] += v->Pos.Y * v->Pos.Y;
+    sys[2][2] += v->Pos.Z * v->Pos.Z;
+    sys[0][1] += v->Pos.X * v->Pos.Y;
+    sys[0][2] += v->Pos.X * v->Pos.Z;
+    sys[1][2] += v->Pos.Y * v->Pos.Z;
+    sys[2][1] = sys[1][2];
+    sys[1][0] = sys[0][1];
+    sys[2][0] = sys[0][2];
+    b[0]      += v->Pos.X;
+    b[1]      += v->Pos.Y;
+    b[2]      += v->Pos.Z;
+  }
+ 
+  s->d = 1.0;
+
+  /* x = X */
+
+  if(!ix){
+    s->d = X;
+    res[0] = 1.;
+    res[1] = res[2] = 0.0;
+
+  }
+
+  /* y = Y */
+
+  else if(!iy){
+    s->d = Y;
+    res[1] = 1.;
+    res[0] = res[2] = 0.0;
+  }
+
+  /* z = Z */
+
+  else if(!iz){
+    s->d = Z;
+    res[2] = 1.;
+    res[1] = res[0] = 0.0;
+  }
+  
+  /* by + cz = -x */
+
+  else if (!sys3x3(sys,b,res,&det) ){
+    s->d = 0.0;
+    s2s[0][0] = sys[1][1];
+    s2s[0][1] = sys[1][2];
+    s2s[1][0] = sys[1][2];
+    s2s[1][1] = sys[2][2];
+    b[0]      = -sys[0][1];
+    b[1]      = -sys[0][2];
+    if(sys2x2(s2s,b,r2)){
+      res[0] = 1.;
+      res[1] = r2[0];
+      res[2] = r2[1];
+    }    
+    /* ax + cz = -y */    
+    else {
+      s->d = 0.0;
+      s2s[0][0] = sys[0][0];
+      s2s[0][1] = sys[0][2];
+      s2s[1][0] = sys[0][2];
+      s2s[1][1] = sys[2][2];
+      b[0]      = -sys[0][1];
+      b[1]      = -sys[1][2];
+      if(sys2x2(s2s,b,r2)){
+	res[0] = r2[0];
+	res[1] = 1.;
+	res[2] = r2[1];
+      }      
+      /* ax + by = -z */
+      else {
+	s->d = 1.0;
+	s2s[0][0] = sys[0][0];
+	s2s[0][1] = sys[0][1];
+	s2s[1][0] = sys[0][1];
+	s2s[1][1] = sys[1][1];
+	b[0]      = -sys[0][2];
+	b[1]      = -sys[1][2];
+	if(sys2x2(s2s,b,r2)){
+	  res[0] = r2[0];
+	  res[1] = r2[1];
+	  res[2] = 1.;
+	}
+	else {
+	  printf("erreur Plan_SurfPlane\n");
+	}
+      }
+    }
+  }
+  
+  s->a = res[0];
+  s->b = res[1];
+  s->c = res[2];
+  mod = sqrt (res[0] * res[0] + res[1] * res[1] + res[2] * res[2]);
+  for(i=0;i<3;i++) res[i]/=mod;
+  
+  /* L'axe n'est pas l'axe des x */
+  if(res[0] > res[1]){
+    ex[0] = 0.;
+    ex[1] = 1.;
+    ex[2] = 0.;
+  }
+  else{
+    ex[0] = 1.;
+    ex[1] = 0.;
+    ex[2] = 0.;
+  }
+  
+  prodve(res,ex,t1);
+  
+  mod = sqrt (t1[0] * t1[0] + t1[1] * t1[1] + t1[2] * t1[2] ) ;
+  for(i=0;i<3;i++) t1[i]/=mod;
+
+  prodve(t1,res,t2);
+
+  mod = sqrt (t2[0] * t2[0] + t2[1] * t2[1] + t2[2] * t2[2] ) ;
+  for(i=0;i<3;i++) t2[i]/=mod;
+
+  for(i=0;i<3;i++)s->plan[0][i] = t1[i];
+  for(i=0;i<3;i++)s->plan[1][i] = t2[i];
+  for(i=0;i<3;i++)s->plan[2][i] = res[i];
+
+  /* Matrice orthogonale */
+
+  for(i=0;i<3;i++){
+    for(j=0;j<3;j++){
+      s->invplan[i][j] = s->plan[j][i];
+    }
+  }
+  List_Reset(points);
+} 
+
+
+void Draw_Plane_Surface (Surface *s){
+  int i,k;
+  Curve *c;
+  double minx,miny,maxx,maxy,t,n[3],nn;
+  Vertex P1,P2,P3,V[4],vv,vv1,vv2;
+  char Num[100];
+
+  if(!s->Orientations){
+    s->Orientations = List_Create(20,2,sizeof(Vertex));
+    Plan_SurfPlane(&s,NULL); 
+    k = 0;
+    
+    for(i=0;i<List_Nbr(s->s.Generatrices);i++){
+      List_Read (s->s.Generatrices,i,&c);
+      P1 = InterpolateCurve(c,0.0,0);
+      P2 = InterpolateCurve(c,0.5,0);
+      P3 = InterpolateCurve(c,1.0,0);
+      Projette(&P1,s->plan);
+      Projette(&P2,s->plan);
+      Projette(&P3,s->plan);
+
+      if(!k){
+	k = 1;
+	minx = maxx = P1.Pos.X;
+	miny = maxy = P1.Pos.Y;
+      }
+      minx = DMIN(DMIN(DMIN(minx,P1.Pos.X),P2.Pos.X),P3.Pos.X);      
+      miny = DMIN(DMIN(DMIN(miny,P1.Pos.Y),P2.Pos.Y),P3.Pos.Y);      
+      maxx = DMAX(DMAX(DMAX(maxx,P1.Pos.X),P2.Pos.X),P3.Pos.X);      
+      maxy = DMAX(DMAX(DMAX(maxy,P1.Pos.Y),P2.Pos.Y),P3.Pos.Y);      
+    }
+
+    V[0].Pos.X = minx;
+    V[0].Pos.Y = miny;
+
+    V[1].Pos.X = maxx;
+    V[1].Pos.Y = miny;
+    
+    V[2].Pos.X = maxx;
+    V[2].Pos.Y = maxy;
+    
+    V[3].Pos.X = minx;
+    V[3].Pos.Y = maxy;
+    for(i=0;i<4;i++){
+      V[i].Pos.Z = 0.0;
+      put_Z(&V[i],s);
+    }
+    n[0] = s->plan[2][0];
+    n[1] = s->plan[2][1];
+    n[2] = s->plan[2][2];
+    norme(n);
+
+    k = 0;
+    for(i=0;i<100;i++){
+      t = (double)i/(double)(100);
+      vv.Pos.X = t * 0.5 * (V[0].Pos.X + V[1].Pos.X) + (1.-t) * 
+	0.5 * (V[2].Pos.X + V[3].Pos.X); 
+      vv.Pos.Y = t * 0.5 * (V[0].Pos.Y + V[1].Pos.Y) + (1.-t) * 
+	0.5 * (V[2].Pos.Y + V[3].Pos.Y); 
+      vv.Pos.Z = t * 0.5 * (V[0].Pos.Z + V[1].Pos.Z) + (1.-t) * 
+	0.5 * (V[2].Pos.Z + V[3].Pos.Z); 
+      if(isPointOnPlanarSurface(s,vv.Pos.X,vv.Pos.Y,vv.Pos.Z,n)){
+	if(!k){
+	  List_Add(s->Orientations,&vv);
+	  k = 1;
+	}
+      }
+      else{
+	if(k){
+	  List_Add(s->Orientations,&vv);
+	  k = 0;
+	}    
+      }
+    }
+    if(k) List_Add(s->Orientations,&vv);
+    
+    k = 0;
+    for(i=0;i<100;i++){
+
+      t = (double)i/(double)(100);
+      vv.Pos.X = t*.5*(V[0].Pos.X+V[3].Pos.X)+(1.-t)*.5*(V[2].Pos.X+V[1].Pos.X); 
+      vv.Pos.Y = t*.5*(V[0].Pos.Y+V[3].Pos.Y)+(1.-t)*.5*(V[2].Pos.Y+V[1].Pos.Y);
+      vv.Pos.Z = t*.5*(V[0].Pos.Z+V[3].Pos.Z)+(1.-t)*.5*(V[2].Pos.Z+V[1].Pos.Z); 
+      if(isPointOnPlanarSurface(s,vv.Pos.X,vv.Pos.Y,vv.Pos.Z,n)){
+	if(!k){
+	  List_Add(s->Orientations,&vv);
+	  k = 1;
+	}
+      }
+      else{
+	if(k){
+	  List_Add(s->Orientations,&vv);
+	  k = 0;
+	}    
+      }
+    }
+    if(k)List_Add(s->Orientations,&vv);
+    fprintf(stderr, "Surface %d %d points\n",s->Num,List_Nbr(s->Orientations)); 
+  }
+
+  if(CTX.geom.surfaces){
+    glBegin(GL_LINES);
+    for(i=0;i<List_Nbr(s->Orientations);i++){
+      List_Read(s->Orientations,i,&vv);
+      glVertex3d(vv.Pos.X,vv.Pos.Y,vv.Pos.Z);
+    }
+    glEnd();
+  }
+
+  glDisable(GL_LINE_STIPPLE);
+
+  if(CTX.geom.surfaces_num){
+    List_Read(s->Orientations,0,&vv1);
+    List_Read(s->Orientations,1,&vv2);
+    sprintf(Num,"%d",s->Num);
+    glRasterPos3d((vv2.Pos.X+vv1.Pos.X)/2. + 3*CTX.pixel_equiv_x/CTX.s[0],
+		  (vv2.Pos.Y+vv1.Pos.Y)/2. + 3*CTX.pixel_equiv_x/CTX.s[1], 
+		  (vv2.Pos.Z+vv1.Pos.Z)/2. + 3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+
+  if(CTX.geom.normals) {
+    List_Read(s->Orientations,0,&vv1);
+    List_Read(s->Orientations,1,&vv2);
+    n[0] = s->plan[2][0];
+    n[1] = s->plan[2][1];
+    n[2] = s->plan[2][2];
+    norme(n);
+    n[0] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[0] ;
+    n[1] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[1] ;
+    n[2] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[2] ;
+    nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+    glColor4ubv((GLubyte*)&CTX.color.geom.normals);
+    Draw_Vector(DRAW_POST_ARROW, 0, (vv2.Pos.X+vv1.Pos.X)/2., (vv2.Pos.Y+vv1.Pos.Y)/2., 
+		(vv2.Pos.Z+vv1.Pos.Z)/2., nn, n[0],n[1],n[2],NULL,NULL);
+  }
+
+}
+
+
+void Draw_NonPlane_Surface (Surface *s){
+  Vertex   v,n1,n2,n3;
+  int      i,NbTics,N;
+  double   u,n[3],nn,nx[3],ny[3];
+  double  tics[20];
+  double u0, un,v0,vn;
+  int kk;
+  char Num[100];
+
+  u0 =v0= 0;
+  un =vn= 1;
+
+  if(!s)return;
+
+  if((s->Typ == MSH_SURF_NURBS)){
+    NbTics = 5;
+    u0 = s->ku[0];
+    un = s->ku[s->OrderU + s->Nu];
+    v0 = s->kv[0];
+    vn = s->kv[s->OrderV + s->Nv];
+    for(i=0;i<NbTics;i++){
+      tics[i] = v0 + ((double)(i+1)/(double)NbTics) * (vn - v0);
+    }
+    if(CTX.geom.shade){
+      GLUnurbsObj *nurb;
+      nurb=gluNewNurbsRenderer();
+      gluNurbsProperty(nurb,(GLenum)GLU_SAMPLING_TOLERANCE,50.0);
+      gluNurbsProperty(nurb,(GLenum)GLU_DISPLAY_MODE,GLU_FILL );
+      gluBeginSurface(nurb);
+      gluNurbsSurface(nurb, s->Nu+s->OrderU+1,s->ku, s->Nv+s->OrderV+1,s->kv,
+		      4, 4*s->Nu, s->cp, s->OrderU+1,s->OrderV+1,
+		      GL_MAP2_VERTEX_4);
+      gluEndSurface(nurb);
+      gluDeleteNurbsRenderer(nurb);
+      return;
+    }
+  }
+  else {
+    NbTics = 1;
+    tics[0] = 0.5;
+  }
+
+  glEnable(GL_LINE_STIPPLE);
+
+
+  if(CTX.geom.surfaces){
+    for(kk = 0;kk<NbTics;kk++){
+      N = 50;
+      glBegin(GL_LINE_STRIP);
+      for(i=0;i<N+1;i++){
+    	u = u0 + (un-u0)*(double)i/(double)N;
+    	v = InterpolateSurface(s,u,tics[kk],0,0);
+    	glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z);
+      }
+      glEnd();
+    }
+  }
+
+  if(s->Typ == MSH_SURF_NURBS){
+    for(i=0;i<NbTics;i++){
+      tics[i] = u0+((double)(i+1)/(double)NbTics) * (un - u0);
+    }
+  }
+
+  if(CTX.geom.surfaces){
+    for( kk = 0;kk<NbTics;kk++){
+      glBegin(GL_LINE_STRIP);
+      for(i=0;i<N+1;i++){
+    	u = v0 + (vn-v0)*(double)i/(double)N;
+    	v = InterpolateSurface(s,tics[kk],u,0,0);
+    	glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z);
+      }
+      glEnd();
+    }
+  }
+
+  if(s->Mat){
+    glLineWidth(1.);
+  }
+
+  if(CTX.geom.surfaces_num){
+    v = InterpolateSurface(s,0.5,0.5,0,0);
+    sprintf(Num,"%d",s->Num);
+    glRasterPos3d(v.Pos.X+3*CTX.pixel_equiv_x/CTX.s[0],
+		  v.Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], 
+		  v.Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+
+  if(CTX.geom.normals){
+    glDisable(GL_LINE_STIPPLE);
+    n1 = InterpolateSurface(s,0.5,0.5,0,0);
+    n2 = InterpolateSurface(s,0.6,0.5,0,0);
+    n3 = InterpolateSurface(s,0.5,0.6,0,0);
+    nx[0] = n2.Pos.X - n1.Pos.X;
+    nx[1] = n2.Pos.Y - n1.Pos.Y;
+    nx[2] = n2.Pos.Z - n1.Pos.Z;
+    ny[0] = n3.Pos.X - n1.Pos.X;
+    ny[1] = n3.Pos.Y - n1.Pos.Y;
+    ny[2] = n3.Pos.Z - n1.Pos.Z;
+    prodve(nx,ny,n);
+    norme(n);
+    n[0] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[0] ;
+    n[1] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[1] ;
+    n[2] *= CTX.geom.normals * CTX.pixel_equiv_x/CTX.s[2] ;
+    nn = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+    glColor4ubv((GLubyte*)&CTX.color.geom.normals);
+    Draw_Vector(DRAW_POST_ARROW, 0, n1.Pos.X, n1.Pos.Y, n1.Pos.Z,
+		nn, n[0],n[1],n[2],NULL,NULL);
+    glEnable(GL_LINE_STIPPLE);
+  }
+
+}
+
+void Draw_Simplex_Surfaces (void *a, void *b);
+
+void Draw_Surface (void *a, void *b){
+  Surface *s;
+
+  s = *(Surface**)a;
+
+  //  if(!s->Support)return;
+
+  if(!EntiteEstElleVisible(s->Num)) return;
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glLoadName(2);
+    glPushName(s->Num);
+  }
+
+  if(!CTX.geom.shade){
+    if(s->Mat){
+      glLineWidth(2.);
+      glColor4ubv((GLubyte*)&CTX.color.geom.surface_sel);
+    }
+    else if (Highlighted){
+      glLineWidth(2.);
+      glColor4ubv((GLubyte*)&CTX.color.geom.surface_hlt);
+      glEnable(GL_LINE_STIPPLE);
+      glLineStipple(1,0x0F0F);
+    }
+    else{
+      glLineWidth(1.);
+      glColor4ubv((GLubyte*)&CTX.color.geom.surface);
+      glEnable(GL_LINE_STIPPLE);
+      glLineStipple(1,0x0F0F);
+    }
+  }
+  else{
+    ColorSwitch(abs(s->Num));
+  }
+
+  if(s->Typ == MSH_SURF_STL){
+    glDisable(GL_LINE_STIPPLE);
+    Tree_Action(s->STL->Simplexes,Draw_Simplex_Surfaces);
+  }
+  else if(s->Typ == MSH_SURF_PLAN)
+    Draw_Plane_Surface(s);
+  else
+    Draw_NonPlane_Surface(s);
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glPopName ();
+    glDisable(GL_LINE_STIPPLE);
+  }
+
+  glDisable(GL_LINE_STIPPLE);
+
+
+}
+
+
+
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ G e o m                                                       */
+/* ------------------------------------------------------------------------ */
+
+extern void DrawVolumes (Mesh *m);
+
+void Draw_Geom (Mesh *m) {
+
+  if(m->status == -1) return;
+
+  if(CTX.geom.points || CTX.geom.points_num)
+    Tree_Action(m->Points, Draw_Point);
+  if(CTX.geom.lines || CTX.geom.lines_num)
+    Tree_Action(m->Curves,  Draw_Curve  );
+  if(CTX.geom.surfaces || CTX.geom.surfaces_num)
+    Tree_Action(m->Surfaces,Draw_Surface);
+  if(CTX.geom.volumes || CTX.geom.volumes_num)
+    DrawVolumes(m);
+
+}
+
+void ZeroCurve(void *a,void *b){
+  Curve *c;
+  c = *(Curve**)a;
+  c->ipar[3] = 0;
+}
+
+void ZeroPoint(void *a,void *b){
+  Vertex *v;
+  v = *(Vertex**)a;
+  v->Frozen = 0;
+}
+
+void ZeroSurface(void *a,void *b){
+  Surface *s;
+  s = *(Surface**)a;
+  s->Mat = 0;
+}
+
+void ZeroHighlight(Mesh *m){
+  Tree_Action(m->Points,ZeroPoint);
+  Tree_Action(m->Curves,ZeroCurve);
+  Tree_Action(m->Surfaces,ZeroSurface);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ A x e s                                                       */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Axes (double s) {
+  double  f, g, b, c;
+  
+  if(s == 0.) return;
+
+  f = 0.666 * s;
+  g = 1.233 * s;
+  b = .1 * s;
+  c = 0.666 * b;
+
+  glLineWidth(1.);
+  glColor4ubv((GLubyte*)&CTX.color.axes);
+
+  glBegin(GL_LINES);
+  if(CTX.range[2] != 0.){
+    /* X */
+    glVertex3d(0.,   0.,   0.);  
+    glVertex3d(s,    0.,   0.);  
+    glVertex3d(g-b,  b,    0.);  
+    glVertex3d(g+b, -b,    0.);  
+    glVertex3d(g,   -b,    b);  
+    glVertex3d(g,    b,   -b);  
+    /* Y */
+    glVertex3d(0.,   0.,   0.);  
+    glVertex3d(0.,   s,    0.);  
+    glVertex3d(-b,   g+b,  0.);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(0.,   g+b, -b);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(.5*b, g-b, .5*b);  
+    /* Z */
+    glVertex3d(0.,   0.,   0.);  
+    glVertex3d(0.,   0.,   s);  
+    glVertex3d(-b,   b,    g);  
+    glVertex3d(0.,   b,    g-b);  
+    glVertex3d(0.,   b,    g-b);  
+    glVertex3d(0.,  -b,    g+b);  
+    glVertex3d(0.,  -b,    g+b);  
+    glVertex3d(b,   -b,    g);  
+  }
+  else{
+    /* X */
+    glVertex3d(0.,   0.,   0.);  
+    glVertex3d(s,    0.,   0.);  
+    glVertex3d(g-c,  b,    0.);  
+    glVertex3d(g+c, -b,    0.);  
+    glVertex3d(g-c, -b,    0.);  
+    glVertex3d(g+c,  b,    0.);  
+    /* Y */
+    glVertex3d(0.,   0.,   0.);  
+    glVertex3d(0.,   s,    0.);  
+    glVertex3d(-c,   g+b,  0.);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(c,    g+b,  0.);  
+    glVertex3d(0.,   g,    0.);  
+    glVertex3d(0.,   g-b,  0.);
+  }
+  glEnd();
+  
+  glEnable(GL_LINE_STIPPLE);
+  glLineStipple(2,0x0F0F);
+  glBegin(GL_LINES);
+  if(CTX.range[2] != 0.){
+    glVertex3d(f,  0., 0.);  
+    glVertex3d(f,  0., f );  
+    glVertex3d(f,  0., f );  
+    glVertex3d(0., 0., f );  
+    glVertex3d(0., 0., f );  
+    glVertex3d(0., f,  f );  
+    glVertex3d(0., f,  f );  
+    glVertex3d(0., f,  0.);  
+  }
+  glVertex3d(0., f,  0.);  
+  glVertex3d(f,  f,  0.);  
+  glVertex3d(f,  f,  0.);  
+  glVertex3d(f,  0., 0.);  
+  glEnd();
+  glDisable(GL_LINE_STIPPLE);
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  H i g h l i g h t                                                       */
+/* ------------------------------------------------------------------------ */
+
+void begin_highlight(void){
+  if(CTX.geom.highlight){
+    Highlighted = 1;
+    if(CTX.overlay){ 
+      InitOv();
+    }
+    else{ 
+      Init();
+    }
+    glPushMatrix();
+    InitPosition();    
+    if(CTX.db) glDrawBuffer(GL_FRONT);
+  }  
+}
+
+
+void end_highlight(int permanent){
+  Highlighted = 0;
+  if(permanent){
+    Init();
+    Draw();
+  }
+  else{
+    if(CTX.geom.highlight) {
+      glPopMatrix();
+      if(CTX.db) glDrawBuffer(GL_BACK);
+    }
+  }
+}
+
+void highlight_entity(Vertex *v,Curve *c, Surface *s, int permanent){
+
+  Curve *cc;
+  Vertex *v1,*v2;
+  char Message[256],temp[256];
+  int i,nbg;
+
+  if(v){
+    if(permanent) v->Frozen = 1;
+    if(CTX.geom.highlight) Draw_Point(&v,NULL);
+    Msg(SELECT,"Point %d {%.5g,%.5g,%.5g} (%.5g)", v->Num,v->Pos.X,v->Pos.Y,v->Pos.Z,v->lc);
+  }
+  else if(c){
+    if(permanent) c->ipar[3] = 1;
+    if(CTX.geom.highlight) Draw_Curve(&c,NULL);
+
+    List_Read(c->Control_Points,0,&v1);
+    List_Read(c->Control_Points,List_Nbr(c->Control_Points)-1,&v2);
+    Msg(SELECT,"Line %d  {%d->%d}",c->Num,v1->Num,v2->Num);
+  }
+  else if(s){
+    if(permanent && s->Mat == 1) return;
+    if(permanent) s->Mat = 1;
+    if(CTX.geom.highlight) Draw_Surface(&s,NULL);
+
+    if(s->Typ == MSH_SURF_PLAN)sprintf(Message,"Plan Surf %d {",s->Num);
+    else if(s->Typ == MSH_SURF_REGL)sprintf(Message,"Ruld Surf %d {",s->Num);
+    else sprintf(Message,"Surf %d {",s->Num);
+
+    nbg = List_Nbr(s->s.Generatrices) ;
+
+    if(nbg < 10){
+      for(i=0;i<nbg;i++){
+	List_Read(s->s.Generatrices,i,&cc);
+	if(!i)sprintf(temp,"%d",cc->Num);
+	else sprintf(temp,",%d",cc->Num);
+	strcat(Message,temp);
+      }
+    }
+    else{
+      strcat(Message,"...");
+    }
+    strcat(Message,"}");
+    Msg(SELECT,Message);
+  }
+  else{
+    Msg(SELECT," ");
+  }
+
+}
+
+
+void highlight_entity_num(int v, int c, int s, int permanant){
+  Vertex *pv,V;
+  Curve *pc,C;
+  Surface *ps,S;
+  if(v){
+    pv = &V;
+    pv->Num = v;
+    if(Tree_Query(THEM->Vertices,&pv)){
+      highlight_entity(pv,NULL,NULL,permanant);
+    }
+  }
+  if(c){
+    pc = &C;
+    pc->Num = c;
+    if(Tree_Query(THEM->Curves,&pc)){
+      highlight_entity(NULL,pc,NULL,permanant);
+    }
+  }
+  if(s){
+    ps = &S;
+    ps->Num = s;
+    if(Tree_Query(THEM->Surfaces,&ps)){
+      highlight_entity(NULL,NULL,ps,permanant);
+    }
+  }
+  glFlush();
+}
+
diff --git a/Graphics/Iso.cpp b/Graphics/Iso.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3222465355da09ae8c9c289655916283eb86e2ef
--- /dev/null
+++ b/Graphics/Iso.cpp
@@ -0,0 +1,315 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+#include "Draw.h"
+
+void RaiseFill(int i, double Val, double ValMin, double Raise[3][5]);
+
+/* ------------------------------------------------------------------------ */
+/*  I n t e r p o l a t e                                                   */
+/* ------------------------------------------------------------------------ */
+
+void Interpolate(double *X, double *Y, double *Z, 
+		 double *Val, double V, int I1, int I2, 
+		 double *XI, double *YI ,double *ZI){
+  
+  if(Val[I1] == Val[I2]){
+    *XI = X[I1]; 
+    *YI = Y[I1]; 
+    *ZI = Z[I1]; 
+  }
+  else{
+    *XI= (V - Val[I1])*(X[I2]-X[I1])/(Val[I2]-Val[I1]) + X[I1];
+    *YI= (V - Val[I1])*(Y[I2]-Y[I1])/(Val[I2]-Val[I1]) + Y[I1];
+    *ZI= (V - Val[I1])*(Z[I2]-Z[I1])/(Val[I2]-Val[I1]) + Z[I1];
+  }
+}
+
+/* ------------------------------------------------------------------------ */
+/*  S i m p l e x                                                           */
+/* ------------------------------------------------------------------------ */
+
+void IsoSimplex(double *X, double *Y, double *Z, double *Val, 
+		double V, double Vmin, double Vmax, 
+		double *Offset, double Raise[3][5], int shade){
+  int    nb;
+  double Xp[6],Yp[6],Zp[6];
+
+  if(V != Vmax){
+    nb = 0;
+    if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[0] > V && Val[3] <= V) || (Val[3] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){
+      Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[1] > V && Val[3] <= V) || (Val[3] > V && Val[1] <= V)){
+      Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[2] > V && Val[3] <= V) || (Val[3] > V && Val[2] <= V)){
+      Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+  }
+  else{
+    nb=0;
+    if((Val[0] < V && Val[1] <= V) || (Val[1] < V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[0] < V && Val[2] <= V) || (Val[2] < V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[0] < V && Val[3] <= V) || (Val[3] < V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[1] < V && Val[2] <= V) || (Val[2] < V && Val[1] <= V)){
+      Interpolate(X,Y,Z,Val,V,1,2,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[1] < V && Val[3] <= V) || (Val[3] < V && Val[1] <= V)){
+      Interpolate(X,Y,Z,Val,V,1,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+    if((Val[2] < V && Val[3] <= V) || (Val[3] < V && Val[2] <= V)){
+      Interpolate(X,Y,Z,Val,V,2,3,&Xp[nb],&Yp[nb],&Zp[nb]); nb++;
+    }
+  }
+
+  if(nb == 3) 
+    Draw_Triangle(Xp,Yp,Zp,Offset,Raise,shade);
+  else if(nb == 4)
+    Draw_Quadrangle(Xp,Yp,Zp,Offset,Raise,shade);
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  T r i a n g l e                                                         */
+/* ------------------------------------------------------------------------ */
+
+void CutTriangle1D(double *X, double *Y, double *Z, double *Val, 
+		   double V, double Vmin, double Vmax,
+		   double *Xp, double *Yp, double *Zp, int *nb){
+  
+  if(V != Vmax){
+    *nb = 0;
+    if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }
+    if((Val[0] > V && Val[2] <= V) || (Val[2] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }
+    if((Val[1] > V && Val[2] <= V) || (Val[2] > V && Val[1] <= V)){
+      Interpolate(X,Y,Z,Val,V,1,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }
+  }
+  else{
+    *nb = 0;
+    if((Val[0] < V && Val[1] >= V) || (Val[1] < V && Val[0] >= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }
+    if((Val[0] < V && Val[2] >= V) || (Val[2] < V && Val[0] >= V)){
+      Interpolate(X,Y,Z,Val,V,0,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }       
+    if((Val[1] < V && Val[2] >= V) || (Val[2] < V && Val[1] >= V)){
+      Interpolate(X,Y,Z,Val,V,1,2,&Xp[*nb],&Yp[*nb],&Zp[*nb]); (*nb)++;
+    }
+  }
+
+}
+
+void CutTriangle2D(double *X, double *Y, double *Z, double *Val, 
+		   double V1, double V2, double Vmin, double Vmax,
+		   double *Xp2, double *Yp2, double *Zp2, int *Np2, double *Vp2){
+
+  int     i, io[3],j,iot,Np,Fl;
+  double  Xp[5],Yp[5],Zp[5],Vp[5];
+
+  *Np2 = 0;
+
+  for(i=0;i<3;i++) io[i] = i;
+
+  for(i=0;i<2;i++){
+    for(j=i+1;j<3;j++){
+      if(Val[io[i]]>Val[io[j]]){
+	iot = io[i];
+	io[i] = io[j];
+	io[j] = iot;
+      }
+    }
+  }
+
+  /* io[] contient un indexage des noeuds t.q. Val[io[i]] > Val[io[j]] si i > j */
+
+  if(Val[io[0]] > V2) return;
+  if(Val[io[2]] < V1) return;
+
+  if(V1 <= Val[io[0]] && Val[io[2]] <= V2){
+    memcpy(Vp2,Val,3*sizeof(double));
+    memcpy(Xp2,X,3*sizeof(double)); 
+    memcpy(Yp2,Y,3*sizeof(double)); 
+    memcpy(Zp2,Z,3*sizeof(double)); 
+    *Np2 = 3;
+    return;
+  }
+
+  Np = 0;
+  if(V1<=Val[io[0]]){
+    Vp[Np] = Val[io[0]];
+    Xp[Np] = X[io[0]]; 
+    Yp[Np] = Y[io[0]]; 
+    Zp[Np] = Z[io[0]]; 
+    Np++; Fl = 1;
+  }
+  else if(Val[io[0]] < V1 && V1 <= Val[io[1]]){
+    Vp[Np] = V1;
+    Interpolate(X,Y,Z,Val,V1,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; 
+    Vp[Np] = V1;
+    Interpolate(X,Y,Z,Val,V1,io[0],io[1],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; Fl = 1;
+  }
+  else {
+    Vp[Np] = V1;
+    Interpolate(X,Y,Z,Val,V1,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++;
+    Vp[Np] = V1;
+    Interpolate(X,Y,Z,Val,V1,io[1],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++; Fl = 0;
+  }    
+
+  if(V2 == Val[io[0]]){
+    return;
+  }
+  else if((Val[io[0]]<V2) && ( V2 < Val[io[1]])){
+    Vp[Np] = V2;
+    Interpolate(X,Y,Z,Val,V2,io[0],io[1],&Xp[Np],&Yp[Np],&Zp[Np]); Np++;
+    Vp[Np] = V2;
+    Interpolate(X,Y,Z,Val,V2,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++;
+  }
+  else if(V2 < Val[io[2]]){
+    if(Fl){
+      Vp[Np] = Val[io[1]];
+      Xp[Np] = X[io[1]]; 
+      Yp[Np] = Y[io[1]]; 
+      Zp[Np] = Z[io[1]];
+      Np++;
+    }
+    Vp[Np] = V2;
+    Interpolate(X,Y,Z,Val,V2,io[1],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++;
+    Vp[Np] = V2;
+    Interpolate(X,Y,Z,Val,V2,io[0],io[2],&Xp[Np],&Yp[Np],&Zp[Np]); Np++;
+  }
+  else{
+    if(Fl){
+      Vp[Np] = Val[io[1]];
+      Xp[Np] = X[io[1]];
+      Yp[Np] = Y[io[1]]; 
+      Zp[Np] = Z[io[1]];
+      Np++;
+    }
+    Vp[Np] = Val[io[2]];
+    Xp[Np] = X[io[2]]; 
+    Yp[Np] = Y[io[2]]; 
+    Zp[Np] = Z[io[2]];
+    Np++;
+  }
+
+  Vp2[0] = Vp[0];
+  Xp2[0] = Xp[0]; 
+  Yp2[0] = Yp[0]; 
+  Zp2[0] = Zp[0]; 
+  *Np2 = 1;
+
+  for(i=1;i<Np;i++){
+    if((Xp[i] != Xp2[(*Np2)-1]) ||(Yp[i] != Yp2[(*Np2)-1]) ||(Zp[i] != Zp2[(*Np2)-1])){      
+      Vp2[*Np2] = Vp[i];
+      Xp2[*Np2] = Xp[i]; 
+      Yp2[*Np2] = Yp[i]; 
+      Zp2[*Np2] = Zp[i];
+      (*Np2)++;
+    }
+  }
+
+  if(Xp2[0] == Xp2[(*Np2)-1] && Yp2[0] == Yp2[(*Np2)-1] && Zp2[0] == Zp2[(*Np2)-1]){
+    (*Np2)-- ;
+  }
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  L i n e                                                                 */
+/* ------------------------------------------------------------------------ */
+
+void CutLine0D(double *X, double *Y, double *Z, double *Val, 
+	       double V, double Vmin, double Vmax,
+	       double *Xp, double *Yp, double *Zp, int *nb){
+  
+  *nb = 0;
+
+  if(V != Vmax){
+    if((Val[0] > V && Val[1] <= V) || (Val[1] > V && Val[0] <= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,Xp,Yp,Zp); *nb = 1;
+    }
+  }
+  else{
+    if((Val[0] < V && Val[1] >= V) || (Val[1] < V && Val[0] >= V)){
+      Interpolate(X,Y,Z,Val,V,0,1,Xp,Yp,Zp); *nb = 1;
+    }
+  }
+}
+
+void CutLine1D(double *X, double *Y, double *Z, double *Val, 
+	       double V1, double V2, double Vmin, double Vmax,
+	       double *Xp2, double *Yp2, double *Zp2, int *Np2, double *Vp2){
+
+  int io[2];
+
+  if(Val[0]<Val[1]){
+    io[0] = 0;
+    io[1] = 1;
+  }
+  else{
+    io[0] = 1;
+    io[1] = 0;
+  }
+
+  /* io[] contient un indexage des noeuds t.q. Val[io[i]] > Val[io[j]] si i > j */
+
+  *Np2 = 0;
+
+  if(Val[io[0]] > V2) return;
+  if(Val[io[1]] < V1) return;
+
+  *Np2 = 2;
+
+  if(V1 <= Val[io[0]] && Val[io[1]] <= V2){
+    memcpy(Vp2,Val,2*sizeof(double));
+    memcpy(Xp2,X,2*sizeof(double)); 
+    memcpy(Yp2,Y,2*sizeof(double)); 
+    memcpy(Zp2,Z,2*sizeof(double)); 
+    return;
+  }
+
+  if(V1<=Val[io[0]]){
+    Vp2[0] = Val[io[0]];
+    Xp2[0] = X[io[0]]; 
+    Yp2[0] = Y[io[0]]; 
+    Zp2[0] = Z[io[0]]; 
+  }
+  else{
+    Vp2[0] = V1;
+    Interpolate(X,Y,Z,Val,V1,io[0],io[1],&Xp2[0],&Yp2[0],&Zp2[0]);
+  }
+
+  if(V2>=Val[io[1]]){
+    Vp2[1] = Val[io[1]];
+    Xp2[1] = X[io[1]]; 
+    Yp2[1] = Y[io[1]]; 
+    Zp2[1] = Z[io[1]]; 
+  }
+  else{
+    Vp2[1] = V2;
+    Interpolate(X,Y,Z,Val,V2,io[0],io[1],&Xp2[1],&Yp2[1],&Zp2[1]);
+  }
+
+}
+
diff --git a/Graphics/Iso.h b/Graphics/Iso.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa435160687d7509576b6e5586e72ac23f4320ec
--- /dev/null
+++ b/Graphics/Iso.h
@@ -0,0 +1,26 @@
+#ifndef _ISO_H_
+#define _ISO_H_
+
+void IsoSimplex (double *X, double *Y, double *Z, double *Val,
+		 double V, double Vmin, double Vmax,
+		 double *Offset, double Raise[3][5], int shade);
+
+void CutTriangle1D (double *X, double *Y, double *Z, double *Val,
+		    double V, double Vmin, double Vmax,
+		    double *Xp, double *Yp, double *Zp, int *nb);
+
+void CutTriangle2D (double *X, double *Y, double *Z, double *Val,
+		    double V1, double V2, double Vmin, double Vmax,
+		    double *Xp, double *Yp, double *Zp, int *nb,
+		    double *value);
+
+void CutLine0D (double *X, double *Y, double *Z, double *Val,
+		double V, double Vmin, double Vmax,
+		double *Xp, double *Yp, double *Zp, int *nb);
+
+void CutLine1D (double *X, double *Y, double *Z, double *Val,
+		double V1, double V2, double Vmin, double Vmax,
+		double *Xp, double *Yp, double *Zp, int *nb,
+		double *value);
+
+#endif
diff --git a/Graphics/Makefile b/Graphics/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..741d62fa49bd24babe3b12cd1775191cb4d05f3c
--- /dev/null
+++ b/Graphics/Makefile
@@ -0,0 +1,149 @@
+#
+# Makefile for "libGraphics.a"
+#
+
+.IGNORE:
+
+CC            = c++
+C_FLAGS       = -g -Wall
+
+VERSION_FLAGS = 
+OS_FLAGS      = -D_UNIX
+
+GL_INCLUDE    = -I$(HOME)/SOURCES/Mesa-3.1/include\
+                -I$(HOME)/SOURCES/Mesa-3.1/include/GL
+MOTIF_INCLUDE = -I/usr/X11R6/LessTif/Motif1.2/include
+
+RANLIB   = ranlib
+RM       = rm
+RMFLAGS  = -f
+
+LIB      = ../lib/libGraphics.a
+INCLUDE  = -I../Common -I../DataStr -I../Geo -I../Graphics -I../Unix -I../Mesh
+
+CFLAGS   = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE)\
+           $(GL_INCLUDE) $(MOTIF_INCLUDE)
+
+SRC = Draw.cpp \
+      Mesh.cpp \
+      Geom.cpp \
+      Post.cpp \
+      PostSimplex.cpp \
+      PostTriangle.cpp \
+      PostLine.cpp \
+      PostPoint.cpp \
+      Iso.cpp \
+      Entity.cpp \
+      Scale.cpp \
+      Volume.cpp \
+      ColorTable.cpp \
+      gl2ps.cpp gl2gif.cpp
+
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ) 
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+Draw.o: Draw.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
+  ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h ../Common/Context.h ../Geo/MinMax.h \
+  ../Unix/Widgets.h ../Unix/XContext.h
+Mesh.o: Mesh.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
+  ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h ../Common/Context.h ../Geo/MinMax.h gl2ps.h \
+  ../Geo/Verif.h ../Mesh/Numeric.h
+Geom.o: Geom.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
+  ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h ../Common/Context.h ../Geo/Verif.h \
+  ../Mesh/Interpolation.h ../Mesh/Numeric.h
+Post.o: Post.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/GmshUI.h ../Geo/Geo.h ../Mesh/Mesh.h ../Mesh/Vertex.h \
+  ../Mesh/Simplex.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h \
+  ../Mesh/Metric.h Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h ../Common/Context.h
+PostSimplex.o: PostSimplex.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h
+PostTriangle.o: PostTriangle.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h
+PostLine.o: PostLine.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h
+PostPoint.o: PostPoint.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h Iso.h ../Common/Context.h
+Iso.o: Iso.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h
+Entity.o: Entity.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h ../Common/Context.h
+Scale.o: Scale.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \
+  ../Common/Const.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h \
+  ../Common/Views.h ../Graphics/ColorTable.h ../Common/Context.h gl2ps.h \
+  ../Unix/XContext.h
+Volume.o: Volume.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Draw.h ../Common/Views.h \
+  ../Common/Const.h ../Graphics/ColorTable.h ../Mesh/Interpolation.h \
+  ../Common/Context.h
+ColorTable.o: ColorTable.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ColorTable.h ../Common/Context.h
+gl2ps.o: gl2ps.cpp gl2ps.h
+gl2gif.o: gl2gif.cpp gl2gif.h
diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..208eb6f4391072d37cf0e3ace32f97dd33d11f60
--- /dev/null
+++ b/Graphics/Mesh.cpp
@@ -0,0 +1,685 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+#include "MinMax.h"
+#include "gl2ps.h"
+#include "Verif.h"
+#include "Numeric.h"
+
+extern Mesh *THEM;
+extern Context_T  CTX;
+
+extern double     MiddleLC;
+extern double     ClipPlane[4];
+extern double     LC;
+
+static int        iVolume;
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ M e s h                                                       */
+/* ------------------------------------------------------------------------ */
+
+
+void draw_polygon_2d (double r, double g, double b, int n, 
+		      double *x, double *y, double *z){
+  int i ;
+
+  CalculateMinMax(THEM->Points);
+  Init();
+  InitPosition();
+
+  glDisable(GL_DEPTH_TEST);
+  glDrawBuffer(GL_FRONT);
+  glColor3f(r,g,b);
+  glBegin(GL_LINE_STRIP);
+  for(i=0 ; i<n ; i++)
+    if(z)glVertex3d(x[i], y[i],z[i]);
+    else  glVertex2d(x[i], y[i]);
+  glEnd();
+  glFlush();
+  glDrawBuffer(GL_BACK);
+  glEnable(GL_DEPTH_TEST);
+
+}
+
+void ColorSwitch(int i){
+  glColor4ubv((GLubyte*)&CTX.color.mesh.carousel[i%10]);
+}
+
+static int DrawVertexSupp ;
+
+void Draw_Mesh (Mesh *M) {
+
+  InitPosition();
+
+  if(CTX.mesh.shade){ 
+    InitShading();
+  }
+  else{ 
+    InitNoShading();
+  }
+  glClipPlane(GL_CLIP_PLANE0, ClipPlane);
+  glPointSize(2);
+  glLineWidth(1);
+
+  switch(M->status) {
+  case 3 :
+    if(CTX.mesh.draw && 
+       (CTX.mesh.volumes || CTX.mesh.volumes_num) &&
+       CTX.render_mode != GMSH_SELECT)
+      Tree_Action(M->Volumes, Draw_Mesh_Volumes);
+    /* fall-through! */
+  case 2 :
+    if(CTX.mesh.draw && 
+       (CTX.mesh.surfaces || CTX.mesh.surfaces_num) &&
+       CTX.render_mode != GMSH_SELECT){
+      Tree_Action(M->Surfaces, Draw_Mesh_Surfaces);
+    }
+    /* fall-through! */
+  case 1 :  
+    if(CTX.mesh.draw && 
+       (CTX.mesh.lines || CTX.mesh.lines_num) &&
+       CTX.render_mode != GMSH_SELECT){
+      Tree_Action(M->Curves, Draw_Mesh_Curves);
+      DrawVertexSupp = 1 ; 
+      Tree_Action(M->VertexEdges,Draw_Mesh_Points);
+    }
+    /* fall-through! */
+  case 0 :  
+    if(CTX.mesh.draw && 
+       (CTX.mesh.points || CTX.mesh.points_num) &&
+       CTX.render_mode != GMSH_SELECT){
+      DrawVertexSupp = 0 ; 
+      Tree_Action(M->Vertices,Draw_Mesh_Points);
+    }
+    glPointSize(4);
+    if(!CTX.geom.shade) InitNoShading();
+    Draw_Geom(M);
+    break;
+  default :
+    break;
+  }
+
+  if(CTX.render_mode != GMSH_SELECT){
+    if(CTX.axes) 
+      Draw_Axes(MiddleLC/4.);
+    if(CTX.post.draw) /* les init de shading se font par view */
+      Draw_Post();
+  }
+}
+
+void Draw_Mesh_Volumes(void *a, void *b){
+  Volume **v;
+  v = (Volume**)a;
+  Tree_Action((*v)->Simplexes, Draw_Simplex_Volume);
+  Tree_Action((*v)->Hexahedra, Draw_Hexahedron_Volume);
+  Tree_Action((*v)->Prisms, Draw_Prism_Volume);
+}
+
+void PremierVolume(int iSurf, int *iVol);
+
+void Draw_Mesh_Surfaces (void *a,void *b){
+  Surface **s;
+  s = (Surface**)a;
+  PremierVolume(abs((*s)->Num),&iVolume);
+  iVolume = -iVolume;
+  Tree_Action((*s)->Simplexes, Draw_Simplex_Surfaces);
+}
+
+void Draw_Mesh_Curves (void *a, void *b){
+  Curve **c;
+
+  c = (Curve**)a;
+  if((*c)->Num < 0)return;
+  Tree_Action((*c)->Simplexes,Draw_Simplex_Points);
+}
+
+
+void Draw_Mesh_Points (void *a, void *b){
+  Vertex **v;
+  char Num[100];
+
+  v = (Vertex**)a;
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glLoadName(0);
+    glPushName((*v)->Num);
+  }
+
+  glPointSize(3);
+  if(DrawVertexSupp) 
+    glColor4ubv((GLubyte*)&CTX.color.mesh.vertex_supp);
+  else
+    glColor4ubv((GLubyte*)&CTX.color.mesh.vertex);
+
+  if(CTX.mesh.points){
+    glBegin(GL_POINTS);
+    glVertex3d((*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z);
+    glEnd();
+  }
+  
+  if(CTX.mesh.points_num){
+    sprintf(Num,"%d",(*v)->Num);
+    glRasterPos3d((*v)->Pos.X+3*CTX.pixel_equiv_x/CTX.s[0],
+		  (*v)->Pos.Y+3*CTX.pixel_equiv_x/CTX.s[1], 
+		  (*v)->Pos.Z+3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+  
+  if(CTX.render_mode == GMSH_SELECT){
+    glPopName();
+  }
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ S i m p l e x                                                 */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Simplex_Volume (void *a, void *b){
+  Simplex **s;
+  char Num[100];
+  double X[4],Y[4],Z[4];
+
+  s = (Simplex**)a;
+
+  if(!EntiteEstElleVisible((*s)->iEnt)) return;
+
+  if(!(*s)->V[3]) return;
+
+  /*
+  if(CTX.mesh.is_limit_gamma)
+  {
+        if((*s)->GammaShapeMeasure() > CTX.mesh.limit_gamma)return;
+  }
+  */
+
+  ColorSwitch((*s)->iEnt+1);
+
+  double Xc = .25 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X + (*s)->V[3]->Pos.X);
+  double Yc = .25 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y + (*s)->V[3]->Pos.Y);
+  double Zc = .25 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z + (*s)->V[3]->Pos.Z);
+
+  for (int i=0 ; i<4 ; i++) {
+     X[i] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc);
+     Y[i] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc);
+     Z[i] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc);
+  }
+
+  if(CTX.mesh.volumes){
+    glBegin(GL_LINES);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[0], Y[0], Z[0]);
+    
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[0], Y[0], Z[0]);
+    
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[0], Y[0], Z[0]);
+    
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glEnd();
+  }
+
+  if(CTX.mesh.volumes_num){
+    sprintf(Num,"%d",(*s)->Num);
+    glRasterPos3d(Xc,Yc,Zc);
+    Draw_String(Num);
+  }
+
+
+  if (CTX.mesh.dual){
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glEnable(GL_LINE_STIPPLE);
+    glLineStipple(1,0x0F0F);
+    gl2psEnable(GL2PS_LINE_STIPPLE);
+    glBegin(GL_LINES);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d((X[0]+X[1]+X[2])/3., (Y[0]+Y[1]+Y[2])/3., (Z[0]+Z[1]+Z[2])/3.);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d((X[0]+X[1]+X[3])/3., (Y[0]+Y[1]+Y[3])/3., (Z[0]+Z[1]+Z[3])/3.);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d((X[0]+X[2]+X[3])/3., (Y[0]+Y[2]+Y[3])/3., (Z[0]+Z[2]+Z[3])/3.);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d((X[1]+X[2]+X[3])/3., (Y[1]+Y[2]+Y[3])/3., (Z[1]+Z[2]+Z[3])/3.);
+    glEnd();
+    glDisable(GL_LINE_STIPPLE);
+    gl2psDisable(GL2PS_LINE_STIPPLE);
+  }
+
+#if 0 /* never here for the moment */
+
+  double n[4], x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
+
+  ColorSwitch((*s)->iEnt);
+
+  if (CTX.mesh.hidden) {
+    glEnable(GL_POLYGON_OFFSET_FILL);
+
+    x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0];
+    z1z0 = Z[1]-Z[0]; x2x0 = X[2]-X[0];
+    y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0];
+    n[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    n[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    n[2]  = x1x0 * y2y0 - y1y0 * x2x0;
+    glNormal3dv(n);
+
+    glBegin(GL_TRIANGLES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glEnd();
+
+    x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0];
+    z1z0 = Z[1]-Z[0]; x2x0 = X[3]-X[0];
+    y2y0 = Y[3]-Y[0]; z2z0 = Z[3]-Z[0];
+    n[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    n[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    n[2]  = x1x0 * y2y0 - y1y0 * x2x0;
+    glNormal3dv(n);
+
+    glBegin(GL_TRIANGLES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glEnd();
+
+    x1x0 = X[3]-X[0]; y1y0 = Y[3]-Y[0];
+    z1z0 = Z[3]-Z[0]; x2x0 = X[2]-X[0];
+    y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0];
+    n[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    n[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    n[2]  = x1x0 * y2y0 - y1y0 * x2x0;
+    glNormal3dv(n);
+
+
+    glBegin(GL_TRIANGLES);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glEnd();
+
+    x1x0 = X[3]-X[1]; y1y0 = Y[3]-Y[1];
+    z1z0 = Z[3]-Z[1]; x2x0 = X[2]-X[1];
+    y2y0 = Y[2]-Y[1]; z2z0 = Z[2]-Z[1];
+    n[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+    n[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+    n[2]  = x1x0 * y2y0 - y1y0 * x2x0;
+    glNormal3dv(n);
+
+    glBegin(GL_TRIANGLES);
+    glVertex3d(X[3], Y[3], Z[3]);
+    glVertex3d(X[1], Y[1], Z[1]);
+    glVertex3d(X[2], Y[2], Z[2]);
+    glEnd();
+    glDisable(GL_POLYGON_OFFSET_FILL);
+  }
+
+#endif
+
+}
+
+
+void Draw_Simplex_Surfaces (void *a, void *b){
+
+  Simplex **s;
+  double X[4],Y[4],Z[4],Xc,Yc,Zc,pX[8],pY[8],pZ[8];
+  double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, n[3], m[3], mm;
+  int i,j,K,L,k,special;
+  char Num[256];
+  
+  s = (Simplex**)a;
+
+  if(!(*s)->V[2]) return ;
+
+  if(!EntiteEstElleVisible ((*s)->iEnt)) return;
+  
+  if((*s)->VSUP) L=1;
+  else L=0;
+
+  if ((*s)->V[3]) {
+    K = 4;
+    Xc = .25 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X + (*s)->V[3]->Pos.X);
+    Yc = .25 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y + (*s)->V[3]->Pos.Y);
+    Zc = .25 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z + (*s)->V[3]->Pos.Z);
+  }
+  else {
+    K = 3;
+    Xc = .333333333333 * ((*s)->V[0]->Pos.X + (*s)->V[1]->Pos.X + (*s)->V[2]->Pos.X);
+    Yc = .333333333333 * ((*s)->V[0]->Pos.Y + (*s)->V[1]->Pos.Y + (*s)->V[2]->Pos.Y);
+    Zc = .333333333333 * ((*s)->V[0]->Pos.Z + (*s)->V[1]->Pos.Z + (*s)->V[2]->Pos.Z);
+  }
+
+  k=0;
+  for (i=0 ; i<K ; i++) {
+    pX[k] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc);
+    pY[k] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc);
+    pZ[k] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc);
+    k+=(L+1);
+  }
+  
+  if(L){
+    k=1;
+    for (i=0 ; i<K ; i++) {
+      pX[k] = Xc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.X - Xc);
+      pY[k] = Yc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.Y - Yc);
+      pZ[k] = Zc + CTX.mesh.explode * ((*s)->VSUP[i]->Pos.Z - Zc);      
+      k+=(L+1);
+    }
+  }
+
+  if (CTX.mesh.dual){
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glEnable(GL_LINE_STIPPLE);
+    glLineStipple(1,0x0F0F);
+    gl2psEnable(GL2PS_LINE_STIPPLE);
+    glBegin(GL_LINES);
+    for (i=0 ; i<K ; i++) {
+      (!i) ? j = K-1 : j = i-1 ;
+      glVertex3d(Xc,   Yc,    Zc);  
+      glVertex3d((pX[i]+pX[j])/2., (pY[i]+pY[j])/2., (pZ[i]+pZ[j])/2.);
+    }
+    glEnd();
+    glDisable(GL_LINE_STIPPLE);
+    gl2psDisable(GL2PS_LINE_STIPPLE);
+  }
+
+  if (CTX.mesh.normals || CTX.mesh.shade){
+    for (i=0 ; i<K ; i++) {
+     X[i] = Xc + CTX.mesh.explode * ((*s)->V[i]->Pos.X - Xc);
+     Y[i] = Yc + CTX.mesh.explode * ((*s)->V[i]->Pos.Y - Yc);
+     Z[i] = Zc + CTX.mesh.explode * ((*s)->V[i]->Pos.Z - Zc);
+    }
+    x1x0 = X[1]-X[0]; y1y0 = Y[1]-Y[0];
+    z1z0 = Z[1]-Z[0]; x2x0 = X[2]-X[0];
+    y2y0 = Y[2]-Y[0]; z2z0 = Z[2]-Z[0];
+    n[0] = m[0] = y1y0 * z2z0 - z1z0 * y2y0 ;
+    n[1] = m[1] = z1z0 * x2x0 - x1x0 * z2z0 ;
+    n[2] = m[2] = x1x0 * y2y0 - y1y0 * x2x0;
+    // norme(n); not necessary with glEnable(GL_NORMALIZE);
+    /* BOF BOF BOF */
+    if(n[2] < -0.1){
+      n[0] = -n[0];
+      n[1] = -n[1];
+      n[2] = -n[2];
+    }
+    
+  }
+
+  if (CTX.mesh.hidden && CTX.mesh.shade){
+    glNormal3dv(n);
+  }
+  
+  ColorSwitch(abs(iVolume));
+
+  if(CTX.mesh.surfaces_num){
+    sprintf(Num,"%d",(*s)->Num);
+    glRasterPos3d(Xc,Yc,Zc);
+    Draw_String(Num);
+  }
+
+
+  if(CTX.mesh.surfaces){
+
+    special =
+      CTX.mesh.hidden &&
+      CTX.stream == TO_FILE &&
+      (CTX.print.type == GLPPAINTER || CTX.print.type == GLPRECURSIVE) ;
+    
+    
+    if (CTX.mesh.hidden) { 
+      glEnable(GL_POLYGON_OFFSET_FILL);
+      glBegin(GL_POLYGON);
+      for(i=0 ; i<K*(1+L) ; i++) glVertex3d(pX[i], pY[i], pZ[i]);
+      glEnd();
+      glDisable(GL_POLYGON_OFFSET_FILL);
+    }
+    
+    if(CTX.mesh.lines && !special){
+      glColor4ubv((GLubyte*)&CTX.color.mesh.line);
+      glBegin(GL_LINE_LOOP);
+      for(i=0 ; i<K*(1+L) ; i++){
+	glVertex3d(pX[i],pY[i],pZ[i]);
+      }
+      glEnd();    
+    }
+
+  }
+  
+  if(CTX.mesh.normals) {
+    norme(m);
+    glColor4ubv((GLubyte*)&CTX.color.mesh.normals);
+    m[0] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[0] ;
+    m[1] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[1] ;
+    m[2] *= CTX.mesh.normals * CTX.pixel_equiv_x/CTX.s[2] ;
+    mm=sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);
+    Draw_Vector(DRAW_POST_ARROW, 0, Xc,Yc,Zc, mm, m[0],m[1],m[2],NULL,NULL);
+  }
+  
+
+}
+
+
+void Draw_Simplex_Points(void *a,void *b){
+  Simplex *s;
+  char Num[100];
+
+  s = *(Simplex**)a;
+
+  glColor4ubv((GLubyte*)&CTX.color.mesh.vertex);
+  
+  glBegin(GL_POINTS);
+  glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z);
+  glEnd();    
+  
+  if(s->VSUP){
+    glColor4ubv((GLubyte*)&CTX.color.mesh.vertex_supp);
+    glBegin(GL_POINTS);
+    glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z);
+    glEnd();    
+  }
+
+  if(CTX.mesh.lines_num){
+    glColor4ubv((GLubyte*)&CTX.color.mesh.line);
+    sprintf(Num,"%d",s->Num);
+    glRasterPos3d(0.5*(s->V[0]->Pos.X+s->V[1]->Pos.X) + 3*CTX.pixel_equiv_x/CTX.s[0],
+		  0.5*(s->V[0]->Pos.Y+s->V[1]->Pos.Y) + 3*CTX.pixel_equiv_x/CTX.s[1], 
+		  0.5*(s->V[0]->Pos.Z+s->V[1]->Pos.Z) + 3*CTX.pixel_equiv_x/CTX.s[2]);
+    Draw_String(Num);
+  }
+
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ H e x a e d r o n                                             */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Hexahedron_Volume (void *a, void *b){
+  Hexahedron **h;
+  int i ;
+  double Xc = 0.0 , Yc = 0.0, Zc = 0.0 ;
+
+  h = (Hexahedron**)a;
+
+  if(!EntiteEstElleVisible((*h)->iEnt)) return;
+  
+  //glColor4ubv((GLubyte*)&CTX.color.mesh.hexahedron);
+  ColorSwitch((*h)->iEnt+1);
+
+  glBegin(GL_LINE_LOOP);
+  glVertex3d((*h)->V[0]->Pos.X, (*h)->V[0]->Pos.Y, (*h)->V[0]->Pos.Z);
+  glVertex3d((*h)->V[1]->Pos.X, (*h)->V[1]->Pos.Y, (*h)->V[1]->Pos.Z);
+  glVertex3d((*h)->V[2]->Pos.X, (*h)->V[2]->Pos.Y, (*h)->V[2]->Pos.Z);
+  glVertex3d((*h)->V[3]->Pos.X, (*h)->V[3]->Pos.Y, (*h)->V[3]->Pos.Z);
+  glEnd();    
+
+  glBegin(GL_LINE_LOOP);
+  glVertex3d((*h)->V[4]->Pos.X, (*h)->V[4]->Pos.Y, (*h)->V[4]->Pos.Z);
+  glVertex3d((*h)->V[5]->Pos.X, (*h)->V[5]->Pos.Y, (*h)->V[5]->Pos.Z);
+  glVertex3d((*h)->V[6]->Pos.X, (*h)->V[6]->Pos.Y, (*h)->V[6]->Pos.Z);
+  glVertex3d((*h)->V[7]->Pos.X, (*h)->V[7]->Pos.Y, (*h)->V[7]->Pos.Z);
+  glEnd();    
+
+  glBegin(GL_LINES);
+  glVertex3d((*h)->V[0]->Pos.X, (*h)->V[0]->Pos.Y, (*h)->V[0]->Pos.Z);
+  glVertex3d((*h)->V[4]->Pos.X, (*h)->V[4]->Pos.Y, (*h)->V[4]->Pos.Z);
+  glVertex3d((*h)->V[1]->Pos.X, (*h)->V[1]->Pos.Y, (*h)->V[1]->Pos.Z);
+  glVertex3d((*h)->V[5]->Pos.X, (*h)->V[5]->Pos.Y, (*h)->V[5]->Pos.Z);
+  glVertex3d((*h)->V[2]->Pos.X, (*h)->V[2]->Pos.Y, (*h)->V[2]->Pos.Z);
+  glVertex3d((*h)->V[6]->Pos.X, (*h)->V[6]->Pos.Y, (*h)->V[6]->Pos.Z);
+  glVertex3d((*h)->V[3]->Pos.X, (*h)->V[3]->Pos.Y, (*h)->V[3]->Pos.Z);
+  glVertex3d((*h)->V[7]->Pos.X, (*h)->V[7]->Pos.Y, (*h)->V[7]->Pos.Z);
+  glEnd();    
+
+  if (CTX.mesh.dual){
+    for(i=0 ; i<8 ; i++){
+      Xc += (*h)->V[i]->Pos.X;
+      Yc += (*h)->V[i]->Pos.Y;
+      Zc += (*h)->V[i]->Pos.Z;
+    }
+    Xc /= 8. ; 
+    Zc /= 8. ; 
+    Yc /= 8. ; 
+
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glEnable(GL_LINE_STIPPLE);
+    glLineStipple(1,0x0F0F);
+    gl2psEnable(GL2PS_LINE_STIPPLE);
+    glBegin(GL_LINES);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[0]->Pos.X+(*h)->V[1]->Pos.X+(*h)->V[5]->Pos.X+(*h)->V[4]->Pos.X)/4.,
+	((*h)->V[0]->Pos.Y+(*h)->V[1]->Pos.Y+(*h)->V[5]->Pos.Y+(*h)->V[4]->Pos.Y)/4.,
+	((*h)->V[0]->Pos.Z+(*h)->V[1]->Pos.Z+(*h)->V[5]->Pos.Z+(*h)->V[4]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[0]->Pos.X+(*h)->V[3]->Pos.X+(*h)->V[2]->Pos.X+(*h)->V[1]->Pos.X)/4.,
+	((*h)->V[0]->Pos.Y+(*h)->V[3]->Pos.Y+(*h)->V[2]->Pos.Y+(*h)->V[1]->Pos.Y)/4.,
+	((*h)->V[0]->Pos.Z+(*h)->V[3]->Pos.Z+(*h)->V[2]->Pos.Z+(*h)->V[1]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[0]->Pos.X+(*h)->V[4]->Pos.X+(*h)->V[7]->Pos.X+(*h)->V[3]->Pos.X)/4.,
+	((*h)->V[0]->Pos.Y+(*h)->V[4]->Pos.Y+(*h)->V[7]->Pos.Y+(*h)->V[3]->Pos.Y)/4.,
+	((*h)->V[0]->Pos.Z+(*h)->V[4]->Pos.Z+(*h)->V[7]->Pos.Z+(*h)->V[3]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[1]->Pos.X+(*h)->V[2]->Pos.X+(*h)->V[6]->Pos.X+(*h)->V[5]->Pos.X)/4.,
+	((*h)->V[1]->Pos.Y+(*h)->V[2]->Pos.Y+(*h)->V[6]->Pos.Y+(*h)->V[5]->Pos.Y)/4.,
+	((*h)->V[1]->Pos.Z+(*h)->V[2]->Pos.Z+(*h)->V[6]->Pos.Z+(*h)->V[5]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[2]->Pos.X+(*h)->V[3]->Pos.X+(*h)->V[7]->Pos.X+(*h)->V[6]->Pos.X)/4.,
+	((*h)->V[2]->Pos.Y+(*h)->V[3]->Pos.Y+(*h)->V[7]->Pos.Y+(*h)->V[6]->Pos.Y)/4.,
+	((*h)->V[2]->Pos.Z+(*h)->V[3]->Pos.Z+(*h)->V[7]->Pos.Z+(*h)->V[6]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*h)->V[4]->Pos.X+(*h)->V[5]->Pos.X+(*h)->V[6]->Pos.X+(*h)->V[7]->Pos.X)/4.,
+	((*h)->V[4]->Pos.Y+(*h)->V[5]->Pos.Y+(*h)->V[6]->Pos.Y+(*h)->V[7]->Pos.Y)/4.,
+	((*h)->V[4]->Pos.Z+(*h)->V[5]->Pos.Z+(*h)->V[6]->Pos.Z+(*h)->V[7]->Pos.Z)/4. );
+    glEnd();
+    glDisable(GL_LINE_STIPPLE);
+    gl2psDisable(GL2PS_LINE_STIPPLE);
+  }
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ P r i s m                                                     */
+/* ------------------------------------------------------------------------ */
+
+void Draw_Prism_Volume (void *a, void *b){
+  Prism **p;
+  int i ;
+  double Xc = 0.0 , Yc = 0.0, Zc = 0.0 ;
+
+  p = (Prism**)a;
+
+  if(!EntiteEstElleVisible((*p)->iEnt)) return;
+  
+  //glColor4ubv((GLubyte*)&CTX.color.mesh.prism);
+  ColorSwitch((*p)->iEnt+1);
+
+  glBegin(GL_LINE_LOOP);
+  glVertex3d((*p)->V[0]->Pos.X, (*p)->V[0]->Pos.Y, (*p)->V[0]->Pos.Z);
+  glVertex3d((*p)->V[1]->Pos.X, (*p)->V[1]->Pos.Y, (*p)->V[1]->Pos.Z);
+  glVertex3d((*p)->V[2]->Pos.X, (*p)->V[2]->Pos.Y, (*p)->V[2]->Pos.Z);
+  glEnd();    
+
+  glBegin(GL_LINE_LOOP);
+  glVertex3d((*p)->V[3]->Pos.X, (*p)->V[3]->Pos.Y, (*p)->V[3]->Pos.Z);
+  glVertex3d((*p)->V[4]->Pos.X, (*p)->V[4]->Pos.Y, (*p)->V[4]->Pos.Z);
+  glVertex3d((*p)->V[5]->Pos.X, (*p)->V[5]->Pos.Y, (*p)->V[5]->Pos.Z);
+  glEnd();    
+
+  glBegin(GL_LINES);
+  glVertex3d((*p)->V[0]->Pos.X, (*p)->V[0]->Pos.Y, (*p)->V[0]->Pos.Z);
+  glVertex3d((*p)->V[3]->Pos.X, (*p)->V[3]->Pos.Y, (*p)->V[3]->Pos.Z);
+  glVertex3d((*p)->V[1]->Pos.X, (*p)->V[1]->Pos.Y, (*p)->V[1]->Pos.Z);
+  glVertex3d((*p)->V[4]->Pos.X, (*p)->V[4]->Pos.Y, (*p)->V[4]->Pos.Z);
+  glVertex3d((*p)->V[2]->Pos.X, (*p)->V[2]->Pos.Y, (*p)->V[2]->Pos.Z);
+  glVertex3d((*p)->V[5]->Pos.X, (*p)->V[5]->Pos.Y, (*p)->V[5]->Pos.Z);
+  glEnd();    
+
+  if (CTX.mesh.dual){
+    for(i=0 ; i<6 ; i++){
+      Xc += (*p)->V[i]->Pos.X;
+      Yc += (*p)->V[i]->Pos.Y;
+      Zc += (*p)->V[i]->Pos.Z;
+    }
+    Xc /= 6. ; 
+    Zc /= 6. ; 
+    Yc /= 6. ; 
+
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glEnable(GL_LINE_STIPPLE);
+    glLineStipple(1,0x0F0F);
+    gl2psEnable(GL2PS_LINE_STIPPLE);
+    glBegin(GL_LINES);
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*p)->V[0]->Pos.X+(*p)->V[2]->Pos.X+(*p)->V[1]->Pos.X)/3.,
+	((*p)->V[0]->Pos.Y+(*p)->V[2]->Pos.Y+(*p)->V[1]->Pos.Y)/3.,
+	((*p)->V[0]->Pos.Z+(*p)->V[2]->Pos.Z+(*p)->V[1]->Pos.Z)/3. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*p)->V[3]->Pos.X+(*p)->V[4]->Pos.X+(*p)->V[5]->Pos.X)/3.,
+	((*p)->V[3]->Pos.Y+(*p)->V[4]->Pos.Y+(*p)->V[5]->Pos.Y)/3.,
+	((*p)->V[3]->Pos.Z+(*p)->V[4]->Pos.Z+(*p)->V[5]->Pos.Z)/3. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*p)->V[0]->Pos.X+(*p)->V[1]->Pos.X+(*p)->V[4]->Pos.X+(*p)->V[3]->Pos.X)/4.,
+	((*p)->V[0]->Pos.Y+(*p)->V[1]->Pos.Y+(*p)->V[4]->Pos.Y+(*p)->V[3]->Pos.Y)/4.,
+	((*p)->V[0]->Pos.Z+(*p)->V[1]->Pos.Z+(*p)->V[4]->Pos.Z+(*p)->V[3]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*p)->V[0]->Pos.X+(*p)->V[3]->Pos.X+(*p)->V[5]->Pos.X+(*p)->V[2]->Pos.X)/4.,
+	((*p)->V[0]->Pos.Y+(*p)->V[3]->Pos.Y+(*p)->V[5]->Pos.Y+(*p)->V[2]->Pos.Y)/4.,
+	((*p)->V[0]->Pos.Z+(*p)->V[3]->Pos.Z+(*p)->V[5]->Pos.Z+(*p)->V[2]->Pos.Z)/4. );
+    glVertex3d(Xc,   Yc,    Zc);  
+    glVertex3d
+      ( ((*p)->V[1]->Pos.X+(*p)->V[2]->Pos.X+(*p)->V[5]->Pos.X+(*p)->V[4]->Pos.X)/4.,
+	((*p)->V[1]->Pos.Y+(*p)->V[2]->Pos.Y+(*p)->V[5]->Pos.Y+(*p)->V[4]->Pos.Y)/4.,
+	((*p)->V[1]->Pos.Z+(*p)->V[2]->Pos.Z+(*p)->V[5]->Pos.Z+(*p)->V[4]->Pos.Z)/4. );
+    glEnd();
+    glDisable(GL_LINE_STIPPLE);
+    gl2psDisable(GL2PS_LINE_STIPPLE);
+  }
+
+
+}
+
diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7b9d084f0cc8a606a66b0ce6d6d11ed2f26483ff
--- /dev/null
+++ b/Graphics/Post.cpp
@@ -0,0 +1,207 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Views.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+extern List_T     *Post_ViewList;
+
+static double      Raise[3][5];
+static double      RaiseFactor[3];
+
+/* ------------------------------------------------------------------------
+    Give Value from Index
+   ------------------------------------------------------------------------ */
+
+double GiveValueFromIndex_Lin(double ValMin, double ValMax, int NbIso, int Iso){
+  if(NbIso==1) return (ValMax+ValMin)/2.;
+  return ValMin + Iso*(ValMax-ValMin)/(NbIso-1.) ;
+}
+
+double GiveValueFromIndex_Log(double ValMin, double ValMax, int NbIso, int Iso){
+  if(NbIso==1) return (ValMax+ValMin)/2.;
+  if(ValMin <= 0.) return 0. ;
+  return pow(10.,log10(ValMin)+Iso*(log10(ValMax)-log10(ValMin))/(NbIso-1.)) ;
+}
+
+
+/* ------------------------------------------------------------------------
+    Give Index From Value
+   ------------------------------------------------------------------------ */
+
+int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val){
+  if(ValMin==ValMax) return NbIso/2 ;
+  return (int)((Val-ValMin)*(NbIso-1)/(ValMax-ValMin)) ;
+}
+
+int GiveIndexFromValue_Log(double ValMin, double ValMax, int NbIso, double Val){
+  if(ValMin==ValMax) return NbIso/2 ;  
+  if(ValMin <= 0.) return 0 ;
+  return (int)((log10(Val)-log10(ValMin))*(NbIso-1)/(log10(ValMax)-log10(ValMin))) ;
+}
+
+
+/* ------------------------------------------------------------------------
+    Color Palette
+   ------------------------------------------------------------------------ */
+
+void Palette(Post_View *v, int nbi, int i){ /* i in [0,nbi-1] */
+  int index ;
+
+  index = (nbi==1) ? 
+    v->CT.size/2 :
+    (int) (i/(double)(nbi-1)*(v->CT.size-1)) ;
+
+  glColor4ubv( (GLubyte *) &v->CT.table[index] );
+}
+
+void Palette2(Post_View *v,double min, double max, double val){ /* val in [min,max] */
+  int index;  
+
+  index = (int)( (val-min)/(max-min)*(v->CT.size-1) );
+
+  glColor4ubv((GLubyte *) &v->CT.table[index]);
+}
+
+void RaiseFill(int i, double Val, double ValMin, double Raise[3][5]){
+  int j ;
+  for(j=0 ; j<3 ; j++) Raise[j][i] = (Val-ValMin) * RaiseFactor[j] ;
+}
+
+
+int fcmp_Post_Triangle(const void *a, const void *b){
+  return 0;
+
+#if 0
+  Post_Triangle *PT;
+  double bary1[3], bary2[3]; 
+
+  /* sorting % eye with barycenters */
+
+  z1 = (PT->X[1]+View->Offset[0]+Raise[0][1]) + (PT->X[0]+View->Offset[0]+Raise[0][0]); 
+  y1y0 = (PT->Y[1]+View->Offset[1]+Raise[1][1]) - (PT->Y[0]+View->Offset[1]+Raise[1][0]);
+  z1z0 = (PT->Z[1]+View->Offset[2]+Raise[2][1]) - (PT->Z[0]+View->Offset[2]+Raise[2][0]); 
+
+  x2x0 = (PT->X[2]+View->Offset[0]+Raise[0][2]) - (PT->X[0]+View->Offset[0]+Raise[0][0]);
+  y2y0 = (PT->Y[2]+View->Offset[1]+Raise[1][2]) - (PT->Y[0]+View->Offset[1]+Raise[1][0]); 
+  z2z0 = (PT->Z[2]+View->Offset[2]+Raise[2][2]) - (PT->Z[0]+View->Offset[2]+Raise[2][0]);
+
+  q = *(GL2PSprimitive**)a;
+  w = *(GL2PSprimitive**)b;
+  diff = q->depth - w->depth;
+  if(diff > 0.) 
+    return 1;
+  else if(diff < 0.)
+    return -1;
+  else
+    return 0;
+#endif
+}
+
+/* ------------------------------------------------------------------------ 
+    D r a w _ P o s t                                                       
+   ------------------------------------------------------------------------ */
+
+void Draw_Post (void) {
+  int            i,j,k,n;
+  double         ValMin,ValMax,AbsMax;
+  Post_View     *v;
+
+  if(!Post_ViewList) return;
+  
+  for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){
+
+    v = (Post_View*)List_Pointer(Post_ViewList,i);
+
+    if(v->Visible){ 
+
+      if(CTX.display_lists && !v->Changed && glIsList(v->Num)){
+
+	glCallList(v->Num);
+
+      }
+      else{
+
+	if(CTX.display_lists){
+	  if(glIsList(v->Num)) glDeleteLists(v->Num,1);
+	  // printf("new dl\n");
+	  glNewList(v->Num, GL_COMPILE_AND_EXECUTE);
+	}
+
+	if(v->Light && v->IntervalsType != DRAW_POST_ISO){
+	  InitShading();
+	}
+	else{
+	  InitNoShading();
+	}
+	
+	/* force this */
+	if(v->IntervalsType == DRAW_POST_CONTINUOUS)
+	  glShadeModel(GL_SMOOTH); 
+	
+	switch(v->RangeType){
+	case DRAW_POST_DEFAULT : ValMin = v->Min ; ValMax = v->Max ; break;
+	case DRAW_POST_CUSTOM  : ValMin = v->CustomMin ; ValMax = v->CustomMax ; break;
+	}
+	
+	switch(v->ScaleType){
+	case DRAW_POST_LINEAR : 
+	  v->GIFV = GiveIndexFromValue_Lin ;
+	  v->GVFI = GiveValueFromIndex_Lin ;
+	  break;
+	case DRAW_POST_LOGARITHMIC : 
+	  v->GIFV = GiveIndexFromValue_Log ;
+	  v->GVFI = GiveValueFromIndex_Log ;
+	  break;
+	}
+	
+	AbsMax = DMAX(fabs(ValMin),fabs(ValMax));
+	AbsMax = (AbsMax==0.) ? 1. : AbsMax;
+	
+	for(j=0;j<3;j++){
+	  RaiseFactor[j] = v->Raise[j] / AbsMax ;
+	  for(k=0;k<5;k++) Raise[j][k] = 0. ;
+	}
+	
+	if((n = List_Nbr(v->Simplices)))
+	  for(j=0 ; j<n ; j++)
+	    Draw_Post_Simplex(v, (Post_Simplex*)List_Pointer(v->Simplices,j), 
+			      ValMin, ValMax, Raise);
+	
+	if((n = List_Nbr(v->Triangles))){
+	  //if(there is alpha)List_Sort(v->Triangles, fcmp_Post_Triangle);
+	  for(j=0 ; j<n ; j++)
+	    Draw_Post_Triangle(v, (Post_Triangle*)List_Pointer(v->Triangles,j), 
+			       ValMin, ValMax, Raise);
+	}
+	
+	if((n = List_Nbr(v->Lines)))
+	  for(j=0 ; j<n ; j++)
+	    Draw_Post_Line(v, (Post_Line*)List_Pointer(v->Lines,j), 
+			   ValMin, ValMax, Raise);
+	
+	if((n = List_Nbr(v->Points)))
+	  for(j=0 ; j<n ; j++)
+	    Draw_Post_Point(v, (Post_Point*)List_Pointer(v->Points,j), 
+			    ValMin, ValMax, Raise);
+	
+	if(CTX.display_lists){
+	  glEndList();
+	  v->Changed=0;
+	}
+	
+      }
+      
+    }
+
+  }
+
+  /* revenir au shading par defaut, pour l'echelle */
+  InitNoShading();
+
+}
+
diff --git a/Graphics/PostLine.cpp b/Graphics/PostLine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f4646658661caae9ff15cd7580e4b733f99bea7b
--- /dev/null
+++ b/Graphics/PostLine.cpp
@@ -0,0 +1,131 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Iso.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+extern double      LC;
+
+void Draw_Post_Line(Post_View *View, Post_Line *PL, 
+		    double ValMin, double ValMax, double Raise[3][5]){
+
+  int     i,k,nb=0;
+  double  d,dx,dy,dz,fact;
+  double  Xp[5],Yp[5],Zp[5],value[5],thev;
+  char    Num[100] ;
+
+  switch(PL->Type){	    
+  case DRAW_POST_SCALAR:	    
+
+    if(View->IntervalsType==DRAW_POST_NUMERIC){
+      d = (PL->V[2*View->TimeStep]+PL->V[2*View->TimeStep+1]) / 2.;
+      if(d >= ValMin && d <= ValMax){
+	sprintf(Num, "%g", d);
+	glColor4ubv((GLubyte*)&CTX.color.fg);
+	glRasterPos3d((PL->X[0] + PL->X[1])/2.,
+		      (PL->Y[0] + PL->Y[1])/2.,
+		      (PL->Z[0] + PL->Z[1])/2.);
+	Draw_String(Num);
+      }
+      break ;
+    }
+
+    glDisable(GL_LINE_STIPPLE);
+    for(k=0 ; k<2 ; k++) RaiseFill(k, PL->V[2*View->TimeStep+k], ValMin, Raise);
+
+    if(View->IntervalsType==DRAW_POST_CONTINUOUS){
+      glBegin(GL_LINES);
+      Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep]);
+      glVertex3d(PL->X[0]+View->Offset[0]+Raise[0][0],
+		 PL->Y[0]+View->Offset[1]+Raise[1][0],
+		 PL->Z[0]+View->Offset[2]+Raise[2][0]);
+      Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep+1]);
+      glVertex3d(PL->X[1]+View->Offset[0]+Raise[0][1],
+		 PL->Y[1]+View->Offset[1]+Raise[1][1],
+		 PL->Z[1]+View->Offset[2]+Raise[2][1]);
+      glEnd();
+    }
+    else{
+      for(k=0 ; k<View->NbIso ; k++){
+	Palette(View,View->NbIso,k);
+	if(View->IntervalsType==DRAW_POST_DISCRETE){
+	  CutLine1D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep],
+		    View->GVFI(ValMin,ValMax,View->NbIso+1,k),
+		    View->GVFI(ValMin,ValMax,View->NbIso+1,k+1),
+		    ValMin,ValMax,Xp,Yp,Zp,&nb,value);	  
+	  if(nb == 2){
+	    for(i=0;i<2;i++) RaiseFill(i,value[i],ValMin,Raise);    
+	    Draw_Line(Xp,Yp,Zp,View->Offset,Raise);  
+	  }
+	}
+	else{
+	  thev = View->GVFI(ValMin,ValMax,View->NbIso,k);
+	  CutLine0D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep],
+		    thev, ValMin,ValMax,Xp,Yp,Zp,&nb);	  
+	  if(nb){
+	    RaiseFill(0,thev,ValMin,Raise);
+	    Draw_Point(Xp,Yp,Zp,View->Offset,Raise);    
+	  }
+	}
+      }
+
+    }
+    break;
+    
+  case DRAW_POST_VECTOR:	    
+    if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
+      dx = 0.5 * (PL->V[6*View->TimeStep]  +PL->V[6*View->TimeStep+3]);
+      dy = 0.5 * (PL->V[6*View->TimeStep+1]+PL->V[6*View->TimeStep+4]);
+      dz = 0.5 * (PL->V[6*View->TimeStep+2]+PL->V[6*View->TimeStep+5]);
+      d = sqrt(dx*dx+dy*dy+dz*dz);	    
+      if(d!=0.0 && d>=ValMin && d<=ValMax){	      
+	Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));	      
+	fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	  dx /= d ; dy /= d ; dz /= d ;
+	  d = log10(d/ValMin) ; 
+	  dx *= d ; dy *= d ; dz *= d ;
+	}
+	RaiseFill(0, d, ValMin, Raise);		
+	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		    0.5 * (PL->X[0] + PL->X[1]),
+		    0.5 * (PL->Y[0] + PL->Y[1]),
+		    0.5 * (PL->Z[0] + PL->Z[1]),
+		    fact*d, fact*dx, fact*dy, fact*dz,
+		    View->Offset, Raise);
+      }
+    }
+    else{
+      for(k=0 ; k<2 ; k++){
+	dx = PL->V[6*View->TimeStep  +3*k] ;
+	dy = PL->V[6*View->TimeStep+1+3*k] ;
+	dz = PL->V[6*View->TimeStep+2+3*k] ;		  
+	d = sqrt(dx*dx+dy*dy+dz*dz);		
+	if(d!=0.0 && d>=ValMin && d<=ValMax){		
+	  Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+	  fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	  if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	    dx /= d ; dy /= d ; dz /= d ;
+	    d = log10(d/ValMin) ; 
+	    dx *= d ; dy *= d ; dz *= d ;
+	  }
+	  RaiseFill(0, d, ValMin, Raise);		
+	  Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		      PL->X[k], PL->Y[k], PL->Z[k],
+		      fact*d, fact*dx, fact*dy, fact*dz,
+		      View->Offset, Raise);
+	}		
+      }	      
+    }
+    break;
+    
+  case DRAW_POST_TENSOR :
+    break;
+    
+  }
+}
+
diff --git a/Graphics/PostPoint.cpp b/Graphics/PostPoint.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ca9a2046a75b2a654a1362eca482ceedd3fba6e8
--- /dev/null
+++ b/Graphics/PostPoint.cpp
@@ -0,0 +1,85 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Iso.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+extern double      LC;
+
+int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val) ;
+
+void Draw_Post_Point(Post_View *View, Post_Point *PP, 
+		     double ValMin, double ValMax, double Raise[3][5]){      
+
+  int      i;
+  double   d,dx,dy,dz,fact;
+	  
+  switch(PP->Type){	    
+
+  case DRAW_POST_SCALAR:	    	    
+    d = PP->V[View->TimeStep];  
+    if(d>=ValMin && d<=ValMax){      
+      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+      glBegin(GL_POINTS);
+      glVertex3d(PP->X, PP->Y, PP->Z);
+      glEnd();
+    }
+    break;
+    
+  case DRAW_POST_VECTOR:	    
+
+    if(View->ArrowType == DRAW_POST_DISPLACEMENT){
+      fact = View->ArrowScale/100. ;
+      glColor4ubv((GLubyte*)&CTX.color.fg);
+      glBegin(GL_POINTS);
+      glVertex3d(fact*PP->V[3*View->TimeStep],
+		 fact*PP->V[3*View->TimeStep+1],
+		 fact*PP->V[3*View->TimeStep+2]);
+      glEnd();
+      if(View->TimeStep){
+	glBegin(GL_LINE_STRIP);
+	for(i=0 ; i<View->TimeStep+1 ; i++)
+	  glVertex3d(fact*PP->V[3*(View->TimeStep-i)],
+		     fact*PP->V[3*(View->TimeStep-i)+1],
+		     fact*PP->V[3*(View->TimeStep-i)+2]);
+	glEnd();
+      }
+      break;
+    }
+
+    dx = PP->V[3*View->TimeStep];  
+    dy = PP->V[3*View->TimeStep+1];
+    dz = PP->V[3*View->TimeStep+2];
+    d = sqrt(dx*dx+dy*dy+dz*dz);
+    
+    if(d!=0.0 && d>=ValMin && d<=ValMax){
+      
+      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+
+      fact = 2.e-4 * LC * View->ArrowScale/View->Max ;
+      
+      if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	dx /= d ; dy /= d ; dz /= d ;
+	d = log10(d/ValMin) ; 
+	dx *= d ; dy *= d ; dz *= d ;
+      }
+
+      RaiseFill(0, d, ValMin, Raise);
+
+      Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, 
+		  PP->X, PP->Y, PP->Z,
+		  fact*d, fact*dx, fact*dy, fact*dz,
+		  View->Offset, Raise);
+    }
+    break;
+    
+  case DRAW_POST_TENSOR :
+    break;
+    
+  }
+}
+
diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c9ec1d518948bddbc04540d99bedc4ec3886b409
--- /dev/null
+++ b/Graphics/PostSimplex.cpp
@@ -0,0 +1,92 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Iso.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+extern double      LC;
+
+void Draw_Post_Simplex(Post_View *View, Post_Simplex *PS, 
+		       double ValMin, double ValMax, double Raise[3][5]){
+
+  int     k;
+  double  d,dx,dy,dz,fact;
+
+  switch(PS->Type){
+  case DRAW_POST_SCALAR:	    
+    for(k=0 ; k<View->NbIso ; k++){
+      Palette(View,View->NbIso,k);
+      IsoSimplex(PS->X, PS->Y, PS->Z, &PS->V[4*View->TimeStep],
+		 View->GVFI(ValMin,ValMax,View->NbIso,k), 
+		 ValMin, ValMax, View->Offset, Raise, View->Light);
+    }
+    break;
+    
+    /* 
+       la plus grande fleche (d=ValMax) est de taille LC/50
+       (View->ArrowScale == 100 par defaut)
+       */
+    
+  case DRAW_POST_VECTOR:	    
+    if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
+      dx = 0.25 * (PS->V[12*View->TimeStep]  +PS->V[12*View->TimeStep+3]+
+		   PS->V[12*View->TimeStep+6]+PS->V[12*View->TimeStep+9] );
+      dy = 0.25 * (PS->V[12*View->TimeStep+1]+PS->V[12*View->TimeStep+4]+
+		   PS->V[12*View->TimeStep+7]+PS->V[12*View->TimeStep+10] );
+      dz = 0.25 * (PS->V[12*View->TimeStep+2]+PS->V[12*View->TimeStep+5]+
+		   PS->V[12*View->TimeStep+8]+PS->V[12*View->TimeStep+11] );
+      d = sqrt(dx*dx+dy*dy+dz*dz);
+      
+      if(d!=0.0 && d>=ValMin && d<=ValMax){		
+	Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+	fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	  dx /= d ; dy /= d ; dz /= d ;
+	  d = log10(d/ValMin) ; 
+	  dx *= d ; dy *= d ; dz *= d ;
+	}
+	RaiseFill(0, d, ValMin, Raise);		
+	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		    0.25 * (PS->X[0] + PS->X[1] + PS->X[2] + PS->X[3]),
+		    0.25 * (PS->Y[0] + PS->Y[1] + PS->Y[2] + PS->Y[3]),
+		    0.25 * (PS->Z[0] + PS->Z[1] + PS->Z[2] + PS->Z[3]),
+		    fact*d, fact*dx, fact*dy, fact*dz,
+		    View->Offset, Raise);
+      }
+    }
+    else{
+      for(k=0 ; k<4 ; k++){
+	dx = PS->V[12*View->TimeStep  +3*k] ;
+	dy = PS->V[12*View->TimeStep+1+3*k] ;
+	dz = PS->V[12*View->TimeStep+2+3*k] ;		  
+	d = sqrt(dx*dx+dy*dy+dz*dz);
+	
+	if(d!=0.0 && d>=ValMin && d<=ValMax){	  
+	  Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+	  fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	  if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	    dx /= d ; dy /= d ; dz /= d ;
+	    d = log10(d/ValMin) ; 
+	    dx *= d ; dy *= d ; dz *= d ;
+	  }
+	  RaiseFill(0, d, ValMin, Raise);		
+	  Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		      PS->X[k], PS->Y[k], PS->Z[k],
+		      fact*d, fact*dx, fact*dy, fact*dz,
+		      View->Offset, Raise);
+	}		
+      }	      
+    }
+    break;
+    
+  case DRAW_POST_TENSOR :
+    break;
+    
+  }
+
+}
+
diff --git a/Graphics/PostTriangle.cpp b/Graphics/PostTriangle.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1e2d9c25243fd13382a8159fc08a6cc3a7e0b8bf
--- /dev/null
+++ b/Graphics/PostTriangle.cpp
@@ -0,0 +1,219 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Iso.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+extern double      LC;
+
+void Draw_Post_Triangle(Post_View *View, Post_Triangle *PT, 
+			double ValMin, double ValMax, double Raise[3][5]){
+
+  int     i, k, m, nb=0;
+  double  d,dx,dy,dz,fact;
+  double  x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3];
+  double  xx[3],yy[3],zz[3];
+  double  Xp[5],Yp[5],Zp[5],value[5],thev;
+  char    Num[100] ;
+
+  if(View->ShowElement)
+    glEnable(GL_POLYGON_OFFSET_FILL);
+
+  switch(PT->Type){	    
+    
+  case DRAW_POST_SCALAR:
+
+    if(View->IntervalsType==DRAW_POST_NUMERIC){
+      d = (PT->V[3*View->TimeStep]+PT->V[3*View->TimeStep+1]+PT->V[3*View->TimeStep+2]) / 3.;
+      if(d >= ValMin && d <= ValMax){
+	sprintf(Num, "%g", d);
+	glColor4ubv((GLubyte*)&CTX.color.fg);
+	glRasterPos3d((PT->X[0] + PT->X[1] + PT->X[2])/3.,
+		      (PT->Y[0] + PT->Y[1] + PT->Y[2])/3.,
+		      (PT->Z[0] + PT->Z[1] + PT->Z[2])/3.);
+	Draw_String(Num);
+      }
+      break ;
+    }
+
+    if(View->IntervalsType!=DRAW_POST_ISO)
+      for(i=0;i<3;i++)RaiseFill(i, PT->V[3*View->TimeStep+i], ValMin, Raise);
+    
+    if(View->Light){
+      x1x0 = (PT->X[1]+Raise[0][1]) - (PT->X[0]+Raise[0][0]); 
+      y1y0 = (PT->Y[1]+Raise[1][1]) - (PT->Y[0]+Raise[1][0]);
+      z1z0 = (PT->Z[1]+Raise[2][1]) - (PT->Z[0]+Raise[2][0]); 
+      x2x0 = (PT->X[2]+Raise[0][2]) - (PT->X[0]+Raise[0][0]);
+      y2y0 = (PT->Y[2]+Raise[1][2]) - (PT->Y[0]+Raise[1][0]); 
+      z2z0 = (PT->Z[2]+Raise[2][2]) - (PT->Z[0]+Raise[2][0]);
+      nn[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
+      nn[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
+      nn[2]  = x1x0 * y2y0 - y1y0 * x2x0 ;
+      //norme(nn); unnecessary with   glEnable(GL_NORMALIZE);
+      /* BOF BOF BOF 
+      if(nn[2] < -0.1){
+	nn[0] = -nn[0];
+	nn[1] = -nn[1];
+	nn[2] = -nn[2];
+      }
+      */
+      glNormal3dv(nn);
+    }
+
+    if(View->IntervalsType==DRAW_POST_CONTINUOUS){
+      if(PT->V[3*View->TimeStep]  >=ValMin && PT->V[3*View->TimeStep]  <=ValMax &&
+	 PT->V[3*View->TimeStep+1]>=ValMin && PT->V[3*View->TimeStep+1]<=ValMax &&
+	 PT->V[3*View->TimeStep+2]>=ValMin && PT->V[3*View->TimeStep+2]<=ValMax){
+	glBegin(GL_TRIANGLES);
+	Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep]);
+	glVertex3d(PT->X[0]+View->Offset[0]+Raise[0][0],
+		   PT->Y[0]+View->Offset[1]+Raise[1][0],
+		   PT->Z[0]+View->Offset[2]+Raise[2][0]);
+	Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+1]);
+	glVertex3d(PT->X[1]+View->Offset[0]+Raise[0][1],
+		   PT->Y[1]+View->Offset[1]+Raise[1][1],
+		   PT->Z[1]+View->Offset[2]+Raise[2][1]);
+	Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+2]);
+	glVertex3d(PT->X[2]+View->Offset[0]+Raise[0][2],
+		   PT->Y[2]+View->Offset[1]+Raise[1][2],
+		   PT->Z[2]+View->Offset[2]+Raise[2][2]);
+	glEnd();
+      }
+      else{
+	CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+		      ValMin,ValMax,ValMin,ValMax,
+		      Xp,Yp,Zp,&nb,value);
+	if(nb >= 3){	  
+	  glBegin(GL_POLYGON);
+	  for(i=0;i<nb;i++){
+	    Palette2(View,ValMin,ValMax,value[i]);
+	    RaiseFill(i,value[i],ValMin,Raise);
+	    glVertex3d(Xp[i]+View->Offset[0]+Raise[0][i],
+		       Yp[i]+View->Offset[1]+Raise[1][i],
+		       Zp[i]+View->Offset[2]+Raise[2][i]);
+	  }
+	  glEnd();
+	}
+      }
+    }
+    else{
+      for(k=0 ; k<View->NbIso ; k++){
+	if(View->IntervalsType==DRAW_POST_DISCRETE){
+	  Palette(View,View->NbIso,k);
+	  CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+			View->GVFI(ValMin,ValMax,View->NbIso+1,k),
+			View->GVFI(ValMin,ValMax,View->NbIso+1,k+1),
+			ValMin,ValMax,
+			Xp,Yp,Zp,&nb,value);	  
+	  if(nb >= 3){
+	    for(i=0;i<nb;i++) RaiseFill(i,value[i],ValMin,Raise);    
+	    Draw_Polygon(nb,Xp,Yp,Zp,View->Offset,Raise);  
+	  }
+	}
+	else{
+	  Palette(View,View->NbIso,k);
+
+	  thev = View->GVFI(ValMin,ValMax,View->NbIso,k);
+	  CutTriangle1D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+			thev, ValMin,ValMax,Xp,Yp,Zp,&nb);	  
+	  if(nb == 2){
+	    for(i=0;i<2;i++) RaiseFill(i,thev,ValMin,Raise);
+	    Draw_Line(Xp,Yp,Zp,View->Offset,Raise);    
+	  }
+	}
+      }
+    }
+    break;
+    
+  case DRAW_POST_VECTOR:
+    
+    if(View->ArrowType == DRAW_POST_DISPLACEMENT){
+      fact = View->ArrowScale/100. ;
+      for(m=0;m<3;m++){
+	xx[m] = PT->X[m] + fact * PT->V[9*View->TimeStep + 3 * m ];
+	yy[m] = PT->Y[m] + fact * PT->V[9*View->TimeStep + 3 * m + 1];
+	zz[m] = PT->Z[m] + fact * PT->V[9*View->TimeStep + 3 * m + 2];
+      }
+      glEnable(GL_POLYGON_OFFSET_FILL);
+      glColor4ubv((GLubyte*)&CTX.color.bg);
+      if(View->IntervalsType!=DRAW_POST_ISO)
+	Draw_Polygon (3, xx, yy, zz, View->Offset, Raise);
+      glColor4ubv((GLubyte*)&CTX.color.fg);
+      glBegin(GL_LINE_LOOP);
+      for(m=0 ; m<3 ; m++) glVertex3d(xx[m], yy[m], zz[m]);
+      glEnd();
+      glDisable(GL_POLYGON_OFFSET_FILL);      
+      break;
+    }
+    
+    if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
+      dx = (PT->V[9*View->TimeStep]  +PT->V[9*View->TimeStep+3]+PT->V[9*View->TimeStep+6])/3.;
+      dy = (PT->V[9*View->TimeStep+1]+PT->V[9*View->TimeStep+4]+PT->V[9*View->TimeStep+7])/3.;
+      dz = (PT->V[9*View->TimeStep+2]+PT->V[9*View->TimeStep+5]+PT->V[9*View->TimeStep+8])/3.;
+      d = sqrt(dx*dx+dy*dy+dz*dz);
+      if(d!=0.0 && d>=ValMin && d<=ValMax){		
+	Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));	      
+	fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	  dx /= d ; dy /= d ; dz /= d ;
+	  d = log10(d/ValMin) ; 
+	  dx *= d ; dy *= d ; dz *= d ;
+	}
+	RaiseFill(0, d, ValMin, Raise);		
+	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		    (PT->X[0] + PT->X[1] + PT->X[2])/3.,
+		    (PT->Y[0] + PT->Y[1] + PT->Y[2])/3.,
+		    (PT->Z[0] + PT->Z[1] + PT->Z[2])/3.,
+		    fact*d, fact*dx, fact*dy, fact*dz,
+		    View->Offset, Raise);
+      }
+    }
+    else{
+      for(k=0 ; k<3 ; k++){
+	dx = PT->V[9*View->TimeStep  +3*k] ;
+	dy = PT->V[9*View->TimeStep+1+3*k] ;
+	dz = PT->V[9*View->TimeStep+2+3*k] ;		  
+	d = sqrt(dx*dx+dy*dy+dz*dz);
+	
+	if(d!=0.0 && d>=ValMin && d<=ValMax){		
+	  Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+	  fact = 2.e-4 * LC * View->ArrowScale/View->Max ;		
+	  if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	    dx /= d ; dy /= d ; dz /= d ;
+	    d = log10(d/ValMin) ; 
+	    dx *= d ; dy *= d ; dz *= d ;
+	  }
+	  RaiseFill(0, d, ValMin, Raise);				  
+	  Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		      PT->X[k], PT->Y[k], PT->Z[k],
+		      fact*d, fact*dx, fact*dy, fact*dz,
+		      View->Offset, Raise);
+	  
+	}		
+      }	      
+    }
+    break;
+    
+  case DRAW_POST_TENSOR :
+    break;
+    
+  }
+
+  if(View->ShowElement){
+    glDisable(GL_POLYGON_OFFSET_FILL) ;
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glBegin(GL_LINE_LOOP);
+    for(i=0 ; i<3 ; i++) 
+      glVertex3d(PT->X[i]+View->Offset[0]+Raise[0][i],
+		 PT->Y[i]+View->Offset[1]+Raise[1][i],
+		 PT->Z[i]+View->Offset[2]+Raise[2][i]);
+    glEnd();
+  }
+
+}
+
+
diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ac8f464e5fb45f19057f544af863dc5ce167d4e7
--- /dev/null
+++ b/Graphics/Scale.cpp
@@ -0,0 +1,313 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+#include "gl2ps.h"
+
+extern Context_T   CTX;
+
+#ifdef _UNIX
+#include "XContext.h"
+extern XContext_T  XCTX;
+#define FONTHEIGHT  XCTX.xfont.helve_h
+#define FONTASCENT  XCTX.xfont.helve_a
+#else
+#define FONTHEIGHT  21
+#define FONTASCENT  21
+#endif
+
+/* Even if all computations in these routines are made in window
+   coordinates, double precision is used to work at subpixel accuracy */
+
+extern List_T   *Post_ViewList;
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ S c a l e                                                     */
+/* ------------------------------------------------------------------------ */
+
+void Draw_String(char *s){
+
+  if(CTX.stream == TO_FILE){
+    if(CTX.print.type == GLPRPAINTER || CTX.print.type == GLPRRECURSIVE) {
+      gl2psText(s,CTX.post.font,CTX.post.fontsize);
+      return ;
+    }
+  }
+
+  glListBase(CTX.font_base);
+  glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *)s);
+}
+
+
+#ifdef _UNIX
+static int          dir,ascent, descent;
+static XCharStruct  overall;
+#define CHECK_W										\
+  XTextExtents(XCTX.xfont.helve, label, strlen(label), &dir,&ascent,&descent,&overall);	\
+  if(overall.width > cv_w) cv_w=overall.width
+#else
+#define CHECK_W	 cv_w=200
+#endif
+
+
+extern double GiveValueFromIndex_Lin(double ValMin, double ValMax, int NbIso, int Iso);
+extern double GiveValueFromIndex_Log(double ValMin, double ValMax, int NbIso, int Iso);
+extern int GiveIndexFromValue_Lin(double ValMin, double ValMax, int NbIso, double Val);
+extern int GiveIndexFromValue_Log(double ValMin, double ValMax, int NbIso, double Val);
+
+void draw_scale(Post_View *v, double xmin, double ymin, double *width, double height){
+  int       i, nbv;
+  double    font_h, font_a, label_h;
+  double    cs_xmin, cs_ymin, cs_h, cs_w, cs_bh;
+  double    cv_xmin, cv_ymin, cv_h, cv_w, cv_bh;
+  char      label[128] ;
+  double    Val, ValMin, ValMax;
+
+  font_h  = FONTHEIGHT ;              /* hauteur totale de la fonte */
+  font_a  = FONTASCENT ;              /* hauteur de la fonte au dessus de pt de ref */
+  label_h = 1.8*font_h ;              /* hauteur du label */
+
+  cs_xmin = xmin ;                    /* colorscale xmin */
+  cs_ymin = ymin+label_h ;            /* colorscale ymin */
+  cs_w    = 16. ;                     /* colorscale width */
+  cs_h    = height-label_h ;          /* colorscale height */
+  cs_bh   = cs_h/v->NbIso ;           /* colorscale box height */
+
+  cv_xmin = cs_xmin+cs_w+5 ;          /* valuescale xmin */
+  cv_ymin = cs_ymin ;                 /* valuescale ymin */
+  cv_w    = 0.0 ;                     /* valuescale width: to be computed */
+  cv_h    = cs_h ;                    /* valuescale height */
+  cv_bh   = 0.0 ;                     /* valuescale box height: to be computed */
+
+
+  switch(v->IntervalsType){
+  case DRAW_POST_CONTINUOUS : 
+    glShadeModel(GL_SMOOTH); break;
+  case DRAW_POST_ISO : 
+  case DRAW_POST_DISCRETE : 
+    glShadeModel(GL_FLAT); break;
+  }
+  
+  switch(v->RangeType){
+  case DRAW_POST_DEFAULT : ValMin = v->Min ; ValMax = v->Max ; break;
+  case DRAW_POST_CUSTOM  : ValMin = v->CustomMin ; ValMax = v->CustomMax ; break;
+  }
+  
+  switch(v->ScaleType){
+  case DRAW_POST_LINEAR : 
+    v->GIFV = GiveIndexFromValue_Lin ;
+    v->GVFI = GiveValueFromIndex_Lin ;
+    break;
+  case DRAW_POST_LOGARITHMIC : 
+    v->GIFV = GiveIndexFromValue_Log ;
+    v->GVFI = GiveValueFromIndex_Log ;
+    break;
+  }
+
+  /* background : bidouille
+     il faudra changer l'ordre des operations
+   */
+
+  if(!v->TransparentScale){
+    sprintf(label, v->Format, (ValMin+ValMax)/Pi);
+    CHECK_W;
+    *width = cv_xmin-cs_xmin+cv_w;   
+    glColor4ubv((GLubyte*)&CTX.color.bg);
+    glBegin(GL_QUADS);
+    glVertex2d(xmin,        ymin);
+    glVertex2d(xmin+*width, ymin);
+    glVertex2d(xmin+*width, ymin+height);
+    glVertex2d(xmin,        ymin+height);
+    glEnd();    
+  }
+
+  /* colorscale */
+
+  for(i=0;i<v->NbIso;i++){
+    if(v->IntervalsType==DRAW_POST_DISCRETE){
+      Palette(v,v->NbIso,i);   
+      glBegin(GL_QUADS);
+      glVertex2d(cs_xmin,      cs_ymin+i*cs_bh);
+      glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh);
+      glVertex2d(cs_xmin+cs_w, cs_ymin+(i+1)*cs_bh);
+      glVertex2d(cs_xmin,      cs_ymin+(i+1)*cs_bh);
+      glEnd();
+    }
+    else if (v->IntervalsType==DRAW_POST_CONTINUOUS){
+      glBegin(GL_QUADS);
+      Palette2(v,ValMin,ValMax,ValMin+i*(ValMax-ValMin)/v->NbIso);
+      glVertex2d(cs_xmin,      cs_ymin+i*cs_bh);
+      glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh);
+      Palette2(v,ValMin,ValMax,ValMin+(i+1)*(ValMax-ValMin)/v->NbIso);
+      glVertex2d(cs_xmin+cs_w, cs_ymin+(i+1)*cs_bh);
+      glVertex2d(cs_xmin,      cs_ymin+(i+1)*cs_bh);
+      glEnd();	
+    }
+    else{
+      Palette(v,v->NbIso,i);
+      glBegin(GL_LINES);
+      glVertex2d(cs_xmin,      cs_ymin+i*cs_bh+0.5*cs_bh);
+      glVertex2d(cs_xmin+cs_w, cs_ymin+i*cs_bh+0.5*cs_bh);
+      glEnd();
+    }
+  }  
+  
+  /* valuescale */
+  
+  nbv = (v->NbIso<floor(cs_h/font_h))?v->NbIso:-1;
+  cv_bh = cv_h/nbv;
+
+  glColor4ubv((GLubyte*)&CTX.color.text);
+
+  /* only min and max if not enough room */
+  if(nbv<0){
+    if(v->IntervalsType!=DRAW_POST_ISO){
+      sprintf(label, v->Format, ValMin);
+      glRasterPos2d(cv_xmin,cv_ymin-font_a/3.);
+      Draw_String(label); CHECK_W;
+
+      sprintf(label, v->Format, ValMax);
+      glRasterPos2d(cv_xmin,cv_ymin+cv_h-font_a/3.);
+      Draw_String(label); CHECK_W;
+    }
+    else {
+      sprintf(label, v->Format, ValMin);
+      glRasterPos2d(cv_xmin,cv_ymin+(cs_bh/2)-font_a/3.);
+      Draw_String(label); CHECK_W;
+
+      sprintf(label, v->Format, ValMax);
+      glRasterPos2d(cv_xmin,cv_ymin+cv_h-(cs_bh/2)-font_a/3.);
+      Draw_String(label); CHECK_W;
+    }
+  }
+
+  /* all the values if enough space */
+  else {
+    if(v->IntervalsType!=DRAW_POST_ISO){
+      for(i=0 ; i<nbv+1 ; i++){
+	Val = v->GVFI(ValMin,ValMax,nbv+1,i); 
+	sprintf(label, v->Format, Val);
+	glRasterPos2d(cv_xmin,cv_ymin+i*cv_bh-font_a/3.);
+	Draw_String(label); CHECK_W;
+      }
+    }
+    else {
+      for(i=0 ; i<nbv ; i++){
+	Val = v->GVFI(ValMin,ValMax,nbv,i); 
+	sprintf(label, v->Format, Val);
+	glRasterPos2d(cv_xmin,cv_ymin+(2*i+1)*(cv_bh/2)-font_a/3.);
+	Draw_String(label); CHECK_W;
+      }
+    }
+  }
+
+  /* the label */
+  
+  glRasterPos2d(cv_xmin,ymin);
+  sprintf(label, "%s", v->Name);
+  Draw_String(label); CHECK_W;
+
+
+  /* compute the width */
+  *width = cv_xmin-cs_xmin+cv_w;
+
+}
+
+static List_T  *todraw=NULL;
+
+void Draw_Scales(void){
+  int         i;
+  double      xmin, ymin, width, height, xsep, ysep;
+  double      oldwidth, totalwidth;
+  Post_View  *v;
+
+  if(!Post_ViewList) return;
+
+  /* scales to draw ? */
+  
+  if(!todraw)
+    todraw = List_Create(5,5,sizeof(Post_View*));
+  else
+    List_Reset(todraw);
+
+  for(i=0;i<List_Nbr(Post_ViewList);i++){
+    v = (Post_View*)List_Pointer(Post_ViewList,i);
+    if(v->Visible && v->ShowScale) List_Add(todraw,&v);
+  }
+  
+  if(!List_Nbr(todraw)){
+    return;
+  }
+
+  if(List_Nbr(todraw)==1){
+    xsep = 20. ;
+    ysep = (CTX.viewport[3]-CTX.viewport[1])/6. ;
+    xmin = CTX.viewport[0] + xsep ;    
+    ymin = CTX.viewport[1] + ysep ;
+    width = 0.0;
+    height = CTX.viewport[3]-CTX.viewport[1] - 2*ysep ;
+
+    v = *((Post_View**)List_Pointer(todraw,0));
+    draw_scale(v,xmin,ymin,&width,height);
+  }
+  else{
+    xsep = 20. ;
+    ysep = (CTX.viewport[3]-CTX.viewport[1])/15. ;    
+    xmin = CTX.viewport[0] + xsep ;
+    ymin = CTX.viewport[1] + ysep ;
+    width = 0.0;
+    totalwidth = 0.0;
+    height = (CTX.viewport[3]-CTX.viewport[1]-3*ysep)/2. ;
+
+    for(i=0;i<List_Nbr(todraw);i++){
+      v = *(Post_View**)List_Pointer(todraw,i);
+      oldwidth = width;
+      draw_scale(v,
+		 xmin+totalwidth+(i/2)*xsep,
+		 ymin+(1-i%2)*(height+ysep),
+		 &width,
+		 height);      
+      if(i%2) totalwidth += DMAX(width,oldwidth);
+    }
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  D r a w _ S m a l l A x e s                                             */
+/* ------------------------------------------------------------------------ */
+
+void Draw_SmallAxes(void){
+  double a,b,c;
+  double l,o,xx,xy,yx,yy,zx,zy,cx,cy;
+
+  a = CTX.r[0] * Pi/180. ;
+  b = CTX.r[1] * Pi/180. ;
+  c = CTX.r[2] * Pi/180. ;
+
+  l  = 30  ;
+  o  = 2  ;
+  cx = CTX.viewport[2] - 45;
+  cy = CTX.viewport[1] + 35;
+
+  xx =  l*cos(b)*cos(c) ; xy =  l*(sin(a)*sin(b)*cos(c)+cos(a)*sin(c)) ;
+  yx = -l*cos(b)*sin(c) ; yy = -l*(sin(a)*sin(b)*sin(c)-cos(a)*cos(c)) ;
+  zx =  l*sin(b)        ; zy = -l*sin(a)*cos(b) ;
+
+  glColor4ubv((GLubyte*)&CTX.color.little_axes);
+
+  glBegin(GL_LINES);
+  glVertex2d(cx,cy); glVertex2d(cx+xx,cy+xy);
+  glVertex2d(cx,cy); glVertex2d(cx+yx,cy+yy);
+  glVertex2d(cx,cy); glVertex2d(cx+zx,cy+zy);  
+  glEnd();
+  glRasterPos2d(cx+xx+o,cy+xy+o); Draw_String("X");
+  glRasterPos2d(cx+yx+o,cy+yy+o); Draw_String("Y");
+  glRasterPos2d(cx+zx+o,cy+zy+o); Draw_String("Z");
+
+}
+
diff --git a/Graphics/Volume.cpp b/Graphics/Volume.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b393beacd151f5d9d3932b8990ba4f00843062c2
--- /dev/null
+++ b/Graphics/Volume.cpp
@@ -0,0 +1,67 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Interpolation.h"
+#include "Context.h"
+
+extern Context_T   CTX;
+
+int TheVolume;
+
+extern Mesh      *THEM;
+
+void Draw_Curve_For_Volume (void *a, void *b){
+  int     i,N;
+  Curve  *c;
+  Vertex  v;
+
+  glLineWidth(2.);
+
+  c = *(Curve**)a;
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glLoadName(3);
+    glPushName(TheVolume);
+  }
+
+  if(c->Typ == MSH_SEGM_LINE)
+    N = List_Nbr(c->Control_Points);
+  else
+    N = 10;
+
+  glBegin(GL_LINE_STRIP);
+  for(i=0;i<N;i++){
+    v = InterpolateCurve(c,0.2*(double)i/(double)(N-1),0);
+    glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z);
+  }
+  glEnd();
+
+  glBegin(GL_LINE_STRIP);
+  for(i=N-1;i>=0;i--){
+    v = InterpolateCurve(c,1.-0.2*(double)i/(double)(N-1),0);
+    glVertex3d(v.Pos.X,v.Pos.Y,v.Pos.Z);
+  }
+  glEnd();
+
+
+  if(CTX.render_mode == GMSH_SELECT){
+    glPopName ();
+  }
+
+  if((c)->ipar[3]){
+    glLineWidth(1.);
+  }
+
+}
+
+
+void DrawVolumes (Mesh *m){
+
+
+}
+
+
+
diff --git a/Graphics/gl2gif.cpp b/Graphics/gl2gif.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8c0c96f598080aa47976783022101084d89875f0
--- /dev/null
+++ b/Graphics/gl2gif.cpp
@@ -0,0 +1,1066 @@
+/*
+  This file is a big hack from
+
+  The GIFLIB distribution is Copyright (c) 1997  Eric S. Raymond
+
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <unistd.h>
+
+#include <GL/gl.h>
+#include "gl2gif.h"
+
+static int _GifError = 0;
+static int ExpNumOfColors = 8, ColorMapSize = 256;
+
+
+/******************************************************************************
+* Initialize HashTable - allocate the memory needed and clear it.	      *
+******************************************************************************/
+GifHashTableType *_InitHashTable(void)
+{
+    GifHashTableType *HashTable;
+
+    if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType)))
+	== NULL)
+	return NULL;
+
+    _ClearHashTable(HashTable);
+
+    return HashTable;
+}
+
+/******************************************************************************
+* Routine to clear the HashTable to an empty state.			      *
+* This part is a little machine depended. Use the commented part otherwise.   *
+******************************************************************************/
+void _ClearHashTable(GifHashTableType *HashTable)
+{
+  int index = HT_SIZE;
+  unsigned long* HTable = HashTable->HTable;
+  while (--index>=0)
+    HTable[index] = 0xfffffffful;
+}
+
+/******************************************************************************
+* Routine to generate an HKey for the hashtable out of the given unique key.  *
+* The given Key is assumed to be 20 bits as follows: lower 8 bits are the     *
+* new postfix character, while the upper 12 bits are the prefix code.	      *
+* Because the average hit ratio is only 2 (2 hash references per entry),      *
+* evaluating more complex keys (such as twin prime keys) does not worth it!   *
+******************************************************************************/
+static int KeyItem(unsigned long Item)
+{
+    return ((Item >> 12) ^ Item) & HT_KEY_MASK;
+}
+
+/******************************************************************************
+* Routine to insert a new Item into the HashTable. The data is assumed to be  *
+* new one.								      *
+******************************************************************************/
+void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code)
+{
+    int HKey = KeyItem(Key);
+    unsigned long *HTable = HashTable -> HTable;
+
+    while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) {
+	HKey = (HKey + 1) & HT_KEY_MASK;
+    }
+    HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code);
+}
+
+/******************************************************************************
+* Routine to test if given Key exists in HashTable and if so returns its code *
+* Returns the Code if key was found, -1 if not.				      *
+******************************************************************************/
+int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key)
+{
+    int HKey = KeyItem(Key);
+    unsigned long *HTable = HashTable -> HTable, HTKey;
+
+    while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) {
+	if (Key == HTKey) return HT_GET_CODE(HTable[HKey]);
+	HKey = (HKey + 1) & HT_KEY_MASK;
+    }
+
+    return -1;
+}
+
+/******************************************************************************
+* Miscellaneous utility functions					      *
+******************************************************************************/
+
+int BitSize(int n)
+/* return smallest bitfield size n will fit in */
+{
+    register int i;
+
+    for (i = 1; i <= 8; i++)
+	if ((1 << i) >= n)
+	    break;
+    return(i);
+}
+
+
+/******************************************************************************
+* Color map object functions						      *
+******************************************************************************/
+
+ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap)
+{
+    ColorMapObject *Object;
+
+    if (ColorCount != (1 << BitSize(ColorCount))){
+      printf("Arrrrrgggg\n");
+      return((ColorMapObject *)NULL);
+    }
+
+    Object = (ColorMapObject *)malloc(sizeof(ColorMapObject));
+    if (Object == (ColorMapObject *)NULL)
+	return((ColorMapObject *)NULL);
+
+    Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType));
+    if (Object->Colors == (GifColorType *)NULL)
+	return((ColorMapObject *)NULL);
+
+    Object->ColorCount = ColorCount;
+    Object->BitsPerPixel = BitSize(ColorCount);
+
+    if (ColorMap)
+	memcpy((char *)Object->Colors,
+	       (char *)ColorMap, ColorCount * sizeof(GifColorType));
+
+    return(Object);
+}
+
+void FreeMapObject(ColorMapObject *Object)
+{
+    free(Object->Colors);
+    free(Object);
+}
+
+/*****************************************************************************
+* Print the last GIF error to stderr.					     *
+*****************************************************************************/
+void PrintGifError(void)
+{
+    char *Err;
+
+    switch(_GifError) {
+	case E_GIF_ERR_OPEN_FAILED:
+	    Err = "Failed to open given file";
+	    break;
+	case E_GIF_ERR_WRITE_FAILED:
+	    Err = "Failed to Write to given file";
+	    break;
+	case E_GIF_ERR_HAS_SCRN_DSCR:
+	    Err = "Screen Descriptor already been set";
+	    break;
+	case E_GIF_ERR_HAS_IMAG_DSCR:
+	    Err = "Image Descriptor is still active";
+	    break;
+	case E_GIF_ERR_NO_COLOR_MAP:
+	    Err = "Neither Global Nor Local color map";
+	    break;
+	case E_GIF_ERR_DATA_TOO_BIG:
+	    Err = "#Pixels bigger than Width * Height";
+	    break;
+	case E_GIF_ERR_NOT_ENOUGH_MEM:
+	    Err = "Fail to allocate required memory";
+	    break;
+	case E_GIF_ERR_DISK_IS_FULL:
+	    Err = "Write failed (disk full?)";
+	    break;
+	case E_GIF_ERR_CLOSE_FAILED:
+	    Err = "Failed to close given file";
+	    break;
+	case E_GIF_ERR_NOT_WRITEABLE:
+	    Err = "Given file was not opened for write";
+	    break;
+	default:
+	    Err = NULL;
+	    break;
+    }
+    if (Err != NULL)
+	fprintf(stderr, "Error: %s\n", Err);
+    else
+	fprintf(stderr, "Error: GIF undefined error %d\n", _GifError);
+}
+
+#define ABS(x)	((x) > 0 ? (x) : (-(x)))
+
+#define COLOR_ARRAY_SIZE 32768
+#define BITS_PER_PRIM_COLOR 5
+#define MAX_PRIM_COLOR      0x1f
+
+static int SortRGBAxis;
+
+typedef struct QuantizedColorType {
+    GifByteType RGB[3];
+    GifByteType NewColorIndex;
+    long Count;
+    struct QuantizedColorType *Pnext;
+} QuantizedColorType;
+
+typedef struct NewColorMapType {
+    GifByteType RGBMin[3], RGBWidth[3];
+    int NumEntries;    /* # of QuantizedColorType in linked list below. */
+    long Count;        /* Total number of pixels in all the entries. */
+    QuantizedColorType *QuantizedColors;
+} NewColorMapType;
+
+static int SubdivColorMap(NewColorMapType *NewColorSubdiv,
+			  int ColorMapSize,
+			  int *NewColorMapSize);
+static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2);
+
+/******************************************************************************
+* Quantize high resolution image into lower one. Input image consists of a    *
+* 2D array for each of the RGB colors with size Width by Height. There is no  *
+* Color map for the input. Output is a quantized image with 2D array of       *
+* indexes into the output color map.					      *
+*   Note input image can be 24 bits at the most (8 for red/green/blue) and    *
+* the output has 256 colors at the most (256 entries in the color map.).      *
+* ColorMapSize specifies size of color map up to 256 and will be updated to   *
+* real size before returning.						      *
+*   Also non of the parameter are allocated by this routine.		      *
+*   This function returns GIF_OK if succesfull, GIF_ERROR otherwise.	      *
+******************************************************************************/
+int QuantizeBuffer(int Width, int Height, int *ColorMapSize,
+	GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput,
+	GifByteType *OutputBuffer, GifColorType *OutputColorMap)
+{
+    int Index, NumOfEntries;
+    int i, j, MaxRGBError[3];
+    int NewColorMapSize;
+    long Red, Green, Blue;
+    NewColorMapType NewColorSubdiv[256];
+    QuantizedColorType *ColorArrayEntries, *QuantizedColor;
+
+    if ((ColorArrayEntries = (QuantizedColorType *)
+	    malloc(sizeof(QuantizedColorType) * COLOR_ARRAY_SIZE)) == NULL) {
+	_GifError = E_GIF_ERR_NOT_ENOUGH_MEM;
+	return GIF_ERROR;
+    }
+
+    for (i = 0; i < COLOR_ARRAY_SIZE; i++) {
+	ColorArrayEntries[i].RGB[0]= i >> (2 * BITS_PER_PRIM_COLOR);
+	ColorArrayEntries[i].RGB[1] = (i >> BITS_PER_PRIM_COLOR) &
+	    						MAX_PRIM_COLOR;
+	ColorArrayEntries[i].RGB[2] = i & MAX_PRIM_COLOR;
+	ColorArrayEntries[i].Count = 0;
+    }
+
+    /* Sample the colors and their distribution: */
+    for (i = 0; i < (int)(Width * Height); i++) {
+	Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR))
+		    << (2 * BITS_PER_PRIM_COLOR)) +
+		((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR))
+		    << BITS_PER_PRIM_COLOR) +
+		(BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR));
+	ColorArrayEntries[Index].Count++;
+    }
+
+    /* Put all the colors in the first entry of the color map, and call the  */
+    /* recursive subdivision process.					     */
+    for (i = 0; i < 256; i++) {
+	NewColorSubdiv[i].QuantizedColors = NULL;
+	NewColorSubdiv[i].Count = NewColorSubdiv[i].NumEntries = 0;
+	for (j = 0; j < 3; j++) {
+	    NewColorSubdiv[i].RGBMin[j] = 0;
+	    NewColorSubdiv[i].RGBWidth[j] = 255;
+	}
+    }
+
+    /* Find the non empty entries in the color table and chain them: */
+    for (i = 0; i < COLOR_ARRAY_SIZE; i++)
+	if (ColorArrayEntries[i].Count > 0) break;
+    QuantizedColor = NewColorSubdiv[0].QuantizedColors = &ColorArrayEntries[i];
+    NumOfEntries = 1;
+    while (++i < COLOR_ARRAY_SIZE)
+	if (ColorArrayEntries[i].Count > 0) {
+	    QuantizedColor -> Pnext = &ColorArrayEntries[i];
+	    QuantizedColor = &ColorArrayEntries[i];
+	    NumOfEntries++;
+	}
+    QuantizedColor -> Pnext = NULL;
+
+    NewColorSubdiv[0].NumEntries = NumOfEntries;/* Different sampled colors. */
+    NewColorSubdiv[0].Count = ((long) Width) * Height;            /* Pixels. */
+    NewColorMapSize = 1;
+    if (SubdivColorMap(NewColorSubdiv, *ColorMapSize, &NewColorMapSize) !=
+								     GIF_OK) {
+	free((char *) ColorArrayEntries);
+	return GIF_ERROR;
+    }
+    if (NewColorMapSize < *ColorMapSize) {
+	/* And clear rest of color map: */
+	for (i = NewColorMapSize; i < *ColorMapSize; i++)
+	    OutputColorMap[i].Red =
+	    OutputColorMap[i].Green =
+	    OutputColorMap[i].Blue = 0;
+    }
+
+    /* Average the colors in each entry to be the color to be used in the    */
+    /* output color map, and plug it into the output color map itself.       */
+    for (i = 0; i < NewColorMapSize; i++) {
+	if ((j = NewColorSubdiv[i].NumEntries) > 0) {
+	    QuantizedColor = NewColorSubdiv[i].QuantizedColors;
+	    Red = Green = Blue = 0;
+	    while (QuantizedColor) {
+		QuantizedColor -> NewColorIndex = i;
+		Red += QuantizedColor -> RGB[0];
+		Green += QuantizedColor -> RGB[1];
+		Blue += QuantizedColor -> RGB[2];
+		QuantizedColor = QuantizedColor -> Pnext;
+	    }
+	    OutputColorMap[i].Red = (Red << (8 - BITS_PER_PRIM_COLOR)) / j;
+	    OutputColorMap[i].Green = (Green << (8 - BITS_PER_PRIM_COLOR)) / j;
+	    OutputColorMap[i].Blue= (Blue << (8 - BITS_PER_PRIM_COLOR)) / j;
+	}
+	else
+	    fprintf(stderr, "Warning, Null entry in quantized color map - that's weird\n");
+    }
+
+    /* Finally scan the input buffer again and put the mapped index in the   */
+    /* output buffer.							     */
+    MaxRGBError[0] = MaxRGBError[1] = MaxRGBError[2] = 0;
+    for (i = 0; i < (int)(Width * Height); i++) {
+	Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR))
+		    << (2 * BITS_PER_PRIM_COLOR)) +
+		((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR))
+		    << BITS_PER_PRIM_COLOR) +
+		(BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR));
+	Index = ColorArrayEntries[Index].NewColorIndex;
+	OutputBuffer[i] = Index;
+	if (MaxRGBError[0] < ABS(OutputColorMap[Index].Red - RedInput[i]))
+	    MaxRGBError[0] = ABS(OutputColorMap[Index].Red - RedInput[i]);
+	if (MaxRGBError[1] < ABS(OutputColorMap[Index].Green - GreenInput[i]))
+	    MaxRGBError[1] = ABS(OutputColorMap[Index].Green - GreenInput[i]);
+	if (MaxRGBError[2] < ABS(OutputColorMap[Index].Blue - BlueInput[i]))
+	    MaxRGBError[2] = ABS(OutputColorMap[Index].Blue - BlueInput[i]);
+    }
+
+    free((char *) ColorArrayEntries);
+
+    *ColorMapSize = NewColorMapSize;
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+* Routine to subdivide the RGB space recursively using median cut in each     *
+* axes alternatingly until ColorMapSize different cubes exists.		      *
+* The biggest cube in one dimension is subdivide unless it has only one entry.*
+* Returns GIF_ERROR if failed, otherwise GIF_OK.			      *
+******************************************************************************/
+static int SubdivColorMap(NewColorMapType *NewColorSubdiv,
+			  int ColorMapSize,
+			  int *NewColorMapSize)
+{
+    int MaxSize;
+    int i, j, Index = 0, NumEntries, MinColor, MaxColor;
+    long Sum, Count;
+    QuantizedColorType *QuantizedColor, **SortArray;
+
+    while (ColorMapSize > *NewColorMapSize) {
+	/* Find candidate for subdivision: */
+	MaxSize = -1;
+	for (i = 0; i < *NewColorMapSize; i++) {
+	    for (j = 0; j < 3; j++) {
+		if (((int) NewColorSubdiv[i].RGBWidth[j]) > MaxSize &&
+		    NewColorSubdiv[i].NumEntries > 1) {
+		    MaxSize = NewColorSubdiv[i].RGBWidth[j];
+		    Index = i;
+		    SortRGBAxis = j;
+		}
+	    }
+	}
+
+	if (MaxSize == -1)
+	    return GIF_OK;
+
+	/* Split the entry Index into two along the axis SortRGBAxis: */
+
+	/* Sort all elements in that entry along the given axis and split at */
+	/* the median.							     */
+	if ((SortArray = (QuantizedColorType **)
+	    malloc(sizeof(QuantizedColorType *) *
+		   NewColorSubdiv[Index].NumEntries)) == NULL)
+    	    return GIF_ERROR;
+	for (j = 0, QuantizedColor = NewColorSubdiv[Index].QuantizedColors;
+	     j < NewColorSubdiv[Index].NumEntries && QuantizedColor != NULL;
+	     j++, QuantizedColor = QuantizedColor -> Pnext)
+	    SortArray[j] = QuantizedColor;
+	qsort(SortArray, NewColorSubdiv[Index].NumEntries,
+	      sizeof(QuantizedColorType *), SortCmpRtn);
+
+	/* Relink the sorted list into one: */
+	for (j = 0; j < NewColorSubdiv[Index].NumEntries - 1; j++)
+	    SortArray[j] -> Pnext = SortArray[j + 1];
+	SortArray[NewColorSubdiv[Index].NumEntries - 1] -> Pnext = NULL;
+	NewColorSubdiv[Index].QuantizedColors = QuantizedColor = SortArray[0];
+	free((char *) SortArray);
+
+	/* Now simply add the Counts until we have half of the Count: */
+	Sum = NewColorSubdiv[Index].Count / 2 - QuantizedColor -> Count;
+	NumEntries = 1;
+	Count = QuantizedColor -> Count;
+	while ((Sum -= QuantizedColor -> Pnext -> Count) >= 0 &&
+	       QuantizedColor -> Pnext != NULL &&
+	       QuantizedColor -> Pnext -> Pnext != NULL) {
+	    QuantizedColor = QuantizedColor -> Pnext;
+	    NumEntries++;
+	    Count += QuantizedColor -> Count;
+	}
+	/* Save the values of the last color of the first half, and first    */
+	/* of the second half so we can update the Bounding Boxes later.     */
+	/* Also as the colors are quantized and the BBoxes are full 0..255,  */
+	/* they need to be rescaled.					     */
+	MaxColor = QuantizedColor -> RGB[SortRGBAxis];/* Max. of first half. */
+	MinColor = QuantizedColor -> Pnext -> RGB[SortRGBAxis];/* of second. */
+	MaxColor <<= (8 - BITS_PER_PRIM_COLOR);
+	MinColor <<= (8 - BITS_PER_PRIM_COLOR);
+
+	/* Partition right here: */
+	NewColorSubdiv[*NewColorMapSize].QuantizedColors =
+	    QuantizedColor -> Pnext;
+	QuantizedColor -> Pnext = NULL;
+	NewColorSubdiv[*NewColorMapSize].Count = Count;
+	NewColorSubdiv[Index].Count -= Count;
+	NewColorSubdiv[*NewColorMapSize].NumEntries =
+	    NewColorSubdiv[Index].NumEntries - NumEntries;
+	NewColorSubdiv[Index].NumEntries = NumEntries;
+	for (j = 0; j < 3; j++) {
+	    NewColorSubdiv[*NewColorMapSize].RGBMin[j] =
+		NewColorSubdiv[Index].RGBMin[j];
+	    NewColorSubdiv[*NewColorMapSize].RGBWidth[j] =
+		NewColorSubdiv[Index].RGBWidth[j];
+	}
+	NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] =
+	    NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] +
+	    NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] -
+	    MinColor;
+	NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] = MinColor;
+
+	NewColorSubdiv[Index].RGBWidth[SortRGBAxis] =
+	    MaxColor - NewColorSubdiv[Index].RGBMin[SortRGBAxis];
+
+	(*NewColorMapSize)++;
+    }
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+* Routine called by qsort to compare to entries.			      *
+******************************************************************************/
+static int SortCmpRtn(const VoidPtr Entry1, const VoidPtr Entry2)
+{
+    return (* ((QuantizedColorType **) Entry1)) -> RGB[SortRGBAxis] -
+	   (* ((QuantizedColorType **) Entry2)) -> RGB[SortRGBAxis];
+}
+
+#define GIF87_STAMP	"GIF87a"         /* First chars in file - GIF stamp. */
+#define GIF89_STAMP	"GIF89a"         /* First chars in file - GIF stamp. */
+
+/* Masks given codes to BitsPerPixel, to make sure all codes are in range: */
+static GifPixelType CodeMask[] = {
+    0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff
+};
+
+static char *GifVersionPrefix = GIF87_STAMP;
+
+#define WRITE(_gif,_buf,_len)   \
+   fwrite(_buf, 1, _len, ((GifFilePrivateType*)_gif->Private)->File)
+
+static int EGifPutWord(int Word, GifFileType *GifFile);
+static int EGifSetupCompress(GifFileType *GifFile);
+static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line,
+								int LineLen);
+static int EGifCompressOutput(GifFileType *GifFile, int Code);
+static int EGifBufferedOutput(GifFileType *GifFile, GifByteType *Buf, int c);
+
+/******************************************************************************
+*   Update a new gif file, given its file handle, which must be opened for    *
+* write in binary mode.							      *
+*   Returns GifFileType pointer dynamically allocated which serves as the gif *
+* info record. _GifError is cleared if succesfull.			      *
+******************************************************************************/
+GifFileType *EGifOpenFileHandle(FILE *f, int FileHandle)
+{
+    GifFileType *GifFile;
+    GifFilePrivateType *Private;
+
+    if ((GifFile = (GifFileType *) malloc(sizeof(GifFileType))) == NULL) {
+        _GifError = E_GIF_ERR_NOT_ENOUGH_MEM;
+        return NULL;
+    }
+
+    memset(GifFile, '\0', sizeof(GifFileType));
+
+    if ((Private = (GifFilePrivateType *)
+                   malloc(sizeof(GifFilePrivateType))) == NULL) {
+        free(GifFile);
+        _GifError = E_GIF_ERR_NOT_ENOUGH_MEM;
+        return NULL;
+    }
+    if ((Private->HashTable = _InitHashTable()) == NULL) {
+        free(GifFile);
+        free(Private);
+        _GifError = E_GIF_ERR_NOT_ENOUGH_MEM;
+        return NULL;
+    }
+
+    GifFile->Private = (VoidPtr) Private;
+    Private->FileHandle = FileHandle;
+    Private->File = f;
+    Private->FileState = FILE_STATE_WRITE;
+    
+    _GifError = 0;
+
+    return GifFile;
+}
+
+/******************************************************************************
+*   Routine to set current GIF version. All files open for write will be      *
+* using this version until next call to this routine. Version consists of     *
+* 3 characters as "87a" or "89a". No test is made to validate the version.    *
+******************************************************************************/
+void EGifSetGifVersion(char *Version)
+{
+    strncpy(&GifVersionPrefix[3], Version, 3);
+}
+
+/******************************************************************************
+*   This routine should be called before any other EGif calls, immediately    *
+* follows the GIF file openning.					      *
+******************************************************************************/
+int EGifPutScreenDesc(GifFileType *GifFile,
+	int Width, int Height, int ColorRes, int BackGround,
+	ColorMapObject *ColorMap)
+{
+    int i;
+    GifByteType Buf[3];
+    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
+
+    if (Private->FileState & FILE_STATE_SCREEN) {
+	/* If already has screen descriptor - something is wrong! */
+	_GifError = E_GIF_ERR_HAS_SCRN_DSCR;
+	return GIF_ERROR;
+    }
+    if (!IS_WRITEABLE(Private)) {
+	/* This file was NOT open for writing: */
+	_GifError = E_GIF_ERR_NOT_WRITEABLE;
+	return GIF_ERROR;
+    }
+
+    /* First write the version prefix into the file. */
+    if (WRITE(GifFile, GifVersionPrefix, strlen(GifVersionPrefix)) != strlen(GifVersionPrefix)) {
+	_GifError = E_GIF_ERR_WRITE_FAILED;
+	return GIF_ERROR;
+    }
+
+    GifFile->SWidth = Width;
+    GifFile->SHeight = Height;
+    GifFile->SColorResolution = ColorRes;
+    GifFile->SBackGroundColor = BackGround;
+    if(ColorMap)
+      GifFile->SColorMap=MakeMapObject(ColorMap->ColorCount,ColorMap->Colors);
+    else
+      GifFile->SColorMap=NULL;
+
+    /* Put the screen descriptor into the file: */
+    EGifPutWord(Width, GifFile);
+    EGifPutWord(Height, GifFile);
+    Buf[0] = (ColorMap ? 0x80 : 0x00) |
+	     ((ColorRes - 1) << 4) |
+	     (ColorMap->BitsPerPixel - 1);
+    Buf[1] = BackGround;
+    Buf[2] = 0;
+    WRITE(GifFile, Buf, 3);
+
+    /* If we have Global color map - dump it also: */
+    if (ColorMap != NULL)
+	for (i = 0; i < ColorMap->ColorCount; i++) {
+	    /* Put the ColorMap out also: */
+	    Buf[0] = ColorMap->Colors[i].Red;
+	    Buf[1] = ColorMap->Colors[i].Green;
+	    Buf[2] = ColorMap->Colors[i].Blue;
+	    if (WRITE(GifFile, Buf, 3) != 3) {
+	        _GifError = E_GIF_ERR_WRITE_FAILED;
+		return GIF_ERROR;
+	    }
+	}
+
+    /* Mark this file as has screen descriptor, and no pixel written yet: */
+    Private->FileState |= FILE_STATE_SCREEN;
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+*   This routine should be called before any attemp to dump an image - any    *
+* call to any of the pixel dump routines.				      *
+******************************************************************************/
+int EGifPutImageDesc(GifFileType *GifFile,
+	int Left, int Top, int Width, int Height, int Interlace,
+	ColorMapObject *ColorMap)
+{
+    int i;
+    GifByteType Buf[3];
+    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
+
+    if (Private->FileState & FILE_STATE_IMAGE &&
+#if defined(__GNUC__)
+	Private->PixelCount > 0xffff0000UL) {
+#else
+	Private->PixelCount > 0xffff0000) {
+#endif
+	/* If already has active image descriptor - something is wrong! */
+	_GifError = E_GIF_ERR_HAS_IMAG_DSCR;
+	return GIF_ERROR;
+    }
+    if (!IS_WRITEABLE(Private)) {
+	/* This file was NOT open for writing: */
+	_GifError = E_GIF_ERR_NOT_WRITEABLE;
+	return GIF_ERROR;
+    }
+    GifFile->Image.Left = Left;
+    GifFile->Image.Top = Top;
+    GifFile->Image.Width = Width;
+    GifFile->Image.Height = Height;
+    GifFile->Image.Interlace = Interlace;
+    if(ColorMap)
+      GifFile->Image.ColorMap =MakeMapObject(ColorMap->ColorCount,ColorMap->Colors);
+    else
+      GifFile->Image.ColorMap = NULL;
+
+    /* Put the image descriptor into the file: */
+    Buf[0] = ',';			       /* Image seperator character. */
+    WRITE(GifFile, Buf, 1);
+    EGifPutWord(Left, GifFile);
+    EGifPutWord(Top, GifFile);
+    EGifPutWord(Width, GifFile);
+    EGifPutWord(Height, GifFile);
+    Buf[0] = (ColorMap ? 0x80 : 0x00) |
+	  (Interlace ? 0x40 : 0x00) |
+	  (ColorMap ? ColorMap->BitsPerPixel - 1 : 0);
+    WRITE(GifFile, Buf, 1);
+
+    /* If we have Global color map - dump it also: */
+    if (ColorMap != NULL)
+	for (i = 0; i < ColorMap->ColorCount; i++) {
+	    /* Put the ColorMap out also: */
+	    Buf[0] = ColorMap->Colors[i].Red;
+	    Buf[1] = ColorMap->Colors[i].Green;
+	    Buf[2] = ColorMap->Colors[i].Blue;
+	    if (WRITE(GifFile, Buf, 3) != 3) {
+	        _GifError = E_GIF_ERR_WRITE_FAILED;
+		return GIF_ERROR;
+	    }
+	}
+    if (GifFile->SColorMap == NULL && GifFile->Image.ColorMap == NULL)
+    {
+	_GifError = E_GIF_ERR_NO_COLOR_MAP;
+	return GIF_ERROR;
+    }
+
+    /* Mark this file as has screen descriptor: */
+    Private->FileState |= FILE_STATE_IMAGE;
+    Private->PixelCount = (long) Width * (long) Height;
+
+    EGifSetupCompress(GifFile);      /* Reset compress algorithm parameters. */
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+*  Put one full scanned line (Line) of length LineLen into GIF file.	      *
+******************************************************************************/
+int EGifPutLine(GifFileType *GifFile, GifPixelType *Line, int LineLen)
+{
+    int i;
+    GifPixelType Mask;
+    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
+
+    if (!IS_WRITEABLE(Private)) {
+	/* This file was NOT open for writing: */
+	_GifError = E_GIF_ERR_NOT_WRITEABLE;
+	return GIF_ERROR;
+    }
+
+    if (!LineLen)
+      LineLen = GifFile->Image.Width;
+    if (Private->PixelCount < (unsigned)LineLen) {
+	_GifError = E_GIF_ERR_DATA_TOO_BIG;
+	return GIF_ERROR;
+    }
+    Private->PixelCount -= LineLen;
+
+    /* Make sure the codes are not out of bit range, as we might generate    */
+    /* wrong code (because of overflow when we combine them) in this case:   */
+    Mask = CodeMask[Private->BitsPerPixel];
+    for (i = 0; i < LineLen; i++) Line[i] &= Mask;
+
+    return EGifCompressLine(GifFile, Line, LineLen);
+}
+
+/******************************************************************************
+*   This routine should be called last, to close GIF file.		      *
+******************************************************************************/
+int EGifCloseFile(GifFileType *GifFile)
+{
+    GifByteType Buf;
+    GifFilePrivateType *Private;
+
+    if (GifFile == NULL) return GIF_ERROR;
+
+    Private = (GifFilePrivateType *) GifFile->Private;
+    if (!IS_WRITEABLE(Private)) {
+	/* This file was NOT open for writing: */
+	_GifError = E_GIF_ERR_NOT_WRITEABLE;
+	return GIF_ERROR;
+    }
+
+    Buf = ';';
+    WRITE(GifFile, &Buf, 1);
+
+    if (GifFile->Image.ColorMap)
+	FreeMapObject(GifFile->Image.ColorMap);
+    if (GifFile->SColorMap)
+	FreeMapObject(GifFile->SColorMap);
+    if (Private) {
+        if (Private->HashTable) free((char *) Private->HashTable);
+	    free((char *) Private);
+    }
+    free(GifFile);
+    return GIF_OK;
+}
+
+/******************************************************************************
+*   Put 2 bytes (word) into the given file:				      *
+******************************************************************************/
+static int EGifPutWord(int Word, GifFileType *GifFile)
+{
+    char c[2];
+
+    c[0] = Word & 0xff;
+    c[1] = (Word >> 8) & 0xff;
+    if (WRITE(GifFile, c, 2) == 2)
+	return GIF_OK;
+    else
+	return GIF_ERROR;
+}
+
+/******************************************************************************
+*   Setup the LZ compression for this image:				      *
+******************************************************************************/
+static int EGifSetupCompress(GifFileType *GifFile)
+{
+    int BitsPerPixel;
+    GifByteType Buf;
+    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
+
+    /* Test and see what color map to use, and from it # bits per pixel: */
+    if (GifFile->Image.ColorMap)
+	BitsPerPixel = GifFile->Image.ColorMap->BitsPerPixel;
+    else if (GifFile->SColorMap)
+	BitsPerPixel = GifFile->SColorMap->BitsPerPixel;
+    else {
+	_GifError = E_GIF_ERR_NO_COLOR_MAP;
+	return GIF_ERROR;
+    }
+
+    Buf = BitsPerPixel = (BitsPerPixel < 2 ? 2 : BitsPerPixel);
+    WRITE(GifFile, &Buf, 1);     /* Write the Code size to file. */
+
+    Private->Buf[0] = 0;			  /* Nothing was output yet. */
+    Private->BitsPerPixel = BitsPerPixel;
+    Private->ClearCode = (1 << BitsPerPixel);
+    Private->EOFCode = Private->ClearCode + 1;
+    Private->RunningCode = Private->EOFCode + 1;
+    Private->RunningBits = BitsPerPixel + 1;	 /* Number of bits per code. */
+    Private->MaxCode1 = 1 << Private->RunningBits;	   /* Max. code + 1. */
+    Private->CrntCode = FIRST_CODE;	   /* Signal that this is first one! */
+    Private->CrntShiftState = 0;      /* No information in CrntShiftDWord. */
+    Private->CrntShiftDWord = 0;
+
+   /* Clear hash table and send Clear to make sure the decoder do the same. */
+    _ClearHashTable(Private->HashTable);
+
+    if (EGifCompressOutput(GifFile, Private->ClearCode) == GIF_ERROR) {
+	_GifError = E_GIF_ERR_DISK_IS_FULL;
+	return GIF_ERROR;
+    }
+    return GIF_OK;
+}
+
+/******************************************************************************
+*   The LZ compression routine:						      *
+*   This version compress the given buffer Line of length LineLen.	      *
+*   This routine can be called few times (one per scan line, for example), in *
+* order the complete the whole image.					      *
+******************************************************************************/
+static int EGifCompressLine(GifFileType *GifFile, GifPixelType *Line,
+								int LineLen)
+{
+    int i = 0, CrntCode, NewCode;
+    unsigned long NewKey;
+    GifPixelType Pixel;
+    GifHashTableType *HashTable;
+    GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private;
+
+    HashTable = Private->HashTable;
+
+    if (Private->CrntCode == FIRST_CODE)		  /* Its first time! */
+	CrntCode = Line[i++];
+    else
+        CrntCode = Private->CrntCode;     /* Get last code in compression. */
+
+    while (i < LineLen) {			    /* Decode LineLen items. */
+	Pixel = Line[i++];		      /* Get next pixel from stream. */
+       /* Form a new unique key to search hash table for the code combines  */
+       /* CrntCode as Prefix string with Pixel as postfix char.             */
+       NewKey = (((unsigned long) CrntCode) << 8) + Pixel;
+       if ((NewCode = _ExistsHashTable(HashTable, NewKey)) >= 0) {
+           /* This Key is already there, or the string is old one, so       */
+           /* simple take new code as our CrntCode:                         */
+           CrntCode = NewCode;
+       }
+       else {
+           /* Put it in hash table, output the prefix code, and make our    */
+           /* CrntCode equal to Pixel.                                      */
+           if (EGifCompressOutput(GifFile, CrntCode)
+               == GIF_ERROR) {
+               _GifError = E_GIF_ERR_DISK_IS_FULL;
+               return GIF_ERROR;
+           }
+           CrntCode = Pixel;
+
+           /* If however the HashTable if full, we send a clear first and   */
+           /* Clear the hash table.                                         */
+           if (Private->RunningCode >= LZ_MAX_CODE) {
+               /* Time to do some clearance: */
+               if (EGifCompressOutput(GifFile, Private->ClearCode)
+                   == GIF_ERROR) {
+                   _GifError = E_GIF_ERR_DISK_IS_FULL;
+                   return GIF_ERROR;
+               }
+               Private->RunningCode = Private->EOFCode + 1;
+               Private->RunningBits = Private->BitsPerPixel + 1;
+               Private->MaxCode1 = 1 << Private->RunningBits;
+               _ClearHashTable(HashTable);
+           }
+           else {
+               /* Put this unique key with its relative Code in hash table: */
+               _InsertHashTable(HashTable, NewKey, Private->RunningCode++);
+           }
+       }
+
+    }
+
+    /* Preserve the current state of the compression algorithm: */
+    Private->CrntCode = CrntCode;
+
+    if (Private->PixelCount == 0)
+    {
+	/* We are done - output last Code and flush output buffers: */
+	if (EGifCompressOutput(GifFile, CrntCode)
+	    == GIF_ERROR) {
+	    _GifError = E_GIF_ERR_DISK_IS_FULL;
+	    return GIF_ERROR;
+	}
+	if (EGifCompressOutput(GifFile, Private->EOFCode)
+	    == GIF_ERROR) {
+	    _GifError = E_GIF_ERR_DISK_IS_FULL;
+	    return GIF_ERROR;
+	}
+	if (EGifCompressOutput(GifFile, FLUSH_OUTPUT) == GIF_ERROR) {
+	    _GifError = E_GIF_ERR_DISK_IS_FULL;
+	    return GIF_ERROR;
+	}
+    }
+
+    return GIF_OK;
+}
+
+/******************************************************************************
+*   The LZ compression output routine:                                        *
+*   This routine is responsible for the compression of the bit stream into    *
+*   8 bits (bytes) packets.                                                   *
+*   Returns GIF_OK if written succesfully.                                    *
+******************************************************************************/
+static int EGifCompressOutput(GifFileType *GifFile, int Code)
+{
+    GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
+    int retval = GIF_OK;
+
+    if (Code == FLUSH_OUTPUT) {
+	while (Private->CrntShiftState > 0) {
+	    /* Get Rid of what is left in DWord, and flush it. */
+	    if (EGifBufferedOutput(GifFile, Private->Buf,
+		Private->CrntShiftDWord & 0xff) == GIF_ERROR)
+		    retval = GIF_ERROR;
+	    Private->CrntShiftDWord >>= 8;
+	    Private->CrntShiftState -= 8;
+	}
+	Private->CrntShiftState = 0;			   /* For next time. */
+	if (EGifBufferedOutput(GifFile, Private->Buf,
+	    FLUSH_OUTPUT) == GIF_ERROR)
+    	        retval = GIF_ERROR;
+    }
+    else {
+	Private->CrntShiftDWord |= ((long) Code) << Private->CrntShiftState;
+	Private->CrntShiftState += Private->RunningBits;
+	while (Private->CrntShiftState >= 8) {
+	    /* Dump out full bytes: */
+	    if (EGifBufferedOutput(GifFile, Private->Buf,
+		Private->CrntShiftDWord & 0xff) == GIF_ERROR)
+		    retval = GIF_ERROR;
+	    Private->CrntShiftDWord >>= 8;
+	    Private->CrntShiftState -= 8;
+	}
+    }
+
+    /* If code cannt fit into RunningBits bits, must raise its size. Note */
+    /* however that codes above 4095 are used for special signaling.      */
+    if (Private->RunningCode >= Private->MaxCode1 && Code <= 4095) {
+       Private->MaxCode1 = 1 << ++Private->RunningBits;
+    }
+
+    return retval;
+}
+
+/******************************************************************************
+*   This routines buffers the given characters until 255 characters are ready *
+* to be output. If Code is equal to -1 the buffer is flushed (EOF).	      *
+*   The buffer is Dumped with first byte as its size, as GIF format requires. *
+*   Returns GIF_OK if written succesfully.				      *
+******************************************************************************/
+static int EGifBufferedOutput(GifFileType *GifFile, GifByteType *Buf, int c)
+{
+    if (c == FLUSH_OUTPUT) {
+	/* Flush everything out. */
+	if (Buf[0] != 0 && WRITE(GifFile, Buf, Buf[0]+1) != (unsigned)(Buf[0] + 1))
+	{
+	    _GifError = E_GIF_ERR_WRITE_FAILED;
+	    return GIF_ERROR;
+	}
+	/* Mark end of compressed data, by an empty block (see GIF doc): */
+	Buf[0] = 0;
+	if (WRITE(GifFile, Buf, 1) != 1)
+	{
+	    _GifError = E_GIF_ERR_WRITE_FAILED;
+	    return GIF_ERROR;
+	}
+    }
+    else {
+	if (Buf[0] == 255) {
+	    /* Dump out this buffer - it is full: */
+	    if (WRITE(GifFile, Buf, Buf[0] + 1) != (unsigned)(Buf[0] + 1))
+	    {
+		_GifError = E_GIF_ERR_WRITE_FAILED;
+		return GIF_ERROR;
+	    }
+	    Buf[0] = 0;
+	}
+	Buf[++Buf[0]] = c;
+    }
+
+    return GIF_OK;
+}
+
+static void QuitGifError(GifFileType *GifFile)
+{
+  PrintGifError();
+  if (GifFile != NULL) EGifCloseFile(GifFile);
+}
+
+static void SaveGif(FILE *fp,
+		    GifByteType *OutputBuffer,
+		    ColorMapObject *OutputColorMap,
+		    int ExpColorMapSize, int Width, int Height){
+  int i;
+  GifFileType *GifFile;
+  GifByteType *Ptr;
+
+  if ((GifFile = EGifOpenFileHandle(fp, 1)) == NULL){
+    QuitGifError(GifFile);
+    return;
+  }
+
+  if (EGifPutScreenDesc(GifFile, Width, Height, ExpColorMapSize, 0, OutputColorMap) == GIF_ERROR){
+    QuitGifError(GifFile);
+    return;
+  }
+
+  if (EGifPutImageDesc(GifFile, 0, 0, Width, Height, FALSE, NULL) == GIF_ERROR){
+    QuitGifError(GifFile);
+    return;
+  }
+
+  Ptr = &OutputBuffer[(Height-1)*Width] ;
+  for (i = 0; i < Height; i++) {
+    if (EGifPutLine(GifFile, Ptr, Width) == GIF_ERROR){
+      QuitGifError(GifFile);
+      return;
+    }
+    Ptr -= Width;
+  }
+
+  if (EGifCloseFile(GifFile) == GIF_ERROR)
+    QuitGifError(GifFile);
+}
+
+void create_gif(FILE *fp, int width, int height){
+  GifByteType *RedBuffer, *GreenBuffer, *BlueBuffer, *OutputBuffer = NULL;
+  ColorMapObject *OutputColorMap = NULL;
+
+  _GifError = 0;
+  ExpNumOfColors = 8;
+  ColorMapSize = 256;
+  
+  RedBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char));
+  GreenBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char));
+  BlueBuffer = (unsigned char *)malloc(height*width*sizeof(unsigned char));
+
+  if(!RedBuffer || !GreenBuffer || !BlueBuffer){
+    fprintf(stderr, "Error: Failed to allocate memory for RGB Buffers\n");
+    return;
+  }
+
+  glReadPixels(0,0,width,height,GL_RED,GL_UNSIGNED_BYTE,RedBuffer);
+  glReadPixels(0,0,width,height,GL_GREEN,GL_UNSIGNED_BYTE,GreenBuffer);
+  glReadPixels(0,0,width,height,GL_BLUE,GL_UNSIGNED_BYTE,BlueBuffer);
+  
+  if (!(OutputColorMap = MakeMapObject(ColorMapSize, NULL))){
+    fprintf(stderr, "Warning: Failed to allocate memory for ColorMap\n");
+    return;
+  }
+
+  if(!(OutputBuffer = (GifByteType *) malloc(width * height * sizeof(GifByteType)))){
+    fprintf(stderr, "Error: Failed to allocate memory for Output Buffer\n");
+    return;
+  }
+
+  if (QuantizeBuffer(width, height, &ColorMapSize,
+		     RedBuffer, GreenBuffer, BlueBuffer,
+		     OutputBuffer, OutputColorMap->Colors) == GIF_ERROR)
+    fprintf(stderr, "Warning: Quantize Buffer Failed\n");
+
+  free(RedBuffer);
+  free(GreenBuffer);
+  free(BlueBuffer);
+  
+  SaveGif(fp, OutputBuffer, OutputColorMap, ExpNumOfColors, width, height);
+}
+
diff --git a/Graphics/gl2gif.h b/Graphics/gl2gif.h
new file mode 100644
index 0000000000000000000000000000000000000000..e848560192dcaee3be78b54930cb3d72d2d21ddf
--- /dev/null
+++ b/Graphics/gl2gif.h
@@ -0,0 +1,150 @@
+#ifndef _GL2GIF_H_
+#define _GL2GIF_H_
+
+#define	GIF_ERROR	0
+#define GIF_OK		1
+
+#ifndef TRUE
+#define TRUE		1
+#define FALSE		0
+#endif
+
+#define VoidPtr void *
+
+typedef	unsigned char	GifPixelType;
+typedef unsigned char	GifByteType;
+
+typedef struct GifColorType {
+  GifByteType Red, Green, Blue;
+} GifColorType;
+
+typedef struct ColorMapObject{
+  int	ColorCount;
+  int BitsPerPixel;
+  GifColorType *Colors;	 /* on malloc(3) heap */
+} ColorMapObject;
+
+typedef struct GifImageDesc {
+  int Left, Top, Width, Height ; /* Current image dimensions. */
+  int Interlace;		 /* Sequential/Interlaced lines. */
+  ColorMapObject *ColorMap;	 /* The local color map */
+} GifImageDesc;
+
+typedef struct GifFileType {
+  int SWidth, SHeight;		  /* Screen dimensions. */
+  int SColorResolution; 	  /* How many colors can we generate? */
+  int SBackGroundColor;		  /* I hope you understand this one... */
+  ColorMapObject *SColorMap;	  /* NULL if not exists. */
+  int ImageCount;		  /* Number of current image */
+  GifImageDesc Image;		  /* Block describing current image */
+  VoidPtr Private;	  	  /* Don't mess with this! */
+} GifFileType;
+
+typedef enum {
+  UNDEFINED_RECORD_TYPE,
+  SCREEN_DESC_RECORD_TYPE,
+  IMAGE_DESC_RECORD_TYPE,	/* Begin with ',' */
+  TERMINATE_RECORD_TYPE		/* Begin with ';' */
+} GifRecordType;
+
+#define HT_SIZE			8192	   /* 12bits = 4096 or twice as big! */
+#define HT_KEY_MASK		0x1FFF			      /* 13bits keys */
+#define HT_KEY_NUM_BITS		13			      /* 13bits keys */
+#define HT_MAX_KEY		8191	/* 13bits - 1, maximal code possible */
+#define HT_MAX_CODE		4095	/* Biggest code possible in 12 bits. */
+
+/* The 32 bits of the long are divided into two parts for the key & code:   */
+/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */
+/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits.	    */
+#define HT_GET_KEY(l)	(l >> 12)
+#define HT_GET_CODE(l)	(l & 0x0FFF)
+#define HT_PUT_KEY(l)	(l << 12)
+#define HT_PUT_CODE(l)	(l & 0x0FFF)
+
+typedef struct GifHashTableType {
+  unsigned long HTable[HT_SIZE];
+} GifHashTableType;
+
+#define LZ_MAX_CODE	4095		/* Biggest code possible in 12 bits. */
+#define LZ_BITS		12
+
+#define FLUSH_OUTPUT		4096    /* Impossible code, to signal flush. */
+#define FIRST_CODE		4097    /* Impossible code, to signal first. */
+#define NO_SUCH_CODE		4098    /* Impossible code, to signal empty. */
+
+#define FILE_STATE_WRITE    0x01
+#define FILE_STATE_SCREEN   0x02
+#define FILE_STATE_IMAGE    0x04
+#define FILE_STATE_READ     0x08
+
+#define IS_READABLE(Private)    (Private->FileState & FILE_STATE_READ)
+#define IS_WRITEABLE(Private)   (Private->FileState & FILE_STATE_WRITE)
+
+typedef struct GifFilePrivateType {
+  int FileState;
+  int   FileHandle;			     /* Where all this data goes to! */
+  int   BitsPerPixel;	    /* Bits per pixel (Codes uses at least this + 1). */
+  int   ClearCode;				       /* The CLEAR LZ code. */
+  int   EOFCode;				         /* The EOF LZ code. */
+  int   RunningCode;		    /* The next code algorithm can generate. */
+  int   RunningBits;/* The number of bits required to represent RunningCode. */
+  int   MaxCode1;  /* 1 bigger than max. possible code, in RunningBits bits. */
+  int   LastCode;		        /* The code before the current code. */
+  int   CrntCode;				  /* Current algorithm code. */
+  int   StackPtr;		         /* For character stack (see below). */
+  int   CrntShiftState;		        /* Number of bits in CrntShiftDWord. */
+  unsigned long CrntShiftDWord;     /* For bytes decomposition into codes. */
+  unsigned long PixelCount;		       /* Number of pixels in image. */
+  FILE *File;						  /* File as stream. */
+  GifByteType Buf[256];	       /* Compressed input is buffered here. */
+  GifByteType Stack[LZ_MAX_CODE];	 /* Decoded pixels are stacked here. */
+  GifByteType Suffix[LZ_MAX_CODE+1];	       /* So we can trace the codes. */
+  int Prefix[LZ_MAX_CODE+1];
+  GifHashTableType *HashTable;
+} GifFilePrivateType;
+
+
+#define	E_GIF_ERR_OPEN_FAILED	1		/* And EGif possible errors. */
+#define	E_GIF_ERR_WRITE_FAILED	2
+#define E_GIF_ERR_HAS_SCRN_DSCR	3
+#define E_GIF_ERR_HAS_IMAG_DSCR	4
+#define E_GIF_ERR_NO_COLOR_MAP	5
+#define E_GIF_ERR_DATA_TOO_BIG	6
+#define E_GIF_ERR_NOT_ENOUGH_MEM 7
+#define E_GIF_ERR_DISK_IS_FULL	8
+#define E_GIF_ERR_CLOSE_FAILED	9
+#define E_GIF_ERR_NOT_WRITEABLE	10
+
+/* Provate functions */
+
+GifHashTableType *_InitHashTable(void);
+void _ClearHashTable(GifHashTableType *HashTable);
+void _InsertHashTable(GifHashTableType *HashTable, unsigned long Key, int Code);
+int _ExistsHashTable(GifHashTableType *HashTable, unsigned long Key);
+
+GifFileType *EGifOpenFileHandle(int GifFileHandle);
+void EGifSetGifVersion(char *Version);
+int EGifPutScreenDesc(GifFileType *GifFile,
+		      int GifWidth, int GifHeight, int GifColorRes, int GifBackGround,
+		      ColorMapObject *GifColorMap);
+int EGifPutImageDesc(GifFileType *GifFile,
+		     int GifLeft, int GifTop, int Width, int GifHeight, int GifInterlace,
+		     ColorMapObject *GifColorMap);
+int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
+int EGifCloseFile(GifFileType *GifFile);
+
+int QuantizeBuffer(int Width, int Height, int *ColorMapSize,
+		   GifByteType *RedInput, GifByteType *GreenInput, GifByteType *BlueInput,
+		   GifByteType *OutputBuffer, GifColorType *OutputColorMap);
+
+extern void PrintGifError(void);
+extern int GifLastError(void);
+extern ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap);
+extern void FreeMapObject(ColorMapObject *Object);
+extern int BitSize(int n);
+
+/* Public functions */
+
+void create_gif(FILE *fp, int width, int height);
+
+#endif
diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7383d1f2941ee77e67f949d674b25745c66cd7ab
--- /dev/null
+++ b/Graphics/gl2ps.cpp
@@ -0,0 +1,1355 @@
+/*
+ * GL2PS, an OpenGL to Postscript Printing Library, version 0.31
+ * Copyright (C) 1999-2000  Christophe Geuzaine 
+ *
+ * Last Mod by Christophe on Mon Aug 14 23:49:15 2000
+ *
+ * E-mail: Christophe.Geuzaine@AdValvas.be
+ * URL: http://www.geuz.org/gl2ps/
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <string.h>
+#include <sys/types.h>
+#include <malloc.h>
+#include <math.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include "gl2ps.h"
+
+static GL2PScontext gl2ps;
+
+GLvoid gl2psMsg(GLint level, char *fmt, ...){
+  va_list args;
+
+  if(!(gl2ps.options & GL2PS_SILENT)){
+    switch(level){
+    case GL2PS_INFO : fprintf(stderr, "GL2PS info: "); break;
+    case GL2PS_WARNING : fprintf(stderr, "GL2PS warning: "); break;
+    case GL2PS_ERROR : fprintf(stderr, "GL2PS error: "); break;
+    }
+    va_start(args, fmt);
+    vfprintf(stderr, fmt, args); 
+    va_end (args);
+    fprintf(stderr, "\n");
+  }
+  if(level == GL2PS_ERROR) exit(1);
+}
+
+GLvoid *gl2psMalloc(size_t size){
+  GLvoid *ptr;
+
+  if(!size) return(NULL);
+  ptr = malloc(size);
+  if(!ptr) gl2psMsg(GL2PS_ERROR, "Couldn't Allocate Requested Memory");
+  return(ptr);
+}
+
+GLvoid *gl2psRealloc(GLvoid *ptr, size_t size){
+  if(!size) return(NULL);
+  ptr = realloc(ptr, size);
+  if(!ptr) gl2psMsg(GL2PS_ERROR, "Couldn't Reallocate Requested Memory");
+  return(ptr);
+}
+
+GLvoid gl2psFree(GLvoid *ptr){
+  if(!ptr) return;
+  free(ptr);
+}
+
+GLvoid gl2psListRealloc(GL2PSlist *list, GLint n){
+  if(n <= 0) return;
+  if(!list->array){
+    list->nmax = ((n - 1) / list->incr + 1) * list->incr;
+    list->array = (char *)gl2psMalloc(list->nmax * list->size);
+  }
+  else
+    if(n > list->nmax){
+      list->nmax = ((n - 1) / list->incr + 1) * list->incr;
+      list->array = (char *)gl2psRealloc(list->array,
+					 list->nmax * list->size);
+    }
+}
+
+GL2PSlist *gl2psListCreate(GLint n, GLint incr, GLint size){
+  GL2PSlist *list;
+
+  if(n < 0) n = 0;
+  if(incr <= 0) incr = 1;
+  list = (GL2PSlist *)gl2psMalloc(sizeof(GL2PSlist));
+  list->nmax = 0;
+  list->incr = incr;
+  list->size = size;
+  list->n = 0;
+  list->array = NULL;
+  gl2psListRealloc(list, n);
+  return(list);
+}
+
+GLvoid gl2psListDelete(GL2PSlist *list){
+  gl2psFree(list->array);
+  gl2psFree(list);
+}
+
+GLvoid gl2psListAdd(GL2PSlist *list, GLvoid *data){
+  list->n++;
+  gl2psListRealloc(list, list->n);
+  memcpy(&list->array[(list->n - 1) * list->size], data, list->size);
+}
+
+GLint gl2psListNbr(GL2PSlist *list){
+  return(list->n);
+}
+
+GLvoid *gl2psListPointer(GL2PSlist *list, GLint index){
+  if((index < 0) || (index >= list->n))
+    gl2psMsg(GL2PS_ERROR, "Wrong List Index in gl2psListPointer");
+  return(&list->array[index * list->size]);
+}
+
+GLvoid gl2psListSort(GL2PSlist *list,
+		     GLint (*fcmp)(const GLvoid *a, const GLvoid *b)){
+  qsort(list->array, list->n, list->size, fcmp);
+}
+
+GLvoid gl2psListAction(GL2PSlist *list, 
+		       GLvoid (*action)(GLvoid *data, GLvoid *dummy)){
+  GLint i, dummy;
+
+  for(i=0 ; i<gl2psListNbr(list) ; i++)
+    (*action)(gl2psListPointer(list, i), &dummy);
+}
+
+GLvoid gl2psListActionInverse(GL2PSlist *list, 
+			      GLvoid (*action)(GLvoid *data, GLvoid *dummy)){
+  GLint i, dummy;
+
+  for(i=gl2psListNbr(list) ; i>0 ; i--)
+    (*action)(gl2psListPointer(list, i-1), &dummy);
+}
+
+GLfloat gl2psComparePointPlane(GL2PSxyz point, GL2PSplane plane){
+  return(plane[0] * point[0] + 
+	 plane[1] * point[1] + 
+	 plane[2] * point[2] + 
+	 plane[3]);
+}
+
+GLfloat gl2psPsca(GLfloat *a, GLfloat *b){
+  return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2]);
+}
+
+GLvoid gl2psPvec(GLfloat *a, GLfloat *b, GLfloat *c){
+  c[0] = a[1]*b[2] - a[2]*b[1];
+  c[1] = a[2]*b[0] - a[0]*b[2];
+  c[2] = a[0]*b[1] - a[1]*b[0];
+}
+
+GLfloat gl2psNorm(GLfloat *a){
+  return sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]);
+}
+
+GLvoid gl2psGetNormal(GLfloat *a, GLfloat *b, GLfloat *c){
+  GLfloat norm;
+  gl2psPvec(a, b, c);
+  if((norm = gl2psNorm(c))){
+    c[0] = c[0] / norm;
+    c[1] = c[1] / norm;
+    c[2] = c[2] / norm;
+  }
+  else
+    gl2psMsg(GL2PS_WARNING, "Bad Plane in BSP Tree");
+}
+
+GLvoid gl2psGetPlane(GL2PSprimitive *prim, GL2PSplane plane){
+  GL2PSxyz v={0., 0., 0.}, w={0., 0., 0.};
+
+  switch(prim->type){
+  case GL2PS_TRIANGLE :
+  case GL2PS_QUADRANGLE :
+    v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; 
+    v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; 
+    v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; 
+    w[0] = prim->verts[2].xyz[0] - prim->verts[0].xyz[0]; 
+    w[1] = prim->verts[2].xyz[1] - prim->verts[0].xyz[1]; 
+    w[2] = prim->verts[2].xyz[2] - prim->verts[0].xyz[2]; 
+    if((!v[0] && !v[1] && !v[2]) || (!w[0] && !w[1] && !w[2])){
+      plane[0] = plane[1] = 0.;
+      plane[2] = 1.;
+      plane[3] = -prim->verts[0].xyz[2];
+    }
+    else{
+      gl2psGetNormal(v, w, plane);
+      plane[3] = 
+	- plane[0] * prim->verts[0].xyz[0] 
+	- plane[1] * prim->verts[0].xyz[1] 
+	- plane[2] * prim->verts[0].xyz[2];
+    }
+    break;
+  case GL2PS_LINE :
+    v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; 
+    v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; 
+    v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; 
+    if(!v[0] && !v[1] && !v[2]){
+      plane[0] = plane[1] = 0.;
+      plane[2] = 1.;
+      plane[3] = -prim->verts[0].xyz[2];
+    }
+    else{
+      if(!v[0])      w[0] = 1.;
+      else if(!v[1]) w[1] = 1.;
+      else           w[2] = 1.;
+      gl2psGetNormal(v, w, plane);
+      plane[3] = 
+	- plane[0] * prim->verts[0].xyz[0] 
+	- plane[1] * prim->verts[0].xyz[1] 
+	- plane[2] * prim->verts[0].xyz[2];
+    }
+    break;
+  case GL2PS_POINT :
+  case GL2PS_TEXT :
+    plane[0] = plane[1] = 0.;
+    plane[2] = 1.;
+    plane[3] = -prim->verts[0].xyz[2];
+    break;
+  default :
+    gl2psMsg(GL2PS_ERROR, "Unknown Primitive Type in BSP Tree");
+  }
+}
+
+GLvoid gl2psCutEdge(GL2PSvertex a, GL2PSvertex b, GL2PSplane plane, 
+		    GL2PSvertex *c){
+  GL2PSxyz v;
+  GLfloat  sect;
+
+  v[0] = b.xyz[0] - a.xyz[0];
+  v[1] = b.xyz[1] - a.xyz[1];
+  v[2] = b.xyz[2] - a.xyz[2];
+  sect = - gl2psComparePointPlane(a.xyz, plane) / gl2psPsca(plane, v);
+
+  c->xyz[0] = a.xyz[0] + v[0] * sect;
+  c->xyz[1] = a.xyz[1] + v[1] * sect;
+  c->xyz[2] = a.xyz[2] + v[2] * sect;
+  
+  c->rgba[0] = (1.-sect) * a.rgba[0] + sect * b.rgba[0];
+  c->rgba[1] = (1.-sect) * a.rgba[1] + sect * b.rgba[1];
+  c->rgba[2] = (1.-sect) * a.rgba[2] + sect * b.rgba[2];
+  c->rgba[3] = (1.-sect) * a.rgba[3] + sect * b.rgba[3];
+}
+
+GLvoid gl2psFreePrimitive(GLvoid *a, GLvoid *b){
+  GL2PSprimitive *q ;
+  
+  q = *(GL2PSprimitive**)a;
+  gl2psFree(q->verts);
+  if(q->type == GL2PS_TEXT){
+    if(q->text->str) gl2psFree(q->text->str);
+    gl2psFree(q->text);
+  }
+  gl2psFree(q);
+}
+
+GLvoid gl2psCreateSplittedPrimitive(GL2PSprimitive *parent, GL2PSplane plane,
+				    GL2PSprimitive **child, GLshort numverts,
+				    GLshort *index0, GLshort *index1){
+  GLshort i;
+
+  if(numverts > 4){
+    gl2psMsg(GL2PS_WARNING, "%d Vertices in Polygon", numverts);
+    numverts = 4;
+  }
+
+  switch(numverts){
+  case 1 : (*child)->type = GL2PS_POINT; break; 
+  case 2 : (*child)->type = GL2PS_LINE; break; 
+  case 3 : (*child)->type = GL2PS_TRIANGLE; break; 
+  case 4 : (*child)->type = GL2PS_QUADRANGLE; break;    
+  }
+  (*child)->boundary = 0; /* not done! */
+  (*child)->dash = parent->dash;
+  (*child)->numverts = numverts;
+  (*child)->verts = (GL2PSvertex *)gl2psMalloc(numverts * sizeof(GL2PSvertex));
+
+  for(i=0 ; i<numverts ; i++){
+    if(index1[i] < 0)
+      (*child)->verts[i] = parent->verts[index0[i]];
+    else
+      gl2psCutEdge(parent->verts[index0[i]], parent->verts[index1[i]], 
+		   plane, &(*child)->verts[i]);
+  }
+}
+
+GLvoid gl2psAddIndex(GLshort *index0, GLshort *index1, GLshort *nb, 
+		     GLshort i, GLshort j){
+  GLint k;
+
+  for(k=0 ; k<*nb ; k++)
+    if((index0[k] == i && index1[k] == j) ||
+       (index1[k] == i && index0[k] == j)) return;
+
+  index0[*nb] = i;
+  index1[*nb] = j;
+  (*nb)++;
+}
+
+GLshort gl2psGetIndex(GLshort i, GLshort num){
+  return(i < num-1) ? i+1 : 0;
+}
+
+GLint gl2psTestSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane){
+  GLint     type=GL2PS_COINCIDENT;
+  GLshort   i, j;
+  GLfloat   d[5]; 
+
+  for(i = 0 ; i < prim->numverts ; i++){  
+    d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane);
+  }
+
+  if(prim->type == GL2PS_POINT)
+    return 0;
+  else{
+    for(i = 0 ; i < prim->numverts ; i++){
+      j = gl2psGetIndex(i, prim->numverts);
+      if(d[j] > GL2PS_EPSILON){
+	if(type == GL2PS_COINCIDENT)      type = GL2PS_IN_BACK_OF;
+	else if(type != GL2PS_IN_BACK_OF) return 1; 
+	if(d[i] < -GL2PS_EPSILON)	  return 1;
+      }
+      else if(d[j] < -GL2PS_EPSILON){
+	if(type == GL2PS_COINCIDENT)       type = GL2PS_IN_FRONT_OF;   
+	else if(type != GL2PS_IN_FRONT_OF) return 1;
+	if(d[i] > GL2PS_EPSILON)           return 1;
+      }
+    }
+  }
+  return 0;
+}
+
+GLint gl2psSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane, 
+			  GL2PSprimitive **front, GL2PSprimitive **back){
+  GLshort  i, j, in=0, out=0, in0[5], in1[5], out0[5], out1[5];
+  GLint    type;
+  GLfloat  d[5]; 
+
+  type = GL2PS_COINCIDENT;
+
+  for(i = 0 ; i < prim->numverts ; i++){  
+    d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane);
+  }
+
+  switch(prim->type){
+  case GL2PS_POINT :
+    if(d[0] > GL2PS_EPSILON)       type = GL2PS_IN_BACK_OF;
+    else if(d[0] < -GL2PS_EPSILON) type = GL2PS_IN_FRONT_OF;
+    else                           type = GL2PS_COINCIDENT;
+    break;
+  default :
+    for(i = 0 ; i < prim->numverts ; i++){
+      j = gl2psGetIndex(i, prim->numverts);
+      if(d[j] > GL2PS_EPSILON){
+	if(type == GL2PS_COINCIDENT)      type = GL2PS_IN_BACK_OF;
+	else if(type != GL2PS_IN_BACK_OF) type = GL2PS_SPANNING; 
+	if(d[i] < -GL2PS_EPSILON){
+	  gl2psAddIndex(in0, in1, &in, i, j);
+	  gl2psAddIndex(out0, out1, &out, i, j);
+	  type = GL2PS_SPANNING;
+	}
+	gl2psAddIndex(out0, out1, &out, j, -1);
+      }
+      else if(d[j] < -GL2PS_EPSILON){
+	if(type == GL2PS_COINCIDENT)       type = GL2PS_IN_FRONT_OF;   
+	else if(type != GL2PS_IN_FRONT_OF) type = GL2PS_SPANNING;
+	if(d[i] > GL2PS_EPSILON){
+	  gl2psAddIndex(in0, in1, &in, i, j);
+	  gl2psAddIndex(out0, out1, &out, i, j);
+	  type = GL2PS_SPANNING;
+	}
+	gl2psAddIndex(in0, in1, &in, j, -1);
+      }
+      else{
+	gl2psAddIndex(in0, in1, &in, j, -1);
+	gl2psAddIndex(out0, out1, &out, j, -1);
+      }
+    }
+    break;
+  }
+
+  if(type == GL2PS_SPANNING){
+    *back = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+    *front = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+    gl2psCreateSplittedPrimitive(prim, plane, back, out, out0, out1);
+    gl2psCreateSplittedPrimitive(prim, plane, front, in, in0, in1);
+  }
+
+  return type;
+}
+
+GLvoid gl2psDivideQuad(GL2PSprimitive *quad, 
+		       GL2PSprimitive **t1, GL2PSprimitive **t2){
+  *t1 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+  *t2 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+  (*t1)->type = (*t2)->type = GL2PS_TRIANGLE;
+  (*t1)->numverts = (*t2)->numverts = 3;
+  (*t1)->depth = (*t2)->depth = quad->depth;
+  (*t1)->dash = (*t2)->dash = quad->dash;
+  (*t1)->verts = (GL2PSvertex *)gl2psMalloc(3 * sizeof(GL2PSvertex));
+  (*t2)->verts = (GL2PSvertex *)gl2psMalloc(3 * sizeof(GL2PSvertex));
+  (*t1)->verts[0] = quad->verts[0];
+  (*t1)->verts[1] = quad->verts[1];
+  (*t1)->verts[2] = quad->verts[2];
+  (*t1)->boundary = ((quad->boundary & 1) ? 1 : 0) | ((quad->boundary & 2) ? 2 : 0);
+  (*t2)->verts[0] = quad->verts[0];
+  (*t2)->verts[1] = quad->verts[2];
+  (*t2)->verts[2] = quad->verts[3];
+  (*t1)->boundary = ((quad->boundary & 4) ? 2 : 0) | ((quad->boundary & 4) ? 2 : 0);
+}
+
+int gl2psCompareDepth(const GLvoid *a, const GLvoid *b){
+  GL2PSprimitive *q,*w;
+  GLfloat        diff;
+
+  q = *(GL2PSprimitive**)a;
+  w = *(GL2PSprimitive**)b;
+  diff = q->depth - w->depth;
+  if(diff > 0.) 
+    return 1;
+  else if(diff < 0.)
+    return -1;
+  else
+    return 0;
+}
+
+GLint gl2psTrianglesFirst(const GLvoid *a, const GLvoid *b){
+  GL2PSprimitive *q,*w;
+
+  q = *(GL2PSprimitive**)a;
+  w = *(GL2PSprimitive**)b;
+  return(q->type < w->type ? 1 : -1);
+}
+
+GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root){
+  GLint          i, j, count, best=1000000, index=0;
+  GL2PSprimitive *prim1, *prim2;
+  GL2PSplane     plane;
+
+  if(gl2ps.options & GL2PS_BEST_ROOT){
+    *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0);
+    for(i=0 ; i<gl2psListNbr(primitives) ; i++){
+      prim1 = *(GL2PSprimitive**)gl2psListPointer(primitives, i);
+      gl2psGetPlane(prim1, plane);
+      count=0;
+      for(j=0 ; j<gl2psListNbr(primitives) ; j++){
+	if(j != i){
+	  prim2 = *(GL2PSprimitive**)gl2psListPointer(primitives, j);
+	  count += gl2psTestSplitPrimitive(prim2, plane); 
+	}
+	if(count > best) break;
+      }
+      if(count < best){
+	best = count;
+	index = i;
+	*root = prim1;
+	if(!count) return index;
+      }
+    }
+    if(index) printf("GL2PS_BEST_ROOT was worth it: %d\n", index);
+    return index;
+  }
+  else{
+    *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0);
+    return 0;
+  }
+}
+
+
+GLvoid gl2psAddPrimitiveInList(GL2PSprimitive *prim, GL2PSlist *list){
+  GL2PSprimitive *t1, *t2;
+
+  if(prim->type != GL2PS_QUADRANGLE){
+    gl2psListAdd(list, &prim);
+  }
+  else{
+    gl2psDivideQuad(prim, &t1, &t2);
+    gl2psListAdd(list, &t1);
+    gl2psListAdd(list, &t2);
+    gl2psFreePrimitive(&prim, NULL);
+  }
+  
+}
+
+GLvoid gl2psBuildBspTree(GL2PSbsptree *tree, GL2PSlist *primitives){
+  GL2PSprimitive *prim, *frontprim, *backprim;
+  GL2PSlist      *frontlist, *backlist;
+  GLint          i, index;
+
+  tree->front = NULL;
+  tree->back = NULL;
+  tree->primitives = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*));
+  index = gl2psFindRoot(primitives, &prim);
+  gl2psGetPlane(prim, tree->plane);
+  gl2psAddPrimitiveInList(prim, tree->primitives);
+
+  frontlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*));
+  backlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*));
+
+  for(i=0 ; i<gl2psListNbr(primitives) ; i++){
+    if(i != index){
+      prim = *(GL2PSprimitive**)gl2psListPointer(primitives,i);
+      switch(gl2psSplitPrimitive(prim,tree->plane,&frontprim,&backprim)){
+      case GL2PS_COINCIDENT:
+	gl2psAddPrimitiveInList(prim, tree->primitives);
+	break;
+      case GL2PS_IN_BACK_OF:
+	gl2psAddPrimitiveInList(prim, backlist);
+	break;
+      case GL2PS_IN_FRONT_OF:
+	gl2psAddPrimitiveInList(prim, frontlist);
+	break;
+      case GL2PS_SPANNING:
+	gl2psAddPrimitiveInList(backprim, backlist);
+	gl2psAddPrimitiveInList(frontprim, frontlist);
+	gl2psFreePrimitive(&prim, NULL);
+	break;
+      }
+    }
+  }
+
+  if(gl2psListNbr(tree->primitives))
+    gl2psListSort(tree->primitives, gl2psTrianglesFirst);
+
+  if(gl2psListNbr(frontlist)){
+    gl2psListSort(frontlist, gl2psTrianglesFirst);
+    tree->front = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree));
+    gl2psBuildBspTree(tree->front, frontlist);
+  }
+  
+  if(gl2psListNbr(backlist)){
+    gl2psListSort(frontlist, gl2psTrianglesFirst);
+    tree->back = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree));
+    gl2psBuildBspTree(tree->back, backlist);
+  }
+}
+
+GLvoid  gl2psTraverseBspTree(GL2PSbsptree *tree, GL2PSxyz eye, GLfloat epsilon,
+			     GLboolean (*compare)(GLfloat f1, GLfloat f2),
+			     GLvoid (*action)(GLvoid *data, GLvoid *dummy)){
+  GLfloat result;
+
+  if(!tree) return;
+
+  result = gl2psComparePointPlane(eye, tree->plane);
+
+  if(compare(result, epsilon)){
+    gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action);
+    gl2psListAction(tree->primitives, action);
+    gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action);
+  }
+  else if(compare(-epsilon, result)){ 
+    gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action);
+    gl2psListAction(tree->primitives, action);
+    gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action) ;
+  }
+  else{
+    gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action);
+    gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action) ;
+  }
+}
+
+
+GLint gl2psSplit2d(GL2PSxyz a, GL2PSxyz b, GL2PSxy tc, GL2PSxy td){
+  GLfloat  line[3], n, d[2]; 
+
+  /*
+    in back of == >0 == outside polygon
+   */
+
+  line[0] = td[1] - tc[1] ;
+  line[1] = tc[0] - td[0] ;
+  n = sqrt(line[0]*line[0]+line[1]*line[1]);
+  line[0] /= n ; 
+  line[1] /= n ;
+  line[2] = - line[0] * tc[0] - line[1] * tc[1] ;
+
+  d[0] = line[0]*a[0] + line[1]*a[1] + line[2] ;
+
+  if(b == NULL){
+    if(d[0] > GL2PS_EPSILON)       return GL2PS_IN_BACK_OF;
+    else if(d[0] < -GL2PS_EPSILON) return GL2PS_IN_FRONT_OF;
+    else                           return GL2PS_COINCIDENT;
+  }
+  else{
+    d[1] = line[0]*b[0] + line[1]*b[1] + line[2] ;
+    
+    if(d[0] > GL2PS_EPSILON){
+      if(d[1] < -GL2PS_EPSILON) return GL2PS_SPANNING;
+      else return GL2PS_IN_BACK_OF;
+    }
+    if(d[0] < -GL2PS_EPSILON){
+      if(d[1] > GL2PS_EPSILON) return GL2PS_SPANNING;
+      else return GL2PS_IN_FRONT_OF;
+    }
+    else{
+      if(d[1] > GL2PS_EPSILON) return GL2PS_IN_BACK_OF;
+      else if(d[1] < -GL2PS_EPSILON) return GL2PS_IN_FRONT_OF;
+      /* else return GL2PS_COINCIDENT; */
+      else return GL2PS_IN_FRONT_OF;
+    }
+  }
+}
+
+
+GLvoid  gl2psSimplify2d(GL2PSbsptree2d *tree){
+  if(!tree) return;
+  if(tree->back){
+    if(tree->flag==0)
+      gl2psSimplify2d(tree->back);
+  }
+  if(tree->front){
+    gl2psSimplify2d(tree->front);
+  }
+}
+
+GLvoid  gl2psReset(GL2PSbsptree2d *tree){
+  if(!tree) return;
+  tree->flag=0;
+  if(tree->back){
+    gl2psReset(tree->back);
+  }
+  if(tree->front){
+    gl2psReset(tree->front);
+  }
+}
+
+
+static GL2PSbsptree2d *image=NULL;
+
+GLvoid gl2psAddInImageTree(GL2PSprimitive *prim, 
+			   GL2PSxyz a, GL2PSxyz b, GL2PSbsptree2d **tree){
+  GLint res;
+
+  if(*tree == NULL){
+    /* insert the edge, except for lines & points */
+    if(prim->numverts > 2){ 
+      prim->depth = -1.; 
+      (*tree) = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d));
+      (*tree)->a[0] = a[0];
+      (*tree)->a[1] = a[1];
+      (*tree)->b[0] = b[0];
+      (*tree)->b[1] = b[1];
+      (*tree)->front = NULL;
+      (*tree)->back = NULL;
+      (*tree)->flag = 1;
+    }
+  }
+  else{
+    res = gl2psSplit2d(a, b, (*tree)->a, (*tree)->b);
+
+    switch(res){
+    case GL2PS_IN_BACK_OF:
+       gl2psAddInImageTree(prim, a, b, &(*tree)->back);
+      break;
+    case GL2PS_IN_FRONT_OF:
+      if((*tree)->flag) gl2psAddInImageTree(prim, a, b, &(*tree)->front);
+      break;
+    case GL2PS_SPANNING:
+      gl2psAddInImageTree(prim, a, b, &(*tree)->back);
+      if((*tree)->flag) gl2psAddInImageTree(prim, a, b, &(*tree)->front);
+      break;
+    case GL2PS_COINCIDENT:
+      (*tree)->flag = 1;
+      break;
+    }
+  }
+}
+
+static int count=0;
+
+GLvoid gl2psAddInImage(void *a, void *b){
+  GL2PSprimitive *prim;
+  GLint          i;
+
+  prim = *(GL2PSprimitive **)a;
+
+  /*  if(prim->numverts == 1)
+      gl2psAddInImageTree(prim, prim->verts[i].xyz, NULL, &image); */
+  if(prim->numverts < 3)
+    return;
+  else{
+    for(i=0 ; i<prim->numverts ; i++){
+      count++;
+      gl2psAddInImageTree(prim, prim->verts[i].xyz, 
+			  prim->verts[gl2psGetIndex(i,prim->numverts)].xyz, &image);
+    }
+  }
+
+  /* simplify old/new */
+
+  gl2psReset(image);
+
+}
+
+
+#define GL2PS_BOUNDARY_OFFSET 0
+
+GLvoid gl2psAddBoundaryInList(GL2PSprimitive *prim, GL2PSlist *list){
+  GL2PSprimitive *b;
+  GLshort         i;
+  GL2PSxyz        c;
+
+  c[0] = c[1] = c[2] = 0.;
+  for(i=0 ; i<prim->numverts ; i++){
+    c[0] += prim->verts[i].xyz[0];
+    c[1] += prim->verts[i].xyz[1];
+  }
+  c[0] /= prim->numverts;
+  c[1] /= prim->numverts;
+
+  for(i=0 ; i<prim->numverts ; i++){
+    if(prim->boundary & (GLint)pow(2, i)){
+      b = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+      b->type = GL2PS_LINE;
+      b->dash = prim->dash;
+      b->boundary = 0;
+      b->numverts = 2;
+      b->verts = (GL2PSvertex *)gl2psMalloc(2 * sizeof(GL2PSvertex));
+
+#if GL2PS_BOUNDARY_OFFSET
+      v[0] = c[0] - prim->verts[i].xyz[0];
+      v[1] = c[1] - prim->verts[i].xyz[1];
+      v[2] = 0.;
+      norm = gl2psNorm(v);
+      v[0] /= norm;
+      v[1] /= norm;
+      b->verts[0].xyz[0] = prim->verts[i].xyz[0] +0.1*v[0];
+      b->verts[0].xyz[1] = prim->verts[i].xyz[1] +0.1*v[1];
+      b->verts[0].xyz[2] = prim->verts[i].xyz[2];
+      v[0] = c[0] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0];
+      v[1] = c[1] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1];
+      norm = gl2psNorm(v);
+      v[0] /= norm;
+      v[1] /= norm;
+      b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0] +0.1*v[0];
+      b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1] +0.1*v[1];
+      b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2];
+#else
+      b->verts[0].xyz[0] = prim->verts[i].xyz[0];
+      b->verts[0].xyz[1] = prim->verts[i].xyz[1];
+      b->verts[0].xyz[2] = prim->verts[i].xyz[2];
+      b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0];
+      b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1];
+      b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2];
+#endif
+
+      b->verts[0].rgba[0] = 0.;
+      b->verts[0].rgba[1] = 0.;
+      b->verts[0].rgba[2] = 0.;
+      b->verts[0].rgba[3] = 0.;
+      b->verts[1].rgba[0] = 0.;
+      b->verts[1].rgba[1] = 0.;
+      b->verts[1].rgba[2] = 0.;
+      b->verts[1].rgba[3] = 0.;
+      gl2psListAdd(list, &b);
+    }
+  }
+
+}
+
+GLvoid  gl2psBuildPolygonBoundary(GL2PSbsptree *tree){
+  GLint          i, n;
+  GL2PSprimitive *prim;
+
+  if(!tree) return;
+  gl2psBuildPolygonBoundary(tree->back);
+  n = gl2psListNbr(tree->primitives);
+  for(i=0 ; i<n ; i++){
+    prim = *(GL2PSprimitive**)gl2psListPointer(tree->primitives, i);
+    if(prim->boundary) gl2psAddBoundaryInList(prim, tree->primitives);
+  }
+  gl2psBuildPolygonBoundary(tree->front);
+}
+
+GLvoid gl2psPrintPrimitive(GLvoid *a, GLvoid *b){
+  GL2PSprimitive *prim;
+
+  prim = *(GL2PSprimitive**) a;
+
+  if(gl2ps.options & GL2PS_OCCLUSION_CULL && prim->depth >= 0.) return;
+
+  switch(prim->type){
+  case GL2PS_TEXT :
+    fprintf(gl2ps.stream, "(%s) %g %g %g %g %g %d /%s S\n",
+	    prim->text->str, prim->verts[0].xyz[0], prim->verts[0].xyz[1],
+	    prim->verts[0].rgba[0], prim->verts[0].rgba[1], 
+	    prim->verts[0].rgba[2], prim->text->fontsize, 
+	    prim->text->fontname);
+    break;
+  case GL2PS_POINT :
+    fprintf(gl2ps.stream, "%g %g %g %g %g P\n", prim->verts[0].xyz[0],
+	    prim->verts[0].xyz[1], prim->verts[0].rgba[0],
+	    prim->verts[0].rgba[1], prim->verts[0].rgba[2]);
+    break;
+  case GL2PS_LINE :
+    if(prim->dash)
+      fprintf(gl2ps.stream, "[%d] 0 setdash\n", prim->dash);
+    if(gl2ps.shade){
+      fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g SL\n",
+	      prim->verts[1].xyz[0], prim->verts[1].xyz[1],
+	      prim->verts[1].rgba[0], prim->verts[1].rgba[1],
+	      prim->verts[1].rgba[2], prim->verts[0].xyz[0],
+	      prim->verts[0].xyz[1], prim->verts[0].rgba[0],
+	      prim->verts[0].rgba[1], prim->verts[0].rgba[2]);
+    }
+    else{
+      fprintf(gl2ps.stream, "%g %g %g %g %g %g %g L\n",
+	      prim->verts[1].xyz[0], prim->verts[1].xyz[1],
+	      prim->verts[0].xyz[0], prim->verts[0].xyz[1],
+	      prim->verts[0].rgba[0], prim->verts[0].rgba[1],
+	      prim->verts[0].rgba[2]);
+    }
+    if(prim->dash)
+      fprintf(gl2ps.stream, "[] 0 setdash\n");
+    break;
+  case GL2PS_TRIANGLE :
+    if(gl2ps.shade){
+      fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n",
+	      prim->verts[2].xyz[0], prim->verts[2].xyz[1],
+	      prim->verts[2].rgba[0], prim->verts[2].rgba[1],
+	      prim->verts[2].rgba[2], prim->verts[1].xyz[0],
+	      prim->verts[1].xyz[1], prim->verts[1].rgba[0],
+	      prim->verts[1].rgba[1], prim->verts[1].rgba[2],
+	      prim->verts[0].xyz[0], prim->verts[0].xyz[1],
+	      prim->verts[0].rgba[0], prim->verts[0].rgba[1],
+	      prim->verts[0].rgba[2]);
+    }
+    else{
+      fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g T\n",
+	      prim->verts[2].xyz[0], prim->verts[2].xyz[1],
+	      prim->verts[1].xyz[0], prim->verts[1].xyz[1],
+	      prim->verts[0].xyz[0], prim->verts[0].xyz[1],
+	      prim->verts[0].rgba[0], prim->verts[0].rgba[1],
+	      prim->verts[0].rgba[2]);
+    }
+    break;
+  case GL2PS_QUADRANGLE :
+    gl2psMsg(GL2PS_WARNING, "There Should not be any Quad left to Print");
+    break;
+  default :
+    gl2psMsg(GL2PS_ERROR, "Unknown Type of Primitive to Print");
+    break;
+  }
+}
+
+
+GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts, 
+			     GL2PSvertex *verts, GLint offset, GLint dash,
+			     GLshort boundary){
+  GLshort         i;
+  GLfloat         factor, units, area, dZ, dZdX, dZdY, maxdZ;
+  GL2PSprimitive *prim;
+
+  prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive));
+  prim->type = type;
+  prim->numverts = numverts;
+  prim->verts = (GL2PSvertex *)gl2psMalloc(numverts * sizeof(GL2PSvertex));
+  memcpy(prim->verts, verts, numverts * sizeof(GL2PSvertex));
+  prim->boundary = boundary;
+
+  if(gl2ps.options & GL2PS_SIMPLE_LINE_OFFSET){
+    if(type == GL2PS_LINE){
+      if(gl2ps.sort == GL2PS_SIMPLE_SORT){
+	prim->verts[0].xyz[2] -= 1.;
+	prim->verts[1].xyz[2] -= 1.;
+      }
+      else{
+	prim->verts[0].xyz[2] -= 0.1;
+	prim->verts[1].xyz[2] -= 0.1;
+      }
+    }
+  }
+  else if(offset && type == GL2PS_TRIANGLE){
+
+    if(gl2ps.sort == GL2PS_SIMPLE_SORT){    
+      factor = gl2ps.offset[0];
+      units = gl2ps.offset[1];
+    }
+    else{
+      factor = gl2ps.offset[0] / 800.;
+      units = gl2ps.offset[1] / 800.;
+    }
+
+    area = 
+      (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * 
+      (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) - 
+      (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * 
+      (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]);
+    dZdX = 
+      (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) *
+      (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) -
+      (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]) *
+      (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) / area;
+    dZdY = 
+      (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) *
+      (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) -
+      (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) *
+      (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) / area;
+    
+    maxdZ = sqrt(dZdX*dZdX + dZdY*dZdY);
+
+    dZ = factor * maxdZ + units;
+
+    /* printf("dZ = %g  (fact=%g  units=%g)\n", dZ, factor, units); */
+
+    prim->verts[0].xyz[2] += dZ;
+    prim->verts[1].xyz[2] += dZ;
+    prim->verts[2].xyz[2] += dZ;
+  }
+
+  prim->depth = 0.;
+  prim->dash = dash;
+
+  if(gl2ps.sort == GL2PS_SIMPLE_SORT){
+    for(i = 0; i < numverts; i++) 
+      prim->depth += prim->verts[i].xyz[2]; 
+    prim->depth /= (GLfloat)numverts;
+  }
+  
+  gl2psListAdd(gl2ps.primitives, &prim);
+}
+
+GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){
+  GLint i;
+
+  v->xyz[0] = p[0];
+  v->xyz[1] = p[1];
+  v->xyz[2] = 1000. * p[2];
+
+  if(gl2ps.colormode == GL_COLOR_INDEX && gl2ps.colorsize > 0){
+    i = (GLint)(p[3] + 0.5);
+    v->rgba[0] = gl2ps.colormap[i][0];
+    v->rgba[1] = gl2ps.colormap[i][1];
+    v->rgba[2] = gl2ps.colormap[i][2];
+    v->rgba[3] = gl2ps.colormap[i][3];
+    return 4;
+  }
+  else{
+    v->rgba[0] = p[3];
+    v->rgba[1] = p[4];
+    v->rgba[2] = p[5];
+    v->rgba[3] = p[6];
+    return 7;
+  }
+}
+
+GLint gl2psParseFeedbackBuffer(GLvoid){
+  GLint        i, used, count, v, vtot, offset=0, dash=0;
+  GLshort      boundary, flag;
+  GLfloat     *current;
+  GL2PSvertex  vertices[3];
+
+  used = glRenderMode(GL_RENDER);
+
+  if(used < 0){
+    gl2psMsg(GL2PS_INFO, "OpenGL Feedback Buffer Reallocation");
+    return GL2PS_OVERFLOW;
+  }
+
+  if(used == 0){
+    gl2psMsg(GL2PS_WARNING, "Empty Feedback Buffer");
+    return GL2PS_NO_FEEDBACK;
+  }
+
+  current = gl2ps.feedback;
+  boundary = gl2ps.boundary = 0;
+
+  while(used > 0){
+
+    if(boundary) gl2ps.boundary = 1;
+    
+    switch((GLint)*current){
+    case GL_POINT_TOKEN :
+      current ++;
+      used --;
+      i = gl2psGetVertex(&vertices[0], current);
+      current += i;
+      used    -= i;
+      gl2psAddPolyPrimitive(GL2PS_POINT, 1, vertices, 0, dash, 0);
+      break;
+    case GL_LINE_TOKEN :
+    case GL_LINE_RESET_TOKEN :
+      current ++;
+      used --;
+      i = gl2psGetVertex(&vertices[0], current);
+      current += i;
+      used    -= i;
+      i = gl2psGetVertex(&vertices[1], current);
+      current += i;
+      used    -= i;
+      gl2psAddPolyPrimitive(GL2PS_LINE, 2, vertices, 0, dash, 0);
+      break;
+    case GL_POLYGON_TOKEN :
+      count = (GLint)current[1];
+      current += 2;
+      used -= 2;
+      v = vtot = 0;
+      while(count > 0 && used > 0){
+	i = gl2psGetVertex(&vertices[v], current);
+	current += i;
+	used    -= i;
+	count --;
+	vtot++;
+	if(v == 2){
+	  if(boundary){
+	    if(!count && vtot==2) flag = 1|2|4;
+	    else if(!count) flag = 2|4;
+	    else if(vtot==2) flag = 1|2;
+	    else flag = 2;
+	  }
+	  else
+	    flag = 0;
+	  gl2psAddPolyPrimitive(GL2PS_TRIANGLE, 3, vertices, 
+				offset, dash, flag);
+	  vertices[1] = vertices[2];
+	}
+	else
+	  v ++;
+      }
+      break;      
+    case GL_BITMAP_TOKEN :
+    case GL_DRAW_PIXEL_TOKEN :
+    case GL_COPY_PIXEL_TOKEN :
+      current ++;
+      used --;
+      i = gl2psGetVertex(&vertices[0], current);
+      current += i;
+      used    -= i;
+      break;      
+    case GL_PASS_THROUGH_TOKEN :
+      switch((GLint)current[1]){
+      case GL2PS_BEGIN_POLYGON_OFFSET_FILL : offset=1; break;
+      case GL2PS_END_POLYGON_OFFSET_FILL : offset=0; break;
+      case GL2PS_BEGIN_POLYGON_BOUNDARY : boundary=1; break;
+      case GL2PS_END_POLYGON_BOUNDARY : boundary=0; break;
+      case GL2PS_BEGIN_LINE_STIPPLE : dash=4; break;
+      case GL2PS_END_LINE_STIPPLE : dash=0; break;
+      }
+      current += 2;
+      used -= 2;
+      break;      
+    default :
+      gl2psMsg(GL2PS_WARNING, "Unknown Token in Buffer");
+      current ++;
+      used --;
+      break;
+    }
+  }
+  
+  return GL2PS_SUCCESS;
+}
+
+GLvoid gl2psPrintPostscriptHeader(GLvoid){
+  GLint   viewport[4], index;
+  GLfloat rgba[4];
+  time_t  now;
+
+  time(&now);
+
+  glGetIntegerv(GL_VIEWPORT, viewport);
+
+  /* 
+     Greyscale: r g b G (replace C by G in output to change from rgb to gray)
+     RGB color: r g b C
+     Font choose: size fontname FC
+     String primitive: (string) x y r g b size fontname S
+     Point primitive: x y r g b P
+     Flat-shaded line: x2 y2 x1 y1 r g b L
+     Flat-shaded triangle: x3 y3 x2 y2 x1 y1 r g b T
+     Smooth-shaded line: x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL
+     Smooth-shaded triangle: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST
+  */
+
+  fprintf(gl2ps.stream, 
+	  "%%!PS-Adobe-3.0\n"
+	  "%%%%Title: %s\n"
+	  "%%%%Creator: GL2PS, an OpenGL to Postscript Printing Library, V. 0.3\n"
+	  "%%%%For: %s\n"
+	  "%%%%CreationDate: %s"
+	  "%%%%LanguageLevel: 2\n"
+	  "%%%%Pages: 1\n"
+	  "%%%%DocumentData: Clean7Bit\n"
+	  "%%%%PageOrder: Ascend\n"
+	  "%%%%Orientation: Portrait\n"
+	  "%%%%DocumentMedia: Default %d %d 0 () ()\n"
+	  "%%%%BoundingBox: %d %d %d %d\n"
+	  "%%%%Copyright: GNU LGPL (C) 1999-2000 Christophe.Geuzaine@AdValvas.be\n"
+	  "%%%%EndComments\n"
+	  "%%%%BeginProlog\n"
+	  "/gl2psdict 64 dict def gl2psdict begin\n"
+	  "1 setlinecap 1 setlinejoin 0.2 setlinewidth /bd {bind def} bind def\n"
+	  "/G { 0.082 mul exch 0.6094 mul add exch 0.3086 mul add neg 1.0 add\n"
+	  "setgray } bd /C { setrgbcolor } bd /FC { findfont exch scalefont\n"
+	  "setfont } bd /S { FC C moveto show } bd /P { C newpath 0.5 0.0 360.0\n"
+	  "arc closepath fill } bd /L { C newpath moveto lineto stroke } bd\n"
+	  "/T { C newpath moveto lineto lineto closepath fill } bd /SL { /b1\n"
+	  "exch def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n"
+	  "/b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n"
+	  "b2 b1 sub abs 0.01 gt g2 g1 sub abs 0.005 gt r2 r1 sub abs 0.008 gt\n"
+	  "or or { /bm b1 b2 add 0.5 mul def /gm g1 g2 add 0.5 mul def\n"
+	  "/rm r1 r2 add 0.5 mul def /ym y1 y2 add 0.5 mul def /xm x1 x2 add\n"
+	  "0.5 mul def x1 y1 r1 g1 b1 xm ym rm gm bm SL xm ym rm gm bm x2 y2 r2\n"
+	  "g2 b2 SL } { x1 y1 x2 y2 r1 g1 b1 L } ifelse } bd /ST {/b1 exch\n"
+	  "def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n"
+	  "/b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n"
+	  "/b3 exch def /g3 exch def /r3 exch def /y3 exch def /x3 exch def\n"
+	  "b2 b1 sub abs 0.05 gt g2 g1 sub abs 0.017 gt r2 r1 sub abs 0.032 gt\n"
+	  "b3 b1 sub abs 0.05 gt g3 g1 sub abs 0.017 gt r3 r1 sub abs 0.032 gt\n"
+	  "b2 b3 sub abs 0.05 gt g2 g3 sub abs 0.017 gt r2 r3 sub abs 0.032 gt\n"
+	  "or or or or or or or or { /b12 b1 b2 add 0.5 mul def /g12 g1 g2 add\n"
+	  "0.5 mul def /r12 r1 r2 add 0.5 mul def /y12 y1 y2 add 0.5 mul def\n"
+	  "/x12 x1 x2 add 0.5 mul def /b13 b1 b3 add 0.5 mul def /g13 g1 g3\n"
+	  "add 0.5 mul def /r13 r1 r3 add 0.5 mul def /y13 y1 y3 add 0.5 mul\n"
+	  "def /x13 x1 x3 add 0.5 mul def /b32 b3 b2 add 0.5 mul def\n"
+	  "/g32 g3 g2 add 0.5 mul def /r32 r3 r2 add 0.5 mul def /y32 y3 y2\n"
+	  "add 0.5 mul def /x32 x3 x2 add 0.5 mul def x1 y1 r1 g1 b1 x12 y12\n"
+	  "r12 g12 b12 x13 y13 r13 g13 b13 x2 y2 r2 g2 b2 x12 y12 r12 g12 b12\n"
+	  "x32 y32 r32 g32 b32 x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13\n"
+	  "g13 b13 x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13\n"
+	  "ST ST ST ST } { x1 y1 x2 y2 x3 y3 r1 g1 b1 T } ifelse } bd\n"
+	  "end\n"
+	  "%%%%EndProlog\n"
+	  "%%%%BeginSetup\n"
+	  "/DeviceRGB setcolorspace\n"
+	  "gl2psdict begin\n"
+	  "%%%%EndSetup\n"
+	  "%%%%Page: 1 1\n"
+	  "%%%%BeginPageSetup\n"
+	  "%%%%EndPageSetup\n"
+	  "mark\n"
+	  "gsave\n"
+	  "1.0 1.0 scale\n",
+	  gl2ps.title, gl2ps.producer, ctime(&now), viewport[2], viewport[3], 
+	  viewport[0], viewport[1], viewport[2], viewport[3]);
+	  
+  if(gl2ps.options & GL2PS_DRAW_BACKGROUND){
+    if(gl2ps.colormode == GL_RGBA || gl2ps.colorsize == 0)
+      glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba);
+    else{
+      glGetIntegerv(GL_INDEX_CLEAR_VALUE, &index);
+      rgba[0] = gl2ps.colormap[index][0];
+      rgba[1] = gl2ps.colormap[index][1];
+      rgba[2] = gl2ps.colormap[index][2];
+      rgba[3] = 0.;
+    }
+    fprintf(gl2ps.stream,
+	    "%g %g %g C\n"
+	    "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n"
+	    "closepath fill\n",
+	    rgba[0], rgba[1], rgba[2], 
+	    viewport[0], viewport[1], viewport[2], viewport[1], 
+	    viewport[2], viewport[3], viewport[0], viewport[3]);
+  }
+}
+
+GLvoid gl2psFreeBspTree(GL2PSbsptree *tree){
+  if(tree->back){
+    gl2psFreeBspTree(tree->back);
+    gl2psFree(tree->back);
+  }
+  if(tree->primitives){
+    gl2psListAction(tree->primitives, gl2psFreePrimitive);
+    gl2psListDelete(tree->primitives);
+  }
+  if(tree->front){
+    gl2psFreeBspTree(tree->front);
+    gl2psFree(tree->front);
+  }
+}
+
+GLboolean gl2psGreater(GLfloat f1, GLfloat f2){
+  if(f1 > f2) return 1;
+  else return 0;
+}
+
+GLboolean gl2psLess(GLfloat f1, GLfloat f2){
+  if(f1 < f2) return 1;
+  else return 0;
+}
+
+GLvoid gl2psBeginPage(char *title, char *producer, GLint sort, GLint options, 
+		      GLint colormode, GLint colorsize, GL2PSrgba *colormap,
+		      GLint buffersize, FILE *stream){
+
+  gl2ps.title = title;
+  gl2ps.producer = producer;
+  gl2ps.sort = sort;
+  gl2ps.options = options;
+  gl2ps.colormode = colormode;
+  gl2ps.buffersize = buffersize > 0 ? buffersize : 1024 * 1024;
+  gl2ps.feedback = (GLfloat*)gl2psMalloc(gl2ps.buffersize * sizeof(GLfloat));
+  gl2ps.primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*));
+
+  if(gl2ps.colormode == GL_RGBA){
+    gl2ps.colorsize = 0;
+    gl2ps.colormap = NULL;
+  }
+  else if(gl2ps.colormode == GL_COLOR_INDEX){
+    if(!colorsize || !colormap)
+      gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering");
+    if(gl2ps.colormap) 
+      gl2psFree(gl2ps.colormap);
+    gl2ps.colorsize = colorsize;
+    gl2ps.colormap = (GL2PSrgba*)gl2psMalloc(gl2ps.colorsize * sizeof(GL2PSrgba));
+    memcpy(gl2ps.colormap, colormap, gl2ps.colorsize * sizeof(GL2PSrgba));
+  }
+  else
+    gl2psMsg(GL2PS_ERROR, "Unknown Color Mode in gl2psBeginPage");
+
+  if(stream)
+    gl2ps.stream = stream;
+  else
+    gl2psMsg(GL2PS_ERROR, "Bad File Pointer");
+
+  glFeedbackBuffer(gl2ps.buffersize, GL_3D_COLOR, gl2ps.feedback);
+  glRenderMode(GL_FEEDBACK);  
+}
+
+GLint gl2psEndPage(GLvoid){
+  GL2PSbsptree   *root;
+  GL2PSxyz        eye={0., 0., 100000.};
+  GLint           shademodel, res;
+  
+  glGetIntegerv(GL_SHADE_MODEL, &shademodel);
+  gl2ps.shade = (shademodel == GL_SMOOTH);
+
+  res = gl2psParseFeedbackBuffer();
+
+  if(gl2ps.feedback) gl2psFree(gl2ps.feedback);
+
+  if(res == GL2PS_SUCCESS){
+    gl2psPrintPostscriptHeader();
+    switch(gl2ps.sort){
+    case GL2PS_NO_SORT :
+      gl2psListAction(gl2ps.primitives, gl2psPrintPrimitive);
+      gl2psListAction(gl2ps.primitives, gl2psFreePrimitive);
+      gl2psListDelete(gl2ps.primitives);
+      res = GL2PS_SUCCESS;
+      break;
+    case GL2PS_SIMPLE_SORT :
+      gl2psListSort(gl2ps.primitives, gl2psCompareDepth);
+      gl2psListActionInverse(gl2ps.primitives, gl2psPrintPrimitive);
+      gl2psListAction(gl2ps.primitives, gl2psFreePrimitive);
+      gl2psListDelete(gl2ps.primitives);
+      res = GL2PS_SUCCESS;
+      break;
+    case GL2PS_BSP_SORT :
+      root = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree));
+      gl2psBuildBspTree(root, gl2ps.primitives);
+      gl2psListDelete(gl2ps.primitives);
+      if(gl2ps.boundary) gl2psBuildPolygonBoundary(root);
+      if(gl2ps.options & GL2PS_OCCLUSION_CULL){
+	gl2psTraverseBspTree(root, eye, -GL2PS_EPSILON, gl2psLess,
+			     gl2psAddInImage);
+      }
+      gl2psTraverseBspTree(root, eye, GL2PS_EPSILON, gl2psGreater, 
+			   gl2psPrintPrimitive);
+      gl2psFreeBspTree(root);
+      res = GL2PS_SUCCESS;
+      break;
+    default :
+      gl2psMsg(GL2PS_ERROR, "Unknown Sorting Algorithm");
+    }
+    fprintf(gl2ps.stream,
+	    "grestore\n"
+	    "showpage\n"
+	    "cleartomark\n"
+	    "%%%%PageTrailer\n"
+	    "%%%%Trailer\n"
+	    "end\n"
+	    "%%%%EOF\n");
+    fflush(gl2ps.stream);
+  }
+
+  if(gl2ps.colormap) gl2psFree(gl2ps.colormap);
+
+  return res;
+}
+
+GLvoid gl2psText(char *str, char *fontname, GLint fontsize){
+  GLfloat         pos[4];
+  GL2PSprimitive  *prim;
+  GLint           len;
+
+  prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive));
+  prim->type = GL2PS_TEXT;
+  prim->boundary = 0;
+  prim->numverts = 1;
+  prim->verts = (GL2PSvertex *)gl2psMalloc(sizeof(GL2PSvertex));
+  glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
+  prim->verts[0].xyz[0] = pos[0];
+  prim->verts[0].xyz[1] = pos[1];
+  prim->verts[0].xyz[2] = pos[2];
+  prim->depth = pos[2];
+  prim->dash = 0;
+  glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba);
+  prim->text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring));
+  if((len = strlen(str))){
+    prim->text->str = (char*)gl2psMalloc(len*sizeof(char));
+    strcpy(prim->text->str, str);
+  }
+  else
+    prim->text->str = "";
+  prim->text->fontname = fontname;
+  prim->text->fontsize = fontsize;
+  gl2psListAdd(gl2ps.primitives, &prim);
+}
+
+GLvoid gl2psEnable(GLint mode){
+  switch(mode){
+  case GL2PS_POLYGON_OFFSET_FILL :
+    glPassThrough(GL2PS_BEGIN_POLYGON_OFFSET_FILL);
+    glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &gl2ps.offset[0]);
+    glGetFloatv(GL_POLYGON_OFFSET_UNITS, &gl2ps.offset[1]);
+    break;
+  case GL2PS_POLYGON_BOUNDARY :
+    glPassThrough(GL2PS_BEGIN_POLYGON_BOUNDARY);
+    break;
+  case GL2PS_LINE_STIPPLE :
+    glPassThrough(GL2PS_BEGIN_LINE_STIPPLE);
+    break;
+  default :
+    gl2psMsg(GL2PS_WARNING, "Unknown Mode in gl2psEnable");
+    break;
+  }
+}
+
+GLvoid gl2psDisable(GLint mode){
+  switch(mode){
+  case GL2PS_POLYGON_OFFSET_FILL :
+    glPassThrough(GL2PS_END_POLYGON_OFFSET_FILL);
+    break;
+  case GL2PS_POLYGON_BOUNDARY :
+    glPassThrough(GL2PS_END_POLYGON_BOUNDARY);
+    break;
+  case GL2PS_LINE_STIPPLE :
+    glPassThrough(GL2PS_END_LINE_STIPPLE);
+    break;
+  default :
+    gl2psMsg(GL2PS_WARNING, "Unknown Mode in gl2psDisable");
+    break;
+  }
+}
+
diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h
new file mode 100644
index 0000000000000000000000000000000000000000..f3bb6cf85541f1bb68e12f6e8a68ed357fdf51c5
--- /dev/null
+++ b/Graphics/gl2ps.h
@@ -0,0 +1,160 @@
+/*
+ * GL2PS, an OpenGL to Postscript Printing Library, version 0.31
+ * Copyright (C) 1999-2000  Christophe Geuzaine
+ *
+ * Last Mod by Christophe on Mon Aug 14 23:49:47 2000
+ *
+ * E-mail: Christophe.Geuzaine@AdValvas.be
+ * URL: http://www.geuz.org/gl2ps/
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef __GL2PS_H__
+#define __GL2PS_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/gl.h>
+
+#define GL2PS_NONE                       0
+
+/* Sorting algorithms */
+
+#define GL2PS_NO_SORT                    1
+#define GL2PS_SIMPLE_SORT                2
+#define GL2PS_BSP_SORT                   3
+
+/* Options for gl2psBeginPage */
+
+#define GL2PS_DRAW_BACKGROUND            1
+#define GL2PS_SIMPLE_LINE_OFFSET         2
+#define GL2PS_SILENT                     4
+#define GL2PS_BEST_ROOT                  8
+#define GL2PS_OCCLUSION_CULL             16
+
+/* Arguments for gl2psEnable/gl2psDisable */
+
+#define GL2PS_POLYGON_OFFSET_FILL        1
+#define GL2PS_POLYGON_BOUNDARY           2
+#define GL2PS_LINE_STIPPLE               3
+
+/* Magic numbers */
+
+#define GL2PS_EPSILON                    5.e-3
+
+/* Message levels */
+
+#define GL2PS_INFO                       1
+#define GL2PS_WARNING                    2
+#define GL2PS_ERROR                      3
+
+/* Error codes */
+
+#define GL2PS_SUCCESS                    0
+#define GL2PS_NO_FEEDBACK               -1
+#define GL2PS_OVERFLOW                  -2
+
+/* Primitive types */
+
+#define GL2PS_TEXT                       1
+#define GL2PS_POINT                      2
+#define GL2PS_LINE                       3
+#define GL2PS_QUADRANGLE                 4
+#define GL2PS_TRIANGLE                   5
+
+/* BSP tree primitive comparison */
+
+#define GL2PS_COINCIDENT                 1
+#define GL2PS_IN_FRONT_OF                2
+#define GL2PS_IN_BACK_OF                 3
+#define GL2PS_SPANNING                   4
+
+/* Pass through options */
+
+#define GL2PS_BEGIN_POLYGON_OFFSET_FILL  1
+#define GL2PS_END_POLYGON_OFFSET_FILL    2
+#define GL2PS_BEGIN_POLYGON_BOUNDARY     3
+#define GL2PS_END_POLYGON_BOUNDARY       4
+#define GL2PS_BEGIN_LINE_STIPPLE         5
+#define GL2PS_END_LINE_STIPPLE           6
+
+typedef GLfloat GL2PSrgba[4];
+typedef GLfloat GL2PSxyz[3];
+typedef GLfloat GL2PSxy[2];
+typedef GLfloat GL2PSplane[4];
+
+typedef struct {
+  GLint nmax, size, incr, n;
+  char *array;
+} GL2PSlist;
+
+typedef struct _GL2PSbsptree GL2PSbsptree;
+
+struct _GL2PSbsptree {
+  GL2PSplane plane;
+  GL2PSlist *primitives;
+  GL2PSbsptree *front, *back;
+};
+
+typedef struct _GL2PSbsptree2d GL2PSbsptree2d;
+
+struct _GL2PSbsptree2d {
+  GLshort flag;
+  GL2PSxy a, b;
+  GL2PSbsptree2d *front, *back;
+};
+
+typedef struct {
+  GL2PSxyz xyz;
+  GL2PSrgba rgba;
+} GL2PSvertex;
+
+typedef struct {
+  GLshort fontsize;
+  char *str, *fontname;
+} GL2PSstring;
+
+typedef struct {
+  GLshort type, numverts, boundary;
+  GLfloat depth;
+  GLint dash;
+  GL2PSvertex *verts;
+  GL2PSstring *text;
+} GL2PSprimitive;
+
+typedef struct {
+  GLint sort, options, colorsize, colormode, buffersize;
+  char *title, *producer;
+  GLboolean shade, boundary;
+  GLfloat *feedback, offset[2];
+  GL2PSrgba *colormap;
+  GL2PSlist *primitives;
+  FILE *stream;
+} GL2PScontext;
+
+
+/* public functions */
+
+GLvoid gl2psBeginPage(char *title, char *producer, GLint sort, GLint options, 
+		      GLint colormode, GLint colorsize, GL2PSrgba *colormap, 
+		      GLint buffersize, FILE * stream);
+GLint  gl2psEndPage(GLvoid);
+GLvoid gl2psText(char *str, char *fontname, GLint size);
+GLvoid gl2psEnable(GLint mode);
+GLvoid gl2psDisable(GLint mode);
+
+#endif
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e42e55fe15cc11e657c52a2129e4c1f108430dc3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,259 @@
+# ----------------------------------------------------------------------
+#  Makefile for gmsh  
+# ----------------------------------------------------------------------
+
+    GMSH_RELEASE = 0.995
+
+            MAKE = make
+              CC = g++
+              RM = rm
+         RMFLAGS = -f 
+
+      OPENGL_INC = -I/usr/include/X11/GLw\
+                   -I$(HOME)/SOURCES/Mesa-3.1/include\
+                   -I$(HOME)/SOURCES/Mesa-3.1/include/GL
+       MOTIF_INC = -I/usr/X11R6/LessTif/Motif1.2/include
+
+      OPENGL_LIB = -lGLw -lGLU -lGL
+        MESA_LIB = -L$(HOME)/SOURCES/Mesa-3.1/lib -lGLw -lGLU -lGL
+ MESA_STATIC_LIB = $(HOME)/SOURCES/Mesa-3.0-static/lib/libGLw.a\
+                   $(HOME)/SOURCES/Mesa-3.0-static/lib/libGLU.a\
+                   $(HOME)/SOURCES/Mesa-3.0-static/lib/libGL.a
+       MOTIF_LIB = -L/usr/X11R6/LessTif/Motif1.2/lib -lXm 
+           X_LIB = -L/usr/X11R6/lib -lXt -lX11 -lXext
+      THREAD_LIB = -L/usr/lib -lpthread
+
+        GMSH_DIR = Adapt Common DataStr Geo Graphics Mesh Parser Unix
+GMSH_DISTRIB_DIR = $(GMSH_DIR) utils
+    GMSH_BOX_DIR = Adapt Box Common DataStr Geo Mesh Parser
+    GMSH_BIN_DIR = bin
+    GMSH_LIB_DIR = lib
+    GMSH_DOC_DIR = doc
+   GMSH_DEMO_DIR = demos
+GMSH_ARCHIVE_DIR = archives
+        GMSH_LIB = -L$(GMSH_LIB_DIR) -lUnix -lGraphics -lParser -lMesh -lGeo\
+                                     -lAdapt -lCommon -lDataStr
+    GMSH_BOX_LIB = -L$(GMSH_LIB_DIR) -lBox -lParser -lMesh -lGeo\
+                                     -lAdapt -lCommon -lDataStr
+    GMSH_ARCHIVE = $(GMSH_ARCHIVE_DIR)/gmsh-`date "+%Y.%m.%d"`
+     GMSH_SRCRPM = gmsh-$(GMSH_RELEASE)
+    GMSH_SOURCES = `find . \( ! -name "*.tar*" -a ! -name "*.tgz" \
+                           -a ! -name "*.o"    -a ! -name "lib*.a"   \
+                           -a ! -name "*.msh"  -a ! -name "*.bak" \
+                           -a ! -name "gmsh"   -a ! -name "gmsh-*"\
+                           -a ! -type d \)`
+      GMSH_UNAME = `uname`
+
+default: initialtag
+	@for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \
+           "CC=$(CC)" \
+           "C_FLAGS=-g -Wall" \
+           "OS_FLAGS=-D_UNIX -D_LITTLE" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+
+profile: initialtag
+	@for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \
+           "CC=$(CC)" \
+           "C_FLAGS=-O3 -pg" \
+           "OS_FLAGS=-D_UNIX -D_LITTLE" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+	$(CC) -pg -o $(GMSH_BIN_DIR)/gmsh-profile $(GMSH_LIB) $(OPENGL_LIB) \
+                 $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm
+
+gmsh:
+	$(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_LIB) $(OPENGL_LIB) \
+                 $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm
+
+gmsh2:
+	$(CC) -o $(GMSH_BIN_DIR)/gmsh $(GMSH_LIB) $(MESA_LIB) \
+                 $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm
+
+gmshm:
+	$(CC) -o $(GMSH_BIN_DIR)/gmshm $(GMSH_LIB) $(MESA_STATIC_LIB) \
+                 $(MOTIF_LIB) $(X_LIB) $(THREAD_LIB) -lm
+
+parser:
+	cd Parser && $(MAKE) parser
+
+purge:
+	for i in "." $(GMSH_DISTRIB_DIR) $(GMSH_LIB_DIR) $(GMSH_ARCHIVE_DIR)\
+                     $(GMSH_DEMO_DIR) $(GMSH_DOC_DIR); \
+        do (cd $$i && $(RM) $(RMFLAGS) *~ *~~); \
+        done
+
+clean:
+	for i in $(GMSH_DISTRIB_DIR) $(GMSH_DOC_DIR) $(GMSH_LIB_DIR) ; \
+        do (cd $$i && $(MAKE) clean); \
+        done
+
+depend:
+	for i in $(GMSH_DISTRIB_DIR); \
+        do (cd $$i && $(MAKE) depend \
+           "CC=$(CC)" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+
+nodepend:
+	for i in $(GMSH_DISTRIB_DIR) ; do \
+          (cd $$i && (sed '/^# DO NOT DELETE THIS LINE/q' Makefile) > Makefile.new \
+          && cp Makefile Makefile.bak \
+          && cp Makefile.new Makefile \
+          && $(RM) $(RMFLAGS) Makefile.new); \
+        done 
+
+tag:
+	$(RM) $(RMFLAGS) Common/Version.h
+	echo "#define GMSH_VERSION  $(GMSH_RELEASE)" >  Common/Version.h
+	echo "#define GMSH_DATE     \"`date`\""      >> Common/Version.h
+	echo "#define GMSH_HOST     \"`hostname`\""  >> Common/Version.h
+	echo "#define GMSH_PACKAGER \"`logname`\""   >> Common/Version.h
+	echo "#define GMSH_OS       \"`uname -sr`\"" >> Common/Version.h
+
+initialtag:
+	@if [ ! -r Common/Version.h ]; then \
+        $(MAKE) tag ; \
+        fi
+
+tgz:
+	if (test -f $(GMSH_ARCHIVE).tar.gz); \
+	then mv -f $(GMSH_ARCHIVE).tar.gz $(GMSH_ARCHIVE).tar.gz~; \
+	fi
+	tar cvf $(GMSH_ARCHIVE).tar $(GMSH_SOURCES)
+	gzip $(GMSH_ARCHIVE).tar
+	chmod 640 $(GMSH_ARCHIVE).tar.gz
+
+src:
+	tar cvf $(GMSH_SRCRPM).tar $(GMSH_SOURCES)
+	gzip $(GMSH_SRCRPM).tar
+
+# ----------------------------------------------------------------------
+# Demos
+# ----------------------------------------------------------------------
+
+dem:
+	gtar zcvf gmsh-demos.tgz $(GMSH_DEMO_DIR)
+
+# ----------------------------------------------------------------------
+# Black Box
+# ----------------------------------------------------------------------
+
+bb: tag
+	@for i in $(GMSH_BOX_DIR); do (cd $$i && $(MAKE) \
+           "CC=$(CC)" \
+           "C_FLAGS=-O3" \
+           "OS_FLAGS=-D_UNIX" \
+           "VERSION_FLAGS=" \
+           "GL_INCLUDE=" \
+           "MOTIF_INCLUDE=" \
+        ); done
+	$(CC) -o $(GMSH_BIN_DIR)/gmsh-box $(GMSH_BOX_LIB) -lm
+
+bbn: tag
+	@for i in $(GMSH_BOX_DIR) ; do (cd $$i && $(MAKE) \
+           "CC=g++ -mno-cygwin -I/mingw/include" \
+           "C_FLAGS=-O3" \
+           "OS_FLAGS=-D_UNIX" \
+           "VERSION_FLAGS=" \
+           "GL_INCLUDE=" \
+           "MOTIF_INCLUDE=" \
+        ); done
+	g++ -o $(GMSH_BIN_DIR)/gmsh.exe -mno-cygwin -L/mingw/lib $(GMSH_BOX_LIB) -lm
+
+# ----------------------------------------------------------------------
+# Ready to compile for somes platforms
+# ----------------------------------------------------------------------
+
+#### -O2 merde dans 3d_smesh.c sur TransfiniteHex()
+
+sgi: tag
+	@for i in $(GMSH_DIR); do (cd $$i && $(MAKE) \
+           "CC=CC" \
+           "C_FLAGS=-O2 -o32" \
+           "RANLIB=true"\
+           "OS_FLAGS=-D_UNIX" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+	@for i in mesh; do (cd $$i && $(MAKE) \
+           "CC=CC" \
+           "C_FLAGS=-O1 -o32" \
+           "RANLIB=true"\
+           "OS_FLAGS=-D_UNIX" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+	CC -O2 -o32 -o $(GMSH_BIN_DIR)/gmsh-IRIX $(GMSH_LIB) $(OPENGL_LIB) \
+              $(MOTIF_LIB) $(X_LIB) -lm
+	strip $(GMSH_BIN_DIR)/gmsh-IRIX
+
+little_endian: tag
+	@for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \
+           "CC=g++" \
+           "C_FLAGS=-O3" \
+           "OS_FLAGS=-D_UNIX -D_LITTLE" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+
+little_endian_compat: tag
+	@for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \
+           "CC=i386-glibc21-linux-g++" \
+           "C_FLAGS=-O3" \
+           "OS_FLAGS=-D_UNIX -D_LITTLE" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+
+big_endian: tag
+	@for i in $(GMSH_DISTRIB_DIR); do (cd $$i && $(MAKE) \
+           "CC=g++" \
+           "C_FLAGS=-O3" \
+           "OS_FLAGS=-D_UNIX" \
+           "VERSION_FLAGS=-D_NOTHREADS" \
+           "GL_INCLUDE=$(OPENGL_INC)" \
+           "MOTIF_INCLUDE=$(MOTIF_INC)" \
+        ); done
+
+
+ogl:
+	g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(OPENGL_LIB) $(MOTIF_LIB) $(X_LIB) -lm
+	strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME)
+
+mesa:
+	g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm
+	strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME)
+
+mesa_compat:
+	i386-glibc21-linux-g++ -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm
+	strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME)
+
+dec: little_endian ogl
+
+linux: little_endian mesa
+
+linux-compat: little_endian_compat mesa_compat
+
+ibm: big_endian mesa
+
+sun: big_endian mesa
+
+# HP : special linker option is necessary (+s) + set the SHLIB_PATH variable.
+hp: big_endian
+	g++ -Wl,+s -o $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME) $(GMSH_LIB) $(MESA_LIB) $(MOTIF_LIB) $(X_LIB) -lm
+	strip $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME)
+
+comp:
+	tar cvf gmsh-$(GMSH_UNAME).tar $(GMSH_BIN_DIR)/gmsh-$(GMSH_UNAME)
+	gzip gmsh-$(GMSH_UNAME).tar
+
diff --git a/Mesh/1D_Mesh.cpp b/Mesh/1D_Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f0dfed9e6eb39165fdc90e78d614ed6e3365f14
--- /dev/null
+++ b/Mesh/1D_Mesh.cpp
@@ -0,0 +1,201 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Context.h"
+#include "Interpolation.h"
+#include "Numeric.h"
+
+extern Mesh      *THEM;
+extern Context_T  CTX;
+extern int        CurrentNodeNumber;
+
+Curve *THEC;
+static Vertex *p0, *pn;
+
+double Fun (double t){
+  Vertex der;
+  double d;
+  der = InterpolateCurve (THEC, t, 1);
+  d = sqrt (der.Pos.X * der.Pos.X + der.Pos.Y * der.Pos.Y + der.Pos.Z * der.Pos.Z);
+  return (d);
+}
+
+double F_Transfini (double t){
+  Vertex der;
+  double d, a, b, ZePauwer;
+
+  der = InterpolateCurve (THEC, t, 1);
+  d = sqrt (der.Pos.X * der.Pos.X + der.Pos.Y * der.Pos.Y +
+	    der.Pos.Z * der.Pos.Z);
+
+  if (THEC->dpar[0] == 0.0 || THEC->dpar[0] == 1.0)
+    return (d * (double) THEC->ipar[0] / (THEC->l));
+
+  switch (abs (THEC->ipar[1])){
+
+  case 2:
+    if (sign (THEC->ipar[1]) == -1)
+      ZePauwer = 1. / THEC->dpar[0];
+    else
+      ZePauwer = THEC->dpar[0];
+    b = log (1. / ZePauwer) / THEC->l;
+    a = (1. - exp (-b * THEC->l)) / (b * (double) THEC->ipar[0]);
+    return (d / (a * exp (b * (t * THEC->l))));
+
+  case 1:
+    if (THEC->dpar[0] > 1.0){
+      a = -4. * sqrt (THEC->dpar[0] - 1.) * 
+	atan2 (1., sqrt (THEC->dpar[0] - 1.)) / 
+	((double) THEC->ipar[0] * THEC->l);
+    }
+    else{
+      a = 2. * sqrt (1. - THEC->dpar[0]) * 
+	log (fabs ((1. + 1. / sqrt (1. - THEC->dpar[0])) 
+		   / (1. - 1. / sqrt (1. - THEC->dpar[0]))))
+	/ ((double) THEC->ipar[0] * THEC->l);
+    }
+    b = -a * THEC->l * THEC->l / (4. * (THEC->dpar[0] - 1.));
+    return (d / (-a * DSQR (t * THEC->l - (THEC->l) * 0.5) + b));
+
+  default:
+    Msg(WARNING, "Unknown Case in Transfinite Mesh Line");
+    return 1. ;
+  }
+  
+}
+
+double Flc (double t){
+  double k = THEM->Metric->getLc (t, THEC);
+  return (k);
+}
+
+double CIRC_GRAN = 10.;
+
+void Maillage_Curve (void *data, void *dummy){
+  Curve **pc, *c;
+  Simplex *s;
+  double b, a, d, dt, dp, t;
+  int i, N, count, NUMP;
+  Vertex **v, **vexist, *pV, V, *v1, *v2;
+  List_T *Points;
+  IntPoint P1, P2;
+
+  pc = (Curve **) data;
+  c = *pc;
+  THEC = c;
+
+  if (c->Num < 0)
+    return;
+
+  Msg(INFO, "Meshing Curve %d ", c->Num);
+
+  if (c->Method != TRANSFINI && Extrude_Mesh (c)){
+    Points = List_Create (10, 10, sizeof (IntPoint));
+    c->l = Integration (c->ubeg, c->uend, Fun, Points, 1.e-5);
+    List_Delete (Points);
+  }
+  else{
+    p0 = c->beg;
+    pn = c->end;
+    
+    Points = List_Create (10, 10, sizeof (IntPoint));
+    c->l = Integration (c->ubeg, c->uend, Fun, Points, 1.e-5);
+    List_Delete (Points);
+    
+    if (c->Method == TRANSFINI){
+      Points = List_Create (10, 10, sizeof (IntPoint));
+      a = Integration (c->ubeg, c->uend, F_Transfini, Points, 1.e-7);
+      N = c->ipar[0];
+    }
+    else{
+      Points = List_Create (10, 10, sizeof (IntPoint));
+      a = Integration (c->ubeg, c->uend, Flc, Points, 1.e-5);
+      N = IMAX (2, (int) (a + 1.));
+      if (c->Typ == MSH_SEGM_CIRC ||
+	  c->Typ == MSH_SEGM_CIRC_INV ||
+	  c->Typ == MSH_SEGM_ELLI ||
+	  c->Typ == MSH_SEGM_ELLI_INV){
+	N = IMAX (N, (int) (fabs (c->Circle.t1 - c->Circle.t2) *
+			    CIRC_GRAN / Pi));
+      }
+      else if (c->Typ == MSH_SEGM_NURBS){
+	N = IMAX (N, 2);
+      }
+    }
+    b = a / (double) (N - 1);
+    c->Vertices = List_Create (N, 2, sizeof (Vertex *));
+    
+    v = &c->beg;
+    if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){
+      (*vexist)->u = c->ubeg;
+      Tree_Insert (THEM->Vertices, vexist);
+      if ((*vexist)->ListCurves)
+	List_Add ((*vexist)->ListCurves, &c);
+      List_Add (c->Vertices, vexist);
+    }
+    else{
+      pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y,
+			  (*v)->Pos.Z, (*v)->lc, 0.0);
+      pV->ListCurves = List_Create (1, 1, sizeof (Curve *));
+      List_Add (pV->ListCurves, &c);
+      Tree_Insert (THEM->Vertices, &pV);
+      List_Add (c->Vertices, &pV);
+    }
+
+    count = NUMP = 1;
+    while (NUMP < N - 1){
+      List_Read (Points, count - 1, &P1);
+      List_Read (Points, count, &P2);
+      d = (double) NUMP *b;
+      if ((fabs (P2.p) >= fabs (d)) && (fabs (P1.p) < fabs (d))){
+	dt = P2.t - P1.t;
+	dp = P2.p - P1.p;
+	t = P1.t + dt / dp * (d - P1.p);
+	V = InterpolateCurve (c, t, 0);
+	pV = Create_Vertex (++CurrentNodeNumber, 
+			    V.Pos.X, V.Pos.Y, V.Pos.Z, V.lc, t);
+	pV->w = V.w;
+	pV->ListCurves = List_Create (1, 1, sizeof (Curve *));
+	List_Add (pV->ListCurves, &c);
+	Tree_Insert (THEM->Vertices, &pV);
+	List_Add (c->Vertices, &pV);
+	NUMP++;
+      }
+      else{
+	count++;
+      }
+    }
+
+    v = &c->end;
+    if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){
+      (*vexist)->u = c->uend;
+      Tree_Insert (THEM->Vertices, vexist);
+      if ((*vexist)->ListCurves)
+	List_Add ((*vexist)->ListCurves, &c);
+      List_Add (c->Vertices, vexist);
+    }
+    else{
+      pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0);
+      pV->ListCurves = List_Create (1, 1, sizeof (Curve *));
+      List_Add (pV->ListCurves, &c);
+      Tree_Insert (THEM->Vertices, &pV);
+      List_Add (c->Vertices, &pV);
+    }
+  }
+  for (i = 0; i < List_Nbr (c->Vertices) - 1; i++){
+    List_Read (c->Vertices, i, &v1);
+    List_Read (c->Vertices, i + 1, &v2);
+    s = Create_Simplex (v1, v2, NULL, NULL);
+    s->iEnt = c->Num;
+    Tree_Add (c->Simplexes, &s);
+    List_Add (c->TrsfSimplexes, &s);
+  }
+
+  if (CTX.mesh.degree == 2)
+    Degre2 (THEM->Vertices, THEM->VertexEdges, c->Simplexes, c, NULL);
+
+  THEM->Statistics[4] += List_Nbr (c->Vertices);
+
+}
diff --git a/Mesh/2D_BGMesh.cpp b/Mesh/2D_BGMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e61e0bf80a79c863e8118b4d86a550042ca6801a
--- /dev/null
+++ b/Mesh/2D_BGMesh.cpp
@@ -0,0 +1,74 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+extern Mesh *THEM;
+
+/* Calcul de la longueur caracteristique en un point par
+   interpolation dans le background mesh */
+
+double find_quality (MPoint center, DocRecord * BGMESH){
+
+  int i;
+  Delaunay *del;
+  PointRecord *pPointArray;
+  PointNumero a, b, c;
+  double qual, q1, q2, q3, X[3], Y[3], u, v, det, Xp, Yp;
+  double Exp = 2., r, deno, nume;
+
+  if ((del = Find_Triangle (center, BGMESH, BOF)) == NULL)
+    Msg(WARNING, "Point X=%g Y=%g out of Mesh\n", center.v, center.h);
+
+  pPointArray = BGMESH->points;
+
+  a = del->t.a;
+  b = del->t.b;
+  c = del->t.c;
+
+  Xp = center.h;
+  Yp = center.v;
+
+  X[0] = pPointArray[a].where.h;
+  X[1] = pPointArray[b].where.h;
+  X[2] = pPointArray[c].where.h;
+
+  Y[0] = pPointArray[a].where.v;
+  Y[1] = pPointArray[b].where.v;
+  Y[2] = pPointArray[c].where.v;
+
+  q1 = pPointArray[a].quality;
+  q2 = pPointArray[b].quality;
+  q3 = pPointArray[c].quality;
+
+  det = (X[2] - X[0]) * (Y[1] - Y[0]) - (Y[2] - Y[0]) * (X[1] - X[0]);
+
+  if (det != 0.0){
+    u = ((Xp - X[0]) * (Y[1] - Y[0]) - (Yp - Y[0]) * (X[1] - X[0])) / det;
+    v = ((X[2] - X[0]) * (Yp - Y[0]) - (Y[2] - Y[0]) * (Xp - X[0])) / det;
+  }
+  else{
+    Msg(WARNING, "Degenerated Triangle (det=%g)\n", det);
+    u = v = 0.0;
+  }
+  
+  if (u >= -1.e-8 && v >= -1.e-8 && 1. - u - v >= -1.e-8){
+    qual = q1 * (1. - u - v) + q2 * v + q3 * u;
+    return (qual);
+  }
+  else{
+    pPointArray = BGMESH->points;
+    deno = nume = 0.0;
+    for (i = 0; i < BGMESH->numPoints; i++){
+      r = sqrt (DSQR (center.h - pPointArray[i].where.h) +
+		DSQR (center.v - pPointArray[i].where.v));
+      r = pow (r, Exp);
+      if (r < 1.e-10)
+	return (pPointArray[i].quality);
+      nume += pPointArray[i].quality / r;
+      deno += 1. / r;
+    }
+    return (nume / deno);
+  }
+}
diff --git a/Mesh/2D_Bowyer.cpp b/Mesh/2D_Bowyer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..13c82c7fa7189d5125818c5a438db7238250ca91
--- /dev/null
+++ b/Mesh/2D_Bowyer.cpp
@@ -0,0 +1,189 @@
+/*
+
+   A L G O R I T H M E       D E      B O W Y E R  -  W A T S O N
+
+   definition : il est possible d'obtenir une triangulation de Delaunay en partant 
+   d'une triangulation existante en lui ajoutant un noeud de la facon suivante :
+
+   - on elimine les triangles de la premiere triangulation dont le cercle
+   circonscrit contient le nouveau point
+   - on reconstuit une triangulation en joignant le point aux noeuds du polygone
+   defini par les triangles effaces
+
+   ListEdges = liste liee circulaire et triee contenant les points du polygone
+   listkill = liste des pointeurs des triangles a effacer
+   listDelforLink = liste des triangles a la peripherie du polygone
+   PE_Del_Triangle = Peut-Etre va-t-on effacer le triangle del, si on l'efface alors
+   on appelle recursivement 3 fois PE_Del_Triangle avec ses trois voisins (si il en a)
+   comme argument
+
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+extern PointRecord *gPointArray;
+
+int Is_pt_in_CircCircle (Delaunay * del, MPoint pt){
+
+  double rc, dc, Xa, Ya;
+  PointNumero a;
+
+  dc = DSQR (del->t.xc - pt.h) + DSQR (del->t.yc - pt.v);
+
+  a = del->t.a;
+
+  Xa = gPointArray[a].where.h;
+  Ya = gPointArray[a].where.v;
+
+  rc = DSQR (del->t.xc - Xa) + DSQR (del->t.yc - Ya);
+
+  if (rc >= dc)
+    return 1;
+  return 0;
+
+}
+
+int PE_Del_Triangle (Delaunay *del , MPoint pt, DListPeek *ListEdges ,
+		     List_T *listkill, List_T *listDelforlink,
+		     int *numlink, int *numdel){
+  int rslt;
+  PointNumero a,b,c;
+  int count,order[3],same;
+  DListPeek p;
+  Delaunay *de1,*de2,*de3;
+  
+  rslt = Is_pt_in_CircCircle ( del , pt );
+
+  if ( (!rslt) && (*numdel == 0)) {
+    return(0); 
+  }
+  if (!rslt) {
+
+    /* On retient les triangles du pourtour */ 
+    
+    del->t.info = NOTTOLINK;
+    List_Put(listDelforlink, *numlink, &del);
+    (*numlink)++;
+
+    return(1);
+    
+  }
+  else { 
+    
+    List_Put(listkill, *numdel, &del);
+    (*numdel)++;
+
+    a = del->t.a;
+    b = del->t.b;
+    c = del->t.c;
+
+    if ( *ListEdges == NULL ) {
+      
+      rslt  = DListInsert(ListEdges,pt,a);
+      rslt &= DListInsert(ListEdges,pt,b);
+      rslt &= DListInsert(ListEdges,pt,c);
+      if(!rslt){
+	Msg(ERROR, "List insert error"); 
+      }
+      
+    }
+    else { 
+      
+      count = 0;
+      p = *ListEdges;
+      order[0] = order[1] = order[2] = 0;
+      same = 0;
+      
+      do { 	
+	if (p->point_num == a ) {
+	  same = same + 1;
+	  order[count]=a;
+	  count++ ;
+	}
+	if (p->point_num == b ) {
+	  same = same + 10;
+	  order[count]=b;
+	  count++ ;
+	}
+	if (p->point_num == c ) {
+	  same = same + 100;
+	  order[count]=c;
+	  count++ ;
+	}
+	p = Pred(p);
+      }while ( p != *ListEdges );
+      if (count == 1) {
+	return(0);
+      }
+      else if (count == 2) {
+	if (same == 11 ) {
+	  rslt = DListInsert(ListEdges,pt,c);
+	}
+	if (same == 101 ) {
+	  rslt = DListInsert(ListEdges,pt,b);
+	}
+	if (same == 110 ) {
+	  rslt = DListInsert(ListEdges,pt,a);
+	}
+      }
+      else if (count == 3) {
+	rslt = DListDelete(ListEdges,order[1]);	
+      }
+      else {
+	return(0);
+      }
+    }
+    
+    de1 = del->v.voisin1; 
+    de2 = del->v.voisin2;
+    de3 = del->v.voisin3;
+    
+    
+    if(de1 != NULL){
+      if (de1->v.voisin1 == del )de1->v.voisin1 = NULL;
+	else if (de1->v.voisin2 == del )de1->v.voisin2 = NULL;
+      else if (de1->v.voisin3 == del )de1->v.voisin3 = NULL;
+      else {
+	Msg(ERROR, "Bad Link"); 
+	exit(1);
+      }
+    }
+    if(de2 != NULL){
+      if (de2->v.voisin1 == del )de2->v.voisin1 = NULL;
+      else if (de2->v.voisin2 == del )de2->v.voisin2 = NULL;
+      else if (de2->v.voisin3 == del )de2->v.voisin3 = NULL;
+      else {
+	Msg(ERROR," Bad Link"); 
+	exit(1);
+      }
+    }      
+    if(de3 != NULL){
+      if (de3->v.voisin1 == del )de3->v.voisin1 = NULL;
+      else if (de3->v.voisin2 == del )de3->v.voisin2 = NULL;
+      else if (de3->v.voisin3 == del )de3->v.voisin3 = NULL;
+      else {
+	Msg(ERROR," Bad Link"); 
+	exit(1);
+      }
+    }      
+    
+    del->v.voisin1 = NULL ;
+    del->v.voisin2 = NULL ;
+    del->v.voisin3 = NULL ;
+    
+    
+    if ( de1 != NULL ){
+      if(!PE_Del_Triangle ( de1,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0);
+    }
+    if ( de2 != NULL ){
+      if(!PE_Del_Triangle ( de2,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0);
+    }
+    if ( de3 != NULL ){
+      if(!PE_Del_Triangle ( de3,pt,ListEdges,listkill,listDelforlink, numlink, numdel))return(0);
+    }
+    return(1);
+  }
+}
diff --git a/Mesh/2D_Bricks.cpp b/Mesh/2D_Bricks.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1e8361d2e2c1a4a01e639943db0c93b7b61f94bd
--- /dev/null
+++ b/Mesh/2D_Bricks.cpp
@@ -0,0 +1,329 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+static double       XmaxGrid,YmaxGrid,XminGrid,YminGrid,ZmaxGrid,ZminGrid;
+static double       XminBox,XmaxBox,YminBox,YmaxBox,ZminBox,ZmaxBox;
+static int          Nx=0,Ny=0,Nz=0;
+static List_T      *GridList;
+static DocRecord   *MyMesh;
+
+extern PointRecord *gPointArray;
+
+int fcmp_Map(const void * a, const void * b) {
+  return  ((struct Map *)a)->Num - ((struct Map *)b)->Num ;
+}
+
+void Invert_MappingLists (List_T * List1, List_T * List2) {
+  
+  struct Map    TmpMap1, TmpMap2 ;
+  struct Map  * TmpMap;
+  List_T      * TmpList;
+
+  int i, j, Entity, CurrentEntity;
+
+  TmpList = List_Create(10*List_Nbr(List1), 100, sizeof(int));
+
+  for(i=0 ; i<List_Nbr(List1) ; i++){
+    List_Read(List1, i, &TmpMap1);
+    for(j=0 ; j<List_Nbr(TmpMap1.List) ; j++){
+      List_Read(TmpMap1.List, j, &Entity);
+      List_Add(TmpList, &Entity);
+    }
+  }
+    
+  List_Sort(TmpList, fcmp_int);
+
+  List_Read(TmpList, 0, &CurrentEntity);
+  TmpMap1.Num = CurrentEntity;
+  TmpMap1.List = List_Create(10, 10, sizeof(int));
+  List_Add(List2, &TmpMap1);
+  for(i=1 ; i<List_Nbr(TmpList) ; i++){
+    List_Read(TmpList, i, &Entity);
+    if (Entity != CurrentEntity) {
+      CurrentEntity = Entity;
+      TmpMap1.Num = CurrentEntity;
+      TmpMap1.List = List_Create(10, 10, sizeof(int));
+      List_Add(List2, &TmpMap1);
+    }
+  }
+  
+  for(i=0 ; i<List_Nbr(List1) ; i++){
+    List_Read(List1, i, &TmpMap1);
+    for(j=0 ; j<List_Nbr(TmpMap1.List) ; j++){
+      List_Read(TmpMap1.List, j, &Entity);
+      TmpMap2.Num = Entity;
+      if ((TmpMap = (struct Map*)List_PQuery(List2, &TmpMap2, fcmp_Map)) != NULL) {	
+	List_Add(TmpMap->List, &TmpMap1.Num);
+      }
+    }
+  }
+
+  List_Delete(TmpList);
+
+}
+
+int InWhichBrick (double X, double Y, double Z) {
+
+  int Ix,Iy,Iz;
+
+  if(X > XmaxGrid || X < XminGrid || Y > YmaxGrid || 
+     Y < YminGrid || Z > ZmaxGrid || Z < ZminGrid)
+    return(-1);
+  
+  Ix = (int) ((double)Nx * (X-XminGrid) / (XmaxGrid-XminGrid)); 
+  Iy = (int) ((double)Ny * (Y-YminGrid) / (YmaxGrid-YminGrid)); 
+  Iz = (int) ((double)Nz * (Z-ZminGrid) / (ZmaxGrid-ZminGrid)); 
+  Ix = (Ix< Nx)? Ix : Nx-1;
+  Iy = (Iy< Ny)? Iy : Ny-1;
+  Iz = (Iz< Nz)? Iz : Nz-1;
+  return(1 + Ix + Iy*Nx + Iz*Nx*Ny);
+}
+								    
+List_T *AllBricksForABox (void){  
+
+  List_T *List;
+  int     Ix1,Ix2,Iy1,Iy2,Iz1,Iz2;
+  int     i,j,k,Num;
+
+  Ix1 = (int) ( (double)Nx * (XminBox-XminGrid) / (XmaxGrid-XminGrid)); 
+  Ix2 = (int) ( (double)Nx * (XmaxBox-XminGrid) / (XmaxGrid-XminGrid)); 
+  Iy1 = (int) ( (double)Ny * (YminBox-YminGrid) / (YmaxGrid-YminGrid)); 
+  Iy2 = (int) ( (double)Ny * (YmaxBox-YminGrid) / (YmaxGrid-YminGrid)); 
+  Iz1 = (int) ( (double)Nz * (ZminBox-ZminGrid) / (ZmaxGrid-ZminGrid)); 
+  Iz2 = (int) ( (double)Nz * (ZmaxBox-ZminGrid) / (ZmaxGrid-ZminGrid));
+  Ix1 = (Ix1<Nx)? Ix1 : Nx-1;
+  Ix2 = (Ix2<Nx)? Ix2 : Nx-1;
+  Iy1 = (Iy1<Ny)? Iy1 : Ny-1;
+  Iy2 = (Iy2<Ny)? Iy2 : Ny-1;
+  Iz1 = (Iz1<Nz)? Iz1 : Nz-1;
+  Iz2 = (Iz2<Nz)? Iz2 : Nz-1;
+
+  List = List_Create((Ix2-Ix1+1)*(Iy2-Iy1+1)*(Iz2-Iz1+1), 1, sizeof(int));
+
+  for(i=Ix1;i<=Ix2;i++){
+    for(j=Iy1;j<=Iy2;j++){
+      for(k=Iz1;k<=Iz2;k++){
+	Num = 1 + i + j*Nx + k*Nx*Ny ;
+	List_Add(List, &Num);
+      }
+    }
+  }
+  return(List);
+}
+
+void InitBricks (DocRecord *MESH) {
+
+  int         i,j,a,b,c;
+  List_T     *InvList;
+  struct Map  InvMap;
+  double      X[3],Y[3],dx,dy;
+
+  MyMesh = MESH;
+
+  Nx = (int)sqrt((double)MESH->numTriangles) + 1;
+  Ny = Nx;
+  Nz=1;
+  ZminGrid=0.;
+  ZmaxGrid=1.;
+
+  GridList = List_Create(Nx*Ny*Nz, 1, sizeof(struct Map));
+  InvList  = List_Create(MESH->numTriangles, 1, sizeof(struct Map));
+
+  for(i=0;i<MESH->numTriangles;i++){
+    a = MESH->delaunay[i].t.a;
+    b = MESH->delaunay[i].t.b;
+    c = MESH->delaunay[i].t.c;
+      
+    X[0] = MESH->points[a].where.h;
+    X[1] = MESH->points[b].where.h;
+    X[2] = MESH->points[c].where.h;
+    Y[0] = MESH->points[a].where.v;
+    Y[1] = MESH->points[b].where.v;
+    Y[2] = MESH->points[c].where.v;
+
+    if(!i){
+      XminGrid = XmaxGrid = X[0];
+      YminGrid = YmaxGrid = Y[0];
+    }
+
+    for(j=0;j<3;j++){
+      XmaxGrid = DMAX (XmaxGrid,X[j]); 
+      XminGrid = DMIN (XminGrid,X[j]); 
+      YmaxGrid = DMAX (YmaxGrid,Y[j]); 
+      YminGrid = DMIN (YminGrid,Y[j]); 
+    }
+  }
+  dx = XmaxGrid - XminGrid;
+  dy = YmaxGrid - YminGrid;
+  XmaxGrid += 0.01 * dx;
+  YmaxGrid += 0.01 * dy;
+  XminGrid -= 0.01 * dx;
+  YminGrid -= 0.01 * dy;
+
+  for(i=0;i<MESH->numTriangles;i++){
+    a = MESH->delaunay[i].t.a;
+    b = MESH->delaunay[i].t.b;
+    c = MESH->delaunay[i].t.c;
+      
+    X[0] = XminBox = XmaxBox = MESH->points[a].where.h;
+    X[1] = MESH->points[b].where.h;
+    X[2] = MESH->points[c].where.h;
+    Y[0] = YminBox = YmaxBox = MESH->points[a].where.v;
+    Y[1] = MESH->points[b].where.v;
+    Y[2] = MESH->points[c].where.v;
+
+    for(j=1;j<3;j++){
+      XmaxBox = DMAX ( XmaxBox ,X[j] ); 
+      XminBox = DMIN ( XminBox ,X[j] ); 
+      YmaxBox = DMAX ( YmaxBox ,Y[j] ); 
+      YminBox = DMIN ( YminBox ,Y[j] ); 
+    }
+    ZmaxBox = 1.0;
+    ZminBox = 0.0;
+
+    InvMap.Num = i;
+    InvMap.List = AllBricksForABox(); 
+    List_Add(InvList, &InvMap);
+  }
+
+  Invert_MappingLists(InvList, GridList);
+  List_Delete(InvList);
+}
+
+
+Delaunay * Find_Triangle (MPoint pt, DocRecord *MESH, int typ) {
+
+  int          a,b,c,i,found,KeyBrick,j;
+  Delaunay    *del,*del2; 
+  double       Z,Znew;
+  PointRecord *ptr;
+  double       Xcg,Ycg;
+  struct Map  *pBrick;
+
+  ptr = gPointArray;
+  gPointArray = MESH->points;
+
+  if(MyMesh == MESH){
+    KeyBrick = InWhichBrick(pt.h,pt.v,0.0);
+    if((pBrick = (struct Map *)List_PQuery(GridList, &KeyBrick, fcmp_Map)) == NULL){
+      if(typ == A_TOUT_PRIX){
+	gPointArray = ptr;
+	return(NULL);
+      }
+    }
+    else{
+      for(i=0;i<List_Nbr(pBrick->List);i++){
+	j = *(int *)List_Pointer(pBrick->List,i);
+	a = MESH->delaunay[j].t.a;
+	b = MESH->delaunay[j].t.b;
+	c = MESH->delaunay[j].t.c;
+	if(MESH->delaunay[j].t.position != EXTERN  || typ == BOF){
+	  if(PtInTriangle(pt,a,b,c)){
+	    gPointArray = ptr;
+	    return(&MESH->delaunay[j]);
+	  }
+	}
+      }
+      if(typ == A_TOUT_PRIX) {
+	gPointArray = ptr;
+	return NULL;
+      }
+    }
+  }
+  else {
+    i=0;
+    found = 0;
+    while (!found && i<MESH->numTriangles) {  
+      if( (!PtInTriangle(pt,MESH->delaunay[i].t.a,MESH->delaunay[i].t.b,
+			 MESH->delaunay[i].t.c)) ||
+	 (MESH->delaunay[i].t.position == EXTERN  && typ != BOF ))i++; 
+      else
+	found = 1;
+    };
+    
+    if(found == 1){
+      gPointArray = ptr;
+      return(&(MESH->delaunay[i]));
+    }
+    if(typ == A_TOUT_PRIX){
+      gPointArray = ptr;
+      return NULL;
+    }
+  }
+  
+  del = &(MESH->delaunay[0]);
+
+  Xcg = gPointArray[del->t.a].where.h + 
+        gPointArray[del->t.b].where.h + 
+        gPointArray[del->t.c].where.h;
+
+  Ycg = gPointArray[del->t.a].where.v + 
+        gPointArray[del->t.b].where.v + 
+        gPointArray[del->t.c].where.v;
+
+  Xcg/=3.;
+  Ycg/=3.;
+
+  Z = DSQR(Xcg-pt.h) + DSQR(Ycg-pt.v);
+  
+  for (i=1;i<MESH->numTriangles;i++){
+    del2 = &(MESH->delaunay[i]); 
+    Xcg = gPointArray[del2->t.a].where.h + 
+          gPointArray[del2->t.b].where.h + 
+          gPointArray[del2->t.c].where.h;
+    Ycg = gPointArray[del2->t.a].where.v + 
+          gPointArray[del2->t.b].where.v + 
+          gPointArray[del2->t.c].where.v;
+    Xcg /= 3. ; 
+    Ycg /= 3.;
+    Znew = DSQR(Xcg-pt.h) + DSQR(Ycg-pt.v); 
+    if (Znew<Z){
+      del = del2;
+      Z = Znew;
+    }
+  }
+
+  gPointArray = ptr;
+  return del;
+}
+
+int PtInTriangle(MPoint p , PointNumero a , PointNumero b , PointNumero c){
+  double Xmin , Xmax , Ymin, Ymax , Xtr[4],Ytr[4],A[2],B[2],X,Y,Signus[3];
+  int i;
+  
+  X = p.h;
+  Y = p.v;
+  Xtr[0] = Xmax = Xmin = gPointArray[a].where.h;
+  Xtr[3] = gPointArray[a].where.h;
+  Xtr[1] = gPointArray[b].where.h;
+  Xtr[2] = gPointArray[c].where.h;
+  Ytr[0] = Ymax = Ymin = gPointArray[a].where.v;
+  Ytr[3] = gPointArray[a].where.v;
+  Ytr[1] = gPointArray[b].where.v;
+  Ytr[2] = gPointArray[c].where.v;
+  
+  for(i=1;i<3;i++){
+    Xmin = (Xtr[i]<Xmin)?Xtr[i]:Xmin;
+    Xmax = (Xtr[i]>Xmax)?Xtr[i]:Xmax;
+    Ymin = (Ytr[i]<Ymin)?Ytr[i]:Ymin;
+    Ymax = (Ytr[i]>Ymax)?Ytr[i]:Ymax;
+  }
+  
+  if(X>Xmax || X<Xmin || Y>Ymax || Y<Ymin) return(0);
+  
+  for (i=0;i<3;i++){
+    A[0] = Xtr[i+1] - Xtr[i];
+    A[1] = Ytr[i+1] - Ytr[i];
+    B[0] = X - Xtr[i];
+    B[1] = Y - Ytr[i];
+    Signus[i] = A[0] * B[1] - A[1] * B[0];
+  }
+  for (i=0;i<2;i++){
+    if(( Signus[i] * Signus[i+1] ) <= 0 ) return(0);
+  }
+  return(1);  
+}
+
diff --git a/Mesh/2D_Cylindrical.cpp b/Mesh/2D_Cylindrical.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6c5cdcb4f6fc08a7ec3f93d45659c686df1185c3
--- /dev/null
+++ b/Mesh/2D_Cylindrical.cpp
@@ -0,0 +1,290 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "Context.h"
+#include "Numeric.h"
+
+extern Mesh      *THEM;
+extern Context_T  CTX;
+
+static Surface *SURF;
+double TETAMIN, TETAMAX, TETAFABSMIN;
+
+void ChangePi (void *a, void *dum){
+  Vertex *v;
+  v = *(Vertex **) a;
+
+  if ((v->Pos.X / SURF->Cyl.radius1) >= TETAMIN + .99999 * Pi){
+    Msg(INFO, "%g -> ", v->Pos.X / SURF->Cyl.radius1);
+    v->Pos.X -= (2. * Pi) * SURF->Cyl.radius1;
+    Msg(INFO, "%g -> ", v->Pos.X / SURF->Cyl.radius1);
+  }
+}
+
+void TETAMINMAX (void *a, void *dum){
+  Vertex *v;
+  double ZRepere, S, C, y[3], teta;
+  double p[3], z[3], x[3], o[3];
+
+  v = *(Vertex **) a;
+
+  p[0] = v->Pos.X - SURF->Cyl.center[0];
+  p[1] = v->Pos.Y - SURF->Cyl.center[1];
+  p[2] = v->Pos.Z - SURF->Cyl.center[2];
+  z[0] = SURF->Cyl.zaxis[0];
+  z[1] = SURF->Cyl.zaxis[1];
+  z[2] = SURF->Cyl.zaxis[2];
+  norme (z);
+  prosca (p, z, &ZRepere);
+
+  //ZRepere = fabs(ZRepere);
+
+  o[0] = p[0] - ZRepere * z[0];
+  o[1] = p[1] - ZRepere * z[1];
+  o[2] = p[2] - ZRepere * z[2];
+  x[0] = SURF->Cyl.xaxis[0];
+  x[1] = SURF->Cyl.xaxis[1];
+  x[2] = SURF->Cyl.xaxis[2];
+
+  norme (o);
+  norme (x);
+  prodve (z, x, y);
+  norme (y);
+  prosca (o, x, &C);
+  prosca (o, y, &S);
+  teta = atan2 (S, C);
+  TETAMIN = DMIN (teta, TETAMIN);
+  TETAMAX = DMAX (teta, TETAMAX);
+}
+
+/*      SURFACES CYLINDRIQUES   */
+void XYZtoTZ (void *a, void *dum){
+  Vertex *v;
+  double ZRepere, S, C, y[3], teta;
+  double p[3], z[3], x[3], o[3];
+
+  v = *(Vertex **) a;
+
+  p[0] = v->Pos.X - SURF->Cyl.center[0];
+  p[1] = v->Pos.Y - SURF->Cyl.center[1];
+  p[2] = v->Pos.Z - SURF->Cyl.center[2];
+  z[0] = SURF->Cyl.zaxis[0];
+  z[1] = SURF->Cyl.zaxis[1];
+  z[2] = SURF->Cyl.zaxis[2];
+  norme (z);
+  prosca (p, z, &ZRepere);
+
+  //ZRepere = fabs(ZRepere);
+
+  o[0] = p[0] - ZRepere * z[0];
+  o[1] = p[1] - ZRepere * z[1];
+  o[2] = p[2] - ZRepere * z[2];
+  x[0] = SURF->Cyl.xaxis[0];
+  x[1] = SURF->Cyl.xaxis[1];
+  x[2] = SURF->Cyl.xaxis[2];
+
+  norme (o);
+  norme (x);
+  prodve (z, x, y);
+  norme (y);
+  prosca (o, x, &C);
+  prosca (o, y, &S);
+  teta = atan2 (S, C);
+  Msg(INFO, "pt %d %g %g", v->Num, ZRepere, teta);
+
+  v->Pos.X = teta * SURF->Cyl.radius1;
+  v->Pos.Y = ZRepere;
+  v->Pos.Z = 0.0;
+}
+
+void TZtoXYZ (void *a, void *dum){
+  Vertex *v;
+  double d[3], x[3], prv[3];
+  double XX, YY, ZZ;
+
+  v = *(Vertex **) a;
+  d[0] = SURF->Cyl.zaxis[0];
+  d[1] = SURF->Cyl.zaxis[1];
+  d[2] = SURF->Cyl.zaxis[2];
+  norme (d);
+  x[0] = SURF->Cyl.xaxis[0];
+  x[1] = SURF->Cyl.xaxis[1];
+  x[2] = SURF->Cyl.xaxis[2];
+  norme (x);
+  prodve (d, x, prv);
+  norme (prv);
+
+  XX = SURF->Cyl.center[0] + v->Pos.Y * d[0] +
+    SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[0] +
+    SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[0];
+  YY = SURF->Cyl.center[1] + v->Pos.Y * d[1] +
+    SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[1] +
+    SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[1];
+  ZZ = SURF->Cyl.center[2] + v->Pos.Y * d[2] +
+    SURF->Cyl.radius1 * cos (v->Pos.X / SURF->Cyl.radius1) * x[2] +
+    SURF->Cyl.radius1 * (sin (v->Pos.X / SURF->Cyl.radius1)) * prv[2];
+
+  v->Pos.X = XX;
+  v->Pos.Y = YY;
+  v->Pos.Z = ZZ;
+}
+
+/* SURFACES CONIQUES */
+void XYZtoCone (void *a, void *dum){
+  Vertex *v;
+  double ZRepere, S, C, y[3], teta;
+  double p[3], z[3], x[3], o[3];
+  double inclinaison, ract;
+
+  v = *(Vertex **) a;
+
+  p[0] = v->Pos.X - SURF->Cyl.center[0];
+  p[1] = v->Pos.Y - SURF->Cyl.center[1];
+  p[2] = v->Pos.Z - SURF->Cyl.center[2];
+  z[0] = SURF->Cyl.zaxis[0];
+  z[1] = SURF->Cyl.zaxis[1];
+  z[2] = SURF->Cyl.zaxis[2];
+  norme (z);
+  prosca (p, z, &ZRepere);
+
+  //ZRepere = fabs(ZRepere);
+
+  o[0] = p[0] - ZRepere * z[0];
+  o[1] = p[1] - ZRepere * z[1];
+  o[2] = p[2] - ZRepere * z[2];
+  x[0] = SURF->Cyl.xaxis[0];
+  x[1] = SURF->Cyl.xaxis[1];
+  x[2] = SURF->Cyl.xaxis[2];
+
+  norme (o);
+  norme (x);
+  prodve (z, x, y);
+  norme (y);
+  prosca (o, x, &C);
+  prosca (o, y, &S);
+  teta = atan2 (S, C);
+  if (teta >= TETAMIN + .99999 * Pi)
+    teta -= (2. * Pi);
+
+  inclinaison = Pi * SURF->Cyl.radius2 / 180.;
+
+  ract = SURF->Cyl.radius1 - ZRepere * tan (inclinaison);
+
+  v->Pos.X = ract * cos (teta);
+  v->Pos.Y = ract * sin (teta);
+  v->Pos.Z = 0.0;
+  Msg (INFO, "%g %g", ZRepere, v->Pos.X);
+}
+
+void ConetoXYZ (void *a, void *dum){
+  Vertex *v;
+  double d[3], z, x[3], prv[3];
+  double XX, YY, ZZ;
+  double inclinaison, teta, radiusact;
+
+  v = *(Vertex **) a;
+  d[0] = SURF->Cyl.zaxis[0];
+  d[1] = SURF->Cyl.zaxis[1];
+  d[2] = SURF->Cyl.zaxis[2];
+  norme (d);
+  x[0] = SURF->Cyl.xaxis[0];
+  x[1] = SURF->Cyl.xaxis[1];
+  x[2] = SURF->Cyl.xaxis[2];
+  norme (x);
+  prodve (d, x, prv);
+  norme (prv);
+  inclinaison = Pi * SURF->Cyl.radius2 / 180.;
+  z = (SURF->Cyl.radius1 - myhypot (v->Pos.X, v->Pos.Y)) / tan (inclinaison);
+  radiusact = (SURF->Cyl.radius1 + z * tan (inclinaison));
+  teta = atan2 (v->Pos.Y, v->Pos.X);
+
+  XX = SURF->Cyl.center[0] + z * d[0] +
+    radiusact * cos (teta) * x[0] +
+    radiusact * (sin (teta)) * prv[0];
+  YY = SURF->Cyl.center[1] + z * d[1] +
+    radiusact * cos (teta) * x[1] +
+    radiusact * (sin (teta)) * prv[1];
+  ZZ = SURF->Cyl.center[2] + z * d[2] +
+    radiusact * cos (teta) * x[2] +
+    radiusact * (sin (teta)) * prv[2];
+
+  v->Pos.X = XX;
+  v->Pos.Y = YY;
+  v->Pos.Z = ZZ;
+
+}
+
+int MeshCylindricalSurface (Surface * s){
+
+  return 0;
+
+#if 0 
+
+  int i, j, ori;
+  Curve *pC;
+  Vertex *v;
+  Tree_T *tnxe;
+  char text[256];
+  extern double MAXIMUM_LC_FOR_SURFACE;
+
+  if (s->Typ != MSH_SURF_CYLNDR && s->Typ != MSH_SURF_CONE
+      && s->Typ != MSH_SURF_TORUS)
+    return 0;
+  if (s->Typ == MSH_SURF_TORUS)
+    return 1;
+
+  Msg (INFO, "z %d : %12.5E %12.5E %12.5E", s->Num, s->Cyl.zaxis[0],
+       s->Cyl.zaxis[1], s->Cyl.zaxis[2]);
+  Msg(INFO, "x %d : %12.5E %12.5E %12.5E", s->Num, s->Cyl.xaxis[0],
+      s->Cyl.xaxis[1], s->Cyl.xaxis[2]);
+
+  SURF = s;
+
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &pC);
+    for (j = 0; j < List_Nbr (pC->Vertices); j++){
+      List_Read (pC->Vertices, j, &v);
+      Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j));
+    }
+  }
+  TETAMIN = 2. * Pi;
+  TETAMAX = -2. * Pi;
+  Tree_Action (s->Vertices, TETAMINMAX);
+  Tree_Action (s->Vertices, Freeze_Vertex);
+
+  if (s->Typ == MSH_SURF_CYLNDR)
+    Tree_Action (s->Vertices, XYZtoTZ);
+  else if (s->Typ == MSH_SURF_CONE)
+    Tree_Action (s->Vertices, XYZtoCone);
+
+  Msg(INFO, "%12.5E %12.5E", TETAMAX, TETAMIN);
+
+  if ((s->Typ == MSH_SURF_CYLNDR) && (TETAMAX - TETAMIN > Pi * 1.01))
+    Tree_Action (s->Vertices, ChangePi);
+
+  ori = Calcule_Contours (s);
+  MAXIMUM_LC_FOR_SURFACE = SURF->Cyl.radius1 / 3.;
+
+  if (CTX.mesh.algo == DELAUNAY_OLDALGO)
+    Maillage_Automatique_VieuxCode (s, THEM, ori);
+  else
+    AlgorithmeMaillage2DAnisotropeModeJF (s);
+
+  for(i = 0 ; i < CTX.mesh.nb_smoothing ; i++){
+    tnxe = Tree_Create (sizeof (NXE), compareNXE);
+    create_NXE (s->Vertices, s->Simplexes, tnxe);
+    Tree_Action (tnxe, ActionLiss);
+    Tree_Delete (tnxe);
+  }
+
+  if (s->Typ == MSH_SURF_CYLNDR)
+    Tree_Action (s->Vertices, TZtoXYZ);
+  else if (s->Typ == MSH_SURF_CONE)
+    Tree_Action (s->Vertices, ConetoXYZ);
+  Tree_Action (s->Vertices, deFreeze_Vertex);
+
+  return 1;
+
+#endif
+}
diff --git a/Mesh/2D_DivAndConq.cpp b/Mesh/2D_DivAndConq.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..97e955660c66da5abf3fa6109c9dce9d1261ff4f
--- /dev/null
+++ b/Mesh/2D_DivAndConq.cpp
@@ -0,0 +1,518 @@
+/*
+
+   A L G O R I T H M E    D I V I D E    A N D     C O N Q U E R   
+
+   le noeud de cette methode est de pouvoir fusionner
+   deux triangulations de Delaunay en une seule (routine merge)
+   on procede alors recursivement en separant les points en deux
+   groupes puis en separant les groupes en 2 ... jusqu'a n'obtenir
+   que 1 2 ou 3 points (la triangulation est alors triviale)
+
+   Dans le mailleur, on utilise cet algorithme pour construire 
+   le maillage initial 
+
+   !!! il faut PERTURBER les points d'une faible valeur aleatoire
+   pour eviter d'avoir 3 points alignes ou 4 points cocycliques !!!
+
+   doc : structure contenant la triangulation
+
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+#define EPSILON 1.e-15
+
+extern double LC;
+
+PointRecord *pPointArray;
+DocPeek      gDocTemp;
+
+int Insert(PointNumero a,PointNumero b);
+int Delete(PointNumero a,PointNumero b);
+
+void PushgPointArray(PointRecord *ptr){
+  pPointArray = ptr;
+}
+
+PointRecord *PopgPointArray(void){
+  return(pPointArray) ;
+}
+
+PointNumero Predecessor(PointNumero a, PointNumero b){
+  DListPeek     p;
+  
+  p = pPointArray[a].adjacent;
+  if (p == NULL)
+    return -1;        
+
+  do {
+    if (p->point_num == b) return (Pred(p)->point_num);
+    p = Pred(p);
+  } while (p != pPointArray[a].adjacent);
+
+  return -1;        
+  
+}
+
+
+PointNumero Successor(PointNumero a,PointNumero b){
+  DListPeek     p;
+  
+  p = pPointArray[a].adjacent;
+  if (p == NULL)
+    return -1;
+
+  do {
+    if (p->point_num == b) return (Succ(p)->point_num);
+    p = Succ(p);
+  } while (p != pPointArray[a].adjacent);
+
+  return -1;        
+  
+}
+
+int FixFirst(PointNumero x,PointNumero f){
+  DListPeek  p,copy;
+  int    out = 0;
+  
+  p = pPointArray[x].adjacent;
+  if (p == NULL)
+    return(0);
+  copy = p;
+  do {
+    if (p->point_num == f){
+      pPointArray[x].adjacent = p;
+      out = 1;
+    }
+    else
+      p = p->next;
+  } while ((p != copy) && !out);
+  return out;
+}
+
+PointNumero First(PointNumero x){
+  return (pPointArray[x].adjacent)->point_num;
+}
+
+Segment LowerCommonTangent(DT vl,DT vr){
+  PointNumero   x,y,z,z1,z2,temp;
+  Segment       s;
+  
+  x = vl.end;            /* vu le tri, c'est le point le + a droite     */
+  y = vr.begin;          /* idem, le + a gauche     */
+  z = First(y);
+  z1 = First(x);
+  z2 = Predecessor(x,z1);
+  for (;;) {
+    if (Is_right_of(x,y,z)){
+      temp = z;
+      z = Successor(z,y);
+      y = temp;
+    }
+    else if (Is_right_of(x,y,z2)){
+      temp = z2;
+      z2 = Predecessor(z2,x);
+      x = temp;
+    }
+    else {
+      s.from = x;
+      s.to = y;
+      return s;
+    }
+  }
+}
+
+
+Segment UpperCommonTangent(DT vl,DT vr){
+  PointNumero   x,y,z,z1,z2,temp;
+  Segment       s;
+  
+  x = vl.end;            /* vu le tri, c'est le point le + a droite     */
+  y = vr.begin;          /* idem, le + a gauche     */
+  z = First(y);
+  z1 = First(x);
+  z2 = Predecessor(y,z);
+  for (;;){
+    if (Is_left_of(x,y,z2)){
+      temp = z2;
+      z2 = Predecessor(z2,y);
+      y = temp;     
+    }
+    else if (Is_left_of(x,y,z1)){
+      temp = z1;
+      z1 = Successor(z1,x);
+      x = temp;
+    }
+    else{
+      s.from = x;
+      s.to = y;
+      return s;
+    }
+  }
+}
+
+
+/* return 1 if the point k is NOT in the circumcircle of
+   triangle hij */
+
+int Qtest(PointNumero h,PointNumero i,PointNumero j,PointNumero k){
+  double xc,yc,rcarre,distca;
+  
+  if ((h == i) && (h == j) && (h == k)){
+    Msg(WARNING, "3 points identical"); 
+    return(0);  /* returning 1 will cause looping for ever */
+  }
+  if (CircumCircle( (double) pPointArray[h].where.h,
+		    (double) pPointArray[h].where.v,
+		    (double) pPointArray[i].where.h,
+		    (double) pPointArray[i].where.v,
+		    (double) pPointArray[j].where.h,
+		    (double) pPointArray[j].where.v,
+		    &xc, &yc )){
+    rcarre = square(xc - (double) pPointArray[i].where.h) +
+      square(yc - (double) pPointArray[i].where.v);
+    
+    distca = square(xc - (double) pPointArray[k].where.h) +
+      square(yc - (double) pPointArray[k].where.v);
+    
+    return (distca > rcarre);
+  }
+  else
+      return(0);  /* point not in circle, because no circle !     */
+}
+
+int merge(DT vl,DT vr){
+  Segment      bt,ut;
+  int      a,b,out;
+  PointNumero  r,r1,r2,l,l1,l2;
+  
+  bt = LowerCommonTangent(vl,vr);
+  ut = UpperCommonTangent(vl,vr);
+  l = bt.from;          /* left endpoint of BT     */
+  r = bt.to;            /* right endpoint of BT     */
+  
+  while ((l != ut.from) || (r != ut.to)) {     
+    a = b = 0;
+    if (!Insert(l,r)) return(0);
+    
+    r1 = Predecessor(r,l);
+    if (r1 == -1) return(0);
+    if (Is_right_of(l,r,r1))
+      a = 1;
+    else{
+      out = 0;
+      while (!out){
+	r2 = Predecessor(r,r1);
+	if (r2 == -1) return(0);
+	if (r2 < vr.begin)
+	  out = 1;
+	else if (Qtest(l,r,r1,r2))
+	  out = 1;
+	else{
+	  if (!Delete(r,r1)) return(0);
+	  r1 = r2;
+	  if (Is_right_of(l,r,r1)) out = a = 1;
+	}
+      }
+    }
+      
+    l1 = Successor(l,r);
+    if (l1 == -1) return(0);
+    if (Is_left_of(r,l,l1))
+      b = 1;
+    else{
+      out = 0;
+      while (!out){
+	l2 = Successor(l,l1);
+	if (l2 == -1) return(0);
+	if (l2 > vl.end)
+	  out = 1;
+	else if (Qtest(r,l,l1,l2))
+	  out = 1;
+	else{
+	  if (!Delete(l,l1)) return(0);
+	  l1 = l2;
+	  if (Is_left_of(r,l,l1)) out = b = 1;
+	}     
+      }
+    }
+    
+    if (a)
+      l = l1;
+    else if (b)
+      r = r1;
+    else{
+      if (Qtest(l,r,r1,l1))
+	r = r1;
+      else
+	l = l1;
+    }
+  }
+  if (!Insert(l,r)) return(0);
+  
+  if (!FixFirst(ut.to,ut.from)) return(0);
+  if (!FixFirst(bt.from,bt.to)) return(0);
+  return(1);
+}
+
+
+DT recur_trig(PointNumero left,PointNumero right){
+  int  n,m;
+  DT   dt;
+     
+  dt.begin = left;
+  dt.end = right;
+  n = right - left + 1;      /* nombre de points a triangulariser */
+  switch (n){
+  case 0:
+  case 1:
+    /* 0 ou 1 points -> rien a faire */
+    break;
+    
+  case 2:          /* deux points : cas trivial     */
+    Insert(left,right);
+    FixFirst(left,right);
+    FixFirst(right,left);
+    break;
+    
+  case 3:          /* trois points : cas trivial     */
+    Insert(left,right);
+    Insert(left,left + 1);
+    Insert(left + 1,right);
+    if (Is_right_of(left,right,left + 1)){
+      FixFirst(left,left + 1);
+      FixFirst(left + 1,right);
+      FixFirst(right,left);
+    }
+    else{
+      FixFirst(left,right);
+      FixFirst(left + 1,left);
+      FixFirst(right,left + 1);
+    }
+    break;
+    
+  default:     /* plus de trois points : cas recursif     */
+    m = (left + right) >> 1;
+    if (!merge(recur_trig(left,m),recur_trig(m + 1,right)))
+      
+      break;
+  }
+  return dt;
+}
+
+int comparePoints(const void *i, const void *j){
+  double x,y;
+  
+  x = ((PointRecord *)i)->where.h - ((PointRecord *)j)->where.h;
+  if (x == 0.) {
+    y = ((PointRecord *)i)->where.v - ((PointRecord *)j)->where.v;
+    return ((y < 0.) ? -1 : 1);
+  }
+  else
+    return ((x < 0.) ? -1 : 1);
+}
+
+
+/*  this fonction builds the delaunay triangulation and the voronoi for a
+    window. All error handling is done here. */
+  
+int DelaunayAndVoronoi(DocPeek doc){     
+  PushgPointArray(doc->points); 
+
+  if (doc->numPoints < 2) return(1);
+
+  qsort(doc->points,doc->numPoints,sizeof(PointRecord),comparePoints);
+  gDocTemp = doc;
+  recur_trig(0,doc->numPoints - 1);  
+
+  return 1;        
+}
+
+
+/* this routine puts in xc and yc the coord of the center
+   of the circumcircle of triangle (x1,y1),(x2,y2),(x3,y3)  */
+  
+int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3,
+		     double *xc,double *yc){
+  double d,a1,a2,a3;
+  
+  
+  d = 2. * (double)(y1*(x2-x3)+y2*(x3-x1)+y3*(x1-x2));
+  if (d == 0.0){
+    Msg(WARNING, "Points colinear"); 
+    *xc = *yc = -99999.;      
+    return(0);
+  }
+    
+  a1 = x1*x1 + y1*y1;
+  a2 = x2*x2 + y2*y2;
+  a3 = x3*x3 + y3*y3;
+  *xc = (double) ((a1*(y3-y2) + a2*(y1-y3) + a3*(y2-y1)) / d);
+  *yc = (double) ((a1*(x2-x3) + a2*(x3-x1) + a3*(x1-x2)) / d);
+  
+  if(fabs(d) < EPSILON_LC){
+    Msg(WARNING, "Points almost colinear d = %g (xc = %g, yc = %g)",d,*xc,*yc); 
+  }
+
+  return(1);
+}
+
+
+int Is_right_of(PointNumero x,PointNumero y,PointNumero check){
+  return Is_left_of(y,x,check);
+}
+
+int Is_left_of(PointNumero x,PointNumero y,PointNumero check){
+  static double xx,yy,alpha,beta;
+  
+  yy = (double) (pPointArray[y].where.v - pPointArray[x].where.v);
+  xx = (double) (pPointArray[y].where.h - pPointArray[x].where.h);
+  alpha = atan2(yy,xx);
+  
+  yy = (double) (pPointArray[check].where.v - pPointArray[x].where.v);
+  xx = (double) (pPointArray[check].where.h - pPointArray[x].where.h);
+  beta = atan2(yy,xx) - alpha;
+  if (beta <= 0) beta += Deux_Pi;
+  
+  return ((beta >= 0) && (beta <= Pi));
+}
+
+/* This routine insert the point 'newPoint' in the list dlist,
+   respecting the clock-wise orientation.                              */
+  
+int DListInsert(DListRecord **dlist, MPoint center, PointNumero newPoint){
+  DListRecord  *p, *newp;
+  double        alpha1,alpha,beta,xx,yy;
+  int           first;
+
+  newp = (DListRecord*) Malloc(sizeof(DListRecord));
+  newp->point_num = newPoint;
+
+  if (*dlist == NULL){
+    *dlist = newp;
+    Pred(*dlist) = newp;
+    Succ(*dlist) = newp;
+    return(1);
+  }
+  if (Succ(*dlist) == *dlist){
+    Pred(*dlist) = newp;
+    Succ(*dlist) = newp;
+    Pred(newp) = *dlist;
+    Succ(newp) = *dlist;
+    return(1);
+  }
+  /*  If we are here, the double-linked circular list has 2 or more
+      elements, so we have to calculate where to put the new one.          */
+  
+  p = *dlist;
+  first = p->point_num;
+  
+  /* first, compute polar coord. of the first point.     */
+  yy = (double) (pPointArray[first].where.v - center.v);
+  xx = (double) (pPointArray[first].where.h - center.h);
+  alpha1 = atan2(yy,xx);
+  
+  /* compute polar coord of the point to insert. */
+  yy = (double) (pPointArray[newPoint].where.v - center.v);
+  xx = (double) (pPointArray[newPoint].where.h - center.h);
+  beta = atan2(yy,xx) - alpha1;
+  if (beta <= 0) beta += Deux_Pi;
+  
+  do{
+    yy = (double) (pPointArray[Succ(p)->point_num].where.v - center.v);
+    xx = (double) (pPointArray[Succ(p)->point_num].where.h - center.h);
+    alpha = atan2(yy,xx) - alpha1;
+    if (alpha <= EPSILON) alpha += Deux_Pi;
+    if (alpha >= beta){
+      Succ(newp) = Succ(p);
+      Succ(p) = newp;
+      Pred(newp) = p;
+      Pred(Succ(newp)) = newp;
+      return(1);
+    }
+    p = Succ(p);
+  } while (p != *dlist);
+  
+  /*** ON NE DOIT JAMAIS ARRIVER ICI ***/
+  return(0);
+} 
+
+int Insert(PointNumero a,PointNumero b){
+  int rslt;
+  
+  /* This routine inserts the point 'a' in the adjency list of 'b' and
+     the point 'b' in the adjency list of 'a'.          */
+  
+  rslt = DListInsert(&pPointArray[a].adjacent,pPointArray[a].where,b);
+  rslt &= DListInsert(&pPointArray[b].adjacent,pPointArray[b].where,a);
+
+  return rslt;
+}
+
+
+
+int DListDelete(DListPeek *dlist,PointNumero oldPoint){
+  DListPeek     p;
+  
+  if (*dlist == NULL)
+    return(0);              
+  if (Succ(*dlist) == *dlist){
+    if ((*dlist)->point_num == oldPoint){
+      Free(*dlist);
+      *dlist = NULL;
+      return(1);
+    }
+    else
+      return(0); 
+  }
+  p = *dlist;
+  do{
+    if (p->point_num == oldPoint){
+      Succ(Pred(p)) = Succ(p);
+      Pred(Succ(p)) = Pred(p);
+      if (p == *dlist){
+	*dlist = Succ(p);
+      }
+      Free(p);
+      return(1);
+    }
+    p = Succ(p);
+  } while (p != *dlist);
+  
+  return(0);
+}
+
+
+/* This routine removes the point 'a' in the adjency list of 'b' and
+   the point 'b' in the adjency list of 'a'.          */
+  
+int Delete(PointNumero a,PointNumero b){
+  int  rslt;
+  
+  rslt = DListDelete(&pPointArray[a].adjacent,b);
+  rslt &= DListDelete(&pPointArray[b].adjacent,a);
+
+  return rslt;
+}
+
+/*  Cette routine efface toutes les listes d'adjacence du pPointArray. */
+
+void remove_all_dlist(int n, PointRecord *pPointArray){
+  int       i;
+  DListPeek p,temp;
+  
+  for (i=0;i<n;i++)
+    if (pPointArray[i].adjacent != NULL){
+      p = pPointArray[i].adjacent;
+      do{
+	temp = p;
+	p = Pred(p);
+	Free(temp);          
+      } while (p != pPointArray[i].adjacent);
+      pPointArray[i].adjacent = NULL;     
+    }
+}
+
diff --git a/Mesh/2D_Elliptic.cpp b/Mesh/2D_Elliptic.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..488d945b6c9040c186264873d5ebad5a62cde852
--- /dev/null
+++ b/Mesh/2D_Elliptic.cpp
@@ -0,0 +1,235 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+
+extern Mesh *THEM;
+extern int CurrentNodeNumber;
+
+int MeshEllipticSurface (Surface * sur){
+
+  int i, j, k, nb, N1, N2, N3, N4;
+  Curve *GG[444];
+  Vertex  **list;
+  Simplex *simp;
+  double alpha, beta, gamma, u, v, lc, x, y, z;
+  Vertex *S[4], *v11, *v12, *v13, *v21, *v22, *v23, *v31, *v32, *v33;
+  List_T *l1, *l2, *l3, *l4;
+
+  if (sur->Method != ELLIPTIC)
+    return (0);
+
+  nb = List_Nbr (sur->s.Generatrices);
+  if (nb < 4)
+    return (0);
+
+  for (i = 0; i < nb; i++){
+    List_Read (sur->s.Generatrices, i, &GG[i]);
+  }
+
+  if (!(S[0] = FindVertex (sur->ipar[0], THEM)))
+    return 0;
+  if (!(S[1] = FindVertex (sur->ipar[1], THEM)))
+    return 0;
+  if (!(S[2] = FindVertex (sur->ipar[2], THEM)))
+    return 0;
+  if (!(S[3] = FindVertex (sur->ipar[3], THEM)))
+    return 0;
+  N1 = N2 = N3 = N4 = 0;
+  /*Remplissure de la premiere cuvee de merde */
+  l1 = List_Create (20, 10, sizeof (Vertex *));
+  for (i = 0; i < nb; i++){
+    if (!compareVertex (&GG[i]->beg, &S[0])){
+      j = i;
+      do{
+	if (!List_Nbr (l1))
+	  List_Add (l1, List_Pointer (GG[j]->Vertices, 0));
+	for (k = 1; k < List_Nbr (GG[j]->Vertices); k++)
+	  List_Add (l1, List_Pointer (GG[j]->Vertices, k));
+	j = (j + 1 < nb) ? j + 1 : 0;
+	if (j == i)
+	  return 0;
+      }
+      while (compareVertex (&GG[j]->beg, &S[1]));
+    }
+  }
+  /*Remplissure de la deuxieme cuvee de merde */
+  l2 = List_Create (20, 10, sizeof (Vertex *));
+  for (i = 0; i < nb; i++){
+    if (!compareVertex (&GG[i]->beg, &S[1])){
+      j = i;
+      do{
+	if (!List_Nbr (l2))
+	  List_Add (l2, List_Pointer (GG[j]->Vertices, 0));
+	for (k = 1; k < List_Nbr (GG[j]->Vertices); k++)
+	  List_Add (l2, List_Pointer (GG[j]->Vertices, k));
+	j = (j + 1 < nb) ? j + 1 : 0;
+	if (j == i)
+	  return 0;
+      }
+      while (compareVertex (&GG[j]->beg, &S[2]));
+    }
+  }
+  /*Remplissure de la TROISIEME cuvee de merde */
+  l3 = List_Create (20, 10, sizeof (Vertex *));
+  for (i = 0; i < nb; i++){
+    if (!compareVertex (&GG[i]->beg, &S[2])){
+      j = i;
+      do{
+	if (!List_Nbr (l3))
+	  List_Add (l3, List_Pointer (GG[j]->Vertices, 0));
+	for (k = 1; k < List_Nbr (GG[j]->Vertices); k++)
+	  List_Add (l3, List_Pointer (GG[j]->Vertices, k));
+	j = (j + 1 < nb) ? j + 1 : 0;
+	if (j == i)
+	  return 0;
+      }
+      while (compareVertex (&GG[j]->beg, &S[3]));
+    }
+  }
+  /*Remplissure de la quatrieme cuvee de merde */
+  l4 = List_Create (20, 10, sizeof (Vertex *));
+  for (i = 0; i < nb; i++){
+    if (!compareVertex (&GG[i]->beg, &S[3])){
+      j = i;
+      do{
+	if (!List_Nbr (l4))
+	  List_Add (l4, List_Pointer (GG[j]->Vertices, 0));
+	for (k = 1; k < List_Nbr (GG[j]->Vertices); k++)
+	  List_Add (l4, List_Pointer (GG[j]->Vertices, k));
+	j = (j + 1 < nb) ? j + 1 : 0;
+	if (j == i)
+	  return 0;
+      }
+      while (compareVertex (&GG[j]->beg, &S[0]));
+    }
+  }
+  N1 = List_Nbr (l1);
+  N2 = List_Nbr (l2);
+  N3 = List_Nbr (l3);
+  N4 = List_Nbr (l4);
+  if (N1 != N3 || N2 != N4){
+    List_Delete (l1);
+    List_Delete (l2);
+    List_Delete (l3);
+    List_Delete (l4);
+    return 0;
+  }
+
+
+  sur->Nu = N1;
+  sur->Nv = N2;
+  list = (Vertex **) Malloc (N1 * N2 * sizeof (Vertex *));
+
+  for (i = 0; i < N1; i++){
+    for (j = 0; j < N2; j++){
+      if (i == 0){
+	List_Read (l4, N2 - j - 1, &list[i + N1 * j]);
+      }
+      else if (i == N1 - 1){
+	List_Read (l2, j, &list[i + N1 * j]);
+      }
+      else if (j == 0){
+	List_Read (l1, i, &list[i + N1 * j]);
+      }
+      else if (j == N2 - 1){
+	List_Read (l3, N1 - i - 1, &list[i + N1 * j]);
+      }
+      else{
+	u = 1. - 2. * (double) i / double (N1 - 1);
+	v = 1. - 2. * (double) j / double (N2 - 1);
+	x = 0.25 * ((S[0]->Pos.X * (1 + u) * (1. + v)) +
+		    (S[1]->Pos.X * (1 - u) * (1. + v)) +
+		    (S[2]->Pos.X * (1 - u) * (1. - v)) +
+		    (S[3]->Pos.X * (1 + u) * (1. - v)));
+	y = 0.25 * ((S[0]->Pos.Y * (1 + u) * (1. + v)) +
+		    (S[1]->Pos.Y * (1 - u) * (1. + v)) +
+		    (S[2]->Pos.Y * (1 - u) * (1. - v)) +
+		    (S[3]->Pos.Y * (1 + u) * (1. - v)));
+	z = 0.25 * ((S[0]->Pos.Z * (1 + u) * (1. + v)) +
+		    (S[1]->Pos.Z * (1 - u) * (1. + v)) +
+		    (S[2]->Pos.Z * (1 - u) * (1. - v)) +
+		    (S[3]->Pos.Z * (1 + u) * (1. - v)));
+	lc = 0.25 * ((S[0]->lc * (1 + u) * (1. + v)) +
+		     (S[1]->lc * (1 - u) * (1. + v)) +
+		     (S[2]->lc * (1 - u) * (1. - v)) +
+		     (S[3]->lc * (1 + u) * (1. - v)));
+	
+	list[i + N1 * j] = Create_Vertex (++CurrentNodeNumber, x, y, z, lc, 0.0);
+      }
+    }
+  }
+  
+  k = 0;
+  
+  while (1){
+    k++;
+    if (k > 1000)
+      break;
+    for (i = 1; i < N1 - 1; i++){
+      for (j = 1; j < N2 - 1; j++){
+	v11 = list[i - 1 + N1 * (j - 1)];
+	v12 = list[i + N1 * (j - 1)];
+	v13 = list[i + 1 + N1 * (j - 1)];
+	v21 = list[i - 1 + N1 * (j)];
+	v22 = list[i + N1 * (j)];
+	v23 = list[i + 1 + N1 * (j)];
+	v31 = list[i - 1 + N1 * (j + 1)];
+	v32 = list[i + N1 * (j + 1)];
+	v33 = list[i + 1 + N1 * (j + 1)];
+	
+	alpha = 0.25 * (DSQR (v23->Pos.X - v21->Pos.X) +
+			DSQR (v23->Pos.Y - v21->Pos.Y));
+	gamma = 0.25 * (DSQR (v32->Pos.X - v12->Pos.X) +
+			DSQR (v32->Pos.Y - v12->Pos.Y));
+	beta = 0.0625 * ((v32->Pos.X - v12->Pos.X) *
+			 (v23->Pos.X - v21->Pos.X) +
+			 (v32->Pos.Y - v12->Pos.Y) *
+			 (v23->Pos.Y - v21->Pos.Y));
+	
+	v22->Pos.X = 0.5 * (alpha * (v32->Pos.X + v12->Pos.X) +
+			    gamma * (v23->Pos.X + v21->Pos.X) -
+			    2. * beta * (v33->Pos.X - v13->Pos.X - v31->Pos.X + v11->Pos.X))
+	  / (alpha + gamma);
+	v22->Pos.Y = 0.5 * (alpha * (v32->Pos.Y + v12->Pos.Y) +
+			    gamma * (v23->Pos.Y + v21->Pos.Y) -
+			    2. * beta * (v33->Pos.Y - v13->Pos.Y - v31->Pos.Y + v11->Pos.Y))
+	  / (alpha + gamma);
+	v22->Pos.Z = 0.5 * (alpha * (v32->Pos.Z + v12->Pos.Z) +
+			    gamma * (v23->Pos.Z + v21->Pos.Z) -
+			    2. * beta * (v33->Pos.Z - v13->Pos.Z - v31->Pos.Z + v11->Pos.Z))
+	  / (alpha + gamma);
+	
+      }
+    }
+    
+  }
+  for (i = 0; i < N1 - 1; i++){
+    for (j = 0; j < N2 - 1; j++){
+      if (sur->Recombine){
+	simp = Create_Simplex (list[(i) + N1 * (j)], list[(i + 1) + N1 * (j)],
+			       list[(i + 1) + N1 * (j + 1)], NULL);
+	simp->iEnt = sur->Num;
+	simp->V[3] = list[i + N1 * (j + 1)];
+	Tree_Add (sur->Simplexes, &simp);
+	List_Add (sur->TrsfSimplexes, &simp);
+      }
+      else{
+	simp = Create_Simplex (list[(i) + N1 * (j)], list[(i + 1) + N1 * (j)],
+			       list[(i) + N1 * (j + 1)], NULL);
+	simp->iEnt = sur->Num;
+	Tree_Add (sur->Simplexes, &simp);
+	List_Add (sur->TrsfSimplexes, &simp);
+	
+	simp = Create_Simplex (list[(i + 1) + N1 * (j + 1)], list[(i) + N1 * (j + 1)],
+			       list[(i + 1) + N1 * (j)], NULL);
+	simp->iEnt = sur->Num;
+	Tree_Add (sur->Simplexes, &simp);
+	List_Add (sur->TrsfSimplexes, &simp);
+      }
+    }
+  }
+  return 1;
+}
diff --git a/Mesh/2D_InitMesh.cpp b/Mesh/2D_InitMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cca8c0df992f151efbec4fa272aac00a50dcbf71
--- /dev/null
+++ b/Mesh/2D_InitMesh.cpp
@@ -0,0 +1,428 @@
+/*
+ 
+   Generation du maillage initial 2D
+
+   Dans l'algorithme de maillage, on doit creer un maillage initial a l'aide
+   de contours orientes aire a doite. Deux types de problemes peuvent se presenter :
+
+       1) probleme courant : un triangle se trouve a l'exterieur du contour, il faut
+       que sa variable de localisation soit declaree externe.  
+
+       2) probleme rare : une arete du contour n'a pas ete creee
+
+       On procede comme suit :
+       trouve le triangle, on procede de la facon suivante :
+          - on trie les aretes de tous les triangles ;
+	  - Pour chaque contour on prend chaque arete orientee ;
+	  - Si cette arete n'existe pas (bsearch return false) alors on cherche
+	  les 2 triangles reliant cette arete et on les modifie
+	  - Si cette arete possede 2 triangles adjacents, on declare externe 
+	  le triangle dont le troisieme noeud se trouve a gauche de l'arete.
+
+	  illustration
+          ------------
+
+	  probleme 1) + = point du contour
+	  
+
+                                        3
+                        - -  + --------+     +
+                   + - -     1 \      /                +
+                                \    /                       +
+                                 \  /                                   +
+	     +                     +
+                                   2       3 a gauche de 1-2 -> tr externe
+
+
+	   probleme 2) arete inexistante 1-2
+	   
+	               +,*,@ contours
+	   
+	             +1       	             +            
+	            / \                     /|\
+                   /   \                   / | \
+                  /     \                 /  |  \
+                 /       \               /   |   \
+                *         @   --->      *----+----@ 
+                 \       /               \   |   /
+                  \     /                 \  |  /
+                   \   /                   \ | /
+                    \ /                     \|/
+                     +2                      +
+
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+#include "Numeric.h"
+
+static int            pointA,pointB,Counter,Stagnant,StopNow;
+static Tree_T        *ETree,*EDToSwap;
+
+extern PointRecord   *gPointArray;
+
+int                  *permut;
+
+typedef struct {
+  int from;
+  int to;
+  int NbOccur;
+  Delaunay *Liste[2];
+}ED;
+
+
+void makepermut (int numpoints){  
+  int i, ip ;  
+  permut = (int *) Malloc (numpoints * sizeof (int));
+  for ( i=0 ; i<numpoints ; i++ ){    
+    ip = gPointArray[i].permu;
+    permut[ip] = i;    
+  }
+}  
+
+int crossED ( ED * e ){  
+  double Xma,Xmb,Yma,Ymb,det,t,q;
+  double XMa,XMb,YMa,YMb;
+  double xa1,xa2,ya1,ya2;
+  double xb1,xb2,yb1,yb2;
+  
+  xa1 = gPointArray[pointA].where.h;
+  xa2 = gPointArray[pointB].where.h;
+  ya1 = gPointArray[pointA].where.v;
+  ya2 = gPointArray[pointB].where.v;
+  
+  xb1 = gPointArray[e->from].where.h;
+  xb2 = gPointArray[e->to].where.h;
+  yb1 = gPointArray[e->from].where.v;
+  yb2 = gPointArray[e->to].where.v;
+
+  Xma = DMIN(xa1,xa2);
+  Xmb = DMIN(xb1,xb2);
+
+  XMa = DMAX(xa1,xa2);
+  XMb = DMAX(xb1,xb2);
+
+  if(XMa < Xmb || XMb < Xma)return(0);
+
+  Yma = DMIN(ya1,ya2);
+  Ymb = DMIN(yb1,yb2);
+
+  YMa = DMAX(ya1,ya2);
+  YMb = DMAX(yb1,yb2);
+
+  if(YMa < Ymb || YMb < Yma)return(0);
+
+  det = (xa2 - xa1)*(yb1-yb2) - (xb1 - xb2)*(ya2-ya1); 
+
+  if(det == 0.0){
+    return(0);
+  }
+
+  t = ((xb1 - xa1)*(yb1-yb2) - (xb1 - xb2)*(yb1-ya1))/det; 
+  q = ((xa2 - xa1)*(yb1-ya1) - (ya2 - ya1)*(xb1-xa1))/det; 
+
+  if(t>1. || t<0.)return(0);
+  if(q>1. || q<0.)return(0);
+  return(1);
+}
+ 
+int compareED2 (const void *a, const void *b){
+  ED *q,*w;
+  q=(ED*)a;
+  w=(ED*)b;
+  if(q->NbOccur > w->NbOccur)return(-1);
+  if(q->NbOccur < w->NbOccur)return(1);
+  if(q->from > w->from)return(1);
+  if(q->from < w->from)return(-1);
+  if(q->to > w->to)return(1);
+  if(q->to < w->to)return(-1);
+  return(0);
+}
+
+int compareED (const void *a, const void *b){
+  ED *q,*w;
+  q=(ED*)a;
+  w=(ED*)b;
+  if(q->from > w->from)return(1);
+  if(q->from < w->from)return(-1);
+  if(q->to > w->to)return(1);
+  if(q->to < w->to)return(-1);
+  return(0);
+}
+
+void DoWeSwapED ( void *data , void *dummy){
+  ED *e;
+
+  e = (ED*)data;
+  
+  if(e->from == pointA || e->from == pointB || 
+     e->to   == pointA || e->to   == pointB){
+    return;
+  }
+  else if ( Tree_PQuery ( EDToSwap,e) ){
+  }    
+  else if ( crossED ( e ) ) {    
+    Tree_Add ( EDToSwap ,e);
+  }
+}
+
+void Print ( void *data , void *dummy){
+  ED *e;
+
+  e = (ED*)data;
+  Msg(INFO,"%d %d",e->from,e->to); 
+}
+
+void SwapED ( void *data , void *dummy){
+  ED *e,E;
+  int from,to;
+
+  e = (ED*)data;
+
+  if(Stagnant && Counter <= StopNow)return;
+  else if(Stagnant)Counter++;
+
+  if(e->from != e->Liste[0]->t.a && e->from != e->Liste[0]->t.b &&
+     e->from != e->Liste[0]->t.c )
+    return;
+  if(e->from != e->Liste[1]->t.a && e->from != e->Liste[1]->t.b &&
+     e->from != e->Liste[1]->t.c )
+    return;
+  if(e->to != e->Liste[0]->t.a && e->to != e->Liste[0]->t.b &&
+     e->to != e->Liste[0]->t.c )
+    return;
+  if(e->to != e->Liste[1]->t.a && e->to != e->Liste[1]->t.b &&
+     e->to != e->Liste[1]->t.c )
+    return;
+  
+
+  if(e->from != e->Liste[0]->t.a && e->to != e->Liste[0]->t.a) 
+    from = e->Liste[0]->t.a;
+  else if(e->from != e->Liste[0]->t.b && e->to != e->Liste[0]->t.b) 
+    from = e->Liste[0]->t.b;
+  else if(e->from != e->Liste[0]->t.c && e->to != e->Liste[0]->t.c) 
+    from = e->Liste[0]->t.c;
+
+  if(e->from != e->Liste[1]->t.a && e->to != e->Liste[1]->t.a) 
+    to = e->Liste[1]->t.a;
+  else if(e->from != e->Liste[1]->t.b && e->to != e->Liste[1]->t.b) 
+    to = e->Liste[1]->t.b;
+  else if(e->from != e->Liste[1]->t.c && e->to != e->Liste[1]->t.c) 
+    to = e->Liste[1]->t.c;
+
+  pointA = e->from;
+  pointB = e->to;
+  E.from = from;
+  E.to   = to;
+  if(!crossED(&E))return;
+
+  e->Liste[0]->t.a = from;
+  e->Liste[0]->t.b = to;
+  e->Liste[0]->t.c = e->from;
+  
+  e->Liste[1]->t.a = from;
+  e->Liste[1]->t.b = to;
+  e->Liste[1]->t.c = e->to;
+
+  e->from = IMAX(from,to);
+  e->to =   IMIN(from,to);
+}
+  
+void SuppressInETree( void *data , void *dummy){
+  if(!Tree_Suppress(ETree,data))
+    Msg(WARNING, "Cannot suppress in ETree"); 
+}
+
+void AddInETree( void *data , void *dummy){
+  Tree_Add(ETree,data);
+}
+
+int verifie_cas_scabreux (int pa, int pb, ContourRecord **ListContours, int Nc){
+  ED Edge;
+  int i,k,a,b;
+  ContourRecord *contour;
+    
+
+  Edge.from = IMAX(pa,pb);
+  Edge.to   = IMIN(pa,pb);
+  for(k=0;k<Nc;k++){
+    contour = ListContours[k];
+    for ( i = -1 ; i < (contour->numpoints - 1) ; i++) {      
+      if(i == -1){
+	a = permut [ contour->oriented_points[0].permu ];
+	b = permut [ contour->oriented_points[contour->numpoints - 1].permu ];
+      }
+      else{
+	a = permut [ contour->oriented_points[i].permu ];
+	b = permut [ contour->oriented_points[i+1].permu ];
+      }
+      
+      pointA = IMAX(a,b);
+      pointB = IMIN(a,b);
+      if(a != pa && b != pa && a != pb && b != pb)
+	if(crossED(&Edge)) return (1);
+    }
+  }  
+  return (0);
+}
+
+void verify_edges (List_T *ListDelaunay, ContourRecord **ListContour, 
+		   int NumContours , int NumDelaunay){
+
+  ED   *pEdge;
+  ED   Edge; 
+  int  ok,max,i,k,c,a,b; 
+  ContourRecord *contour;
+  Delaunay *del_P;
+
+  max = 100;
+
+  c = 0;
+  do {
+    c++;
+    if(c>max)break;
+    ETree = Tree_Create ( sizeof (Edge) , compareED );
+    for (i=0;i< NumDelaunay;i++) {
+
+      del_P = *(Delaunay**)List_Pointer(ListDelaunay, i);
+
+      Edge.from = IMAX ( del_P->t.a, del_P->t.b );
+      Edge.to   = IMIN ( del_P->t.a, del_P->t.b );
+      Edge.NbOccur = 1;
+
+      if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ 
+	pEdge->Liste[1] = del_P;
+      }
+      else {
+	Edge.Liste[0] = del_P;
+	Tree_Add (ETree,&Edge);
+      }
+      
+      Edge.from = IMAX ( del_P->t.a, del_P->t.c );
+      Edge.to   = IMIN ( del_P->t.a, del_P->t.c );
+      
+      if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ 
+	pEdge->Liste[1] = del_P;
+      }
+      else {
+	Edge.Liste[0] = del_P;
+	Tree_Add (ETree,&Edge);
+      }
+      
+      Edge.from = IMAX ( del_P->t.c, del_P->t.b );
+      Edge.to   = IMIN ( del_P->t.c, del_P->t.b );
+      
+      if((pEdge = (ED*)Tree_PQuery(ETree,&Edge))){ 
+	pEdge->Liste[1] = del_P;
+      }
+      else {
+	Edge.Liste[0] = del_P;
+	Tree_Add (ETree,&Edge);
+      }
+    }
+    
+    ok = 0;
+    for(k=0;k<NumContours;k++){
+      contour = ListContour[k];
+      for ( i = -1 ; i < contour->numpoints - 1 ; i++){      
+	
+	if(i == -1){
+	  a   = permut [ contour->oriented_points[0].permu ];
+	  b   = permut [ contour->oriented_points[contour->numpoints - 1].permu ];
+	}
+	else{
+	  a   = permut [ contour->oriented_points[i].permu ];
+	  b   = permut [ contour->oriented_points[i+1].permu ];
+	}
+	
+	Edge.from = IMAX(a,b);
+	Edge.to   = IMIN(a,b);
+	
+	if(!Tree_Search( ETree , &Edge ))ok++;; 
+      }
+    }
+
+    if(!ok){
+      return;
+    }
+    Msg(WARNING, "Swapping : %d missing edges",ok); 
+    
+    EDToSwap = NULL;
+    if(EDToSwap)Tree_Delete(EDToSwap);
+    EDToSwap = Tree_Create (sizeof(ED),compareED2);
+    for(k=0;k<NumContours;k++){
+      contour = ListContour[k];
+      for ( i = -1 ; i < contour->numpoints - 1 ; i++){      
+	
+	if(i == -1){
+	  a   = permut [ contour->oriented_points[0].permu ];
+	  b   = permut [ contour->oriented_points[contour->numpoints - 1].permu ];
+	}
+	else{
+	  a   = permut [ contour->oriented_points[i].permu ];
+	  b   = permut [ contour->oriented_points[i+1].permu ];
+	}
+	
+	pointA = IMAX(a,b);
+	pointB = IMIN(a,b);
+	
+	Tree_Action ( ETree , DoWeSwapED ); 
+	
+      }
+    }
+    Msg(WARNING, "Elimination : %d swaps", Tree_Nbr(EDToSwap)); 
+
+    Tree_Action (EDToSwap , SuppressInETree);
+    Tree_Action (EDToSwap , SwapED);
+    Tree_Action (EDToSwap , AddInETree);
+  }while(Tree_Nbr(EDToSwap));
+/*
+  Tree_Delete(EDToSwap);
+  Tree_Delete(ETree);
+*/
+}
+
+
+
+int comparepermu(const void *i, const void *j){
+  return ( gPointArray[*(PointNumero *)i].permu - gPointArray[*(PointNumero *)j].permu);
+}
+
+void verify_inside (Delaunay * ListDelaunay ,  int NumDelaunay ){
+
+  PointNumero pt[3], compare, a, b;
+  int         i, inside, cont[3];
+
+  for ( i=0 ; i < NumDelaunay  ; i++){
+    
+    pt[0] = ListDelaunay[i].t.a;
+    pt[1] = ListDelaunay[i].t.b;
+    pt[2] = ListDelaunay[i].t.c;
+    qsort(pt,3,sizeof(PointNumero),comparepermu);
+
+    cont[0] = gPointArray[pt[0]].numcontour;
+    cont[1] = gPointArray[pt[1]].numcontour;
+    cont[2] = gPointArray[pt[2]].numcontour;
+
+
+    if((cont[1] != cont[2])||(cont[0]!=cont[1])||(cont[0]!=cont[2]))
+      inside = 1;
+    else
+      inside = 0;
+
+
+    a = pt[0];
+    b = pt[1];
+    compare = pt[2];
+    
+    if ((Is_left_of ( a,b,compare  ) && (inside == 0))){
+      ListDelaunay[i].t.position = EXTERN ;
+    }
+
+  }
+  return;
+  
+}      
+
diff --git a/Mesh/2D_Links.cpp b/Mesh/2D_Links.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..43f89c514749af2017b282e4b9f3e63dafa64532
--- /dev/null
+++ b/Mesh/2D_Links.cpp
@@ -0,0 +1,270 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+extern PointRecord  *gPointArray;
+extern int           LocalNewPoint;
+extern DocRecord    *FGMESH;
+
+extern PointNumero First(PointNumero x);
+
+/* compte les points sur le polygone convexe */
+
+int CountPointsOnHull(int n, PointRecord *pPointArray){
+  PointNumero p,p2,temp;
+  int i;
+  
+  if (pPointArray[0].adjacent == NULL) return 0;
+  i = 1;
+  p = 0;
+  p2 = First(0);
+  while ((p2 != 0) && (i < n)) {
+    i++;
+    temp = p2;
+    p2 = Successor(p2,p);
+    p = temp;
+  }
+  return ((i <= n) ? i : -1);
+}
+
+
+PointNumero *ConvertDlistToArray(DListPeek *dlist,int *n){
+  DListPeek		p,temp;
+  int		        i,max = 0;
+  PointNumero		*ptr;
+	
+  p = *dlist;
+  do{
+    max++;
+    p = Pred(p);	
+  } while (p != *dlist);
+  ptr = (PointNumero *) Malloc((int) ((max+1) * sizeof(PointNumero)));
+  if (ptr == NULL) return NULL;
+  p = *dlist;
+  for (i=0;i<max;i++){
+    ptr[i] = p->point_num;
+    temp = p;
+    p = Pred(p);
+    Free(temp);
+  }
+  ptr[max]=ptr[0];
+  *dlist = NULL;
+  *n = max;
+  return ptr;
+}
+
+
+/* Convertir les listes d'adjacence en triangles */
+
+int Conversion(DocPeek doc ){
+
+  /* on suppose que n >= 3	gPointArray est suppose OK. */
+
+  Striangle *striangle;
+  int n,i,j;
+  int count = 0,count2 = 0;
+  PointNumero aa,bb,cc;
+  PointRecord *ptemp;
+
+  ptemp = gPointArray;
+  gPointArray = doc->points;  
+		
+  n = doc->numPoints;
+  striangle = (Striangle *) Malloc((int) (n * sizeof(Striangle)));
+  count2 = (int) CountPointsOnHull(n,doc->points);
+
+  /* nombre de triangles que l'on doit obtenir */
+  count2 = 2 * (n - 1) - count2;	
+	
+  doc->delaunay = (Delaunay *) Malloc(2*count2 * sizeof(Delaunay));
+
+  for (i=0;i<n;i++){
+    /* on cree une liste de points connectes au point i (t) + nombre de points (t_length) */    
+    striangle[i].t = ConvertDlistToArray(&gPointArray[i].adjacent,&striangle[i].t_length);
+    striangle[i].info = NULL;
+    striangle[i].info_length = 0;
+  }
+
+  /* on balaye les noeuds de gauche a droite -> on cree les triangles  */
+  count = 0;
+  for (i=0;i<n;i++){
+    for (j=0;j<striangle[i].t_length;j++){
+      if ( ( striangle[i].t[j] > i) && ( striangle[i].t[j+1] > i) && 
+	   (Is_right_of(i,striangle[i].t[j],striangle[i].t[j+1])) ) {
+	aa = i;
+	bb = striangle[i].t[j];
+	cc = striangle[i].t[j+1];
+	filldel(&doc->delaunay[count],aa,bb,cc,gPointArray,NULL);
+	count++;	      
+      }	  
+    }
+  }
+  for (i=0;i<n;i++) Free(striangle[i].t);
+  Free(striangle); 
+  doc->numTriangles = count2;
+  gPointArray = ptemp;
+  return(1);
+}
+
+
+int compareEdge(const void *e1, const void *e2){
+  PointNumero tmp;
+
+  if ((tmp = ((edge *)e1)->from - ((edge *)e2)->from) != 0) return(tmp);
+  return(((edge *)e1)->to - ((edge *)e2)->to);
+}
+
+/* pour la liste de delaunays ListDelaunay, CreateLinks cree les liens entre
+   triangles c.a.d determine les voisins de chaque triangle                  */
+
+int CreateLinks(List_T * ListDelaunay , int NumDelaunay, 
+		ContourRecord **ListContours , int Nc){
+  int i;
+  edge *ListEdges;
+  MPoint pt;
+  Delaunay *del_Pi, *del_Pj;
+  
+  ListEdges = (edge *) Malloc((3* NumDelaunay + 2)* sizeof(edge));
+
+  ListEdges[3* NumDelaunay + 1].num=0;
+  
+  for (i=0;i< NumDelaunay;i++){
+
+    del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i);
+
+    /* arete a b */
+    if (del_Pi->t.a  > del_Pi->t.b ){	
+      ListEdges[3*i].from = del_Pi->t.a;
+      ListEdges[3*i].to   = del_Pi->t.b;
+      ListEdges[3*i].num  = i;	
+    }
+    else {	
+      ListEdges[3*i].from = del_Pi->t.b;
+      ListEdges[3*i].to   = del_Pi->t.a;
+      ListEdges[3*i].num  = i;
+    }
+    
+    /* arete  b c */      
+    if (del_Pi->t.b  > del_Pi->t.c ){	
+      ListEdges[3*i+1].from = del_Pi->t.b;
+      ListEdges[3*i+1].to   = del_Pi->t.c;
+      ListEdges[3*i+1].num  = i;	
+    }
+    else {	
+      ListEdges[3*i+1].from = del_Pi->t.c;
+      ListEdges[3*i+1].to   = del_Pi->t.b;
+      ListEdges[3*i+1].num  = i;
+    }
+    
+    /* arete   c a */
+    if (del_Pi->t.c  > del_Pi->t.a ){	
+      ListEdges[3*i+2].from = del_Pi->t.c;
+      ListEdges[3*i+2].to   = del_Pi->t.a;
+      ListEdges[3*i+2].num  = i;	
+    }
+    else {	
+      ListEdges[3*i+2].from = del_Pi->t.a;
+      ListEdges[3*i+2].to   = del_Pi->t.c;
+      ListEdges[3*i+2].num  = i;
+    }
+    
+  }
+  
+  qsort(ListEdges,3*NumDelaunay,sizeof(edge),compareEdge);
+
+  i=0;
+
+  do {
+
+    if ( (ListEdges[i].from == ListEdges[i+1].from) &&
+	 (ListEdges[i].to   == ListEdges[i+1].to)){   /* create link */
+
+      del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, ListEdges[i].num);
+      del_Pj = *(Delaunay**)List_Pointer(ListDelaunay, ListEdges[i+1].num);
+
+      if ( ( del_Pi->t.position != EXTERN ) &&
+	   ( del_Pj->t.position != EXTERN ) &&
+	  ( (del_Pj->t.info == TOLINK ) ||
+	    (del_Pi->t.info == TOLINK ) ) ) {
+
+	if (del_Pi->v.voisin1 == NULL)
+	  del_Pi->v.voisin1 = del_Pj;
+	else if (del_Pi->v.voisin2 == NULL)
+	  del_Pi->v.voisin2 = del_Pj;
+	else if (del_Pi->v.voisin3 == NULL)
+	  del_Pi->v.voisin3 = del_Pj;
+	else {
+	  Msg(ERROR, "Bad Link"); 
+	  exit(1);
+	}
+
+	if (del_Pj->v.voisin1 == NULL)
+	  del_Pj->v.voisin1 = del_Pi;
+	else if (del_Pj->v.voisin2 == NULL)
+	  del_Pj->v.voisin2 = del_Pi;
+	else if (del_Pj->v.voisin3 == NULL)
+	  del_Pj->v.voisin3 = del_Pi;
+	else {
+	  Msg(ERROR, "Bad Link"); 
+	  exit(1);
+	}
+      }
+      i+=2;
+    }
+    else
+      i++;
+  } while ( i < 3*NumDelaunay );
+  
+  Free(ListEdges);
+  
+  for(i=0 ; i<NumDelaunay ;i++){
+    del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i);
+    
+    if(del_Pi->t.position != EXTERN){ 
+      pt.h = del_Pi->t.xc;
+      pt.v = del_Pi->t.yc;
+
+      if(!PtInTriangle(pt, del_Pi->t.a, del_Pi->t.b,
+		       del_Pi->t.c)){
+	if(!Find_Triangle(pt,FGMESH,A_TOUT_PRIX)){
+	  if(LocalNewPoint == VORONOI_INSERT) {
+	    del_Pi->t.position = ACCEPTED;
+	  }
+	  del_Pi->t.quality_value /= 1000.;
+	}
+      }
+    }
+  }
+
+  if((LocalNewPoint == VORONOI_INSERT)){
+    for(i=0 ; i<NumDelaunay ;i++){
+      del_Pi = *(Delaunay**)List_Pointer(ListDelaunay, i);
+      if( ((del_Pi->t.position == NONACCEPTED ) || (del_Pi->t.position == INTERN ))  &&
+	 (del_Pi->t.info == TOLINK )){
+        if ((del_Pi->v.voisin1 == NULL) || 
+	    (del_Pi->v.voisin2 == NULL) || 
+	    (del_Pi->v.voisin3 == NULL)){
+	  del_Pi->t.position = ACTIF;
+	}
+	else if ((del_Pi->v.voisin1->t.position == ACCEPTED) && 
+		 (del_Pi->v.voisin2->t.position == ACCEPTED) && 
+		 (del_Pi->v.voisin3->t.position == ACCEPTED)){
+	  del_Pi->t.position = ACCEPTED;
+	}
+	else if ((del_Pi->v.voisin1->t.position == ACCEPTED) || 
+		 (del_Pi->v.voisin2->t.position == ACCEPTED) || 
+		 (del_Pi->v.voisin3->t.position == ACCEPTED)){
+	  del_Pi->t.position = ACTIF;
+	}
+	else {
+	  del_Pi->t.position = WAITING;
+	}
+      }
+    }
+  }
+
+  return(1);
+}
+
diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ec0b1d00fc6d3c0e73f026e62ac25a0705e6ed1f
--- /dev/null
+++ b/Mesh/2D_Mesh.cpp
@@ -0,0 +1,1115 @@
+/*
+   Maillage Delaunay d'une surface (Point insertion Technique)
+
+   3 types de maillages sont proposes
+   - Center of circum circle point insertion
+   - Voronoi Point Insertion (la meilleure en general)
+   - G Point insertion (intermediaire)
+
+   Le maillage surfacique passe par la determination d'un plan
+   dont on minimise l'ecart au sens des moindes carres par rap-
+   port a la surface :
+     plan ax + bx + cz = 1
+     tangeante = t = (a,b,c)
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "2D_Mesh.h"
+#include "Numeric.h"
+#include "Context.h"
+
+extern Mesh       *THEM;
+extern Context_T   CTX;
+extern int         CurrentNodeNumber, LocalNewPoint;
+extern double      LC, FACTEUR_MULTIPLICATIF;
+
+PointRecord   *gPointArray;
+DocRecord     *BGMESH, *FGMESH;
+double         qual, newqual, L;
+int            is_3D = 0, UseBGMesh;
+
+static Surface  *THESURFACE, *THESUPPORT;
+static int       DEBUG = 0;
+
+void ProjetteSurface (void *a, void *b){
+  Vertex *v;
+  v = *(Vertex **) a;
+
+  if (!v->ListCurves)
+    ProjectPointOnSurface (THESUPPORT, *v);
+}
+
+void Projette_Plan_Moyen (void *a, void *b){
+  Vertex *v = *(Vertex **) a;
+  Projette (v, THESURFACE->plan);
+}
+
+void Projette_Inverse (void *a, void *b){
+  Vertex *v = *(Vertex **) a;
+  Projette (v, THESURFACE->invplan);
+}
+
+void Plan_Moyen (void *data, void *dum){
+  int ix, iy, iz, i, j, N;
+  static List_T *points;
+  Curve *pC;
+  static int deb = 1;
+  double det, sys[3][3], b[3], res[3], mod, t1[3], t2[3], ex[3];
+  double s2s[2][2], r2[2], X, Y, Z;
+  Vertex *v;
+  Surface **pS, *s;
+
+  pS = (Surface **) data;
+  s = *pS;
+
+  if (deb){
+    points = List_Create (10, 10, sizeof (Vertex *));
+    deb = 0;
+  }
+
+  switch (s->Typ){
+  case MSH_SURF_PLAN:
+  case MSH_SURF_TRIC:
+  case MSH_SURF_REGL:
+  case MSH_SURF_NURBS:
+  case MSH_SURF_TRIMMED:
+    for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+      List_Read (s->s.Generatrices, i, &pC);
+      for (j = 0; j < List_Nbr (pC->Vertices); j++){
+	List_Read (pC->Vertices, j, &v);
+	List_Add (points, &v);
+	Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j));
+      }
+    }
+    break;
+  }
+
+  N = List_Nbr (points);
+
+  for (i = 0; i < 3; i++){
+    b[i] = 0.0;
+    for (j = 0; j < 3; j++){
+      sys[i][j] = 0.0;
+    }
+  }
+
+  /* ax + by + cz = 1 */
+
+  ix = iy = iz = 0;
+
+  for (i = 0; i < N; i++){
+    List_Read (points, i, &v);
+
+    if (!i){
+      X = v->Pos.X;
+      Y = v->Pos.Y;
+      Z = v->Pos.Z;
+    }
+    else{
+      if (X != v->Pos.X)
+	ix = 1;
+      if (Y != v->Pos.Y)
+	iy = 1;
+      if (Z != v->Pos.Z)
+	iz = 1;
+    }
+    
+    sys[0][0] += v->Pos.X * v->Pos.X;
+    sys[1][1] += v->Pos.Y * v->Pos.Y;
+    sys[2][2] += v->Pos.Z * v->Pos.Z;
+    sys[0][1] += v->Pos.X * v->Pos.Y;
+    sys[0][2] += v->Pos.X * v->Pos.Z;
+    sys[1][2] += v->Pos.Y * v->Pos.Z;
+    sys[2][1] = sys[1][2];
+    sys[1][0] = sys[0][1];
+    sys[2][0] = sys[0][2];
+    b[0] += v->Pos.X;
+    b[1] += v->Pos.Y;
+    b[2] += v->Pos.Z;
+  }
+
+  s->d = 1.0;
+
+  /* x = X */
+
+  if (!ix){
+    s->d = X;
+    res[0] = 1.;
+    res[1] = res[2] = 0.0;
+    if (DEBUG)
+      Msg(INFO, "Plan de type x = c");
+  }
+
+  /* y = Y */
+
+  else if (!iy){
+    s->d = Y;
+    res[1] = 1.;
+    res[0] = res[2] = 0.0;
+    if (DEBUG)
+      Msg(INFO, "Plan de type y = c");
+  }
+
+  /* z = Z */
+
+  else if (!iz){
+    s->d = Z;
+    res[2] = 1.;
+    res[1] = res[0] = 0.0;
+  }
+
+  /* by + cz = -x */
+
+  else if (!sys3x3 (sys, b, res, &det)){
+    s->d = 0.0;
+    s2s[0][0] = sys[1][1];
+    s2s[0][1] = sys[1][2];
+    s2s[1][0] = sys[1][2];
+    s2s[1][1] = sys[2][2];
+    b[0] = -sys[0][1];
+    b[1] = -sys[0][2];
+    if (sys2x2 (s2s, b, r2)){
+      res[0] = 1.;
+      res[1] = r2[0];
+      res[2] = r2[1];
+      if (DEBUG)
+	Msg(INFO, "Plan de type by + cz = -x");
+    }
+
+    /* ax + cz = -y */
+    
+    else{
+      s->d = 0.0;
+      s2s[0][0] = sys[0][0];
+      s2s[0][1] = sys[0][2];
+      s2s[1][0] = sys[0][2];
+      s2s[1][1] = sys[2][2];
+      b[0] = -sys[0][1];
+      b[1] = -sys[1][2];
+      if (sys2x2 (s2s, b, r2)){
+	res[0] = r2[0];
+	res[1] = 1.;
+	res[2] = r2[1];
+	if (DEBUG)
+	  Msg(INFO, "Plan de type ax + cz = -y");
+      }
+      
+      /* ax + by = -z */
+      
+      else{
+	s->d = 1.0;
+	s2s[0][0] = sys[0][0];
+	s2s[0][1] = sys[0][1];
+	s2s[1][0] = sys[0][1];
+	s2s[1][1] = sys[1][1];
+	b[0] = -sys[0][2];
+	b[1] = -sys[1][2];
+	if (sys2x2 (s2s, b, r2)){
+	  res[0] = r2[0];
+	  res[1] = r2[1];
+	  res[2] = 1.;
+	  if (DEBUG)
+	    Msg(INFO, "Plan de type ax + by = -z");
+	}
+	else{
+	  Msg(ERROR, "Mean Plane");
+	}
+      }
+    }
+  }
+
+  s->a = res[0];
+  s->b = res[1];
+  s->c = res[2];
+  mod = sqrt (res[0] * res[0] + res[1] * res[1] + res[2] * res[2]);
+  for (i = 0; i < 3; i++)
+    res[i] /= mod;
+
+  /* L'axe n'est pas l'axe des x */
+
+  ex[0] = ex[1] = ex[2] = 0.0;
+  if(res[0] == 0.0)
+    ex[0] = 1.0;
+  else if(res[1] == 0.0)
+    ex[1] = 1.0;
+  else
+    ex[2] = 1.0;
+
+  prodve (res, ex, t1);
+
+  mod = sqrt (t1[0] * t1[0] + t1[1] * t1[1] + t1[2] * t1[2]);
+  for (i = 0; i < 3; i++)
+    t1[i] /= mod;
+
+  prodve (t1, res, t2);
+
+  mod = sqrt (t2[0] * t2[0] + t2[1] * t2[1] + t2[2] * t2[2]);
+  for (i = 0; i < 3; i++)
+    t2[i] /= mod;
+
+  for (i = 0; i < 3; i++)
+    s->plan[0][i] = t1[i];
+  for (i = 0; i < 3; i++)
+    s->plan[1][i] = t2[i];
+  for (i = 0; i < 3; i++)
+    s->plan[2][i] = res[i];
+
+  if (DEBUG){
+    Msg(INFO, "plan    : (%g x + %g y + %g z = %g)", s->a, s->b, s->c, s->d);
+    Msg(INFO, "normale : (%g , %g , %g )", res[0], res[1], res[2]);
+    Msg(INFO, "t1      : (%g , %g , %g )", t1[0], t1[1], t1[2]);
+    Msg(INFO, "t2      : (%g , %g , %g )", t2[0], t2[1], t2[2]);
+  }
+
+  /* Matrice orthogonale */
+
+  if (!iz){
+    for (i = 0; i < 3; i++){
+      for (j = 0; j < 3; j++){
+	s->invplan[i][j] = (i == j) ? 1. : 0.;
+	s->plan[i][j] = (i == j) ? 1. : 0.;
+      }
+    }
+  }
+  else{
+    for (i = 0; i < 3; i++){
+      for (j = 0; j < 3; j++){
+	s->invplan[i][j] = s->plan[j][i];
+      }
+    }
+  }
+  List_Reset (points);
+}
+
+
+int Calcule_Contours (Surface * s){
+  int i, j, ori, ORI;
+  Vertex *v, *first, *last;
+  List_T *l, *linv;
+  Curve *c;
+  double n[] = {0., 0., 1.};
+
+  l = List_Create (10, 10, sizeof (Vertex *));
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &c);
+    if (!List_Nbr (l)){
+      List_Read (c->Vertices, 0, &first);
+    }
+    for (j = 1; j < List_Nbr (c->Vertices); j++){
+      List_Read (c->Vertices, j, &v);
+      List_Add (l, &v);
+      if (j == List_Nbr (c->Vertices) - 1){
+	last = v;
+      }
+    }
+    if (!compareVertex (&last, &first)){
+      ori = Oriente (l, n);
+
+      /* Le premier contour est oriente aire a droite
+	 Les autes sont des trous orientes aire a gauche */
+      
+      if (!List_Nbr (s->Contours))
+	ORI = ori;
+
+      if ((!List_Nbr (s->Contours) && !ori) ||
+	  (List_Nbr (s->Contours) && ori)){
+	linv = List_Create (10, 10, sizeof (Vertex *));
+	List_Invert (l, linv);
+	List_Delete (l);
+	l = linv;
+      }
+      List_Add (s->Contours, &l);
+      l = List_Create (10, 10, sizeof (Vertex *));
+    }
+  }
+  return ORI;
+}
+
+
+void Calcule_Z (void *data, void *dum){
+  Vertex **pv, *v;
+  double Z, U, V;
+
+  pv = (Vertex **) data;
+  v = *pv;
+  if (v->Frozen || v->Num < 0)
+    return;
+
+  XYtoUV (THESUPPORT, &v->Pos.X, &v->Pos.Y, &U, &V, &Z);
+  v->Pos.Z = Z;
+}
+
+void Calcule_Z_Plan (void *data, void *dum){
+  Vertex **pv, *v;
+  Vertex V;
+
+  V.Pos.X = THESURFACE->a;
+  V.Pos.Y = THESURFACE->b;
+  V.Pos.Z = THESURFACE->c;
+
+  Projette (&V, THESURFACE->plan);
+
+  pv = (Vertex **) data;
+  v = *pv;
+  if (V.Pos.Z != 0.0)
+    v->Pos.Z = (THESURFACE->d - V.Pos.X * v->Pos.X - V.Pos.Y * v->Pos.Y)
+      / V.Pos.Z;
+  else
+    v->Pos.Z = 0.0;
+}
+
+
+void Add_In_Mesh (void *a, void *b){
+  if (!Tree_Search (THEM->Vertices, a))
+    Tree_Add (THEM->Vertices, a);
+}
+
+void Freeze_Vertex (void *a, void *b){
+  Vertex *pv;
+  pv = *(Vertex **) a;
+  pv->Freeze.X = pv->Pos.X;
+  pv->Freeze.Y = pv->Pos.Y;
+  pv->Freeze.Z = pv->Pos.Z;
+  pv->Frozen = 1;
+}
+
+void deFreeze_Vertex (void *a, void *b){
+  Vertex *pv;
+  pv = *(Vertex **) a;
+  if (!pv->Frozen)
+    return;
+  pv->Pos.X = pv->Freeze.X;
+  pv->Pos.Y = pv->Freeze.Y;
+  pv->Pos.Z = pv->Freeze.Z;
+  pv->Frozen = 0;
+}
+
+void PutVertex_OnSurf (void *a, void *b){
+  Vertex *pv;
+  pv = *(Vertex **) a;
+  if (!pv->ListSurf)
+    pv->ListSurf = List_Create (1, 1, sizeof (Surface *));
+  List_Add (pv->ListSurf, &THESURFACE);
+}
+
+
+/* remplis la structure Delaunay d'un triangle cree */
+
+Delaunay * testconv (avlptr * root, int *conv, DocRecord * ptr){
+
+  avlptr *proot;
+  double qual;
+  Delaunay *pdel;
+
+  proot = root;
+
+  pdel = NULL;
+
+  *conv = 0;
+  if (*root == NULL)
+    *conv = 1;
+  else{
+    pdel = findrightest (*proot, ptr);
+    qual = pdel->t.quality_value;
+    switch (LocalNewPoint){
+    case CENTER_CIRCCIRC:
+    case BARYCENTER:
+      if (qual < CONV_VALUE)
+	*conv = 1;
+      break;
+    case VORONOI_INSERT:
+      if ((*root) == NULL)
+	*conv = 1;
+      break;
+    }
+  }
+  return (pdel);
+}
+
+
+int mesh_domain (ContourPeek * ListContours, int numcontours,
+		 maillage * mai, int *numpoints, DocRecord * BGMesh,
+		 int OnlyTheInitialMesh){
+  List_T *kill_L, *del_L ;
+  MPoint pt;
+  DocRecord docm, *doc;
+  int conv,i,j,nump,numact,numlink,numkil,numaloc,numtri,numtrr,numtrwait;
+  Delaunay *del, *del_P, *deladd, **listdel;
+  PointNumero aa, bb, cc, a, b, c;
+  DListPeek list, p, q;
+  avlptr *root, *proot, *root_w, *root_acc;
+  double volume_old, volume_new;
+
+  root = (avlptr *) Malloc (sizeof (avlptr));
+  root_w = (avlptr *) Malloc (sizeof (avlptr));
+  root_acc = (avlptr *) Malloc (sizeof (avlptr));
+
+  nump = 0;
+  for (i = 0; i < numcontours; i++)
+    nump += ListContours[i]->numpoints;
+
+  /* creation du maillage initial grace au puissant algorithme "divide and conquer" */
+
+  doc = &docm;
+  FGMESH = &docm;
+  doc->points = (PointRecord *) Malloc ((nump + 100) * sizeof(PointRecord));
+  gPointArray = doc->points;
+
+  numaloc = nump;
+  doc->numPoints = nump;
+  doc->numTriangles = 0;
+  mai->numtriangles = 0;
+  mai->numpoints = 0;
+
+  if (!numcontours){
+    Msg(ERROR, "No Contour");
+    return 0;
+  }
+
+  numact = 0;
+  for (i = 0; i < numcontours; i++){
+    for (j = 0; j < ListContours[i]->numpoints; j++){
+      doc->points[numact + j].where.h =
+	ListContours[i]->oriented_points[j].where.h
+	+ ListContours[i]->perturbations[j].h;
+      doc->points[numact + j].where.v =
+	ListContours[i]->oriented_points[j].where.v
+	+ ListContours[i]->perturbations[j].v;
+      doc->points[numact + j].quality =
+	ListContours[i]->oriented_points[j].quality;
+      doc->points[numact + j].initial =
+	ListContours[i]->oriented_points[j].initial;
+      ListContours[i]->oriented_points[j].permu = numact + j;
+      doc->points[numact + j].permu = numact + j;
+      doc->points[numact + j].numcontour = ListContours[i]->numerocontour;
+      doc->points[numact + j].adjacent = NULL;
+    }
+    numact += ListContours[i]->numpoints;
+  }
+
+  DelaunayAndVoronoi (doc);
+  Conversion (doc);
+  remove_all_dlist (doc->numPoints, doc->points);
+
+  if (!is_3D){
+    if (UseBGMesh == 1)
+      BGMESH = BGMesh;
+    else{
+      BGMESH = doc;
+      InitBricks (BGMESH);
+    }
+  }
+
+  /* elimination des triangles exterieurs + verification de l'existence
+     des edges (coherence) */
+
+  makepermut (nump);
+  del_L = List_Create(doc->numTriangles, 1000, sizeof(Delaunay*));
+
+  for(i= 0;i<doc->numTriangles;i++){
+    del_P = &doc->delaunay[i] ;
+    List_Add(del_L, &del_P);
+  }
+  
+  verify_edges (del_L, ListContours, numcontours, doc->numTriangles);
+  verify_inside (doc->delaunay, doc->numTriangles);
+
+  /* creation des liens ( triangles voisins ) */
+
+  CreateLinks (del_L, doc->numTriangles, ListContours, numcontours);
+
+  /* initialisation de l'arbre  */
+
+  (*root) = (*root_w) = (*root_acc) = NULL;
+
+  if (doc->numTriangles == 1)
+    doc->delaunay[0].t.position = INTERN;
+
+  for (i = 0; i < doc->numTriangles; i++){
+    if (doc->delaunay[i].t.position != EXTERN){
+      del = &doc->delaunay[i];
+      switch (LocalNewPoint){
+      case CENTER_CIRCCIRC:
+      case BARYCENTER:
+	Insert_Triangle (root, del);
+	break;
+      case VORONOI_INSERT:
+	switch (del->t.position){
+	case ACTIF:
+	case INTERN:
+	  Insert_Triangle (root, del);
+	  break;
+	case WAITING:
+	  Insert_Triangle (root_w, del);
+	  break;
+	case ACCEPTED:
+	  Insert_Triangle (root_acc, del);
+	  break;
+	}
+      }
+    }
+  }
+
+
+  /* maillage proprement dit :
+     1) Les triangles sont tries dans l'arbre suivant leur qualite
+     2) on ajoute un noeud au c.g du plus mauvais
+     3) on reconstruit le delaunay par Bowyer-Watson
+     4) on ajoute les triangles dans l'arbre et on recommence
+     jusque quand tous les triangles sont OK */
+
+  del = testconv (root, &conv, doc);
+
+  PushgPointArray (doc->points);
+
+  List_Reset(del_L);
+  kill_L = List_Create(1000, 1000, sizeof(Delaunay*));
+
+  if (OnlyTheInitialMesh)
+    conv = 1;
+
+  while (conv != 1){
+
+    pt = Localize (del, doc);
+
+    numlink = 0;
+    numkil = 0;
+    list = NULL;
+
+    if (!PE_Del_Triangle (del, pt, &list, kill_L, del_L, &numlink, &numkil)){
+      Msg(WARNING, "Triangle Non Delete");
+      Delete_Triangle (root, del);
+      Delete_Triangle (root_w, del);
+      del->t.quality_value /= 10.;
+      switch (LocalNewPoint){
+      case CENTER_CIRCCIRC:
+      case BARYCENTER:
+	Insert_Triangle (root, del);
+	break;
+      case VORONOI_INSERT:
+	del->t.position = ACCEPTED;
+	Insert_Triangle (root_acc, del);
+	break;
+      }
+      
+      numlink = numkil = 0;
+      if (list != NULL){
+	p = list;
+	do{
+	  q = p;
+	  p = Pred (p);
+	  Free (q);
+	}
+	while (p != list);
+      }
+      list = NULL;
+      del = testconv (root, &conv, doc);
+      continue;
+    }
+
+    /* Test du Volume */
+    
+    i = 0;
+    p = list;
+    volume_new = 0.0;
+    do{
+      q = p->next;
+      bb = p->point_num;
+      cc = q->point_num;
+      volume_new += fabs ((doc->points[bb].where.h - pt.h) *
+			  (doc->points[cc].where.v - doc->points[bb].where.v) -
+			  (doc->points[cc].where.h - doc->points[bb].where.h) *
+			  (doc->points[bb].where.v - pt.v));
+      p = q;
+    } while (p != list);
+
+    volume_old = 0.0;
+    for (i = 0; i < numkil; i++){
+      del_P = *(Delaunay**)List_Pointer(kill_L, i);
+      aa = del_P->t.a;
+      bb = del_P->t.b;
+      cc = del_P->t.c;
+      volume_old += fabs ((doc->points[bb].where.h - doc->points[aa].where.h) *
+			  (doc->points[cc].where.v - doc->points[bb].where.v) -
+			  (doc->points[cc].where.h - doc->points[bb].where.h) *
+			  (doc->points[bb].where.v - doc->points[aa].where.v));
+    }
+    
+    if ((volume_old - volume_new) / (volume_old + volume_new) > 1.e-6){
+      Msg(WARNING, "Volume has changed : %g -> %g", volume_old, volume_new);
+      Delete_Triangle (root, del);
+      Delete_Triangle (root_w, del);
+      del->t.quality_value /= 10.;
+      switch (LocalNewPoint){
+      case CENTER_CIRCCIRC:
+      case BARYCENTER:
+	Insert_Triangle (root, del);
+	break;
+      case VORONOI_INSERT:
+	del->t.position = ACCEPTED;
+	Insert_Triangle (root_acc, del);
+	break;
+      }
+
+      numlink = numkil = 0;
+      if (list != NULL){
+	p = list;
+	do{
+	  q = p;
+	  p = Pred (p);
+	  Free (q);
+	} while (p != list);
+      }
+      list = NULL;
+      del = testconv (root, &conv, doc);
+      continue;
+    }
+
+    /* Fin test du volume */
+
+    for (i = 0; i < numkil; i++){
+      del_P = *(Delaunay**)List_Pointer(kill_L, i);
+
+      switch (LocalNewPoint){
+      case CENTER_CIRCCIRC:
+      case BARYCENTER:
+	Delete_Triangle (root, del_P);
+	break;
+      case VORONOI_INSERT:
+	switch (del_P->t.position){
+	case WAITING:
+	  Delete_Triangle (root_w, del_P);
+	  break;
+	case ACTIF:
+	case INTERN:
+	  Delete_Triangle (root, del_P);
+	  break;
+	case ACCEPTED:
+	  Delete_Triangle (root_acc, del_P);
+	  break;
+	}
+      }
+    }
+
+    *numpoints = doc->numPoints;
+    Insert_Point (pt, numpoints, &numaloc, doc, BGMESH, is_3D);
+    doc->points = gPointArray;
+    doc->numPoints = *numpoints;
+
+    i = 0;
+    p = list;
+
+    do{
+      q = p->next;
+      
+      aa = doc->numPoints - 1;
+      bb = p->point_num;
+      cc = q->point_num;
+      
+      deladd = (Delaunay *) Malloc (sizeof (Delaunay));
+      
+      filldel (deladd, aa, bb, cc, doc->points, BGMESH);
+      
+      List_Put(del_L, numlink+i, &deladd);
+      i++;
+      p = q;
+      
+    } while (p != list);
+
+    p = list;
+    
+    do{
+      q = p;
+      p = Pred (p);
+      Free (q);
+    } while (p != list);
+
+    CreateLinks (del_L, i + numlink, ListContours, numcontours);
+
+    for (j = 0; j < i; j++){
+      del_P = *(Delaunay**)List_Pointer(del_L, j+numlink) ;
+      switch (LocalNewPoint) {
+      case CENTER_CIRCCIRC:
+      case BARYCENTER:
+	Insert_Triangle (root, del_P);
+	break;
+      case VORONOI_INSERT:
+	switch (del_P->t.position){
+	case ACTIF:
+	case INTERN:
+	  Insert_Triangle (root, del_P);
+	  break;
+	case WAITING:
+	  Insert_Triangle (root_w, del_P);
+	  break;
+	case ACCEPTED:
+	  Insert_Triangle (root_acc, del_P);
+	  break;
+	}
+      }
+    }
+    
+    del = testconv (root, &conv, doc);
+    
+  }
+
+  numtri = 0;
+  numtrwait = 0;
+
+  if (*root_w != NULL){
+    proot = root_w;
+    avltree_count (*proot, &numtrwait);
+  }
+
+  numtrr = 0;
+
+  proot = root;
+  switch (LocalNewPoint){
+  case VORONOI_INSERT:
+    proot = root_acc;
+    break;
+  }
+  avltree_count (*proot, &numtrr);
+
+  alloue_Mai_Del (mai, numtrr + numtrwait + 1, 100);
+
+  listdel = mai->listdel;
+  numtri = 0;
+  avltree_print(*proot,listdel,&numtri);
+  if(numtrwait != 0){
+    numtri = 0;
+    avltree_print(*root_w,(Delaunay**)del_L->array,&numtri);
+    for(i=0;i<numtrwait;i++){
+      mai->listdel[i+numtrr] = *(Delaunay**)List_Pointer(del_L, i);
+    }
+    avltree_remove(root_w);
+  }
+  avltree_remove(root);
+  
+  List_Delete(del_L);
+
+  mai->numtriangles = numtrr + numtrwait;
+  mai->numpoints = doc->numPoints;
+  mai->points = doc->points;
+
+  /* Tous Les Triangles doivent etre orientes */
+
+  if (!mai->numtriangles)
+    mai->numtriangles = 1;
+
+  for (i = 0; i < mai->numtriangles; i++){
+    a = mai->listdel[i]->t.a;
+    b = mai->listdel[i]->t.b;
+    c = mai->listdel[i]->t.c;
+
+    mai->listdel[i]->v.voisin1 = NULL;
+    if (((doc->points[b].where.h - doc->points[a].where.h) *
+	 (doc->points[c].where.v - doc->points[b].where.v) -
+	 (doc->points[c].where.h - doc->points[b].where.h) *
+	 (doc->points[b].where.v - doc->points[a].where.v)) > 0.0){
+      mai->listdel[i]->t.a = b;
+      mai->listdel[i]->t.b = a;
+    }
+  }
+  return 1;
+}
+
+void Maillage_Automatique_VieuxCode (Surface * pS, Mesh * m, int ori){
+  ContourRecord *cp, **liste;
+  List_T *c;
+  Vertex *v, V[3], *ver[3], **pp[3];
+  maillage M;
+  int err, i, j, k, N, a, b, d;
+  Simplex *s;
+
+  if (m->BGM.Typ == WITHPOINTS){
+    is_3D = 0;
+    UseBGMesh = 0;
+  }
+  else{
+    is_3D = 1;
+  }
+
+  liste = (ContourPeek *) Malloc (List_Nbr (pS->Contours) * sizeof (ContourPeek));
+
+  k = 0;
+
+  for (i = 0; i < List_Nbr (pS->Contours); i++){
+    cp = (ContourRecord *) Malloc (sizeof (ContourRecord));
+    List_Read (pS->Contours, i, &c);
+    cp->oriented_points = (PointRecord *) Malloc (List_Nbr (c) * sizeof (PointRecord));
+    cp->perturbations = (MPoint *) Malloc (List_Nbr (c) * sizeof (MPoint));
+    cp->numerocontour = i;
+    for (j = 0; j < List_Nbr (c); j++){
+      List_Read (c, j, &v);
+      cp->oriented_points[j].where.h = v->Pos.X;
+      cp->oriented_points[j].where.v = v->Pos.Y;
+
+      cp->perturbations[j].h = RAND_LONG;
+      cp->perturbations[j].v = RAND_LONG;
+      cp->oriented_points[j].numcontour = i;
+      cp->oriented_points[j].quality = v->lc;
+      cp->oriented_points[j].permu = k++;
+      cp->oriented_points[j].initial = v->Num;
+    }
+    cp->numpoints = List_Nbr (c);
+    liste[i] = cp;
+  }
+
+  if (pS->Method){
+    /* lets force this, since it's the only one that works... */
+    LocalNewPoint = CENTER_CIRCCIRC;
+    mesh_domain (liste, List_Nbr (pS->Contours), &M, &N, NULL, 0);
+  }
+
+  for (i = 0; i < M.numpoints; i++){
+    if (gPointArray[i].initial < 0){
+      gPointArray[i].initial = ++CurrentNodeNumber;
+      v = Create_Vertex (gPointArray[i].initial, gPointArray[i].where.h,
+			 gPointArray[i].where.v, 0.0, gPointArray[i].quality, 0.0);
+      if (!Tree_Search (pS->Vertices, &v))
+	Tree_Add (pS->Vertices, &v);
+    }
+  }
+  for (i = 0; i < 3; i++)
+    ver[i] = &V[i];
+
+  for (i = 0; i < M.numtriangles; i++){
+
+    a = M.listdel[i]->t.a;
+    b = M.listdel[i]->t.b;
+    d = M.listdel[i]->t.c;
+    
+    ver[0]->Num = gPointArray[a].initial;
+    ver[1]->Num = gPointArray[b].initial;
+    ver[2]->Num = gPointArray[d].initial;
+    err = 0;
+    for (j = 0; j < 3; j++){
+      if ((pp[j] = (Vertex **) Tree_PQuery (pS->Vertices, &ver[j]))){
+      }
+      else{
+	err = 1;
+	Msg(ERROR, "Unknown Vertex %d\n", ver[j]->Num);
+      }
+    }
+    if (ori && !err)
+      s = Create_Simplex (*pp[0], *pp[1], *pp[2], NULL);
+    else if (!err)
+      s = Create_Simplex (*pp[0], *pp[2], *pp[1], NULL);
+    if (!err){
+      s->iEnt = pS->Num;
+      Tree_Insert (pS->Simplexes, &s);
+    }
+  }
+  Free (gPointArray);
+}
+
+
+void Make_Mesh_With_Points (DocRecord * ptr, PointRecord * Liste, int Numpoints){
+  ptr->numTriangles = 0;
+  ptr->points = Liste;
+  ptr->numPoints = Numpoints;
+  DelaunayAndVoronoi (ptr);
+  Conversion (ptr);
+  remove_all_dlist (ptr->numPoints, ptr->points);
+}
+
+void filldel (Delaunay * deladd, int aa, int bb, int cc,
+	      PointRecord * points, DocRecord * mesh){
+
+  double newqual, L;
+  MPoint pt2, pt4;
+  Vertex *v, *dum;
+
+  deladd->t.a = aa;
+  deladd->t.b = bb;
+  deladd->t.c = cc;
+  deladd->t.info = TOLINK;
+  deladd->t.info2 = 0;
+  deladd->v.voisin1 = NULL;
+  deladd->v.voisin2 = NULL;
+  deladd->v.voisin3 = NULL;
+
+  CircumCircle (points[aa].where.h,
+		points[aa].where.v,
+		points[bb].where.h,
+		points[bb].where.v,
+		points[cc].where.h,
+		points[cc].where.v,
+		&deladd->t.xc,
+		&deladd->t.yc);
+
+  pt2.h = deladd->t.xc;
+  pt2.v = deladd->t.yc;
+  if (!is_3D){
+    if (mesh){
+      newqual = FACTEUR_MULTIPLICATIF * find_quality (pt2, mesh);
+    }
+    else{
+      newqual = (points[aa].quality + points[bb].quality + points[cc].quality) / 3.;
+    }
+    v = Create_Vertex (-1, pt2.h, pt2.v, 0.0, 0.0, 0.0);
+    Calcule_Z_Plan (&v, &dum);
+    Projette_Inverse (&v, &dum);
+    Free (v);
+  }
+  else{
+    v = Create_Vertex (-1, pt2.h, pt2.v, 0.0, 0.0, 0.0);
+    Calcule_Z_Plan (&v, &dum);
+    Projette_Inverse (&v, &dum);
+    newqual = Lc_XYZ (v->Pos.X, v->Pos.Y, v->Pos.Z, THEM);
+    Free (v);
+  }
+
+  switch (LocalNewPoint){
+  case CENTER_CIRCCIRC:
+  case BARYCENTER:
+    deladd->t.quality_value =
+      sqrt ((deladd->t.xc - points[cc].where.h) * (deladd->t.xc - points[cc].where.h) +
+	    (deladd->t.yc - points[cc].where.v) * (deladd->t.yc - points[cc].where.v)
+	    ) / newqual;
+    deladd->t.position = INTERN;
+    break;
+    
+  case VORONOI_INSERT:
+    pt4.h = points[bb].where.h;
+    pt4.v = points[bb].where.v;
+    //pt3.h = .5 * (points[bb].where.h + points[cc].where.h);
+    //pt3.v = .5 * (points[bb].where.v + points[cc].where.v);
+    deladd->t.quality_value = myhypot (pt2.h - pt4.h, pt2.v - pt4.v);
+    L = newqual / deladd->t.quality_value;
+    if (L > 1.5)
+      deladd->t.position = ACCEPTED;
+    else
+      deladd->t.position = NONACCEPTED;
+    break;
+  }
+}
+
+void ActionEndTheCurve (void *a, void *b){
+  Curve *c = *(Curve **) a;
+  End_Curve (c);
+}
+
+int MeshParametricSurface (Surface * s);
+int Extrude_Mesh (Surface * s);
+
+void Maillage_Surface (void *data, void *dum){
+  Surface  **pS, *s;
+  Tree_T    *tnxe;
+  int        ori;
+
+  pS = (Surface **) data;
+  s = *pS;
+
+  if (!s->Support)
+    return;
+
+  THESUPPORT = s->Support;
+  THESURFACE = s;
+
+  if (Tree_Nbr (s->Simplexes))
+    Tree_Delete (s->Simplexes);
+  s->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality);
+  if (Tree_Nbr (s->Vertices))
+    Tree_Delete (s->Vertices);
+  s->Vertices = Tree_Create (sizeof (Vertex *), compareVertex);
+
+  Msg(STATUS, "Meshing Surface %d", s->Num);
+
+  if (MeshTransfiniteSurface (s) ||
+      MeshEllipticSurface (s) ||
+      MeshCylindricalSurface (s) ||
+      MeshParametricSurface (s) ||
+      Extrude_Mesh (s)){
+    Tree_Action (THEM->Points, PutVertex_OnSurf);
+    Tree_Action (s->Vertices, PutVertex_OnSurf);
+    Tree_Action (s->Vertices, Add_In_Mesh);
+    if (CTX.mesh.degree == 2)
+      Degre2 (THEM->Vertices, s->Vertices, s->Simplexes, NULL, s);
+    THEM->Statistics[5] += Tree_Nbr (THESURFACE->Vertices);
+    THEM->Statistics[7] += Tree_Nbr (THESURFACE->Simplexes);
+
+    /* void TRIE_MON_GARS(void *a, void *b);
+       Tree_Action (THES->Simplexes, TRIE_MON_GARS);
+       Link_Simplexes(NULL, THES->Simplexes);
+       void  constraint_the_edge (int ,int ,int);
+       constraint_the_edge (6, 45, 85);
+    */
+    return;
+  }
+
+  int TypSurface = s->Typ;
+  s->Typ = MSH_SURF_PLAN;
+  Plan_Moyen (pS, dum);
+
+  Tree_Action (THEM->Points, Freeze_Vertex);
+  Tree_Action (s->Vertices, Freeze_Vertex);
+  Tree_Action (THEM->Points, Projette_Plan_Moyen);
+  Tree_Action (s->Vertices, Projette_Plan_Moyen);
+  Tree_Action (THEM->Curves, ActionEndTheCurve);
+
+  End_Surface (s);
+
+  ori = Calcule_Contours (s);
+
+  if (CTX.mesh.algo == DELAUNAY_OLDALGO)
+    Maillage_Automatique_VieuxCode (s, THEM, ori);
+  else
+    AlgorithmeMaillage2DAnisotropeModeJF (s);
+
+  if(CTX.mesh.nb_smoothing){
+    Msg(STATUS, "Mesh Smoothing");
+    tnxe = Tree_Create (sizeof (NXE), compareNXE);
+    create_NXE (s->Vertices, s->Simplexes, tnxe);
+    for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
+      Tree_Action (tnxe, ActionLiss);
+    Tree_Delete (tnxe);
+  }
+
+  if (s->Recombine)
+    Recombine (s->Vertices, s->Simplexes, s->RecombineAngle);
+
+  s->Typ = TypSurface;
+
+  if (s->Typ != MSH_SURF_PLAN){
+    if (s->Extrude)
+      s->Extrude->Rotate (s->plan);
+    Tree_Action (s->Vertices, Calcule_Z);
+    if (s->Extrude)
+      s->Extrude->Rotate (s->invplan);
+  }
+  else
+    Tree_Action (s->Vertices, Calcule_Z_Plan);
+
+  Tree_Action (s->Vertices, Projette_Inverse);
+  Tree_Action (THEM->Points, Projette_Inverse);
+
+  Tree_Action (THEM->Points, deFreeze_Vertex);
+  Tree_Action (s->Vertices, deFreeze_Vertex);
+
+  Tree_Action (THEM->Points, PutVertex_OnSurf);
+  Tree_Action (s->Vertices, PutVertex_OnSurf);
+  Tree_Action (s->Vertices, Add_In_Mesh);
+
+  Tree_Action (THEM->Curves, ActionEndTheCurve);
+  End_Surface (s->Support);
+  End_Surface (s);
+
+  if (DEBUG){
+    Msg (INFO, "Nombre de triangles : %d", Tree_Nbr(s->Simplexes));
+    Msg (INFO, "Nombre de points    : %d", Tree_Nbr(s->Vertices));
+  }
+
+  if (CTX.mesh.degree == 2)
+    Degre2 (THEM->Vertices, THEM->VertexEdges, s->Simplexes, NULL, THESUPPORT);
+
+  THEM->Statistics[5] += Tree_Nbr (THESURFACE->Vertices);
+  THEM->Statistics[7] += Tree_Nbr (THESURFACE->Simplexes);
+
+}
diff --git a/Mesh/2D_Mesh.h b/Mesh/2D_Mesh.h
new file mode 100644
index 0000000000000000000000000000000000000000..04cf95bea6c131c1805d7f14fa41e08c40450be2
--- /dev/null
+++ b/Mesh/2D_Mesh.h
@@ -0,0 +1,75 @@
+#ifndef _2D_MESH_H_
+#define _2D_MESH_H_
+
+typedef struct avl{
+  void *treedata;
+  int balance;
+  struct avl *left;
+  struct avl *right;
+}avlstruct;
+
+typedef avlstruct *avlptr;
+
+int remove_tree (avlstruct ** root);
+int insert_avltree (avlstruct ** root, void *item, 
+		    int (*fcmp)(void *a, void *b));
+int delete_avltree (avlstruct ** root, void *item, 
+		    int (*fcmp)(void *a, void *b));
+int avltree_remove (avlstruct **root);
+void avltree_count (avlptr root, int *numtri);
+void avltree_print (avlptr root, Delaunay **listdel, int *numtri);
+int avltree_insert (avlstruct **root, void *item, 
+		    int (*fcmp)(void *a, void *b));
+int avltree_delete (avlstruct **root, void *item, 
+		    int (*fcmp)(void *a, void *b));
+
+PointNumero Successor(PointNumero a,PointNumero b);
+
+		    
+int Insert_Triangle (avlstruct **root, Delaunay * del);
+int Delete_Triangle ( avlstruct **root, Delaunay * del );
+int Insert_Point (MPoint pt, int *numpoints, int *numalloc, 
+		  DocRecord *doc, DocRecord *BGM, int is3d);
+
+void findtree(avlptr root, double *qualm, Delaunay **delf, DocRecord *MESH);
+Delaunay *findrightest(avlptr root, DocRecord *MESH);
+MPoint Localize (Delaunay * del , DocRecord *MESH);
+void alloue_Mai_Pts(maillage *mai , int Nballoc , int incrAlloc);
+void alloue_Mai_Del(maillage *mai , int Nballoc , int incrAlloc);
+
+void InitBricks (DocRecord *MESH);
+Delaunay * Find_Triangle (MPoint pt, DocRecord *MESH, int typ);
+int PtInTriangle(MPoint p , PointNumero a , PointNumero b , PointNumero c);
+int DelaunayAndVoronoi(DocPeek doc);
+
+int Conversion(DocPeek doc );
+int CreateLinks(List_T * ListDelaunay , int NumDelaunay, 
+		ContourRecord **ListContours , int Nc);
+
+void makepermut (int numpoints);
+void verify_edges (List_T *ListDelaunay, ContourRecord **ListContour, 
+		   int NumContours , int NumDelaunay);
+void verify_inside (Delaunay * ListDelaunay ,  int NumDelaunay );
+
+void PushgPointArray(PointRecord *ptr);
+void remove_all_dlist(int n, PointRecord *pPointArray);
+
+int PE_Del_Triangle (Delaunay *del , MPoint pt, DListPeek *ListEdges ,
+		     List_T *listkill, List_T *listDelforlink,
+		     int *numlink, int *numdel);
+
+void filldel (Delaunay * deladd, int aa, int bb, int cc,
+	      PointRecord * points, DocRecord * mesh);
+
+int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3,
+		 double *xc,double *yc);
+double find_quality (MPoint center, DocRecord * BGMESH);
+void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg,
+		 Tree_T * TreeAllNXE);
+
+int Is_left_of(PointNumero x,PointNumero y,PointNumero check);
+int Is_right_of(PointNumero x,PointNumero y,PointNumero check);
+int DListInsert(DListRecord **dlist, MPoint center, PointNumero newPoint);
+int DListDelete(DListPeek *dlist,PointNumero oldPoint);
+
+#endif
diff --git a/Mesh/2D_Mesh_Aniso.cpp b/Mesh/2D_Mesh_Aniso.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cc0e5435a3160ee1c3e50680f632d259c90d075a
--- /dev/null
+++ b/Mesh/2D_Mesh_Aniso.cpp
@@ -0,0 +1,1119 @@
+/*
+   Jean-Francois Remacle
+
+   Maillage Delaunay 2-D Anisotrope
+   Tres joli (a mon avis)
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Interpolation.h"
+#include "Create.h"
+#include "Context.h"
+#include "Numeric.h"
+
+extern Context_T CTX ;
+
+void draw_polygon_2d (double r, double g, double b, int n, double *x, double *y, double *z);
+
+MeshParameters:: MeshParameters ():
+  NbSmoothing (3),
+  DelaunayAlgorithm (DELAUNAY_NEWALGO),
+  DelaunayInsertionMethod (INSERTION_CENTROID),
+  DelaunayQuality (QUALITY_EDGES_BASED),
+  DelaunayKernel (DELAUNAY_KERANISO),
+  InteractiveDelaunay (false)
+{
+}
+
+extern Simplex MyNewBoundary;
+extern Mesh *THEM;
+extern int SPEED_MAX;
+extern int CurrentNodeNumber;
+extern double MAXIMUM_LC_FOR_SURFACE, LC, FACTEUR_MULTIPLICATIF;
+extern int Alerte_Point_Scabreux;
+extern PointRecord *gPointArray;
+extern Surface *PARAMETRIC;
+
+static Tree_T *Tsd, *Sim_Sur_Le_Bord /*,*POINTS_TREE */ ;
+static List_T *Simplexes_Destroyed, *Simplexes_New, *Suppress;
+static Simplex *THES;
+static Vertex *THEV;
+static Surface *SURF;
+static Tree_T *FacesTree;
+static int ZONEELIMINEE, Methode = 0;
+static double volume;
+static List_T *coquille;
+static Edge *THEEDGE;
+
+extern void Make_Mesh_With_Points (DocRecord * ptr, PointRecord * Liste, int Numpoints);
+
+double Interpole_lcTriangle (Simplex * s, Vertex * vv){
+  double Xp, Yp, X[3], Y[3], det, u, v, q1, q2, q3;
+
+  Xp = vv->Pos.X;
+  Yp = vv->Pos.Y;
+
+  X[0] = s->V[0]->Pos.X;
+  X[1] = s->V[1]->Pos.X;
+  X[2] = s->V[2]->Pos.X;
+
+  Y[0] = s->V[0]->Pos.Y;
+  Y[1] = s->V[1]->Pos.Y;
+  Y[2] = s->V[2]->Pos.Y;
+
+  q1 = s->V[0]->lc;
+  q2 = s->V[1]->lc;
+  q3 = s->V[2]->lc;
+
+  det = (X[2] - X[0]) * (Y[1] - Y[0]) - (Y[2] - Y[0]) * (X[1] - X[0]);
+
+  if (det != 0.0){
+    u = ((Xp - X[0]) * (Y[1] - Y[0]) - (Yp - Y[0]) * (X[1] - X[0])) / det;
+    v = ((X[2] - X[0]) * (Yp - Y[0]) - (Y[2] - Y[0]) * (Xp - X[0])) / det;
+  }
+  else{
+    u = v = 0.0;
+  }
+  return (q1 * (1. - u - v) + q2 * v + q3 * u);
+}
+
+
+/* Au sens Riemannien, trouver le centre de l'ellipse
+   triangle de sommets (x1,x2,x3)
+
+   T                   T
+   (x-x1)  M (x-x1) = (x-x2)  M (x-x2)
+   T                   T
+   (x-x1)  M (x-x1) = (x-x3)  M (x-x3)
+ */
+
+void matXmat (int n, double mat1[3][3], double mat2[3][3], double Res[3][3]){
+  for (int i = 0; i < n; i++){
+    for (int j = 0; j < n; j++){
+      Res[i][j] = 0.0;
+      for (int k = 0; k < n; k++)
+	Res[i][j] += mat1[i][k] * mat2[k][j];
+    }
+  }
+}
+
+void TmatXmat (int n, double mat1[3][3], double mat2[3][3], double Res[3][3]){
+  for (int i = 0; i < n; i++){
+    for (int j = 0; j < n; j++){
+      Res[i][j] = 0.0;
+      for (int k = 0; k < n; k++)
+	Res[i][j] += mat1[k][i] * mat2[k][j];
+    }
+  }
+}
+
+Simplex * Create_Simplex_For2dmesh (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){
+  Simplex *s;
+  double p12, p23, p13;
+
+  s = Create_Simplex (v1, v2, v3, v4);
+
+  THEM->Metric->setSimplexQuality (s, PARAMETRIC);
+
+  if (PARAMETRIC){
+    if ((!v2->ListCurves && !v3->ListCurves && !v3->ListCurves)){
+      prosca (v1->us, v2->us, &p12);
+      p12 = fabs (p12);
+      prosca (v1->us, v3->us, &p13);
+      p13 = fabs (p13);
+      prosca (v2->us, v3->us, &p23);
+      p23 = fabs (p23);
+      if (s->Quality < CONV_VALUE && 
+	  (p12 < THEM->Metric->min_cos || p13 < THEM->Metric->min_cos ||
+	   p23 < THEM->Metric->min_cos))
+	s->Quality = 1.0;
+    }
+  }
+  return s;
+}
+
+/*En l'honneur de ma femme Stephanie... */
+
+void VSIM_2D (void *a, void *b){
+  Simplex *S;
+
+  S = *(Simplex **) a;
+  if (S->V[2])
+    volume += fabs (S->Volume_Simplexe2D ());
+}
+
+void Box_2_Triangles (List_T * P, Surface * s){
+#define FACT 1.1
+#define LOIN 0.2
+
+  int i, j;
+  static int pts[4][2] = { {0, 0},
+			   {1, 0},
+			   {1, 1},
+			   {0, 1} };
+  static int tri[2][3] =  { {1, 4, 2},
+			    {2, 4, 3} };
+  double Xm, Ym, XM, YM, Xc, Yc;
+  Simplex *S, *ps;
+  Vertex *V, *v, *pv;
+  List_T *smp;
+
+  smp = List_Create (2, 1, sizeof (Simplex *));
+
+  V = (Vertex *) Malloc (4 * sizeof (Vertex));
+
+  for (i = 0; i < List_Nbr (P); i++){
+    List_Read (P, i, &v);
+    if (!i){
+      Xm = XM = v->Pos.X;
+      Ym = YM = v->Pos.Y;
+    }
+    else{
+      Xm = DMIN (Xm, v->Pos.X);
+      XM = DMAX (XM, v->Pos.X);
+      Ym = DMIN (Ym, v->Pos.Y);
+      YM = DMAX (YM, v->Pos.Y);
+    }
+  }
+  if (Xm == XM)
+    XM = Xm + 1.;
+  if (Ym == YM)
+    YM = Ym + 1.;
+
+  Xc = XM - Xm;
+  Yc = YM - Ym;
+
+  /* initialisation de la grille */
+
+  s->Grid.init = 0;
+  s->Grid.min.X = Xm - LOIN * FACT * Xc;
+  s->Grid.min.Y = Ym - LOIN * FACT * Yc;
+  s->Grid.max.X = XM + LOIN * FACT * Xc;
+  s->Grid.max.Y = YM + LOIN * FACT * Yc;
+
+  s->Grid.Nx = s->Grid.Ny = 20;
+
+  /* Longueur Caracteristique */
+
+  LC = sqrt (Xc * Xc + Yc * Yc);
+
+  for (i = 0; i < 4; i++){
+    if (pts[i][0])
+      V[i].Freeze.X = V[i].Pos.X = Xm - LOIN * Xc;
+    else
+      V[i].Freeze.X = V[i].Pos.X = XM + LOIN * Xc;
+    if (pts[i][1])
+      V[i].Freeze.Y = V[i].Pos.Y = Ym - LOIN * Yc;
+    else
+      V[i].Freeze.Y = V[i].Pos.Y = YM + LOIN * Yc;
+    
+    V[i].Freeze.Z = V[i].Pos.Z = 0.0;
+    
+    V[i].Num = -(++CurrentNodeNumber);
+    V[i].ListSurf = NULL;
+    pv = &V[i];
+    pv->lc = 1.0;
+    pv->Mov = NULL;
+    Tree_Replace (s->Vertices, &pv);
+  }
+  
+  /* 2 Triangles forment le maillage de la boite */
+
+  for (i = 0; i < 2; i++){
+    S = Create_Simplex_For2dmesh (&V[tri[i][0] - 1], &V[tri[i][1] - 1], 
+				  &V[tri[i][2] - 1], NULL);
+    List_Add (smp, &S);
+    S->iEnt = s->Num;
+  }
+  
+  Link_Simplexes (smp, NULL);
+  for (i = 0; i < List_Nbr (smp); i++){
+    List_Read (smp, i, &ps);
+    for (j = 0; j < 3; j++)
+      if (ps->S[j] == NULL)
+	ps->S[j] = &MyNewBoundary;
+    Tree_Replace (s->Simplexes, &ps);
+  }
+}
+
+
+int Intersect_Edges_2d (Edge * a, Edge * b){
+  double mat[2][2];
+  double rhs[2], x[2];
+  mat[0][0] = (a->V[1]->Pos.X - a->V[0]->Pos.X);
+  mat[0][1] = -(b->V[1]->Pos.X - b->V[0]->Pos.X);
+  mat[1][0] = (a->V[1]->Pos.Y - a->V[0]->Pos.Y);
+  mat[1][1] = -(b->V[1]->Pos.Y - b->V[0]->Pos.Y);
+  rhs[0] = b->V[0]->Pos.X - a->V[0]->Pos.X;
+  rhs[1] = b->V[0]->Pos.Y - a->V[0]->Pos.Y;
+  if (!sys2x2 (mat, rhs, x))
+    return 0;
+  if (x[0] > 0.0 && x[0] < 1.0 && x[1] > 0.0 && x[1] < 1.0)
+    return 1;
+  return 0;
+}
+
+int compareedgeptr (const void *a, const void *b){
+  int i1, i2, j1, j2;
+  Edge *q, *w;
+
+  q = *(Edge **) a;
+  w = *(Edge **) b;
+  i1 = IMAX (q->V[0]->Num, q->V[1]->Num);
+  i2 = IMAX (w->V[0]->Num, w->V[1]->Num);
+  j1 = IMIN (q->V[0]->Num, q->V[1]->Num);
+  j2 = IMIN (w->V[0]->Num, w->V[1]->Num);
+
+  if (i1 < i2)
+    return (1);
+  if (i1 > i2)
+    return (-1);
+  if (j1 < j2)
+    return (1);
+  if (j1 > j2)
+    return (-1);
+  return 0;
+}
+
+void putaindecoquille_2D (void *a, void *b){
+  Edge *e = (Edge *) a;
+  if (!compareVertex (&e->V[0], &THEEDGE->V[0]) ||
+      !compareVertex (&e->V[0], &THEEDGE->V[1]) ||
+      !compareVertex (&e->V[1], &THEEDGE->V[0]) ||
+      !compareVertex (&e->V[1], &THEEDGE->V[1])){
+    return;
+  }
+  if (Intersect_Edges_2d (e, THEEDGE))
+    List_Add (coquille, &e);
+}
+
+void Recover_Edge (Surface * s, Edge * e, EdgesContainer & Edges){
+  THEEDGE = e;
+  int i;
+  Edge *me, E;
+  Vertex *v[2];
+
+  coquille = List_Create (3, 3, sizeof (Edge *));
+  /*On cherche la coquille */
+  Tree_Action (Edges.AllEdges, putaindecoquille_2D);
+  Msg(INFO, "edge (%d %d) %d intersect", 
+      e->V[0]->Num, e->V[1]->Num, List_Nbr (coquille));
+
+  if(List_Nbr(coquille)==1){
+    Msg(WARNING, "Unable to swap edge");
+    List_Delete (coquille);
+    return;
+  }
+  
+  /*on swappe au hasard jusqu'a ce qu l'arete soit recuperee */
+  while (List_Nbr(coquille)){
+
+    i = (int) (List_Nbr(coquille)*rand()/(RAND_MAX+1.0));
+    //i = rand () % List_Nbr (coquille);
+    List_Read (coquille, i, &me);
+    v[0] = me->V[0];
+    v[1] = me->V[1];
+    List_Suppress (coquille, &me, compareedgeptr);
+    Edges.SwapEdge (v);
+    if (Edges.Search (e->V[0], e->V[1]))
+      break;
+    E.V[0] = v[0];
+    E.V[1] = v[1];
+    me = (Edge *) Tree_PQuery (Edges.AllEdges, &E);
+    putaindecoquille_2D (me, NULL);
+  }
+
+  List_Delete (coquille);
+  /*On swappe */
+}
+
+Vertex * FindVertex2 (int inum, Mesh * M){
+  Vertex C, *pc;
+  pc = &C;
+  pc->Num = inum;
+  if (Tree_Query (M->Vertices, &pc)){
+    return pc;
+  }
+  return NULL;
+}
+
+void constraint_the_edge (int isurf, int iv1, int iv2){
+  Vertex *v1 = FindVertex2 (iv1, THEM);
+  Vertex *v2 = FindVertex2 (iv2, THEM);
+  Surface *s = FindSurface (isurf, THEM);
+  Edge e;
+
+  if (!v1 || !v2)
+    return;
+  EdgesContainer EdgesOnSurface (s->Simplexes, false);
+  e.V[0] = v1;
+  e.V[1] = v2;
+  if (!EdgesOnSurface.Search (v1, v2)){
+    Recover_Edge (s, &e, EdgesOnSurface);
+  }
+}
+
+void missing_edges_2d (Surface * s){
+  int i, j;
+  Curve *c;
+  Vertex *v1, *v2;
+  Edge e;
+
+  EdgesContainer EdgesOnSurface (s->Simplexes, false);
+
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &c);
+    for (j = 1; j < List_Nbr (c->Vertices); j++){
+      List_Read (c->Vertices, j - 1, &v1);
+      List_Read (c->Vertices, j, &v2);
+      e.V[0] = v1;
+      e.V[1] = v2;
+      if (!EdgesOnSurface.Search (v1, v2)) {
+	Msg(INFO, "Missing edge %d-%d", v1->Num, v2->Num);
+	Recover_Edge (s, &e, EdgesOnSurface);
+      }
+    }
+  }
+}
+
+int Restore_Boundary (Surface * s){
+  missing_edges_2d (s);
+  return 1;
+}
+
+int Maillage_Edge (Vertex * v1, Vertex * v2, List_T * Points){
+  int i;
+  static int qq = 1;
+  Simplex S, *s;
+
+  s = &S;
+  s->F[0].V[0] = v1;
+  s->F[0].V[1] = v2;
+
+  if (Tree_Search (FacesTree, &s))
+    return 0;
+
+  s = Create_Simplex_For2dmesh (v1, v2, NULL, NULL);
+  Tree_Add (FacesTree, &s);
+
+  Curve *c = Create_Curve (qq++, MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0, 1);
+  Vertex *v;
+  c->Control_Points = List_Create (2, 1, sizeof (Vertex *));
+  List_Add (c->Control_Points, &v1);
+  List_Add (c->Control_Points, &v2);
+  c->beg = v1;
+  c->end = v2;
+  Maillage_Curve (&c, NULL);
+  for (i = 1; i < List_Nbr (c->Vertices) - 1; i++){
+    List_Read (c->Vertices, i, &v);
+    List_Delete (v->ListCurves);
+    v->ListCurves = NULL;
+    List_Add (Points, &v);
+  }
+  List_Delete (c->Vertices);
+  List_Delete (c->Control_Points);
+  Free (c);
+  return 1;
+}
+
+void Action_First_Simplexes_2D (void *a, void *b){
+  Simplex *q;
+
+  if (!THES){
+    q = *(Simplex **) a;
+    if (q->Pt_In_Ellipsis (THEV, THEM->Metric->m)){
+      THES = q;
+    }
+  }
+}
+
+void Fill_Sim_Des_2D (void *a, void *b){
+  Simplex *S;
+  S = *(Simplex **) a;
+  if (S->Pt_In_Ellipsis (THEV, THEM->Metric->m))
+    List_Add (Simplexes_Destroyed, a);
+}
+
+void TStoLS_2D (void *a, void *b){
+  List_Add (Simplexes_Destroyed, a);
+}
+
+void TAtoLA_2D (void *a, void *b){
+  List_Add (Simplexes_New, a);
+}
+
+void CrSi_2D (void *a, void *b){
+  SxF *S;
+  Simplex *s;
+  S = (SxF *) a;
+  if (S->NumFaceSimpl == 1){
+    s = Create_Simplex_For2dmesh (THEV, S->F.V[0], S->F.V[1], NULL);
+    s->iEnt = ZONEELIMINEE;
+    List_Add (Simplexes_New, &s);
+  }
+  else if (S->NumFaceSimpl != 2){
+    Msg(WARNING, "GROSSE PANIQUE ...");
+  }
+}
+
+void NewSimplexes_2D (Surface * s, List_T * Sim, List_T * news){
+  int i, j;
+  Tree_T *SimXFac;
+  Simplex *S;
+  SxF SXF, *pSXF;
+
+  SimXFac = Tree_Create (sizeof (SxF), compareSxF);
+
+  for (i = 0; i < List_Nbr (Sim); i++){
+    List_Read (Sim, i, &S);
+    if (!i)
+      ZONEELIMINEE = S->iEnt;
+    else{
+      if (S->iEnt != ZONEELIMINEE){
+	Msg(WARNING, "Bizzare, l'elimination est foireuse %d %d\n",
+	    S->iEnt, ZONEELIMINEE);
+      }
+    }
+    for (j = 0; j < 3; j++){
+      SXF.F = S->F[j];
+      
+      if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))) {
+	(pSXF->NumFaceSimpl)++;
+      }
+      else {
+	SXF.NumFaceSimpl = 1;
+	Tree_Add (SimXFac, &SXF);
+      }
+    }
+  }
+  
+  /* Les faces non communes sont obligatoirement a la frontiere ...
+     -> Nouveaux simplexes */
+
+  Tree_Action (SimXFac, CrSi_2D);
+  Tree_Delete (SimXFac);
+}
+
+int recur_bowyer_2D (Simplex * s){
+  int i;
+
+  Tree_Insert (Tsd, &s);
+  for (i = 0; i < 3; i++){
+    if (s->S[i] && s->S[i] != &MyNewBoundary && !Tree_Query (Tsd, &s->S[i])){
+      if (s->S[i]->Pt_In_Ellipsis (THEV, THEM->Metric->m) && (s->iEnt == s->S[i]->iEnt)){
+	recur_bowyer_2D (s->S[i]);
+      }
+      else{
+	if (s->iEnt != s->S[i]->iEnt){
+	  Alerte_Point_Scabreux = 1;
+	}
+	Tree_Insert (Sim_Sur_Le_Bord, &s->S[i]);
+      }
+    }
+  }
+  return 1;
+}
+
+
+bool draw_simplex2d (Surface * sur, Simplex * s, bool nouv){
+  double x[3], y[3], z[3];
+  Vertex v1, v2, v3;
+
+  if (!THEM->MeshParams.InteractiveDelaunay)
+    return false;
+
+  if (s == &MyNewBoundary || !s || !s->iEnt)
+    return false;
+
+  v1 = InterpolateSurface (sur->Support, s->V[0]->Pos.X, s->V[0]->Pos.Y, 0, 0);
+  v2 = InterpolateSurface (sur->Support, s->V[1]->Pos.X, s->V[1]->Pos.Y, 0, 0);
+  v3 = InterpolateSurface (sur->Support, s->V[2]->Pos.X, s->V[2]->Pos.Y, 0, 0);
+
+  x[0] = v1.Pos.X;
+  x[1] = v2.Pos.X;
+  x[2] = v3.Pos.X;
+  y[0] = v1.Pos.Y;
+  y[1] = v2.Pos.Y;
+  y[2] = v3.Pos.Y;
+  z[0] = v1.Pos.Z;
+  z[1] = v2.Pos.Z;
+  z[2] = v3.Pos.Z;
+
+  if (nouv)
+    draw_polygon_2d (1., 0., 0., 3, x, y, z);
+  else
+    draw_polygon_2d (0., 0., 0., 3, x, y, z);
+
+  return true;
+}
+
+bool Bowyer_Watson_2D (Surface * sur, Vertex * v, Simplex * S, int force){
+  int i;
+  Simplex *s;
+  static int init = 1;
+  double volumeold, volumenew;
+
+  THEV = v;
+
+  double x = (S->V[0]->Pos.X + S->V[1]->Pos.X + S->V[2]->Pos.X) / 3.;
+  double y = (S->V[0]->Pos.Y + S->V[1]->Pos.Y + S->V[2]->Pos.Y) / 3.;
+
+  if (force)
+    THEM->Metric->setMetricMin (x, y, sur->Support);
+  else
+    THEM->Metric->setMetric (x, y, sur->Support);
+
+  Tsd = Tree_Create (sizeof (Simplex *), compareSimplex);
+  Sim_Sur_Le_Bord = Tree_Create (sizeof (Simplex *), compareSimplex);
+  if (init){
+    Simplexes_New = List_Create (10, 10, sizeof (Simplex *));
+    Simplexes_Destroyed = List_Create (10, 10, sizeof (Simplex *));
+    init = 0;
+  }
+
+  if (Methode){
+    Tree_Action (sur->Simplexes, Fill_Sim_Des_2D);
+    S = NULL;
+  }
+  else{
+    recur_bowyer_2D (S);
+  }
+  
+  Tree_Action (Tsd, TStoLS_2D);
+  NewSimplexes_2D (sur, Simplexes_Destroyed, Simplexes_New);
+
+  /* calcul des volumes des simplexes crees */
+
+  if (Alerte_Point_Scabreux || !SPEED_MAX){
+    volume = 0.0;
+    for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){
+      VSIM_2D (List_Pointer (Simplexes_Destroyed, i), NULL);
+    }
+    volumeold = volume;
+    volume = 0.0;
+    for (i = 0; i < List_Nbr (Simplexes_New); i++){
+      VSIM_2D (List_Pointer (Simplexes_New, i), NULL);
+    }
+    volumenew = volume;
+    if (volumeold + volumenew == 0.0)
+      volumenew = 1.0;
+  }
+  else{
+    volumeold = 1.0;
+    volumenew = 1.0;
+  }
+
+  /* critere du volume */
+
+  if ((fabs (volumeold - volumenew) / (volumeold + volumenew)) > 1.e-8){
+    if (S){
+      Tree_Suppress (sur->Simplexes, &S);
+      S->Quality /= 2.;
+      Tree_Add (sur->Simplexes, &S);
+    }
+    if(force){
+      List_Reset (Simplexes_New);
+      List_Reset (Simplexes_Destroyed);
+      Tree_Delete (Sim_Sur_Le_Bord);
+      Tree_Delete (Tsd);
+      return false;
+    }
+  }
+  else{
+    Tree_Add (sur->Vertices, &THEV);
+
+    /* Suppression des simplexes elimines */
+    for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){
+      List_Read (Simplexes_Destroyed, i, &s);
+      draw_simplex2d (sur, s, 0);
+      if (!Tree_Suppress (sur->Simplexes, &s)){
+	Msg(WARNING, "aie aie aie");
+      }
+      Free (s);
+    }
+    for (i = 0; i < List_Nbr (Simplexes_New); i++){
+      List_Read (Simplexes_New, i, &s);
+      draw_simplex2d (sur, s, 1);
+      Tree_Add (sur->Simplexes, &s);
+    }
+    
+    /* Creation des liens entre nouveaux simplexes */
+    
+    Tree_Action (Sim_Sur_Le_Bord, TAtoLA_2D);
+    Link_Simplexes (Simplexes_New, sur->Simplexes);
+  }
+  
+  List_Reset (Simplexes_New);
+  List_Reset (Simplexes_Destroyed);
+  Tree_Delete (Sim_Sur_Le_Bord);
+  Tree_Delete (Tsd);
+  return true;
+}
+
+void Convex_Hull_Mesh_2D (List_T * Points, Surface * s){
+  int i, N;
+
+  N = List_Nbr (Points);
+
+  Msg(STATUS, "Meshing 2D... (Initial)");
+
+  Box_2_Triangles (Points, s);
+  for (i = 0; i < N; i++){
+    THES = NULL;
+    List_Read (Points, i, &THEV);
+    Tree_Action (s->Simplexes, Action_First_Simplexes_2D);
+    /*
+      if(i%n == n-1){
+        volume = 0.0;
+        Tree_Action(s->Simplexes,VSIM_2D);
+        Msg(STATUS, %d->%d Nodes, %d Elements",i+1,N,Tree_Nbr(s->Simplexes));
+      } 
+    */
+    if (!THES){
+      Msg(ERROR, "Vertex %12.5E %12.5E %12.5E in no simplex\n",
+	  THEV->Pos.X, THEV->Pos.Y, THEV->Pos.Z);
+      THEV->Pos.X += 10 * RAND_LONG;
+      THEV->Pos.Y += 10 * RAND_LONG;
+      THEV->Pos.Z += 10 * RAND_LONG;
+      Tree_Action (s->Simplexes, Action_First_Simplexes_2D);
+    }
+    bool  ca_marche = Bowyer_Watson_2D (s, THEV, THES, 1);
+    while(!ca_marche){
+      double dx = RAND_LONG;
+      double dy = RAND_LONG;
+      THEV->Pos.X += dx;
+      THEV->Pos.Y += dy;
+      ca_marche = Bowyer_Watson_2D (s, THEV, THES, 1);
+      THEV->Pos.X -= dx;
+      THEV->Pos.Y -= dy;
+      cout << "pb " << endl;
+    }
+  }
+
+}
+
+/* recuperation de la surface */
+
+static List_T *ListCurves, *ListAllCurves;
+static Tree_T *keep;
+static Simplex *SIMP;
+static int iSurface;
+
+void attribueSurface (void *a, void *b){
+  Simplex *s;
+  s = *(Simplex **) a;
+  s->iEnt = iSurface;
+}
+
+void Trouve_Simplex_2D (void *a, void *b){
+  Simplex *s;
+  if (SIMP != NULL)
+    return;
+  s = *(Simplex **) a;
+  if (s->iEnt < 0)
+    SIMP = s;
+}
+
+void Trouve_Simplex_Bord_2D (void *a, void *b){
+  Simplex *s;
+
+  if (SIMP != NULL)
+    return;
+  s = *(Simplex **) a;
+  if (s->V[0]->Num < 0 || s->V[1]->Num < 0 || s->V[2]->Num < 0)
+    SIMP = s;
+}
+
+void CourbesDansSurface (Surface * s, List_T * ListAllCurves){
+  int i, iseg;
+  Curve *c;
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &c);
+    iseg = abs (c->Num);
+    List_Replace (ListAllCurves, &iseg, fcmp_int);
+  }
+}
+
+int isListaSurface (List_T * ListSurf, Surface * s){
+  int NN, j, srf;
+  bool found;
+  Curve *c;
+  NN = 0;
+  found = true;
+  for (j = 0; j < List_Nbr (s->s.Generatrices); j++){
+    List_Read (s->s.Generatrices, j, &c);
+    srf = abs (c->Num);
+    if (!List_Search (ListSurf, &srf, fcmp_int)){
+      found = false;
+    }
+    else
+      NN++;
+  }
+  if (found && NN == List_Nbr (ListSurf))
+    return s->Num;
+  return 0;
+}
+
+static List_T *StackSimp;
+#define MAX_DEPTH 500
+
+void recur_trouve_surface (Simplex * s, int *Depth){
+  int i, j;
+  Simplex *pS, S;
+
+  if (s->iEnt != -1)
+    return;
+
+  if ((*Depth) > MAX_DEPTH){
+    List_Add (StackSimp, &s);
+    return;
+  }
+  
+  (*Depth)++;
+  s->iEnt = -2;
+  Tree_Add (keep, &s);
+  for (i = 0; i < 3; i++){
+    pS = &S;
+    pS->F[0] = s->F[i];
+    if (Tree_Query (FacesTree, &pS) && List_Search (ListAllCurves, &pS->iEnt, fcmp_int)){
+      j = abs (pS->iEnt);
+      List_Replace (ListCurves, &j, fcmp_int);
+    }
+    else if (s->S[i] && s->S[i] != &MyNewBoundary){
+      recur_trouve_surface (s->S[i], Depth);
+    }
+  }
+  (*Depth)--;
+}
+
+extern int compareSimpSurf (const void *a, const void *b);
+
+void Restore_Surface (Surface * s){
+  int N;
+  int i, depth;
+
+  StackSimp = List_Create (100, 100, sizeof (Simplex *));
+  ListCurves = List_Create (2, 2, sizeof (int));
+  iSurface = -1;
+  Tree_Action (s->Simplexes, attribueSurface);
+
+  /* Les simplexes sur le bord exterieur sont elimines */
+  ListAllCurves = List_Create (10, 3, sizeof (int));
+  CourbesDansSurface (s, ListAllCurves);
+
+
+  SIMP = NULL;
+  Tree_Action (s->Simplexes, Trouve_Simplex_Bord_2D);
+
+  if (SIMP){
+    List_Add (StackSimp, &SIMP);
+    keep = Tree_Create (sizeof (Simplex *), compareQuality);
+    depth = 0;
+    i = 0;
+    do{
+      List_Read (StackSimp, i, &SIMP);
+      recur_trouve_surface (SIMP, &depth);
+    }
+    while (++i < List_Nbr (StackSimp));
+    List_Reset (StackSimp);
+    
+    N = Tree_Nbr (keep);
+
+    iSurface = 0;
+    Tree_Action (keep, attribueSurface);
+    Tree_Delete (keep);
+    List_Reset (ListCurves);
+  }
+
+  while (1){
+    SIMP = NULL;
+    keep = Tree_Create (sizeof (Simplex *), compareQuality);
+    Tree_Action (s->Simplexes, Trouve_Simplex_2D);
+    if (!SIMP)
+      break;
+    List_Add (StackSimp, &SIMP);
+    depth = 0;
+    i = 0;
+    do{
+      List_Read (StackSimp, i, &SIMP);
+      recur_trouve_surface (SIMP, &depth);
+    }while (++i < List_Nbr (StackSimp));
+    
+    iSurface = isListaSurface (ListCurves, s);
+    
+    N = Tree_Nbr (keep);
+    Msg (INFO, "volume %d maillage initial %d simplexes %d/%d courbes %d fac",
+	 iSurface, N, List_Nbr (ListCurves), List_Nbr (ListAllCurves),
+	 Tree_Nbr (FacesTree));
+
+    Tree_Action (keep, attribueSurface);
+    Tree_Delete (keep);
+    List_Reset (ListCurves);
+    List_Reset (StackSimp);
+  }
+}
+
+void suppress_simplex_2D (void *data, void *dum){
+  Simplex **pv;
+
+  pv = (Simplex **) data;
+  if ((*pv)->iEnt == 0)
+    List_Add (Suppress, pv);
+}
+
+Vertex * NewVertex_2D (Simplex * s){
+  Vertex *v;
+  double lc;
+  lc = 0.333333333 * (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc);
+
+  //lc = DMIN(MAXIMUM_LC_FOR_SURFACE,lc);
+
+  /*v = Create_Vertex(  ++CurrentNodeNumber,
+     (s->V[0]->Pos.X + s->V[1]->Pos.X + s->V[2]->Pos.X)/3.,
+     (s->V[0]->Pos.Y + s->V[1]->Pos.Y + s->V[2]->Pos.Y)/3.,
+     0.0, lc, 0.0);
+   */
+
+  if (THEM->MeshParams.DelaunayInsertionMethod == INSERTION_CENTROID)
+    v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, 0.0, lc, 0.0);
+  else if (THEM->MeshParams.DelaunayInsertionMethod == INSERTION_EDGE) {
+    Vertex *vv[2];
+    double l = THEM->Metric->getWorstEdge (s, PARAMETRIC, vv);
+    double f = 0.5;
+    
+    if (vv[0]->lc <= vv[1]->lc)
+      f = vv[0]->lc / l;
+    else
+      f = 1. - (vv[1]->lc / l);
+    
+    if (f >= 1)
+      v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, 0.0, lc, 0.0);
+    else
+      v = Create_Vertex (++CurrentNodeNumber,
+			 f * vv[0]->Pos.X + (1. - f) * vv[1]->Pos.X,
+			 f * vv[0]->Pos.Y + (1. - f) * vv[1]->Pos.Y, 0.0, lc, 0.0);
+  }
+
+  v->lc = Interpole_lcTriangle (s, v);
+
+  if (PARAMETRIC){
+    if (!v->ListCurves)
+      Normal2Surface (PARAMETRIC->Support, v->Pos.X, v->Pos.Y, v->us);
+    else {
+      v->us[0] = v->us[1] = v->us[2] = 0.0;
+    }
+  }
+  return (v);
+}
+
+extern Mesh *LOCAL;
+
+void TRIE_MON_GARS (void *a, void *b){
+  Simplex *s = *(Simplex **) a;
+  s->Fourre_Simplexe (s->V[0], s->V[1], s->V[2], s->V[3]);
+  s->iEnt = SURF->Num;
+  s->S[0] = s->S[1] = s->S[2] = NULL;
+  THEM->Metric->setSimplexQuality (s, PARAMETRIC);
+  //SURF->Num;
+  //qsort(s->F[0].V,3,sizeof(Vertex*),compareVertex);
+}
+
+void RandomSwapEdges2d (Surface * s){
+  int i, j = 1, k;
+  List_T *AllTrg = Tree2List (s->Simplexes);
+  Simplex *t;
+  for (i = 0; i < List_Nbr (AllTrg); i++){
+    k = rand () % List_Nbr (AllTrg);
+    List_Read (AllTrg, k, &t);
+    j = rand () % 3;
+    if (draw_simplex2d (s, t, false))
+      draw_simplex2d (s, t->S[j], false);
+    t->SwapEdge (j);
+    if (draw_simplex2d (s, t, true))
+      draw_simplex2d (s, t->S[j], true);
+  }
+}
+
+void IntelligentSwapEdges (Surface * s, GMSHMetric * m){
+  int i, j, k;
+  List_T *AllTrg = Tree2List (s->Simplexes);
+  Vertex *p[4], *q[4];
+  Simplex *t;
+  for (i = 0; i < List_Nbr (AllTrg); i++) {
+    k = rand () % List_Nbr (AllTrg);
+    List_Read (AllTrg, k, &t);
+    j = rand () % 3;
+    if (t->ExtractOppositeEdges (j, p, q)){
+      double qp = 2. * m->EdgeLengthOnSurface (s, p, 1) 
+	/ (RacineDeTrois * (p[0]->lc + p[1]->lc));
+      double qq = 2. * m->EdgeLengthOnSurface (s, q, 1)
+	/ (RacineDeTrois * (q[0]->lc + q[1]->lc));
+      if (fabs (qp) > fabs (qq)){
+	if (draw_simplex2d (s, t, false))
+	  draw_simplex2d (s, t->S[j], false);
+	t->SwapEdge (j);
+	if (draw_simplex2d (s, t, true))
+	  draw_simplex2d (s, t->S[j], true);
+      }
+    }
+  }
+  List_Delete (AllTrg);
+}
+
+int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s){
+  List_T *Points = List_Create (100, 100, sizeof (Vertex *));
+  int j, i, N, n;
+  List_T *c;
+  Curve *cur, *curinv;
+  extern int FACE_DIMENSION;
+  Simplex *simp;
+  Vertex *newv;
+  static int COUNT = 0;
+
+  FACE_DIMENSION = 1;
+
+  SURF = s;
+  SPEED_MAX = 0;
+  LOCAL = NULL;
+
+  if (s->Typ == MSH_SURF_PLAN || s->Typ == MSH_SURF_REGL || s->Typ == MSH_SURF_TRIC)
+    PARAMETRIC = NULL;
+
+  ZONEELIMINEE = s->Num;
+
+  for (i = 0; i < List_Nbr (s->Contours); i++){
+    List_Read (s->Contours, i, &c);
+    for (j = 0; j < List_Nbr (c); j++){
+      Vertex *pv;
+      List_Read (c, j, &pv);
+      List_Add (Points, &pv);
+    }
+  }
+  
+  N = List_Nbr (Points);
+  n = N + 100;
+
+  Convex_Hull_Mesh_2D (Points, s);
+  List_Reset (Points);
+  Link_Simplexes (NULL, s->Simplexes);
+
+  //return 1;
+
+  if (!Restore_Boundary (s)){
+    //s->Simplexes = Tree_Create(sizeof(Simplex*),compareSimplex);
+    FACE_DIMENSION = 2;
+    Tree_Action (s->Simplexes, TRIE_MON_GARS);
+    return 1;
+  }
+
+  Tree_Action (s->Simplexes, TRIE_MON_GARS);
+  Link_Simplexes (NULL, s->Simplexes);
+  List_T *List = Tree2List (s->Simplexes);
+  Tree_Delete (s->Simplexes);
+  s->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality);
+  for (i = 0; i < List_Nbr (List); i++)
+    Tree_Add (s->Simplexes, List_Pointer (List, i));
+  List_Delete (List);
+
+  //  return 1;
+
+  FacesTree = Tree_Create (sizeof (Simplex *), compareSimpSurf);
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &cur);
+    curinv = FindCurve (abs (cur->Num), THEM);
+    List_T *temp = Tree2List (curinv->Simplexes);
+    for (j = 0; j < List_Nbr (temp); j++){
+      Tree_Add (FacesTree, List_Pointer (temp, j));
+    }
+    List_Delete (temp);
+  }
+
+  Restore_Surface (s);
+
+  Suppress = List_Create (10, 10, sizeof (Simplex *));
+  Tree_Action (s->Simplexes, suppress_simplex_2D);
+  for (i = 0; i < List_Nbr (Suppress); i++){
+    Tree_Suppress (s->Simplexes, List_Pointer (Suppress, i));
+  }
+  List_Delete (Suppress);
+  
+  if(!Tree_Right (s->Simplexes, &simp))
+    Msg(WARNING, "No Simplex left");
+  else{
+    i = 0;
+    while ( simp->Quality > CONV_VALUE){
+      newv = NewVertex_2D (simp);
+      while (!simp->Pt_In_Simplex_2D (newv) &&
+	     (simp->S[0] == &MyNewBoundary || !simp->S[0]->Pt_In_Simplex_2D (newv)) &&
+	     (simp->S[1] == &MyNewBoundary || !simp->S[1]->Pt_In_Simplex_2D (newv)) &&
+	     (simp->S[2] == &MyNewBoundary || !simp->S[2]->Pt_In_Simplex_2D (newv))){
+	/*
+	  Msg(INFO,"pt : %12.5E %12.5E",newv->Pos.X,newv->Pos.Y);
+	  Msg(INFO,"not in : (%12.5E %12.5E) (%12.5E %12.5E) (%12.5E %12.5E)",
+	  simp->V[0]->Pos.X,simp->V[0]->Pos.Y,simp->V[1]->Pos.X,
+	  simp->V[1]->Pos.Y,simp->V[2]->Pos.X,simp->V[2]->Pos.Y);
+	*/
+	Tree_Suppress (s->Simplexes, &simp);
+	simp->Quality /= 2.;
+	Tree_Insert (s->Simplexes, &simp);
+	Tree_Right (s->Simplexes, &simp);
+	if (simp->Quality < CONV_VALUE)
+	  break;
+	newv = NewVertex_2D (simp);
+      }
+      if (simp->Quality < CONV_VALUE)
+	break;
+      i++;
+      if (i % n == n - 1){
+	volume = 0.0;
+	Tree_Action (s->Simplexes, VSIM_2D);
+	Msg(STATUS, "%d Nodes, %d Elements",
+	    Tree_Nbr (s->Vertices), Tree_Nbr (s->Simplexes));
+	Msg(SELECT, "Vol(%.6e) Conv(%g->%.1f)", volume, simp->Quality, CONV_VALUE);
+      }
+      Bowyer_Watson_2D (s, newv, simp, 0);
+      Tree_Right (s->Simplexes, &simp);
+      //if(i>COUNT)break;
+    }
+  }
+
+  //for(i=0;i<3;i++)RandomSwapEdges2d(s);
+  //for(i=0;i<2;i++)IntelligentSwapEdges(s,THEM->Metric);
+
+  List_Reset (Points);
+  FACE_DIMENSION = 2;
+  COUNT++;
+
+  Tree_Action (s->Simplexes, TRIE_MON_GARS);
+  Link_Simplexes (NULL, s->Simplexes);
+  List = Tree2List (s->Simplexes);
+  Tree_Delete (s->Simplexes);
+  s->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
+  for (i = 0; i < List_Nbr (List); i++)
+    Tree_Add (s->Simplexes, List_Pointer (List, i));
+  List_Delete (List);
+
+  /*suppression des points de la boite */
+  List = Tree2List (s->Vertices);
+  for (i = 0; i < List_Nbr (List); i++){
+    List_Read (List, i, &THEV);
+    if (THEV->Num < 0){
+      Tree_Suppress (s->Vertices, &THEV);
+      //delete THEV;
+    }
+  }
+  List_Delete (List);
+
+  /*
+     RandomSwapEdges2d(s);
+     for(i=0;i<1;i++)IntelligentSwapEdges(s,THEM->Metric);
+   */
+  //IntelligentSwapEdges(s,THEM->Metric);
+
+  List_Delete (Points);
+  return 1;
+}
diff --git a/Mesh/2D_Parametric.cpp b/Mesh/2D_Parametric.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fca01280fc4b43caf64b306c467cf991a4535260
--- /dev/null
+++ b/Mesh/2D_Parametric.cpp
@@ -0,0 +1,128 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Interpolation.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+#include "Create.h"
+#include "Context.h"
+#include "Numeric.h"
+
+extern Mesh      *THEM;
+extern Context_T  CTX;
+
+static Surface *SURF;
+Surface *PARAMETRIC;
+
+/* SURFACES CYLINDRIQUES */
+
+void XYZtoUV (void *a, void *dum){
+  Vertex *v;
+  double uu, vv;
+  v = *(Vertex **) a;
+  ProjectPointOnSurface (SURF->Support, v, &uu, &vv);
+  v->Pos.X = uu;
+  v->Pos.Y = vv;
+  v->Pos.Z = 0.0;
+}
+
+void UVtoXYZ (void *a, void *dum){
+  Vertex *v, n;
+  v = *(Vertex **) a;
+
+  n = InterpolateSurface (SURF->Support, v->Pos.X, v->Pos.Y, 0, 0);
+
+  v->Pos.X = n.Pos.X;
+  v->Pos.Y = n.Pos.Y;
+  v->Pos.Z = n.Pos.Z;
+}
+
+void printMetric (Mesh * m, Surface * s, char *name){
+
+  int N = 10, M = 10, i, j;
+  double u, v;
+  FILE *f = fopen (name, "w");
+  if (!f)
+    return;
+  fprintf (f, "View \"metric\" Offset{0,0,0} {\n");
+  for (i = 0; i < N; i++){
+    u = (s->ku[0]) + (s->ku[s->Nu + s->OrderU] - s->ku[0]) 
+      * (double) i / (double) (N - 1);
+    for (j = 0; j < M; j++){
+      v = (s->kv[0]) + (s->kv[s->Nv + s->OrderV] - s->kv[0]) 
+	* (double) j / (double) (M - 1);
+      m->Metric->setMetric (u, v, s);
+      fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)"
+	       "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n",
+	       u, v, u, v, u, v, 
+	       m->Metric->m[0][0], m->Metric->m[0][1], 0.0,
+	       m->Metric->m[0][0], m->Metric->m[0][1], 0.0, 
+	       m->Metric->m[0][0], m->Metric->m[0][1], 0.0);
+	  fprintf (f, "VT (%f,%f,0,%f,%f,0,%f,%f,0)"
+		   "{%g,%g,%g,%g,%g,%g,%g,%g,%g};\n",
+		   u, v, u, v, u, v, 
+		   m->Metric->m[1][0], m->Metric->m[1][1], 0.0,
+		   m->Metric->m[1][0], m->Metric->m[1][1], 0.0,
+		   m->Metric->m[1][0], m->Metric->m[1][1], 0.0);
+    }
+  }
+  fprintf (f, "};\n");
+  fclose (f);
+}
+
+int MeshParametricSurface (Surface * s){
+
+  int i, j, ori;
+  Curve *pC;
+  Vertex *v;
+  Tree_T *tnxe;
+
+  PARAMETRIC = s;
+
+  if (s->Typ == MSH_SURF_NURBS)
+    return 1;
+  if (s->Typ != MSH_SURF_TRIMMED || s->Support->Typ != MSH_SURF_NURBS)
+    return 0;
+
+  SURF = s;
+  if (!List_Nbr (s->s.Generatrices))
+    return 1;
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &pC);
+    for (j = 0; j < List_Nbr (pC->Vertices); j++){
+      List_Read (pC->Vertices, j, &v);
+      Tree_Insert (s->Vertices, List_Pointer (pC->Vertices, j));
+    }
+  }
+
+  //printMetric(THEM,s,"metric.pos");
+
+  Tree_Action (s->Vertices, Freeze_Vertex);
+
+  Tree_Action (s->Vertices, XYZtoUV);
+  ori = Calcule_Contours (s);
+
+  if (!AlgorithmeMaillage2DAnisotropeModeJF (s))
+    Maillage_Automatique_VieuxCode (s, THEM, ori);
+
+  if (CTX.mesh.nb_smoothing){
+    tnxe = Tree_Create (sizeof (NXE), compareNXE);
+    create_NXE (s->Vertices, s->Simplexes, tnxe);
+    
+    for(i = 0 ; i < CTX.mesh.nb_smoothing ; i++)
+      Tree_Action (tnxe, ActionLiss);
+    
+    //AmelioreSurface_EliminationTripet (s, THEM, tnxe);
+    
+    Tree_Delete (tnxe);
+  }
+
+  Tree_Action (s->Vertices, UVtoXYZ);
+  Tree_Action (s->Vertices, deFreeze_Vertex);
+
+  PARAMETRIC = NULL;
+
+  return 1;
+}
diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..eecf49d57f79280d39c16883a5ba47dacc8ec685
--- /dev/null
+++ b/Mesh/2D_Recombine.cpp
@@ -0,0 +1,119 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+#include "Create.h"
+#include "Numeric.h"
+
+extern Mesh     *THEM; 
+
+Tree_T    *RecEdges,*Triangles;
+Tree_T    *RecSimplex,*TREEELM;
+double     ALPHA;
+int        RECNUM;
+
+void addTriangles(void *data, void *dum){
+  Simplex *S;
+  S = *(Simplex**)data;
+  if(S->V[2] && !S->V[3])Tree_Add(Triangles,&S);
+}
+
+void addrecedges (void *a, void *b){
+  Edge *ed;
+  ed = (Edge*)a;
+  if(ed->a < ALPHA)Tree_Add(RecEdges,ed);
+}
+
+void CalculeAngles (void *a, void *b){
+  Edge *ed;
+  double Angle;
+
+  ed = (Edge*)a;
+  if(List_Nbr(ed->Simplexes) != 2){
+    ed->a = 90.;
+    return;
+  }
+  
+  Angle = fabs(90. - angle_3pts(ed->O[0],ed->V[0],ed->O[1]));
+  Angle = DMAX(fabs(90. - angle_3pts(ed->V[0],ed->O[1],ed->V[1])),Angle);
+  Angle = DMAX(fabs(90. - angle_3pts(ed->O[1],ed->V[1],ed->O[0])),Angle);
+  Angle = DMAX(fabs(90. - angle_3pts(ed->V[0],ed->O[0],ed->V[1])),Angle);
+  ed->a = Angle;
+}
+
+
+void Recombine_Farce (void *a, void *b){
+  Edge *ed;
+  Simplex *s1,*s2;
+  ed = (Edge*)a;
+
+  if (ed->a < ALPHA){
+    List_Read(ed->Simplexes,0,&s1);
+    List_Read(ed->Simplexes,1,&s2);
+    if(Tree_Search(RecSimplex,&s1)) return;
+    if(s1->V[3]) return;
+    if(Tree_Search(RecSimplex,&s2)) return;
+    if(s2->V[3]) return;
+    Tree_Add(RecSimplex,&s1);
+    Tree_Suppress(TREEELM,&s1);
+    s2->V[0] = ed->V[0];
+    s2->V[1] = ed->O[0];
+    s2->V[2] = ed->V[1];
+    s2->V[3] = ed->O[1];
+    RECNUM++;
+  }
+}
+
+void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
+  Tree_T *TreeEdges,*tnxe;
+  int ntot;
+
+  ALPHA = a;
+  TREEELM = TreeAllElg;
+  ntot = 0;
+
+  while(1){
+
+    /* Initialisation */
+    RECNUM = 0;
+    TreeEdges   = Tree_Create(sizeof(Edge),compareedge);
+    RecEdges    = Tree_Create(sizeof(Edge),compareedge_angle);
+    RecSimplex  = Tree_Create(sizeof(Simplex*),compareSimplex);
+    Triangles   = Tree_Create(sizeof(Simplex*),compareSimplex);
+
+    /* Recombinaison */
+    Tree_Action(TreeAllElg,addTriangles);
+    crEdges(Triangles,TreeEdges);
+    Tree_Action(TreeEdges,CalculeAngles);
+    Tree_Action(TreeEdges,addrecedges);
+    Tree_Action(RecEdges,Recombine_Farce);
+
+    /* Lissage */
+    tnxe = Tree_Create(sizeof(NXE),compareNXE);
+    create_NXE(TreeAllVert,TreeAllElg,tnxe);
+    Tree_Action(tnxe,ActionLissSurf);
+    Tree_Action(tnxe,ActionLissSurf);
+    Tree_Action(tnxe,ActionLissSurf);
+    Tree_Delete(tnxe);
+
+    /* Destruction */
+    Tree_Delete(TreeEdges);
+    Tree_Delete(RecEdges);
+    Tree_Delete(RecSimplex);
+    Tree_Delete(Triangles);
+
+    /* Si aucune recombinaison -> fin */
+    ntot += RECNUM;
+    if(!RECNUM)break;
+  }
+
+  Msg(INFO, "Recombining: %d quadrangles",ntot); 
+
+  THEM->Statistics[7] -= ntot/2; 
+  THEM->Statistics[8] += ntot; 
+  
+}
+
+
+
diff --git a/Mesh/2D_SMesh.cpp b/Mesh/2D_SMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b88ee8b698896ecf94e79d4b728ba4a2a83b3bc
--- /dev/null
+++ b/Mesh/2D_SMesh.cpp
@@ -0,0 +1,286 @@
+/*  
+  Maillage transfini surfacique                                                 
+                                            *s2
+       s3     c2    s2                     /|  
+        *-----------*                     / |
+        |           |                  c2/  |c1   
+      c3|           |c1                 /   |  
+        |           |                  /    |
+  v     *-----------*                 *-----*
+  |    s0     c0    s1               s0  c0  s1
+  *--u
+
+  Decoupages :  |
+                *--*
+                |\ |
+                | \|   
+                *--*-- 
+               s0    -> s1
+*/
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Numeric.h"
+#include "Interpolation.h"
+
+extern Mesh  *THEM;
+extern int    CurrentNodeNumber;
+
+int index1d (int flag, int N, int n){
+  switch(flag){    
+  case 0 : return(n);
+  case 1 : return(N-n-1);
+  default : return -1;
+  }
+}
+
+int MeshTransfiniteSurface (Surface *sur) {  
+  int       i,j,k,flag,nb,N1,N2,issphere;
+  int       nbquad=0,nbtri=0;
+  Curve    *G[4],*GG[4];
+  Vertex    V,**vexist,*pV,*c1,*c2,**list,*CP[2];
+  Simplex  *simp;
+  double    u,v;
+  int       C_flag[4];
+  Vertex   *C[4],*S[4];
+
+  static int tab1qua[] = {0,1, 1,2, 3,2, 0,3};
+  static int tab1tri[] = {0,1, 1,2, 0,2};
+  static int tab2[] = {0,1, 1,0};
+
+  if (sur->Method != TRANSFINI) return(0);
+
+  switch(sur->Typ){
+
+  case MSH_SURF_REGL:
+  case MSH_SURF_PLAN:
+  case MSH_SURF_TRIC:
+  case MSH_SURF_NURBS:
+
+    nb = List_Nbr(sur->s.Generatrices);
+    if(nb != 3 && nb != 4) return(0);
+
+    for(i=0;i<4;i++) G[i] = NULL ;
+
+    for(i=0;i<nb;i++){
+      V.Num = sur->ipar[i];
+      pV = &V;
+      if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) {
+	Msg(WARNING, "Unknown Control Point %d in Transfinite Surface %d",
+		V.Num,sur->Num); 
+	return(0);
+      }
+      else{
+	S[i]=*vexist;
+      }
+    }       
+
+    for(i=0;i<nb;i++) List_Read(sur->s.Generatrices,i,&GG[i]);
+
+    for(i=0;i<nb;i++){      
+      List_Read(GG[i]->Control_Points,0,&CP[0]);
+      List_Read(GG[i]->Control_Points,List_Nbr(GG[i]->Control_Points)-1,&CP[1]);
+
+      for(flag=0;flag<2;flag++){
+	for(k=0;k<nb;k++){
+	  if(nb == 4){
+	    if(S[tab1qua[2*k  ]]->Num == CP[tab2[2*flag  ]]->Num && 
+	       S[tab1qua[2*k+1]]->Num == CP[tab2[2*flag+1]]->Num){ 
+	      G[k]=GG[i];
+	      C_flag[k]=flag;
+	    }
+	  }
+	  else{
+	    if(S[tab1tri[2*k  ]]->Num == CP[tab2[2*flag  ]]->Num && 
+	       S[tab1tri[2*k+1]]->Num == CP[tab2[2*flag+1]]->Num){ 
+	      G[k]=GG[i];
+	      C_flag[k]=flag;
+	    }
+	  }
+	}	
+      }
+    }
+
+    for(i=0;i<nb;i++)
+      if(G[i] == NULL) {
+	Msg(WARNING, "Wrong definition of Transfinite Surface(%d)", 
+		sur->Num); 
+	return(0);
+      }
+
+    if(nb == 4) {
+      if((N1 = List_Nbr(G[0]->Vertices)) != List_Nbr(G[2]->Vertices)) return(0); 
+      if((N2 = List_Nbr(G[1]->Vertices)) != List_Nbr(G[3]->Vertices)) return(0); 
+    }
+    else {
+      if((N1 = List_Nbr(G[0]->Vertices)) != List_Nbr(G[2]->Vertices)) return(0); 
+      N2 = List_Nbr(G[1]->Vertices);      
+    }
+
+    sur->Nu = N1;
+    sur->Nv = N2;
+    list = (Vertex**)Malloc(N1*N2*sizeof(Vertex*));
+
+    issphere = 1;
+    for(i=0;i<nb;i++){
+      if(G[i]->Typ != MSH_SEGM_CIRC && G[i]->Typ != MSH_SEGM_CIRC_INV){
+	issphere = 0;
+      }
+      else if (issphere){
+	if(!i){
+	  List_Read(G[i]->Control_Points, 1, &c1);
+	}
+	else{
+	  List_Read(G[i]->Control_Points, 1, &c2);
+	  if(compareVertex(&c1,&c2))issphere = 0;
+	}
+      }
+    }
+    
+    for(i=0;i<N1;i++){
+      List_Read(G[0]->Vertices, index1d(C_flag[0],N1,i), &C[0]);
+      List_Read(G[2]->Vertices, index1d(C_flag[2],N1,i), &C[2]);	
+
+      if( (G[0]->Num>0 && C_flag[0]) || (G[0]->Num<0 && !C_flag[0]) ) 
+	u = 1.-C[0]->u; 
+      else
+	u = C[0]->u;
+
+      for(j=0;j<N2;j++){
+	List_Read(G[1]->Vertices, index1d(C_flag[1],N2,j), &C[1]);
+	if(nb == 4) 
+	  List_Read(G[3]->Vertices, index1d(C_flag[3],N2,j), &C[3]);
+
+	if( (G[1]->Num>0 && C_flag[1]) || (G[1]->Num<0 && !C_flag[1]) ) 
+	  v = 1.-C[1]->u;
+	else
+	  v = C[1]->u;
+
+	if(i && j && i != N1-1 && j != N2-1){
+	  if (sur->Typ == MSH_SURF_NURBS)
+	    V = InterpolateSurface (sur, u, v, 0, 0);
+	  else if(nb == 4) 
+	    V = TransfiniteQua(*C[0],*C[1],*C[2],*C[3],*S[0],*S[1],*S[2],*S[3],u,v);
+	  else
+	    V = TransfiniteTri(*C[0],*C[1],*C[2],*S[0],*S[1],*S[2],u,v);
+	  if(issphere) 
+	    TransfiniteSph(*C[0],*c1,&V);
+	  list[i+N1*j] = Create_Vertex(++CurrentNodeNumber,V.Pos.X,V.Pos.Y,V.Pos.Z,V.lc,0.0);
+	}
+	else if(!i) 
+	  list[i+N1*j] = (nb == 4)?C[3]:C[2];
+	else if(!j) 
+	  list[i+N1*j] = C[0];
+	else if(i == N1-1) 
+	  list[i+N1*j] = C[1];
+	else if(j == N2-1) 
+	  list[i+N1*j] = C[2];
+	
+	list[i + N1 * j]->us[0] = u;
+	list[i + N1 * j]->us[1] = v;
+      }
+    }
+
+
+    for(i=0;i<N1;i++){
+      for(j=0;j<N2;j++){
+	List_Add(sur->TrsfVertices,&list[i+N1*j]);
+      }
+    }
+
+    if(nb == 4){      
+      for(i=0;i<N1;i++){
+	for(j=0;j<N2;j++){
+	  Tree_Replace(sur->Vertices,&list[i+N1*j]);
+	}
+      }      
+      for(i=0;i<N1-1;i++){
+	for(j=0;j<N2-1;j++){
+	  if(sur->Recombine){
+	    simp = Create_Quadrangle(list[(i) + N1*(j)], list[(i+1)+ N1*(j)],
+				     list[(i+1)+ N1*(j+1)], list[(i)+ N1*(j+1)]);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    nbquad++;
+	  }
+	  else{
+	    simp = Create_Simplex(list[(i) + N1*(j)], list[(i+1) + N1*(j)], 
+				  list[(i) + N1*(j+1)], NULL);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    simp = Create_Simplex(list[(i+1) + N1*(j+1)], list[(i) + N1*(j+1)],
+				  list[(i+1) + N1*(j)], NULL);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    nbtri += 2;
+	  }
+	}
+      }                  
+    }
+    else if(nb == 3) {
+      Tree_Replace(sur->Vertices,&list[0]);
+      for(i=1;i<N1;i++){
+	for(j=0;j<N2;j++){
+	  Tree_Replace(sur->Vertices,&list[i+N1*j]);
+	}
+      }      
+      for(j=0;j<N2-1;j++){
+	simp = Create_Simplex(list[1 + N1*(j+1)], list[N1*(j+1)],list[1 + N1*(j)],NULL);
+	simp->iEnt = sur->Num;
+	Tree_Add(sur->Simplexes,&simp);
+	List_Add(sur->TrsfSimplexes,&simp);
+
+	nbtri++;
+      }      
+      for(i=1;i<N1-1;i++){
+	for(j=0;j<N2-1;j++){
+	  if(sur->Recombine){
+	    simp = Create_Quadrangle(list[(i) + N1*(j)],list[(i+1) + N1*(j)],
+				     list[(i+1) + N1*(j+1)],list[i+N1*(j+1)]);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    nbquad++;
+	  }
+	  else{
+	    simp = Create_Simplex(list[(i) + N1*(j)], list[(i+1) + N1*(j)], 
+				  list[(i) + N1*(j+1)],NULL);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    simp = Create_Simplex(list[(i+1) + N1*(j+1)], list[(i) + N1*(j+1)],
+				  list[(i+1) + N1*(j)], NULL);
+	    simp->iEnt = sur->Num;
+	    Tree_Add(sur->Simplexes,&simp);
+	    List_Add(sur->TrsfSimplexes,&simp);
+
+	    nbtri += 2;
+	  }
+	}
+      }              		
+      
+    }
+    break;
+    
+  default:
+    return(0);
+  }  
+
+  free(list);
+
+  THEM->Statistics[5] += Tree_Nbr(sur->Vertices);
+  THEM->Statistics[7] += nbtri;
+  THEM->Statistics[8] += nbquad;
+
+  return(1);
+}
+
diff --git a/Mesh/2D_Tree.cpp b/Mesh/2D_Tree.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cff696e3129145a68ed51efb09a2bced339cd8bf
--- /dev/null
+++ b/Mesh/2D_Tree.cpp
@@ -0,0 +1,136 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+/* BOUSILLE L'ARBRE TOTALEMENT (pas les donnees mais les liens) */
+
+int avltree_remove (avlstruct **root){
+  int   delete_this_node = 0;
+
+  if(*root == NULL) return(1);
+  
+  if (((*root)->left == NULL) && ((*root)->right == NULL))
+    delete_this_node = 1;
+  else
+    {
+      if ((*root)->left == NULL)
+	if (avltree_remove(&(*root)->left))
+	  {
+	    Free((*root)->left);
+	    (*root)->left = NULL;			
+	  }	
+      if ((*root)->right == NULL)
+	if (avltree_remove(&(*root)->right))
+	  {
+	    Free((*root)->right);
+	    (*root)->right = NULL;
+	  }
+      if (((*root)->left == NULL) && ((*root)->right == NULL))
+	delete_this_node = 1;
+    }
+  return delete_this_node;
+}
+
+
+/* INSERE UN NOEUD */
+
+int avltree_insert (avlstruct **root, void *item, 
+		    int (*fcmp)(void *a, void *b)){
+  int cmpresult;
+
+  if(*root != NULL)
+    cmpresult = fcmp(item,(*root)->treedata);
+
+  if (*root == NULL){
+    *root = (avlstruct *) Malloc (sizeof(avlstruct));
+    (*root)->treedata = item;
+    (*root)->left = NULL;
+    (*root)->right = NULL;
+  }
+  else if (cmpresult < 0)
+      avltree_insert(&(*root)->left,item,fcmp);
+  else
+      avltree_insert(&(*root)->right,item,fcmp);
+  return(1);	
+}
+
+
+
+/* EFFACE UN NOEUD */
+
+int avltree_delete (avlstruct **root, void *item, 
+		    int (*fcmp)(void *a, void *b)){
+
+  avlstruct	*t1,*t12;
+  int		cmpresult;
+
+  if(*root != NULL)    
+    cmpresult = fcmp(item , (*root)->treedata);
+  
+  if (*root == NULL) {
+    return(1);
+  }
+  if (cmpresult < 0){
+    return(avltree_delete(&(*root)->left,item,fcmp));
+  }  
+  else if (cmpresult > 0){
+    return(avltree_delete(&(*root)->right,item,fcmp));
+  }
+  else if ((cmpresult == 0))  {      
+    if (((*root)->right == NULL) && (&(*root)->left == NULL)){
+      Free(*root);
+      return(1);
+    }
+    else if((*root)->right == NULL){
+      t1 = (*root)->left;
+      Free(*root);
+      *root = t1;
+      return(1);
+    }
+    else if ((*root)->left == NULL){
+      t1 = (*root)->right;
+      Free(*root);
+      *root = t1;
+      return(1);
+    }
+    else{
+      t1 = t12 = (*root)->right;
+      while(t12->left != NULL)
+	t12 = t12->left;
+      t12->left = (*root)->left;
+      Free(*root);
+      *root = t1;
+      return(1);
+    }
+  }
+  else{
+    return(avltree_delete(&(*root)->left,item,fcmp));
+  }
+
+}
+
+/* compte le nombre d'elements d'un arbre */
+
+void avltree_count (avlptr root, int *numtri){
+
+  if(root != NULL){
+    avltree_count(root->left,numtri);
+    
+      (*numtri)++;
+    
+    avltree_count(root->right,numtri);
+  }
+}
+
+
+/* deroule l'arbre dans un vecteur */
+
+void avltree_print (avlptr root, Delaunay **listdel, int *numtri){
+  if(root != NULL){
+    avltree_print(root->left,listdel,numtri);
+    listdel[(*numtri)++] = (Delaunay*)(root)->treedata;    
+    avltree_print(root->right,listdel,numtri);
+  }
+}
+
diff --git a/Mesh/2D_Util.cpp b/Mesh/2D_Util.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bc4b99190ddb591d0464d51ee6b8b6c2339887de
--- /dev/null
+++ b/Mesh/2D_Util.cpp
@@ -0,0 +1,363 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+
+extern int           LocalNewPoint, FindQualityMethod;
+extern PointRecord  *gPointArray;
+extern Mesh         *THEM;
+
+int Comparekey(void * d1,void  * d2){
+
+  double val ;
+  PointNumero a,b,c,aa,bb,cc;
+
+  a = ((Delaunay*)d1)->t.a;
+  b = ((Delaunay*)d1)->t.b;
+  c = ((Delaunay*)d1)->t.c;
+  aa = ((Delaunay*)d2)->t.a;
+  bb = ((Delaunay*)d2)->t.b;
+  cc = ((Delaunay*)d2)->t.c;
+
+  val = ((Delaunay*)d2)->t.quality_value - ((Delaunay*)d1)->t.quality_value;
+
+  if ((aa==a)&&(bb==b)&&(cc==c)){
+    return 0;
+  }
+  else if (val  > 1.e-21 )
+    return 1;
+  else if (val  < -1.e-21 )
+    return -1;
+  else{ 
+    if (((Delaunay*)d1)->t.xc > ((Delaunay*)d2)->t.xc)
+      return -1;
+    else 
+      return 1;    
+  }
+}
+
+int Insert_Triangle (avlstruct **root, Delaunay * del){
+
+  if ( !avltree_insert(root,del,Comparekey) ) return(0);
+
+  return(1);
+}
+
+int Delete_Triangle ( avlstruct **root, Delaunay * del ){
+
+  if (!avltree_delete(root,del,Comparekey)) return(0);  
+
+  if (*root == NULL) return(0);
+  return(1);
+}
+
+int Insert_Point (MPoint pt, int *numpoints, int *numalloc, 
+		  DocRecord *doc, DocRecord *BGM, int is3d){
+  Vertex *v,*dum;
+
+  if ( *numpoints >= *numalloc ) {
+    gPointArray = (PointRecord *) Realloc(gPointArray, 
+					  (*numalloc + 1000) * sizeof(PointRecord));
+    *numalloc += 1000;
+    doc->points = gPointArray;
+  }
+  PushgPointArray(gPointArray);
+  gPointArray[*numpoints].where.h = pt.h;
+  gPointArray[*numpoints].where.v = pt.v;
+  gPointArray[*numpoints].numcontour = -1;
+  gPointArray[*numpoints].initial = -1;
+  if(!is3d)
+    gPointArray[*numpoints].quality = find_quality(pt,BGM);
+  else{
+    v = Create_Vertex (-1,pt.h,pt.v,0.0,0.0,0.0);
+    Calcule_Z_Plan(&v, &dum);
+    Projette_Inverse(&v, &dum);
+    gPointArray[*numpoints].quality = Lc_XYZ ( v->Pos.X,v->Pos.Y,v->Pos.Z,THEM);
+    Free(v);
+  }
+    
+  (*numpoints)++;
+
+  return 1;
+}
+
+void findtree(avlptr root, double *qualm, Delaunay **delf, DocRecord *MESH){
+
+  /* 
+     trouve le triangle possedant le facteur de qualite max 
+     modif : le centre du cercle circonscrit de ce triangle
+     doit etre dans le domaine   
+  */
+
+  MPoint pt;
+  double q;
+  Delaunay *del;
+
+  if(root != NULL){
+    findtree((root)->left,qualm,delf,MESH);
+    del = (Delaunay*)root->treedata;
+    q = del->t.quality_value;
+    pt.h = del->t.xc;
+    pt.v = del->t.yc;
+    if ((q>*qualm) && (Find_Triangle (pt ,MESH,A_TOUT_PRIX) != NULL) ){
+      *qualm = q;
+      *delf = del;
+    }
+    findtree((root)->right,qualm,delf,MESH);
+  }
+}
+
+
+Delaunay *findrightest(avlptr root, DocRecord *MESH){
+
+  Delaunay *del,**dee;
+  MPoint pt;
+  avlptr exroot;
+  double qualm;
+
+  exroot = root;
+
+  while((exroot)->left != NULL){
+    exroot = (exroot)->left;
+  }
+
+  del = (Delaunay*)(exroot)->treedata;
+  pt.h = del->t.xc;
+  pt.v = del->t.yc;
+  if( (LocalNewPoint == VORONOI_INSERT) ||(LocalNewPoint == SQUARE_TRI) ) 
+    return del;
+
+  if(Find_Triangle(pt,MESH,A_TOUT_PRIX) != NULL )return del;
+  
+  exroot = root;
+  del = (Delaunay*)(root)->treedata;
+  qualm = del->t.quality_value;
+  dee = &del;
+  findtree(exroot, &qualm, dee, MESH);
+  del = *dee;
+ 
+  return (del);    
+}
+
+double lengthseg (MPoint a, MPoint b){
+  return (pow(DSQR(a.h-b.h)+DSQR(a.v-b.v),0.5));
+}
+
+
+MPoint Localize (Delaunay * del , DocRecord *MESH) {
+
+  /*
+    Routine de localisation du point a inserer.
+    Variable globale LocalNewPoint :
+      - CENTER_CIRCCIRC : au centre du cercle circonscrit
+      - VORONOI_INSERT  : sur une branche de voronoi
+      - BARYCENTER      : au centre de gravite 
+      - SQUARE_TRI      : essaie de creer des triangles rectangles isoceles
+                          dans le but de mailler avec des quadrangles
+  */
+
+  MPoint       pt,pta,ptb,ptc,ptm;
+  PointNumero  a,b;
+  double       p,q,val,vec[2],ro,rm;
+  Delaunay    *v1,*v2,*v3,*del2 ;
+
+  switch (LocalNewPoint) {
+
+  case (CENTER_CIRCCIRC) :
+
+    pt.h = del->t.xc;
+    pt.v = del->t.yc;
+
+    return(pt);
+
+  case (BARYCENTER) :
+
+    pt.h = ( gPointArray[del->t.a].where.h + gPointArray[del->t.b].where.h 
+	    + gPointArray[del->t.c].where.h ) /3.;
+    pt.v = ( gPointArray[del->t.a].where.v + gPointArray[del->t.b].where.v 
+	    + gPointArray[del->t.c].where.v ) /3.;
+
+    return(pt);
+
+  case (VORONOI_INSERT) :
+  case (SQUARE_TRI) :
+
+    /* 
+       si le triangle est pres d'un bord -> ce bord est l'arete choisie
+    */
+    if ((v1 = del->v.voisin1) == NULL) {      
+      /* v1 == NULL; */
+      v2 = del->v.voisin2;
+      v3 = del->v.voisin3;
+    }
+    else if ((v2 = del->v.voisin2) == NULL) {      
+      v1 = NULL;
+      v2 = del->v.voisin1;
+      v3 = del->v.voisin3;
+    }
+    else if ((v3 = del->v.voisin3) == NULL) {      
+      v1 = NULL;
+      v2 = del->v.voisin1;
+      v3 = del->v.voisin2;
+    }
+    else {
+      v1 = del->v.voisin1;
+      v2 = del->v.voisin2;
+      v3 = del->v.voisin3;
+    }
+
+    /* 
+       Si l'arete est un bord -> 
+    */   
+    if (v1 == NULL){
+      
+      if((v2 != NULL) && (v3 != NULL) ) {
+	
+	if ( ((del->t.a == v2->t.a) || (del->t.a == v2->t.b) || (del->t.a == v2->t.c)) &&
+	     ((del->t.a == v3->t.a) || (del->t.a == v3->t.b) || (del->t.a == v3->t.c))){
+	  a = del->t.b;
+	  b = del->t.c;
+	}
+	else if ( ((del->t.b == v2->t.a) || (del->t.b == v2->t.b) || (del->t.b == v2->t.c)) &&
+		  ((del->t.b == v3->t.a) || (del->t.b == v3->t.b) || (del->t.b == v3->t.c))){  
+	  a = del->t.a;
+	  b = del->t.c;
+	}
+	else if ( ((del->t.c == v2->t.a) || (del->t.c == v2->t.b) || (del->t.c == v2->t.c)) &&
+		  ((del->t.c == v3->t.a) || (del->t.c == v3->t.b) || (del->t.c == v3->t.c))){  
+	  a = del->t.a;
+	  b = del->t.b;
+	}
+	else{
+	  Msg(ERROR, "vor insert 1"); 
+	}
+      }      
+      else if(v2 != NULL) {	
+	if((del->t.a != v2->t.c) && (del->t.a != v2->t.c) && (del->t.a != v2->t.c)){	  
+	  a = del->t.a;
+	  b = del->t.b;
+	}
+	else if((del->t.b != v2->t.c) && (del->t.b != v2->t.c) && (del->t.b != v2->t.c)){   
+	  a = del->t.b;
+	  b = del->t.c;
+	}
+	else if((del->t.c != v2->t.c) && (del->t.c != v2->t.c) && (del->t.c != v2->t.c)){   
+	  a = del->t.a;
+	  b = del->t.c;
+	}
+	else {
+	  Msg(ERROR,"vor insert 2"); 
+	}
+      }      
+      else if(v3 != NULL) {	
+	if((del->t.a != v3->t.c) && (del->t.a != v3->t.c) && (del->t.a != v3->t.c)){ 
+	  a = del->t.a;
+	  b = del->t.b;
+	}
+	else if((del->t.b != v3->t.c) && (del->t.b != v3->t.c) && (del->t.b != v3->t.c)){   
+	  a = del->t.b;
+	  b = del->t.c;
+	}
+	else if((del->t.c != v3->t.c) && (del->t.c != v3->t.c) && (del->t.c != v3->t.c)){  
+	  a = del->t.a;
+	  b = del->t.c;
+	}
+	else {
+	  Msg(ERROR, "vor insert 3"); 
+	}
+      }
+    }    
+    else {
+      if( v1->t.position == ACCEPTED )del2 = v1;
+      else if( v2->t.position == ACCEPTED )del2 = v2;
+      else if( v3->t.position == ACCEPTED )del2 = v3;
+      else {
+	Msg(ERROR,"coherence"); 
+      }
+ 
+      if((del->t.a != del2->t.a) && (del->t.a != del2->t.b) && (del->t.a != del2->t.c)){
+	a = del->t.b;
+	b = del->t.c;
+      }
+      else if((del->t.b != del2->t.a) && (del->t.b != del2->t.b) && (del->t.b != del2->t.c)){
+	a = del->t.a;
+	b = del->t.c;
+      }
+      else if((del->t.c != del2->t.a) && (del->t.c != del2->t.b) && (del->t.c != del2->t.c)){
+	a = del->t.a;
+	b = del->t.b;
+      }
+      else{
+	Msg(ERROR,"vor insert"); 
+      }
+    }
+
+    /* 
+       On sait que l'arete du nouveau triangle est a b 
+    */
+
+    pta.h = gPointArray[a].where.h;
+    ptb.h = gPointArray[b].where.h;
+    pta.v = gPointArray[a].where.v;
+    ptb.v = gPointArray[b].where.v;
+
+    /*
+    pte.h = gPointArray[c].where.h;
+    pte.v = gPointArray[c].where.v;
+    */
+
+    p = 0.5 * lengthseg(pta,ptb);
+
+    ptc.h = del->t.xc;
+    ptc.v = del->t.yc;
+      
+    ptm.h = 0.5*( pta.h + ptb.h );
+    ptm.v = 0.5*( pta.v + ptb.v );
+    
+    q = lengthseg(ptm,ptc);
+
+    vec[0] = (ptc.h - ptm.h)/q; 
+    vec[1] = (ptc.v - ptm.v)/q;
+
+    val = (p*p + q*q) / (2.*q); 
+    
+    ro = find_quality(ptm,MESH)/RacineDeTrois;
+    
+    rm = ((ro  > q )? ro : ro  );      
+    rm = ((rm < val)? rm : val);
+
+    // WARNING RANDOM
+    
+    pt.h = ptm.h + vec[0] * (rm + pow( rm*rm - p * p,0.5 )) ;
+    //+ (double) (rand() % 1000) / 1.e8;
+    pt.v = ptm.v + vec[1] * (rm + pow( rm*rm - p * p,0.5 )) ;
+    //+ (double) (rand() % 1000) / 1.e8;
+
+    return(pt);
+  }
+
+  return pt;
+
+}
+  
+/********************************************************************/
+
+void alloue_Mai_Pts(maillage *mai , int Nballoc , int incrAlloc){
+  int i;
+
+  mai->points = (PointRecord *)Malloc(Nballoc*sizeof(PointRecord));
+  for(i=0;i<Nballoc;i++){
+    mai->points[i].where.h=0.0;
+    mai->points[i].where.v=0.0;
+  }
+  mai->IncrAllocPoints = incrAlloc;
+  mai->NumAllocPoints = Nballoc;
+}
+
+void alloue_Mai_Del(maillage *mai , int Nballoc , int incrAlloc){
+  mai->listdel = (delpeek *)Malloc(Nballoc * sizeof(delpeek));
+  mai->IncrAllocTri = incrAlloc;
+  mai->NumAllocTri = Nballoc;
+}
+
diff --git a/Mesh/3D_BGMesh.cpp b/Mesh/3D_BGMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6bce95e3f0237b035b3e1a11122298fb03776a4d
--- /dev/null
+++ b/Mesh/3D_BGMesh.cpp
@@ -0,0 +1,342 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+#include "2D_Mesh.h"
+#include "3D_Mesh.h"
+#include "Adapt.h"
+#include "Views.h"
+#include "Numeric.h"
+
+extern int Alerte_Point_Exterieur;
+extern double FACTEUR_MULTIPLICATIF;
+
+static Mesh m;
+static Vertex vvv;
+static double XX, YY, ZZ, D, LL;
+
+void ExportLcFieldOnVolume (Mesh * M){
+  List_T *l = Tree2List (M->Volumes);
+  Volume *vol;
+  Simplex *simp;
+  FILE *f = fopen ("OutFile.pos", "w");
+  fprintf (f, "View \"LC_FIELD\" Offset{0,0,0} {\n");
+  for (int i = 0; i < List_Nbr (l); i++){
+    List_Read (l, i, &vol);
+    List_T *ll = Tree2List (vol->Simplexes);
+    for (int j = 0; j < List_Nbr (ll); j++){
+      List_Read (ll, j, &simp);
+      simp->ExportLcField (f);
+    }
+    List_Delete (ll);
+  }
+  List_Delete (l);
+  fprintf (f, "};\n");
+  fclose (f);
+}
+
+void ExportLcFieldOnSurfaces (Mesh * M){
+  List_T *l = Tree2List (M->Surfaces);
+  Surface *surf;
+  Simplex *simp;
+  FILE *f = fopen ("OutFileS.pos", "w");
+  fprintf (f, "View \"LC_FIELD\" Offset{0,0,0} {\n");
+  for (int i = 0; i < List_Nbr (l); i++){
+    List_Read (l, i, &surf);
+    List_T *ll = Tree2List (surf->Simplexes);
+    for (int j = 0; j < List_Nbr (ll); j++){
+      List_Read (ll, j, &simp);
+      simp->ExportLcField (f);
+    }
+    List_Delete (ll);
+  }
+  List_Delete (l);
+  fprintf (f, "};\n");
+  fclose (f);
+}
+
+void findcloser (void *a, void *b){
+  Vertex *v;
+  double dd;
+  v = *(Vertex **) a;
+  dd = DSQR (v->Pos.X - XX) + DSQR (v->Pos.Y - YY) + DSQR (v->Pos.Z - ZZ);
+  if (dd < D){
+    D = dd;
+    LL = v->lc;
+  }
+}
+
+void LCBGM (double X, double Y, double Z, double *l){
+  if (Pt_In_Volume (X, Y, Z, &m, l, .01));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, .02));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, .07));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, .1));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, .2));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, .8));
+  else if (Pt_In_Volume (X, Y, Z, &m, l, 20.));
+  else {
+    XX = X;
+    YY = Y;
+    ZZ = Z;
+    D = 1.e24;
+    LL = 1;
+    Tree_Action (m.Vertices, findcloser);
+    *l = LL;
+  }
+}
+
+double Lc_XYZ (double X, double Y, double Z, Mesh * m){
+  double l;
+
+  //l = 0.1 * fabs(cos(2 * 3.14159 * X) * cos( 2 * 3.14159 * Y))  + 0.01;
+  //return l;
+
+  switch (m->BGM.Typ){
+  case FUNCTION:
+    break;
+  case CONSTANT:
+    l = m->BGM.lc;
+    break;
+  case ONFILE:
+    LCBGM (X, Y, Z, &l);
+    break;
+  case WITHPOINTS:
+    if (Pt_In_Volume (X, Y, Z, m, &l, 0.0));
+    else if (Pt_In_Volume (X, Y, Z, m, &l, 0.2));
+    else if (Pt_In_Volume (X, Y, Z, m, &l, 0.5));
+    else{
+      Alerte_Point_Exterieur = 1;
+      l = 1.e-25;
+    }
+    break;
+  }
+  return (FACTEUR_MULTIPLICATIF * l);
+}
+
+/* ------------------------------------------------------------------------ */
+/*  B G M W i t h V i e w                                                   */
+/* ------------------------------------------------------------------------ */
+
+static Tree_T *Pts;
+
+static void AIG (void *a, void *b){
+  Simplex *s = *(Simplex **) a;
+  AddSimplexInGrid (&m, s, BOITE);
+}
+
+int BGMWithView (Post_View * ErrView){
+
+  static Vertex *VertexUp, *v, V, *ver[4];
+  extern int TYPBGMESH;
+  extern Mesh *THEM;
+  int i, j, k;
+  Post_Simplex s;
+  Post_Triangle t;
+  Simplex *si;
+
+  VertexUp = Create_Vertex (-1, 0., 0., 1., 1., -1.0);
+  Pts = Tree_Create (sizeof (Vertex *), comparePosition);
+
+  m.BGM.Typ = TYPBGMESH = ONFILE;
+
+  m.Vertices = Tree_Create (sizeof (Vertex *), compareVertex);
+  m.Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
+  Create_BgMesh (TYPBGMESH, .2, THEM);
+
+  k = 1;
+  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
+    List_Read (ErrView->Triangles, i, &t);
+    for (j = 0; j < 3; j++){
+      v = &V;
+      v->Pos.X = t.X[j];
+      v->Pos.Y = t.Y[j];
+      v->Pos.Z = t.Z[j];
+      if (0 /*Tree_Query(Pts,&v) */ ){
+	/* Corriger la Lc pour lissage */
+	ver[j] = v;
+      }
+      else{
+	v = Create_Vertex (k++, t.X[j], t.Y[j], t.Z[j]
+			   ,t.V[j], -1.0);
+	ver[j] = v;
+	Tree_Add (m.Vertices, &v);
+	Tree_Add (Pts, &v);
+      }
+    }
+    si = Create_Simplex (ver[0], ver[1], ver[2], VertexUp);
+    Tree_Add (m.Simplexes, &si);
+  }
+  
+  for (i = 0; i < List_Nbr (ErrView->Simplices); i++){
+    List_Read (ErrView->Simplices, i, &s);
+    for (j = 0; j < 4; j++){
+      v = &V;
+      v->Pos.X = s.X[j];
+      v->Pos.Y = s.Y[j];
+      v->Pos.Z = s.Z[j];
+      if (Tree_Query (Pts, &v)){
+	ver[j] = v;
+      }
+      else{
+	v = Create_Vertex (k++, s.X[k], s.Y[j], s.Z[j], s.V[0], -1.0);
+	ver[j] = v;
+	Tree_Add (m.Vertices, &v);
+	Tree_Add (Pts, &v);
+      }
+    }
+    si = Create_Simplex (ver[0], ver[1], ver[2], ver[4]);
+    Tree_Add (m.Simplexes, &si);
+  }
+  
+  m.Grid.init = 0;
+  m.Grid.Nx = 10;
+  m.Grid.Ny = 10;
+  m.Grid.Nz = 10;
+  Tree_Action (m.Vertices, findminmax);
+  getminmax (&m.Grid.min.X, &m.Grid.min.Y, &m.Grid.min.Z,
+	     &m.Grid.max.X, &m.Grid.max.Y, &m.Grid.max.Z);
+
+  if (m.Grid.max.Z == m.Grid.min.Z){
+    m.Grid.Nz = 1;
+    Tree_Add (m.Vertices, &VertexUp);
+    Tree_Action (m.Vertices, findminmax);
+    getminmax (&m.Grid.min.X, &m.Grid.min.Y, &m.Grid.min.Z,
+	       &m.Grid.max.X, &m.Grid.max.Y, &m.Grid.max.Z);
+  }
+
+  Tree_Action (m.Simplexes, AIG);
+
+  Msg(INFO, "Background Mesh Loaded (%d Nodes, %d Elements)",
+	  Tree_Nbr(m.Vertices), Tree_Nbr(m.Simplexes)); 
+
+  return (1);
+}
+
+
+double ErrorInView (Post_View * ErrView, int *n){
+
+  Post_Triangle t;
+  Post_Simplex s;
+  double e, tot=0.0;
+  int i, j=0;
+
+  if(ErrView == NULL){
+    Msg(WARNING, "Empty Error View");
+    return 0.;
+  }
+
+  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
+    List_Read (ErrView->Triangles, i, &t);
+    e = (t.V[0] + t.V[1] + t.V[2]) * 0.33333333333;
+    tot += e * e;
+    j++;
+  }
+
+  for (i = 0; i < List_Nbr (ErrView->Simplices); i++){
+    List_Read (ErrView->Simplices, i, &s);
+    e = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25;
+    tot += e * e;
+    j++;
+  }
+
+  *n = j;
+  return 100 * sqrt (tot);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  C r e a t e B G M                                                       */
+/* ------------------------------------------------------------------------ */
+
+int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree,
+	       double OptiValue, double *ObjFunct, char *OutFile){
+
+  Post_Triangle t;
+  Post_Simplex s;
+  double *h, *p, *e, xc, yc, zc, c[3];
+  int N, i, j, dim;
+  Simplex smp;
+  FILE *f;
+
+  if (List_Nbr (ErrView->Simplices))
+    dim = 3;
+  else
+    dim = 2;
+
+  N = List_Nbr (ErrView->Simplices) +
+    List_Nbr (ErrView->Triangles) + 2;
+
+  h = (double *) malloc (N * sizeof (double));
+  e = (double *) malloc (N * sizeof (double));
+  p = (double *) malloc (N * sizeof (double));
+
+  j = 0;
+
+  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
+    List_Read (ErrView->Triangles, i, &t);
+
+    /*
+      Attention, cette ligne est seulement valable en
+      2d x-y. Si plus, calculer le centre du cercle en
+      3d ou utiliser une autre mesure de taille.
+    */
+    CircumCircle (t.X[0], t.Y[0],
+		  t.X[1], t.Y[1],
+		  t.X[2], t.Y[2],
+		  &xc, &yc);
+    h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) +
+		     (yc - t.Y[0]) * (yc - t.Y[0]));
+    p[j + 1] = Degree;
+    e[j + 1] = (t.V[0] + t.V[1] + t.V[2]) * 0.33333333333;
+    j++;
+  }
+
+  for (i = 0; i < List_Nbr (ErrView->Simplices); i++){
+    List_Read (ErrView->Simplices, i, &s);
+    
+    smp.center_tet (t.X, t.Y, t.Z, c);
+    
+    xc = c[0];
+    yc = c[1];
+    zc = c[2];
+    
+    h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) +
+		     (yc - t.X[0]) * (yc - t.X[0]) +
+		     (zc - t.Y[0]) * (zc - t.Y[0]));
+    p[j + 1] = Degree;
+    e[j + 1] = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25;
+    j++;
+  }
+
+  *ObjFunct = optimesh (j, OptiMethod, dim, e, h, p, OptiValue, OptiValue);
+
+  f = fopen (OutFile, "w");
+
+  fprintf (f, "View \"Auto_BGMesh\" Offset{0,0,0} {\n");
+  j = 0;
+  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
+    List_Read (ErrView->Triangles, i, &t);
+    fprintf (f, "ST(%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E};\n",
+	     t.X[0], t.Y[0], t.Z[0],
+	     t.X[1], t.Y[1], t.Z[1],
+	     t.X[2], t.Y[2], t.Z[2],
+	     h[j], h[j], h[j]);
+    j++;
+  }
+  for (i = 0; i < List_Nbr (ErrView->Simplices); i++){
+    List_Read (ErrView->Simplices, i, &s);
+    fprintf (f, "SS(%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E,%12.5E};\n",
+	     s.X[0], s.Y[0], s.Z[0],
+	     s.X[1], s.Y[1], s.Z[1],
+	     s.X[2], s.Y[2], s.Z[2],
+	     s.X[3], s.Y[3], s.Z[3],
+	     h[j], h[j], h[j], h[j]);
+    j++;
+  }
+  fprintf (f, "};\n");
+  fclose (f);
+
+  Msg(INFO,"Wrote background mesh in '%s'", OutFile); 
+
+  return 1;
+}
+
diff --git a/Mesh/3D_Bricks.cpp b/Mesh/3D_Bricks.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..19ef313bbaf80621f546e1f63f074eddaa5f68a0
--- /dev/null
+++ b/Mesh/3D_Bricks.cpp
@@ -0,0 +1,152 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+
+Brick LaBrique (Grid_T * pGrid, double X, double Y, double Z){
+  int Ix, Iy, Iz, index;
+  Brick B;
+
+  B.N = -1;
+  if (X > pGrid->max.X || X < pGrid->min.X || Y > pGrid->max.Y ||
+      Y < pGrid->min.Y || Z > pGrid->max.Z || Z < pGrid->min.Z){
+    return (B);
+  }
+
+  Ix = (int) ((double) pGrid->Nx * (X - pGrid->min.X) / (pGrid->max.X - pGrid->min.X));
+  Iy = (int) ((double) pGrid->Ny * (Y - pGrid->min.Y) / (pGrid->max.Y - pGrid->min.Y));
+  Iz = (int) ((double) pGrid->Nz * (Z - pGrid->min.Z) / (pGrid->max.Z - pGrid->min.Z));
+  Ix = IMIN (Ix, pGrid->Nx - 1);
+  Iy = IMIN (Iy, pGrid->Ny - 1);
+  Iz = IMIN (Iz, pGrid->Nz - 1);
+
+  if (Ix < 0)
+    Ix = 0;
+  if (Iy < 0)
+    Iy = 0;
+  if (Iz < 0)
+    Iz = 0;
+
+  index = Ix + Iy * pGrid->Nx + Iz * pGrid->Nx * pGrid->Ny;
+  List_Read (pGrid->Bricks, index, &B);
+  return (B);
+}
+
+
+int DEBUT = 0;
+Coord MINIM, MAXIM;
+
+void getminmax (double *xmin, double *ymin, double *zmin,
+		double *xmax, double *ymax, double *zmax){
+
+  double dx, dy, dz, f;
+
+  dx = MAXIM.X - MINIM.X;
+  dy = MAXIM.Y - MINIM.Y;
+  dz = MAXIM.Z - MINIM.Z;
+  f = .1;
+
+  *xmin = MINIM.X - f * dx;
+  *ymin = MINIM.Y - f * dy;
+  *zmin = MINIM.Z - f * dz;
+  *xmax = MAXIM.X + f * dx;
+  *ymax = MAXIM.Y + f * dy;
+  *zmax = MAXIM.Z + f * dz;
+}
+
+void findminmax (void *a, void *b){
+
+  Vertex *v;
+  v = *(Vertex **) a;
+
+  if (!DEBUT){
+    MINIM.X = DMIN (MINIM.X, v->Pos.X);
+    MAXIM.X = DMAX (MAXIM.X, v->Pos.X);
+    MINIM.Y = DMIN (MINIM.Y, v->Pos.Y);
+    MAXIM.Y = DMAX (MAXIM.Y, v->Pos.Y);
+    MINIM.Z = DMIN (MINIM.Z, v->Pos.Z);
+    MAXIM.Z = DMAX (MAXIM.Z, v->Pos.Z);
+  }
+  else{
+    DEBUT = 0;
+    MINIM.X = v->Pos.X;
+    MAXIM.X = v->Pos.X;
+    MINIM.Y = v->Pos.Y;
+    MAXIM.Y = v->Pos.Y;
+    MINIM.Z = v->Pos.Z;
+    MAXIM.Z = v->Pos.Z;
+  }
+}
+
+
+void AddSimplexInGrid (Mesh * m, Simplex * s, int boule_boite){
+
+  double XminBox, XmaxBox, YminBox, YmaxBox, ZmaxBox, ZminBox;
+  int Ix1, Ix2, Iy1, Iy2, Iz1, Iz2;
+  int i, j, k, index;
+  Brick Br, *pBrick;
+
+  if (!m->Grid.init){
+    m->Grid.Bricks = List_Create (m->Grid.Nx * m->Grid.Ny * m->Grid.Nz, 10, sizeof (Brick));
+    for (i = 0; i < m->Grid.Nx * m->Grid.Ny * m->Grid.Nz; i++){
+      Br.pT = List_Create (2, 2, sizeof (Simplex *));
+      Br.N = i + 1;
+      List_Add (m->Grid.Bricks, &Br);
+    }
+    m->Grid.init = 1;
+  }
+  
+  if (boule_boite == BOITE){
+    XminBox = XmaxBox = s->V[0]->Pos.X;
+    YminBox = YmaxBox = s->V[0]->Pos.Y;
+    ZminBox = ZmaxBox = s->V[0]->Pos.Z;
+    for (i = 1; i < 4; i++){
+      XminBox = DMIN (XminBox, s->V[i]->Pos.X);
+      XmaxBox = DMAX (XmaxBox, s->V[i]->Pos.X);
+      YminBox = DMIN (YminBox, s->V[i]->Pos.Y);
+      YmaxBox = DMAX (YmaxBox, s->V[i]->Pos.Y);
+      ZminBox = DMIN (ZminBox, s->V[i]->Pos.Z);
+      ZmaxBox = DMAX (ZmaxBox, s->V[i]->Pos.Z);
+    }
+  }
+  else if ((boule_boite = BOULE)){
+    XminBox = s->Center.X - s->Radius;
+    XmaxBox = s->Center.X + s->Radius;
+    YminBox = s->Center.Y - s->Radius;
+    YmaxBox = s->Center.Y + s->Radius;
+    ZminBox = s->Center.Z - s->Radius;
+    ZmaxBox = s->Center.Z + s->Radius;
+  }
+  
+
+  Ix1 = (int) ((double) m->Grid.Nx * (XminBox - m->Grid.min.X) /
+	       (m->Grid.max.X - m->Grid.min.X));
+  Ix2 = (int) ((double) m->Grid.Nx * (XmaxBox - m->Grid.min.X) /
+	       (m->Grid.max.X - m->Grid.min.X));
+  Iy1 = (int) ((double) m->Grid.Ny * (YminBox - m->Grid.min.Y) /
+	       (m->Grid.max.Y - m->Grid.min.Y));
+  Iy2 = (int) ((double) m->Grid.Ny * (YmaxBox - m->Grid.min.Y) /
+	       (m->Grid.max.Y - m->Grid.min.Y));
+  Iz1 = (int) ((double) m->Grid.Nz * (ZminBox - m->Grid.min.Z) /
+	       (m->Grid.max.Z - m->Grid.min.Z));
+  Iz2 = (int) ((double) m->Grid.Nz * (ZmaxBox - m->Grid.min.Z) /
+	       (m->Grid.max.Z - m->Grid.min.Z));
+
+  Ix1 = IMAX (Ix1, 0);
+  Ix2 = IMIN (Ix2, m->Grid.Nx - 1);
+  Iy1 = IMAX (Iy1, 0);
+  Iy2 = IMIN (Iy2, m->Grid.Ny - 1);
+  Iz1 = IMAX (Iz1, 0);
+  Iz2 = IMIN (Iz2, m->Grid.Nz - 1);
+
+  for (i = Ix1; i <= Ix2; i++){
+    for (j = Iy1; j <= Iy2; j++){
+      for (k = Iz1; k <= Iz2; k++){
+	index = i + j * m->Grid.Nx + k * m->Grid.Nx * m->Grid.Ny;
+	pBrick = (Brick *) List_Pointer (m->Grid.Bricks, index);
+	List_Add (pBrick->pT, &s);
+      }
+    }
+  }
+
+}
diff --git a/Mesh/3D_Coherence.cpp b/Mesh/3D_Coherence.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82042f547e0d36031b2e0fc1c55202b342449c35
--- /dev/null
+++ b/Mesh/3D_Coherence.cpp
@@ -0,0 +1,1551 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "3D_Mesh.h"
+#include "Create.h"
+#include "Numeric.h"
+
+extern Mesh *THEM;
+extern int CurrentNodeNumber, FACE_DIMENSION;
+extern Simplex MyNewBoundary;
+
+static Volume *THEVOL;
+static Edge *TheEdge;
+static Face *TheFace;
+static List_T  *Teti;
+static int DEBUG = 0;
+
+List_T *Missing, *MissingF, *MissingS;
+Tree_T *EdgesTree, *FacesTree, *swaps;
+
+int edges_quad[4][2] = { {0, 1},
+			 {1, 2},
+			 {2, 3},
+			 {3, 0} };
+int edges_tetra[6][2] = { {0, 1},
+			  {1, 2},
+			  {2, 0},
+			  {3, 0},
+			  {3, 2},
+			  {3, 1} };
+int edges_non[3] = {2, 0, 1};
+int NbQ;
+int EdgesInVolume = 1;
+
+int memesens (Vertex * v1, Vertex * v2, Vertex * v3,
+	      Vertex * c1, Vertex * c2, Vertex * c3){
+  double v12[3], v13[3], n1[3], n2[3], p;
+
+  v12[0] = c1->Pos.X - c2->Pos.X;
+  v12[1] = c1->Pos.Y - c2->Pos.Y;
+  v12[2] = c1->Pos.Z - c2->Pos.Z;
+
+  v13[0] = c1->Pos.X - c3->Pos.X;
+  v13[1] = c1->Pos.Y - c3->Pos.Y;
+  v13[2] = c1->Pos.Z - c3->Pos.Z;
+
+  prodve (v12, v13, n1);
+
+  v12[0] = v1->Pos.X - v2->Pos.X;
+  v12[1] = v1->Pos.Y - v2->Pos.Y;
+  v12[2] = v1->Pos.Z - v2->Pos.Z;
+
+  v13[0] = v1->Pos.X - v3->Pos.X;
+  v13[1] = v1->Pos.Y - v3->Pos.Y;
+  v13[2] = v1->Pos.Z - v3->Pos.Z;
+
+  prodve (v12, v13, n2);
+
+  prosca (n1, n2, &p);
+
+  return ((p > 0) ? 1 : 0);
+}
+
+static void pvertex (void *a, void *b){
+  /*
+  Vertex *v;
+  v = (Vertex *) a;
+  printf ("noeud %d = (%12.5E,%12.5E,%12.5E)\n", v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z);
+  */
+}
+
+static void pedge (void *a, void *b){
+  /*
+  Edge *e;
+  e = (Edge *) a;
+  printf ("arete %d (%12.5E,%12.5E,%12.5E) -> %d (%12.5E,%12.5E,%12.5E)\n",
+	  e->V[0]->Num, e->V[0]->Pos.X, e->V[0]->Pos.Y, e->V[0]->Pos.Z,
+	  e->V[1]->Num, e->V[1]->Pos.X, e->V[1]->Pos.Y, e->V[1]->Pos.Z);
+  */
+}
+
+void find_quads (void *a, void *b){
+  Edge *q;
+  Edge diag;
+  Simplex *s1, *s2;
+  q = (Edge *) a;
+
+  if (!List_Search (Missing, q, compareedge))
+    return;
+
+  if (List_Nbr (q->Simplexes) != 2)
+    return;
+
+  List_Read (q->Simplexes, 0, &s1);
+  List_Read (q->Simplexes, 1, &s2);
+  if (s1->iEnt != s2->iEnt)
+    return;
+  if (!q->O[1])
+    return;
+
+  diag.V[0] = q->O[0];
+  diag.V[1] = q->O[1];
+
+  if (Tree_Search (EdgesTree, &diag)){
+    Tree_Add (swaps, q);
+  }
+}
+
+void swap_quads (void *a, void *b){
+  Edge *q;
+  int i, K;
+  Simplex *s1, *s2;
+  Vertex *temp[3], *kk[3];
+  q = (Edge *) a;
+  List_Read (q->Simplexes, 0, &s1);
+  List_Read (q->Simplexes, 1, &s2);
+
+  K = -1;
+
+  for (i = 0; i < 3; i++){
+    if (!compareVertex (&q->O[0], &s1->V[i]))
+      K = i;
+    temp[i] = s1->V[i];
+  }
+  /*
+    printf("s1 : %d %d %d ->",s1->V[0]->Num,s1->V[1]->Num,s1->V[2]->Num);
+  */
+  kk[0] = q->O[0];
+  kk[1] = (K == 2) ? s1->V[0] : s1->V[K + 1];
+  kk[2] = q->O[1];
+
+  s1->V[0] = kk[0];
+  s1->V[1] = kk[1];
+  s1->V[2] = kk[2];
+  /*
+    printf("%d %d %d \n",s1->V[0]->Num,s1->V[1]->Num,s1->V[2]->Num);
+  */
+  s1->F[0].V[0] = s1->V[0];
+  s1->F[0].V[1] = s1->V[1];
+  s1->F[0].V[2] = s1->V[2];
+
+  /*
+    printf("s2 : %d %d %d ->",s2->V[0]->Num,s2->V[1]->Num,s2->V[2]->Num);
+  */
+  s2->V[0] = q->O[1];
+  s2->V[1] = (K == 0) ? temp[2] : temp[K - 1];
+  s2->V[2] = q->O[0];
+  /*
+    printf("%d %d %d \n",s2->V[0]->Num,s2->V[1]->Num,s2->V[2]->Num);
+  */
+  s2->F[0].V[0] = s2->V[0];
+  s2->F[0].V[1] = s2->V[1];
+  s2->F[0].V[2] = s2->V[2];
+
+  qsort (s1->F[0].V, 3, sizeof (Vertex *), compareVertex);
+  qsort (s2->F[0].V, 3, sizeof (Vertex *), compareVertex);
+
+  List_Suppress (Missing, q, compareedge);
+  q->V[0] = q->O[0];
+  q->V[1] = q->O[1];
+}
+
+
+void swap_quads2 (void *a, void *b){
+  Edge *q;
+  int  K;
+  Simplex *s1, *s2;
+
+  q = (Edge *) a;
+  List_Read (q->Simplexes, 0, &s1);
+  List_Read (q->Simplexes, 1, &s2);
+
+  K = -1;
+
+  if (memesens (s1->V[0], s1->V[1], s1->V[2], q->O[0], q->O[1], q->V[0])){
+    s1->V[0] = q->O[0];
+    s1->V[1] = q->O[1];
+    s1->V[2] = q->V[0];
+  }
+  else{
+    s1->V[0] = q->O[1];
+    s1->V[1] = q->O[0];
+    s1->V[2] = q->V[0];
+  }
+
+  if (memesens (s2->V[0], s2->V[1], s2->V[2], q->O[0], q->O[1], q->V[1])){
+    s2->V[0] = q->O[0];
+    s2->V[1] = q->O[1];
+    s2->V[2] = q->V[1];
+  }
+  else{
+    s2->V[0] = q->O[1];
+    s2->V[1] = q->O[0];
+    s2->V[2] = q->V[1];
+  }
+
+  s1->F[0].V[0] = s1->V[0];
+  s1->F[0].V[1] = s1->V[1];
+  s1->F[0].V[2] = s1->V[2];
+
+  s2->F[0].V[0] = s2->V[0];
+  s2->F[0].V[1] = s2->V[1];
+  s2->F[0].V[2] = s2->V[2];
+
+  qsort (s1->F[0].V, 3, sizeof (Vertex *), compareVertex);
+  qsort (s2->F[0].V, 3, sizeof (Vertex *), compareVertex);
+
+  List_Suppress (Missing, q, compareedge);
+  q->V[0] = q->O[0];
+  q->V[1] = q->O[1];
+
+}
+
+void create_Quads (Volume * V){
+  int i;
+  Surface *S;
+  swaps = Tree_Create (sizeof (Edge), compareedge);
+  for (i = 0; i < List_Nbr (V->Surfaces); i++){
+    List_Read (V->Surfaces, i, &S);
+    Tree_Action (S->Edges, find_quads);
+  }
+  Tree_Action (swaps, swap_quads2);
+}
+
+void create_Fac (void *a, void *b){
+  Simplex **ps, *s;
+  int i;
+  ps = (Simplex **) a;
+  s = *ps;
+  for (i = 0; i < 4; i++){
+    Tree_Insert (FacesTree, &s->F[i]);
+  }
+}
+
+
+void create_Faces (Volume * V){
+  V->Faces = Tree_Create (sizeof (Face), compareFace);
+  FacesTree = V->Faces;
+  Tree_Action (V->Simplexes, create_Fac);
+}
+
+void create_Edge (void *a, void *b){
+  Simplex **ps, *s;
+  int N, i, j;
+  Edge E, *pE;
+  ps = (Simplex **) a;
+  s = *ps;
+  int edges[6][2];
+
+  if (s->V[3] && EdgesInVolume){
+    N = 6;
+    for (i = 0; i < N; i++)
+	for (j = 0; j < 2; j++)
+	  edges[i][j] = edges_tetra[i][j];
+  }
+  else if (s->V[3]){
+    N = 4;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_quad[i][j];
+  }
+  else if (s->V[2]){
+    N = 3;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_tetra[i][j];
+  }
+  else{
+    N = 1;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_tetra[i][j];
+  }
+
+  for (i = 0; i < N; i++){
+    E.V[0] = s->V[edges[i][0]];
+    E.V[1] = s->V[edges[i][1]];
+    if ((pE = (Edge *) Tree_PQuery (EdgesTree, &E))){
+      List_Add (pE->Simplexes, ps);
+      if (N == 3)
+	pE->O[1] = s->V[edges_non[i]];
+    }
+    else{
+      E.Simplexes = List_Create (2, 1, sizeof (Simplex *));
+      if (N == 3)
+	E.O[0] = s->V[edges_non[i]];
+      if (N == 3)
+	E.O[1] = NULL;
+      List_Add (E.Simplexes, &s);
+      E.newv = NULL;
+      Tree_Replace (EdgesTree, &E);
+    }
+  }
+}
+
+void create_Edges (Volume * V){
+  int i;
+  Surface *S;
+  V->Edges = Tree_Create (sizeof (Edge), compareedge);
+  EdgesTree = V->Edges;
+
+  Tree_Action (V->Simplexes, create_Edge);
+  for (i = 0; i < List_Nbr (V->Surfaces); i++){
+    List_Read (V->Surfaces, i, &S);
+    S->Edges = Tree_Create (sizeof (Edge), compareedge);
+    EdgesTree = S->Edges;
+    Tree_Action (S->Simplexes, create_Edge);
+  }
+}
+
+
+void crEdges (Tree_T * TreeElem, Tree_T * treeedges){
+  EdgesTree = treeedges;
+  Tree_Action (TreeElem, create_Edge);
+}
+
+
+void find_missing (void *a, void *b){
+  Edge *e;
+  exf_T exf;
+
+  e = (Edge *) a;
+  exf.e1 = exf.e2 = *e;
+  if (!Tree_Search (EdgesTree, e)){
+    List_Add (Missing, e);
+    Tree_Add (EdgesTree, e);
+  }
+}
+
+void find_missingf (void *a, void *b){
+  Simplex *s;
+  s = *(Simplex **) a;
+
+  if (!FacesTree || !Tree_Search (FacesTree, &s->F[0])){
+    List_Add (MissingF, &s->F[0]);
+    List_Add (MissingS, &s);
+  }
+}
+
+
+List_T *Missing_Edges (Volume * V){
+  int i;
+  Surface *S;
+  Missing = List_Create (10, 10, sizeof (Edge));
+
+  NbQ = 0;
+  EdgesTree = V->Edges;
+  for (i = 0; i < List_Nbr (V->Surfaces); i++){
+    List_Read (V->Surfaces, i, &S);
+    Tree_Action (S->Edges, find_missing);
+  }
+  return Missing;
+}
+
+List_T *Missing_Faces (Volume * V){
+  int i;
+  Surface *S;
+  MissingF = List_Create (10, 10, sizeof (Face));
+  MissingS = List_Create (10, 10, sizeof (Simplex *));
+
+  for (i = 0; i < List_Nbr (V->Surfaces); i++){
+    List_Read (V->Surfaces, i, &S);
+    Tree_Action (S->Simplexes, find_missingf);
+  }
+  return MissingF;
+}
+
+/* Creation de listes de tetraedres qui intersectent
+   l'arete TheEdge */
+
+List_T *traite;
+Tree_T *traited;
+
+void Ajoute_traite (Simplex ** s){
+  if (!Tree_Search (traited, s)){
+    List_Add (traite, s);
+    Tree_Add (traited, s);
+  }
+}
+
+Intersection *thei;
+Vertex *m1, *m2, *e1, *e2;
+Face *f1;
+int Cloture;
+
+void fillRi (void *a, void *b){
+  int i, c, l;
+  Simplex *s;
+
+  s = *(Simplex **) a;
+  c = l = 0;
+  for (i = 0; i < 4; i++){
+    if (!compareVertex (&e1, &s->V[i]))
+      c++;
+    if (!compareVertex (&e2, &s->V[i]))
+      c++;
+  }
+  if (c == 2){
+    Ajoute_traite (&s);
+  }
+}
+
+void fillTeti (void *a, void *b){
+  int i;
+  Simplex *s;
+
+  s = *(Simplex **) a;
+  for (i = 0; i < 4; i++){
+    if (!compareVertex (&m1, &s->V[i])){
+      List_Add (Teti, &s);
+      return;
+    }
+  }
+}
+
+Tree_T *TreexNewv;
+
+typedef struct{
+  int ef;
+  Edge e;
+  Face *f;
+  Vertex *newv;
+} xNewv;
+
+int compxNewv (const void *a, const void *b){
+  xNewv *q, *w;
+
+  q = (xNewv *) a;
+  w = (xNewv *) b;
+  if (q->ef != w->ef)
+    return (q->ef - w->ef);
+  if (q->ef == 1)
+    return compareedge (&q->e, &w->e);
+  if (q->ef == 2)
+    return compareFace (q->f, w->f);
+  return 1;
+}
+
+/* 
+   ---------------------------------------------------
+   Pour + de details, voir les travaux de P.L. George.
+   ---------------------------------------------------
+
+   Les routines ci dessous ont pour but de retrouver les
+   aretes manquantes d'un maillage initial 3-D.
+
+   En resume, il faut d'abord trouver ces aretes : find_missing
+
+   Ensuite, il faut decouvrir les intersections des aretes manquantes
+   avec les tetraedres du maillage, les intersections sont de plusieurs 
+   types :
+
+   intersection noeud-noeud (type 1)
+   intersection arete-face  (type 2)
+   intersection face -face  (type 3)
+   intersection arete-arete (type 4)
+   intersection face -noeud (type 5)
+   intersection arete-noeud (type 6)
+   intersection noeud seul  (type 7)
+   intersection arete seule (type 8)
+
+   Selon le type d'intersection, on appliquera une transformation locale au maillage
+   de telle sorte que l'arete manquante est recouvree.
+ */
+
+
+#define eps_prec (-1.e-10)
+
+int Edge_Node (Edge * e, Vertex * v){
+  double u=0.0, lc;
+
+  if (!compareVertex (&e->V[0], &v))
+    return 1;
+  if (!compareVertex (&e->V[1], &v))
+    return 1;
+
+  lc = myhypot (myhypot (e->V[0]->Pos.X - e->V[1]->Pos.X, e->V[0]->Pos.Y - e->V[1]->Pos.Y),
+		e->V[0]->Pos.Z - e->V[1]->Pos.Z);
+  
+  if (e->V[0]->Pos.X != e->V[1]->Pos.X){
+    u = (v->Pos.X - e->V[0]->Pos.X) / (e->V[1]->Pos.X - e->V[0]->Pos.X);
+  }
+  else if (e->V[0]->Pos.Y != e->V[1]->Pos.Y){
+    u = (v->Pos.Y - e->V[0]->Pos.Y) / (e->V[1]->Pos.Y - e->V[0]->Pos.Y);
+  }
+  else if (e->V[0]->Pos.Z != e->V[1]->Pos.Z){
+    u = (v->Pos.Z - e->V[0]->Pos.Z) / (e->V[1]->Pos.Z - e->V[0]->Pos.Z);
+  }
+  
+  if (u < -eps_prec || u > 1. + eps_prec)
+    return 0;
+  if (fabs ((1. - u) * e->V[0]->Pos.X + u * e->V[1]->Pos.X - v->Pos.X) > 1.e-7 * lc){
+    return 0;
+  }
+  if (fabs ((1. - u) * e->V[0]->Pos.Y + u * e->V[1]->Pos.Y - v->Pos.Y) > 1.e-7 * lc){
+    return 0;
+  }
+  if (fabs ((1. - u) * e->V[0]->Pos.Z + u * e->V[1]->Pos.Z - v->Pos.Z) > 1.e-7 * lc){
+    return 0;
+  }
+  return 2;
+}
+
+List_T *SurfComm (List_T * S1, List_T * S2){
+  int i;
+  List_T *List;
+  Surface *s;
+  List = List_Create (2, 2, sizeof (Surface *));
+
+  if (!S1 || !S2)
+    return List;
+
+  for (i = 0; i < List_Nbr (S1); i++){
+    List_Read (S1, i, &s);
+    if (List_Search (S2, &s, compareSurface))
+      List_Add (List, &s);
+  }
+  return List;
+}
+
+
+Vertex *Edge_Face (Edge * e, Face * f){
+  Vertex *v;
+
+  double mat[3][3], det;
+  double b[3], res[3];
+
+  if (!compareVertex (&e->V[0], &f->V[0]))
+    return NULL;
+  if (!compareVertex (&e->V[0], &f->V[1]))
+    return NULL;
+  if (!compareVertex (&e->V[0], &f->V[2]))
+    return NULL;
+  if (!compareVertex (&e->V[1], &f->V[0]))
+    return NULL;
+  if (!compareVertex (&e->V[1], &f->V[1]))
+    return NULL;
+  if (!compareVertex (&e->V[1], &f->V[2]))
+    return NULL;
+
+  mat[0][0] = f->V[1]->Pos.X - f->V[0]->Pos.X;
+  mat[0][1] = f->V[2]->Pos.X - f->V[0]->Pos.X;
+  mat[0][2] = e->V[0]->Pos.X - e->V[1]->Pos.X;
+
+  mat[1][0] = f->V[1]->Pos.Y - f->V[0]->Pos.Y;
+  mat[1][1] = f->V[2]->Pos.Y - f->V[0]->Pos.Y;
+  mat[1][2] = e->V[0]->Pos.Y - e->V[1]->Pos.Y;
+
+  mat[2][0] = f->V[1]->Pos.Z - f->V[0]->Pos.Z;
+  mat[2][1] = f->V[2]->Pos.Z - f->V[0]->Pos.Z;
+  mat[2][2] = e->V[0]->Pos.Z - e->V[1]->Pos.Z;
+
+  b[0] = e->V[0]->Pos.X - f->V[0]->Pos.X;
+  b[1] = e->V[0]->Pos.Y - f->V[0]->Pos.Y;
+  b[2] = e->V[0]->Pos.Z - f->V[0]->Pos.Z;
+
+  if (!sys3x3 (mat, b, res, &det))
+    return NULL;
+
+  /* res donne les coordonnees u,v de l'intersection dans la
+     face et donne w la coordonnee de l'intersection dans
+     l'arete
+  */
+  /* coordonnees dans l'arete */
+  if (res[2] >= 1.0 - eps_prec || res[2] <= eps_prec)
+    return NULL;
+
+  /* coordonnees dans la face */
+  if (res[0] >= 1.0 + eps_prec || res[0] <= -eps_prec)
+    return NULL;
+  if (res[1] <= -eps_prec || res[1] >= 1. + eps_prec - res[0])
+    return NULL;
+
+
+  if (res[0] == 1.0 || res[2] == 0.0 || res[0] == 0.0 ||
+      res[1] == 1. - res[0] || res[1] == 0.0 || res[0] == 1.0){
+    Msg(INFO, "facette p1  %12.5E %12.5E %12.5E\n", 
+	f->V[0]->Pos.X, f->V[0]->Pos.Y, f->V[0]->Pos.Z);
+    Msg(INFO, "facette p2  %12.5E %12.5E %12.5E\n",
+	f->V[1]->Pos.X, f->V[1]->Pos.Y, f->V[1]->Pos.Z);
+    Msg(INFO, "facette p3  %12.5E %12.5E %12.5E\n",
+	f->V[2]->Pos.X, f->V[2]->Pos.Y, f->V[2]->Pos.Z);
+    Msg(INFO, "edge    e2  %12.5E %12.5E %12.5E\n", 
+	e->V[0]->Pos.X, e->V[0]->Pos.Y, e->V[0]->Pos.Z);
+    Msg(INFO, "edge    e3  %12.5E %12.5E %12.5E\n",
+	e->V[1]->Pos.X, e->V[1]->Pos.Y, e->V[1]->Pos.Z);
+    Msg(INFO, "%22.15E %22.15E %22.15E \n", res[0], res[1], res[2]);
+  }
+
+
+  /*
+    printf("u v w = %22.15e %22.15e %22.15e\n",res[0],res[1],res[2]);
+  */
+  v = Create_Vertex (++CurrentNodeNumber,
+		     (1. - res[2]) * e->V[0]->Pos.X + res[2] * e->V[1]->Pos.X,
+		     (1. - res[2]) * e->V[0]->Pos.Y + res[2] * e->V[1]->Pos.Y,
+		     (1. - res[2]) * e->V[0]->Pos.Z + res[2] * e->V[1]->Pos.Z,
+		     (1. - res[2]) * e->V[0]->lc + res[2] * e->V[1]->lc, 0.0);
+  v->ListSurf = List_Create (1, 1, sizeof (Surface *));
+  if (DEBUG){
+    Msg(INFO, "facette p1  %12.5E %12.5E %12.5E\n", 
+	f->V[0]->Pos.X, f->V[0]->Pos.Y, f->V[0]->Pos.Z);
+    Msg(INFO,"facette p2  %12.5E %12.5E %12.5E\n", 
+	    f->V[1]->Pos.X, f->V[1]->Pos.Y, f->V[1]->Pos.Z);
+    Msg(INFO,"facette p3  %12.5E %12.5E %12.5E\n", 
+	    f->V[2]->Pos.X, f->V[2]->Pos.Y, f->V[2]->Pos.Z);
+    Msg(INFO,"Newv = %12.5E %12.5E %12.5E\n", v->Pos.X, v->Pos.Y, v->Pos.Z);
+  }
+  return v;
+}
+
+
+Vertex *Edge_Edge (Edge * e, Vertex * v1, Vertex * v2){
+  Vertex *v;
+  int dir, dx1, dx2, dy1, dy2, dz1, dz2;
+  double mat[2][2];
+  double b[3], res[3];
+  double XmaxS, XminS, YmaxS, YminS, ZmaxS, ZminS, lc;
+  double XmaxV, XminV, YmaxV, YminV, ZmaxV, ZminV, val;
+
+  if (!compareVertex (&e->V[0], &v1))
+    return NULL;
+  if (!compareVertex (&e->V[1], &v1))
+    return NULL;
+  if (!compareVertex (&e->V[0], &v2))
+    return NULL;
+  if (!compareVertex (&e->V[1], &v2))
+    return NULL;
+
+  XminS = DMIN (e->V[0]->Pos.X, e->V[1]->Pos.X);
+  XmaxS = DMAX (e->V[0]->Pos.X, e->V[1]->Pos.X);
+  YminS = DMIN (e->V[0]->Pos.Y, e->V[1]->Pos.Y);
+  YmaxS = DMAX (e->V[0]->Pos.Y, e->V[1]->Pos.Y);
+  ZminS = DMIN (e->V[0]->Pos.Z, e->V[1]->Pos.Z);
+  ZmaxS = DMAX (e->V[0]->Pos.Z, e->V[1]->Pos.Z);
+
+  XminV = DMIN (v1->Pos.X, v2->Pos.X);
+  XmaxV = DMAX (v1->Pos.X, v2->Pos.X);
+  YminV = DMIN (v1->Pos.Y, v2->Pos.Y);
+  YmaxV = DMAX (v1->Pos.Y, v2->Pos.Y);
+  ZminV = DMIN (v1->Pos.Z, v2->Pos.Z);
+  ZmaxV = DMAX (v1->Pos.Z, v2->Pos.Z);
+
+  if (XmaxS < XminV || XmaxV < XminS)
+    return NULL;
+  if (YmaxS < YminV || YmaxV < YminS)
+    return NULL;
+  if (ZmaxS < ZminV || ZmaxV < ZminS)
+    return NULL;
+
+  lc = myhypot (myhypot (XminV - XmaxV, YminV - YmaxV), ZminV - ZmaxV);
+
+  if (e->V[1]->Pos.X != e->V[0]->Pos.X &&
+      fabs (e->V[1]->Pos.X - e->V[0]->Pos.X) / lc > 1.e-2)
+    dx1 = 1;
+  else
+    dx1 = 0;
+  if (e->V[1]->Pos.Y != e->V[0]->Pos.Y &&
+      fabs (e->V[1]->Pos.Y - e->V[0]->Pos.Y) / lc > 1.e-2)
+    dy1 = 1;
+  else
+    dy1 = 0;
+  if (e->V[1]->Pos.Z != e->V[0]->Pos.Z &&
+      fabs (e->V[1]->Pos.Z - e->V[0]->Pos.Z) / lc > 1.e-2)
+    dz1 = 1;
+  else
+    dz1 = 0;
+
+  if (v1->Pos.X != v2->Pos.X &&
+      fabs (v1->Pos.X - v2->Pos.X) / lc > 1.e-2)
+    dx2 = 1;
+  else
+    dx2 = 0;
+  if (v1->Pos.Y != v2->Pos.Y &&
+      fabs (v1->Pos.Y - v2->Pos.Y) / lc > 1.e-2)
+    dy2 = 1;
+  else
+    dy2 = 0;
+  if (v1->Pos.Z != v2->Pos.Z &&
+      fabs (v1->Pos.Z - v2->Pos.Z) / lc > 1.e-2)
+    dz2 = 1;
+  else
+    dz2 = 0;
+
+  /*
+     if(dx1 && dx2){
+     mat[0][0] = e->V[1]->Pos.X - e->V[0]->Pos.X;
+     mat[0][1] = v1->Pos.X - v2->Pos.X;
+     b[0] = - e->V[0]->Pos.X + v1->Pos.X;
+     if(dy1 || dy2){
+     mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y;
+     mat[1][1] = v1->Pos.Y - v2->Pos.Y;
+     b[1] = - e->V[0]->Pos.Y + v1->Pos.Y;
+     dir = 2;
+     }
+     else if(dz1 || dz2){
+     mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z;
+     mat[1][1] = v1->Pos.Z - v2->Pos.Z;
+     b[1] = - e->V[0]->Pos.Z + v1->Pos.Z;
+     dir = 3;
+     }
+     }
+     else if (dy1 && dy2){
+     mat[0][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y;
+     mat[0][1] = v1->Pos.Y - v2->Pos.Y;
+     b[0] = - e->V[0]->Pos.Y + v1->Pos.Y;
+     if(dy1 || dy2){
+     mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y;
+     mat[1][1] = v1->Pos.Y - v2->Pos.Y;
+     b[1] = - e->V[0]->Pos.Y + v1->Pos.Y;
+     dir = 2;
+     }
+     else if(dz1 || dz2){
+     mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z;
+     mat[1][1] = v1->Pos.Z - v2->Pos.Z;
+     b[1] = - e->V[0]->Pos.Z + v1->Pos.Z;
+     dir = 3;
+     }
+     }
+   */
+
+  mat[0][0] = e->V[1]->Pos.X - e->V[0]->Pos.X;
+  mat[0][1] = v1->Pos.X - v2->Pos.X;
+  b[0] = -e->V[0]->Pos.X + v1->Pos.X;
+  mat[1][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y;
+  mat[1][1] = v1->Pos.Y - v2->Pos.Y;
+  b[1] = -e->V[0]->Pos.Y + v1->Pos.Y;
+
+  if (!sys2x2 (mat, b, res)){
+    mat[1][0] = e->V[1]->Pos.Z - e->V[0]->Pos.Z;
+    mat[1][1] = v1->Pos.Z - v2->Pos.Z;
+    b[1] = -e->V[0]->Pos.Z + v1->Pos.Z;
+    if (!sys2x2 (mat, b, res)){
+      mat[0][0] = e->V[1]->Pos.Y - e->V[0]->Pos.Y;
+      mat[0][1] = v1->Pos.Y - v2->Pos.Y;
+      b[0] = -e->V[0]->Pos.Y + v1->Pos.Y;
+      if (!sys2x2 (mat, b, res)){
+	/* SEGMENTS PARALLELES */
+	/* printf("systeme singulier\n");
+	   printf("arete %d -> %d\n",v1->Num,v2->Num);
+	   printf("arete %12.5E %12.5E %12.5E --> %12.5E %12.5E %12.5E\n",
+	          v1->Pos.X,v1->Pos.Y,v1->Pos.Z,v2->Pos.X,v2->Pos.Y,v2->Pos.Z);
+	   printf("arete %12.5E %12.5E %12.5E --> %12.5E %12.5E %12.5E\n",
+	          e->V[0]->Pos.X,e->V[0]->Pos.Y,e->V[0]->Pos.Z,
+		  e->V[1]->Pos.X,e->V[1]->Pos.Y,e->V[1]->Pos.Z);
+	   printf("%12.5E %12.5E\n",mat[0][0],mat[0][1]);
+	   printf("%12.5E %12.5E\n",mat[1][0],mat[1][1]);
+	   getchar();
+	*/
+	return NULL;
+      }
+      else{
+	dir = 1;
+      }
+    }
+    else{
+      dir = 2;
+    }
+  }
+  else{
+    dir = 3;
+  }
+  
+  if (res[0] <= eps_prec || res[0] >= 1.0 - eps_prec)
+    return NULL;
+  if (res[1] <= eps_prec || res[1] >= 1.0 - eps_prec)
+    return NULL;
+
+  switch (dir){
+  case 1:
+    val = e->V[0]->Pos.X * (1. - res[0]) + e->V[1]->Pos.X * res[0] -
+      v1->Pos.X * (1. - res[1]) - v2->Pos.X * res[1];
+    break;
+  case 2:
+    val = e->V[0]->Pos.Y * (1. - res[0]) + e->V[1]->Pos.Y * res[0] -
+      v1->Pos.Y * (1. - res[1]) - v2->Pos.Y * res[1];
+    break;
+  case 3:
+    val = e->V[0]->Pos.Z * (1. - res[0]) + e->V[1]->Pos.Z * res[0] -
+      v1->Pos.Z * (1. - res[1]) - v2->Pos.Z * res[1];
+    break;
+  }
+  if (fabs (val / lc) > 1.e-08 /*08 */ )
+    return NULL;
+  v = Create_Vertex (++CurrentNodeNumber,
+		     (1. - res[0]) * e->V[0]->Pos.X + res[0] * e->V[1]->Pos.X,
+		     (1. - res[0]) * e->V[0]->Pos.Y + res[0] * e->V[1]->Pos.Y,
+		     (1. - res[0]) * e->V[0]->Pos.Z + res[0] * e->V[1]->Pos.Z,
+		     (1. - res[0]) * e->V[0]->lc + res[0] * e->V[1]->lc, 0.0);
+  
+  v->ListSurf = List_Create (1, 1, sizeof (Surface *));
+  return v;
+
+}
+
+int intersection_2_aretes (double Xa, double Ya, double Za,
+			   double Xb, double Yb, double Zb,
+			   double Xc, double Yc, double Zc,
+			   double Xd, double Yd, double Zd,
+			   int p1, int p2, int p3, int p4,
+			   double *X, double *Y, double *Z){
+  Vertex *v1, *v2, *v3, *v4, *v;
+  Edge e;
+  v1 = Create_Vertex (p1, Xa, Ya, Za, 0.0, 0.0);
+  v2 = Create_Vertex (p2, Xb, Yb, Zb, 0.0, 0.0);
+  v3 = Create_Vertex (p3, Xc, Yc, Zc, 0.0, 0.0);
+  v4 = Create_Vertex (p4, Xd, Yd, Zd, 0.0, 0.0);
+
+  e.V[0] = v3;
+  e.V[1] = v4;
+
+  if ((v = Edge_Edge (&e, v1, v2))){
+    
+    *X = v->Pos.X;
+    *Y = v->Pos.Y;
+    *Z = v->Pos.Z;
+
+    Free (v1);
+    Free (v2);
+    Free (v3);
+    Free (v4);
+    Free (v);
+    return 1;
+  }
+  else{
+    Free (v1);
+    Free (v2);
+    Free (v3);
+    Free (v4);
+    Free (v);
+    return 0;
+  }
+
+}
+
+List_T *NewPoints;
+
+void Intersect_Edge_Simplexe (Edge * e, Simplex * s, Intersection * I){
+
+  int i, NbInt, NbVer, NbEdg, NbFac, j;
+  Vertex *v;
+  double XminS, YminS, ZminS, XmaxS, YmaxS, ZmaxS;
+  double XminE, YminE, ZminE, XmaxE, YmaxE, ZmaxE;
+  xNewv x;
+
+  /* On initialise l'intersection */
+
+  I->NbVertex = I->NbFace = I->NbEdge = 0;
+  I->s = s;
+  I->e = e;
+  I->NbIntersect = 0;
+
+  /*
+    On regarde d'abord si une intersection est possible en
+    calculant les boites de l'arete et du simplexe 
+  */
+
+  if (s->V[3]){
+    NbVer = 4;
+    NbEdg = 6;
+    NbFac = 4;
+    NbInt = 2;
+  }
+  else if (s->V[2]){
+    NbVer = 3;
+    NbEdg = 3;
+    NbFac = 1;
+    NbInt = 33;
+  }
+  
+  XminE = DMIN (e->V[0]->Pos.X, e->V[1]->Pos.X);
+  XmaxE = DMAX (e->V[0]->Pos.X, e->V[1]->Pos.X);
+  YminE = DMIN (e->V[0]->Pos.Y, e->V[1]->Pos.Y);
+  YmaxE = DMAX (e->V[0]->Pos.Y, e->V[1]->Pos.Y);
+  ZminE = DMIN (e->V[0]->Pos.Z, e->V[1]->Pos.Z);
+  ZmaxE = DMAX (e->V[0]->Pos.Z, e->V[1]->Pos.Z);
+
+  XminS = s->V[0]->Pos.X;
+  XmaxS = s->V[0]->Pos.X;
+  YminS = s->V[0]->Pos.Y;
+  YmaxS = s->V[0]->Pos.Y;
+  ZminS = s->V[0]->Pos.Z;
+  ZmaxS = s->V[0]->Pos.Z;
+
+  for (i = 1; i < NbVer; i++){
+    XminS = DMIN (XminS, s->V[i]->Pos.X);
+    XmaxS = DMAX (XmaxS, s->V[i]->Pos.X);
+    YminS = DMIN (YminS, s->V[i]->Pos.Y);
+    YmaxS = DMAX (YmaxS, s->V[i]->Pos.Y);
+    ZminS = DMIN (ZminS, s->V[i]->Pos.Z);
+    ZmaxS = DMAX (ZmaxS, s->V[i]->Pos.Z);
+  }
+  if (XmaxS < XminE || XmaxE < XminS)
+    return;
+  if (YmaxS < YminE || YmaxE < YminS)
+    return;
+  if (ZmaxS < ZminE || ZmaxE < ZminS)
+    return;
+
+  /*
+    On regarde si l'arete coupe un des 4 noeuds du
+    simplexe
+  */
+
+  for (i = 0; i < NbVer; i++){
+    if ((j = Edge_Node (e, s->V[i]))){
+      I->V[I->NbVertex] = s->V[i];
+      I->iV[I->NbVertex++] = i;
+      (I->NbIntersect)++;
+      if (j == 2){
+	List_Replace (NewPoints, &s->V[i], compareVertex);
+	/*      printf("l'arete intersecte un noeud\n"); */
+	pvertex (s->V[i], s->V[i]);
+	pedge (e, e);
+      }
+    }
+  }
+  
+  if (I->NbIntersect == NbInt)
+    return;
+  
+  /* On regarde si l'arete coupe une autre arete */
+  for (i = 0; i < NbEdg; i++){
+    x.ef = 1;
+    x.e.V[0] = s->V[edges_tetra[i][0]];
+    x.e.V[1] = s->V[edges_tetra[i][1]];
+    if (Tree_Query (TreexNewv, &x)){
+      v = x.newv;
+      I->E[I->NbEdge] = i;
+      I->VE[(I->NbEdge)++] = v;
+      (I->NbIntersect)++;
+    }
+    else if ((v = Edge_Edge (e, s->V[edges_tetra[i][0]],
+			     s->V[edges_tetra[i][1]]))) {
+      List_Add (NewPoints, &v);
+      I->E[I->NbEdge] = i;
+      I->VE[(I->NbEdge)++] = v;
+      (I->NbIntersect)++;
+      x.newv = v;
+      Tree_Add (TreexNewv, &x);
+    }
+  }
+  
+  if (I->NbIntersect == NbInt)
+    return;
+
+  /*
+    On regarde si l'arete coupe une face
+  */
+
+  for (i = 0; i < NbFac; i++){
+    x.ef = 2;
+    x.f = &s->F[i];
+    if (Tree_Query (TreexNewv, &x)){
+      v = x.newv;
+      I->VF[I->NbFace] = v;
+      I->F[I->NbFace] = &s->F[i];
+      I->iF[(I->NbFace)++] = i;
+      (I->NbIntersect)++;
+    }
+    else if ((v = Edge_Face (e, &s->F[i]))){
+      I->VF[I->NbFace] = v;
+      List_Add (NewPoints, &v);
+      I->F[I->NbFace] = &s->F[i];
+      I->iF[I->NbFace++] = i;
+      (I->NbIntersect)++;
+      x.newv = v;
+      Tree_Add (TreexNewv, &x);
+    }
+  }
+}
+
+
+void Intersect_Face_Simplexe (Face * f, Simplex * s, Intersection * I){
+
+  int i ;
+  Vertex *v;
+  double XminS, YminS, ZminS, XmaxS, YmaxS, ZmaxS;
+  double XminE, YminE, ZminE, XmaxE, YmaxE, ZmaxE;
+  xNewv x;
+
+  /* On initialise l'intersection */
+
+  I->NbVertex = I->NbFace = I->NbEdge = 0;
+  I->s = s;
+  I->f = f;
+  I->NbIntersect = 0;
+
+  /*
+    On regarde d'abord si une intersection est possible en
+    calculant les boites de l'arete et du simplexe
+  */
+
+  XminE = DMIN (DMIN (f->V[0]->Pos.X, f->V[1]->Pos.X), f->V[2]->Pos.X);
+  XmaxE = DMAX (DMAX (f->V[0]->Pos.X, f->V[1]->Pos.X), f->V[2]->Pos.X);
+  YminE = DMIN (DMIN (f->V[0]->Pos.Y, f->V[1]->Pos.Y), f->V[2]->Pos.Y);
+  YmaxE = DMAX (DMAX (f->V[0]->Pos.Y, f->V[1]->Pos.Y), f->V[2]->Pos.Y);
+  ZminE = DMIN (DMIN (f->V[0]->Pos.Z, f->V[1]->Pos.Z), f->V[2]->Pos.Z);
+  ZmaxE = DMAX (DMAX (f->V[0]->Pos.Z, f->V[1]->Pos.Z), f->V[2]->Pos.Z);
+
+  XminS = s->V[0]->Pos.X;
+  XmaxS = s->V[0]->Pos.X;
+  YminS = s->V[0]->Pos.Y;
+  YmaxS = s->V[0]->Pos.Y;
+  ZminS = s->V[0]->Pos.Z;
+  ZmaxS = s->V[0]->Pos.Z;
+
+  for (i = 1; i < 4; i++){
+    XminS = DMIN (XminS, s->V[i]->Pos.X);
+    XmaxS = DMAX (XmaxS, s->V[i]->Pos.X);
+    YminS = DMIN (YminS, s->V[i]->Pos.Y);
+    YmaxS = DMAX (YmaxS, s->V[i]->Pos.Y);
+    ZminS = DMIN (ZminS, s->V[i]->Pos.Z);
+    ZmaxS = DMAX (ZmaxS, s->V[i]->Pos.Z);
+  }
+  if (XmaxS < XminE || XmaxE < XminS)
+    return;
+  if (YmaxS < YminE || YmaxE < YminS)
+    return;
+  if (ZmaxS < ZminE || ZmaxE < ZminS)
+    return;
+
+  /* On regarde si l'arete coupe la facette */
+  for (i = 0; i < 6; i++){
+    x.ef = 1;
+    x.e.V[0] = s->V[edges_tetra[i][0]];
+    x.e.V[1] = s->V[edges_tetra[i][1]];
+    if (Tree_Query (TreexNewv, &x)){
+      v = x.newv;
+      I->E[I->NbEdge] = i;
+      I->VE[(I->NbEdge)++] = v;
+      (I->NbIntersect)++;
+    }
+    else if ((v = Edge_Face (&x.e, f))){
+      /* printf("%d %d %d %d\n",s->V[0]->Num,s->V[1]->Num,s->V[2]->Num,s->V[3]->Num); */
+      List_Add (NewPoints, &v);
+      I->E[I->NbEdge] = i;
+      I->VE[I->NbEdge] = v;
+      (I->NbEdge)++;
+      (I->NbIntersect)++;
+      x.newv = v;
+      Tree_Add (TreexNewv, &x);
+    }
+  }
+}
+
+Tree_T *Actual_Tree, *TetAdd, *TetDel;
+
+static void _Add (void *data, void *dum){
+  Tree_Add (Actual_Tree, data);
+}
+static void _Del (void *data, void *dum){
+  Tree_Suppress (Actual_Tree, data);
+}
+
+void Recover_Edge (void *a, void *b){
+  Simplex *s;
+  Intersection I;
+
+  s = *(Simplex **) a;
+  Intersect_Edge_Simplexe (TheEdge, s, &I);
+  if (I.NbIntersect){
+    cut_tetraedre (&I, TetAdd, TetDel, THEVOL->Vertices);
+  }
+}
+
+void Recover_Face (void *a, void *b){
+  Simplex *s;
+  Intersection I;
+
+  s = *(Simplex **) a;
+  Intersect_Face_Simplexe (TheFace, s, &I);
+  if (I.NbEdge){
+    cut_tetraedre (&I, TetAdd, TetDel, THEVOL->Vertices);
+  }
+}
+
+static double volume;
+
+static void VSIM (void *a, void *b){
+  Simplex *S;
+  S = *(Simplex **) a;
+  if (S->V[3])
+    volume += fabs (S->Volume_Simplexe ());
+}
+
+Vertex *DEPART;
+
+int comparePos (const void *a, const void *b){
+  Vertex *q, *w;
+  double d1, d2;
+  q = *(Vertex **) a;
+  w = *(Vertex **) b;
+
+  d1 = DSQR (q->Pos.X - DEPART->Pos.X) +
+    DSQR (q->Pos.Y - DEPART->Pos.Y) +
+    DSQR (q->Pos.Z - DEPART->Pos.Z);
+  d2 = DSQR (w->Pos.X - DEPART->Pos.X) +
+    DSQR (w->Pos.Y - DEPART->Pos.Y) +
+    DSQR (w->Pos.Z - DEPART->Pos.Z);
+  if (d1 < d2)
+    return 1;
+  if (d1 > d2)
+    return -1;
+
+  exit (1);
+  return 1;
+}
+
+List_T *ListFaces;
+
+void findFaces (void *a, void *b){
+  Simplex *s;
+  int i;
+  s = *(Simplex **) a;
+  if (List_Search (NewPoints, &s->V[0], compareVertex) ||
+      List_Search (NewPoints, &s->V[1], compareVertex) ||
+      List_Search (NewPoints, &s->V[2], compareVertex) ||
+      List_Search (NewPoints, &s->V[3], compareVertex))
+    /*
+      printf("%d %d %d %d\n",s->V[0]->Num,s->V[1]->Num,s->V[2]->Num,s->V[3]->Num);
+    */
+    for (i = 0; i < 4; i++){
+      if (List_Search (NewPoints, &s->F[i].V[0], compareVertex) &&
+	  List_Search (NewPoints, &s->F[i].V[1], compareVertex) &&
+	  List_Search (NewPoints, &s->F[i].V[2], compareVertex))
+	List_Replace (ListFaces, &s->F[i], compareFace);
+    }
+}
+
+void findEdges (void *a, void *b){
+}
+
+Simplex * Create_Simplex_MemeSens (Simplex * sold, Vertex * v1, Vertex * v2, Vertex * v3){
+
+  Simplex *s;
+
+  if (memesens (sold->V[0], sold->V[1], sold->V[2], v1, v2, v3) > 0.0){
+    s = Create_Simplex (v1, v2, v3, NULL);
+  }
+  else{
+    s = Create_Simplex (v2, v1, v3, NULL);
+  }
+  s->iEnt = sold->iEnt;
+  return s;
+}
+
+int Coherence (Volume * v, Mesh * m){
+  int i, j, k, Np, Nh;
+  Surface *s;
+  Vertex *ver1, V1, *ver2, V2;
+  Face Face;
+  static Edge E, *pE1, *pE2, *pE3;
+  Simplex *simp, *simp1;
+  List_T *MissingEdges, *MissingFaces;
+
+  FACE_DIMENSION = 2;
+
+  ver1 = &V1;
+  ver2 = &V2;
+
+  THEVOL = v;
+
+  Remise_A_Zero ();
+
+  create_Edges (v);
+  MissingEdges = Missing_Edges (v);
+
+  /* Edge Swapping */
+  create_Quads (v);
+
+  /* Missing Edges */
+  create_Edges (v);
+  MissingEdges = Missing_Edges (v);
+
+  /* Missing Faces */
+  create_Faces (v);
+  MissingFaces = Missing_Faces (v);
+
+  /* Edges Recovery */
+  Msg(STATUS, "Boundary Edges Recovery");
+
+  volume = 0;
+  Tree_Action (v->Simplexes, VSIM);
+  Msg(INFO, "Volume == %12.5E", volume);
+
+  Msg(INFO, " ===================================");
+  Msg(INFO, " (1) Nombre d'aretes manquantes %3d", List_Nbr (Missing));
+  Msg(INFO, " ===================================");
+  for (i = 0; i < List_Nbr (Missing); i++){
+    
+    pE1 = (Edge *) List_Pointer (Missing, i);
+    TheEdge = pE1;
+    
+    TreexNewv = Tree_Create (sizeof (xNewv), compxNewv);
+    NewPoints = List_Create (1, 1, sizeof (Vertex *));
+    TetAdd = Tree_Create (sizeof (Simplex *), compareSimplex);
+    TetDel = Tree_Create (sizeof (Simplex *), compareSimplex);
+    
+    Tree_Action (v->Simplexes, Recover_Edge);
+    Actual_Tree = v->Simplexes;
+    Tree_Action (TetAdd, _Add);
+    Tree_Action (TetDel, _Del);
+    pE1->Liste = NewPoints;
+    /*
+      if(CTX.mesh.nb_smoothing){
+        DEPART = pE1->V[0];
+        List_Tri(NewPoints,comparePos);
+        for(j=0;j<List_Nbr(NewPoints);j++){
+          List_Read(NewPoints,j,&ver1);
+          u = (double)(j+1) / (double)(List_Nbr(NewPoints)+1);
+          ver1->Pos.X = u * pE1->V[1]->Pos.X + (1.-u) * pE1->V[0]->Pos.X;
+          ver1->Pos.Y = u * pE1->V[1]->Pos.Y + (1.-u) * pE1->V[0]->Pos.Y;
+          ver1->Pos.Z = u * pE1->V[1]->Pos.Z + (1.-u) * pE1->V[0]->Pos.Z;
+        }
+      }
+    */
+    Msg(INFO, "Traitement de %d -> %d", pE1->V[0]->Num, pE1->V[1]->Num);
+    Msg(INFO, "=> %d divisions", List_Nbr (NewPoints));
+
+    if (!List_Nbr (NewPoints)){
+      Msg(INFO, "%g %g %g", pE1->V[0]->Pos.X, pE1->V[0]->Pos.Y, pE1->V[0]->Pos.Z);
+      Msg(INFO, "%g %g %g", pE1->V[1]->Pos.X, pE1->V[1]->Pos.Y, pE1->V[1]->Pos.Z);
+      Msg(ERROR, "Missing Edge Without Any Intersection");
+    }
+    
+  }
+
+  volume = 0;
+  Tree_Action (v->Simplexes, VSIM);
+  Msg(INFO, "Volume == %12.5E", volume);
+  Msg(STATUS, "Boundary Faces Recovery");
+
+  /* Missing Faces */
+
+  Msg(INFO, " ===================================");
+  Msg(INFO, " (1) Nombre de facettes manquantes %3d", List_Nbr (MissingFaces));
+  Msg(INFO, " ===================================");
+
+  for (i = 0; i < List_Nbr (MissingS); i++){
+    List_Read (MissingS, i, &simp);
+    TheFace = &simp->F[0];
+    Msg(INFO, "missing face %6d %6d %6d", simp->F[0].V[0]->Num, 
+	simp->F[0].V[1]->Num, simp->F[0].V[2]->Num);
+    E.V[0] = simp->F[0].V[0];
+    E.V[1] = simp->F[0].V[1];
+    pE1 = (Edge *) List_PQuery (Missing, &E, compareedge);
+    E.V[0] = simp->F[0].V[1];
+    E.V[1] = simp->F[0].V[2];
+    pE2 = (Edge *) List_PQuery (Missing, &E, compareedge);
+    E.V[0] = simp->F[0].V[2];
+    E.V[1] = simp->F[0].V[0];
+    pE3 = (Edge *) List_PQuery (Missing, &E, compareedge);
+
+    /* On verifie si c'est simple c a d si les tetraedres
+       couvrent entierement la face */
+    NewPoints = List_Create (3, 1, sizeof (Vertex *));
+    List_Add (NewPoints, &simp->F[0].V[0]);
+    if (pE1)
+      for (j = 0; j < List_Nbr (pE1->Liste); j++)
+	List_Add (NewPoints, List_Pointer (pE1->Liste, j));
+    List_Add (NewPoints, &simp->F[0].V[1]);
+    if (pE2)
+      for (j = 0; j < List_Nbr (pE2->Liste); j++)
+	List_Add (NewPoints, List_Pointer (pE2->Liste, j));
+    List_Add (NewPoints, &simp->F[0].V[2]);
+    if (pE3)
+      for (j = 0; j < List_Nbr (pE3->Liste); j++)
+	List_Add (NewPoints, List_Pointer (pE3->Liste, j));
+    ListFaces = List_Create (2, 2, sizeof (Face));
+    Tree_Action (v->Simplexes, findFaces);
+    
+    Nh = List_Nbr (NewPoints);
+    
+    /* il reste des intersections */
+    
+    if (List_Nbr (ListFaces) != Nh - 2){
+      /*
+	printf("Recherche des intersections\n");
+	printf("La face initiale comprend %d faces existantes\n",List_Nbr(ListFaces));
+	printf("La face est divisee en %d points\n",List_Nbr(NewPoints));
+      */
+      TreexNewv = Tree_Create (sizeof (xNewv), compxNewv);
+      TetAdd = Tree_Create (sizeof (Simplex *), compareSimplex);
+      TetDel = Tree_Create (sizeof (Simplex *), compareSimplex);
+      Tree_Action (v->Simplexes, Recover_Face);
+      /*
+	printf("La face est divisee en %d points %d %d \n",
+	       List_Nbr(NewPoints),Tree_Nbr(TetAdd),Tree_Nbr(TetDel));
+      */
+      Actual_Tree = v->Simplexes;
+      Tree_Action (TetAdd, _Add);
+      Tree_Action (TetDel, _Del);
+      ListFaces = List_Create (2, 2, sizeof (Face));
+      Tree_Action (v->Simplexes, findFaces);
+    }
+
+    Np = List_Nbr (NewPoints);
+
+    if (1 || List_Nbr (ListFaces) == 2 * (Np - 1) - Nh){
+      
+      Msg(INFO, "La face est recuperable (%d <--> %d=2*(%d-1)-%d)*****",
+	  List_Nbr (ListFaces), 2 * (Np - 1) - Nh, Np, Nh);
+      
+      for (j = 0; j < List_Nbr (v->Surfaces); j++){
+	List_Read (v->Surfaces, j, &s);
+	if (Tree_Search (s->Simplexes, &simp)){
+	  for (k = 0; k < List_Nbr (ListFaces); k++){
+	    List_Read (ListFaces, k, &Face);
+	    simp1 = Create_Simplex_MemeSens (simp, Face.V[0], Face.V[1], Face.V[2]);
+	    Tree_Add (s->Simplexes, &simp1);
+	    Tree_Replace (s->Vertices, &Face.V[0]);
+	    Tree_Replace (s->Vertices, &Face.V[1]);
+	    Tree_Replace (s->Vertices, &Face.V[2]);
+	    Tree_Replace (v->Vertices, &Face.V[0]);
+	    Tree_Replace (v->Vertices, &Face.V[1]);
+	    Tree_Replace (v->Vertices, &Face.V[2]);
+	  }
+	  Tree_Suppress (s->Simplexes, &simp);
+	}
+      }
+    }
+    else{
+      Msg(INFO, "***** La face est irrecuperable (%d <--> %d=2*(%d-1)-%d)*****",
+	  List_Nbr (ListFaces), 2 * (Np - 1) - Nh, Np, Nh);
+      for (k = 0; k < List_Nbr (ListFaces); k++){
+	List_Read (ListFaces, k, &Face);
+	Msg(INFO, "face %d %d %d", Face.V[0]->Num, Face.V[1]->Num, Face.V[2]->Num);
+      }
+      Msg(ERROR, "Unable To Recover One Face");
+      Tree_Action (v->Simplexes, findEdges);
+    }
+  }
+  volume = 0;
+  Tree_Action (v->Simplexes, VSIM);
+  Msg(INFO, "Volume apres la recup === %12.5E", volume);
+
+  /* Missing Edges */
+  create_Edges (v);
+  MissingEdges = Missing_Edges (v);
+
+  /* Missing Faces */
+  create_Faces (v);
+  MissingFaces = Missing_Faces (v);
+
+  Msg(INFO, "Verification finale : %d edges manquantes", List_Nbr (MissingEdges));
+  Msg(INFO, "Verification finale : %d faces manquantes", List_Nbr (MissingFaces));
+
+  Impression_Resultats ();
+
+  Link_Simplexes (NULL, v->Simplexes);
+  Msg(STATUS, "Volume Recovery");
+  Restore_Volume (v);
+
+  if (List_Nbr (MissingFaces) || List_Nbr (MissingEdges)){
+    return 0;
+  }
+  return 1;
+}
+
+/* A partir d'un maillage de volume qui respecte la 
+   frontiere, on attribue a chaque tetraedre son 
+   numero de volume */
+
+List_T *ListSurfaces, *ListAllSurf;
+Tree_T *keep;
+Simplex *SIMP;
+int iVolume;
+
+void attribueVolume (void *a, void *b){
+  Simplex *s;
+  s = *(Simplex **) a;
+  s->iEnt = iVolume;
+}
+
+void Trouve_Simplex (void *a, void *b){
+  Simplex *s;
+  if (SIMP != NULL)
+    return;
+  s = *(Simplex **) a;
+  if (s->iEnt < 0)
+    SIMP = s;
+}
+
+void Trouve_Simplex_Bord (void *a, void *b){
+  Simplex *s;
+
+  if (SIMP != NULL)
+    return;
+  s = *(Simplex **) a;
+  if (s->V[0]->Num < 0 || s->V[1]->Num < 0 || s->V[2]->Num < 0 || s->V[3]->Num < 0)
+    SIMP = s;
+}
+
+void SurfacesDansVolume (Volume * v, List_T * ListAllSurf){
+  int i, iseg;
+  Surface *s;
+  for (i = 0; i < List_Nbr (v->Surfaces); i++)
+    {
+      List_Read (v->Surfaces, i, &s);
+      iseg = abs (s->Num);
+      List_Replace (ListAllSurf, &iseg, fcmp_int);
+    }
+}
+
+int isListaVolume (List_T * ListSurf, Mesh * M){
+  int NN, i, j, srf;
+  bool found;
+  Surface *Surf;
+  Volume *v;
+  List_T *AllVolumes = Tree2List (M->Volumes);
+
+  for (i = 0; i < List_Nbr (AllVolumes); i++){
+    List_Read (AllVolumes, i, &v);
+    found = true;
+    NN = 0;
+    if (v->Typ == MSH_VOLUME){
+      for (j = 0; j < List_Nbr (v->Surfaces); j++){
+	List_Read (v->Surfaces, j, &Surf);
+	srf = abs (Surf->Num);
+	if (!List_Search (ListSurf, &srf, fcmp_int)){
+	  found = false;
+	}
+	else
+	  NN++;
+      }
+      if (found && NN == List_Nbr (ListSurf))
+	return v->Num;
+    }
+  }
+  return 0;
+}
+
+int compareSimpSurf (const void *a, const void *b){
+  Simplex *q, *w;
+  q = *(Simplex **) a;
+  w = *(Simplex **) b;
+  return compareFace (&q->F[0], &w->F[0]);
+}
+
+List_T *StackSimp;
+#define MAX_DEPTH 500
+
+void recur_trouve_volume (Simplex * s, int *Depth){
+  int i, j;
+  Simplex *pS, S;
+
+  if (s->iEnt != -1)
+    return;
+
+  if ((*Depth) > MAX_DEPTH) {
+    List_Add (StackSimp, &s);
+    return;
+  }
+  
+  (*Depth)++;
+  s->iEnt = -2;
+  Tree_Add (keep, &s);
+  for (i = 0; i < 4; i++){
+    pS = &S;
+    pS->F[0] = s->F[i];
+    if (Tree_Query (FacesTree, &pS) && List_Search (ListAllSurf, &pS->iEnt, fcmp_int)){
+      j = abs (pS->iEnt);
+      List_Replace (ListSurfaces, &j, fcmp_int);
+    }
+    else if (s->S[i] && s->S[i] != &MyNewBoundary){
+      recur_trouve_volume (s->S[i], Depth);
+    }
+  }
+  (*Depth)--;
+}
+
+void Restore_Volume (Volume * v){
+  int N;
+  int j, i, depth;
+  Surface *s;
+
+  StackSimp = List_Create (100, 100, sizeof (Simplex *));
+
+  FacesTree = Tree_Create (sizeof (Simplex *), compareSimpSurf);
+  Actual_Tree = FacesTree;
+  for (j = 0; j < List_Nbr (v->Surfaces); j++){
+    List_Read (v->Surfaces, j, &s);
+    Tree_Action (s->Simplexes, _Add);
+  }
+
+  ListSurfaces = List_Create (2, 2, sizeof (int));
+  iVolume = -1;
+  Tree_Action (v->Simplexes, attribueVolume);
+
+  /* Les simplexes sur le bord exterieur sont elimines */
+
+  ListAllSurf = List_Create (10, 3, sizeof (int));
+  SurfacesDansVolume (v, ListAllSurf);
+
+  SIMP = NULL;
+  Tree_Action (v->Simplexes, Trouve_Simplex_Bord);
+
+  if (SIMP){
+    List_Add (StackSimp, &SIMP);
+    keep = Tree_Create (sizeof (Simplex *), compareQuality);
+    depth = 0;
+    i = 0;
+    do{
+      List_Read (StackSimp, i, &SIMP);
+      recur_trouve_volume (SIMP, &depth);
+    } while (++i < List_Nbr (StackSimp));
+    List_Reset (StackSimp);
+
+    for (i = 0; i < List_Nbr (ListSurfaces); i++){
+      List_Read (ListSurfaces, i, &j);
+      Msg(INFO, "surf : %d ", j);
+    }
+    
+    iVolume = 0;
+    Tree_Action (keep, attribueVolume);
+    Tree_Delete (keep);
+    List_Reset (ListSurfaces);
+  }
+  
+  while (1){
+    SIMP = NULL;
+    keep = Tree_Create (sizeof (Simplex *), compareQuality);
+    Tree_Action (v->Simplexes, Trouve_Simplex);
+    if (!SIMP)
+      break;
+    List_Add (StackSimp, &SIMP);
+    depth = 0;
+    i = 0;
+    do{
+      List_Read (StackSimp, i, &SIMP);
+      recur_trouve_volume (SIMP, &depth);
+    }while (++i < List_Nbr (StackSimp));
+    
+    iVolume = isListaVolume (ListSurfaces, THEM);
+    
+    for (i = 0; i < List_Nbr (ListSurfaces); i++){
+      List_Read (ListSurfaces, i, &j);
+      Msg(INFO, "surf : %d ", j);
+    }
+    
+    N = Tree_Nbr (keep);
+    Msg(INFO, "volume %d maillage initial %d simplexes", iVolume, N);
+    Tree_Action (keep, attribueVolume);
+    Tree_Delete (keep);
+    List_Reset (ListSurfaces);
+    List_Reset (StackSimp);
+  }
+}
diff --git a/Mesh/3D_Divide.cpp b/Mesh/3D_Divide.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..006294fac0a631209f6c97a014bf00bd50a3c7d4
--- /dev/null
+++ b/Mesh/3D_Divide.cpp
@@ -0,0 +1,705 @@
+/* Routine de division des elements tetraedriques
+   ou triangulaires
+
+        1 triangle -> 4 triangles ;
+        1 tetraedre -> noeuds 1 2 3 4
+                       faces  1 4 2
+                              1
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+
+extern int    edges_tetra[6][2];
+extern int    CurrentNodeNumber; 
+
+static Tree_T *New_Edges = NULL;
+static int    IENT;
+
+typedef struct {
+  int i;
+  int j;
+}nxn;
+
+static int are_exists (Vertex *v1, Vertex *v2){
+  nxn nx;
+  nx.i = IMAX(v1->Num,v2->Num);
+  nx.j = IMIN(v1->Num,v2->Num);
+  return Tree_Search(New_Edges,&nx);
+}
+
+static void are_add (Vertex *v1, Vertex *v2){
+  nxn nx;
+  nx.i = IMAX(v1->Num,v2->Num);
+  nx.j = IMIN(v1->Num,v2->Num);
+  Tree_Add(New_Edges,&nx);
+}
+
+static int compnxn (const void *a, const void *b){
+  nxn *q,*w;
+  q = (nxn*)a;
+  w = (nxn*)b;
+  if(q->i>w->i)return 1;
+  if(q->i<w->i)return -1;
+  if(q->j>w->j)return 1;
+  if(q->j<w->j)return -1;
+  return 0;
+}
+
+static int FF,FV,EV,EE,FE,EEE,EEEE;
+void Remise_A_Zero (void){
+  FF=EE=FV=EV=FE=EEE=EEEE=0;
+}
+
+void Impression_Resultats (void){
+  Msg(INFOS,"==============================================="); 
+  Msg(INFOS," Surface coherence results: intersections:"); 
+  Msg(INFOS," %d EV, %d EE, %d FV, %d FF, %d FE, %d EEE, %d EEEE",
+	  EV,EE,FV,FF,FE,EEE,EEEE); 
+  Msg(INFOS,"==============================================="); 
+}
+
+int PARLE = 0;
+
+void cut_prism (Vertex * v1, Vertex * v2, Vertex * v3,
+		Vertex * v4, Vertex * v5, Vertex * v6,
+		Tree_T * newpoints, Tree_T * AddedTet){
+
+  Simplex *news;
+  Vertex *e1;
+
+  Msg (INFOS, "Prism Cut");
+
+  /* test des meilleures aretes a creer */
+  /*
+     if(!are_exists(v1,v6) &&
+     !are_exists(v4,v3)){
+
+     if(fabs(angle_3p(v1,v4,v6)) >
+     fabs(angle_3p(v4,v6,v3))){
+     are_add(v4,v3);
+     }
+     else{
+     are_add(v1,v6);
+     }
+     }
+
+     if(!are_exists(v3,v5) &&
+     !are_exists(v6,v2)){
+
+     if(fabs(angle_3p(v6,v5,v2)) >
+     fabs(angle_3p(v5,v2,v3))){
+     are_add(v5,v3);
+     }
+     else{
+     are_add(v2,v6);
+     }
+     }
+
+     if(!are_exists(v1,v5) &&
+     !are_exists(v4,v2)){
+
+     if(fabs(angle_3p(v1,v4,v5)) >
+     fabs(angle_3p(v4,v5,v2))){
+     are_add(v4,v2);
+     }
+     else{
+     are_add(v1,v5);
+     }
+     }
+   */
+  if (!are_exists (v1, v5) &&	//OK
+      !are_exists (v6, v2) &&
+      !are_exists (v6, v1)){
+    news = Create_Simplex (v1, v2, v3, v4);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v2, v4, v5, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v4, v2);
+    are_add (v5, v3);
+    are_add (v4, v3);
+  }
+  else if (!are_exists (v1, v5) &&	//OK
+	   !are_exists (v3, v5) &&
+	   !are_exists (v1, v6)){
+    news = Create_Simplex (v1, v2, v3, v4);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v2);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v2, v6, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v4, v2);
+    are_add (v2, v6);
+    are_add (v4, v3);
+  }
+  else if (!are_exists (v1, v5) &&	//OK
+	   !are_exists (v3, v5) &&
+	   !are_exists (v4, v3)){
+    news = Create_Simplex (v1, v2, v3, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v2);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v2, v4, v6, v1);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v4, v2);
+    are_add (v2, v6);
+    are_add (v6, v1);
+  }
+  else if (!are_exists (v4, v2) &&	//OK
+	   !are_exists (v6, v2) &&
+	   !are_exists (v6, v1)){
+    news = Create_Simplex (v1, v2, v3, v5);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v1, v4, v5, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v5, v1);
+    are_add (v5, v3);
+    are_add (v4, v3);
+  }
+  else if (!are_exists (v4, v2) &&	//OK
+	   !are_exists (v6, v2) &&
+	   !are_exists (v4, v3)){
+    news = Create_Simplex (v1, v2, v3, v5);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v1);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v1, v3, v5, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v5, v1);
+    are_add (v5, v3);
+    are_add (v6, v1);
+  }
+  else if (!are_exists (v4, v2) &&	//OK
+	   !are_exists (v3, v5) &&
+	   !are_exists (v4, v3)){
+    news = Create_Simplex (v1, v2, v3, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v4, v5, v6, v1);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (v1, v2, v5, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    are_add (v5, v1);
+    are_add (v2, v6);
+    are_add (v6, v1);
+  }
+
+  else if (are_exists (v6, v1) &&
+	   are_exists (v5, v3) &&
+	   are_exists (v4, v2)) {
+    Msg(INFOS, "Steiner Prism  1 found !");
+    
+    e1 = Create_Vertex (++CurrentNodeNumber,
+			(v1->Pos.X + v2->Pos.X + v3->Pos.X + v4->Pos.X + v5->Pos.X + v6->Pos.X) / 6.,
+			(v1->Pos.Y + v2->Pos.Y + v3->Pos.Y + v4->Pos.Y + v5->Pos.Y + v6->Pos.Y) / 6.,
+			(v1->Pos.Z + v2->Pos.Z + v3->Pos.Z + v4->Pos.Z + v5->Pos.Z + v6->Pos.Z) / 6.,
+			(v1->lc + v2->lc + v3->lc + v4->lc + v5->lc + v6->lc) / 6.,
+			0.0);
+    Tree_Add (newpoints, &e1);
+    news = Create_Simplex (e1, v6, v1, v4);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v6, v1, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v5, v3, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v5, v3, v2);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v4, v2, v1);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v4, v2, v5);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+  }
+
+  else if (are_exists (v4, v3) &&
+	   are_exists (v6, v2) &&
+	   are_exists (v5, v1)){
+    Msg(INFOS, "Steiner Prism 2 found !");
+
+    e1 = Create_Vertex (++CurrentNodeNumber,
+			(v1->Pos.X + v2->Pos.X + v3->Pos.X + v4->Pos.X + v5->Pos.X + v6->Pos.X) / 6.,
+			(v1->Pos.Y + v2->Pos.Y + v3->Pos.Y + v4->Pos.Y + v5->Pos.Y + v6->Pos.Y) / 6.,
+			(v1->Pos.Z + v2->Pos.Z + v3->Pos.Z + v4->Pos.Z + v5->Pos.Z + v6->Pos.Z) / 6.,
+			(v1->lc + v2->lc + v3->lc + v4->lc + v5->lc + v6->lc) / 6.,
+			0.0);
+    Tree_Add (newpoints, &e1);
+    news = Create_Simplex (e1, v4, v3, v6);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v4, v3, v1);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v6, v2, v5);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v6, v2, v3);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v5, v1, v4);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    news = Create_Simplex (e1, v5, v1, v2);
+    news->iEnt = IENT;
+    Tree_Add (AddedTet, &news);
+    
+  }
+  else{
+    Msg (ERROR, "Uncoherent prism !");
+  }
+}
+
+
+void cut_tetraedre (Intersection * pI, Tree_T * AddedTet, Tree_T * TetDel,
+		    Tree_T * newpoints){
+  int i;
+  nxn nx;
+  Simplex *s;
+  Vertex *common, *other1, *other2, *lonely, *e1, *e2, *point1, *point2, *point3, *point4;
+  Vertex *v1, *v2, *v3, *v4, *v5, *v6, *v7, *v8;
+
+  if (!New_Edges)
+    New_Edges = Tree_Create (sizeof (nxn), compnxn);
+
+  IENT = pI->s->iEnt;
+
+  /* 1 tetraedre -> 2 tetraedres */
+
+  if ((pI->NbEdge == 0) && (pI->NbFace == 0)){
+  }
+  else if (pI->NbEdge == 1 && pI->NbFace == 0){
+
+    Tree_Add (TetDel, &pI->s);
+    
+    
+    EV++;
+    if (pI->E[0] == 0){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[2], pI->s->V[3], pI->s->V[0], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    if (pI->E[0] == 1){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[0], pI->s->V[3], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[3], pI->s->V[1], pI->s->V[0], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    if (pI->E[0] == 2){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[3], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    if (pI->E[0] == 3){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->s->V[2], pI->s->V[3], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    if (pI->E[0] == 4){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[2], pI->s->V[0], pI->s->V[1], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->s->V[3], pI->s->V[0], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    if (pI->E[0] == 5){
+      /* Verifie */
+      s = Create_Simplex (pI->s->V[0], pI->s->V[3], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[0], pI->s->V[1], pI->s->V[2], pI->VE[0]);
+      if (PARLE)
+	printf ("ajout %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+  }
+  else if (pI->NbVertex == 1 && pI->NbFace == 1){
+    FV++;
+    Tree_Add (TetDel, &pI->s);
+    s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[0], pI->F[0]->V[1]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[1], pI->F[0]->V[2]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    s = Create_Simplex (pI->V[0], pI->VF[0], pI->F[0]->V[2], pI->F[0]->V[0]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+  }
+
+  /* DU CUL LES COPINES
+     TROIS ARETES QUI PENETRENT LA MEME FACE
+     TRIPLETTE, TRIPLE PENETRATION */
+  
+  else if (pI->NbEdge == 3){
+    EEE++;
+    /*
+      printf("tet %d %d %d %d\n",pI->s->V[0]->Num,pI->s->V[1]->Num,pI->s->V[2]->Num,pI->s->V[3]->Num);
+      printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[0]][0]]->Num,
+      pI->s->V[edges_tetra[pI->E[0]][1]]->Num);
+      printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[1]][0]]->Num,
+      pI->s->V[edges_tetra[pI->E[1]][1]]->Num);
+      printf("ed %d %d\n",pI->s->V[edges_tetra[pI->E[2]][0]]->Num,
+      pI->s->V[edges_tetra[pI->E[2]][1]]->Num);
+    */
+    Tree_Add (TetDel, &pI->s);
+    v4 = pI->VE[0];
+    v5 = pI->VE[1];
+    v6 = pI->VE[2];
+    if (pI->E[0] == 0 && pI->E[1] == 1 && pI->E[2] == 5){
+      v1 = pI->s->V[0];
+      v2 = pI->s->V[2];
+      v3 = pI->s->V[3];
+      v7 = pI->s->V[1];
+    }
+    else if (pI->E[0] == 0 && pI->E[1] == 2 && pI->E[2] == 3){
+      v1 = pI->s->V[1];
+      v2 = pI->s->V[2];
+      v3 = pI->s->V[3];
+      v7 = pI->s->V[0];
+    }
+    else if (pI->E[0] == 1 && pI->E[1] == 2 && pI->E[2] == 4){
+      v1 = pI->s->V[1];
+      v2 = pI->s->V[0];
+      v3 = pI->s->V[3];
+      v7 = pI->s->V[2];
+    }
+    else if (pI->E[0] == 3 && pI->E[1] == 4 && pI->E[2] == 5){
+      v1 = pI->s->V[0];
+      v2 = pI->s->V[2];
+      v3 = pI->s->V[1];
+      v7 = pI->s->V[3];
+    }
+    else{
+      Msg (ERROR, "Tree Edges Cut Without Common Point");
+      return;
+    }
+    
+    s = Create_Simplex (v4, v5, v6, v7);
+    Tree_Add (AddedTet, &s);
+    cut_prism (v1, v2, v3, v4, v5, v6, newpoints, AddedTet);
+    
+  }
+
+  else if (pI->NbFace == 2){
+    FF++;
+    point3 = NULL;
+    Tree_Add (TetDel, &pI->s);
+    if (PARLE){
+      printf ("simp  = %d %d %d %d\n", pI->s->V[0]->Num, pI->s->V[1]->Num, pI->s->V[2]->Num, pI->s->V[3]->Num);
+      printf ("are   = %d %d\n", pI->VF[0]->Num, pI->VF[1]->Num);
+      printf ("face1 = %d %d %d\n", pI->F[0]->V[0]->Num, pI->F[0]->V[1]->Num, pI->F[0]->V[2]->Num);
+      printf ("face2 = %d %d %d\n", pI->F[1]->V[0]->Num, pI->F[1]->V[1]->Num, pI->F[1]->V[2]->Num);
+    }
+    for (i = 0; i < 4; i++){
+      if (compareVertex (&pI->F[0]->V[0], &pI->s->V[i]) &&
+	  compareVertex (&pI->F[0]->V[1], &pI->s->V[i]) &&
+	  compareVertex (&pI->F[0]->V[2], &pI->s->V[i]))
+	point1 = pI->s->V[i];
+      else if (compareVertex (&pI->F[1]->V[0], &pI->s->V[i]) &&
+	       compareVertex (&pI->F[1]->V[1], &pI->s->V[i]) &&
+	       compareVertex (&pI->F[1]->V[2], &pI->s->V[i]))
+	point2 = pI->s->V[i];
+      else if (point3)
+	point4 = pI->s->V[i];
+      else
+	point3 = pI->s->V[i];
+    }
+    s = Create_Simplex (point3, point4, pI->VF[0], pI->VF[1]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    if (PARLE)
+      printf ("simp  = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+    s = Create_Simplex (point1, point4, pI->VF[0], pI->VF[1]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    if (PARLE)
+      printf ("simp  = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+    s = Create_Simplex (point1, point3, pI->VF[0], pI->VF[1]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    if (PARLE)
+      printf ("simp  = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+    s = Create_Simplex (point2, point4, point1, pI->VF[0]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    if (PARLE)
+      printf ("simp  = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+    s = Create_Simplex (point2, point3, point1, pI->VF[0]);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    if (PARLE)
+      printf ("simp  = %d %d %d %d\n", s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+  }
+
+  else if (pI->NbEdge == 2){
+    EE++;
+    Tree_Add (TetDel, &pI->s);
+    if (pI->E[0] == 1 && pI->E[1] == 3){
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[1], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[2], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[2], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      return;
+    }
+    else if (pI->E[0] == 2 && pI->E[1] == 5){
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[1], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[2], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[2], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      return;
+    }
+    
+    else if (pI->E[0] == 0 && pI->E[1] == 4){
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[2], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[2], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[0], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (pI->s->V[1], pI->VE[1], pI->s->V[3], pI->VE[0]);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      return;
+    }
+    
+    e1 = pI->VE[0];
+    e2 = pI->VE[1];
+    
+    if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][0]], &pI->s->V[edges_tetra[pI->E[1]][0]])){
+      common = pI->s->V[edges_tetra[pI->E[0]][0]];
+      other1 = pI->s->V[edges_tetra[pI->E[0]][1]];
+      other2 = pI->s->V[edges_tetra[pI->E[1]][1]];
+    }
+    else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][0]], &pI->s->V[edges_tetra[pI->E[1]][1]])){
+      common = pI->s->V[edges_tetra[pI->E[0]][0]];
+      other1 = pI->s->V[edges_tetra[pI->E[0]][1]];
+      other2 = pI->s->V[edges_tetra[pI->E[1]][0]];
+    }
+    else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][1]], &pI->s->V[edges_tetra[pI->E[1]][0]])){
+      common = pI->s->V[edges_tetra[pI->E[0]][1]];
+      other1 = pI->s->V[edges_tetra[pI->E[0]][0]];
+      other2 = pI->s->V[edges_tetra[pI->E[1]][1]];
+    }
+    else if (!compareVertex (&pI->s->V[edges_tetra[pI->E[0]][1]], &pI->s->V[edges_tetra[pI->E[1]][1]])){
+      common = pI->s->V[edges_tetra[pI->E[0]][1]];
+      other1 = pI->s->V[edges_tetra[pI->E[0]][0]];
+      other2 = pI->s->V[edges_tetra[pI->E[1]][0]];
+    }
+    
+    for (i = 0; i < 4; i++){
+      if (compareVertex (&pI->s->V[i], &common) &&
+	  compareVertex (&pI->s->V[i], &other1) &&
+	  compareVertex (&pI->s->V[i], &other2))
+	lonely = pI->s->V[i];
+    }
+    
+    nx.i = IMAX (e1->Num, other2->Num);
+    nx.j = IMIN (e1->Num, other2->Num);
+    
+    if (Tree_Search (New_Edges, &nx)){
+      s = Create_Simplex (e1, other1, other2, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (e2, e1, common, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (e2, other2, e1, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+    else{
+      nx.i = IMAX (e2->Num, other1->Num);
+      nx.j = IMIN (e2->Num, other1->Num);
+      Tree_Add (New_Edges, &nx);
+      s = Create_Simplex (e1, other1, e2, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (e2, e1, common, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+      s = Create_Simplex (e2, other1, other2, lonely);
+      s->iEnt = IENT;
+      Tree_Add (AddedTet, &s);
+    }
+  }
+  else if (pI->NbFace == 1 && pI->NbEdge == 1){
+    FE++;
+    
+    Tree_Add (TetDel, &pI->s);
+    for (i = 0; i < 4; i++)
+      if (compareVertex (&pI->s->V[i], &pI->F[0]->V[0]) &&
+	  compareVertex (&pI->s->V[i], &pI->F[0]->V[1]) &&
+	  compareVertex (&pI->s->V[i], &pI->F[0]->V[2]))
+	v1 = pI->s->V[i];
+    v2 = NULL;
+    v3 = NULL;
+    
+    for (i = 0; i < 4; i++){
+      if (compareVertex (&pI->s->V[i], &v1)){
+	if (compareVertex (&pI->s->V[i], &pI->s->V[edges_tetra[pI->E[0]][0]]) &&
+	    compareVertex (&pI->s->V[i], &pI->s->V[edges_tetra[pI->E[0]][1]])){
+	  if (v2)
+	    v3 = pI->s->V[i];
+	  else
+	    v2 = pI->s->V[i];
+	}
+	else{
+	  v4 = pI->s->V[i];
+	}
+      }
+    }
+    
+    e1 = pI->VE[0];
+    e2 = pI->VF[0];
+    
+    s = Create_Simplex (e1, e2, v3, v4);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    s = Create_Simplex (e1, e2, v2, v4);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    s = Create_Simplex (e1, e2, v2, v3);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    s = Create_Simplex (e1, v1, v2, v3);
+    s->iEnt = IENT;
+    Tree_Add (AddedTet, &s);
+    
+  }
+  else if (pI->NbEdge == 4){
+    EEEE++;
+    
+    // Allez j-f il faut le faire !
+    
+    Tree_Add (TetDel, &pI->s);
+    if (pI->E[0] == 1 && pI->E[1] == 2 && pI->E[2] == 3 && pI->E[3] == 5){
+      v1 = pI->s->V[0];
+      v2 = pI->s->V[1];
+      v3 = pI->s->V[2];
+      v4 = pI->s->V[3];
+      v5 = pI->VE[1];
+      v6 = pI->VE[2];
+      v7 = pI->VE[0];
+      v8 = pI->VE[3];
+    }
+    else if (pI->E[0] == 0 && pI->E[1] == 2 && pI->E[2] == 4 && pI->E[3] == 5){
+      v1 = pI->s->V[1];
+      v2 = pI->s->V[2];
+      v3 = pI->s->V[0];
+      v4 = pI->s->V[3];
+      v5 = pI->VE[0];
+      v6 = pI->VE[3];
+      v7 = pI->VE[1];
+      v8 = pI->VE[2];
+    }
+    else if (pI->E[0] == 0 && pI->E[1] == 1 && pI->E[2] == 3 && pI->E[3] == 4){
+      v1 = pI->s->V[0];
+      v2 = pI->s->V[2];
+      v3 = pI->s->V[1];
+      v4 = pI->s->V[3];
+      v5 = pI->VE[0];
+      v6 = pI->VE[2];
+      v7 = pI->VE[1];
+      v8 = pI->VE[3];
+    }
+    else{
+      Msg(ERROR, "Incoherent intersection EEEE");
+      return;
+    }
+    cut_prism (v8, v4, v6, v7, v3, v5, newpoints, AddedTet);
+    cut_prism (v2, v8, v7, v1, v6, v5, newpoints, AddedTet);
+  }
+  else{
+    Msg(ERROR, "Error On Cut %d %d %d", pI->NbVertex, pI->NbEdge, pI->NbFace);
+  }
+}
+
+
+
+
+
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..db75cca95cf2517ef60193051ef3eadf67c7a427
--- /dev/null
+++ b/Mesh/3D_Extrude.cpp
@@ -0,0 +1,650 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Context.h"
+#include "Create.h"
+
+extern Mesh      *THEM;
+extern Context_T  CTX;
+extern int        CurrentNodeNumber;
+
+static Tree_T *Tree_Ares = NULL, *Tree_Swaps = NULL;
+
+Surface *THES;
+Volume *THEV;
+int TEST_IS_ALL_OK;
+
+static ExtrudeParams *ep;
+
+typedef struct{
+  int a, b;
+}nxn;
+
+static int compnxn (const void *a, const void *b){
+  nxn *q, *w;
+  q = (nxn *) a;
+  w = (nxn *) b;
+  if (q->a > w->a)
+    return 1;
+  if (q->a < w->a)
+    return -1;
+  if (q->b > w->b)
+    return 1;
+  if (q->b < w->b)
+    return -1;
+  return 0;
+}
+
+void InitExtrude (){
+  if (!Tree_Ares)
+    Tree_Ares = Tree_Create (sizeof (nxn), compnxn);
+  if (!Tree_Swaps)
+    Tree_Swaps = Tree_Create (sizeof (nxn), compnxn);
+}
+
+int are_exist (Vertex * v1, Vertex * v2, Tree_T * t){
+  nxn n;
+  n.a = IMAX (v1->Num, v2->Num);
+  n.b = IMIN (v1->Num, v2->Num);
+  return Tree_Search (t, &n);
+}
+
+void are_cree (Vertex * v1, Vertex * v2, Tree_T * t){
+  nxn n;
+  n.a = IMAX (v1->Num, v2->Num);
+  n.b = IMIN (v1->Num, v2->Num);
+  Tree_Replace (t, &n);
+}
+
+void are_del (Vertex * v1, Vertex * v2, Tree_T * t){
+  nxn n;
+  n.a = IMAX (v1->Num, v2->Num);
+  n.b = IMIN (v1->Num, v2->Num);
+  Tree_Suppress (t, &n);
+}
+
+
+void Extrude_Simplex_Phase1 (void *data, void *dum){
+  Simplex **pS, *s;
+  int i, j, k;
+  Vertex *v1, *v2, *v3, *v4, *v5, *v6;
+
+  pS = (Simplex **) data;
+  s = *pS;
+
+  k = 0;
+  for (i = 0; i < ep->mesh.NbLayer; i++){
+    for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){
+      List_Read (s->V[0]->Extruded_Points, k, &v1);
+      List_Read (s->V[1]->Extruded_Points, k, &v2);
+      List_Read (s->V[2]->Extruded_Points, k, &v3);
+      List_Read (s->V[0]->Extruded_Points, k + 1, &v4);
+      List_Read (s->V[1]->Extruded_Points, k + 1, &v5);
+      List_Read (s->V[2]->Extruded_Points, k + 1, &v6);
+      if (ep->mesh.Simplexes){
+	k++;
+	if (!are_exist (v1, v5, Tree_Ares))
+	  are_cree (v2, v4, Tree_Ares);
+	if (!are_exist (v5, v3, Tree_Ares))
+	  are_cree (v2, v6, Tree_Ares);
+	if (!are_exist (v4, v3, Tree_Ares))
+	  are_cree (v1, v6, Tree_Ares);
+      }
+      else if (!s->V[3]){
+      }
+      else{
+      }
+    }
+  }
+}
+
+void Extrude_Simplex_Phase3 (void *data, void *dum){
+
+  Simplex **pS, *s, *news;
+  Hexahedron *newh;
+  Prism *newp;
+  int i, j, k;
+  Vertex *v1, *v2, *v3, *v4, *v5, *v6, *v7, *v8;
+
+  pS = (Simplex **) data;
+  s = *pS;
+
+  if(s->V[3] && !CTX.mesh.reco_extrude){
+    Msg(ERROR, "Use '-recombine' to extrude with quadrangles");
+  }
+
+  k = 0;
+  for (i = 0; i < ep->mesh.NbLayer; i++){
+    for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){
+
+      if(s->V[3]){
+	List_Read(s->V[0]->Extruded_Points,k,&v1);
+	List_Read(s->V[1]->Extruded_Points,k,&v2);
+	List_Read(s->V[2]->Extruded_Points,k,&v3);
+	List_Read(s->V[3]->Extruded_Points,k,&v4);
+	List_Read(s->V[0]->Extruded_Points,k+1,&v5);
+	List_Read(s->V[1]->Extruded_Points,k+1,&v6);
+	List_Read(s->V[2]->Extruded_Points,k+1,&v7);
+	List_Read(s->V[3]->Extruded_Points,k+1,&v8);
+      }
+      else{
+	List_Read (s->V[0]->Extruded_Points, k, &v1);
+	List_Read (s->V[1]->Extruded_Points, k, &v2);
+	List_Read (s->V[2]->Extruded_Points, k, &v3);
+	List_Read (s->V[0]->Extruded_Points, k + 1, &v4);
+	List_Read (s->V[1]->Extruded_Points, k + 1, &v5);
+	List_Read (s->V[2]->Extruded_Points, k + 1, &v6);
+      }
+
+      k++;
+      if (ep->mesh.ZonLayer[i]){
+
+	if(CTX.mesh.reco_extrude){
+	  if(s->V[3]){
+	    newh = Create_Hexahedron(v1,v2,v3,v4,v5,v6,v7,v8);
+	    newh->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add(THEV->Hexahedra,&newh);
+	  }
+	  else{
+	    newp = Create_Prism(v1,v2,v3,v4,v5,v6);
+	    newp->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add(THEV->Prisms,&newp);
+	  }
+	}
+	else{
+	  
+	  if (are_exist (v4, v2, Tree_Ares) &&
+	      are_exist (v5, v3, Tree_Ares) &&
+	      are_exist (v4, v3, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v4);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v3);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v2, v4, v5, v3);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	  if (are_exist (v4, v2, Tree_Ares) &&
+	      are_exist (v2, v6, Tree_Ares) &&
+	      are_exist (v4, v3, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v4);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v2);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v2, v6, v3);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	  if (are_exist (v4, v2, Tree_Ares) &&
+	      are_exist (v2, v6, Tree_Ares) &&
+	      are_exist (v6, v1, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v6);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v2);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v2, v4, v6, v1);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	  if (are_exist (v5, v1, Tree_Ares) &&
+	      are_exist (v5, v3, Tree_Ares) &&
+	      are_exist (v4, v3, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v5);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v3);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v1, v4, v5, v3);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	  if (are_exist (v5, v1, Tree_Ares) &&
+	      are_exist (v5, v3, Tree_Ares) &&
+	      are_exist (v6, v1, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v5);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v1);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v1, v3, v5, v6);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	  if (are_exist (v5, v1, Tree_Ares) &&
+	      are_exist (v2, v6, Tree_Ares) &&
+	      are_exist (v6, v1, Tree_Ares)){
+	    news = Create_Simplex (v1, v2, v3, v6);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v4, v5, v6, v1);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	    news = Create_Simplex (v1, v2, v5, v6);
+	    news->iEnt = ep->mesh.ZonLayer[i];
+	    Tree_Add (THEV->Simplexes, &news);
+	  }
+	}
+      }
+    }
+  }
+}
+
+void Extrude_Simplex_Phase2 (void *data, void *dum){
+
+  Simplex **pS, *s;
+  int i, j, k;
+  Vertex *v1, *v2, *v3, *v4, *v5, *v6;
+
+  pS = (Simplex **) data;
+  s = *pS;
+
+  k = 0;
+  for (i = 0; i < ep->mesh.NbLayer; i++){
+    for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){
+      List_Read (s->V[0]->Extruded_Points, k, &v1);
+      List_Read (s->V[1]->Extruded_Points, k, &v2);
+      List_Read (s->V[2]->Extruded_Points, k, &v3);
+      List_Read (s->V[0]->Extruded_Points, k + 1, &v4);
+      List_Read (s->V[1]->Extruded_Points, k + 1, &v5);
+      List_Read (s->V[2]->Extruded_Points, k + 1, &v6);
+      k++;
+      if (are_exist (v4, v2, Tree_Ares) &&
+	  are_exist (v5, v3, Tree_Ares) &&
+	  are_exist (v1, v6, Tree_Ares)){
+	TEST_IS_ALL_OK++;
+	if (!are_exist (v4, v2, Tree_Swaps)){
+	  are_del (v4, v2, Tree_Ares);
+	  are_cree (v1, v5, Tree_Ares);
+	  are_cree (v1, v5, Tree_Swaps);
+	  are_cree (v4, v2, Tree_Swaps);
+	}
+	else if (!are_exist (v5, v3, Tree_Swaps)){
+	  are_del (v5, v3, Tree_Ares);
+	  are_cree (v2, v6, Tree_Ares);
+	  are_cree (v5, v3, Tree_Swaps);
+	  are_cree (v2, v6, Tree_Swaps);
+	}
+	else if (!are_exist (v1, v6, Tree_Swaps)){
+	  are_del (v1, v6, Tree_Ares);
+	  are_cree (v4, v3, Tree_Ares);
+	  are_cree (v1, v6, Tree_Swaps);
+	  are_cree (v4, v3, Tree_Swaps);
+	}
+      }
+      else if (are_exist (v1, v5, Tree_Ares) && 
+	       are_exist (v2, v6, Tree_Ares) && 
+	       are_exist (v4, v3, Tree_Ares)){
+	TEST_IS_ALL_OK++;
+	if (!are_exist (v1, v5, Tree_Swaps)){
+	  are_del (v1, v5, Tree_Ares);
+	  are_cree (v4, v2, Tree_Ares);
+	  are_cree (v1, v5, Tree_Swaps);
+	  are_cree (v4, v2, Tree_Swaps);
+	}
+	else if (!are_exist (v2, v6, Tree_Swaps)){
+	  are_del (v2, v6, Tree_Ares);
+	  are_cree (v5, v3, Tree_Ares);
+	  are_cree (v5, v3, Tree_Swaps);
+	  are_cree (v2, v6, Tree_Swaps);
+	}
+	else if (!are_exist (v4, v3, Tree_Swaps)){
+	  are_del (v4, v3, Tree_Ares);
+	  are_cree (v1, v6, Tree_Ares);
+	  are_cree (v1, v6, Tree_Swaps);
+	  are_cree (v4, v3, Tree_Swaps);
+	}
+      }
+    }
+  }
+}
+
+static Tree_T *Vertex_Bound, *ToAdd = NULL;
+
+void Extrude_Vertex (void *data, void *dum){
+
+  Vertex **pV, *v, *newv, *exv;
+  int i, j;
+
+  pV = (Vertex **) data;
+  v = *pV;
+  if (v->Extruded_Points)
+    List_Delete (v->Extruded_Points);
+  v->Extruded_Points = List_Create (ep->mesh.NbLayer, 1, sizeof (Vertex *));
+  List_Add (v->Extruded_Points, &v);
+  exv = v;
+
+  for (i = 0; i < ep->mesh.NbLayer; i++){
+    for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){
+      newv = Create_Vertex (++CurrentNodeNumber, v->Pos.X,
+			    v->Pos.Y, v->Pos.Z, v->lc, v->u);
+      ep->Extrude (i, j + 1, newv->Pos.X, newv->Pos.Y, newv->Pos.Z);
+      //newv->lc = DMIN(newv->lc,sqrt( ((*newv) - (*exv)) * ((*newv) - (*exv)) ));
+      exv = newv;
+      if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &newv))){
+	List_Add (v->Extruded_Points, pV);
+	if (ToAdd)
+	  Tree_Insert (ToAdd, pV);
+      }
+      else{
+	List_Add (v->Extruded_Points, &newv);
+	Tree_Insert (THEM->Vertices, &newv);
+	if (ToAdd)
+	  Tree_Insert (ToAdd, &newv);
+      }
+    }
+  }
+}
+
+void Extrude_Surface1 (Surface * s){
+  THES = s;
+  Tree_Action (s->Vertices, Extrude_Vertex);
+  if(!CTX.mesh.reco_extrude) Tree_Action (s->Simplexes, Extrude_Simplex_Phase1);
+}
+
+void Extrude_Surface2 (Surface * s){
+  THES = s;
+  Tree_Action (s->Simplexes, Extrude_Simplex_Phase2);
+}
+
+
+void Extrude_Surface3 (Surface * s){
+  THES = s;
+  Tree_Action (s->Simplexes, Extrude_Simplex_Phase3);
+}
+
+
+void Extrude_Seg (Vertex * V1, Vertex * V2){
+  int i, j, k;
+  Vertex *v1, *v2, *v3, *v4;
+  Simplex *s;
+
+  k = 0;
+  for (i = 0; i < ep->mesh.NbLayer; i++){
+    for (j = 0; j < ep->mesh.NbElmLayer[i]; j++){
+      List_Read (V1->Extruded_Points, k, &v1);
+      List_Read (V2->Extruded_Points, k, &v2);
+      List_Read (V1->Extruded_Points, k + 1, &v3);
+      List_Read (V2->Extruded_Points, k + 1, &v4);
+      if(CTX.mesh.reco_extrude){
+	s = Create_Quadrangle(v1,v2,v4,v3);
+	s->iEnt = THES->Num;
+	Tree_Add(THES->Simplexes,&s);
+      }
+      else{
+	if (are_exist (v3, v2, Tree_Ares)){
+	  s = Create_Simplex (v3, v2, v1, NULL);
+	  s->iEnt = THES->Num;
+	  Tree_Add (THES->Simplexes, &s);
+	  s = Create_Simplex (v3, v4, v2, NULL);
+	  s->iEnt = THES->Num;
+	  Tree_Add (THES->Simplexes, &s);
+	}
+	else{
+	  s = Create_Simplex (v3, v4, v1, NULL);
+	  s->iEnt = THES->Num;
+	  Tree_Add (THES->Simplexes, &s);
+	  s = Create_Simplex (v1, v4, v2, NULL);
+	  s->iEnt = THES->Num;
+	  Tree_Add (THES->Simplexes, &s);
+	}
+      }
+      k++;
+    }
+  }
+  
+}
+
+void Extrude_Curve (void *data, void *dum){
+  Curve **pC, *c;
+  Vertex *v1, *v2;
+  int i;
+  pC = (Curve **) data;
+  c = *pC;
+
+  //if (c->Num < 0) return;
+
+  for (i = 0; i < List_Nbr (c->Vertices) - 1; i++){
+    List_Read (c->Vertices, i, &v1);
+    List_Read (c->Vertices, i + 1, &v2);
+    Extrude_Seg (v1, v2);
+  }
+}
+
+int Extrude_Mesh (Curve * c){
+  int i;
+  Vertex **v, *pV, **vexist, *v1;
+
+  if (!c->Extrude)
+    return 0;
+  if (!c->Extrude->mesh.ExtrudeMesh)
+    return false;
+
+  Vertex_Bound = NULL;
+  ep = c->Extrude;
+
+  Tree_Ares = Tree_Swaps = NULL;
+
+  if (ep->geo.Mode == EXTRUDED_ENTITY){
+    Extrude_Vertex (&c->beg, NULL);
+    c->Vertices = List_Create (List_Nbr (c->beg->Extruded_Points),
+			       2, sizeof (Vertex *));
+    v = &c->beg;
+    if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){
+      (*vexist)->u = c->ubeg;
+      Tree_Insert (THEM->Vertices, vexist);
+      if ((*vexist)->ListCurves)
+	List_Add ((*vexist)->ListCurves, &c);
+      List_Add (c->Vertices, vexist);
+    }
+    else{
+      pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0);
+      pV->ListCurves = List_Create (1, 1, sizeof (Curve *));
+      List_Add (pV->ListCurves, &c);
+      Tree_Insert (THEM->Vertices, &pV);
+      List_Add (c->Vertices, &pV);
+    }
+
+    for (i = 1; i < List_Nbr (c->beg->Extruded_Points) - 1; i++){
+      List_Read (c->beg->Extruded_Points, i, &v1);
+      if (!v1->ListCurves)
+	v1->ListCurves = List_Create (1, 1, sizeof (Curve *));
+      List_Add (v1->ListCurves, &c);
+      Tree_Insert (THEM->Vertices, &v1);
+      v1->u = (double) i / (double) List_Nbr (c->beg->Extruded_Points);
+      List_Add (c->Vertices, &v1);
+    }
+    v = &c->end;
+    if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, v))){
+      (*vexist)->u = c->ubeg;
+      Tree_Insert (THEM->Vertices, vexist);
+      if ((*vexist)->ListCurves)
+	List_Add ((*vexist)->ListCurves, &c);
+      List_Add (c->Vertices, vexist);
+    }
+    else{
+      pV = Create_Vertex ((*v)->Num, (*v)->Pos.X, (*v)->Pos.Y, (*v)->Pos.Z, (*v)->lc, 0.0);
+      pV->ListCurves = List_Create (1, 1, sizeof (Curve *));
+      List_Add (pV->ListCurves, &c);
+      Tree_Insert (THEM->Vertices, &pV);
+      List_Add (c->Vertices, &pV);
+    }
+    return true;
+  }
+  else{
+    return false;
+  }
+}
+
+void copy_mesh (Surface * from, Surface * to){
+  List_T *list = Tree2List (from->Simplexes);
+  Simplex *s, *news;
+  Vertex **pV, *v1, *v2, *v3, *v;
+
+  for (int i = 0; i < List_Nbr (list); i++){
+    List_Read (list, i, &s);
+    v = s->V[0];
+    v1 = Create_Vertex (++CurrentNodeNumber, v->Pos.X,
+			v->Pos.Y, v->Pos.Z, v->lc, v->u);
+    ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1],
+		 v1->Pos.X, v1->Pos.Y, v1->Pos.Z);
+    
+    if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v1)))
+      v1 = *pV;
+    else{
+      Tree_Insert (THEM->Vertices, &v1);
+      Tree_Insert (Vertex_Bound, &v1);
+    }
+    if (ToAdd)
+      Tree_Insert (ToAdd, &v1);
+    
+    v = s->V[1];
+    v2 = Create_Vertex (++CurrentNodeNumber, v->Pos.X,
+			v->Pos.Y, v->Pos.Z, v->lc, v->u);
+    ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1],
+		 v2->Pos.X, v2->Pos.Y, v2->Pos.Z);
+    
+    if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v2)))
+      v2 = *pV;
+    else{
+      Tree_Insert (THEM->Vertices, &v2);
+      Tree_Insert (Vertex_Bound, &v2);
+    }
+    if (ToAdd)
+      Tree_Insert (ToAdd, &v2);
+    
+    v = s->V[2];
+    v3 = Create_Vertex (++CurrentNodeNumber, v->Pos.X,
+			v->Pos.Y, v->Pos.Z, v->lc, v->u);
+    ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1],
+		 v3->Pos.X, v3->Pos.Y, v3->Pos.Z);
+    
+    if (Vertex_Bound && (pV = (Vertex **) Tree_PQuery (Vertex_Bound, &v3)))
+      v3 = *pV;
+    else{
+      Tree_Insert (THEM->Vertices, &v3);
+      Tree_Insert (Vertex_Bound, &v3);
+    }
+    if (ToAdd)
+      Tree_Insert (ToAdd, &v3);
+    
+    news = Create_Simplex (v1, v2, v3, NULL);
+    news->iEnt = to->Num;
+    Tree_Add (to->Simplexes, &news);
+  }
+  List_Delete (list);
+}
+
+int Extrude_Mesh (Surface * s){
+  int i;
+  Vertex *v1;
+  Curve *cc;
+  extern int FACE_DIMENSION;
+
+  InitExtrude ();
+  if (!s->Extrude)
+    return 0;
+  if (!s->Extrude->mesh.ExtrudeMesh)
+    return false;
+  FACE_DIMENSION = 2;
+  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
+
+  ep = s->Extrude;
+  THES = s;
+
+  ToAdd = s->Vertices;
+
+  for (i = 0; i < List_Nbr (s->s.Generatrices); i++){
+    List_Read (s->s.Generatrices, i, &cc);
+    for (int j = 0; j < List_Nbr (cc->Vertices); j++){
+      List_Read (cc->Vertices, j, &v1);
+      Tree_Replace (Vertex_Bound, &v1);
+    }
+  }
+  if (ep->geo.Mode == EXTRUDED_ENTITY){
+    Curve *c = FindCurve (ep->geo.Source, THEM);
+    if (!c)
+      return 0;
+    for (i = 0; i < List_Nbr (c->Vertices); i++){
+      List_Read (c->Vertices, i, &v1);
+      Extrude_Vertex (&v1, NULL);
+    }
+    Extrude_Curve (&c, NULL);
+    return true;
+  }
+  else{
+    Surface *ss = FindSurface (ep->geo.Source, THEM);
+    if (!ss)
+      return 0;
+    copy_mesh (ss, s);
+    return true;
+  }
+  ToAdd = NULL;
+}
+
+int Extrude_Mesh (Volume * v){
+  int i, j;
+  Surface *ss;
+  Vertex *v1;
+
+  if (!v->Extrude)
+    return 0;
+  if (!v->Extrude->mesh.ExtrudeMesh)
+    return false;
+
+  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
+
+  ep = v->Extrude;
+  THEV = v;
+  if (ep->geo.Mode == EXTRUDED_ENTITY){
+    Surface *s = FindSurface (ep->geo.Source, THEM);
+    if (!s)
+      return 0;
+    List_T *list;
+    for (i = 0; i < List_Nbr (v->Surfaces); i++){
+      List_Read (v->Surfaces, i, &ss);
+      list = Tree2List (ss->Vertices);
+      for (int j = 0; j < List_Nbr (list); j++){
+	List_Read (list, j, &v1);
+	Tree_Add (Vertex_Bound, &v1);
+      }
+      List_Delete (list);
+    }
+    list = Tree2List (s->Vertices);
+    for (i = 0; i < List_Nbr (list); i++){
+      List_Read (list, i, &v1);
+      Extrude_Vertex (&v1, NULL);
+    }
+    List_Delete (list);
+    Extrude_Surface1 (s);
+    
+    if(!CTX.mesh.reco_extrude){
+      j = TEST_IS_ALL_OK;
+      do{
+	TEST_IS_ALL_OK = 0;
+	Extrude_Surface2 (s);
+	if (TEST_IS_ALL_OK == j)
+	  break;
+	j = TEST_IS_ALL_OK;
+      }
+      while (TEST_IS_ALL_OK);
+    }
+
+    Extrude_Surface3 (s);
+    //Tree_Ares = Tree_Swaps = NULL;
+    return true;
+  }
+  else{
+    return false;
+  }
+}
diff --git a/Mesh/3D_Mesh.cpp b/Mesh/3D_Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..15d8e5bccd3e535af2c9a47c7c80d7f23a72a5dd
--- /dev/null
+++ b/Mesh/3D_Mesh.cpp
@@ -0,0 +1,867 @@
+/*
+ 
+  J-F Remacle 1995
+
+  MAILLAGE DELAUNAY 3D 
+
+  tant que l'arbre des tetraedres de qualites inacceptables 
+  n'est pas vide {
+    prendre le plus mauvais tetraedre;
+    creer un nouveau point;
+    eliminer les tetraedres dont le cercle circonscrit contient le point;
+    reconstruire le volume convexe;
+  } 
+
+*/
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "3D_Mesh.h"
+#include "Create.h"
+#include "Numeric.h"
+#include "Context.h"
+
+extern Mesh *THEM, *LOCAL;
+extern Context_T CTX;
+extern int TYPBGMESH, SPEED_MAX;
+extern int CurrentNodeNumber;
+extern int Alerte_Point_Scabreux;
+extern int NbComplexVolumes, FACE_DIMENSION;
+extern double LC;
+
+static Tree_T *Tsd, *Sim_Sur_Le_Bord, *POINTS_TREE;
+static List_T *Simplexes_Destroyed, *Simplexes_New, *Suppress;
+static List_T *LLL, *POINTS;
+static Simplex *THES;
+static Vertex *THEV;
+
+static Tree_T *SimXFac;
+static double volume;
+static int ZONEELIMINEE, Methode = 0;
+
+Simplex MyNewBoundary;
+
+void DebugSimplexe (Simplex * s){
+  int i;
+
+  fprintf (stderr, "Simplexe %p = %d %d %d %d \n",
+	   s, s->V[0]->Num, s->V[1]->Num, s->V[2]->Num, s->V[3]->Num);
+
+  for (i = 0; i < 4; i++){
+    if (s->S[i] != &MyNewBoundary)
+      printf (" face : %d %d %d -> Simplexe %p\n",
+	      s->F[i].V[0]->Num, s->F[i].V[1]->Num, s->F[i].V[2]->Num, s->S[i]);
+    else
+      printf (" face : %d %d %d -> Simplexe Boundary\n",
+	      s->F[i].V[0]->Num, s->F[i].V[1]->Num, s->F[i].V[2]->Num);
+  }
+}
+
+void VSIM (void *a, void *b){
+  Simplex *S;
+
+  S = *(Simplex **) a;
+  if (S->V[3])
+    volume += fabs (S->Volume_Simplexe ());
+}
+
+void add_points (void *a, void *b){
+  Vertex **w;
+
+  w = (Vertex **) a;
+  Tree_Insert (POINTS_TREE, a);
+}
+
+void add_points_2 (void *a, void *b){
+  List_Add (POINTS, a);
+}
+
+
+double Interpole_lcTetraedre (Simplex * s, Vertex * v){
+  double mat[3][3], rhs[3], sol[3], det;
+
+  s->matsimpl (mat);
+  rhs[0] = v->Pos.X - s->V[0]->Pos.X;
+  rhs[1] = v->Pos.Y - s->V[0]->Pos.Y;
+  rhs[2] = v->Pos.Z - s->V[0]->Pos.Z;
+
+  sys3x3 (mat, rhs, sol, &det);
+  if (det == 0.0 ||
+      (1. - sol[0] - sol[1] - sol[2]) > 1. ||
+      (1. - sol[0] - sol[1] - sol[2]) < 0. ||
+      sol[0] > 1. ||
+      sol[1] > 1. ||
+      sol[2] > 1. ||
+      sol[0] < 0. ||
+      sol[1] < 0. ||
+      sol[2] < 0.){
+    return DMAX (s->V[0]->lc, DMAX (s->V[1]->lc, DMAX (s->V[2]->lc, s->V[3]->lc)));
+    //sol[0] = sol[1] = sol[2] = 0.25;
+  }
+
+  return (s->V[0]->lc * (1. - sol[0] - sol[1] - sol[2]) +
+	  sol[0] * s->V[1]->lc +
+	  sol[1] * s->V[2]->lc +
+	  sol[2] * s->V[3]->lc);
+}
+
+Vertex *NewVertex (Simplex * s){
+  Vertex *v;
+
+  v = Create_Vertex (++CurrentNodeNumber, s->Center.X, s->Center.Y, s->Center.Z, 1., 0.0);
+  v->lc = Interpole_lcTetraedre (s, v);
+
+  return (v);
+}
+
+int Pt_In_Volume (double X, double Y, double Z, Mesh * m,
+		  double *l, double tol){
+  int i;
+  Vertex V;
+  double uvw[3];
+  Simplex *s;
+  Brick B;
+
+  V.Pos.X = X;
+  V.Pos.Y = Y;
+  V.Pos.Z = Z;
+
+  if (!(m->BGM.Typ == ONFILE) && !m->BGM.bgm){
+    *l = -1.0;
+    return (1);
+  }
+
+  B = LaBrique (&m->Grid, X, Y, Z);
+
+  if (B.N < 0)
+    return (0);
+
+  for (i = 0; i < List_Nbr (B.pT); i++){
+    List_Read (B.pT, i, &s);
+    if (s->Pt_In_Simplexe (&V, uvw, tol)){
+      *l = (1. - uvw[0] - uvw[1] - uvw[2]) * s->V[0]->lc
+	+ uvw[0] * s->V[1]->lc
+	+ uvw[1] * s->V[2]->lc
+	+ uvw[2] * s->V[3]->lc;
+      return (1);
+    }
+  }
+
+  return (0);
+}
+
+int Pt_In_Circum (Simplex * s, Vertex * v){
+  double d1, d2, eps;
+
+  /* Determine si un point est dans le cercle circonscrit a un simplexe */
+
+  d1 = s->Radius;
+  d2 = sqrt (DSQR (v->Pos.X - s->Center.X) +
+	     DSQR (v->Pos.Y - s->Center.Y) +
+	     DSQR (v->Pos.Z - s->Center.Z));
+
+  eps = fabs (d1 - d2) / (d1 + d2);
+  
+  if (eps < 1.e-12){
+    return (0); /* c'etait 1! GEUZ ????*/
+  }
+      
+  if (d2 < d1)
+    return (1);
+
+  return (0);
+}
+
+void Action_First_Simplexes (void *a, void *b){
+  Simplex **q;
+
+  if (!THES){
+    q = (Simplex **) a;
+    if (Pt_In_Circum (*q, THEV)){
+      THES = *q;
+    }
+  }
+}
+
+void LiS (void *a, void *b){
+  int j, N;
+  SxF SXF, *pSXF;
+  Simplex **pS, *S;
+
+  pS = (Simplex **) a;
+  S = *pS;
+  N = (S->V[3]) ? 4 : 3;
+
+  for (j = 0; j < N; j++){
+    SXF.F = S->F[j];
+    if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))){
+      /* Creation du lien */
+      S->S[j] = pSXF->S;
+      pSXF->S->S[pSXF->NumFaceSimpl] = S;
+    }
+    else{
+      SXF.S = S;
+      SXF.NumFaceSimpl = j;
+      Tree_Add (SimXFac, &SXF);
+    }
+  }
+}
+
+void RzS (void *a, void *b){
+  int j, N;
+  Simplex **pS, *S;
+  pS = (Simplex **) a;
+  S = *pS;
+
+  N = (S->V[3]) ? 4 : 3;
+
+  for (j = 0; j < N; j++){
+    if ((S->S[j]) == NULL){
+      S->S[j] = &MyNewBoundary;
+    }
+  }
+}
+
+/* Cree les liens entre les simplexes, c.a.d recherche les voisins */
+
+void Link_Simplexes (List_T * Sim, Tree_T * Tim){
+  Simplex *S;
+  int i;
+
+  SimXFac = Tree_Create (sizeof (SxF), compareSxF);
+  if (Sim){
+    for (i = 0; i < List_Nbr (Sim); i++){
+      List_Read (Sim, i, &S);
+      LiS (&S, NULL);
+    }
+    for (i = 0; i < List_Nbr (Sim); i++){
+      List_Read (Sim, i, &S);
+      RzS (&S, NULL);
+    }
+  }
+  else{
+    Tree_Action (Tim, LiS);
+    Tree_Action (Tim, RzS);
+  }
+  Tree_Delete (SimXFac);
+}
+
+void Box_6_Tetraedron (List_T * P, Mesh * m){
+#define FACT 1.1
+#define LOIN 2.2
+
+  int i, j;
+  static int pts[8][3] = { {0, 0, 0},
+			   {1, 0, 0},
+			   {1, 1, 0},
+			   {0, 1, 0},
+			   {0, 0, 1},
+			   {1, 0, 1},
+			   {1, 1, 1},
+			   {0, 1, 1}};
+  static int tet[6][4] = { {1, 5, 2, 4},
+			   {2, 5, 6, 4},
+			   {4, 5, 6, 8},
+			   {6, 4, 8, 7},
+			   {6, 4, 7, 3},
+			   {2, 3, 4, 6}};
+  double Xm, Ym, Zm, XM, YM, ZM, Xc, Yc, Zc;
+  Simplex *S, *ps;
+  Vertex *V, *v, *pv;
+  List_T *smp;
+
+  smp = List_Create (8, 1, sizeof (Simplex *));
+
+  V = (Vertex *) Malloc (8 * sizeof (Vertex));
+
+  for (i = 0; i < List_Nbr (P); i++){
+    List_Read (P, i, &v);
+    if (!i){
+      Xm = XM = v->Pos.X;
+      Ym = YM = v->Pos.Y;
+      Zm = ZM = v->Pos.Z;
+    }
+    else{
+      Xm = DMIN (Xm, v->Pos.X);
+      XM = DMAX (XM, v->Pos.X);
+      Ym = DMIN (Ym, v->Pos.Y);
+      YM = DMAX (YM, v->Pos.Y);
+      Zm = DMIN (Zm, v->Pos.Z);
+      ZM = DMAX (ZM, v->Pos.Z);
+    }
+  }
+  if (Xm == XM)
+    XM = Xm + 1.;
+  if (Ym == YM)
+    YM = Ym + 1.;
+  if (Zm == ZM)
+    ZM = Zm + 1.;
+
+  Xc = XM - Xm;
+  Yc = YM - Ym;
+  Zc = ZM - Zm;
+
+  /* initialisation de la grille */
+
+  m->Grid.init = 0;
+  m->Grid.min.X = Xm - LOIN * FACT * Xc;
+  m->Grid.min.Y = Ym - LOIN * FACT * Yc;
+  m->Grid.min.Z = Zm - LOIN * FACT * Zc;
+  m->Grid.max.X = XM + LOIN * FACT * Xc;
+  m->Grid.max.Y = YM + LOIN * FACT * Yc;
+  m->Grid.max.Z = ZM + LOIN * FACT * Zc;
+
+  m->Grid.Nx = m->Grid.Ny = m->Grid.Nz = 20;
+
+  /* Longueur Caracteristique */
+
+  /* GEUZ SUPPRIME
+  LC = sqrt (Xc * Xc + Yc * Yc + Zc * Zc);
+  */
+
+  /* Points de la boite de 1 a 8 
+
+     Z    8____________7
+     |   /|           /|
+     |  / |          / |
+     | /  |         /  |
+     5|/___|________/6  |
+     |   4|________|___|3
+     |   /         |   /
+     |  / Y        |  /
+     | /           | /
+     |/____________|/___ X
+     1             2
+
+   */
+
+  for (i = 0; i < 8; i++){
+    if (pts[i][0])
+      V[i].Pos.X = Xm - LOIN * Xc;
+    else
+      V[i].Pos.X = XM + LOIN * Xc;
+    
+    if (pts[i][1])
+      V[i].Pos.Y = Ym - LOIN * Yc;
+    else
+      V[i].Pos.Y = YM + LOIN * Yc;
+    
+    if (pts[i][2])
+      V[i].Pos.Z = Zm - LOIN * Zc;
+    else
+      V[i].Pos.Z = ZM + LOIN * Zc;
+    
+    V[i].Num = -(++CurrentNodeNumber);
+    pv = &V[i];
+    pv->lc = 1.0;
+    pv->Mov = NULL;
+    Tree_Replace (m->Vertices, &pv);
+  }
+
+  /* 6 Tetraedres forment le maillage de la boite */
+
+  for (i = 0; i < 6; i++){
+    S = Create_Simplex (&V[tet[i][0] - 1], &V[tet[i][1] - 1], 
+			&V[tet[i][2] - 1], &V[tet[i][3] - 1]);
+    List_Add (smp, &S);
+  }
+  
+  Link_Simplexes (smp, NULL);
+  for (i = 0; i < List_Nbr (smp); i++){
+    List_Read (smp, i, &ps);
+    for (j = 0; j < 4; j++)
+      if (ps->S[j] == NULL)
+	ps->S[j] = &MyNewBoundary;
+    Tree_Replace (m->Simplexes, &ps);
+  }
+  
+}
+
+
+void Fill_Sim_Des (void *a, void *b){
+  Simplex **S;
+  S = (Simplex **) a;
+  if (Pt_In_Circum (*S, THEV))
+    List_Add (Simplexes_Destroyed, a);
+}
+
+void TStoLS (void *a, void *b){
+  List_Add (Simplexes_Destroyed, a);
+}
+
+void TAtoLA (void *a, void *b){
+  List_Add (Simplexes_New, a);
+}
+
+void CrSi (void *a, void *b){
+  SxF *S;
+  Simplex *s;
+  S = (SxF *) a;
+  if (S->NumFaceSimpl == 1){
+    s = Create_Simplex (THEV, S->F.V[0], S->F.V[1], S->F.V[2]);
+    s->iEnt = ZONEELIMINEE;
+    THEM->Metric->setSimplexQuality (s);
+    List_Add (Simplexes_New, &s);
+  }
+  else if (S->NumFaceSimpl != 2){
+    Msg(WARNING, "GROSSE PANIQUE ...\n");
+  }
+}
+
+
+void NewSimplexes (Mesh * m, List_T * Sim, List_T * news){
+  int i, j;
+  Tree_T *SimXFac;
+  Simplex *S;
+  SxF SXF, *pSXF;
+
+  SimXFac = Tree_Create (sizeof (SxF), compareSxF);
+
+  for (i = 0; i < List_Nbr (Sim); i++){
+    List_Read (Sim, i, &S);
+    if (!i)
+      ZONEELIMINEE = S->iEnt;
+    else {
+      if (S->iEnt != ZONEELIMINEE){
+	Msg(WARNING, "Bizzare, l'elimination est foireuse %d %d\n", 
+	    S->iEnt, ZONEELIMINEE);
+      }
+    }
+    for (j = 0; j < 4; j++){
+      SXF.F = S->F[j];
+      if ((pSXF = (SxF *) Tree_PQuery (SimXFac, &SXF))){
+	(pSXF->NumFaceSimpl)++;
+      }
+      else{
+	SXF.NumFaceSimpl = 1;
+	Tree_Add (SimXFac, &SXF);
+      }
+    }
+  }
+
+  /* Les faces non communes sont obligatoirement a la frontiere ... 
+     -> Nouveaux simplexes */
+
+  Tree_Action (SimXFac, CrSi);
+  Tree_Delete (SimXFac);
+}
+
+
+
+/* Methode recursive : Rempli Tsd les simplexes detruits 
+   Invariant : Le simplexe est a eliminer
+   Le simplexe n'est pas encore considere */
+
+int recur_bowyer (Simplex * s){
+  int i;
+
+  Tree_Insert (Tsd, &s);
+  for (i = 0; i < 4; i++){
+    if (s->S[i] && s->S[i] != &MyNewBoundary && !Tree_Query (Tsd, &s->S[i])){
+      if (Pt_In_Circum (s->S[i], THEV) && (s->iEnt == s->S[i]->iEnt)){
+	recur_bowyer (s->S[i]);
+      }
+      else{
+	if (s->iEnt != s->S[i]->iEnt){
+	  Alerte_Point_Scabreux = 1;
+	}
+	Tree_Insert (Sim_Sur_Le_Bord, &s->S[i]);
+      }
+    }
+  }
+  return 1;
+}
+
+bool Bowyer_Watson (Mesh * m, Vertex * v, Simplex * S, int force){
+  int i;
+  Simplex *s;
+  static int init = 1;
+  double volumeold, volumenew;
+
+  THEV = v;
+
+  double x = (S->V[0]->Pos.X + S->V[1]->Pos.X + S->V[2]->Pos.X + S->V[3]->Pos.X) / 4.;
+  double y = (S->V[0]->Pos.Y + S->V[1]->Pos.Y + S->V[2]->Pos.Y + S->V[3]->Pos.Y) / 4.;
+  double z = (S->V[0]->Pos.Z + S->V[1]->Pos.Z + S->V[2]->Pos.Z + S->V[3]->Pos.Z) / 4.;
+
+  if (force)
+    THEM->Metric->Identity ();
+  else
+    THEM->Metric->setMetric (x, y, z);
+
+  Tsd = Tree_Create (sizeof (Simplex *), compareSimplex);
+  Sim_Sur_Le_Bord = Tree_Create (sizeof (Simplex *), compareSimplex);
+  if (init){
+    Simplexes_New = List_Create (10, 10, sizeof (Simplex *));
+    Simplexes_Destroyed = List_Create (10, 10, sizeof (Simplex *));
+    init = 0;
+  }
+  List_Reset (Simplexes_Destroyed);
+  List_Reset (Simplexes_New);
+
+
+  if (Methode){
+    Tree_Action (m->Simplexes, Fill_Sim_Des);
+  }
+  else{
+    recur_bowyer (S);
+  }
+  
+  Tree_Action (Tsd, TStoLS);
+  NewSimplexes (m, Simplexes_Destroyed, Simplexes_New);
+
+  /* calcul des volumes des simplexes crees */
+
+  if (Alerte_Point_Scabreux || !SPEED_MAX){
+    volume = 0.0;
+    for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){
+      VSIM (List_Pointer (Simplexes_Destroyed, i), NULL);
+    }
+    volumeold = volume;
+    volume = 0.0;
+    for (i = 0; i < List_Nbr (Simplexes_New); i++){
+      VSIM (List_Pointer (Simplexes_New, i), NULL);
+    }
+    volumenew = volume;
+  }
+  else{
+    volumeold = 1.0;
+    volumenew = 1.0;
+  }
+
+  /* critere du volume */
+
+  if ((fabs (volumeold - volumenew) / (volumeold + volumenew)) > 1.e-8){
+    if (Tree_Suppress (m->Simplexes, &S)){
+      S->Quality = 0.0;
+      Tree_Add (m->Simplexes, &S);
+    }
+    if(force){
+      List_Reset (Simplexes_Destroyed);
+      List_Reset (Simplexes_New);
+      Tree_Delete (Sim_Sur_Le_Bord);
+      Tree_Delete (Tsd);
+      //printf(" %22.15E %22.15E\n",volumeold,volumenew);
+      return false;
+    }
+  }
+  else{
+    Tree_Add (m->Vertices, &THEV);
+    for (i = 0; i < List_Nbr (Simplexes_New); i++){
+      Tree_Add (m->Simplexes, List_Pointer (Simplexes_New, i));
+    }
+    
+    /* Suppression des simplexes elimines */
+    
+    for (i = 0; i < List_Nbr (Simplexes_Destroyed); i++){
+      List_Read (Simplexes_Destroyed, i, &s);
+      if (!Tree_Suppress (m->Simplexes, &s))
+	printf ("Error : Impossible to Delete Simplex\n");
+      Free (s);
+    }
+    
+    /* Creation des liens entre nouveaux simplexes */
+    
+    Tree_Action (Sim_Sur_Le_Bord, TAtoLA);
+    Link_Simplexes (Simplexes_New, m->Simplexes);
+  }
+
+  Tree_Delete (Sim_Sur_Le_Bord);
+  Tree_Delete (Tsd);
+  return true;
+}
+
+double rand_sign(){
+  return (rand() % 2 == 0)?-1.0:1.0;
+}
+
+void Convex_Hull_Mesh (List_T * Points, Mesh * m){
+  int i, j, N, n;
+  int Nbr_OK = 0, Nbr_NOTOK = 0;
+
+  N = List_Nbr (Points);
+  n = IMAX (N / 20, 1);
+
+  Msg(INFO, "Meshing 3D... (Initial)");
+
+  Box_6_Tetraedron (Points, m);
+  // List_Sort (Points, comparePosition);
+
+  for (i = 0; i < N; i++){
+    THES = NULL;
+    List_Read (Points, i, &THEV);
+
+    if (Simplexes_New)
+      for (j = 0; j < List_Nbr (Simplexes_New); j++){
+	Action_First_Simplexes (List_Pointer (Simplexes_New, j), NULL);
+      }
+    
+    if (!THES){
+      Tree_Action (m->Simplexes, Action_First_Simplexes);
+      Nbr_OK++;
+    }
+    else{
+      Nbr_NOTOK++;
+    }
+    if (i % n == n - 1){
+      volume = 0.0;
+      Tree_Action (m->Simplexes, VSIM);
+      Msg(INFO, "Nod=%d/%d Elm=%d", i+1,N,Tree_Nbr(m->Simplexes)); 
+      Msg(STATUS, "Vol=%g",volume); 
+    }
+    if (!THES){
+      Msg(WARNING, "Vertex %12.5E %12.5E %12.5E in no simplex",
+	      THEV->Pos.X,THEV->Pos.Y,THEV->Pos.Z); 
+      THEV->Pos.X += 10 * RAND_LONG;
+      THEV->Pos.Y += 10 * RAND_LONG;
+      THEV->Pos.Z += 10 * RAND_LONG;
+      Tree_Action (m->Simplexes, Action_First_Simplexes);
+    }
+    bool  ca_marche = Bowyer_Watson (m, THEV, THES, 1);
+    int count = 0;
+    while(!ca_marche){
+      count ++;
+      double dx = rand_sign() * 10.*RAND_LONG;
+      double dy = rand_sign() * 10.*RAND_LONG;
+      double dz = rand_sign() * 10.*RAND_LONG;
+      THEV->Pos.X += dx;
+      THEV->Pos.Y += dy;
+      THEV->Pos.Z += dz;
+      THES = NULL;
+      Tree_Action (m->Simplexes, Action_First_Simplexes);
+      ca_marche = Bowyer_Watson (m, THEV, THES, 1);
+      THEV->Pos.X -= dx;
+      THEV->Pos.Y -= dy;
+      THEV->Pos.Z -= dz;	  
+      if(count > 5){
+	N++;
+	List_Add(POINTS,&THEV);
+	Msg(WARNING,"UNABLE TO ADD THE POINT %d...  WILL DO IT LATER",THEV->Num);
+	break;
+      }
+    }
+  }
+}
+
+void suppress_vertex (void *data, void *dum){
+  Vertex **pv;
+
+  pv = (Vertex **) data;
+  if ((*pv)->Num < 0)
+    List_Add (Suppress, pv);
+}
+
+void suppress_simplex (void *data, void *dum){
+  Simplex **pv;
+
+  pv = (Simplex **) data;
+  if ((*pv)->iEnt == 0)
+    List_Add (Suppress, pv);
+
+  /*
+  else{
+    for(i=0;i<List_Nbr(TrsfVolNum);i++)
+      if((*pv)->iEnt == (*(int*)List_Pointer(TrsfVolNum,i))->Num)
+        List_Add(Suppress,pv);
+  }
+  */
+}
+
+void add_in_bgm (void *a, void *b){
+  Simplex **s, *S;
+
+  s = (Simplex **) a;
+  S = *s;
+  List_Add (LLL, S);
+}
+
+void Bgm_With_Points (Mesh * m, Mesh * bgm){
+  int i;
+  Simplex *s;
+
+  bgm->BGM.bgm = List_Create (Tree_Nbr (bgm->Simplexes), 10, sizeof (Simplex));
+  LLL = bgm->BGM.bgm;
+  Tree_Action (bgm->Simplexes, add_in_bgm);
+  for (i = 0; i < List_Nbr (LLL); i++){
+    s = (Simplex *) List_Pointer (LLL, i);
+    AddSimplexInGrid (bgm, s, BOITE);
+  }
+}
+
+void Create_BgMesh (int Type, double lc, Mesh * m){
+  m->BGM.Typ = Type;
+  switch (Type){
+  case CONSTANT:
+    m->BGM.lc = lc;
+    break;
+  case ONFILE:
+    break;
+  case WITHPOINTS:
+    m->BGM.bgm = NULL;
+    break;
+  }
+}
+
+void Maillage_Volume (void *data, void *dum){
+  Volume *v, **pv;
+  Mesh M;
+  Surface S, *s;
+  Simplex *simp;
+  Vertex *newv;
+  int n, N;
+  double uvw[3];
+  int i;
+
+  FACE_DIMENSION = 2;
+
+  Msg(INFO, "Nod=0 Elm=0"); 
+
+  pv = (Volume **) data;
+  v = *pv;
+
+  if (Extrude_Mesh (v)){
+  }
+
+  if (v->Method == TRANSFINI){
+    MeshTransfiniteVolume (v);
+  }
+  else if (v->Typ == 99999){
+    LOCAL = &M;
+    s = &S;
+    Create_BgMesh (TYPBGMESH, .2, LOCAL);
+    
+    POINTS_TREE = Tree_Create (sizeof (Vertex *), comparePosition);
+    POINTS = List_Create (100, 100, sizeof (Vertex *));
+    LOCAL->Simplexes = v->Simplexes;
+    LOCAL->Vertices = v->Vertices;
+    
+    for (i = 0; i < List_Nbr (v->Surfaces); i++){
+      List_Read (v->Surfaces, i, &s);
+      Tree_Action (s->Vertices, add_points);
+    }
+    Tree_Action (POINTS_TREE, add_points_2);
+    Tree_Delete (POINTS_TREE);
+    
+    N = List_Nbr (POINTS);
+    n = N / 30 + 1;
+    
+    /* Creation d'un maillage initial respectant la frontiere */
+    
+    if(!List_Nbr(POINTS))return;
+    
+    Convex_Hull_Mesh (POINTS, LOCAL);
+    
+    if (!Coherence (v, LOCAL))
+      return;
+    Link_Simplexes (NULL, LOCAL->Simplexes);
+    
+    /* Suppression des noeuds de num < 0 */
+    
+    Suppress = List_Create (10, 10, sizeof (Vertex *));
+    Tree_Action (v->Vertices, suppress_vertex);
+    for (i = 0; i < List_Nbr (Suppress); i++){
+      Tree_Suppress (v->Vertices, List_Pointer (Suppress, i));
+    }
+    List_Delete (Suppress);
+
+    /* Suppression des elements dont
+       - le num de vol == 0 (cad qui n'appartiennent a auncun volume defini)
+       - le num de vol == num de vol transfini
+    */
+
+    Suppress = List_Create (10, 10, sizeof (Simplex *));
+    Tree_Action (v->Simplexes, suppress_simplex);
+    for (i = 0; i < List_Nbr (Suppress); i++){
+      Tree_Suppress (v->Simplexes, List_Pointer (Suppress, i));
+    }
+    
+    List_Delete (Suppress);
+    
+    if (Tree_Nbr (LOCAL->Simplexes) == 0)
+      return;
+
+    /* Si il reste quelque chose a mailler en volume : */
+    
+    v->Simplexes = LOCAL->Simplexes;
+    
+    Bgm_With_Points (THEM, LOCAL);
+    POINTS_TREE = THEM->Simplexes;
+    
+    Msg(INFO, "Meshing 3D... (Final)");
+
+    Tree_Right (LOCAL->Simplexes, &simp);
+    i = 0;
+    Progress (102);
+    while (simp->Quality > CONV_VALUE){
+      newv = NewVertex (simp);
+
+      // while(!Pt_In_Volume(newv->Pos.X,newv->Pos.Y,newv->Pos.Z,LOCAL,&l,0.0)){
+      while (!simp->Pt_In_Simplexe (newv, uvw, 1.e-5) &&		 
+	     (simp->S[0] == &MyNewBoundary ||
+	      !simp->S[0]->Pt_In_Simplexe (newv, uvw, 1.e-5)) &&
+	     (simp->S[1] == &MyNewBoundary ||
+	      !simp->S[1]->Pt_In_Simplexe (newv, uvw, 1.e-5)) &&
+	     (simp->S[2] == &MyNewBoundary ||
+	      !simp->S[2]->Pt_In_Simplexe (newv, uvw, 1.e-5)) &&
+	     (simp->S[3] == &MyNewBoundary ||
+	      !simp->S[3]->Pt_In_Simplexe (newv, uvw, 1.e-5))) {
+	Tree_Suppress (LOCAL->Simplexes, &simp);
+	simp->Quality = 0.1;
+	Tree_Insert (LOCAL->Simplexes, &simp);
+	Tree_Right (LOCAL->Simplexes, &simp);
+	if (simp->Quality < CONV_VALUE)
+	  break;
+	newv = NewVertex (simp);
+      }
+      if (simp->Quality < CONV_VALUE)
+	break;
+      i++;
+      if (i % n == n - 1){
+	volume = 0.0;
+	Tree_Action (LOCAL->Simplexes, VSIM);
+	Msg(STATUS, "%d Nodes, %d Elements",
+	    Tree_Nbr (LOCAL->Vertices), Tree_Nbr (LOCAL->Simplexes));
+	Msg(SELECT, "Vol(%.6e) Conv(%g->%.1f)", volume, simp->Quality, CONV_VALUE);
+	double adv = 100. * (CONV_VALUE / simp->Quality);
+	Progress ((int) adv);
+      }
+      Bowyer_Watson (LOCAL, newv, simp, 0);
+      Tree_Right (LOCAL->Simplexes, &simp);
+    }
+    
+    POINTS_TREE = THEM->Vertices;
+    Tree_Action (v->Vertices, add_points);
+    POINTS_TREE = THEM->Simplexes;
+    Tree_Action (v->Simplexes, add_points);
+    
+    Progress(-1);
+
+    if (CTX.mesh.nb_smoothing){
+      /*
+      Msg(STATUS, "Swapping Edges (1st pass)");
+      SwapEdges3D (THEM, v, 0.5, true);
+      Msg(STATUS, "Swapping Edges (2nd pass)");
+      SwapEdges3D (THEM, v, 0.5, false);
+      Msg(STATUS, "Laplacian Smoothing");
+      tnxe = Tree_Create (sizeof (NXE), compareNXE);
+      create_NXE (v->Vertices, v->Simplexes, tnxe);
+      for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
+	Tree_Action (tnxe, ActionLiss);
+      Tree_Delete (tnxe);
+      Msg(STATUS, "Swapping Edges (last pass)");
+      SwapEdges3D (THEM, v, 0.5, true);
+      */
+    }
+
+    if (CTX.mesh.degree == 2)
+      Degre2 (THEM->Vertices, THEM->VertexEdges, v->Simplexes, NULL, NULL);
+  }
+
+  THEM->Statistics[6] += Tree_Nbr (v->Vertices);
+  THEM->Statistics[9] += Tree_Nbr (v->Simplexes);
+
+  Gamma_Maillage (v, &THEM->Statistics[17], &THEM->Statistics[18], &THEM->Statistics[19]);
+  Eta_Maillage (v, &THEM->Statistics[20], &THEM->Statistics[21], &THEM->Statistics[22]);
+  R_Maillage (v, &THEM->Statistics[23], &THEM->Statistics[24], &THEM->Statistics[25]);
+}
diff --git a/Mesh/3D_Mesh.h b/Mesh/3D_Mesh.h
new file mode 100644
index 0000000000000000000000000000000000000000..ac47acd0e8fde29eb8bedb57dafc9cb486dabd50
--- /dev/null
+++ b/Mesh/3D_Mesh.h
@@ -0,0 +1,21 @@
+#ifndef _3D_MESH_H_
+#define _3D_MESH_H_
+
+Brick LaBrique (Grid_T * pGrid, double X, double Y, double Z);
+void AddSimplexInGrid (Mesh * m, Simplex * s, int boule_boite);
+int Coherence (Volume * v, Mesh * m);
+void Gamma_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin);
+void Eta_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin);
+void R_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin);
+int Pt_In_Volume (double X, double Y, double Z, Mesh * m,
+		  double *l, double tol);
+void findminmax (void *a, void *b);
+void getminmax (double *xmin, double *ymin, double *zmin,
+		double *xmax, double *ymax, double *zmax);
+void cut_tetraedre (Intersection * pI, Tree_T * AddedTet, Tree_T * TetDel,
+		    Tree_T * newpoints);
+void Impression_Resultats (void);
+void Restore_Volume (Volume * v);
+void Remise_A_Zero (void);
+
+#endif
diff --git a/Mesh/3D_SMesh.cpp b/Mesh/3D_SMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dfe17ceb90aa2e753d1c57ab4436471496e718e5
--- /dev/null
+++ b/Mesh/3D_SMesh.cpp
@@ -0,0 +1,514 @@
+/*  
+  Maillage transfini volumique
+
+                     a0   s0 s1  f0  s0 s1 s5 s4              s6      
+   s7        s6      a1   s1 s2  f1  s1 s2 s6 s4              *       
+     *-------*       a2   s3 s2  f2  s3 s2 s6 s7             /|\      
+     |\s4    |\      a3   s0 s3  f3  s0 s3 s7 s4            / | \     
+     | *-------* s5  a4   s4 s5  f4  s0 s1 s2 s3      s7/s4/  |s2\    
+     | |   s2| |     a5   s5 s6  f5  s4 s5 s6 s7          *---*---* s5
+  s3 *-|-----* |     a6   s7 s6                           |  / \  |   
+      \|      \|     a7   s4 s7                           | /   \ |   
+       *-------*     a8   s0 s4                           |/     \|   
+ v w  s0       s1    a9   s1 s5                           *-------*     
+  \|                 a10  s2 s6                  v w    s3/s0     s1    
+   *--u              a11  s3 s7                   \|                 
+					           *--u              
+
+
+  Remarque : La definition d'un volume prismatique doit se faire dans l'ordre
+             donne sur le schema. (degenerescence obligatoirement en s0/s4)
+
+*/
+
+#include "Gmsh.h"
+#include "Mesh.h"
+#include "Interpolation.h"
+#include "Create.h"
+
+extern Mesh  *THEM;
+extern int    CurrentNodeNumber;
+
+int index2d (int flag, int M, int N, int m, int n){
+  switch(flag){    
+  case 0 : return(n + N*m);
+  case 1 : return(M*N - M*(n+1) + m);
+  case 2 : return(M*N - (n+N*m) - 1);
+  case 3 : return(M + n*M - m - 1);
+  case 4 : return(N + m*N - n - 1);
+  case 5 : return(M*N - (m+M*n) - 1);
+  case 6 : return(M*N - N*(m+1) + n);
+  case 7 : return(m + M*n);
+  default : return 0;
+  }
+}
+
+void index_uv (int flag, Vertex * ver, double *u, double *v){
+  switch (flag){
+  case 0: *u =      ver->us[0]; *v =      ver->us[1]; break;
+  case 1: *u =      ver->us[1]; *v = 1. - ver->us[0]; break;
+  case 2: *u = 1. - ver->us[0]; *v = 1. - ver->us[1]; break;
+  case 3: *u = 1. - ver->us[1]; *v =      ver->us[0]; break;
+  case 4: *u =      ver->us[0]; *v = 1. - ver->us[1]; break;
+  case 5: *u = 1. - ver->us[1]; *v = 1. - ver->us[0]; break;
+  case 6: *u = 1. - ver->us[0]; *v =      ver->us[1]; break;
+  case 7: *u =      ver->us[1]; *v =      ver->us[0]; break;
+  }
+}
+
+#define CREATE_HEX Create_Hexahedron(list[(i)   + N1*(j)   + N1*N2*(k)],   \
+				     list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+				     list[(i+1) + N1*(j+1) + N1*N2*(k)],   \
+				     list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+				     list[(i)   + N1*(j)   + N1*N2*(k+1)], \
+				     list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+				     list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \
+				     list[(i)   + N1*(j+1) + N1*N2*(k+1)])
+
+#define CREATE_PRISM_1 Create_Prism(list[(i)   + N1*(j)   + N1*N2*(k)],   \
+				    list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+				    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+				    list[(i)   + N1*(j)   + N1*N2*(k+1)], \
+				    list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+				    list[(i)   + N1*(j+1) + N1*N2*(k+1)])
+
+#define CREATE_PRISM_2 Create_Prism(list[(i+1) + N1*(j+1) + N1*N2*(k)],   \
+				    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+				    list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+				    list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \
+				    list[(i)   + N1*(j+1) + N1*N2*(k+1)], \
+				    list[(i+1) + N1*(j)   + N1*N2*(k+1)])
+
+#define CREATE_SIM_1 Create_Simplex(list[(i)   + N1*(j)   + N1*N2*(k)],   \
+                                    list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j)   + N1*N2*(k+1)])
+
+#define CREATE_SIM_2 Create_Simplex(list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j)   + N1*N2*(k+1)])
+
+#define CREATE_SIM_3 Create_Simplex(list[(i)   + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k+1)])
+
+#define CREATE_SIM_4 Create_Simplex(list[(i+1) + N1*(j)   + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+                                    list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j+1) + N1*N2*(k)])
+
+#define CREATE_SIM_5 Create_Simplex(list[(i)   + N1*(j+1) + N1*N2*(k)],   \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j+1) + N1*N2*(k)])
+
+#define CREATE_SIM_6 Create_Simplex(list[(i+1) + N1*(j)   + N1*N2*(k+1)], \
+                                    list[(i)   + N1*(j+1) + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j+1) + N1*N2*(k+1)], \
+                                    list[(i+1) + N1*(j+1) + N1*N2*(k)])
+
+int MeshTransfiniteVolume (Volume *vol) {
+  int        i,j,k,flag,nbs,nbp,nbg;
+  int        nbtet=0, nbpri=0, nbhex=0;
+  Surface   *G[6],*GG[6];
+  Vertex     V,**vexist,*pV,*CP[4],**list;
+  double     u,v,w,dum;
+  int        F_flag[6];
+  int        N1,N2,N3;
+  Vertex    *F[6],*C[12],*Stmp[8],*S[8];
+  Hexahedron *hexa;
+  Prism     *prism;
+  Simplex   *simp;
+  int        NbFacesFound=0 ;
+
+  static int tab1hex[] = {0,1,5,4, 1,2,6,5, 3,2,6,7, 0,3,7,4, 0,1,2,3, 4,5,6,7};
+  static int tab2[] = {0,1,2,3, 1,2,3,0, 2,3,0,1, 3,0,1,2, 
+		       3,2,1,0, 2,1,0,3, 1,0,3,2, 0,3,2,1};
+
+  if (vol->Method != TRANSFINI) return(0);
+  
+  nbs = List_Nbr(vol->Surfaces);
+  
+  if(nbs == 5) nbp = 6;
+  else if(nbs == 6) nbp = 8;
+  else return(0);
+
+  for(i=0;i<6;i++) G[i] = NULL ;
+  
+  for(i=0;i<nbp;i++){
+    V.Num = vol->ipar[i];
+    pV = &V;
+    if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) {
+      Msg(WARNING, "Unknown Control Point %d in Transfinite Volume %d\n",
+	  V.Num,vol->Num); 
+      return(0);
+    }
+    else{
+      Stmp[i]=*vexist;
+    }
+  }   
+  
+  if(nbp == 8){
+    for(i=0;i<8;i++) S[i]=Stmp[i];
+  }
+  else if(nbp == 6){
+    S[0] = S[3] = Stmp[0];
+    S[1] = Stmp[1];
+    S[2] = Stmp[2];
+    S[4] = S[7] = Stmp[3];
+    S[5] = Stmp[4];
+    S[6] = Stmp[5];
+  }
+
+  /*
+  for(i=0;i<8;i++) printf("S[%d]=%d \n", i, S[i]->Num);
+  */
+
+  for(i=0;i<nbs;i++) List_Read(vol->Surfaces,i,&GG[i]);
+  
+  for(i=0;i<nbs;i++){
+    nbg = List_Nbr(GG[i]->s.Generatrices);
+
+    for(j=0;j<nbg;j++){
+      V.Num = GG[i]->ipar[j];
+      pV = &V;
+      if((vexist = (Vertex**)Tree_PQuery(THEM->Vertices,&pV)) == NULL) {
+	Msg(WARNING, "Unknown Control Point %d in Transfinite Surface %d\n",
+	    V.Num,GG[i]->Num); 
+	return(0);
+      }
+      else{
+	CP[j]=*vexist;
+      }
+    }       
+
+    if(nbg == 3) CP[3] = CP[0];
+
+    for(flag=0;flag<8;flag++){
+      for(k=0;k<6;k++){
+	if(S[tab1hex[4*k  ]]->Num == CP[tab2[4*flag  ]]->Num && 
+	   S[tab1hex[4*k+1]]->Num == CP[tab2[4*flag+1]]->Num &&
+	   S[tab1hex[4*k+2]]->Num == CP[tab2[4*flag+2]]->Num &&
+	   S[tab1hex[4*k+3]]->Num == CP[tab2[4*flag+3]]->Num ){
+	  G[k]=GG[i];
+	  F_flag[k]=flag;
+	  NbFacesFound++;
+	  /*
+	  printf("TR3D: (k=%d) face trouvee %d (flag = %d) : nodes %d %d %d %d \n", 
+		 k,GG[i]->Num, flag, 
+		 S[tab1hex[4*k  ]]->Num, 
+		 S[tab1hex[4*k+1]]->Num,
+		 S[tab1hex[4*k+2]]->Num,
+		 S[tab1hex[4*k+3]]->Num);
+	  */
+	}
+      }
+    }
+  }
+
+  if(nbs == 6 && NbFacesFound != 6) {
+    Msg(WARNING, "Wrong definition of Hexahedric Transfinite Volume(%d)\n", 
+	vol->Num); 
+    return(0);
+  }
+
+  if(nbs == 5 && NbFacesFound != 5) {
+    Msg(WARNING, "Wrong definition of Prismatic Transfinite Volume(%d). "
+	    "Possibly because first and fourth points are not the degenerated ones\n", 
+	    vol->Num); 
+    return(0);
+  }
+
+  if(nbs == 6){
+    for(i=0;i<6;i++){
+      if(G[i] == NULL) {
+	Msg(WARNING, "Wrong definition of Hexahedric Transfinite Volume(%d)\n",
+	    vol->Num); 
+	return(0);
+      }
+    }
+  }
+  else if(nbs == 5){
+    for(i=0;i<6;i++){
+      if(i != 3) {
+	if(G[i] == NULL) {
+	  Msg(WARNING, "Wrong definition of Prismatic Transfinite Volume(%d). "
+	      "Possibly because first and fourth points are not the degenerated ones\n", 
+	      vol->Num); 
+	  return(0);
+	}
+      }
+    }
+  }
+  
+
+  N1 = (F_flag[4] % 2 == 0) ? G[4]->Nu : G[4]->Nv ;
+  N2 = (F_flag[4] % 2 == 0) ? G[4]->Nv : G[4]->Nu ;
+  N3 = (F_flag[0] % 2 == 0) ? G[0]->Nv : G[0]->Nu ;
+
+  /*
+  printf("N1(%d) N2(%d) N3(%d)\n", N1,N2,N3);
+  */
+
+  list = (Vertex**)Malloc(N1*N2*N3*sizeof(Vertex*));
+ 
+  for(i=0;i<N1;i++){
+
+    for(j=0;j<N2;j++){
+
+      List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i,    0   ), &C[0]);
+      List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, N1-1, j   ), &C[1]);
+      List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i,    N2-1), &C[2]);
+      List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, 0,    j   ), &C[3]);
+      List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i,    0   ), &C[4]);
+      List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, N1-1, j   ), &C[5]);
+      List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i,    N2-1), &C[6]);
+      List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, 0,    j   ), &C[7]);
+      
+      List_Read(G[4]->TrsfVertices, index2d(F_flag[4],N1,N2, i, j), &F[4]);
+      List_Read(G[5]->TrsfVertices, index2d(F_flag[5],N1,N2, i, j), &F[5]);
+
+      index_uv(F_flag[4],F[4],&u,&v);
+
+      for(k=0;k<N3;k++){
+
+	List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, 0,    k), &C[8]);
+	List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, N1-1, k), &C[9]);
+	List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, N1-1, k), &C[10]);
+	List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, 0,    k), &C[11]);
+
+	List_Read(G[0]->TrsfVertices, index2d(F_flag[0],N1,N3, i, k), &F[0]);
+	List_Read(G[1]->TrsfVertices, index2d(F_flag[1],N2,N3, j, k), &F[1]);
+	List_Read(G[2]->TrsfVertices, index2d(F_flag[2],N1,N3, i, k), &F[2]);
+	if(nbs==6)
+	  List_Read(G[3]->TrsfVertices, index2d(F_flag[3],N2,N3, j, k), &F[3]);
+	else if(nbs == 5)
+	  F[3]=C[8];
+
+	index_uv(F_flag[0],F[0],&dum,&w);
+	
+	if(i && j && k && i != N1-1 && j != N2-1 && k != N3-1){	
+	  V = TransfiniteHex(*F[0],*F[1],*F[2],*F[3],*F[4],*F[5],
+			     *C[0],*C[1],*C[2],*C[3],*C[4],*C[5],
+			     *C[6],*C[7],*C[8],*C[9],*C[10],*C[11],
+			     *S[0],*S[1],*S[2],*S[3],*S[4],*S[5],*S[6],*S[7],
+			     u,v,w);
+	  list[i+N1*j+N1*N2*k] = Create_Vertex(++CurrentNodeNumber,
+					       V.Pos.X,V.Pos.Y,V.Pos.Z,V.lc,0.0);
+	  /*
+	    printf(" NEW node : %f %f %f\n", list[i+N1*j+N1*N2*k]->Pos.X, 
+		   list[i+N1*j+N1*N2*k]->Pos.Y, list[i+N1*j+N1*N2*k]->Pos.Z);
+	  */
+	}
+
+	else if(!i){
+	  list[i+N1*j+N1*N2*k] = F[3];
+	}
+	else if(!j){
+	  list[i+N1*j+N1*N2*k] = F[0];
+	}
+	else if(!k){
+	  list[i+N1*j+N1*N2*k] = F[4];
+	}
+	else if(i == N1-1){
+	  list[i+N1*j+N1*N2*k] = F[1];
+	}
+	else if(j == N2-1){
+	  list[i+N1*j+N1*N2*k] = F[2];
+	}
+	else if(k == N3-1){
+	  list[i+N1*j+N1*N2*k] = F[5];
+	}
+	
+      }
+    }
+  }
+  
+  for(i=0;i<N1;i++){
+    for(j=0;j<N2;j++){
+      for(k=0;k<N3;k++){
+	Tree_Replace(THEM->Vertices,&list[i+N1*j+N1*N2*k]);
+	Tree_Replace(vol->Vertices,&list[i+N1*j+N1*N2*k]);
+      }
+    }
+  }      
+
+  if(nbs == 6){      
+    for(i=0;i<N1-1;i++){
+      for(j=0;j<N2-1;j++){
+	for(k=0;k<N3-1;k++){
+	  if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && 
+	     G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) {
+	    hexa = CREATE_HEX; hexa->iEnt = vol->Num; Tree_Replace(vol->Hexahedra,&hexa);
+
+	    nbhex++;
+	  }
+	  else if (!G[0]->Recombine && G[1]->Recombine && !G[2]->Recombine && 
+		   G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) {
+	    prism = Create_Prism(list[(i)   + N1*(j)   + N1*N2*(k)],
+				 list[(i+1) + N1*(j)   + N1*N2*(k)],
+				 list[(i)   + N1*(j)   + N1*N2*(k+1)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k)],
+				 list[(i+1) + N1*(j+1) + N1*N2*(k)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k+1)]);
+	    prism->iEnt = vol->Num;
+	    Tree_Replace(vol->Prisms,&prism);
+
+	    prism = Create_Prism(list[(i+1) + N1*(j)   + N1*N2*(k+1)],
+				 list[(i)   + N1*(j)   + N1*N2*(k+1)],
+				 list[(i+1) + N1*(j)   + N1*N2*(k)],
+				 list[(i+1) + N1*(j+1) + N1*N2*(k+1)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k+1)],
+				 list[(i+1) + N1*(j+1) + N1*N2*(k)]);
+	    prism->iEnt = vol->Num;
+	    Tree_Replace(vol->Prisms,&prism);
+
+	    nbpri +=2 ;
+	  }
+	  else if (G[0]->Recombine && !G[1]->Recombine && G[2]->Recombine && 
+		   !G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) {
+	    prism = Create_Prism(list[(i+1) + N1*(j)   + N1*N2*(k)],
+				 list[(i+1) + N1*(j+1) + N1*N2*(k)],
+				 list[(i+1) + N1*(j)   + N1*N2*(k+1)],
+				 list[(i)   + N1*(j)   + N1*N2*(k)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k)],
+				 list[(i)   + N1*(j)   + N1*N2*(k+1)]);
+	    prism->iEnt = vol->Num;
+	    Tree_Replace(vol->Prisms,&prism);
+
+	    prism = Create_Prism(list[(i+1) + N1*(j+1) + N1*N2*(k+1)],
+				 list[(i+1) + N1*(j)   + N1*N2*(k+1)],
+				 list[(i+1) + N1*(j+1) + N1*N2*(k)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k+1)],
+				 list[(i)   + N1*(j)   + N1*N2*(k+1)],
+				 list[(i)   + N1*(j+1) + N1*N2*(k)]);
+	    prism->iEnt = vol->Num;
+	    Tree_Replace(vol->Prisms,&prism);
+
+	    nbpri += 2 ;
+	  }
+	  else if (G[0]->Recombine && G[1]->Recombine && G[2]->Recombine && 
+		   G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) {
+	    prism = CREATE_PRISM_1; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism);
+	    prism = CREATE_PRISM_2; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism);
+
+	    nbpri += 2;
+	  }
+	  else if (!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine && 
+		   !G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) {
+	    simp = CREATE_SIM_1; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_2; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_3; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_4; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_5; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_6; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+
+	    nbtet += 6;
+	  }
+	  else{
+	    Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", 
+		vol->Num); 
+	    return(0);
+	  }
+	}
+      }
+    }                  
+  }
+  else if (nbs == 5){
+    for(j=0;j<N2-1;j++){
+      for(k=0;k<N3-1;k++){	
+	if( ( G[0]->Recombine && G[1]->Recombine && G[2]->Recombine &&
+	      G[4]->Recombine && G[5]->Recombine) ||
+	    ( G[0]->Recombine && G[1]->Recombine && G[2]->Recombine &&
+	      !G[4]->Recombine && !G[5]->Recombine) ){	  
+	  prism = Create_Prism(list[    N1*(j)   + N1*N2*(k)],
+			       list[1 + N1*(j)   + N1*N2*(k)],
+			       list[1 + N1*(j+1) + N1*N2*(k)],
+			       list[    N1*(j)   + N1*N2*(k+1)],
+			       list[1 + N1*(j)   + N1*N2*(k+1)],
+			       list[1 + N1*(j+1) + N1*N2*(k+1)]);
+	  prism->iEnt = vol->Num;
+	  Tree_Replace(vol->Prisms,&prism);
+	  
+	  nbpri++;
+	}
+	else if(!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine &&
+		!G[4]->Recombine && !G[5]->Recombine){
+	  simp = Create_Simplex(list[  + N1*(j)   + N1*N2*(k)],
+				list[1 + N1*(j)   + N1*N2*(k)],
+				list[1 + N1*(j+1) + N1*N2*(k)],
+				list[  + N1*(j)   + N1*N2*(k+1)]);
+	  simp->iEnt = vol->Num;
+	  Tree_Replace(vol->Simplexes,&simp);
+	  
+	  simp = Create_Simplex(list[1 + N1*(j)   + N1*N2*(k)],
+				list[1 + N1*(j+1) + N1*N2*(k)],
+				list[  + N1*(j)   + N1*N2*(k+1)],
+				list[1 + N1*(j)   + N1*N2*(k+1)]);
+	  simp->iEnt = vol->Num;
+	  Tree_Replace(vol->Simplexes,&simp);
+	  
+	  simp = Create_Simplex(list[  + N1*(j)   + N1*N2*(k+1)],
+				list[1 + N1*(j+1) + N1*N2*(k+1)],
+				list[1 + N1*(j)   + N1*N2*(k+1)],
+				list[1 + N1*(j+1) + N1*N2*(k)]);
+	  simp->iEnt = vol->Num;
+	  Tree_Replace(vol->Simplexes,&simp);
+	  
+	  nbtet += 2;
+	}
+	else{
+	  Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", 
+	      vol->Num); 
+	  return(0);	  	  
+	}
+      }
+    }
+    for(i=1;i<N1-1;i++){
+      for(j=0;j<N2-1;j++){
+	for(k=0;k<N3-1;k++){
+	  if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine &&
+	     G[4]->Recombine && G[5]->Recombine){
+	    hexa = CREATE_HEX; hexa->iEnt = vol->Num; Tree_Replace(vol->Hexahedra,&hexa);
+
+	    nbhex ++;
+	  }
+	  else if(G[0]->Recombine && G[1]->Recombine && G[2]->Recombine &&
+		  !G[4]->Recombine && !G[5]->Recombine){
+	    prism = CREATE_PRISM_1; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism);
+	    prism = CREATE_PRISM_2; prism->iEnt = vol->Num; Tree_Replace(vol->Prisms,&prism);
+
+	    nbpri += 2;
+	  }
+	  else if(!G[0]->Recombine && !G[1]->Recombine && !G[2]->Recombine &&
+		  !G[4]->Recombine && !G[5]->Recombine){
+	    simp = CREATE_SIM_1; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_2; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_3; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_4; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_5; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+	    simp = CREATE_SIM_6; simp->iEnt = vol->Num; Tree_Replace(vol->Simplexes,&simp);
+
+	    nbtet += 6;
+	  }
+	  else{
+	    Msg(WARNING, "Wrong Surface Recombining in Transfinite Volume(%d)\n", 
+		    vol->Num); 
+	    return(0);
+	  }
+	}
+      }
+    }
+  }
+
+  THEM->Statistics[6] += Tree_Nbr(vol->Vertices);
+  THEM->Statistics[9] += nbtet;
+  THEM->Statistics[10] += nbhex;
+  THEM->Statistics[11] += nbpri;
+
+  return(1);
+
+}
+
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..13173d35ee8a9ad78c04c810d926489c3f30f6b8
--- /dev/null
+++ b/Mesh/Create.cpp
@@ -0,0 +1,585 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Numeric.h"
+
+extern Mesh *THEM;
+extern int Alerte_Point_Scabreux;
+extern int CurrentSimplexNumber;
+
+//static double CIRC_GRAN = 2.2;
+
+int compareNXE (const void *a, const void *b){
+  NXE *q, *w;
+
+  q = (NXE *) a;
+  w = (NXE *) b;
+  return (compareVertex (&q->v, &w->v));
+}
+
+int compareFxE (const void *a, const void *b){
+  FxE *q, *w;
+
+  q = (FxE *) a;
+  w = (FxE *) b;
+  return (compareFace (&q->Sorted, &w->Sorted));
+}
+
+int compareHexahedron (const void *a, const void *b){
+  Hexahedron **q, **w;
+
+  q = (Hexahedron **) a;
+  w = (Hexahedron **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareSurfaceLoop (const void *a, const void *b){
+  SurfaceLoop **q, **w;
+
+  q = (SurfaceLoop **) a;
+  w = (SurfaceLoop **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareEdgeLoop (const void *a, const void *b){
+  EdgeLoop **q, **w;
+
+  q = (EdgeLoop **) a;
+  w = (EdgeLoop **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int comparePrism (const void *a, const void *b){
+  Prism **q, **w;
+
+  q = (Prism **) a;
+  w = (Prism **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareQuality (const void *a, const void *b){
+  double d;
+  Simplex **q, **w;
+
+  q = (Simplex **) a;
+  w = (Simplex **) b;
+  d = (*q)->Quality - (*w)->Quality;
+
+  if (d > 0)
+    return (1);
+  if (d < 0)
+    return (-1);
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareCurve (const void *a, const void *b){
+  Curve **q, **w;
+
+  q = (Curve **) a;
+  w = (Curve **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareAttractor (const void *a, const void *b){
+  Attractor **q, **w;
+
+  q = (Attractor **) a;
+  w = (Attractor **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareSurface (const void *a, const void *b){
+  Surface **q, **w;
+
+  q = (Surface **) a;
+  w = (Surface **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareVolume (const void *a, const void *b){
+  Volume **q, **w;
+
+  q = (Volume **) a;
+  w = (Volume **) b;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int compareSxF (const void *a, const void *b){
+  SxF *q, *w;
+
+  q = (SxF *) a;
+  w = (SxF *) b;
+  return compareFace (&q->F, &w->F);
+}
+
+Attractor * Create_Attractor (int Num, double lc1, double lc2, double Radius,
+			      Vertex * v, Curve * c, Surface * s){
+  Attractor *pA;
+
+  pA = (Attractor *) Malloc (sizeof (Attractor));
+  pA->v = v;
+  pA->c = c;
+  pA->s = s;
+  pA->lc1 = lc1;
+  pA->lc2 = lc2;
+  pA->Radius = Radius;
+  return pA;
+}
+
+void Add_SurfaceLoop (int Num, List_T * intlist, Mesh * M){
+  SurfaceLoop *pSL;
+  int i, j;
+  pSL = (SurfaceLoop *) Malloc (sizeof (SurfaceLoop));
+  pSL->Surfaces = List_Create (List_Nbr (intlist), 1, sizeof (int));
+  pSL->Num = Num;
+  for (i = 0; i < List_Nbr (intlist); i++){
+    List_Read (intlist, i, &j);
+    List_Add (pSL->Surfaces, &j);
+  }
+  Tree_Add (M->SurfaceLoops, &pSL);
+}
+
+void Add_PhysicalGroup (int Num, int typ, List_T * intlist, Mesh * M){
+  PhysicalGroup *pSL;
+  int i, j;
+  pSL = (PhysicalGroup *) Malloc (sizeof (PhysicalGroup));
+  pSL->Entities = List_Create (List_Nbr (intlist), 1, sizeof (int));
+  pSL->Num = Num;
+  pSL->Typ = typ;
+  for (i = 0; i < List_Nbr (intlist); i++){
+    List_Read (intlist, i, &j);
+    List_Add (pSL->Entities, &j);
+  }
+  List_Add (M->PhysicalGroups, &pSL);
+}
+
+void Add_EdgeLoop (int Num, List_T * intlist, Mesh * M){
+  EdgeLoop *pEL;
+  int i, j;
+  pEL = (EdgeLoop *) Malloc (sizeof (EdgeLoop));
+  pEL->Curves = List_Create (List_Nbr (intlist), 1, sizeof (int));
+  pEL->Num = Num;
+  for (i = 0; i < List_Nbr (intlist); i++){
+    List_Read (intlist, i, &j);
+    List_Add (pEL->Curves, &j);
+  }
+  Tree_Add (M->EdgeLoops, &pEL);
+}
+
+void End_Curve (Curve * c){
+  double det, R2, mat[3][3], R, A3, A1, A4;
+  Vertex *v[5], v1, v3, v4;
+  double dd[3], qq[3], AX, f1, f2, DP, dir32[3], dir12[3], n[3], m[3], dir42[3];
+  double rhs[2], sys[2][2], sol[2];
+  int i;
+  Curve *Curve;
+
+  if (c->Typ == MSH_SEGM_CIRC ||
+      c->Typ == MSH_SEGM_CIRC_INV ||
+      c->Typ == MSH_SEGM_ELLI ||
+      c->Typ == MSH_SEGM_ELLI_INV){
+
+    Curve = c;
+
+    if (List_Nbr (Curve->Control_Points) == 4)
+      List_Read (Curve->Control_Points, 2, &v[4]);
+    else
+      v[4] = NULL;
+    
+    if (Curve->Typ == MSH_SEGM_CIRC_INV ||
+	Curve->Typ == MSH_SEGM_ELLI_INV){
+      List_Read (Curve->Control_Points, 0, &v[3]);
+      List_Read (Curve->Control_Points, 1, &v[2]);
+      if (!v[4])
+	List_Read (Curve->Control_Points, 2, &v[1]);
+      else
+	List_Read (Curve->Control_Points, 3, &v[1]);
+    }
+    else{
+      List_Read (Curve->Control_Points, 0, &v[1]);
+      List_Read (Curve->Control_Points, 1, &v[2]);
+      if (!v[4])
+	List_Read (Curve->Control_Points, 2, &v[3]);
+      else
+	List_Read (Curve->Control_Points, 3, &v[3]);
+    }
+    
+    direction (v[2], v[3], dir32);
+    direction (v[2], v[1], dir12);
+    if (v[4])
+      direction (v[2], v[4], dir42);
+
+    /*
+      norme(dir32);
+      norme(dir12);
+      norme(dir42);
+    */
+
+    //prodve(dir12,dir32,n);
+    dd[0] = dir12[0];
+    dd[1] = dir12[1];
+    dd[2] = dir12[2];
+    qq[0] = dir32[0];
+    qq[1] = dir32[1];
+    qq[2] = dir32[2];
+    norme (dd);
+    norme (qq);
+    prodve (dd, qq, n);
+    if (fabs (n[0]) < 1.e-5 && fabs (n[1]) < 1.e-5 && fabs (n[2]) < 1.e-5){
+      n[0] = Curve->Circle.n[0];
+      n[1] = Curve->Circle.n[1];
+      n[2] = Curve->Circle.n[2];
+    }
+
+    /* BOF BOF BOF */
+    prodve (n, dir12, m);
+
+    v1.Pos.X = dir12[0];
+    v1.Pos.Y = dir12[1];
+    v1.Pos.Z = dir12[2];
+    v3.Pos.X = dir32[0];
+    v3.Pos.Y = dir32[1];
+    v3.Pos.Z = dir32[2];
+    if (v[4]){
+      v4.Pos.X = dir42[0];
+      v4.Pos.Y = dir42[1];
+      v4.Pos.Z = dir42[2];
+    }
+    norme (dir12);
+    norme (n);
+    norme (m);
+    
+    mat[2][0] = Curve->Circle.invmat[0][2] = n[0];
+    mat[2][1] = Curve->Circle.invmat[1][2] = n[1];
+    mat[2][2] = Curve->Circle.invmat[2][2] = n[2];
+    mat[1][0] = Curve->Circle.invmat[0][1] = m[0];
+    mat[1][1] = Curve->Circle.invmat[1][1] = m[1];
+    mat[1][2] = Curve->Circle.invmat[2][1] = m[2];
+    mat[0][0] = Curve->Circle.invmat[0][0] = dir12[0];
+    mat[0][1] = Curve->Circle.invmat[1][0] = dir12[1];
+    mat[0][2] = Curve->Circle.invmat[2][0] = dir12[2];
+    
+    /*
+      if(n[0] == 0.0 && n[1] == 0.0){
+      mat[2][0] = Curve->Circle.invmat[0][2] = 0;
+      mat[2][1] = Curve->Circle.invmat[1][2] = 0;
+      mat[2][2] = Curve->Circle.invmat[2][2] = 1;
+      mat[1][0] = Curve->Circle.invmat[0][1] = 0;
+      mat[1][1] = Curve->Circle.invmat[1][1] = 1;
+      mat[1][2] = Curve->Circle.invmat[2][1] = 0;
+      mat[0][0] = Curve->Circle.invmat[0][0] = 1;
+      mat[0][1] = Curve->Circle.invmat[1][0] = 0;
+      mat[0][2] = Curve->Circle.invmat[2][0] = 0;
+      }
+    */
+
+    Projette (&v1, mat);
+    Projette (&v3, mat);
+    if (v[4])
+      Projette (&v4, mat);
+
+    R = sqrt (v1.Pos.X * v1.Pos.X + v1.Pos.Y * v1.Pos.Y);
+    R2 = sqrt (v3.Pos.X * v3.Pos.X + v3.Pos.Y * v3.Pos.Y);
+    A3 = myatan2 (v3.Pos.Y, v3.Pos.X);
+    if (v[4])
+      A4 = myatan2 (v4.Pos.Y, v4.Pos.X);
+    else
+      A4 = 0.0;
+    A1 = myatan2 (v1.Pos.Y, v1.Pos.X);
+    
+    DP = 2 * Pi;
+    
+    A3 = angle_02pi (A3);
+    A1 = angle_02pi (A1);
+    if (v[4])
+      A4 = angle_02pi (A4);
+    if (A1 >= A3)
+      A3 += DP;
+    if (A4 > A1)
+      A4 -= DP;
+    
+    if (v[4]){
+      AX = (A1 - A4);
+      sys[0][0] = cos (AX) * cos (A4);
+      sys[0][1] = -sin (AX) * sin (A4);
+      sys[1][0] = cos (AX) * sin (A4);
+      sys[1][1] = sin (AX) * cos (A4);
+      rhs[0] = v1.Pos.X;
+      rhs[1] = v1.Pos.Y;
+      det = sys[0][0] * sys[1][1] - sys[1][0] * sys[0][1];
+      if (det < 1.e-12){
+	AX = (A3 - A4);
+	sys[0][0] = cos (AX) * cos (A4);
+	sys[0][1] = -sin (AX) * sin (A4);
+	sys[1][0] = cos (AX) * sin (A4);
+	sys[1][1] = sin (AX) * cos (A4);
+	rhs[0] = v3.Pos.X;
+	rhs[1] = v3.Pos.Y;
+	det = sys[0][0] * sys[1][1] - sys[1][0] * sys[0][1];
+      }
+      if (det < 1.e-12){
+	f1 = DMAX (R, R2);
+	f2 = DMIN (R, R2);
+      }
+      else{
+	sys2x2 (sys, rhs, sol);
+	f1 = sol[0];
+	f2 = sol[1];
+      }
+    }
+    else{
+      f1 = f2 = R;
+    }
+
+    Curve->Circle.t1 = A1;
+    Curve->Circle.t2 = A3;
+    Curve->Circle.f1 = f1;
+    Curve->Circle.f2 = f2;
+    Curve->Circle.incl = A4;
+    
+    for (i = 0; i < 4; i++)
+      Curve->Circle.v[i] = v[i];
+    
+    if (!c->Circle.done){
+      float proj[4][4];
+      for (i = 0; i < 4; i++){
+	for (int j = 0; j < 4; j++){
+	  if (i != 3 && j != 3)
+	    proj[i][j] = Curve->Circle.f1 * Curve->Circle.invmat[i][j];
+	  else
+	    proj[i][j] = 0.0;
+	}
+      }
+      proj[0][3] = Curve->Circle.v[2]->Pos.X;
+      proj[1][3] = Curve->Circle.v[2]->Pos.Y;
+      proj[2][3] = Curve->Circle.v[2]->Pos.Z;
+      proj[3][3] = 1.0;
+      c->Circle.done = 1;
+    }
+    // Un cercle a au moins 16 pts par pi radiants
+    
+    // c->beg->lc = DMIN (R*Pi/(fabs(c->Circle.t1-c->Circle.t2)*CIRC_GRAN),c->beg->lc);
+    // c->end->lc = DMIN (R*Pi/(fabs(c->Circle.t1-c->Circle.t2)*CIRC_GRAN),c->end->lc);
+    
+  }
+  c->cp = (float *) malloc (4 * List_Nbr (c->Control_Points) * sizeof (float));
+  for (i = 0; i < List_Nbr (c->Control_Points); i++){
+    List_Read (c->Control_Points, i, &v[0]);
+    c->cp[4 * i] = v[0]->Pos.X;
+    c->cp[4 * i + 1] = v[0]->Pos.Y;
+    c->cp[4 * i + 2] = v[0]->Pos.Z;
+    c->cp[4 * i + 3] = v[0]->w;
+  }
+
+}
+
+void End_Surface (Surface * s){
+  int i;
+  Vertex *v;
+
+  if (!s->Control_Points || !List_Nbr(s->Control_Points))
+    return;
+
+  s->cp = (float *) Malloc (4 * List_Nbr (s->Control_Points) * sizeof (float));
+  for (i = 0; i < List_Nbr (s->Control_Points); i++){
+    List_Read (s->Control_Points, i, &v);
+    s->cp[4 * i] = v->Pos.X;
+    s->cp[4 * i + 1] = v->Pos.Y;
+    s->cp[4 * i + 2] = v->Pos.Z;
+    s->cp[4 * i + 3] = v->w;
+  }
+
+}
+
+
+
+Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste,
+		     List_T * Knots, int p1, int p2, double u1, double u2){
+  Curve *pC;
+  Vertex *v;
+  int i, j, iPnt;
+  double d;
+  double matcr[4][4] = { {-0.5, 1.5, -1.5, 0.5},
+			 {1.0, -2.5, 2.0, -0.5},
+			 {-0.5, 0.0, 0.5, 0.0},
+			 {0.0, 1.0, 0.0, 0.0} };
+  double matbs[4][4] = { {-1.0, 3, -3, 1},
+			 {3, -6, 3.0, 0},
+			 {-3, 0.0, 3, 0.0},
+			 {1, 4, 1, 0.0} };
+  double matbez[4][4] = { {-1.0, 3, -3, 1},
+			  {3, -6, 3.0, 0},
+			  {-3, 3.0, 0, 0.0},
+			  {1, 0, 0, 0.0} };
+
+  pC = (Curve *) Malloc (sizeof (Curve));
+  pC->Vertices = NULL;
+  pC->Typ = Typ;
+  pC->Num = Num;
+  pC->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
+  pC->TrsfSimplexes = List_Create (1, 10, sizeof (Simplex *));
+  pC->ConnectedSurfaces = NULL;
+  pC->Circle.done = 0;
+  pC->Method = LIBRE;
+  pC->degre = Order;
+  pC->Circle.n[0] = 1.0;
+  pC->Circle.n[1] = 0.0;
+  pC->Circle.n[2] = 0.0;
+  if (Typ == MSH_SEGM_SPLN){
+    for (i = 0; i < 4; i++)
+      for (j = 0; j < 4; j++)
+	pC->mat[i][j] = matcr[i][j];
+    
+  }
+  else if (Typ == MSH_SEGM_BSPLN){
+    for (i = 0; i < 4; i++)
+      for (j = 0; j < 4; j++)
+	pC->mat[i][j] = matbs[i][j] / 6.0;
+  }
+  else if (Typ == MSH_SEGM_BEZIER){
+    for (i = 0; i < 4; i++)
+      for (j = 0; j < 4; j++)
+	pC->mat[i][j] = matbez[i][j];
+  }
+
+  pC->ubeg = u1;
+  pC->uend = u2;
+
+  if (Knots){
+    pC->k = (float *) malloc (List_Nbr (Knots) * sizeof (float));
+    double kmin = .0, kmax = 1.;
+    List_Read (Knots, 0, &kmin);
+    List_Read (Knots, List_Nbr (Knots) - 1, &kmax);
+    pC->ubeg = kmin;
+    pC->uend = kmax;
+    for (i = 0; i < List_Nbr (Knots); i++){
+      List_Read (Knots, i, &d);
+      pC->k[i] = (float) d;
+    }
+  }
+  else
+    pC->k = NULL;
+
+  if (Liste){
+    pC->Control_Points = List_Create (List_Nbr (Liste), 1, sizeof (Vertex *));
+    for (j = 0; j < List_Nbr (Liste); j++){
+      List_Read (Liste, j, &iPnt);
+      if ((v = FindVertex (iPnt, THEM)))
+	List_Add (pC->Control_Points, &v);
+      else
+	Msg(ERROR, "Curve %d control point %d unknown", pC->Num, iPnt);
+    }
+  }
+  else {
+    //End_Curve(pC);
+    return pC;
+  }
+
+  if (p1 < 0){
+    List_Read (pC->Control_Points, 0, &pC->beg);
+    List_Read (pC->Control_Points, List_Nbr (pC->Control_Points) - 1, &pC->end);
+  }
+  else {
+    if ((v = FindVertex (p1, THEM))){
+      pC->beg = v;
+      Msg(INFO, "Curve %d beg control point %d ", pC->Num, v->Num);
+    }
+    else{
+      List_Read (pC->Control_Points, 0, &pC->beg);
+      Msg(ERROR, "Curve %d control point %d unknown", pC->Num, p1);
+    }
+    if ((v = FindVertex (p2, THEM))){
+      pC->end = v;
+      Msg(INFO, "Curve %d end control point %d ", pC->Num, v->Num);
+    }
+    else{
+      List_Read (pC->Control_Points, List_Nbr (pC->Control_Points) - 1, &pC->end);
+      Msg(ERROR, "Curve %d control point %d unknown", pC->Num, p2);
+    }
+  }
+  End_Curve (pC);
+  pC->Extrude = NULL;
+  return (pC);
+}
+
+Surface * Create_Surface (int Num, int Typ, int Mat){
+  Surface *pS;
+
+  pS = (Surface *) Malloc (sizeof (Surface));
+  pS->Num = Num;
+  pS->Typ = Typ;
+  pS->Mat = Mat;
+  pS->Method = LIBRE;
+  pS->Recombine = 0;
+  pS->RecombineAngle = 30;
+  pS->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality);
+  pS->TrsfSimplexes = List_Create (1, 10, sizeof (Simplex *));
+  pS->Vertices = Tree_Create (sizeof (Vertex *), compareVertex);
+  pS->TrsfVertices = List_Create (1, 10, sizeof (Vertex *));
+  pS->Contours = List_Create (1, 1, sizeof (List_T *));
+  pS->Orientations = NULL;
+  pS->Support = pS;
+  pS->Control_Points = List_Create (1, 10, sizeof (Vertex *));
+  pS->Extrude = NULL;
+  pS->STL = NULL;
+  return (pS);
+}
+
+Volume * Create_Volume (int Num, int Typ, int Mat){
+  Volume *pV;
+
+  pV = (Volume *) Malloc (sizeof (Volume));
+  pV->Num = Num;
+  pV->Typ = Typ;
+  pV->Mat = Mat;
+  pV->Method = LIBRE;
+  pV->Surfaces = List_Create (1, 2, sizeof (Surface *));
+  pV->Simplexes = Tree_Create (sizeof (Simplex *), compareQuality);
+  pV->Vertices = Tree_Create (sizeof (Vertex *), compareVertex);
+  pV->Hexahedra = Tree_Create (sizeof (Hexahedron *), compareHexahedron);
+  pV->Prisms = Tree_Create (sizeof (Prism *), comparePrism);
+  pV->Extrude = NULL;
+  return pV;
+}
+
+
+Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4,
+				Vertex * v5, Vertex * v6, Vertex * v7, Vertex * v8){
+  Hexahedron *h;
+
+  h = (Hexahedron *) Malloc (sizeof (Hexahedron));
+  h->iEnt = -1;
+  h->Num = ++CurrentSimplexNumber;
+  h->V[0] = v1;
+  h->V[1] = v2;
+  h->V[2] = v3;
+  h->V[3] = v4;
+  h->V[4] = v5;
+  h->V[5] = v6;
+  h->V[6] = v7;
+  h->V[7] = v8;
+  h->VSUP = NULL;
+
+  return (h);
+}
+
+Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3,
+		      Vertex * v4, Vertex * v5, Vertex * v6){
+  Prism *p;
+
+  p = (Prism *) Malloc (sizeof (Prism));
+  p->iEnt = -1;
+  p->Num = ++CurrentSimplexNumber;
+  p->V[0] = v1;
+  p->V[1] = v2;
+  p->V[2] = v3;
+  p->V[3] = v4;
+  p->V[4] = v5;
+  p->V[5] = v6;
+  p->VSUP = NULL;
+
+  return (p);
+}
diff --git a/Mesh/Create.h b/Mesh/Create.h
new file mode 100644
index 0000000000000000000000000000000000000000..83f718ecc37581bbf1e27a2f9a4b33b92f79c32c
--- /dev/null
+++ b/Mesh/Create.h
@@ -0,0 +1,35 @@
+#ifndef _CREATE_H_
+#define _CREATE_H_
+
+int compareNXE (const void *a, const void *b);
+int compareFxE (const void *a, const void *b);
+int compareHexahedron (const void *a, const void *b);
+int compareSurfaceLoop (const void *a, const void *b);
+int compareEdgeLoop (const void *a, const void *b);
+int comparePrism (const void *a, const void *b);
+int compareQuality (const void *a, const void *b);
+int compareCurve (const void *a, const void *b);
+int compareAttractor (const void *a, const void *b);
+int compareSurface (const void *a, const void *b);
+int compareVolume (const void *a, const void *b);
+int compareSxF (const void *a, const void *b);
+
+Attractor * Create_Attractor (int Num, double lc1, double lc2, double Radius,
+			      Vertex * v, Curve * c, Surface * s);
+void Add_SurfaceLoop (int Num, List_T * intlist, Mesh * M);
+void Add_PhysicalGroup (int Num, int typ, List_T * intlist, Mesh * M);
+void Add_EdgeLoop (int Num, List_T * intlist, Mesh * M);
+
+void End_Curve (Curve * c);
+void End_Surface (Surface * s);
+
+Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste,
+		     List_T * Knots, int p1, int p2, double u1, double u2);
+Surface * Create_Surface (int Num, int Typ, int Mat);
+Volume * Create_Volume (int Num, int Typ, int Mat);
+Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4,
+			      Vertex * v5, Vertex * v6, Vertex * v7, Vertex * v8);
+Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3,
+		      Vertex * v4, Vertex * v5, Vertex * v6);
+
+#endif
diff --git a/Mesh/CrossData.cpp b/Mesh/CrossData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a2e2ac88bfe26121b6a06e66b2d1c15186e38f5a
--- /dev/null
+++ b/Mesh/CrossData.cpp
@@ -0,0 +1,34 @@
+
+
+#include "Gmsh.h"
+#include "Mesh.h"
+
+Tree_T *TreeTemp;
+
+void AddTable (void *data, void *dummy){
+  Simplex *s;
+  NXE nxe, *pnxe;
+  int i;
+
+  s = *(Simplex **) data;
+
+  for (i = 0; i < 4; i++){
+    if (s->V[i]){
+      nxe.v = s->V[i];
+      if ((pnxe = (NXE *) Tree_PQuery (TreeTemp, &nxe))){
+	List_Add (pnxe->Liste, &s);
+      }
+      else{
+	nxe.Liste = List_Create (1, 1, sizeof (Simplex *));
+	List_Add (nxe.Liste, &s);
+	Tree_Add (TreeTemp, &nxe);
+      }
+    }
+  }
+}
+
+void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg,
+		 Tree_T * TreeAllNXE){
+  TreeTemp = TreeAllNXE;
+  Tree_Action (TreeAllElg, AddTable);
+}
diff --git a/Mesh/Edge.cpp b/Mesh/Edge.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e3516b920019e292ec5be3b3e32e2c8428f9ac0d
--- /dev/null
+++ b/Mesh/Edge.cpp
@@ -0,0 +1,186 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+#include "Const.h"
+#include "Edge.h"
+#include "Tools.h"
+
+static int edges_quad[4][2] = { {0, 1},
+				{1, 2},
+				{2, 3},
+				{3, 0} };
+static int edges_tetra[6][2] = { {0, 1},
+				 {1, 2},
+				 {2, 0},
+				 {3, 0},
+				 {3, 2},
+				 {3, 1} };
+static int edges_non[3] = {2, 0, 1};
+
+int compareedge (const void *a, const void *b){
+  int i1, i2, j1, j2;
+  Edge *q, *w;
+
+  q = (Edge *) a;
+  w = (Edge *) b;
+  i1 = IMAX (q->V[0]->Num, q->V[1]->Num);
+  i2 = IMAX (w->V[0]->Num, w->V[1]->Num);
+  j1 = IMIN (q->V[0]->Num, q->V[1]->Num);
+  j2 = IMIN (w->V[0]->Num, w->V[1]->Num);
+
+  if (i1 < i2)
+    return (1);
+  if (i1 > i2)
+    return (-1);
+  if (j1 < j2)
+    return (1);
+  if (j1 > j2)
+    return (-1);
+  return 0;
+}
+
+int compareedge_angle (const void *a, const void *b){
+  Edge *q, *w;
+
+  q = (Edge *) a;
+  w = (Edge *) b;
+  if (q->a >= w->a)
+    return (1);
+  return (-1);
+}
+
+void EdgesContainer::AddEdges (Simplex * s, bool EdgesInVolume){
+  int N, i, j;
+  Edge E, *pE;
+  int edges[6][2];
+
+  if (s->V[3] && EdgesInVolume){
+    N = 6;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_tetra[i][j];
+  }
+  else if (s->V[3]){
+    N = 4;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_quad[i][j];
+  }
+  else if (s->V[2]){
+    N = 3;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_tetra[i][j];
+  }
+  else{
+    N = 1;
+    for (i = 0; i < N; i++)
+      for (j = 0; j < 2; j++)
+	edges[i][j] = edges_tetra[i][j];
+  }
+
+  for (i = 0; i < N; i++){
+    E.V[0] = s->V[edges[i][0]];
+    E.V[1] = s->V[edges[i][1]];
+    if ((pE = (Edge *) Tree_PQuery (AllEdges, &E))){
+      List_Add (pE->Simplexes, &s);
+      if (N == 3)
+	pE->O[1] = s->V[edges_non[i]];
+    }
+    else{
+      E.Simplexes = List_Create (2, 1, sizeof (Simplex *));
+      if (N == 3)
+	E.O[0] = s->V[edges_non[i]];
+      if (N == 3)
+	E.O[1] = NULL;
+      List_Add (E.Simplexes, &s);
+      E.newv = NULL;
+      Tree_Replace (AllEdges, &E);
+    }
+  }
+}
+
+EdgesContainer::EdgesContainer (Tree_T * Simplexes, bool EdgesInVolume){
+  AllEdges = Tree_Create (sizeof (Edge), compareedge);
+  AddTree (Simplexes, EdgesInVolume);
+}
+
+EdgesContainer::EdgesContainer (List_T * Surfaces){
+  AllEdges = Tree_Create (sizeof (Edge), compareedge);
+  Surface *s;
+  for (int i = 0; i < List_Nbr (Surfaces); i++){
+      List_Read (Surfaces, i, &s);
+      AddTree (s->Simplexes, false);
+    }
+}
+
+
+void EdgesContainer::AddTree (Tree_T * Simplexes, bool EdgesInVolume){
+  Simplex *s;
+  List_T *temp = Tree2List (Simplexes);
+  for (int i = 0; i < List_Nbr (temp); i++){
+    List_Read (temp, i, &s);
+    AddEdges (s, EdgesInVolume);
+  }
+  List_Delete (temp);
+}
+
+EdgesContainer::~EdgesContainer (){
+  Tree_Delete (AllEdges);
+}
+bool EdgesContainer::Search (Vertex * v1, Vertex * v2){
+  Edge E;
+  E.V[0] = v1;
+  E.V[1] = v2;
+  if (!Tree_Search (AllEdges, &E))
+    return false;
+  return true;
+}
+
+void EdgesContainer::SwapEdge (Vertex * V[2]){
+  Edge *e, E;
+  Simplex *s, *s1, *s2;
+  int i, j;
+  Vertex *p[2], *q[2];
+
+  E.V[0] = V[0];
+  E.V[1] = V[1];
+  e = (Edge *) Tree_PQuery (AllEdges, &E);
+  E = *e;
+  if (!e)
+    return;
+  List_Read (e->Simplexes, 0, &s1);
+  List_Read (e->Simplexes, 1, &s2);
+
+  for (i = 0; i < 3; i++){
+    if (s1->S[i] == s2){
+      s1->ExtractOppositeEdges (i, p, q);
+      if (!s1->SwapEdge (i))
+	return;
+      Tree_Suppress (AllEdges, &E);
+      E.V[0] = q[0];
+      E.V[1] = q[1];
+      Tree_Add (AllEdges, &E);
+      
+      E.V[0] = q[0];
+      E.V[1] = p[0];
+      e = (Edge *) Tree_PQuery (AllEdges, &E);
+      for (j = 0; j < 2; j++){
+	List_Read (e->Simplexes, j, &s);
+	if (s == s2)
+	  List_Write (e->Simplexes, j, &s1);
+      }
+      
+      E.V[0] = q[1];
+      E.V[1] = p[1];
+      e = (Edge *) Tree_PQuery (AllEdges, &E);
+      for (j = 0; j < 2; j++){
+	List_Read (e->Simplexes, j, &s);
+	if (s == s1)
+	  List_Write (e->Simplexes, j, &s2);
+      }
+      V[0] = q[0];
+      V[1] = q[1];
+    }
+  }
+}
diff --git a/Mesh/Edge.h b/Mesh/Edge.h
new file mode 100644
index 0000000000000000000000000000000000000000..d856e4ae8762dd27f1484645f9a5b150ca3ec3c1
--- /dev/null
+++ b/Mesh/Edge.h
@@ -0,0 +1,35 @@
+#ifndef _EDGE_H_
+#define _EDGE_H_
+
+#include "List.h"
+#include "Tree.h"
+#include "Vertex.h"
+#include "Simplex.h"
+
+class Edge {
+public :
+  Vertex *V[2];
+  List_T *Simplexes;
+  Vertex *newv;
+  Vertex *O[2];
+  double a;
+  List_T *Liste;
+};
+
+class EdgesContainer{
+public :
+  Tree_T * AllEdges;
+  EdgesContainer (Tree_T *Simplexes, bool i = false);
+  EdgesContainer (List_T *Surfaces);
+  ~EdgesContainer();
+  void AddTree (Tree_T *Simplexes, bool EdgesInVolume);
+  void AddEdges(Simplex *s, bool i);
+  void RemoveEdge(Edge *e);
+  void SwapEdge (Vertex *v[2]);
+  bool Search(Vertex *v1, Vertex *v2);
+};
+
+int compareedge (const void *a, const void *b);
+int compareedge_angle (const void *a, const void *b);
+
+#endif
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9bdaeed63a23c1db19c7c1b275075f6d1c2f2d3f
--- /dev/null
+++ b/Mesh/Generator.cpp
@@ -0,0 +1,220 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "Context.h"
+#include "Main.h"
+
+extern Mesh     *THEM;
+extern Context_T CTX;
+extern int TYPBGMESH,LocalNewPoint;
+extern int Alerte_Point_Exterieur;
+extern int CurrentNodeNumber, CurrentSimplexNumber;
+
+static List_T *Curves;
+
+void GetStatistics (double s[50]){
+  int i;
+  THEM->Statistics[0] = Tree_Nbr (THEM->Points);
+  THEM->Statistics[1] = Tree_Nbr (THEM->Curves);
+  THEM->Statistics[2] = Tree_Nbr (THEM->Surfaces);
+  THEM->Statistics[3] = Tree_Nbr (THEM->Volumes);
+  for (i = 0; i < 50; i++)
+    s[i] = THEM->Statistics[i];
+}
+
+void Maillage_Dimension_0 (Mesh * M){
+  for (int i = 0; i < 20; i++)
+    M->Statistics[i] = 0.0;
+  Create_BgMesh (TYPBGMESH, .2, M);
+}
+
+void Maillage_Dimension_1 (Mesh * M){
+  double t1, t2;
+  t1 = Cpu();
+  Tree_Action (M->Curves, Maillage_Curve);
+  t2 = Cpu();
+  M->Statistics[12] = t2 - t1;
+}
+
+void Maillage_Dimension_2 (Mesh * M){
+  int i;
+  Curve *c, *neew, C;
+  double t1, t2;
+
+  t1 = Cpu();
+
+  /* maillage 1-D inverses */
+
+  Curves = Tree2List (M->Curves);
+  for (i = 0; i < List_Nbr (Curves); i++){
+    List_Read (Curves, i, &c);
+    if (c->Num > 0){
+      neew = &C;
+      neew->Num = -c->Num;
+      Tree_Query (M->Curves, &neew);
+      neew->Vertices = List_Create (List_Nbr (c->Vertices), 1, sizeof (Vertex *));
+      List_Invert (c->Vertices, neew->Vertices);
+    }
+  }
+  List_Delete (Curves);
+
+  Tree_Action (M->Surfaces, Maillage_Surface);
+
+  t2 = Cpu();
+
+  M->Statistics[13] = t2 - t1;
+}
+
+void Maillage_Dimension_3 (Mesh * M){
+  Volume *v;
+  double t1, t2;
+  Volume *vol;
+
+  t1 = Cpu();
+
+  v = Create_Volume (99999, 99999, 99999);
+
+  List_T *list = Tree2List (M->Volumes);
+  for (int i = 0; i < List_Nbr (list); i++){
+    List_Read (list, i, &vol);
+    if ((!vol->Extrude || !vol->Extrude->mesh.ExtrudeMesh) &&
+	(vol->Method != TRANSFINI)){
+      for (int j = 0; j < List_Nbr (vol->Surfaces); j++){
+	List_Replace (v->Surfaces, List_Pointer (vol->Surfaces, j), compareSurface);
+      }
+    }
+  }
+  List_Delete (list);
+  Tree_Insert (M->Volumes, &v);
+  Tree_Action (M->Volumes, Maillage_Volume);
+
+  t2 = Cpu();
+
+  M->Statistics[14] = t2 - t1;
+}
+
+void Init_Mesh (Mesh * M, int all){
+  THEM = M;
+
+  if (M->Vertices){
+    //Tree_Action (M->Vertices, Free_Vertex);
+    Tree_Delete (M->Vertices);
+  }
+  if (M->VertexEdges){
+    //Tree_Action (M->VertexEdges, Free_Vertex);
+    Tree_Delete (M->VertexEdges);
+  }
+  if (M->Simplexes){
+    //Tree_Action (M->Simplexes, Free_Simplex);
+    Tree_Delete (M->Simplexes);
+  }
+  if (M->Points){
+    //Tree_Action (M->Points, Free_Vertex);
+    Tree_Delete (M->Points);
+  }
+  if (M->Curves){
+    //Tree_Action (M->Vertices, Free_Curve);
+    Tree_Delete (M->Curves);
+  }
+  if (M->SurfaceLoops){
+    //Tree_Action (M->Vertices, Free_SurfaceLoop);
+    Tree_Delete (M->SurfaceLoops);
+  }
+  if (M->EdgeLoops){
+    //Tree_Action (M->Vertices, Free_EdgeLoop);
+    Tree_Delete (M->EdgeLoops);
+  }
+  if (M->Surfaces){
+    //Tree_Action (M->Vertices, Free_Surface);
+    Tree_Delete (M->Surfaces);
+  }
+  if (M->Volumes){
+    //Tree_Action (M->Vertices, Free_Volume);
+    Tree_Delete (M->Volumes);
+  }
+  if (M->PhysicalGroups){
+    //Tree_Action (M->Vertices, Free_PhysicalGroup);
+    List_Delete (M->PhysicalGroups);
+  }
+  if (M->Metric){
+    Free (M->Metric);
+  }
+
+  M->Vertices = Tree_Create (sizeof (Vertex *), compareVertex);
+  M->VertexEdges = Tree_Create (sizeof (Vertex *), compareVertex);
+  M->Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
+  M->Points = Tree_Create (sizeof (Vertex *), compareVertex);
+  M->Curves = Tree_Create (sizeof (Curve *), compareCurve);
+  M->SurfaceLoops = Tree_Create (sizeof (SurfaceLoop *), compareSurfaceLoop);
+  M->EdgeLoops = Tree_Create (sizeof (EdgeLoop *), compareEdgeLoop);
+  M->Surfaces = Tree_Create (sizeof (Surface *), compareSurface);
+  M->Volumes = Tree_Create (sizeof (Volume *), compareVolume);
+  M->PhysicalGroups = List_Create (5, 5, sizeof (PhysicalGroup *));
+  M->Metric = new GMSHMetric;
+  M->BGM.bgm = NULL;
+
+  /* Dirt */
+
+  LocalNewPoint = CENTER_CIRCCIRC;
+  Alerte_Point_Exterieur = 0;
+  CurrentNodeNumber = 1;
+  CurrentSimplexNumber = 0;
+
+  M->MeshParams.DelaunayAlgorithm = CTX.mesh.algo ;
+  M->MeshParams.NbSmoothing = CTX.mesh.nb_smoothing ;
+  M->status = 0;
+}
+
+void mai3d (Mesh * M, int Asked){
+  double t1, t2;
+  int oldstatus;
+
+  oldstatus = M->status;
+
+  /* initialisations - Maillage 0-D */
+
+  if ((Asked > oldstatus && Asked >= 0 && oldstatus < 0) ||
+      (Asked < oldstatus)){
+    OpenProblem (TheFileName);
+    M->status = 0;
+  }
+  
+  /* Maillage 1-D */
+  
+  if ((Asked > oldstatus && Asked > 0 && oldstatus < 1) ||
+      (Asked < oldstatus && Asked > 0)){
+    Msg (INFO, "Mesh 1D...");
+    t1 = Cpu();
+    Maillage_Dimension_1 (M);
+    t2 = Cpu();
+    Msg (INFO, "Mesh 1D complete (%f s)", t2 - t1);
+    M->status = 1;
+  }
+  
+  /* Maillage 2-D */
+  
+  if ((Asked > oldstatus && Asked > 1 && oldstatus < 2) ||
+      (Asked < oldstatus && Asked > 1)){
+    Msg (INFO, "Mesh 2D...");
+    t1 = Cpu();
+    Maillage_Dimension_2 (M);
+    t2 = Cpu();
+    Msg (INFO, "Mesh 2D complete (%f s)", t2 - t1);
+    M->status = 2;
+  }
+
+  /* Maillage 3-D */
+
+  if ((Asked > oldstatus && Asked > 2 && oldstatus < 3) ||
+      (Asked < oldstatus && Asked > 2)){
+    Msg (INFO, "Mesh 3D...");
+    t1 = Cpu();
+    Maillage_Dimension_3 (M);
+    t2 = Cpu();
+    Msg (INFO, "Mesh 3D complete (%f s)", t2 - t1);
+    M->status = 3;
+  }
+
+}
diff --git a/Mesh/Interpolation.cpp b/Mesh/Interpolation.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e67919e3ba08a9c16548c4e3a84cf476b405aa9c
--- /dev/null
+++ b/Mesh/Interpolation.cpp
@@ -0,0 +1,555 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Numeric.h"
+#include "Interpolation.h"
+
+/* ------------------------------------------------------------------------ */
+/*  I n t e r p o l a t e C u r v e                                         */
+/* ------------------------------------------------------------------------ */
+
+extern Mesh *THEM;
+
+Vertex InterpolateCurve (Curve * Curve, double u, int derivee){
+
+  int N, i, j;
+  Vertex D[2], V;
+  Vertex *v[5];
+  double eps = 1.e-3, T[4], W, teta, t1, t2, t;
+  double vec[4];
+  Vertex temp1, temp2;
+
+  V.u = u;
+
+  if (derivee){
+    D[0] = InterpolateCurve (Curve, u, 0);
+    D[1] = InterpolateCurve (Curve, u + eps, 0);
+    V.Pos.X = (D[1].Pos.X - D[0].Pos.X) / eps;
+    V.Pos.Y = (D[1].Pos.Y - D[0].Pos.Y) / eps;
+    V.Pos.Z = (D[1].Pos.Z - D[0].Pos.Z) / eps;
+    return V;
+  }
+
+  switch (Curve->Typ){
+
+  case MSH_SEGM_LINE:
+    
+    N = List_Nbr (Curve->Control_Points);
+    i = (int) ((double) (N - 1) * u);
+    while (i >= N - 1)
+      i--;
+    while (i < 0)
+      i++;
+    t1 = (double) (i) / (double) (N - 1);
+    t2 = (double) (i + 1) / (double) (N - 1);
+    t = (u - t1) / (t2 - t1);
+    List_Read (Curve->Control_Points, i, &v[1]);
+    List_Read (Curve->Control_Points, i + 1, &v[2]);
+    
+    V.lc = t * v[2]->lc + (1. - t) * v[1]->lc;
+    V.Pos.X = v[1]->Pos.X + t * (v[2]->Pos.X - v[1]->Pos.X);
+    V.Pos.Y = v[1]->Pos.Y + t * (v[2]->Pos.Y - v[1]->Pos.Y);
+    V.Pos.Z = v[1]->Pos.Z + t * (v[2]->Pos.Z - v[1]->Pos.Z);
+    V.w = v[1]->w + t * (v[2]->w - v[1]->w);
+    return V;
+
+  case MSH_SEGM_PARAMETRIC:
+    V.Pos.X = evaluate_scalarfunction ("t", u, Curve->functu);
+    V.Pos.Y = evaluate_scalarfunction ("t", u, Curve->functv);
+    V.Pos.Z = evaluate_scalarfunction ("t", u, Curve->functw);
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    V.w = (u * Curve->beg->w + (1. - u) * Curve->end->w);
+    return V;
+    
+  case MSH_SEGM_CIRC:
+  case MSH_SEGM_CIRC_INV:
+  case MSH_SEGM_ELLI:
+  case MSH_SEGM_ELLI_INV:
+    
+    if (Curve->Typ == MSH_SEGM_CIRC_INV ||
+	Curve->Typ == MSH_SEGM_ELLI_INV){
+      V.u = 1. - u;
+      u = V.u;
+    }
+    
+    teta = Curve->Circle.t1 - (Curve->Circle.t1 - Curve->Circle.t2) * u;
+    /* pour les ellipses */
+    teta -= Curve->Circle.incl;
+    
+    V.Pos.X = Curve->Circle.f1 * cos (teta) * cos (Curve->Circle.incl) -
+      Curve->Circle.f2 * sin (teta) * sin (Curve->Circle.incl);
+    V.Pos.Y = Curve->Circle.f1 * cos (teta) * sin (Curve->Circle.incl) +
+      Curve->Circle.f2 * sin (teta) * cos (Curve->Circle.incl);
+
+    V.Pos.Z = 0.0;
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    Projette (&V, Curve->Circle.invmat);
+    V.Pos.X += Curve->Circle.v[2]->Pos.X;
+    V.Pos.Y += Curve->Circle.v[2]->Pos.Y;
+    V.Pos.Z += Curve->Circle.v[2]->Pos.Z;
+    V.w = (u * Curve->beg->w + (1. - u) * Curve->end->w);
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    return V;
+    
+  case MSH_SEGM_BSPLN:
+  case MSH_SEGM_BEZIER:
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    return InterpolateUBS (Curve, u, derivee);
+
+  case MSH_SEGM_NURBS:
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    return InterpolateNurbs (Curve, u, derivee);
+
+  case MSH_SEGM_SPLN:
+    V.lc = (u * Curve->beg->lc + (1. - u) * Curve->end->lc);
+    N = List_Nbr (Curve->Control_Points);
+
+    /* 
+           0                   i    P     i+1                  N-1
+     vfirst*---------*---------*----X-----*----------*----------* vlast
+           0                  t1   absc   t2                    1
+                             0    t     1
+
+     Splines uniformes -> Le point se trouve entre v[1] et v[2] 
+     -> Calcul de l'abcisse curviligne locale t ( entre 0 et 1 )
+
+     0           -> t1 
+     1           -> t2
+     u -> t
+
+     Splines Lineiques -> Multilines
+    */
+
+    i = (int) ((double) (N - 1) * u);
+    if (i >= N - 1)
+      i = N - 2;
+    
+    t1 = (double) (i) / (double) (N - 1);
+    t2 = (double) (i + 1) / (double) (N - 1);
+    
+    t = (u - t1) / (t2 - t1);
+    
+    List_Read (Curve->Control_Points, i, &v[1]);
+    List_Read (Curve->Control_Points, i + 1, &v[2]);
+    
+    V.lc = t * v[1]->lc + (1. - t) * v[2]->lc;
+    
+    if (!i){
+      v[0] = &temp1;
+      v[0]->Pos.X = 2. * v[1]->Pos.X - v[2]->Pos.X;
+      v[0]->Pos.Y = 2. * v[1]->Pos.Y - v[2]->Pos.Y;
+      v[0]->Pos.Z = 2. * v[1]->Pos.Z - v[2]->Pos.Z;
+    }
+    else{
+      List_Read (Curve->Control_Points, i - 1, &v[0]);
+    }
+    
+    if (i == N - 2){
+      v[3] = &temp2;
+      v[3]->Pos.X = 2. * v[2]->Pos.X - v[1]->Pos.X;
+      v[3]->Pos.Y = 2. * v[2]->Pos.Y - v[1]->Pos.Y;
+      v[3]->Pos.Z = 2. * v[2]->Pos.Z - v[1]->Pos.Z;
+    }
+    else{
+      List_Read (Curve->Control_Points, i + 2, &v[3]);
+    }
+    
+    if (derivee){
+      T[3] = 0.;
+      T[2] = 1.;
+      T[1] = 2. * t;
+      T[0] = 3. * t * t;
+    }
+    else{
+      T[3] = 1.;
+      T[2] = t;
+      T[1] = t * t;
+      T[0] = t * t * t;
+    }
+    
+    V.Pos.X = V.Pos.Y = V.Pos.Z = W = 0.0;
+    for (i = 0; i < 4; i++){
+      vec[i] = 0.0;
+    }
+    
+    /* X */
+    for (i = 0; i < 4; i++){
+      for (j = 0; j < 4; j++){
+	  vec[i] += Curve->mat[i][j] * v[j]->Pos.X;
+	}
+    }
+
+    for (j = 0; j < 4; j++){
+      V.Pos.X += T[j] * vec[j];
+      vec[j] = 0.0;
+    }
+
+    /* Y */
+    for (i = 0; i < 4; i++){
+      for (j = 0; j < 4; j++){
+	vec[i] += Curve->mat[i][j] * v[j]->Pos.Y;
+      }
+    }
+
+    for (j = 0; j < 4; j++){
+      V.Pos.Y += T[j] * vec[j];
+      vec[j] = 0.0;
+    }
+
+    /* Z */
+    for (i = 0; i < 4; i++){
+      for (j = 0; j < 4; j++){
+	vec[i] += Curve->mat[i][j] * v[j]->Pos.Z;
+      }
+    }
+    for (j = 0; j < 4; j++){
+      V.Pos.Z += T[j] * vec[j];
+      vec[j] = 0.0;
+    }
+    
+    /* W */
+    for (i = 0; i < 4; i++){
+      for (j = 0; j < 4; j++){
+	vec[i] += Curve->mat[i][j] * v[j]->lc;
+      }
+    }
+    for (j = 0; j < 4; j++){
+      W += T[j] * vec[j];
+    }
+
+    if (derivee){
+      V.Pos.X /= ((t2 - t1));
+      V.Pos.Y /= ((t2 - t1));
+      V.Pos.Z /= ((t2 - t1));
+    }
+    else{
+      // V.Pos.X /= ((W));
+      // V.Pos.Y /= ((W));
+      // V.Pos.Z /= ((W));
+    }
+    return V;
+
+  default :
+    Msg(ERROR, "Unknown Curve Type in Interpolation");
+    return V;
+  }
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  I n t e r p o l a t e S u r f a c e                                     */
+/* ------------------------------------------------------------------------ */
+
+/* Interpolation transfinie sur un quadrangle :
+   f(u,v) = (1-u)c4(v) + u c2(v) + (1-v)c1(u) + v c3(u)
+            - [ (1-u)(1-v)s1 + u(1-v)s2 + uv s3 + (1-u)v s4 ] */
+
+#define TRAN_QUA(c1,c2,c3,c4,s1,s2,s3,s4,u,v) \
+   (1.-u)*c4+u*c2+(1.-v)*c1+v*c3-((1.-u)*(1.-v)*s1+u*(1.-v)*s2+u*v*s3+(1.-u)*v*s4)
+
+Vertex TransfiniteQua (Vertex c1, Vertex c2, Vertex c3, Vertex c4,
+		       Vertex s1, Vertex s2, Vertex s3, Vertex s4,
+		       double u, double v){
+  Vertex V;
+
+  V.lc = TRAN_QUA (c1.lc, c2.lc, c3.lc, c4.lc, 
+		   s1.lc, s2.lc, s3.lc, s4.lc, u, v);
+  V.w = TRAN_QUA (c1.w, c2.w, c3.w, c4.w, 
+		  s1.w, s2.w, s3.w, s4.w, u, v);
+  V.Pos.X = TRAN_QUA (c1.Pos.X, c2.Pos.X, c3.Pos.X, c4.Pos.X, 
+		      s1.Pos.X, s2.Pos.X, s3.Pos.X, s4.Pos.X, u, v);
+  V.Pos.Y = TRAN_QUA (c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, c4.Pos.Y, 
+		      s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, s4.Pos.Y, u, v);
+  V.Pos.Z = TRAN_QUA (c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, c4.Pos.Z, 
+		      s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, s4.Pos.Z, u, v);
+  return (V);
+}
+
+/* Interpolation transfinie sur un triangle : TRAN_QUA avec s1=s4=c4
+   f(u,v) = u c2 (v) + (1-v) c1(u) + v c3(u) - u(1-v) s2 - uv s3 */
+
+#define TRAN_TRI(c1,c2,c3,s1,s2,s3,u,v) u*c2+(1.-v)*c1+v*c3-(u*(1.-v)*s2+u*v*s3);
+
+Vertex TransfiniteTri (Vertex c1, Vertex c2, Vertex c3,
+		       Vertex s1, Vertex s2, Vertex s3,
+		       double u, double v){
+  Vertex V;
+
+  V.lc = TRAN_TRI (c1.lc, c2.lc, c3.lc, s1.lc, s2.lc, s3.lc, u, v);
+  V.w = TRAN_TRI (c1.w, c2.w, c3.w, s1.w, s2.w, s3.w, u, v);
+  V.Pos.X = TRAN_TRI (c1.Pos.X, c2.Pos.X, c3.Pos.X, 
+		      s1.Pos.X, s2.Pos.X, s3.Pos.X, u, v);
+  V.Pos.Y = TRAN_TRI (c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, 
+		      s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, u, v);
+  V.Pos.Z = TRAN_TRI (c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, 
+		      s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, u, v);
+  return (V);
+}
+
+void TransfiniteSph (Vertex S, Vertex center, Vertex * T){
+  double r, s, dirx, diry, dirz;
+
+  r = sqrt (DSQR (S.Pos.X - center.Pos.X) + DSQR (S.Pos.Y - center.Pos.Y)
+	    + DSQR (S.Pos.Z - center.Pos.Z));
+
+  s = sqrt (DSQR (T->Pos.X - center.Pos.X) + DSQR (T->Pos.Y - center.Pos.Y)
+	    + DSQR (T->Pos.Z - center.Pos.Z));
+
+  dirx = (T->Pos.X - center.Pos.X) / s;
+  diry = (T->Pos.Y - center.Pos.Y) / s;
+  dirz = (T->Pos.Z - center.Pos.Z) / s;
+
+  T->Pos.X = center.Pos.X + r * dirx;
+  T->Pos.Y = center.Pos.Y + r * diry;
+  T->Pos.Z = center.Pos.Z + r * dirz;
+}
+
+Vertex InterpolateSurface (Surface * s, double u, double v, 
+			   int derivee, int u_v){
+  Vertex *c1, *c2, T, D[4], V[4], *S[4];
+  Curve *C[4];
+  int i, issphere;
+  double eps = 1.e-6;
+
+  if (derivee){
+    if (u_v == 1){
+      if (u - eps < 0.0){
+	D[0] = InterpolateSurface (s, u, v, 0, 0);
+	D[1] = InterpolateSurface (s, u + eps, v, 0, 0);
+      }
+      else{
+	D[0] = InterpolateSurface (s, u - eps, v, 0, 0);
+	D[1] = InterpolateSurface (s, u, v, 0, 0);
+      }
+    }
+    else if (u_v == 2){
+      if (v - eps < 0.0){
+	D[0] = InterpolateSurface (s, u, v, 0, 0);
+	D[1] = InterpolateSurface (s, u, v + eps, 0, 0);
+      }
+      else{
+	D[0] = InterpolateSurface (s, u, v - eps, 0, 0);
+	D[1] = InterpolateSurface (s, u, v, 0, 0);
+      }
+    }
+    else{
+      Msg(WARNING, "Arbitrary InterpolateSurface for Derivative not Done");
+      /*
+      double epsc = eps * cos (t);
+      double epss = eps * sin (t);
+      if (v - epss < 0.0 && u - epsc < 0.0){
+	D[0] = InterpolateSurface (s, u, v, 0, 0);
+	D[1] = InterpolateSurface (s, u + epsc, v + epss, 0, 0);
+      }
+      else if (v - epss < 0.0){
+	D[0] = InterpolateSurface (s, u - epsc, v, 0, 0);
+	D[1] = InterpolateSurface (s, u, v + epss, 0, 0);
+      }
+      else if (u - epsc < 0.0){
+	D[0] = InterpolateSurface (s, u, v - epss, 0, 0);
+	D[1] = InterpolateSurface (s, u + epsc, v, 0, 0);
+      }
+      else{
+	D[0] = InterpolateSurface (s, u - epsc, v - epss, 0, 0);
+	D[1] = InterpolateSurface (s, u, v, 0, 0);
+      }
+      */
+    }
+    T.Pos.X = (D[1].Pos.X - D[0].Pos.X) / eps;
+    T.Pos.Y = (D[1].Pos.Y - D[0].Pos.Y) / eps;
+    T.Pos.Z = (D[1].Pos.Z - D[0].Pos.Z) / eps;
+    return T;
+  }
+  
+  Vertex x (u, v, .0);
+  Vertex *xx = &x, *dum;
+
+  if (s->Extrude && s->Extrude->geo.Mode == EXTRUDED_ENTITY &&
+      s->Typ != MSH_SURF_PLAN){
+    Curve *c = FindCurve (s->Extrude->geo.Source, THEM);
+    Vertex v1 = InterpolateCurve (c, u, 0);
+    s->Extrude->Extrude (v, v1.Pos.X, v1.Pos.Y, v1.Pos.Z);
+    return v1;
+  }
+
+  switch (s->Typ){
+    
+  case MSH_SURF_PLAN:
+
+    Calcule_Z_Plan (&xx, &dum);
+    //Projette_Inverse(&xx, &dum);
+    return x;
+
+  case MSH_SURF_REGL:
+    issphere = 1;
+    for (i = 0; i < 4; i++){
+      List_Read (s->s.Generatrices, i, &C[i]);
+      if (C[i]->Typ != MSH_SEGM_CIRC && C[i]->Typ != MSH_SEGM_CIRC_INV){
+	issphere = 0;
+      }
+      else if (issphere){
+	if (!i){
+	  List_Read (C[i]->Control_Points, 1, &c1);
+	}
+	else{
+	  List_Read (C[i]->Control_Points, 1, &c2);
+	  if (compareVertex (&c1, &c2))
+	    issphere = 0;
+	}
+      }
+    }
+    
+    S[0] = C[0]->beg;
+    S[1] = C[1]->beg;
+    S[2] = C[2]->beg;
+    S[3] = C[3]->beg;
+    
+    /*
+      List_Read(C[0]->Control_Points, 0, &S[0]);
+      List_Read(C[1]->Control_Points, 0, &S[1]);
+      List_Read(C[2]->Control_Points, 0, &S[2]);
+      List_Read(C[3]->Control_Points, 0, &S[3]);
+    */
+
+    V[0] = InterpolateCurve (C[0], C[0]->ubeg + (C[0]->uend - C[0]->ubeg) * u, 0);
+    V[1] = InterpolateCurve (C[1], C[1]->ubeg + (C[1]->uend - C[1]->ubeg) * v, 0);
+    V[2] = InterpolateCurve (C[2], C[2]->ubeg + (C[2]->uend - C[2]->ubeg) * (1. - u), 0);
+    V[3] = InterpolateCurve (C[3], C[3]->ubeg + (C[3]->uend - C[3]->ubeg) * (1. - v), 0);
+    
+    T = TransfiniteQua (V[0], V[1], V[2], V[3], *S[0], *S[1], *S[2], *S[3], u, v);
+    if (issphere) TransfiniteSph (*S[0], *c1, &T);
+
+    return (T);
+    
+  case MSH_SURF_NURBS:
+    return InterpolateNurbsSurface (s, u, v);
+
+  case MSH_SURF_TRIC:
+    issphere = 1;
+    for (i = 0; i < 3; i++){
+      List_Read (s->s.Generatrices, i, &C[i]);
+      if (C[i]->Typ != MSH_SEGM_CIRC && C[i]->Typ != MSH_SEGM_CIRC_INV){
+	issphere = 0;
+      }
+      else if (issphere){
+	if (!i){
+	  List_Read (C[i]->Control_Points, 1, &c1);
+	}
+	else{
+	  List_Read (C[i]->Control_Points, 1, &c2);
+	  if (compareVertex (&c1, &c2))
+	    issphere = 0;
+	}
+      }
+    }
+    
+    List_Read (C[0]->Control_Points, 0, &S[0]);
+    List_Read (C[1]->Control_Points, 0, &S[1]);
+    List_Read (C[2]->Control_Points, 0, &S[2]);
+    
+    V[0] = InterpolateCurve (C[0], u, 0);
+    V[1] = InterpolateCurve (C[1], v, 0);
+    V[2] = InterpolateCurve (C[2], 1. - u, 0);
+    
+    T = TransfiniteTri (V[0], V[1], V[2], *S[0], *S[1], *S[2], u, v);
+    if (issphere) TransfiniteSph (*S[0], *c1, &T);
+
+    return (T);
+
+  default :
+    Msg(ERROR, "Unknown Surface Type in Interpolation");
+    return T;
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  I n t e r p o l a t e V o l u m e                                       */
+/* ------------------------------------------------------------------------ */
+
+/* Interpolation transfinie sur un hexaedre
+   prisme (avec s1=s4=a4, s5=s8=a8, a9=a12=f4)
+   f(u,v) = (1-u) f4(v,w) + u f2(v,w)
+   + (1-v) f1(u,w) + v f3(u,w)
+   + (1-w) f5(u,v) + w f6(u,v)
+   - [ (1-u)(1-v) c9(w) + (1-u)v c12(w) + u(1-v) c10(w) + uv c11(w) ]
+   - [ (1-v)(1-w) c1(u) + (1-v)w c5(u)  + v(1-w) c3(u)  + vw c7(u)  ]
+   - [ (1-u)(1-w) c4(v) + (1-w)u c2(v)  + w(1-u) c8(v)  + uw c6(v)  ]
+   + [ (1-u)(1-v)(1-w) s1 + u(1-v)(1-w) s2 + uv(1-w) s3 + (1-u)v(1-w) s4 + 
+   (1-u)(1-v)w     s5 + u(1-v)w     s6 + uvw     s7 + (1-u)vw     s8 ]
+ */
+
+#define TRAN_HEX(f1,f2,f3,f4,f5,f6,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,s1,s2,s3,s4,s5,s6,s7,s8,u,v,w) (1-u)*f4+u*f2+(1-v)*f1+v*f3+(1-w)*f5+w*f6-((1-u)*(1-v)*c9+(1-u)*v*c12+u*(1-v)*c10+u*v*c11)-((1-v)*(1-w)*c1+(1-v)*w*c5+v*(1-w)*c3+v*w*c7)-((1-u)*(1-w)*c4+(1-w)*u*c2+w*(1-u)*c8+u*w*c6)+(1-u)*(1-v)*(1-w)*s1+u*(1-v)*(1-w)*s2+u*v*(1-w)*s3+(1-u)*v*(1-w)*s4+(1-u)*(1-v)*w*s5+u*(1-v)*w*s6+u*v*w*s7+(1-u)*v*w*s8
+
+Vertex 
+TransfiniteHex (Vertex f1, Vertex f2, Vertex f3, Vertex f4, Vertex f5, Vertex f6,
+		Vertex c1, Vertex c2, Vertex c3, Vertex c4, Vertex c5, Vertex c6,
+		Vertex c7, Vertex c8, Vertex c9, Vertex c10, Vertex c11, Vertex c12,
+		Vertex s1, Vertex s2, Vertex s3, Vertex s4,
+		Vertex s5, Vertex s6, Vertex s7, Vertex s8,
+		double u, double v, double w)
+{
+  Vertex V;
+
+  V.lc = TRAN_HEX (f1.lc, f2.lc, f3.lc, f4.lc, f5.lc, f6.lc,
+		   c1.lc, c2.lc, c3.lc, c4.lc, c5.lc, c6.lc,
+		   c7.lc, c8.lc, c9.lc, c10.lc, c11.lc, c12.lc,
+		   s1.lc, s2.lc, s3.lc, s4.lc, s5.lc, s6.lc, s7.lc, s8.lc,
+		   u, v, w);
+
+  V.Pos.X = TRAN_HEX (f1.Pos.X, f2.Pos.X, f3.Pos.X, f4.Pos.X, f5.Pos.X, f6.Pos.X,
+		 c1.Pos.X, c2.Pos.X, c3.Pos.X, c4.Pos.X, c5.Pos.X, c6.Pos.X,
+	      c7.Pos.X, c8.Pos.X, c9.Pos.X, c10.Pos.X, c11.Pos.X, c12.Pos.X,
+		      s1.Pos.X, s2.Pos.X, s3.Pos.X, s4.Pos.X, s5.Pos.X, s6.Pos.X, s7.Pos.X, s8.Pos.X,
+		      u, v, w);
+
+  V.Pos.Y = TRAN_HEX (f1.Pos.Y, f2.Pos.Y, f3.Pos.Y, f4.Pos.Y, f5.Pos.Y, f6.Pos.Y,
+		 c1.Pos.Y, c2.Pos.Y, c3.Pos.Y, c4.Pos.Y, c5.Pos.Y, c6.Pos.Y,
+	      c7.Pos.Y, c8.Pos.Y, c9.Pos.Y, c10.Pos.Y, c11.Pos.Y, c12.Pos.Y,
+		      s1.Pos.Y, s2.Pos.Y, s3.Pos.Y, s4.Pos.Y, s5.Pos.Y, s6.Pos.Y, s7.Pos.Y, s8.Pos.Y,
+		      u, v, w);
+
+  V.Pos.Z = TRAN_HEX (f1.Pos.Z, f2.Pos.Z, f3.Pos.Z, f4.Pos.Z, f5.Pos.Z, f6.Pos.Z,
+		 c1.Pos.Z, c2.Pos.Z, c3.Pos.Z, c4.Pos.Z, c5.Pos.Z, c6.Pos.Z,
+	      c7.Pos.Z, c8.Pos.Z, c9.Pos.Z, c10.Pos.Z, c11.Pos.Z, c12.Pos.Z,
+		      s1.Pos.Z, s2.Pos.Z, s3.Pos.Z, s4.Pos.Z, s5.Pos.Z, s6.Pos.Z, s7.Pos.Z, s8.Pos.Z,
+		      u, v, w);
+
+  return (V);
+}
+
+void Normal2Surface (Surface * s, double u, double v, double n[3]){
+  Vertex du, dv;
+  double t1[3], t2[3];
+  du = InterpolateSurface (s, u, v, 1, 1);
+  dv = InterpolateSurface (s, u, v, 1, 2);
+  t1[0] = du.Pos.X;
+  t1[1] = du.Pos.Y;
+  t1[2] = du.Pos.Z;
+  t2[0] = dv.Pos.X;
+  t2[1] = dv.Pos.Y;
+  t2[2] = dv.Pos.Z;
+  prodve (t1, t2, n);
+  norme (n);
+}
+
+void 
+HessianNormal2Surface (Surface * s, double u, double v, double n[3])
+{
+  Vertex du, dv;
+  double t1[3], t2[3];
+  du = InterpolateSurface (s, u, v, 1, 1);
+  dv = InterpolateSurface (s, u, v, 1, 2);
+  t1[0] = du.Pos.X;
+  t1[1] = du.Pos.Y;
+  t1[2] = du.Pos.Z;
+  t2[0] = dv.Pos.X;
+  t2[1] = dv.Pos.Y;
+  t2[2] = dv.Pos.Z;
+  prodve (t1, t2, n);
+  norme (n);
+}
diff --git a/Mesh/Interpolation.h b/Mesh/Interpolation.h
new file mode 100644
index 0000000000000000000000000000000000000000..decb09a165696a585d11c9d564ebf28df4d0e58d
--- /dev/null
+++ b/Mesh/Interpolation.h
@@ -0,0 +1,39 @@
+#ifndef _INTERPOLATION_H_
+#define _INTERPOLATION_H_
+
+Vertex InterpolateCurve (Curve * Curve, double u, int derivee);
+
+Vertex InterpolateSurface (Surface * s, double u, double v, 
+			   int derivee, int u_v);
+
+Vertex TransfiniteQua (Vertex c1, Vertex c2, Vertex c3, Vertex c4,
+		       Vertex s1, Vertex s2, Vertex s3, Vertex s4,
+		       double u, double v);
+
+Vertex TransfiniteTri (Vertex c1, Vertex c2, Vertex c3,
+		       Vertex s1, Vertex s2, Vertex s3,
+		       double u, double v);
+
+Vertex TransfiniteHex 
+  (Vertex f1, Vertex f2, Vertex f3, Vertex f4, Vertex f5, Vertex f6,
+   Vertex c1, Vertex c2, Vertex c3, Vertex c4, Vertex c5, Vertex c6,
+   Vertex c7, Vertex c8, Vertex c9, Vertex c10, Vertex c11, Vertex c12,
+   Vertex s1, Vertex s2, Vertex s3, Vertex s4,
+   Vertex s5, Vertex s6, Vertex s7, Vertex s8,
+   double u, double v, double w);
+
+void TransfiniteSph (Vertex S, Vertex center, Vertex * T);
+
+void Normal2Surface (Surface * s, double u, double v, double n[3]);
+
+Vertex InterpolateCubicSpline (Vertex * v[4], double t, double mat[4][4],
+			       int derivee, double t1, double t2);
+Vertex InterpolateUBS (Curve * Curve, double u, int derivee);
+  
+Vertex InterpolateNurbs (Curve * Curve, double u, int derivee);
+
+Vertex InterpolateNurbsSurface (Surface * s, double u, double v);
+
+#endif
+
+
diff --git a/Mesh/Makefile b/Mesh/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..666d53a16bdb961d172640053abbd40a7c7c04d6
--- /dev/null
+++ b/Mesh/Makefile
@@ -0,0 +1,272 @@
+#
+# Makefile for "libMesh.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g -Wall
+
+OS_FLAGS = -D_UNIX
+
+RM       = rm
+RMFLAGS  = -f
+RANLIB  = /usr/bin/ranlib
+
+LIB     = ../lib/libMesh.a
+INCLUDE = -I../Adapt -I../Common -I../DataStr -I../Geo -I../Mesh\
+          -I../Graphics -I../Unix
+
+CFLAGS  = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE)
+
+SRC = 1D_Mesh.cpp \
+      2D_Mesh.cpp \
+        2D_SMesh.cpp \
+        2D_Elliptic.cpp \
+        2D_BGMesh.cpp \
+        2D_Recombine.cpp \
+        2D_InitMesh.cpp \
+        2D_Bowyer.cpp \
+        2D_Bricks.cpp \
+        2D_DivAndConq.cpp \
+        2D_Util.cpp \
+        2D_Links.cpp \
+        2D_Tree.cpp \
+        2D_Cylindrical.cpp \
+        2D_Parametric.cpp \
+        2D_Mesh_Aniso.cpp \
+      3D_Mesh.cpp \
+        3D_SMesh.cpp \
+        3D_BGMesh.cpp \
+        3D_Extrude.cpp \
+        3D_Coherence.cpp \
+        3D_Divide.cpp \
+        3D_Bricks.cpp \
+      MeshQuality.cpp \
+      Create.cpp \
+      Generator.cpp \
+      Print_Mesh.cpp \
+      Read_Mesh.cpp \
+      STL.cpp \
+      SwapEdge.cpp \
+      Numeric.cpp \
+      Metric.cpp \
+      Nurbs.cpp \
+      Interpolation.cpp \
+      SecondOrder.cpp \
+      Smoothing.cpp \
+      CrossData.cpp \
+      Vertex.cpp \
+      Edge.cpp \
+      Simplex.cpp 
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar rvs $(LIB) $(OBJ) 
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+1D_Mesh.o: 1D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \
+  ../Common/Context.h Interpolation.h Numeric.h
+2D_Mesh.o: 2D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Create.h \
+  2D_Mesh.h Numeric.h ../Common/Context.h
+2D_SMesh.o: 2D_SMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Numeric.h \
+  Interpolation.h
+2D_Elliptic.o: 2D_Elliptic.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h
+2D_BGMesh.o: 2D_BGMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Recombine.o: 2D_Recombine.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h Create.h \
+  Numeric.h
+2D_InitMesh.o: 2D_InitMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h Numeric.h
+2D_Bowyer.o: 2D_Bowyer.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Bricks.o: 2D_Bricks.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_DivAndConq.o: 2D_DivAndConq.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Util.o: 2D_Util.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Links.o: 2D_Links.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Tree.o: 2D_Tree.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \
+  ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h
+2D_Cylindrical.o: 2D_Cylindrical.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h ../Common/Context.h \
+  Numeric.h
+2D_Parametric.o: 2D_Parametric.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Interpolation.h \
+  Mesh.h 2D_Mesh.h Create.h ../Common/Context.h Numeric.h
+2D_Mesh_Aniso.o: 2D_Mesh_Aniso.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h \
+  Interpolation.h Create.h ../Common/Context.h Numeric.h
+3D_Mesh.o: 3D_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h 3D_Mesh.h Create.h \
+  Numeric.h ../Common/Context.h
+3D_SMesh.o: 3D_SMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \
+  ../Geo/ExtrudeParams.h Metric.h Interpolation.h Create.h
+3D_BGMesh.o: 3D_BGMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \
+  ../Geo/ExtrudeParams.h Metric.h 2D_Mesh.h 3D_Mesh.h ../Adapt/Adapt.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Numeric.h
+3D_Extrude.o: 3D_Extrude.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h \
+  ../Common/Context.h Create.h
+3D_Coherence.o: 3D_Coherence.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \
+  3D_Mesh.h Create.h Numeric.h
+3D_Divide.o: 3D_Divide.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h
+3D_Bricks.o: 3D_Bricks.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h
+MeshQuality.o: MeshQuality.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Numeric.h
+Create.o: Create.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h
+Generator.o: Generator.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Create.h \
+  ../Common/Context.h ../Unix/Main.h
+Print_Mesh.o: Print_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Create.h
+Read_Mesh.o: Read_Mesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Create.h \
+  ../Geo/MinMax.h
+STL.o: STL.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h
+SwapEdge.o: SwapEdge.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h SwapPatterns.h
+Numeric.o: Numeric.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h \
+  Interpolation.h ../Adapt/nrutil.h
+Metric.o: Metric.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Matrix.h \
+  Interpolation.h
+Nurbs.o: Nurbs.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \
+  ../Geo/ExtrudeParams.h Metric.h
+Interpolation.o: Interpolation.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h Mesh.h Numeric.h \
+  Interpolation.h
+SecondOrder.o: SecondOrder.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h Interpolation.h \
+  Numeric.h
+Smoothing.o: Smoothing.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h Mesh.h Vertex.h \
+  Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h
+CrossData.o: CrossData.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h Mesh.h Vertex.h Simplex.h Edge.h \
+  ../Geo/ExtrudeParams.h Metric.h
+Vertex.o: Vertex.cpp Vertex.h ../DataStr/List.h
+Edge.o: Edge.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \
+  ../Common/Const.h
+Simplex.o: Simplex.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h ../Geo/Geo.h \
+  Mesh.h Vertex.h Simplex.h Edge.h ../Geo/ExtrudeParams.h Metric.h \
+  Numeric.h
diff --git a/Mesh/Matrix.h b/Mesh/Matrix.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a820ba2c32cd486a0b88507b384707f74b60787
--- /dev/null
+++ b/Mesh/Matrix.h
@@ -0,0 +1,195 @@
+#ifndef _MATRIX_H_
+#define _MATRIX_H_
+
+#define _TAILLE_ 2
+
+template <class T> class Matrix2x2{
+  T mat[_TAILLE_][_TAILLE_];
+  T zero;
+
+public:
+
+  Matrix2x2 (const T& init){
+    zero = init;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = zero;
+  }
+
+  Matrix2x2 (const T& init, T z[3][3]){
+    zero = init;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = z[i][j];
+  }
+
+  Matrix2x2<T>& operator = (const Matrix2x2<T> &autre){
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = autre.mat[i][j];
+    return *this;
+  }
+
+  Matrix2x2<T> operator + (const Matrix2x2<T> &autre){
+    Matrix2x2<T> m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m.mat[i][j] = mat[i][j] + autre.mat[i][j];
+    return m;
+  }
+
+  Matrix2x2<T> operator - (const Matrix2x2<T> &autre){
+    Matrix2x2<T> m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m.mat[i][j] = mat[i][j] - autre.mat[i][j];
+    return m;
+  }
+
+  T* operator [] (int i){
+    return mat[i];
+  }
+
+  Matrix2x2 Identity(T id){
+    for(int i=0;i<_TAILLE_;i++)
+      mat[i][i] = id;
+  }
+
+  Matrix2x2 copy(T m[3][3]){
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m[i][j] = mat[i][j];
+  }
+  
+  Matrix2x2 operator * (const Matrix2x2<T> &autre){
+    Matrix2x2 m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++){
+	m.mat[i][j] = zero;
+	for(int k=0;k<_TAILLE_;k++)
+	  m.mat[i][j] += mat[i][k] * autre.mat[k][j];
+      }
+    return m;
+  }
+  
+  bool invert (){
+    T det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
+    if(det == zero)return false;
+    mat[0][0] = mat[1][1] / det;
+    mat[1][1] = mat[0][0] / det;
+    mat[1][0] = -mat[1][0] / det;
+    mat[0][1] = -mat[0][1] / det;
+  }
+
+  void transpose(){
+    T temp;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++){
+	if(i!=j){
+	  temp = mat[i][j];
+	  mat[i][j] = mat[j][i];
+	  mat[j][i] = temp;
+	}
+      }
+  }
+};
+
+#undef _TAILLE_
+#define _TAILLE_ 3
+
+template <class T> class Matrix3x3{
+  T mat[_TAILLE_][_TAILLE_];
+  T zero;
+
+public:
+
+  Matrix3x3 (const T& init){
+    zero = init;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = zero;
+  }
+
+  Matrix3x3 (const T& init, T z[3][3]){
+    zero = init;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = z[i][j];
+  }
+
+  Matrix3x3<T>& operator = (const Matrix3x3<T> &autre){
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	mat[i][j] = autre.mat[i][j];
+    return *this;
+  }
+
+  Matrix3x3<T> operator + (const Matrix3x3<T> &autre){
+    Matrix3x3<T> m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m.mat[i][j] = mat[i][j] + autre.mat[i][j];
+    return m;
+  }
+
+  Matrix3x3<T> operator - (const Matrix3x3<T> &autre){
+    Matrix2x2<T> m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m.mat[i][j] = mat[i][j] - autre.mat[i][j];
+    return m;
+  }
+
+  T* operator [] (int i){
+    return mat[i];
+  }
+
+  void Identity(T id){
+    for(int i=0;i<_TAILLE_;i++)
+      mat[i][i] = id;
+  }
+
+  void copy(T m[3][3]){
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++)
+	m[i][j] = mat[i][j];
+  }
+  
+  Matrix3x3 operator * (const Matrix3x3<T> &autre){
+    Matrix3x3 m(0.);
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<_TAILLE_;j++){
+	m.mat[i][j] = zero;
+	for(int k=0;k<_TAILLE_;k++)
+	  m.mat[i][j] += mat[i][k] * autre.mat[k][j];
+      }
+    return m;
+  }
+
+  /*
+    bool invert (){
+      T det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
+      if(det == zero)return false;
+      mat[0][0] = mat[1][1] / det;
+      mat[1][1] = mat[0][0] / det;
+      mat[1][0] = -mat[1][0] / det;
+      mat[0][1] = -mat[0][1] / det;
+    }
+  */
+
+  void transpose(){
+    T temp;
+    for(int i=0;i<_TAILLE_;i++)
+      for(int j=0;j<i;j++){
+	if(i!=j){
+	  temp = mat[i][j];
+	  mat[i][j] = mat[j][i];
+	  mat[j][i] = temp;
+	}
+      }
+  }
+};
+
+#undef _TAILLE_
+
+#endif
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
new file mode 100644
index 0000000000000000000000000000000000000000..54dbc528e149f5ea5289e344f93e6e8f06228d54
--- /dev/null
+++ b/Mesh/Mesh.h
@@ -0,0 +1,482 @@
+#ifndef _MESH_H_
+#define _MESH_H_
+
+#include "Vertex.h"
+#include "Simplex.h"
+#include "Edge.h"
+#include "ExtrudeParams.h"
+
+#define FORMAT_MSH  1
+#define FORMAT_UNV  2
+#define FORMAT_GREF 3
+
+#define CONV_VALUE    0.8
+
+#define GREEN_INTERPOLATION 1
+#define FEM_INTERPOLATION   2
+
+#define NOTTOLINK 1
+#define TOLINK    2
+
+#define BOF         1
+#define A_TOUT_PRIX 2
+
+#define LossMemory  1
+#define BadLink2    2
+#define DegTriangle 3
+#define PtExterior  4
+
+#define CENTER_CIRCCIRC 1
+#define VORONOI_INSERT  2
+#define BARYCENTER      3
+#define SQUARE_TRI      4
+
+#define EXTERN      1
+#define INTERN      2
+#define ACTIF       3
+#define WAITING     4
+#define ACCEPTED    5
+#define NONACCEPTED 6
+
+#define NONE        0
+#define CONSTANT    1
+#define ONFILE      2
+#define WITHPOINTS  3
+#define FUNCTION    4
+#define LINEAR      5
+#define QUADRATIC   6
+#define CUBIC       7
+#define LOGARITHMIC 8
+#define EXPONENTIAL 9
+
+#define DROITE 1
+#define SPLINE 2
+
+#define TRANSFINI 1
+#define LIBRE     2
+#define ELLIPTIC  3
+
+#define REMOVE 1
+#define ADD    2
+
+#define BOULE 1
+#define BOITE 2
+
+#define HYPOTENU  1
+#define SMALLFACE 2
+
+typedef struct _POINT PointRecord, *PointPeek;
+typedef struct _CONTOUR ContourRecord, *ContourPeek;
+typedef struct _DOC DocRecord, *DocPeek;
+typedef struct _CDLIST DListRecord, *DListPeek;
+typedef struct _MAILLAGE maillage, *maipeek;
+typedef struct _MAICON maillage_c;
+typedef struct _DELAUNAY Delaunay, *delpeek;
+typedef int PointNumero;
+
+struct _DOC{
+  PointRecord *points;	/* points a trianguler */
+  List_T *hotpoints;		/* hotpoints */
+  int numPoints;		/* nombre de points */
+  int numTriangles;		/* nombre de triangles */
+  Delaunay *delaunay;		/* resultats 2D */
+};
+
+typedef struct{
+  double v;
+  double h;
+}MPoint;
+
+struct _POINT{
+  MPoint where;
+  DListPeek adjacent;
+  int initial, permu, info, info2, numcontour;
+  double quality, qualityy, angle;
+};
+
+typedef struct{
+  int Num;
+  double t, lc, p;
+}IntPoint;
+
+struct _CDLIST{
+  PointNumero point_num;	/* numero du point */
+  DListPeek next, prev;
+};
+
+typedef struct{
+  PointNumero search;
+  PointNumero already;
+}demi_triangle;
+
+typedef struct{
+  demi_triangle *info;
+  PointNumero *t;
+  int t_length, info_length;
+}Striangle;
+
+typedef struct {
+  PointNumero from;
+  PointNumero to;
+  int num;
+  int seg;
+}edge;
+
+typedef struct{
+  PointNumero begin;
+  PointNumero end;
+}DT;
+
+typedef struct{
+  PointNumero from;
+  PointNumero to;
+}Segment;
+
+typedef struct{
+  PointNumero a, b, c;
+  double xc, yc;
+  double quality_value;
+  int position, info, info2;
+}Triangle;
+
+typedef struct {
+  Delaunay *voisin1, *voisin2, *voisin3;
+}Voronoi;
+
+struct _DELAUNAY{
+  Triangle t;
+  Voronoi v;
+};
+
+struct _CONTOUR{
+  PointRecord *oriented_points;
+  MPoint *perturbations;
+  int numpoints, numerocontour, numerozon, info;
+};
+
+struct _MAICON{
+  PointRecord *points;
+  int numpoints, numcontour, numeroseg;
+};
+
+struct _MAILLAGE{
+  PointRecord *points;
+  delpeek *listdel;
+  edge *listedges;
+  int numedges, numtriangles, numpoints;
+  int IncrAllocPoints, IncrAllocTri, IncrAllocEdges;
+  int NumAllocPoints, NumAllocTri, NumAllocEdges;
+  int zone;
+};
+
+typedef struct{
+  Vertex *v;
+  List_T *Liste;
+}NXE;
+
+typedef struct{
+  int Num;		/* Numero                                       */
+  int iEnt;		/* Entite geometrique                           */
+  Vertex *V[8];		/* 8 noeuds                                     */
+  Vertex **VSUP;	/* noeuds supplem pour les elts de degre eleves */
+}Hexahedron;
+
+typedef struct{
+  int Num;		/* Numero                                       */
+  int iEnt;		/* Entite geometrique                           */
+  Vertex *V[6];		/* 6 noeuds                                     */
+  Vertex **VSUP;	/* noeuds supplem pour les elts de degre eleves */
+}Prism;
+
+typedef struct{
+  int N;
+  List_T *pT;
+}Brick;
+
+typedef struct{
+  int init;
+  List_T *Bricks;
+  Coord min, max;
+  int Nx, Ny, Nz;
+}Grid_T;
+
+typedef struct{
+  double zaxis[3];
+  double radius1;
+  double radius2;
+  double xaxis[3];
+  double center[3];
+}CylParam;
+
+class STL_Data{
+ public:
+  Tree_T * Vertices;
+  Tree_T *Simplexes;
+  List_T *LVertices;
+  List_T *LSimplexes;
+  void Add_Facet (double x1, double y1, double z1,
+		  double x2, double y2, double z2,
+		  double x3, double y3, double z3);
+  int GetNbFacets (){
+    return Tree_Nbr (Simplexes);
+  }
+  int GetNbVertices (){
+    return Tree_Nbr (Vertices);
+  }
+  void GetFacet (int iFac, int &v1, int &v2, int &v3);
+  void GetVertex (int iVertex, double &x, double &y, double &z);
+  STL_Data ();
+  ~STL_Data ();
+};
+
+struct _Surf{
+  int Num;
+  int Typ;
+  int Mat;
+  int Method;
+  int Recombine;
+  double RecombineAngle;
+  int ipar[4];
+  int Nu, Nv;
+  union{
+    List_T *Generatrices;	/* Surface reglee    */
+  }s;
+  List_T *Control_Points;	/* Patchs bicubiques */
+  double plan[3][3];
+  double invplan[3][3];
+  double a, b, c, d;
+  List_T *Orientations;
+  List_T *Contours;
+  Tree_T *Simplexes;
+  List_T *TrsfSimplexes;
+  Tree_T *Vertices;
+  List_T *TrsfVertices;
+  Tree_T *Edges;
+  int OrderU, OrderV;
+  float *ku, *kv, *cp;
+  struct _Surf *Support;
+  CylParam Cyl;
+  Grid_T Grid;		/* Grille de recherches rapides          */
+  ExtrudeParams *Extrude;
+  STL_Data *STL;
+};
+typedef struct _Surf Surface;
+
+typedef struct{
+  int Num;
+  List_T *Curves;
+}EdgeLoop;
+
+typedef struct{
+  int Num;
+  List_T *Surfaces;
+}SurfaceLoop;
+
+typedef struct{
+  int Num;
+  int Typ;
+  List_T *Entities;
+}PhysicalGroup;
+
+typedef struct{
+  Face F;
+  Face Sorted;
+  Simplex *S[2];
+  int N;
+}FxE;
+
+typedef struct {
+  int Num;
+  int Mat;
+  int Typ;
+  int Method;
+  int ipar[8];
+  ExtrudeParams *Extrude;
+  List_T *Surfaces;
+  Tree_T *Vertices;
+  Tree_T *Edges;
+  Tree_T *Faces;
+  Tree_T *Simplexes;
+  Tree_T *Hexahedra;
+  Tree_T *Prisms;
+}Volume;
+
+typedef struct {
+  Edge e1, e2;
+  int iFac;
+}exf_T;
+
+/* Structure intersection arete - Simplexe */
+
+typedef struct{
+  int NbIntersect;	/* nombre total d'intersections                   */
+  Edge *e;		/* arete                                          */
+  Simplex *s;		/* simplexe                                       */
+  Face *f;		/* face                                           */
+  int NbVertex;		/* nombre de noeuds du simplexe que coupe l'arete */
+  Vertex *V[12];	/* noeuds du simplexe que coupe l'arete           */
+  int iV[12];		/* noeuds du simplexe que coupe l'arete           */
+  int NbEdge;		/* nombre d'intersections arete-arete             */
+  int E[12];		/* aretes                                         */
+  Vertex *VE[12];	/* noeuds d'intersection                          */
+  int NbFace;		/* nombre d'intersections face-arete              */
+  Face *F[12];		/* faces                                          */
+  int iF[12];		/* faces                                          */
+  Vertex *VF[12];	/* position des points d'intersections face-arete */
+}Intersection;
+
+typedef struct _Mesh Mesh;
+
+typedef struct{
+  int Typ;
+  double lc;
+  struct _Mesh *m;
+  List_T *bgm;
+}LcField;
+
+typedef struct{
+  int done;
+  double t1, t2, f1, f2, incl;
+  Vertex *v[4];
+  double invmat[3][3];
+  double n[3];
+}CircParam;
+
+typedef struct{
+  int Num;
+  int Typ;
+  int Method;
+  int ipar[4];
+  double dpar[4];
+  double l;
+  double mat[4][4];
+  Vertex *beg, *end;
+  double ubeg, uend;
+  List_T *Control_Points;
+  List_T *Knots;
+  List_T *Vertices;
+  List_T *ConnectedSurfaces;
+  Tree_T *Simplexes;
+  List_T *TrsfSimplexes;
+  ExtrudeParams *Extrude;
+  float *k, *cp;
+  int degre;
+  CircParam Circle;
+  char functu[256], functv[256], functw[256];
+}Curve;
+
+typedef struct{
+  int Num;
+  int Typ;
+  Vertex *v;
+  Curve *c;
+  Surface *s;
+  double lc1, lc2;
+  double Radius;
+}Attractor;
+
+#include "Metric.h"
+
+#define QUALITY_EDGES_BASED 1
+#define QUALITY_SIMPLEX_BASED 2
+#define INSERTION_CENTROID 1
+#define INSERTION_EDGE 2
+#define DELAUNAY_OLDALGO 1
+#define DELAUNAY_NEWALGO 2
+#define DELAUNAY_KERISO 1
+#define DELAUNAY_KERANISO 2
+
+class MeshParameters{
+ public:
+  int NbSmoothing;
+  int DelaunayAlgorithm;
+  int DelaunayInsertionMethod;
+  int DelaunayQuality;
+  int DelaunayKernel;
+  bool InteractiveDelaunay;
+  MeshParameters ();
+};
+
+struct _Mesh{
+  char name[256];		/* Nom du probleme                       */
+  int status;			/* Etat actuel du maillage               */
+  Tree_T *Points;		/* Points de controle                    */
+  Tree_T *Vertices;		/* Noeuds du maillage                    */
+  Tree_T *Simplexes;		/* Simplexes                             */
+  Tree_T *Curves;		/* Courbes                               */
+  Tree_T *Surfaces;		/* Surfaces                              */
+  Tree_T *Volumes;		/* Volumes                               */
+  Tree_T *SurfaceLoops;	        /* Surface Loops                         */
+  Tree_T *EdgeLoops;		/* Edge Loops                            */
+  List_T *PhysicalGroups;	/*Physical Groups                      */
+  Tree_T *VertexEdges;	        /* 2nd order Vertices on edges           */
+  Grid_T Grid;		        /* Grille de recherches rapides          */
+  LcField BGM;		        /* Background mesh                       */
+  double Statistics[50];	/* Statistiques pour le maillage         */
+  GMSHMetric *Metric;		/* Metrique */
+  MeshParameters MeshParams;
+};
+
+typedef struct {
+  Simplex *S;
+  Face F;
+  int NumFaceSimpl;
+}SxF;
+
+struct Map{
+  int Num;
+  List_T *List;
+};
+
+
+/* public functions */
+
+double Correction_LC_Attractors (double X, double Y, double Z,
+				 double *u, Mesh * m, double metr[3][3]);
+int Extrude_Mesh (Curve * c);
+int Extrude_Mesh (Surface * s);
+int Extrude_Mesh (Volume * v);
+
+int Calcule_Contours (Surface * s);
+
+void Link_Simplexes (List_T * Sim, Tree_T * Tim);
+void Maillage_Curve (void *data, void *dummy);
+
+int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s);
+void Maillage_Automatique_VieuxCode (Surface * pS, Mesh * m, int ori);
+void Maillage_Surface (void *data, void *dum);
+void Maillage_Volume (void *data, void *dum);
+
+void mai3d (Mesh * M, int Asked);
+void Init_Mesh (Mesh * M, int all);
+void GetStatistics (double s[50]);
+void Maillage_Dimension_0 (Mesh * M);
+void Maillage_Dimension_1 (Mesh * M);
+void Maillage_Dimension_2 (Mesh * M);
+void Maillage_Dimension_3 (Mesh * M);
+void mai3d (Mesh * M, int Asked);
+void Create_BgMesh (int i, double d, Mesh * m);
+void Print_Mesh (Mesh * M, char *c, int Type);
+void Read_Mesh (Mesh * M, FILE * File_GEO, int Type);
+void Degre2 (Tree_T * AllNodes, Tree_T * TreeNodes, Tree_T * TreeElm,
+	     Curve * c, Surface * s);
+double Lc_XYZ (double X, double Y, double Z, Mesh * m);
+int MeshTransfiniteSurface (Surface *sur);
+int MeshTransfiniteVolume (Volume *vol);
+int MeshCylindricalSurface (Surface * s);
+int MeshParametricSurface (Surface * s);
+int MeshEllipticSurface (Surface * sur);
+void ActionLiss (void *data, void *dummy);
+void ActionLissSurf (void *data, void *dummy);
+void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a);
+
+void Calcule_Z (void *data, void *dum);
+void Calcule_Z_Plan (void *data, void *dum);
+void Projette_Plan_Moyen (void *a, void *b);
+void Projette_Inverse (void *a, void *b);
+void Freeze_Vertex (void *a, void *b);
+void deFreeze_Vertex (void *a, void *b);
+void crEdges (Tree_T * TreeElem, Tree_T * treeedges);
+
+
+#endif
diff --git a/Mesh/MeshQuality.cpp b/Mesh/MeshQuality.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b2b668e82639594b6a8924bd91205bdf271903ac
--- /dev/null
+++ b/Mesh/MeshQuality.cpp
@@ -0,0 +1,83 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "Numeric.h"
+
+/* Fonctions calculant differents parametres donnant la qualite
+   d'un maillage (surtout 3-D)   */
+
+/* Fonction calculant le facteur gamma pour un element tetraedrique :
+               12       rho(in)
+   gamma = --------   ---------
+             sqrt(6)    max(lij)
+ */
+
+double GAMMAMAX, GAMMAMIN, GAMMA;
+int NbCalcGamma;
+
+void CalculateGamma (void *a, void *b){
+  Simplex *s = *(Simplex **) a;
+  double gamma = s->GammaShapeMeasure ();
+  NbCalcGamma++;
+  GAMMAMAX = DMAX (GAMMAMAX, gamma);
+  GAMMA += gamma;
+  GAMMAMIN = DMIN (GAMMAMIN, gamma);
+}
+
+void CalculateEta (void *a, void *b){
+  Simplex *s = *(Simplex **) a;
+  double gamma = s->EtaShapeMeasure ();
+  NbCalcGamma++;
+  GAMMAMAX = DMAX (GAMMAMAX, gamma);
+  GAMMA += gamma;
+  GAMMAMIN = DMIN (GAMMAMIN, gamma);
+}
+
+void CalculateR (void *a, void *b){
+  Simplex *s = *(Simplex **) a;
+  double gamma = s->RhoShapeMeasure ();
+  NbCalcGamma++;
+  GAMMAMAX = DMAX (GAMMAMAX, gamma);
+  GAMMA += gamma;
+  GAMMAMIN = DMIN (GAMMAMIN, gamma);
+}
+
+void Gamma_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){
+  GAMMA = 0.0;
+  GAMMAMAX = 0.0;
+  GAMMAMIN = 1.0;
+  NbCalcGamma = 0;
+  Tree_Action (v->Simplexes, CalculateGamma);
+  if (!NbCalcGamma)
+    NbCalcGamma = 1;
+  *gamma = GAMMA / (double) NbCalcGamma;
+  *gammamax = GAMMAMAX;
+  *gammamin = GAMMAMIN;
+}
+
+void Eta_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){
+  GAMMA = 0.0;
+  GAMMAMAX = 0.0;
+  GAMMAMIN = 1.0;
+  NbCalcGamma = 0;
+  Tree_Action (v->Simplexes, CalculateEta);
+  if (!NbCalcGamma)
+    NbCalcGamma = 1;
+  *gamma = GAMMA / (double) NbCalcGamma;
+  *gammamax = GAMMAMAX;
+  *gammamin = GAMMAMIN;
+}
+
+void R_Maillage (Volume * v, double *gamma, double *gammamax, double *gammamin){
+  GAMMA = 0.0;
+  GAMMAMAX = 0.0;
+  GAMMAMIN = 1.0;
+  NbCalcGamma = 0;
+  Tree_Action (v->Simplexes, CalculateR);
+  if (!NbCalcGamma)
+    NbCalcGamma = 1;
+  *gamma = GAMMA / (double) NbCalcGamma;
+  *gammamax = GAMMAMAX;
+  *gammamin = GAMMAMIN;
+}
diff --git a/Mesh/Metric.cpp b/Mesh/Metric.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d766649adcefc0e167f098aaad3879c1a9d6438c
--- /dev/null
+++ b/Mesh/Metric.cpp
@@ -0,0 +1,346 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Matrix.h"
+#include "Interpolation.h"
+
+GMSHMetric::GMSHMetric (){
+  Identity ();
+  Attractors = List_Create (2, 2, sizeof (Attractor *));
+  apply_costest = true;
+  apply_disttest = true;
+  min_cos = 0.0095;
+  max_dist = 1.e-3;
+  limite_aniso = 3000.;
+  quality_measure = QUALITY_SIMPLEX_BASED;
+}
+
+double GMSHMetric:: Local_Metric_Of_Attractors (double X, double Y, double Z,
+						double metric[3][3]){
+  int i;
+  Attractor *a, *amin;
+  double u, x1, x2, d, dmin;
+  Vertex v1 (X, Y, Z), v2, der, metr;
+
+  dmin = 1.e25;
+  amin = NULL;
+
+  for (i = 0; i < List_Nbr (Attractors); i++){
+    List_Read (Attractors, i, &a);
+    if (a->v){
+      d = sqrt ((X - a->v->Pos.X) * (X - a->v->Pos.X) +
+		(Y - a->v->Pos.Y) * (Y - a->v->Pos.Y) +
+		(Z - a->v->Pos.Z) * (Z - a->v->Pos.Z));
+    }
+    if (a->c){
+      ProjectPointOnCurve (a->c, &v1, &v2, &der);
+      d = sqrt ((X - v2.Pos.X) * (X - v2.Pos.X) +
+		(Y - v2.Pos.Y) * (Y - v2.Pos.Y) +
+		(Z - v2.Pos.Z) * (Z - v2.Pos.Z));
+      
+    }
+    /*
+      if(a->s){
+         ProjectPointOnSurface (a->c, &v1, &v2,&der);
+         d = sqrt((X-v2.Pos.X)*(X-v2.Pos.X)+
+         (Y-v2.Pos.Y)*(Y-v2.Pos.Y)+
+         (Z-v2.Pos.Z)*(Z-v2.Pos.Z));
+
+         }
+    */
+    if (d < dmin){
+      dmin = d;
+      amin = a;
+      metr = der;
+    }
+  }
+  if (amin){
+    double d1 = dmin * amin->Radius;
+    u = exp (-(d1 * d1));
+    x1 = (1. - u) + u * amin->lc1;
+    x2 = (1. - u) + u * amin->lc2;
+  }
+  if (amin && amin->v){
+    double q11 = 1. / (x1 * x1);
+    double q22 = 1. / (x2 * x2);
+    double q12 = 1. / (x1 * x2);
+    m[0][0] *= q11;
+    m[0][1] *= q12;
+    m[1][0] *= q12;
+    m[1][1] *= q22;
+    m[2][1] *= q11;
+    m[1][2] *= q12;
+    m[0][2] *= q12;
+    m[2][0] *= q12;
+    m[2][2] *= q11;
+  }
+  else if (amin && amin->c){
+    Matrix3x3 < double >NewMetric (0.), Rot (0.), RotTranspose (0.), Id (0.);
+    double xx = 0.0, yy = 0.0, zz = 0.0;
+    
+    if (metr.Pos.Z == 0.0)
+      zz = 1.0;
+    else if (metr.Pos.Y == 0.0)
+      yy = 1.0;
+    else
+      xx = 1.0;
+    
+    Vertex z (xx, yy, zz);
+    Vertex d2 = metr % z;
+    metr.norme ();
+    d2.norme ();
+    Vertex d3 = metr % d2;
+    d3.norme ();
+    
+    Id.Identity (1.0);
+    Rot.Identity (1.0);
+    
+    Id[0][0] = 1. / (x1 * x1);
+    Id[1][1] = 1. / (x2 * x2);
+    Id[2][2] = 1. / (x2 * x2);
+    
+    Rot[0][0] = metr.Pos.X;
+    Rot[0][1] = metr.Pos.Y;
+    Rot[0][2] = metr.Pos.Z;
+    Rot[1][0] = d2.Pos.X;
+    Rot[1][1] = d2.Pos.Y;
+    Rot[1][2] = d2.Pos.Z;
+    Rot[2][0] = d3.Pos.X;
+    Rot[2][1] = d3.Pos.Y;
+    Rot[2][2] = d3.Pos.Z;
+    
+    RotTranspose = Rot;
+    RotTranspose.transpose ();
+    NewMetric = RotTranspose * (Id * Rot);
+    NewMetric.copy (m);
+  }
+  else
+    u = 0.0;
+  return u;
+}
+
+
+void GMSHMetric:: setMetric (double u,double v, Surface * s){
+  double a, b, c;		// ellipsis axx+byy+cxy=1
+  double l1, l2;		// 2 eigenvalues
+
+  Identity ();
+  Vertex p = InterpolateSurface (s, u, v, 0, 0);
+  if (s->Typ != MSH_SURF_PLAN && s->Typ != MSH_SURF_REGL && s->Typ != MSH_SURF_TRIC){
+    Vertex du = InterpolateSurface (s, u, v, 1, 1);
+    Vertex dv = InterpolateSurface (s, u, v, 1, 2);
+    
+    a = du * du;
+    b = dv * dv;
+    c = du * dv;
+    
+    m[0][0] = a;
+    m[1][1] = b;
+    m[0][1] = c;
+    m[1][0] = c;
+    
+    l1 = 0.5 * ((a + b) + sqrt ((a - b) * (a - b) + 4. * c * c));
+    l2 = 0.5 * ((a + b) - sqrt ((a - b) * (a - b) + 4. * c * c));
+    
+    if (l1 == 0.0 && l2 == 0.0)
+      Identity ();
+    
+    else if (sqrt (l1 / l2) > limite_aniso){
+      // on limite les rapports de metrique a limite_ansio
+      double r = limite_aniso * limite_aniso * (l2 / l1);
+      m[0][0] = a / r;
+      m[1][1] = b * r;
+      m[0][1] = c;
+      m[1][0] = c;
+    }
+  }
+  Local_Metric_Of_Attractors (p.Pos.X, p.Pos.Y, p.Pos.Z, NULL);
+
+}
+
+void GMSHMetric:: setMetric (double x, double y, double z){
+  Identity ();
+  Local_Metric_Of_Attractors (x, y, z, NULL);
+  return;
+}
+
+void GMSHMetric:: setMetricMin (double u, double v, Surface * s){
+
+  Identity ();
+  if (s->Typ != MSH_SURF_PLAN && s->Typ != MSH_SURF_REGL && s->Typ != MSH_SURF_TRIC){
+    Vertex du = InterpolateSurface (s, u, v, 1, 1);
+    Vertex dv = InterpolateSurface (s, u, v, 1, 2);
+    double d = (du * du > dv * dv) ? du * du : dv * dv;
+    m[0][0] = d;
+    m[1][1] = d;
+  }
+
+}
+
+double GMSHMetric:: getWorstEdge (Simplex * s, Surface * surf, Vertex * v[2]){
+  double l1, l2, l3, q1, q2, q3;
+  v[0] = s->V[0];
+  v[1] = s->V[1];
+  l1 = EdgeLengthOnSurface (surf, v, 1);
+  v[0] = s->V[0];
+  v[1] = s->V[2];
+  l2 = EdgeLengthOnSurface (surf, v, 1);
+  v[0] = s->V[1];
+  v[1] = s->V[2];
+  l3 = EdgeLengthOnSurface (surf, v, 1);
+
+  q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc);
+  q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc);
+  q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc);
+
+  if (q1 >= q2 && q1 >= q3){
+    v[0] = s->V[0];
+    v[1] = s->V[1];
+    return l1;
+  }
+  else if (q2 >= q3){
+    v[0] = s->V[0];
+    v[1] = s->V[2];
+    return l2;
+  }
+  return l3;
+}
+
+void GMSHMetric:: setSimplexQuality (Simplex * s, Surface * surf){
+  if (quality_measure == QUALITY_EDGES_BASED){
+    Vertex *v[2], vv;
+    double l1, l2, l3, q1, q2, q3;
+    v[0] = s->V[0];
+    v[1] = s->V[1];
+    vv = (*v[1]) - (*v[0]);
+    l1 = LengthVector (&vv);
+    v[0] = s->V[0];
+    v[1] = s->V[2];
+    vv = (*v[1]) - (*v[0]);
+    l2 = LengthVector (&vv);
+    v[0] = s->V[1];
+    v[1] = s->V[2];
+    vv = (*v[1]) - (*v[0]);
+    l3 = LengthVector (&vv);
+    
+    q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc);
+    q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc);
+    q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc);
+    
+    s->Quality = DMAX (DMAX (q1, q2), q3) / (RacineDeTrois);
+  }
+  else{
+    s->Center_Ellipsum_2D (m);
+    s->Quality = 3. * s->Radius / (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc);
+  }
+}
+
+void GMSHMetric::setSimplexQuality (Simplex * s){
+  if (quality_measure == QUALITY_EDGES_BASED){
+    Vertex *v[2], vv;
+    double l1, l2, l3, l4, l5, l6, q1, q2, q3, q4, q5, q6;
+    v[0] = s->V[0];
+    v[1] = s->V[1];
+    vv = (*v[1]) - (*v[0]);
+    l1 = LengthVector (&vv);
+    v[0] = s->V[0];
+    v[1] = s->V[2];
+    vv = (*v[1]) - (*v[0]);
+    l2 = LengthVector (&vv);
+    v[0] = s->V[1];
+    v[1] = s->V[2];
+    vv = (*v[1]) - (*v[0]);
+    l3 = LengthVector (&vv);
+    v[0] = s->V[0];
+    v[1] = s->V[3];
+    vv = (*v[1]) - (*v[0]);
+    l4 = LengthVector (&vv);
+    v[0] = s->V[1];
+    v[1] = s->V[3];
+    vv = (*v[1]) - (*v[0]);
+    l5 = LengthVector (&vv);
+    v[0] = s->V[2];
+    v[1] = s->V[3];
+    vv = (*v[1]) - (*v[0]);
+    l6 = LengthVector (&vv);
+    
+    q1 = 2. * l1 / (s->V[0]->lc + s->V[1]->lc);
+    q2 = 2. * l2 / (s->V[0]->lc + s->V[2]->lc);
+    q3 = 2. * l3 / (s->V[1]->lc + s->V[2]->lc);
+    q4 = 2. * l4 / (s->V[0]->lc + s->V[3]->lc);
+    q5 = 2. * l5 / (s->V[1]->lc + s->V[3]->lc);
+    q6 = 2. * l6 / (s->V[2]->lc + s->V[3]->lc);
+    
+    //s->Quality = (0.5/6.)*(q1+q2+q3+q4+q5+q6);
+    
+    //double qmax = (DMAX (q1, DMAX (q2, DMAX (q3, DMAX (q4, DMAX (q5, q6))))));
+    
+    s->Quality = (q1 + q2 + q3 + q4 + q5 + q6) / (6. * RacineDeDeux);
+  }
+  else{
+    s->Center_Ellipsum_3D (m);
+    s->Quality = 4. * s->Radius / (s->V[0]->lc + s->V[1]->lc + s->V[2]->lc + s->V[3]->lc);
+  }
+}
+
+double GMSHMetric::operator () (int i, int j){
+  return m[i][j];
+}
+
+double *GMSHMetric::operator[] (int i){
+  if (i < 0 || i > 3)
+    return m[0];
+  return m[i];
+}
+
+void GMSHMetric::Identity (){
+  m[0][0] = m[1][1] = m[2][2] = 1.0;
+  m[1][0] = m[1][2] = m[0][1] = 0.0;
+  m[2][0] = m[2][1] = m[0][2] = 0.0;
+}
+
+void GMSHMetric::setMetric (double u, Curve * c){
+
+}
+
+double GMSHMetric::getLc (double u, Curve * c){
+  double l;
+  Identity ();
+  Vertex v = InterpolateCurve (c, u, 0);
+  Vertex du = InterpolateCurve (c, u, 1);
+  Local_Metric_Of_Attractors (v.Pos.X, v.Pos.Y, v.Pos.Z, NULL);
+  l = LengthVector (&du);
+  return l / v.lc;
+}
+
+double GMSHMetric::LengthVector (Vertex * v){
+  Vertex mult (v->Pos.X * m[0][0] + v->Pos.Y * m[0][1] + v->Pos.Z * m[0][2],
+	       v->Pos.X * m[1][0] + v->Pos.Y * m[1][1] + v->Pos.Z * m[1][2],
+	       v->Pos.X * m[2][0] + v->Pos.Y * m[2][1] + v->Pos.Z * m[2][2]);
+  return sqrt (mult * (*v));
+}
+
+double GMSHMetric::EdgeLengthOnSurface (Surface * s, Vertex * v[2], int cuts){
+  Vertex dv;
+
+  if (!s){
+    dv = (*v[1]) - (*v[0]);
+    return LengthVector (&dv);
+  }
+
+  dv.Pos.X = (v[1]->Pos.X - v[0]->Pos.X) / (double) cuts;
+  dv.Pos.Y = (v[1]->Pos.Y - v[0]->Pos.Y) / (double) cuts;
+
+  double l = 0.0, posu, posv;
+
+  for (int i = 0; i < cuts; i++){
+    posu = v[0]->Pos.X + dv.Pos.X * ((double) (i) + 0.5);
+    posv = v[0]->Pos.Y + dv.Pos.Y * ((double) (i) + 0.5);
+    setMetric (posu, posv, s);
+    l += LengthVector (&dv);
+  }
+  return l;
+}
diff --git a/Mesh/Metric.h b/Mesh/Metric.h
new file mode 100644
index 0000000000000000000000000000000000000000..b8df4367f0af1e74ed10319c4e9bcfad65137e7b
--- /dev/null
+++ b/Mesh/Metric.h
@@ -0,0 +1,31 @@
+class GMSHMetric
+{
+	public:
+    	double m[3][3];
+		double min_cos;
+        double max_dist;
+        bool apply_costest;
+        bool apply_disttest;
+        double limite_aniso;
+        int quality_measure;
+    public:
+    	List_T  *Attractors;
+        GMSHMetric();
+        void Identity ();
+        double EdgeLengthOnSurface (Surface *s , Vertex *v[2], int cuts);
+        double LengthVector (Vertex *v);
+        void setMetric (double u,double v ,Surface *s);
+        void setMetric (double x,double y ,double z);
+        void setMetricMin (double u,double v ,Surface *s);
+        void setSimplexQuality (Simplex *s,  Surface *surf);
+        void  setSimplexQuality (Simplex *s);
+        void setMetric (double u,Curve *c);
+        double getLc ( double u , Curve *c );
+        double operator () (int i,int j);
+        double * operator [] (int i);
+        double Local_Metric_Of_Attractors (
+    		double X, double Y, double Z,
+			double metric[3][3]);
+		double getWorstEdge (Simplex *s, Surface *surf, Vertex *v[2]);
+} ;
+
diff --git a/Mesh/Numeric.cpp b/Mesh/Numeric.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8d08f24d9907d204d5703e763e673fe735855ac5
--- /dev/null
+++ b/Mesh/Numeric.cpp
@@ -0,0 +1,487 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Numeric.h"
+#include "Interpolation.h"
+#include "nrutil.h"
+
+double myatan2 (double a, double b){
+  if (a == 0.0 && b == 0)
+    return 0.0;
+  return atan2 (a, b);
+}
+
+double myacos (double a){
+  if (a == 0)
+    return Pi * 0.5;
+  if (a == 1)
+    return 0.0;
+  return acos (a);
+}
+
+void prodve (double a[3], double b[3], double c[3]){
+  c[2] = a[0] * b[1] - a[1] * b[0];
+  c[1] = -a[0] * b[2] + a[2] * b[0];
+  c[0] = a[1] * b[2] - a[2] * b[1];
+}
+
+void prosca (double a[3], double b[3], double *c){
+  *c = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+void norme (double a[3]){
+  double mod;
+  mod = sqrt (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);
+  if (mod == 0.0)
+    return;
+  a[0] /= mod;
+  a[1] /= mod;
+  a[2] /= mod;
+}
+
+void direction (Vertex * v1, Vertex * v2, double d[3]){
+  d[0] = v2->Pos.X - v1->Pos.X;
+  d[1] = v2->Pos.Y - v1->Pos.Y;
+  d[2] = v2->Pos.Z - v1->Pos.Z;
+}
+
+void Projette (Vertex * v, double mat[3][3]){
+  double X, Y, Z;
+
+  X = v->Pos.X * mat[0][0] + v->Pos.Y * mat[0][1] + v->Pos.Z * mat[0][2];
+  Y = v->Pos.X * mat[1][0] + v->Pos.Y * mat[1][1] + v->Pos.Z * mat[1][2];
+  Z = v->Pos.X * mat[2][0] + v->Pos.Y * mat[2][1] + v->Pos.Z * mat[2][2];
+  v->Pos.X = X;
+  v->Pos.Y = Y;
+  v->Pos.Z = Z;
+}
+
+int sys2x2 (double mat[2][2], double b[2], double res[2]){
+  double det, ud, norm;
+  int i;
+
+  norm = DSQR (mat[0][0]) + DSQR (mat[1][1]) + DSQR (mat[0][1]) + DSQR (mat[1][0]);
+  det = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
+
+  if (norm == 0.0 || fabs (det) / norm < 1.e-07){
+    res[0] = res[1] = 0.0 ;
+    return 0;
+  }
+  ud = 1. / det;
+
+  res[0] = b[0] * mat[1][1] - mat[0][1] * b[1];
+  res[1] = mat[0][0] * b[1] - mat[1][0] * b[0];
+
+  for (i = 0; i < 2; i++)
+    res[i] *= ud;
+  return (1);
+}
+
+int sys3x3 (double mat[3][3], double b[3], double res[3], double *det){
+  double ud;
+  int i;
+
+  *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
+    mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
+    mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
+
+  if (*det == 0.0){
+    res[0] = res[1] = res[2] = 0.0 ;
+    return (0);
+  }
+
+  ud = 1. / (*det);
+
+  res[0] = b[0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
+    mat[0][1] * (b[1] * mat[2][2] - mat[1][2] * b[2]) +
+    mat[0][2] * (b[1] * mat[2][1] - mat[1][1] * b[2]);
+
+  res[1] = mat[0][0] * (b[1] * mat[2][2] - mat[1][2] * b[2]) -
+    b[0] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
+    mat[0][2] * (mat[1][0] * b[2] - b[1] * mat[2][0]);
+
+  res[2] = mat[0][0] * (mat[1][1] * b[2] - b[1] * mat[2][1]) -
+    mat[0][1] * (mat[1][0] * b[2] - b[1] * mat[2][0]) +
+    b[0] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
+
+  for (i = 0; i < 3; i++)
+    res[i] *= ud;
+  return (1);
+
+}
+
+int det3x3 (double mat[3][3], double *det){
+  *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
+    mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
+    mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
+  return 1;
+}
+
+int inv3x3 (double mat[3][3], double inv[3][3], double *det){
+  double ud;
+
+  *det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
+    mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
+    mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
+
+  if (*det == 0.0)
+    return (0);
+
+  ud = 1. / (*det);
+
+  inv[0][0] = ud * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]);
+  inv[0][1] = -ud * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]);
+  inv[0][2] = ud * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
+  inv[1][0] = -ud * (mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1]);
+  inv[1][1] = ud * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]);
+  inv[1][2] = -ud * (mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0]);
+  inv[2][0] = ud * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]);
+  inv[2][1] = -ud * (mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]);
+  inv[2][2] = ud * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]);
+  return (1);
+
+}
+
+
+#define  Precision 1.e-10
+#define  MaxIter 20
+
+void find_bestuv (Surface * s, double X, double Y,
+		  double *U, double *V, double *Z, int N){
+  double d, mina, min, minu, minv, Unew, Vnew;
+  static int i, j;
+  Vertex P;
+
+  d = 1. / (double) N;
+
+  for (i = 0; i <= N; i++){
+    for (j = 0; j <= N; j++){
+      Unew = ((double) i) * d;
+      Vnew = ((double) j) * d;
+      P = InterpolateSurface (s, Unew, Vnew, 0, 0);
+      if (!i && !j){
+	min = myhypot (X - P.Pos.X, Y - P.Pos.Y);
+	minu = Unew;
+	minv = Vnew;
+	*Z = P.Pos.Z;
+      }
+      else{
+	if ((mina = myhypot (X - P.Pos.X, Y - P.Pos.Y)) < min){
+	  min = mina;
+	  minu = Unew;
+	  minv = Vnew;
+	  *Z = P.Pos.Z;
+	}
+      }
+    }
+  }
+  *U = minu;
+  *V = minv;
+}
+
+void invert_singular_matrix(double **M, int n, double **I);
+
+void XYZtoUV (Surface *s, double X, double Y, double Z, double *U, double *V) {
+  double Unew,Vnew,err;
+  int    iter;
+  Vertex D_u,D_v,P;
+  double **mat, **jac ;
+
+  mat = dmatrix(1,3,1,3);
+  jac = dmatrix(1,3,1,3);
+
+  *U = *V = 0.487;
+  err = 1.0;
+  iter = 1;    
+
+  while ( err > Precision && iter < MaxIter ){
+    P   = InterpolateSurface(s, *U, *V, 0, 0);
+    D_u = InterpolateSurface(s, *U, *V, 1, 1);
+    D_v = InterpolateSurface(s, *U, *V, 1, 2);
+
+    mat[1][1] = D_u.Pos.X; 
+    mat[1][2] = D_u.Pos.Y; 
+    mat[1][3] = D_u.Pos.Z; 
+    mat[2][1] = D_v.Pos.X; 
+    mat[2][2] = D_v.Pos.Y; 
+    mat[2][3] = D_v.Pos.Z; 
+    mat[3][1] = 0.; 
+    mat[3][2] = 0.; 
+    mat[3][3] = 0.; 
+    invert_singular_matrix(mat,3,jac);
+
+    Unew = *U + jac[1][1] * (X-P.Pos.X) + jac[2][1] * (Y-P.Pos.Y) + jac[3][1] * (Z-P.Pos.Z) ;
+    Vnew = *V + jac[1][2] * (X-P.Pos.X) + jac[2][2] * (Y-P.Pos.Y) + jac[3][2] * (Z-P.Pos.Z) ;
+
+    err = DSQR(Unew - *U) + DSQR(Vnew - *V) ;
+
+    iter++;    
+    *U = Unew;
+    *V = Vnew;
+  }
+
+  if(iter == MaxIter) Msg(WARNING, "Could not converge in XYZtoUV");
+
+  if(iter > 10) Msg(WARNING, "Many (%d) iterations in XYZtoUV\n", iter);
+
+  free_dmatrix(mat,1,3,1,3);
+  free_dmatrix(jac,1,3,1,3);
+
+}
+
+void XYtoUV (Surface * s, double *X, double *Y,
+	     double *U, double *V, double *Z){
+
+  double det, Unew, Vnew, err, mat[2][2], jac[2][2];
+  int iter;
+  Vertex D_u, D_v, P;
+  double umin, umax, vmin, vmax;
+
+  if (s->Typ == MSH_SURF_NURBS){
+    umin = s->ku[0];
+    umax = s->ku[s->OrderU + s->Nu];
+    vmin = s->kv[0];
+    vmax = s->kv[s->OrderV + s->Nv];
+  }
+  else{
+    umin = vmin = 0.0;
+    umax = vmax = 1.0;
+  }
+
+  *U = *V = 0.487;
+  err = 1.0;
+  iter = 1;
+
+  while (err > Precision && iter < MaxIter){
+    P = InterpolateSurface (s, *U, *V, 0, 0);
+    D_u = InterpolateSurface (s, *U, *V, 1, 1);
+    D_v = InterpolateSurface (s, *U, *V, 1, 2);
+    mat[0][0] = D_u.Pos.X;
+    mat[0][1] = D_u.Pos.Y;
+    mat[1][0] = D_v.Pos.X;
+    mat[1][1] = D_v.Pos.Y;
+    det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
+    
+    if (det == 0.0){
+      iter = MaxIter;
+      break;
+    }
+
+    jac[0][0] = mat[1][1] / det;
+    jac[0][1] = -mat[0][1] / det;
+    jac[1][0] = -mat[1][0] / det;
+    jac[1][1] = mat[0][0] / det;
+    
+    Unew = *U + 1.0 * (jac[0][0] * (*X - P.Pos.X) + jac[1][0] * (*Y - P.Pos.Y));
+    Vnew = *V + 1.0 * (jac[0][1] * (*X - P.Pos.X) + jac[1][1] * (*Y - P.Pos.Y));
+    
+    err = DSQR (Unew - *U) + DSQR (Vnew - *V);
+    
+    iter++;
+    *U = Unew;
+    *V = Vnew;
+    if (iter == MaxIter)
+      break;
+    
+  }
+  
+  *Z = P.Pos.Z;
+
+  /*
+  if (iter == MaxIter || (fabs (Unew) >= umax || fabs (Vnew) >= vmax) ||
+      Vnew < vmin || Unew < umin){
+    find_bestuv (s, *X, *Y, U, V, Z, 30);
+    P = InterpolateSurface (s, *U, *V, 0, 0);
+    
+    *X = P.Pos.X;
+    *Y = P.Pos.Y;
+    *Z = P.Pos.Z;
+  }
+  */
+}
+
+int Oriente (List_T * cu, double n[3]){
+  int N, i, a, b, c;
+  double cosa, sina, sum, v[3], w[3], u[3];
+  Vertex *ver[3];
+
+  N = List_Nbr (cu);
+
+  sum = 0.0;
+  for (i = 0; i < N; i++){
+    if (i == N - 1){
+      a = N - 1;
+      b = 1;
+      c = 2;
+    }
+    else if (i == N - 2){
+      a = N - 2;
+      b = N - 1;
+      c = 1;
+    }
+    else{
+      a = i;
+      b = i + 1;
+      c = i + 2;
+    }
+    List_Read (cu, a, &ver[0]);
+    List_Read (cu, b, &ver[1]);
+    List_Read (cu, c, &ver[2]);
+    
+    u[0] = ver[1]->Pos.X - ver[0]->Pos.X;
+    u[1] = ver[1]->Pos.Y - ver[0]->Pos.Y;
+    u[2] = ver[1]->Pos.Z - ver[0]->Pos.Z;
+    
+    v[0] = ver[2]->Pos.X - ver[1]->Pos.X;
+    v[1] = ver[2]->Pos.Y - ver[1]->Pos.Y;
+    v[2] = ver[2]->Pos.Z - ver[1]->Pos.Z;
+    norme (u);
+    norme (v);
+    prodve (u, v, w);
+    prosca (w, n, &sina);
+    prosca (u, v, &cosa);
+    sum += myatan2 (sina, cosa);
+  }
+
+  if (sum < 0)
+    return (1);
+  else
+    return (0);
+}
+
+double angle_02pi (double A3){
+  double DP = 2 * Pi;
+  while (A3 > DP || A3 < 0.){
+    if (A3 > 0)
+      A3 -= DP;
+    else
+      A3 += DP;
+  }
+  return A3;
+}
+
+double angle_3p (Vertex * V, Vertex * P1, Vertex * P2){
+  double PA[3], PB[3], angplan;
+  double cosc, sinc, c[3];
+
+  PA[0] = P1->Pos.X - V->Pos.X;
+  PA[1] = P1->Pos.Y - V->Pos.Y;
+  PA[2] = P1->Pos.Z - V->Pos.Z;
+
+  PB[0] = P2->Pos.X - V->Pos.X;
+  PB[1] = P2->Pos.Y - V->Pos.Y;
+  PB[2] = P2->Pos.Z - V->Pos.Z;
+
+  norme (PA);
+  norme (PB);
+
+  prodve (PA, PB, c);
+
+  prosca (PA, PB, &cosc);
+  sinc = sqrt (c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
+
+  angplan = myatan2 (sinc, cosc);
+
+  return angplan;
+}
+
+double angle_plan (Vertex * V, Vertex * P1, Vertex * P2, double n[3]){
+  double PA[3], PB[3], angplan;
+  double cosc, sinc, c[3];
+
+  PA[0] = P1->Pos.X - V->Pos.X;
+  PA[1] = P1->Pos.Y - V->Pos.Y;
+  PA[2] = P1->Pos.Z - V->Pos.Z;
+
+  PB[0] = P2->Pos.X - V->Pos.X;
+  PB[1] = P2->Pos.Y - V->Pos.Y;
+  PB[2] = P2->Pos.Z - V->Pos.Z;
+
+  norme (PA);
+  norme (PB);
+
+  prodve (PA, PB, c);
+
+  prosca (PA, PB, &cosc);
+  prosca (c, n, &sinc);
+
+  angplan = myatan2 (sinc, cosc);
+
+  return angplan;
+}
+
+double angle_3pts (Vertex * a, Vertex * b, Vertex * c){
+  double L, prosca, angle;
+
+  L = myhypot ((a->Pos.X - b->Pos.X), (a->Pos.Y - b->Pos.Y)) *
+    myhypot ((b->Pos.X - c->Pos.X), (b->Pos.Y - c->Pos.Y));
+
+  prosca = ((a->Pos.X - b->Pos.X) * (c->Pos.X - b->Pos.X) +
+	    (a->Pos.Y - b->Pos.Y) * (c->Pos.Y - b->Pos.Y)) / L;
+
+  angle = acos (prosca) * 180. / (3.1415926);
+  return (angle);
+}
+
+double trapeze (IntPoint * P1, IntPoint * P2){
+  return (0.5 * (P1->lc + P2->lc) * (P2->t - P1->t));
+}
+
+
+void RecursiveIntegration (IntPoint * from, IntPoint * to, double (*f) (double X),
+			   List_T * pPoints, double Prec, int *depth){
+  IntPoint P, p1;
+  double err, val1, val2, val3;
+
+  (*depth)++;
+
+  P.t = 0.5 * (from->t + to->t);
+  P.lc = f (P.t);
+
+  val1 = trapeze (from, to);
+  val2 = trapeze (from, &P);
+  val3 = trapeze (&P, to);
+
+  err = fabs (val1 - val2 - val3);
+
+  if ((err < Prec) && (*depth > 1)){
+    List_Read (pPoints, List_Nbr (pPoints) - 1, &p1);
+    P.p = p1.p + val2;
+    List_Add (pPoints, &P);
+    
+    List_Read (pPoints, List_Nbr (pPoints) - 1, &p1);
+    to->p = p1.p + val3;
+    List_Add (pPoints, to);
+  }
+  else{
+    RecursiveIntegration (from, &P, f, pPoints, Prec, depth);
+    RecursiveIntegration (&P, to, f, pPoints, Prec, depth);
+  }
+  (*depth)--;
+}
+
+double Integration (double t1, double t2, double (*f) (double X),
+		    List_T * pPoints, double Prec){
+  int depth, i;
+  IntPoint from, to;
+
+  depth = 0;
+  from.t = t1;
+  from.lc = f (from.t);
+  from.p = 0.0;
+
+  to.t = t2;
+  to.lc = f (to.t);
+
+  List_Add (pPoints, &from);
+  RecursiveIntegration (&from, &to, f, pPoints, Prec, &depth);
+  for (i = 0; i < List_Nbr (pPoints); i++){
+    List_Read (pPoints, i, &to);
+  }
+  
+  List_Read (pPoints, List_Nbr (pPoints) - 1, &to);
+  return (to.p);
+}
diff --git a/Mesh/Numeric.h b/Mesh/Numeric.h
new file mode 100644
index 0000000000000000000000000000000000000000..e61ec8ee3e0e81b8d580bf7c203a5fa93bf972fe
--- /dev/null
+++ b/Mesh/Numeric.h
@@ -0,0 +1,31 @@
+#ifndef _NUMERIC_H_
+#define _NUMERIC_H_
+
+double myatan2 (double a, double b);
+double myacos (double a);
+void prodve (double a[3], double b[3], double c[3]);
+void prosca (double a[3], double b[3], double *c);
+void norme (double a[3]);
+void direction (Vertex * v1, Vertex * v2, double d[3]);
+void Projette (Vertex * v, double mat[3][3]);
+int sys2x2 (double mat[2][2], double b[2], double res[2]);
+int sys3x3 (double mat[3][3], double b[3], double res[3], double *det);
+int det3x3 (double mat[3][3], double *det);
+int inv3x3 (double mat[3][3], double inv[3][3], double *det);
+void find_bestuv (Surface * s, double X, double Y,
+		  double *U, double *V, double *Z, int N);
+void XYtoUV (Surface * s, double *X, double *Y,
+	     double *U, double *V, double *Z);
+void XYZtoUV (Surface *s, double X, double Y, double Z, double *U, double *V);
+int Oriente (List_T * cu, double n[3]);
+double angle_02pi (double A3);
+double angle_3p (Vertex * V, Vertex * P1, Vertex * P2);
+double angle_plan (Vertex * V, Vertex * P1, Vertex * P2, double n[3]);
+double angle_3pts (Vertex * a, Vertex * b, Vertex * c);
+double trapeze (IntPoint * P1, IntPoint * P2);
+void RecursiveIntegration (IntPoint * from, IntPoint * to, double (*f) (double X),
+			   List_T * pPoints, double Prec, int *depth);
+double Integration (double t1, double t2, double (*f) (double X),
+		    List_T * pPoints, double Prec);
+
+#endif
diff --git a/Mesh/Nurbs.cpp b/Mesh/Nurbs.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fd6a3b65702313ed67b5db7022f66d18934e1a06
--- /dev/null
+++ b/Mesh/Nurbs.cpp
@@ -0,0 +1,204 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+
+Vertex InterpolateCubicSpline (Vertex * v[4], double t, double mat[4][4],
+			       int derivee, double t1, double t2){
+  Vertex V;
+  int i, j;
+  double vec[4], T[4];
+
+  V.Pos.X = V.Pos.Y = V.Pos.Z = 0.0;
+  V.lc = t * v[1]->lc + (1. - t) * v[2]->lc;
+
+  if (derivee){
+    T[3] = 0.;
+    T[2] = 1.;
+    T[1] = 2. * t;
+    T[0] = 3. * t * t;
+  }
+  else{
+    T[3] = 1.;
+    T[2] = t;
+    T[1] = t * t;
+    T[0] = t * t * t;
+  }
+
+  for (i = 0; i < 4; i++){
+    vec[i] = 0.0;
+  }
+  
+  /* X */
+  for (i = 0; i < 4; i++){
+      for (j = 0; j < 4; j++){
+	vec[i] += mat[i][j] * v[j]->Pos.X;
+      }
+  }
+
+  for (j = 0; j < 4; j++){
+    V.Pos.X += T[j] * vec[j];
+    vec[j] = 0.0;
+  }
+
+  /* Y */
+  for (i = 0; i < 4; i++){
+    for (j = 0; j < 4; j++){
+      vec[i] += mat[i][j] * v[j]->Pos.Y;
+    }
+  }
+  
+  for (j = 0; j < 4; j++){
+    V.Pos.Y += T[j] * vec[j];
+    vec[j] = 0.0;
+  }
+  
+  /* Z */
+  for (i = 0; i < 4; i++){
+    for (j = 0; j < 4; j++){
+      vec[i] += mat[i][j] * v[j]->Pos.Z;
+    }
+  }
+  for (j = 0; j < 4; j++){
+    V.Pos.Z += T[j] * vec[j];
+    vec[j] = 0.0;
+  }
+  
+  if (derivee){
+    V.Pos.X /= ((t2 - t1));
+    V.Pos.Y /= ((t2 - t1));
+    V.Pos.Z /= ((t2 - t1));
+  }
+  
+  return V;
+}
+
+/* ------------------------------------------------------------------------ */
+/*  I n t e r p o l a t e N u r b s                                         */
+/* ------------------------------------------------------------------------ */
+
+/* B S p l i n e s   U n i f o r m e s */
+
+Vertex InterpolateUBS (Curve * Curve, double u, int derivee){
+
+  int NbControlPoints, NbKnots, NbCurves, iCurve;
+  double t, t1, t2;
+  Vertex *v[4];
+
+  NbControlPoints = List_Nbr (Curve->Control_Points);
+  NbCurves = NbControlPoints - 3;
+  NbKnots = NbControlPoints - 2;
+
+  iCurve = (int) (u * (double) NbCurves) + 1;
+
+  if (iCurve > NbCurves)
+    iCurve = NbCurves;
+
+  t1 = (double) (iCurve - 1) / (double) (NbCurves);
+  t2 = (double) (iCurve) / (double) (NbCurves);
+
+  t = (u - t1) / (t2 - t1);
+
+  List_Read (Curve->Control_Points, iCurve - 1, &v[0]);
+  List_Read (Curve->Control_Points, iCurve, &v[1]);
+  List_Read (Curve->Control_Points, iCurve + 1, &v[2]);
+  List_Read (Curve->Control_Points, iCurve + 2, &v[3]);
+
+  return InterpolateCubicSpline (v, t, Curve->mat, derivee, t1, t2);
+}
+
+/* B S p l i n e s   N o n   U n i f o r m e s */
+
+int findSpan (double u, int deg, int n, float *U){
+  if (u >= U[n])
+    return n - 1;
+  if (u <= U[0])
+    return deg;
+
+  int low = deg;
+  int high = n + 1;
+  int mid = (low + high) / 2;
+
+  while (u < U[mid] || u >= U[mid + 1]){
+    if (u < U[mid])
+      high = mid;
+    else
+      low = mid;
+    mid = (low + high) / 2;
+  }
+  return mid;
+}
+
+void basisFuns (double u, int i, int deg, float *U, double *N){
+
+  double left[1000];
+  double *right = &left[deg + 1];
+
+  double temp, saved;
+
+  //N.resize(deg+1) ;
+
+  N[0] = 1.0;
+  for (int j = 1; j <= deg; j++){
+    left[j] = u - U[i + 1 - j];
+    right[j] = U[i + j] - u;
+    saved = 0.0;
+    for (int r = 0; r < j; r++){
+      temp = N[r] / (right[r + 1] + left[j - r]);
+      N[r] = saved + right[r + 1] * temp;
+      saved = left[j - r] * temp;
+    }
+    N[j] = saved;
+  }
+}
+
+Vertex InterpolateNurbs (Curve * Curve, double u, int derivee){
+  static double Nb[1000];
+  int span = findSpan (u, Curve->degre, List_Nbr (Curve->Control_Points), Curve->k);
+  Vertex p, *v;
+
+  basisFuns (u, span, Curve->degre, Curve->k, Nb);
+  p.Pos.X = p.Pos.Y = p.Pos.Z = p.w = p.lc = 0.0;
+  for (int i = Curve->degre; i >= 0; --i){
+    List_Read (Curve->Control_Points, span - Curve->degre + i, &v);
+    p.Pos.X += Nb[i] * v->Pos.X;
+    p.Pos.Y += Nb[i] * v->Pos.Y;
+    p.Pos.Z += Nb[i] * v->Pos.Z;
+    p.w += Nb[i] * v->w;
+    p.lc += Nb[i] * v->lc;
+  }
+  return p;
+}
+
+Vertex InterpolateNurbsSurface (Surface * s, double u, double v){
+  int uspan = findSpan (u, s->OrderU, s->Nu, s->ku);
+  int vspan = findSpan (v, s->OrderV, s->Nv, s->kv);
+  double Nu[1000], Nv[1000];
+  Vertex sp, temp[1000], *pv;
+
+  basisFuns (u, uspan, s->OrderU, s->ku, Nu);
+  basisFuns (v, vspan, s->OrderV, s->kv, Nv);
+
+  int l, ll, kk;
+  for (l = 0; l <= s->OrderV; l++){
+    temp[l].Pos.X = temp[l].Pos.Y = temp[l].Pos.Z = temp[l].w = temp[l].lc = 0.0;
+    for (int k = 0; k <= s->OrderU; k++){
+      kk = uspan - s->OrderU + k;
+      ll = vspan - s->OrderV + l;
+      List_Read (s->Control_Points, kk + s->Nu * ll, &pv);
+      temp[l].Pos.X += Nu[k] * pv->Pos.X;
+      temp[l].Pos.Y += Nu[k] * pv->Pos.Y;
+      temp[l].Pos.Z += Nu[k] * pv->Pos.Z;
+      temp[l].w += Nu[k] * pv->w;
+      temp[l].lc += Nu[k] * pv->lc;
+    }
+  }
+  sp.Pos.X = sp.Pos.Y = sp.Pos.Z = sp.w = sp.lc = 0.0;
+  for (l = 0; l <= s->OrderV; l++){
+    sp.Pos.X += Nv[l] * temp[l].Pos.X;
+    sp.Pos.Y += Nv[l] * temp[l].Pos.Y;
+    sp.Pos.Z += Nv[l] * temp[l].Pos.Z;
+    sp.w += Nv[l] * temp[l].w;
+    sp.lc += Nv[l] * temp[l].lc;
+  }
+  return sp;
+}
diff --git a/Mesh/Print_Mesh.cpp b/Mesh/Print_Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0bf8f1b0436deeb019779d49fe6106267352a469
--- /dev/null
+++ b/Mesh/Print_Mesh.cpp
@@ -0,0 +1,1059 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "Tools.h"
+
+/* ------------------------------------------------------------------------ */
+/*  M S H    F O R M A T                                                    */
+/* ------------------------------------------------------------------------ */
+
+#define LINE            1
+#define TRIANGLE        2
+#define QUADRANGLE      3
+#define TETRAHEDRON     4
+#define HEXAHEDRON      5
+#define PRISM           6
+#define PYRAMID         7
+#define LINE_2          8
+#define TRIANGLE_2      9
+#define QUADRANGLE_2   10
+#define TETRAHEDRON_2  11
+#define HEXAHEDRON_2   12
+#define PRISM_2        13
+#define PYRAMID_2      14
+#define POINT          15
+
+static FILE *mshfile;
+static int MSH_NODE_NUM;
+static int MSH_VOL_NUM, MSH_ELEMENT_NUM, MSH_ADD;
+static int MSH_PHYSICAL_NUM, MSH_PHYSICAL_ORI;
+
+void print_msh_node (void *a, void *b){
+  Vertex **V;
+
+  V = (Vertex **) a;
+  fprintf (mshfile, "%d %.16g %.16g %.16g\n",
+	   (*V)->Num, (*V)->Pos.X, (*V)->Pos.Y, (*V)->Pos.Z);
+}
+
+void process_msh_nodes (Mesh * M){
+  MSH_NODE_NUM = Tree_Nbr (M->Vertices) + Tree_Nbr (M->VertexEdges);
+
+  fprintf (mshfile, "$NOE\n");
+  fprintf (mshfile, "%d\n", MSH_NODE_NUM);
+  Tree_Action (M->Vertices, print_msh_node);
+  Tree_Action (M->VertexEdges, print_msh_node);
+  fprintf (mshfile, "$ENDNOE\n");
+}
+
+void add_msh_simplex (void *a, void *b){
+  Simplex **S;
+  int i, type, nbn, nbs = 0;
+
+  S = (Simplex **) a;
+
+  if (MSH_VOL_NUM && (MSH_VOL_NUM != (*S)->iEnt))
+    return;
+
+  if (!MSH_ADD){
+    MSH_ELEMENT_NUM++;
+    return;
+  }
+
+  if (!(*S)->V[2]){
+    nbn = 2;
+    if ((*S)->VSUP){
+      type = LINE_2;
+      nbs = 1;
+    }
+    else
+      type = LINE;
+  }
+  else if (!(*S)->V[3]){
+    nbn = 3;
+    if ((*S)->VSUP){
+      type = TRIANGLE_2;
+      nbs = 3;
+    }
+    else
+      type = TRIANGLE;
+  }
+  else{
+    nbn = 4;
+    if (!MSH_VOL_NUM){
+      if ((*S)->VSUP){
+	type = QUADRANGLE_2;
+	nbs = 5;
+      }
+      else
+	type = QUADRANGLE;
+    }
+    else if ((*S)->VSUP){
+      type = TETRAHEDRON_2;
+      nbs = 1;
+    }
+    else
+      type = TETRAHEDRON;
+  }
+  
+  fprintf (mshfile, "%d %d %d %d %d",
+	   MSH_ELEMENT_NUM++, type,MSH_PHYSICAL_NUM,(*S)->iEnt, nbn + nbs);
+
+  if (MSH_PHYSICAL_ORI > 0){
+    for (i = 0; i < nbn; i++)
+      fprintf (mshfile, " %d", (*S)->V[i]->Num);
+    for (i = 0; i < nbs; i++)
+      fprintf (mshfile, " %d", (*S)->VSUP[i]->Num);
+  }
+  else{
+    for (i = 0; i < nbn; i++)
+      fprintf (mshfile, " %d", (*S)->V[nbn - i - 1]->Num);
+    for (i = 0; i < nbs; i++)
+      fprintf (mshfile, " %d", (*S)->VSUP[nbs - i - 1]->Num);
+  }
+
+  fprintf (mshfile, "\n");
+}
+
+void add_msh_hexahedron (void *a, void *b){
+  Hexahedron **H;
+  int i, type, nbn, nbs = 0;
+
+  H = (Hexahedron **) a;
+
+  if (MSH_VOL_NUM && (MSH_VOL_NUM != (*H)->iEnt))
+    return;
+
+  if (!MSH_ADD){
+    MSH_ELEMENT_NUM++;
+    return;
+  }
+
+  nbn = 8;
+  if ((*H)->VSUP){
+    type = HEXAHEDRON_2;
+    nbs = 19;
+  }
+  else
+    type = HEXAHEDRON;
+
+  fprintf (mshfile, "%d %d %d %d %d",
+	   MSH_ELEMENT_NUM++, type, MSH_PHYSICAL_NUM, (*H)->iEnt, nbn + nbs);
+
+  for (i = 0; i < nbn; i++)
+    fprintf (mshfile, " %d", (*H)->V[i]->Num);
+  for (i = 0; i < nbs; i++)
+    fprintf (mshfile, " %d", (*H)->VSUP[i]->Num);
+
+  fprintf (mshfile, "\n");
+}
+
+void add_msh_prism (void *a, void *b){
+  Prism **P;
+  int i, type, nbn, nbs = 0;
+
+  P = (Prism **) a;
+
+  if (MSH_VOL_NUM && (MSH_VOL_NUM != (*P)->iEnt))
+    return;
+
+  if (!MSH_ADD){
+    MSH_ELEMENT_NUM++;
+    return;
+  }
+
+  nbn = 6;
+  if ((*P)->VSUP){
+    type = PRISM_2;
+    nbs = 12;
+  }
+  else{
+    type = PRISM;
+  }
+
+  fprintf (mshfile, "%d %d %d %d %d",
+	   MSH_ELEMENT_NUM++, type, MSH_PHYSICAL_NUM, (*P)->iEnt, nbn + nbs);
+
+  for (i = 0; i < nbn; i++)
+    fprintf (mshfile, " %d", (*P)->V[i]->Num);
+  for (i = 0; i < nbs; i++)
+    fprintf (mshfile, " %d", (*P)->VSUP[i]->Num);
+
+  fprintf (mshfile, "\n");
+}
+
+void add_msh_point (Vertex * V){
+
+  if (!MSH_ADD){
+    MSH_ELEMENT_NUM++;
+    return;
+  }
+
+  fprintf (mshfile, "%d %d %d %d 1 %d\n",
+	   MSH_ELEMENT_NUM++, POINT, MSH_PHYSICAL_NUM, V->Num, V->Num);
+}
+
+void add_msh_elements (Mesh * M){
+  int i, j, k, Num;
+
+  PhysicalGroup *p;
+  Volume *pV;
+  Surface *ps, s;
+  Curve *pc, c;
+  Vertex *pv, v;
+
+  List_T *ListVolumes = Tree2List (M->Volumes);
+
+  for (i = 0; i < List_Nbr (M->PhysicalGroups); i++){
+    List_Read (M->PhysicalGroups, i, &p);
+    MSH_PHYSICAL_NUM = p->Num;
+
+    switch (p->Typ){
+
+    case MSH_PHYSICAL_VOLUME:
+      for (k = 0; k < List_Nbr (ListVolumes); k++){
+	List_Read (ListVolumes, k, &pV);
+	for (j = 0; j < List_Nbr (p->Entities); j++){
+	  List_Read (p->Entities, j, &Num);
+	  MSH_VOL_NUM = abs (Num);
+	  MSH_PHYSICAL_ORI = sign (Num);
+	  Tree_Action (pV->Simplexes, add_msh_simplex);
+	  Tree_Action (pV->Hexahedra, add_msh_hexahedron);
+	  Tree_Action (pV->Prisms, add_msh_prism);
+	}
+      }
+      break;
+
+    case MSH_PHYSICAL_SURFACE:
+      for (j = 0; j < List_Nbr (p->Entities); j++){
+	ps = &s;
+	List_Read (p->Entities, j, &Num);
+	ps->Num = abs (Num);
+	MSH_PHYSICAL_ORI = sign (Num);
+	if (Tree_Query (M->Surfaces, &ps))
+	  Tree_Action (ps->Simplexes, add_msh_simplex);
+      }
+      break;
+      
+    case MSH_PHYSICAL_LINE:
+      for (j = 0; j < List_Nbr (p->Entities); j++){
+	pc = &c;
+	List_Read (p->Entities, j, &Num);
+	pc->Num = abs (Num);
+	MSH_PHYSICAL_ORI = sign (Num);
+	if (Tree_Query (M->Curves, &pc))
+	  Tree_Action (pc->Simplexes, add_msh_simplex);
+      }
+      break;
+      
+    case MSH_PHYSICAL_POINT:
+      for (j = 0; j < List_Nbr (p->Entities); j++){
+	pv = &v;
+	List_Read (p->Entities, j, &Num);
+	pv->Num = abs (Num);
+	MSH_PHYSICAL_ORI = sign (Num);
+	if (Tree_Query (M->Vertices, &pv))
+	  add_msh_point (pv);
+      }
+      break;
+      
+    }
+  }
+}
+
+void process_msh_elements (Mesh * M){
+  MSH_ADD = 0;
+  MSH_ELEMENT_NUM = 1;
+  add_msh_elements (M);
+  fprintf (mshfile, "$ELM\n");
+  fprintf (mshfile, "%d\n", MSH_ELEMENT_NUM - 1);
+
+  if (MSH_ELEMENT_NUM == 1)
+    Msg (WARNING, "No elements to save: did you forget to define Physical Entities?");
+
+  MSH_ADD = 1;
+  MSH_ELEMENT_NUM = 1;
+  add_msh_elements (M);
+  fprintf (mshfile, "$ENDELM\n");
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  U N V   F O R M A T                                                     */
+/* ------------------------------------------------------------------------ */
+
+/* Numeros des enregistrements IDEAS */
+#define HEADER       151
+#define UNITS        164
+#define NODES        2411
+#define ELEMENTS     2412
+#define RESNODE      55
+#define RESELEM      56
+#define RESVECT      57
+#define GROUPOFNODES 790
+
+/* Numeros des elements IDEAS */
+#define BEAM         21
+#define BEAM2        24
+#define THINSHLL     91
+#define THINSHLL2    92
+#define QUAD         94
+#define QUAD2        95		/* Ca c'est une impro !!! */
+#define SOLIDFEM     111
+#define WEDGE        112
+#define BRICK        115
+#define SOLIDFEM2    118
+
+void process_nodes (FILE * funv, Mesh * M){
+  int nbnod;
+  double x, y, z;
+  int i, idnod;
+  Vertex *v;
+
+  List_T *Nodes = Tree2List (M->Vertices);
+
+  fprintf (funv, "%6d\n", -1);
+  fprintf (funv, "%6d\n", NODES);
+  nbnod = List_Nbr (Nodes);
+
+  for (i = 0; i < nbnod; i++){
+    List_Read (Nodes, i, &v);
+    idnod = v->Num;
+    x = v->Pos.X;
+    y = v->Pos.Y;
+    z = v->Pos.Z;
+    fprintf (funv, "%10d%10d%10d%10d\n", idnod, 1, 1, 11);
+    fprintf (funv, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", x, y, z);
+  }
+
+  List_Delete (Nodes);
+  Nodes = Tree2List (M->VertexEdges);
+  nbnod = List_Nbr (Nodes);
+
+  for (i = 0; i < nbnod; i++){
+    List_Read (Nodes, i, &v);
+    idnod = v->Num;
+    x = v->Pos.X;
+    y = v->Pos.Y;
+    z = v->Pos.Z;
+    fprintf (funv, "%10d%10d%10d%10d\n", idnod, 1, 1, 11);
+    fprintf (funv, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", x, y, z);
+  }
+  
+  fprintf (funv, "%6d\n", -1);
+}
+
+static int ELEMENT_ID;
+
+int process_2D_elements (FILE * funv, Mesh * m){
+  List_T *ListSurfaces = Tree2List (m->Surfaces);
+  List_T *ListVolumes = Tree2List (m->Volumes);
+  List_T *Elements;
+  Volume *vol;
+  List_T *AllSurfaces = List_Create (2, 2, sizeof (Surface *));
+  Simplex *sx;
+  Surface *s;
+  int nbtri = 0, i, j, nsup, n, ntot, k, geo, fetyp;
+
+  for (i = 0; i < List_Nbr (ListVolumes); i++){
+    List_Read (ListVolumes, i, &vol);
+    for (j = 0; j < List_Nbr (vol->Surfaces); j++){
+      List_Read (vol->Surfaces, j, &s);
+      if (Tree_Nbr (s->Simplexes))
+	List_Add (AllSurfaces, &s);
+    }
+  }
+
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    if (!List_Search (AllSurfaces, &s, compareSurface)){
+      Elements = Tree2List (s->Simplexes);
+      for (j = 0; j < List_Nbr (Elements); j++){
+	List_Read (Elements, j, &sx);
+	if (sx->V[3]){
+	  if (sx->VSUP){
+	    fetyp = QUAD;
+	    n = 4;
+	    nsup = 4;
+	  }
+	  else{
+	    fetyp = QUAD;
+	    n = 4;
+	    nsup = 0;
+	  }
+	}
+	else{
+	  if (sx->VSUP){
+	    fetyp = THINSHLL;
+	    n = 3;
+	    nsup = 3;
+	  }
+	  else{
+	    fetyp = THINSHLL;
+	    nsup = 0;
+	    n = 3;
+	  }
+	}
+	geo = s->Num;
+	fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", 
+		 /*ELEMENT_ID++ */ sx->Num, fetyp, geo, geo, 7, n + nsup);
+	ntot = 0;
+	for (k = 0; k < n; k++){
+	  fprintf (funv, "%10d", sx->V[k]->Num);
+	  if (ntot % 8 == 7)
+	    fprintf (funv, "\n");
+	  ntot++;
+	}
+	for (k = 0; k < nsup; k++){
+	  fprintf (funv, "%10d", sx->VSUP[k]->Num);
+	  if (ntot % 8 == 7)
+	    fprintf (funv, "\n");
+	  ntot++;
+	}
+	if (ntot - 1 % 8 != 7)
+	  fprintf (funv, "\n");
+      }
+      List_Delete (Elements);
+      nbtri += Tree_Nbr (s->Simplexes);
+    }
+  }
+  List_Delete (ListSurfaces);
+  List_Delete (ListVolumes);
+  List_Delete (AllSurfaces);
+  return 0;
+}
+
+int process_1D_elements (FILE * funv, Mesh * m){
+  List_T *ListCurves = Tree2List (m->Curves);
+  List_T *AllCurves = List_Create (2, 2, sizeof (Surface *));
+  List_T *ListSurfaces = Tree2List (m->Surfaces);
+  List_T *Elements;
+  Simplex *sx;
+  Curve *c;
+  Surface *surf;
+  int nblig = 0, k, ntot, i, j, geo, fetyp, n, nsup;
+
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &surf);
+    for (j = 0; j < List_Nbr (surf->s.Generatrices); j++){
+      List_Read (surf->s.Generatrices, j, &c);
+      if (Tree_Nbr (c->Simplexes))
+	List_Add (AllCurves, &c);
+      c = FindCurve (-c->Num, m);
+      if (Tree_Nbr (c->Simplexes))
+	List_Add (AllCurves, &c);
+    }
+  }
+
+  for (i = 0; i < List_Nbr (ListCurves); i++){
+    List_Read (ListCurves, i, &c);
+    if (!List_Search (AllCurves, &c, compareCurve)){
+      Elements = Tree2List (c->Simplexes);
+      for (j = 0; j < List_Nbr (Elements); j++){
+	nblig++;
+	List_Read (Elements, j, &sx);
+	if (sx->VSUP){
+	  fetyp = BEAM2;
+	  n = 2;
+	  nsup = 2;
+	}
+	else{
+	  fetyp = BEAM;
+	  n = 2;
+	  nsup = 0;
+	}
+	geo = c->Num;
+	fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", 
+		 /*ELEMENT_ID++ */ sx->Num, fetyp, geo, geo, 7, n + nsup);
+	ntot = 0;
+	fprintf (funv, "%10d%10d%10d\n", 0, 0, 0);
+	for (k = 0; k < n; k++){
+	  fprintf (funv, "%10d", sx->V[k]->Num);
+	  if (ntot % 8 == 7)
+	    fprintf (funv, "\n");
+	  ntot++;
+	}
+	for (k = 0; k < nsup; k++){
+	  fprintf (funv, "%10d", sx->VSUP[k]->Num);
+	  if (ntot % 8 == 7)
+	    fprintf (funv, "\n");
+	  ntot++;
+	}
+	if (ntot - 1 % 8 != 7)
+	  fprintf (funv, "\n");
+      }
+      
+      List_Delete (Elements);
+    }
+  }
+  List_Delete (AllCurves);
+  List_Delete (ListSurfaces);
+  List_Delete (ListCurves);
+  return 0;
+}
+
+int process_3D_elements (FILE * funv, Mesh * m){
+  List_T *ListVolumes = Tree2List (m->Volumes);
+  List_T *Elements;
+  Simplex *sx;
+  Volume *v;
+  int nb = 0, i, j, nsup, n, ntot, k, geo, fetyp;
+
+  for (i = 0; i < List_Nbr (ListVolumes); i++){
+    List_Read (ListVolumes, i, &v);
+    // TETRAEDRON
+    Elements = Tree2List (v->Simplexes);
+    for (j = 0; j < List_Nbr (Elements); j++){
+      List_Read (Elements, j, &sx);
+      if (sx->VSUP){
+	fetyp = SOLIDFEM;
+	n = 4;
+	nsup = 6;
+      }
+      else{
+	fetyp = SOLIDFEM;
+	nsup = 0;
+	n = 4;
+      }
+      if (sx->Volume_Simplexe () < 0){
+	Vertex *temp;
+	temp = sx->V[0];
+	sx->V[0] = sx->V[1];
+	sx->V[1] = temp;
+	if (sx->Volume_Simplexe () < 0)
+	  Msg(WARNING, "Argh... Negative Volume");
+      }
+      geo = v->Num;
+      fprintf (funv, "%10d%10d%10d%10d%10d%10d\n",
+	       ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup);
+      ntot = 0;
+      for (k = 0; k < n; k++){
+	fprintf (funv, "%10d", sx->V[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      for (k = 0; k < nsup; k++){
+	fprintf (funv, "%10d", sx->VSUP[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      if (ntot - 1 % 8 != 7)
+	fprintf (funv, "\n");
+    }
+    List_Delete (Elements);
+    nb += Tree_Nbr (v->Simplexes);
+    
+    // PRISMS
+    Elements = Tree2List (v->Prisms);
+    for (j = 0; j < List_Nbr (Elements); j++){
+      List_Read (Elements, j, &sx);
+      if (sx->VSUP){
+	fetyp = WEDGE;
+	n = 6;
+	nsup = 9;
+      }
+      else{
+	fetyp = WEDGE;
+	nsup = 0;
+	n = 6;
+      }
+      
+      geo = v->Num;
+      fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", 
+	       ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup);
+      ntot = 0;
+      for (k = 0; k < n; k++){
+	fprintf (funv, "%10d", sx->V[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      for (k = 0; k < nsup; k++){
+	fprintf (funv, "%10d", sx->VSUP[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      if (ntot - 1 % 8 != 7)
+	fprintf (funv, "\n");
+    }
+    List_Delete (Elements);
+    nb += Tree_Nbr (v->Prisms);
+    
+    // HEXAHEDRONS
+    Elements = Tree2List (v->Hexahedra);
+    for (j = 0; j < List_Nbr (Elements); j++){
+      List_Read (Elements, j, &sx);
+      if (sx->VSUP){
+	fetyp = BRICK;
+	n = 8;
+	nsup = 12;
+      }
+      else{
+	fetyp = BRICK;
+	nsup = 0;
+	n = 8;
+      }
+      
+      geo = v->Num;
+      fprintf (funv, "%10d%10d%10d%10d%10d%10d\n", 
+	       ELEMENT_ID++, fetyp, geo, geo, 7, n + nsup);
+      ntot = 0;
+      for (k = 0; k < n; k++){
+	fprintf (funv, "%10d", sx->V[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      for (k = 0; k < nsup; k++){
+	fprintf (funv, "%10d", sx->VSUP[k]->Num);
+	if (ntot % 8 == 7)
+	  fprintf (funv, "\n");
+	ntot++;
+      }
+      if (ntot - 1 % 8 != 7)
+	fprintf (funv, "\n");
+    }
+    List_Delete (Elements);
+    nb += Tree_Nbr (v->Hexahedra);
+  }
+  List_Delete (ListVolumes);
+  return nb;
+}
+
+FILE *unvfile;
+Tree_T *tree;
+
+void AddVertex (void *a, void *b){
+  Vertex *v;
+  v = *(Vertex **) a;
+  if (Tree_Search (tree, &v->Num))
+    return;
+  Tree_Add (tree, &v->Num);
+  fprintf (unvfile, "%10d%10d%2d%2d%2d%2d%2d%2d\n", v->Num, 1, 0, 1, 0, 0, 0, 0);
+  fprintf (unvfile, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", 0., 1., 0.);
+  fprintf (unvfile, "%21.16fD+00 %21.16fD+00 %21.16fD+00\n", 0., 0., 0.);
+  fprintf (unvfile, "%10d%10d%10d%10d%10d%10d\n", 0, 0, 0, 0, 0, 0);
+}
+
+void PrintGroups (Mesh * m){
+  int  nb, j, i, k;
+  Surface *ps, s;
+  Curve *pc, c;
+  Vertex *pv, v;
+  PhysicalGroup *p;
+
+  for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){
+
+    List_Read (m->PhysicalGroups, i, &p);
+    if (p->Typ == MSH_PHYSICAL_SURFACE){
+      tree = Tree_Create (sizeof (int), fcmp_absint);
+      fprintf (unvfile, "%6d\n", -1);
+      fprintf (unvfile, "%6d\n", GROUPOFNODES);
+      fprintf (unvfile, "%10d%10d\n", p->Num, 1);
+      fprintf (unvfile, "LOAD SET %2d\n", 1);
+      nb = List_Nbr (p->Entities);
+      for (j = 0; j < nb; j++){
+	ps = &s;
+	List_Read (p->Entities, j, &ps->Num);
+	if (Tree_Query (m->Surfaces, &ps))
+	  Tree_Action (ps->Vertices, AddVertex);
+      }
+      fprintf (unvfile, "%6d\n", -1);
+      //Tree_Delete(tree);
+      //free(tree);
+    }
+    if (p->Typ == MSH_PHYSICAL_LINE){
+      tree = Tree_Create (sizeof (int), fcmp_absint);
+      fprintf (unvfile, "%6d\n", -1);
+      fprintf (unvfile, "%6d\n", GROUPOFNODES);
+      fprintf (unvfile, "%10d%10d\n", p->Num, 1);
+      fprintf (unvfile, "LOAD SET %2d\n", 1);
+      nb = List_Nbr (p->Entities);
+      for (j = 0; j < nb; j++){
+	pc = &c;
+	List_Read (p->Entities, j, &pc->Num);
+	if (Tree_Query (m->Curves, &pc))
+	  for (k = 0; k < List_Nbr (pc->Vertices); k++)
+	    AddVertex (List_Pointer (pc->Vertices, k), NULL);
+      }
+      fprintf (unvfile, "%6d\n", -1);
+      //Tree_Delete(tree);
+    }
+    if (p->Typ == MSH_PHYSICAL_POINT){
+      tree = Tree_Create (sizeof (int), fcmp_absint);
+      fprintf (unvfile, "%6d\n", -1);
+      fprintf (unvfile, "%6d\n", GROUPOFNODES);
+      fprintf (unvfile, "%10d%10d\n", p->Num, 1);
+      fprintf (unvfile, "LOAD SET %2d\n", 1);
+      nb = List_Nbr (p->Entities);
+      for (j = 0; j < nb; j++){
+	pv = &v;
+	List_Read (p->Entities, j, &pv->Num);
+	if (Tree_Query (m->Vertices, &pv))
+	  AddVertex (&pv, NULL);
+      }
+      fprintf (unvfile, "%6d\n", -1);
+      //Tree_Delete(tree);
+    }
+  }
+}
+
+/* ------------------------------------------------------------------------ */
+/*  G R E F   F O R M A T                                                   */
+/* ------------------------------------------------------------------------ */
+
+void ConsecutiveNodes (Mesh * M, Tree_T * ConstecutiveNTree, Tree_T * ConsecutiveETree);
+
+static int compareFrozen (const void *a, const void *b){
+  Vertex *q, *w;
+  q = *(Vertex **) a;
+  w = *(Vertex **) b;
+  return w->Frozen - q->Frozen;
+}
+
+int process_Gref_nodes (FILE * fGref, Mesh * M,
+			Tree_T * ConsecutiveNTree, Tree_T * ConsecutiveETree){
+  int i, nbtri;
+  Vertex *v;
+  Surface *s;
+  Curve *c;
+  List_T *ListSurfaces, *ListCurves, *Nodes;
+
+  ListCurves = Tree2List (M->Curves);
+  for (i = 0; i < List_Nbr (ListCurves); i++){
+    List_Read (ListCurves, i, &c);
+    Degre2 (M->Vertices, M->VertexEdges, c->Simplexes, c, NULL);
+  }
+  List_Delete (ListCurves);
+
+  ListSurfaces = Tree2List (M->Surfaces);
+  nbtri = 0;
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Degre2 (M->Vertices, M->VertexEdges, s->Simplexes, NULL, s);
+    nbtri += Tree_Nbr (s->Simplexes);
+  }
+  List_Delete (ListSurfaces);
+
+  ConsecutiveNodes (M, ConsecutiveNTree, ConsecutiveETree);
+
+  fprintf (fGref, "%d %d %d\n", nbtri, Tree_Nbr (ConsecutiveNTree),
+	   Tree_Nbr (ConsecutiveNTree) + Tree_Nbr (ConsecutiveETree));
+
+  Nodes = Tree2List (ConsecutiveNTree);
+  for (i = 0; i < List_Nbr (Nodes); i++){
+    List_Read (Nodes, i, &v);
+    fprintf (fGref, "%21.16e ", v->Pos.X);
+    if (i % 3 == 2)
+      fprintf (fGref, "\n");
+  }
+  if ((List_Nbr (Nodes) - 1) % 3 != 2)
+    fprintf (fGref, "\n");
+  for (i = 0; i < List_Nbr (Nodes); i++){
+    List_Read (Nodes, i, &v);
+    fprintf (fGref, "%21.16e ", v->Pos.Y);
+    if (i % 3 == 2)
+      fprintf (fGref, "\n");
+  }
+  if ((List_Nbr (Nodes) - 1) % 3 != 2)
+    fprintf (fGref, "\n");
+  i = Tree_Nbr (ConsecutiveNTree);
+  List_Delete (Nodes);
+  return i;
+}
+
+int find_physicalentity (Vertex * v, Mesh * m){
+  PhysicalGroup *p;
+  Curve *c;
+  int i, j;
+  for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){
+    List_Read (m->PhysicalGroups, i, &p);
+    if (p->Typ == MSH_PHYSICAL_POINT){
+      if (List_Search (p->Entities, &v->Num, fcmp_absint)){
+	return p->Num;
+      }
+    }
+  }
+  
+  if (v->ListCurves){
+
+      for (i = 0; i < List_Nbr (m->PhysicalGroups); i++){
+	List_Read (m->PhysicalGroups, i, &p);
+	if (p->Typ == MSH_PHYSICAL_LINE){
+	  for (j = 0; j < List_Nbr (v->ListCurves); j++){
+	    List_Read (v->ListCurves, j, &c);
+	    if (List_Search (p->Entities, &c->Num, fcmp_absint)){
+	      return p->Num;
+	    }
+	  }
+	}
+      }
+  }
+  return 0;
+}
+
+void process_Gref_poundarybonditions (FILE * fGref, Mesh * M,
+				      Tree_T * TRN, Tree_T * TRE){
+  int i, ent;
+  Vertex *v;
+
+  List_T *Nodes = Tree2List (TRN);
+  for (i = 0; i < List_Nbr (Nodes); i++){
+    List_Read (Nodes, i, &v);
+    ent = find_physicalentity (v, M);
+    fprintf (fGref, "%d %d ", ent, ent);
+    if (i % 3 == 2)
+      fprintf (fGref, "\n");
+  }
+  if ((List_Nbr (Nodes) - 1) % 3 != 2)
+    fprintf (fGref, "\n");
+  List_Delete (Nodes);
+
+  Nodes = Tree2List (TRE);
+  for (i = 0; i < List_Nbr (Nodes); i++){
+    List_Read (Nodes, i, &v);
+    ent = find_physicalentity (v, M);
+    fprintf (fGref, "%d %d ", ent, ent);
+    if (i % 3 == 2)
+      fprintf (fGref, "\n");
+  }
+  if ((List_Nbr (Nodes) - 1) % 3 != 2)
+    fprintf (fGref, "\n");
+  List_Delete (Nodes);
+}
+
+void process_Gref_elements (FILE * fGref, Mesh * M, int nn){
+  int i, j;
+  Simplex *sx;
+  Surface *s;
+  List_T *Triangles;
+  List_T *ListSurfaces;
+
+  ListSurfaces = Tree2List (M->Surfaces);
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	fprintf (fGref, "%d %d %d\n", -sx->V[0]->Frozen, -sx->V[1]->Frozen, -sx->V[2]->Frozen);
+      else
+	fprintf (fGref, "%d %d %d %d\n", -sx->V[0]->Frozen,
+		 -sx->V[1]->Frozen,
+		 -sx->V[2]->Frozen,
+		 -sx->V[3]->Frozen);
+      
+    }
+    List_Delete (Triangles);
+  }
+
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	fprintf (fGref, "%d %d %d\n", -sx->VSUP[0]->Frozen - nn,
+		 -sx->VSUP[1]->Frozen - nn,
+		 -sx->VSUP[2]->Frozen - nn);
+      else
+	fprintf (fGref, "%d %d %d %d\n", -sx->VSUP[0]->Frozen - nn,
+		 -sx->VSUP[1]->Frozen - nn,
+		 -sx->VSUP[2]->Frozen - nn,
+		 -sx->VSUP[3]->Frozen - nn);
+    }
+    List_Delete (Triangles);
+  }
+  // Degres de Liberte
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	fprintf (fGref, "%d %d %d %d %d %d %d %d %d %d %d %d\n",
+		 -2 * sx->V[0]->Frozen - 1,
+		 -2 * sx->V[0]->Frozen,
+		 -2 * sx->VSUP[0]->Frozen - 1,
+		 -2 * sx->VSUP[0]->Frozen,
+		 -2 * sx->V[1]->Frozen - 1,
+		 -2 * sx->V[1]->Frozen,
+		 -2 * sx->VSUP[1]->Frozen - 1,
+		 -2 * sx->VSUP[1]->Frozen,
+		 -2 * sx->V[2]->Frozen - 1,
+		 -2 * sx->V[2]->Frozen,
+		 -2 * sx->VSUP[2]->Frozen - 1,
+		 -2 * sx->VSUP[2]->Frozen);
+      else
+	fprintf (fGref, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+		 -2 * sx->V[0]->Frozen - 1,
+		 -2 * sx->V[0]->Frozen,
+		 -2 * sx->VSUP[0]->Frozen - 1,
+		 -2 * sx->VSUP[0]->Frozen,
+		 -2 * sx->V[1]->Frozen - 1,
+		 -2 * sx->V[1]->Frozen,
+		 -2 * sx->VSUP[1]->Frozen - 1,
+		 -2 * sx->VSUP[1]->Frozen,
+		 -2 * sx->V[2]->Frozen - 1,
+		 -2 * sx->V[2]->Frozen,
+		 -2 * sx->VSUP[2]->Frozen - 1,
+		 -2 * sx->VSUP[2]->Frozen,
+		 -2 * sx->V[3]->Frozen - 1,
+		 -2 * sx->V[3]->Frozen,
+		 -2 * sx->VSUP[3]->Frozen - 1,
+		 -2 * sx->VSUP[3]->Frozen);
+    }
+    List_Delete (Triangles);
+  }
+  List_Delete (ListSurfaces);
+}
+
+FILE *Greffile;
+
+void ConsecutiveNodes (Mesh * M, Tree_T * ConsecutiveNTree, Tree_T * ConsecutiveETree){
+  int i, j, k;
+  Simplex *sx;
+  Surface *s;
+  List_T *Triangles;
+  int nbnod, nbedges, nbdof;
+  List_T *ListSurfaces;
+
+  int newnum = 0, N;
+
+  ListSurfaces = Tree2List (M->Surfaces);
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	N = 3;
+      else
+	N = 4;
+      for (k = 0; k < N; k++){
+	if (sx->V[k]->Frozen >= 0){
+	  sx->V[k]->Frozen = --newnum;
+	  Tree_Insert (ConsecutiveNTree, &(sx->V[k]));
+	}
+      }
+    }
+    List_Delete (Triangles);
+  }
+  nbnod = -newnum;
+  ListSurfaces = Tree2List (M->Surfaces);
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	N = 3;
+      else
+	N = 4;
+      for (k = 0; k < N; k++){
+	if (sx->VSUP[k]->Frozen >= 0){
+	  sx->VSUP[k]->Frozen = --newnum;
+	  Tree_Insert (ConsecutiveETree, &(sx->VSUP[k]));
+	}
+      }
+    }
+    List_Delete (Triangles);
+  }
+  nbedges = -newnum - nbnod;
+  nbdof = nbnod + nbedges;
+}
+
+void EndConsecutiveNodes (Mesh * M){
+  int i, j, k;
+  Simplex *sx;
+  Surface *s;
+  List_T *Triangles;
+  List_T *ListSurfaces;
+  int N;
+
+  ListSurfaces = Tree2List (M->Surfaces);
+  for (i = 0; i < List_Nbr (ListSurfaces); i++){
+    List_Read (ListSurfaces, i, &s);
+    Triangles = Tree2List (s->Simplexes);
+    for (j = 0; j < List_Nbr (Triangles); j++){
+      List_Read (Triangles, j, &sx);
+      if (!sx->V[3])
+	N = 3;
+      else
+	N = 4;
+      for (k = 0; k < N; k++)
+	sx->V[k]->Frozen = 0;
+      for (k = 0; k < N; k++)
+	sx->VSUP[k]->Frozen = 0;
+    }
+    List_Delete (Triangles);
+  }
+  List_Delete (ListSurfaces);
+}
+
+/* ------------------------------------------------------------------------ */
+/*  P r i n t _ M e s h                                                     */
+/* ------------------------------------------------------------------------ */
+
+void Print_Mesh (Mesh * M, char *c, int Type){
+  char name[256];
+  strcpy (name, M->name);
+
+  if (Type == FORMAT_MSH){
+    c ? strcpy (name, c) : strcat (name, ".msh");
+    mshfile = fopen (name, "w");
+    if (!mshfile){
+      Msg(WARNING, "Unable to Open File '%s'", name);
+      return;
+    }
+    Msg (INFOS, "Writing file %s", name);
+    process_msh_nodes (M);
+    process_msh_elements (M);
+    Msg (INFOS, "Wrote %d Nodes, %d Elements", MSH_NODE_NUM, MSH_ELEMENT_NUM - 1);
+    fclose (mshfile);
+  }
+  else if (Type == FORMAT_UNV){
+    c ? strcpy (name, c) : strcat (name, ".unv");
+    unvfile = fopen (name, "w");
+    if (!unvfile){
+      Msg(WARNING, "Unable to Open File '%s'", name);
+      return;
+    }
+    Msg (INFOS, "Writing file %s", name);
+    process_nodes (unvfile, M);
+    fprintf (unvfile, "%6d\n", -1);
+    fprintf (unvfile, "%6d\n", ELEMENTS);
+    ELEMENT_ID = 1;
+    process_3D_elements (unvfile, M);
+    process_2D_elements (unvfile, M);
+    process_1D_elements (unvfile, M);
+    fprintf (unvfile, "%6d\n", -1);
+    PrintGroups (M);
+    fclose (unvfile);
+  }
+  else if (Type == FORMAT_GREF){
+    c ? strcpy (name, c) : strcat (name, ".Gref");
+    Tree_T *TRN = Tree_Create (sizeof (Vertex *), compareFrozen);
+    Tree_T *TRE = Tree_Create (sizeof (Vertex *), compareFrozen);
+    Greffile = fopen (name, "w");
+    if (!Greffile){
+      Msg(WARNING, "Unable to Open File '%s'", name);
+      return;
+    }
+    Msg (INFOS, "Writing file %s", name);
+    process_Gref_nodes (Greffile, M, TRN, TRE);
+    process_Gref_elements (Greffile, M, Tree_Nbr (TRN));
+    process_Gref_poundarybonditions (Greffile, M, TRN, TRE);
+    fclose (Greffile);
+    Tree_Delete (TRN);
+    Tree_Delete (TRE);
+    EndConsecutiveNodes (M);
+  }
+}
diff --git a/Mesh/Read_Mesh.cpp b/Mesh/Read_Mesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..178c9daee6b28dfe088c2d4d87601c33b9c44af0
--- /dev/null
+++ b/Mesh/Read_Mesh.cpp
@@ -0,0 +1,226 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "MinMax.h"
+
+/* ------------------------------------------------------------------------ */
+/*  M S H    F O R M A T                                                    */
+/* ------------------------------------------------------------------------ */
+
+#define LGN1 1
+#define TRI1 2
+#define QUA1 3
+#define TET1 4
+#define HEX1 5
+#define PRI1 6
+#define PYR1 7
+#define LGN2 8
+#define TRI2 9
+#define QUA2 10
+#define TET2 11
+#define HEX2 12
+#define PRI2 13
+#define PYR2 14
+#define PNT  15 
+
+#define NB_NOD_MAX_ELM 20
+
+/* relecture maillage au format MSH */
+
+void Read_Mesh_MSH (Mesh *M, FILE *File_GEO){
+
+  char String[256];
+  int  Nbr_Nodes, Nbr_Elements, i_Node, i_Element;
+  int  Num, Type, Physical, Elementary, i, j;
+  double x , y , z, lc1, lc2 ;
+  Vertex *vert , verts[NB_NOD_MAX_ELM] ,*vertsp[NB_NOD_MAX_ELM] , **vertspp;
+  Simplex *simp ;
+  Hexahedron *hex ;
+  Prism *pri ;
+  Curve   C , *c , **cc;
+  Surface S , *s , **ss;
+  Volume  V , *v , **vv;
+
+  while (1) {
+    do { 
+      fgets(String,sizeof(String), File_GEO) ; 
+      if (feof(File_GEO))  break ;
+    } while (String[0] != '$') ;  
+    
+    if (feof(File_GEO))  break ;
+
+    /*  P T S  */
+
+    if (!strncmp(&String[1], "PTS", 3)) {
+
+      fscanf(File_GEO, "%d", &Nbr_Nodes) ;
+      Msg(INFOS, "%d Points", Nbr_Nodes);
+
+      for (i_Node = 0 ; i_Node < Nbr_Nodes ; i_Node++) {
+	fscanf(File_GEO, "%d %lf %lf %lf %lf %lf", &Num, &x, &y, &z, &lc1, &lc2) ;
+	vert = Create_Vertex (Num, x, y, z, lc1 , lc2);
+	Tree_Replace(M->Points, &vert) ;
+      }
+    }
+
+    /*  N O E  */
+
+    if (!strncmp(&String[1], "NO", 2)) { /* $NOE or $NOD */
+
+      fscanf(File_GEO, "%d", &Nbr_Nodes) ;
+      Msg(INFOS, "%d Nodes", Nbr_Nodes);
+
+      for (i_Node = 0 ; i_Node < Nbr_Nodes ; i_Node++) {
+	fscanf(File_GEO, "%d %lf %lf %lf", &Num, &x, &y, &z) ;
+	vert = Create_Vertex (Num, x, y, z, 1.0 ,0.0);
+	Tree_Replace(M->Vertices, &vert) ;
+      }
+    }
+
+    /* ELEMENTS */
+
+    else if (!strncmp(&String[1], "ELM", 3)) {
+
+      fscanf(File_GEO, "%d", &Nbr_Elements) ;
+      Msg(INFOS, "%d Elements", Nbr_Elements);
+
+      for (i_Element = 0 ; i_Element < Nbr_Elements ; i_Element++) {
+	
+	fscanf(File_GEO, "%d %d %d %d %d", 
+	       &Num, &Type, &Physical, &Elementary, &Nbr_Nodes) ;
+	
+	for (j = 0 ; j < Nbr_Nodes ; j++)
+	  fscanf(File_GEO, "%d", &verts[j].Num) ;
+	
+	switch(Type){
+	case LGN1: case LGN2:
+	  c = &C; c->Num = Elementary;
+	  if(!(cc = (Curve**)Tree_PQuery(M->Curves, &c))){
+	    c = Create_Curve(Elementary, MSH_SEGM_LINE, 0, NULL,
+			     NULL, 0, 1, 0., 1.);
+	    Tree_Add(M->Curves, &c);
+	  }
+	  else
+	    c = *cc;
+	  break;
+	case TRI1: case QUA1: case TRI2: case QUA2:
+	  s = &S; s->Num = Elementary;
+	  if(!(ss = (Surface**)Tree_PQuery(M->Surfaces, &s))){
+	    s = Create_Surface(Elementary, MSH_SURF_PLAN, Elementary);
+	    Tree_Add(M->Surfaces, &s);
+	  }
+	  else
+	    s = *ss;
+	  break;
+	case TET1: case HEX1: case PRI1: case TET2: case HEX2: case PRI2: 
+	  v = &V; v->Num = Elementary;
+	  if(!(vv = (Volume**)Tree_PQuery(M->Volumes, &v))){
+	    v = Create_Volume(Elementary, MSH_VOLUME, Elementary);
+	    Tree_Add(M->Volumes, &v);
+	  }
+	  else
+	    v = *vv;
+	  break;
+	default :
+	  break;
+	}
+
+	for(i=0 ; i<Nbr_Nodes ; i++) {
+	  vertsp[i] = &verts[i];
+	  if(!(vertspp = (Vertex**)Tree_PQuery(M->Vertices, &vertsp[i])))
+	    Msg(ERROR, "Unknown Vertex %d in Element %d", verts[i].Num, Num);
+	  else
+	    vertsp[i] = *vertspp;
+	}
+
+	switch(Type){
+	case LGN1:
+	  simp = Create_Simplex(vertsp[0], vertsp[1], NULL , NULL);
+	  simp->Num = Num ;
+	  simp->iEnt = Elementary ;
+	  Tree_Insert(c->Simplexes, &simp) ;
+	  Tree_Insert(M->Simplexes, &simp) ; 
+	  break;
+	case TRI1:
+	  simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], NULL);
+	  simp->Num = Num ;
+	  simp->iEnt = Elementary ;
+	  Tree_Insert(s->Simplexes, &simp) ;
+	  Tree_Insert(M->Simplexes, &simp) ;
+	  break;
+	case QUA1:
+	  /* ! Fuck, fuck, fuck */
+	  simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], NULL);
+	  simp->V[3] = vertsp[3];
+	  simp->Num = Num ;
+	  simp->iEnt = Elementary ;
+	  Tree_Insert(s->Simplexes, &simp) ;
+	  Tree_Insert(M->Simplexes, &simp) ;
+	  break;
+	case TET1:
+	  simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], vertsp[3]);
+	  simp->Num = Num ;
+	  simp->iEnt = Elementary ;
+	  Tree_Insert(v->Simplexes, &simp) ;
+	  Tree_Insert(M->Simplexes, &simp) ;
+	  break;
+	case HEX1:
+	  hex = Create_Hexahedron(vertsp[0], vertsp[1], vertsp[2], vertsp[3],
+				  vertsp[4], vertsp[5], vertsp[6], vertsp[7]);
+	  hex->Num = Num ;
+	  hex->iEnt = Elementary ;
+	  Tree_Insert(v->Hexahedra, &hex) ;
+	  break;
+	case PRI1:
+	  pri = Create_Prism(vertsp[0], vertsp[1], vertsp[2], 
+			     vertsp[3], vertsp[4], vertsp[5]);
+	  pri->Num = Num ;
+	  pri->iEnt = Elementary ;
+	  Tree_Insert(v->Prisms, &pri) ;
+	  break;
+	case PNT:
+	  break;
+	default :
+	  Msg(WARNING, "Unknown Type of Element in Read_Mesh");
+	  break;
+	}
+      }
+
+    }
+
+    do {
+      fgets(String, 256, File_GEO) ;
+      if (feof(File_GEO)) Msg(ERROR, "Prematured End of Mesh File");
+    } while (String[0] != '$') ;
+    
+  }   
+
+  if(Tree_Nbr(M->Volumes))
+    M->status = 3 ;
+  else if(Tree_Nbr(M->Surfaces))
+    M->status = 2 ;
+  else if(Tree_Nbr(M->Curves))
+    M->status = 1 ;
+  else if(Tree_Nbr(M->Points))
+    M->status = 0 ;
+  else
+    M->status = -1 ;
+
+  CalculateMinMax(M->Points);
+  
+}
+
+/* ------------------------------------------------------------------------ */
+/*  R e a d _ M e s h                                                       */
+/* ------------------------------------------------------------------------ */
+
+void Read_Mesh (Mesh *M, FILE *File_GEO, int type){
+
+  switch(type){
+  case FORMAT_MSH : Read_Mesh_MSH(M,File_GEO); break;
+  default : Msg(WARNING, "Unkown Mesh File Format to Read"); break;
+  }
+
+}
diff --git a/Mesh/STL.cpp b/Mesh/STL.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f2f34241cf21f922311163ad4567f9767c52391e
--- /dev/null
+++ b/Mesh/STL.cpp
@@ -0,0 +1,73 @@
+
+#include "Gmsh.h"
+#include "Mesh.h"
+
+extern Mesh *THEM;
+
+STL_Data::STL_Data (){
+  Vertices = Tree_Create (sizeof (Vertex *), comparePosition);
+  Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
+  LSimplexes = NULL;
+  LVertices = NULL;
+}
+
+STL_Data::~STL_Data (){
+}
+
+void STL_Data::Add_Facet (double x1, double y1, double z1,
+			  double x2, double y2, double z2,
+			  double x3, double y3, double z3){
+  Vertex **ppv;
+  Vertex *v1 = Create_Vertex (Tree_Nbr (Vertices) + 1, x1, y1, z1, 1, 0);
+
+  if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v1))){
+    delete v1;
+    v1 = *ppv;
+  }
+  else{
+    Tree_Add (Vertices, &v1);
+    Tree_Add (THEM->Points, &v1);
+  }
+
+  Vertex *v2 = Create_Vertex (Tree_Nbr (Vertices) + 1, x2, y2, z2, 1, 0);
+  if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v2))){
+    delete v2;
+    v2 = *ppv;
+  }
+  else{
+    Tree_Add (Vertices, &v2);
+    Tree_Add (THEM->Points, &v2);
+  }
+
+  Vertex *v3 = Create_Vertex (Tree_Nbr (Vertices) + 1, x3, y3, z3, 1, 0);
+  if ((ppv = (Vertex **) Tree_PQuery (Vertices, &v3))){
+    delete v3;
+    v3 = *ppv;
+  }
+  else{
+    Tree_Add (Vertices, &v3);
+    Tree_Add (THEM->Points, &v3);
+  }
+  Simplex *s = Create_Simplex (v1, v2, v3, NULL);
+  Tree_Add (Simplexes, &s);
+}
+
+void STL_Data::GetFacet (int ifac, int &v1, int &v2, int &v3){
+  Simplex *s;
+  if (!LSimplexes)
+    LSimplexes = Tree2List (Simplexes);
+  List_Read (LSimplexes, ifac - 1, &s);
+  v1 = s->V[0]->Num;
+  v2 = s->V[1]->Num;
+  v3 = s->V[2]->Num;
+}
+
+void STL_Data::GetVertex (int i, double &x, double &y, double &z){
+  Vertex *v;
+  if (!LVertices)
+    LVertices = Tree2List (Vertices);
+  List_Read (LVertices, i - 1, &v);
+  x = v->Pos.X;
+  y = v->Pos.Y;
+  z = v->Pos.Z;
+}
diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5d89409a2733a3467dce594453c7729ae3ad91f0
--- /dev/null
+++ b/Mesh/SecondOrder.cpp
@@ -0,0 +1,146 @@
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Interpolation.h"
+#include "Numeric.h"
+
+extern int CurrentNodeNumber;
+
+static Surface *THES;
+static Curve *THEC;
+
+Vertex *middlecurve (Vertex * v1, Vertex * v2){
+  Vertex v, *pv;
+
+  if (!THEC)
+    return NULL;
+
+  if ((v1->ListCurves && List_Nbr (v1->ListCurves) != 1) ||
+      (v2->ListCurves && List_Nbr (v2->ListCurves) != 1)){
+    v.Pos.X = (v1->Pos.X + v2->Pos.X) * 0.5;
+    v.Pos.Y = (v1->Pos.Y + v2->Pos.Y) * 0.5;
+    v.Pos.Z = (v1->Pos.Z + v2->Pos.Z) * 0.5;
+  }
+  else
+    v = InterpolateCurve (THEC, 0.5 * (v1->u + v2->u), 0);
+
+  pv = Create_Vertex (++CurrentNodeNumber, v.Pos.X, v.Pos.Y, v.Pos.Z, v.lc, v.u);
+
+  if (!pv->ListCurves){
+    pv->ListCurves = List_Create (1, 1, sizeof (Curve *));
+  }
+  List_Add (pv->ListCurves, &THEC);
+  return pv;
+}
+
+Vertex *middleface (Vertex * v1, Vertex * v2){
+  Vertex v, *pv;
+  double U, V, U1, U2, V1, V2;
+
+  if (!THES)
+    return NULL;
+  if (THES->Typ == MSH_SURF_PLAN)
+    return NULL;
+
+  XYZtoUV ( THES , v1->Pos.X , v1->Pos.Y , v1->Pos.Z, &U1 , &V1 );    
+  XYZtoUV ( THES , v2->Pos.X , v2->Pos.Y , v2->Pos.Z, &U2 , &V2 );    
+
+  U = 0.5 *(U1+U2);
+  V = 0.5 *(V1+V2);
+  v = InterpolateSurface(THES,U,V,0,0);
+  pv = Create_Vertex(++CurrentNodeNumber,v.Pos.X,v.Pos.Y,v.Pos.Z,v.lc,v.u);
+  return pv;
+}
+
+extern int edges_tetra[6][2];
+extern int edges_quad[4][2];
+static Tree_T *THET;
+extern int EdgesInVolume;
+
+void PutMiddlePoint (void *a, void *b){
+  Edge *ed;
+  Simplex *s;
+  Vertex *v;
+  int i, j, k, N, c;
+  int edges[6][2];
+
+  ed = (Edge *) a;
+
+  if (ed->newv)
+    v = ed->newv;
+  else if ((v = middlecurve (ed->V[0], ed->V[1])));
+  else if ((v = middleface (ed->V[0], ed->V[1])));
+  else
+    v = Create_Vertex (++CurrentNodeNumber,
+		       0.5 * (ed->V[0]->Pos.X + ed->V[1]->Pos.X),
+		       0.5 * (ed->V[0]->Pos.Y + ed->V[1]->Pos.Y),
+		       0.5 * (ed->V[0]->Pos.Z + ed->V[1]->Pos.Z),
+		       0.5 * (ed->V[0]->lc + ed->V[1]->lc),
+		       0.5 * (ed->V[0]->u + ed->V[1]->u));
+  ed->newv = v;
+  Tree_Insert (THET, &v);
+  for (i = 0; i < List_Nbr (ed->Simplexes); i++){
+    List_Read (ed->Simplexes, i, &s);
+    if (s->V[3] && EdgesInVolume){
+      if (!s->VSUP)
+	s->VSUP = (Vertex **) Malloc (6 * sizeof (Vertex *));
+      N = 6;
+      for (k = 0; k < N; k++)
+	for (j = 0; j < 2; j++)
+	  edges[k][j] = edges_tetra[k][j];
+    }
+    else if (s->V[3]){
+      if (!s->VSUP)
+	s->VSUP = (Vertex **) Malloc (4 * sizeof (Vertex *));
+      N = 4;
+      for (k = 0; k < N; k++)
+	for (j = 0; j < 2; j++)
+	  edges[k][j] = edges_quad[k][j];
+    }
+    else if (s->V[2]){
+      if (!s->VSUP)
+	s->VSUP = (Vertex **) Malloc (3 * sizeof (Vertex *));
+      N = 3;
+      for (k = 0; k < N; k++)
+	for (j = 0; j < 2; j++)
+	  edges[k][j] = edges_tetra[k][j];
+    }
+    else{
+      if (!s->VSUP)
+	s->VSUP = (Vertex **) Malloc (sizeof (Vertex *));
+      N = 1;
+      for (k = 0; k < N; k++)
+	for (j = 0; j < 2; j++)
+	  edges[k][j] = edges_tetra[k][j];
+    }
+    c = 0;
+    for (j = 0; j < N; j++){
+      if ((!compareVertex (&s->V[edges[j][0]], &ed->V[0]) &&
+	   !compareVertex (&s->V[edges[j][1]], &ed->V[1])) ||
+	  (!compareVertex (&s->V[edges[j][0]], &ed->V[1]) &&
+	   !compareVertex (&s->V[edges[j][1]], &ed->V[0]))){
+	s->VSUP[j] = v;
+      }
+    }
+  }
+}
+
+void Degre2 (Tree_T * AllNodes, Tree_T * TreeNodes, Tree_T * TreeElm,
+	     Curve * c, Surface * s){
+  static Tree_T *TreeEdges = NULL;
+
+  THES = s;
+  THEC = c;
+  THET = TreeNodes;
+
+  if (!TreeEdges)
+    TreeEdges = Tree_Create (sizeof (Edge), compareedge);
+
+  if (THES || THEC)
+    EdgesInVolume = 0;
+
+  crEdges (TreeElm, TreeEdges);
+  Tree_Action (TreeEdges, PutMiddlePoint);
+  EdgesInVolume = 1;
+}
diff --git a/Mesh/Simplex.cpp b/Mesh/Simplex.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c35f0c763c7003af04061172c2f89666734e0d1d
--- /dev/null
+++ b/Mesh/Simplex.cpp
@@ -0,0 +1,763 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Simplex.h"
+#include "Numeric.h"
+
+int Simplex::TotalAllocated = 0;
+int Simplex::TotalNumber = 0;
+
+extern Simplex MyNewBoundary;
+
+int FACE_DIMENSION = 2;
+
+Simplex::Simplex (){
+  TotalAllocated++;
+  TotalNumber++;
+  VSUP = NULL;
+  V[0] = V[1] = V[2] = V[3] = NULL;
+  S[0] = S[1] = S[2] = S[3] = NULL;
+  iEnt = -1;
+  Quality = 0. ;
+  Num = TotalNumber;
+}
+
+Simplex::Simplex (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){
+  TotalAllocated++;
+  TotalNumber++;
+  VSUP = NULL;
+  S[0] = S[1] = S[2] = S[3] = NULL;
+  Quality = 0. ;
+  Fourre_Simplexe (v1, v2, v3, v4);
+  Num = TotalNumber;
+  iEnt = -1;
+}
+
+Simplex::~Simplex (){
+  TotalAllocated--;
+}
+
+int Simplex:: CircumCircle (double x1, double y1, 
+			    double x2, double y2, 
+			    double x3, double y3,
+			    double *xc, double *yc){
+  double d, a1, a2, a3;
+
+  d = 2. * (double) (y1 * (x2 - x3) + y2 * (x3 - x1) + y3 * (x1 - x2));
+  if (d == 0.0){
+    *xc = *yc = -99999.;
+    Msg(WARNING, "Degenerated Simplex");
+    return 0;
+  }
+
+  a1 = x1 * x1 + y1 * y1;
+  a2 = x2 * x2 + y2 * y2;
+  a3 = x3 * x3 + y3 * y3;
+  *xc = (double) ((a1 * (y3 - y2) + a2 * (y1 - y3) + a3 * (y2 - y1)) / d);
+  *yc = (double) ((a1 * (x2 - x3) + a2 * (x3 - x1) + a3 * (x1 - x2)) / d);
+
+  return 1;
+}
+
+void Simplex::Center_Circum (){
+  /* Calcul du centre de la boule circonscrite */
+  int i, N;
+  double X[4], Y[4], Z[4];
+  double res[3];
+
+  if (!V[3])
+    N = 3;
+  else
+    N = 4;
+
+  for (i = 0; i < N; i++){
+    X[i] = V[i]->Pos.X;
+    Y[i] = V[i]->Pos.Y;
+    Z[i] = V[i]->Pos.Z;
+  }
+
+  if (N == 3){
+    CircumCircle (V[0]->Pos.X, V[0]->Pos.Y,
+		  V[1]->Pos.X, V[1]->Pos.Y,
+		  V[2]->Pos.X, V[2]->Pos.Y,
+		  &Center.X, &Center.Y);
+    Center.Z = 0.0;
+    if (fabs (Center.X) > 1.e10)
+      Center.X = 1.e10;
+    if (fabs (Center.Y) > 1.e10)
+      Center.Y = 1.e10;
+    Radius = sqrt ((X[0] - Center.X) * (X[0] - Center.X) +
+		   (Y[0] - Center.Y) * (Y[0] - Center.Y));
+  }
+  else{
+    center_tet (X, Y, Z, res);
+    
+    Center.X = res[0];
+    Center.Y = res[1];
+    Center.Z = res[2];
+    Radius = sqrt ((X[0] - Center.X) * (X[0] - Center.X) +
+		   (Y[0] - Center.Y) * (Y[0] - Center.Y) +
+		   (Z[0] - Center.Z) * (Z[0] - Center.Z));
+  }
+}
+
+int Simplex::Pt_In_Ellipsis (Vertex * v, double Metric[3][3]){
+  double eps, d1, d2, x[2];
+
+  Center_Ellipsum_2D (Metric);
+
+  x[0] = Center.X - v->Pos.X;
+  x[1] = Center.Y - v->Pos.Y;
+
+  d1 = Radius;
+  d2 = sqrt (x[0] * x[0] * Metric[0][0]
+	     + x[1] * x[1] * Metric[1][1]
+	     + 2. * x[0] * x[1] * Metric[0][1]);
+
+  eps = fabs (d1 - d2) / (d1 + d2);
+  if (eps < 1.e-12)
+    {
+      return (1);
+    }
+  if (d2 < d1)
+    return 1;
+  return 0;
+
+}
+
+double Simplex::Volume_Simplexe2D (){
+  return ((V[1]->Pos.X - V[0]->Pos.X) *
+	  (V[2]->Pos.Y - V[1]->Pos.Y) -
+	  (V[2]->Pos.X - V[1]->Pos.X) *
+	  (V[1]->Pos.Y - V[0]->Pos.Y));
+}
+
+void Simplex::center_tet (double X[4], double Y[4], double Z[4], double res[3]){
+  double mat[3][3], b[3], dum;
+  int i;
+  b[0] = X[1] * X[1] - X[0] * X[0] +
+    Y[1] * Y[1] - Y[0] * Y[0] +
+    Z[1] * Z[1] - Z[0] * Z[0];
+  b[1] = X[2] * X[2] - X[1] * X[1] +
+    Y[2] * Y[2] - Y[1] * Y[1] +
+    Z[2] * Z[2] - Z[1] * Z[1];
+  b[2] = X[3] * X[3] - X[2] * X[2] +
+    Y[3] * Y[3] - Y[2] * Y[2] +
+    Z[3] * Z[3] - Z[2] * Z[2];
+
+  for (i = 0; i < 3; i++)
+    b[i] *= 0.5;
+
+  mat[0][0] = X[1] - X[0];
+  mat[0][1] = Y[1] - Y[0];
+  mat[0][2] = Z[1] - Z[0];
+  mat[1][0] = X[2] - X[1];
+  mat[1][1] = Y[2] - Y[1];
+  mat[1][2] = Z[2] - Z[1];
+  mat[2][0] = X[3] - X[2];
+  mat[2][1] = Y[3] - Y[2];
+  mat[2][2] = Z[3] - Z[2];
+
+  if (!sys3x3 (mat, b, res, &dum))
+    {
+      res[0] = res[1] = res[2] = 10.0e10;
+    }
+
+}
+
+double Simplex::matsimpl (double mat[3][3]){
+  mat[0][0] = V[1]->Pos.X - V[0]->Pos.X;
+  mat[0][1] = V[2]->Pos.X - V[0]->Pos.X;
+  mat[0][2] = V[3]->Pos.X - V[0]->Pos.X;
+  mat[1][0] = V[1]->Pos.Y - V[0]->Pos.Y;
+  mat[1][1] = V[2]->Pos.Y - V[0]->Pos.Y;
+  mat[1][2] = V[3]->Pos.Y - V[0]->Pos.Y;
+  mat[2][0] = V[1]->Pos.Z - V[0]->Pos.Z;
+  mat[2][1] = V[2]->Pos.Z - V[0]->Pos.Z;
+  mat[2][2] = V[3]->Pos.Z - V[0]->Pos.Z;
+  return (mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
+	  mat[1][0] * (mat[0][1] * mat[2][2] - mat[2][1] * mat[0][2]) +
+	  mat[2][0] * (mat[0][1] * mat[1][2] - mat[1][1] * mat[0][2]));
+}
+
+double Simplex::rhoin (){
+  double s1, s2, s3, s4;
+  if (V[3]){
+    s1 = fabs (AireFace (F[0].V));
+    s2 = fabs (AireFace (F[1].V));
+    s3 = fabs (AireFace (F[2].V));
+    s4 = fabs (AireFace (F[3].V));
+    return 3. * fabs (Volume_Simplexe ()) / (s1 + s2 + s3 + s4);
+  }
+  else{
+    return 1.0;
+  }
+}
+
+double Simplex::lij (int i, int j){
+  return sqrt (DSQR (V[i]->Pos.X - V[j]->Pos.X) +
+	       DSQR (V[i]->Pos.Y - V[j]->Pos.Y) +
+	       DSQR (V[i]->Pos.Z - V[j]->Pos.Z));
+}
+
+double Simplex::Volume_Simplexe (){
+  double mat[3][3];
+
+  if (V[3])
+    return (matsimpl (mat) / 6.);
+  else
+    return (surfsimpl ());
+}
+
+double Simplex::EtaShapeMeasure (){
+  int i, j;
+  double lij2 = 0.0;
+  for (i = 0; i <= 3; i++){
+    for (j = i + 1; j <= 3; j++){
+      lij2 += DSQR (lij (i, j));
+    }
+  }
+  return 12. * pow (9. * DSQR (fabs (Volume_Simplexe ())), 0.33333333) / (lij2);
+}
+
+double Simplex::RhoShapeMeasure (){
+  int i, j;
+  double minlij = 1.e25, maxlij = 0.0;
+  for (i = 0; i <= 3; i++){
+    for (j = i + 1; j <= 3; j++){
+      if (i != j){
+	minlij = DMIN (minlij, fabs (lij (i, j)));
+	maxlij = DMAX (maxlij, fabs (lij (i, j)));
+      }
+    }
+  }
+  return minlij / maxlij;
+}
+
+double Simplex::GammaShapeMeasure (){
+  int i, j, N;
+  double maxlij = 0.0;
+
+  if (V[3])
+    N = 4;
+  else
+    N = 3;
+
+  for (i = 0; i <= N - 1; i++){
+    for (j = i + 1; j <= N - 1; j++){
+      if (i != j)
+	maxlij = DMAX (maxlij, lij (i, j));
+    }
+  }
+  return 12. * rhoin () / (sqrt (6.) * maxlij);
+}
+
+
+void Simplex::Fourre_Simplexe (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){
+  int i, N;
+  V[0] = v1;
+  V[1] = v2;
+  V[2] = v3;
+  V[3] = v4;
+  VSUP = NULL;
+
+  if (!v3)    {
+    F[0].V[0] = (v1->Num > v2->Num) ? v2 : v1;
+    F[0].V[1] = (v1->Num > v2->Num) ? v1 : v2;
+    F[0].V[2] = NULL;
+    return;
+  }
+
+  F[0].V[0] = v1;
+  F[0].V[1] = v2;
+  F[0].V[2] = v3;
+
+  F[1].V[0] = v1;
+  F[1].V[1] = v3;
+  F[1].V[2] = v4;
+  if (FACE_DIMENSION == 1){
+    F[2].V[0] = v2;
+    F[2].V[1] = v3;
+    F[2].V[2] = v4;
+    
+    F[3].V[0] = v1;
+    F[3].V[1] = v2;
+    F[3].V[2] = v4;
+  }
+  else{
+    F[2].V[0] = v1;
+    F[2].V[1] = v2;
+    F[2].V[2] = v4;
+    
+    F[3].V[0] = v2;
+    F[3].V[1] = v3;
+    F[3].V[2] = v4;
+  }
+  if (!v4){
+    N = 3;
+    if (Volume_Simplexe2D () < 0.0){
+      V[0] = v1;
+      V[1] = v3;
+      V[2] = v2;
+    }
+    if (FACE_DIMENSION == 1){
+      //qsort(F[0].V,3,sizeof(Vertex*),compareVertex);
+      Center_Circum ();
+      Quality = (double) N *Radius / (V[0]->lc + V[1]->lc + V[2]->lc
+				      + ((V[3]) ? V[3]->lc : 0.0));
+    }
+    else{
+      qsort (F[0].V, 3, sizeof (Vertex *), compareVertex);
+      return;
+    }
+  }
+  else{
+    N = 4;
+  }
+  
+  Center_Circum ();
+
+  Quality = (double) N *Radius / (V[0]->lc + V[1]->lc + V[2]->lc
+				  + ((V[3]) ? V[3]->lc : 0.0));
+
+  /*
+     if(LOCAL != NULL){
+     Quality = fabs(Radius) / Lc_XYZ(Center.X, Center.Y, Center.Z, LOCAL);
+     if(Quality < 0.)
+     Quality = N * Radius / (V[0]->lc + V[1]->lc + V[2]->lc
+     +((V[3])? V[3]->lc:0.0));
+     }
+   */
+
+  for (i = 0; i < N; i++)
+    qsort (F[i].V, N - 1, sizeof (Vertex *), compareVertex);
+
+  //qsort(F,N,sizeof(Face),compareFace);
+}
+
+Simplex *Create_Simplex (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){
+  Simplex *s;
+
+  s = new Simplex (v1, v2, v3, v4);
+  return s;
+}
+
+Simplex *Create_Quadrangle (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4){
+  Simplex *s;
+  /* pour eviter le reordonnement des noeuds */
+  s = new Simplex ();
+  s->V[0] = v1 ;
+  s->V[1] = v2 ;
+  s->V[2] = v3 ;
+  s->V[3] = v4 ;
+  return s;
+}
+
+int compareSimplex (const void *a, const void *b){
+  Simplex **q, **w;
+
+  /* Les simplexes sont definis une seule fois :
+     1 pointeur par entite -> on compare les pointeurs */
+
+  q = (Simplex **) a;
+  w = (Simplex **) b;
+  //if((*q)->iEnt != (*w)->iEnt) return (*q)->iEnt - (*w)->iEnt;
+  return ((*q)->Num - (*w)->Num);
+}
+
+int Simplex::Pt_In_Simplexe (Vertex * v, double uvw[3], double tol){
+  double mat[3][3];
+  double b[3], det, dum;
+
+  det = matsimpl (mat);
+  b[0] = v->Pos.X - V[0]->Pos.X;
+  b[1] = v->Pos.Y - V[0]->Pos.Y;
+  b[2] = v->Pos.Z - V[0]->Pos.Z;
+
+  sys3x3 (mat, b, uvw, &dum);
+  if (uvw[0] >= -tol && uvw[1] >= -tol && uvw[2] >= -tol &&
+      uvw[0] <= 1. + tol && uvw[1] <= 1. + tol && uvw[2] <= 1. + tol &&
+      1. - uvw[0] - uvw[1] - uvw[2] > -tol)
+    {
+      return (1);
+    }
+  return (0);
+}
+
+void Simplex::Center_Ellipsum_2D (double m[3][3]){
+  double sys[2][2], x[2];
+  double rhs[2], a, b, d;
+  double x1, y1, x2, y2, x3, y3;
+
+  x1 = V[0]->Pos.X;
+  y1 = V[0]->Pos.Y;
+  x2 = V[1]->Pos.X;
+  y2 = V[1]->Pos.Y;
+  x3 = V[2]->Pos.X;
+  y3 = V[2]->Pos.Y;
+
+  a = m[0][0];
+  b = 0.5 * (m[0][1] + m[1][0]);
+  d = m[1][1];
+
+  sys[0][0] = 2. * a * (x1 - x2) + 2. * b * (y1 - y2);
+  sys[0][1] = 2. * d * (y1 - y2) + 2. * b * (x1 - x2);
+  sys[1][0] = 2. * a * (x1 - x3) + 2. * b * (y1 - y3);
+  sys[1][1] = 2. * d * (y1 - y3) + 2. * b * (x1 - x3);
+
+  rhs[0] = a * (x1 * x1 - x2 * x2) + d * (y1 * y1 - y2 * y2) + 2. * b * (x1 * y1 - x2 * y2);
+  rhs[1] = a * (x1 * x1 - x3 * x3) + d * (y1 * y1 - y3 * y3) + 2. * b * (x1 * y1 - x3 * y3);
+
+  sys2x2 (sys, rhs, x);
+
+  Center.X = x[0];
+  Center.Y = x[1];
+
+  Radius = sqrt ((x[0] - x1) * (x[0] - x1) * a
+		 + (x[1] - y1) * (x[1] - y1) * d
+		 + 2. * (x[0] - x1) * (x[1] - y1) * b);
+}
+
+void Simplex::Center_Ellipsum_3D (double m[3][3]){
+  double sys[3][3], x[3];
+  double rhs[3], det;
+  double x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4;
+
+  x1 = V[0]->Pos.X;
+  y1 = V[0]->Pos.Y;
+  z1 = V[0]->Pos.Z;
+  x2 = V[1]->Pos.X;
+  y2 = V[1]->Pos.Y;
+  z2 = V[1]->Pos.Z;
+  x3 = V[2]->Pos.X;
+  y3 = V[2]->Pos.Y;
+  z3 = V[2]->Pos.Z;
+  x4 = V[3]->Pos.X;
+  y4 = V[3]->Pos.Y;
+  z4 = V[3]->Pos.Z;
+
+  sys[0][0] = 2. * m[0][0] * (x1 - x2) + 2. * m[1][0] * (y1 - y2) + 2. * m[2][0] * (z1 - z2);
+  sys[0][1] = 2. * m[0][1] * (x1 - x2) + 2. * m[1][1] * (y1 - y2) + 2. * m[2][1] * (z1 - z2);
+  sys[0][2] = 2. * m[0][2] * (x1 - x2) + 2. * m[1][2] * (y1 - y2) + 2. * m[2][2] * (z1 - z2);
+
+  sys[1][0] = 2. * m[0][0] * (x1 - x3) + 2. * m[1][0] * (y1 - y3) + 2. * m[2][0] * (z1 - z3);
+  sys[1][1] = 2. * m[0][1] * (x1 - x3) + 2. * m[1][1] * (y1 - y3) + 2. * m[2][1] * (z1 - z3);
+  sys[1][2] = 2. * m[0][2] * (x1 - x3) + 2. * m[1][2] * (y1 - y3) + 2. * m[2][2] * (z1 - z3);
+
+  sys[2][0] = 2. * m[0][0] * (x1 - x4) + 2. * m[1][0] * (y1 - y4) + 2. * m[2][0] * (z1 - z4);
+  sys[2][1] = 2. * m[0][1] * (x1 - x4) + 2. * m[1][1] * (y1 - y4) + 2. * m[2][1] * (z1 - z4);
+  sys[2][2] = 2. * m[0][2] * (x1 - x4) + 2. * m[1][2] * (y1 - y4) + 2. * m[2][2] * (z1 - z4);
+
+  rhs[0] = m[0][0] * (x1 * x1 - x2 * x2)
+    + m[1][1] * (y1 * y1 - y2 * y2)
+    + m[2][2] * (z1 * z1 - z2 * z2)
+    + 2. * m[1][0] * (x1 * y1 - x2 * y2)
+    + 2. * m[2][0] * (x1 * z1 - x2 * z2)
+    + 2. * m[2][1] * (z1 * y1 - z2 * y2);
+  rhs[1] = m[0][0] * (x1 * x1 - x3 * x3)
+    + m[1][1] * (y1 * y1 - y3 * y3)
+    + m[2][2] * (z1 * z1 - z3 * z3)
+    + 2. * m[1][0] * (x1 * y1 - x3 * y3)
+    + 2. * m[2][0] * (x1 * z1 - x3 * z3)
+    + 2. * m[2][1] * (z1 * y1 - z3 * y3);
+  rhs[2] = m[0][0] * (x1 * x1 - x4 * x4)
+    + m[1][1] * (y1 * y1 - y4 * y4)
+    + m[2][2] * (z1 * z1 - z4 * z4)
+    + 2. * m[1][0] * (x1 * y1 - x4 * y4)
+    + 2. * m[2][0] * (x1 * z1 - x4 * z4)
+    + 2. * m[2][1] * (z1 * y1 - z4 * y4);
+
+  sys3x3 (sys, rhs, x, &det);
+
+  Center.X = x[0];
+  Center.Y = x[1];
+  Center.Z = x[2];
+
+  Radius = sqrt ((x[0] - x1) * (x[0] - x1) * m[0][0]
+		 + (x[1] - y1) * (x[1] - y1) * m[1][1]
+		 + (x[2] - z1) * (x[2] - z1) * m[2][2]
+		 + 2. * (x[0] - x1) * (x[1] - y1) * m[0][1]
+		 + 2. * (x[0] - x1) * (x[2] - z1) * m[0][2]
+		 + 2. * (x[1] - y1) * (x[2] - z1) * m[1][2]
+		 );
+}
+
+
+int Simplex::Pt_In_Simplex_2D (Vertex * v){
+  double Xmin, Xmax, Ymin, Ymax, Xtr[4], Ytr[4], A[2], B[2], X, Y, Signus[3];
+  int i;
+
+  X = v->Pos.X;
+  Y = v->Pos.Y;
+  Xtr[0] = Xmax = Xmin = V[0]->Pos.X;
+  Xtr[3] = V[0]->Pos.X;
+  Xtr[1] = V[1]->Pos.X;
+  Xtr[2] = V[2]->Pos.X;
+  Ytr[0] = Ymax = Ymin = V[0]->Pos.Y;
+  Ytr[3] = V[0]->Pos.Y;
+  Ytr[1] = V[1]->Pos.Y;
+  Ytr[2] = V[2]->Pos.Y;
+
+  for (i = 1; i < 3; i++){
+    Xmin = (Xtr[i] < Xmin) ? Xtr[i] : Xmin;
+    Xmax = (Xtr[i] > Xmax) ? Xtr[i] : Xmax;
+    Ymin = (Ytr[i] < Ymin) ? Ytr[i] : Ymin;
+    Ymax = (Ytr[i] > Ymax) ? Ytr[i] : Ymax;
+  }
+
+  if (X > Xmax || X < Xmin || Y > Ymax || Y < Ymin)
+    return (0);
+
+  for (i = 0; i < 3; i++){
+    A[0] = Xtr[i + 1] - Xtr[i];
+    A[1] = Ytr[i + 1] - Ytr[i];
+    B[0] = X - Xtr[i];
+    B[1] = Y - Ytr[i];
+    Signus[i] = A[0] * B[1] - A[1] * B[0];
+  }
+  for (i = 0; i < 2; i++){
+    if ((Signus[i] * Signus[i + 1]) < 0)
+      return 0;
+  }
+  return 1;
+}
+
+void Simplex::ExportLcField (FILE * f){
+  if (!V[3]){
+    fprintf (f, "ST(%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E};\n"
+	     ,V[0]->Pos.X, V[0]->Pos.Y, V[0]->Pos.Z
+	     ,V[1]->Pos.X, V[1]->Pos.Y, V[1]->Pos.Z
+	     ,V[2]->Pos.X, V[2]->Pos.Y, V[2]->Pos.Z
+	     ,V[0]->lc, V[1]->lc, V[2]->lc);
+  }
+  else{
+    fprintf (f, "SS(%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f){%12.5E,%12.5E,%12.5E,%12.5E};\n"
+	     ,V[0]->Pos.X, V[0]->Pos.Y, V[0]->Pos.Z
+	     ,V[1]->Pos.X, V[1]->Pos.Y, V[1]->Pos.Z
+	     ,V[2]->Pos.X, V[2]->Pos.Y, V[2]->Pos.Z
+	     ,V[3]->Pos.X, V[3]->Pos.Y, V[3]->Pos.Z
+	     ,V[0]->lc, V[1]->lc, V[2]->lc, V[3]->lc);
+  }
+  
+}
+
+double Simplex::AireFace (Vertex * V[3]){
+  double a[3], b[3], c[3];
+
+  a[0] = V[2]->Pos.X - V[1]->Pos.X;
+  a[1] = V[2]->Pos.Y - V[1]->Pos.Y;
+  a[2] = V[2]->Pos.Z - V[1]->Pos.Z;
+
+  b[0] = V[0]->Pos.X - V[1]->Pos.X;
+  b[1] = V[0]->Pos.Y - V[1]->Pos.Y;
+  b[2] = V[0]->Pos.Z - V[1]->Pos.Z;
+
+  prodve (a, b, c);
+  return (0.5 * sqrt (c[0] * c[0] + c[1] * c[1] + c[2] * c[2]));
+}
+
+double Simplex::surfsimpl (){
+  return AireFace (V);
+}
+
+bool Simplex::VertexIn (Vertex * v){
+  if (!this || this == &MyNewBoundary)
+    return false;
+  int N = 4;
+  if (!V[3])
+    N = 3;
+  for (int i = 0; i < N; i++)
+    if (!compareVertex (&V[i], &v))
+      return true;
+  return false;
+}
+
+bool Simplex::EdgeIn (Vertex * v1, Vertex * v2, Vertex * v[2]){
+  if (!this || this == &MyNewBoundary)
+    return false;
+  int N = 4;
+  if (!V[3])
+    N = 3;
+  int n = 0;
+  for (int i = 0; i < N; i++){
+    if (compareVertex (&V[i], &v1) && compareVertex (&V[i], &v2)){
+      v[n++] = V[i];
+      if (n > 2)
+	return false;
+    }
+  }
+  return true;
+}
+
+bool Simplex::ExtractOppositeEdges (int iFac, Vertex * p[2], Vertex * q[2]){
+  Simplex *s1 = this;
+  if (!s1 || s1 == &MyNewBoundary || !s1->iEnt)
+    return false;
+  Simplex *s2 = s1->S[iFac];
+  if (!s2 || s2 == &MyNewBoundary || !s2->iEnt)
+    return false;
+  int i, ip = 0, iq = 0;
+
+  for (i = 0; i < 3; i++)
+    if (s1->VertexIn (s2->V[i]))
+      p[ip++] = s2->V[i];
+    else
+      q[iq++] = s2->V[i];
+
+  for (i = 0; i < 3; i++)
+    if (!s2->VertexIn (s1->V[i]))
+      q[iq++] = s1->V[i];
+
+  if (ip != 2 || iq != 2){
+    return false;
+  }
+  return true;
+}
+
+bool Simplex::SwapEdge (int iFac){
+  Simplex *s1 = NULL, *s2 = NULL, *s11 = NULL, *s21 = NULL;
+  Vertex *p[4] = {NULL, NULL, NULL, NULL};
+  Vertex *q[4] = {NULL, NULL, NULL, NULL};
+  int i, ip, iq;
+
+  s1 = this;
+  if (!s1 || s1 == &MyNewBoundary || !s1->iEnt)
+    return false;
+  s2 = s1->S[iFac];
+  if (!s2 || s2 == &MyNewBoundary || !s2->iEnt)
+    return false;
+  ip = iq = 0;
+
+  for (i = 0; i < 3; i++)
+    if (s1->VertexIn (s2->V[i]))
+      p[ip++] = s2->V[i];
+    else
+      q[iq++] = s2->V[i];
+
+  for (i = 0; i < 3; i++)
+    if (!s2->VertexIn (s1->V[i]))
+      q[iq++] = s1->V[i];
+
+  if (ip != 2 || iq != 2){
+    return false;
+  }
+
+  for (i = 0; i < 3; i++)
+    if (s1->S[i]->VertexIn (p[1]) && s1->S[i]->VertexIn (q[1]))
+      s11 = s1->S[i];
+
+  for (i = 0; i < 3; i++)
+    if (s2->S[i]->VertexIn (p[0]) && s2->S[i]->VertexIn (q[0]))
+      s21 = s2->S[i];
+
+  if (!s11 || !s21)
+    return false;
+
+  double vol1 = s1->Volume_Simplexe () + s2->Volume_Simplexe ();
+
+  s1->V[0] = p[0];
+  s1->V[1] = q[0];
+  s1->V[2] = q[1];
+  s2->V[0] = p[1];
+  s2->V[1] = q[0];
+  s2->V[2] = q[1];
+
+  double vol2 = s1->Volume_Simplexe () + s2->Volume_Simplexe ();
+
+  if (s1->Volume_Simplexe () == 0.0 || s2->Volume_Simplexe () == 0.0 ||
+      fabs (fabs (vol1) - fabs (vol2)) > 1.e-5 * (fabs (vol1) + fabs (vol2))){
+    s1->V[0] = p[0];
+    s1->V[1] = p[1];
+    s1->V[2] = q[1];
+    s2->V[0] = p[0];
+    s2->V[1] = p[1];
+    s2->V[2] = q[0];
+    return false;
+  }
+
+  for (i = 0; i < 3; i++)
+    if (s1->S[i] == s11)
+      s1->S[i] = s21;
+  for (i = 0; i < 3; i++)
+    if (s2->S[i] == s21)
+      s2->S[i] = s11;
+
+  if (s21 != &MyNewBoundary && s21 && s21->iEnt)
+    for (i = 0; i < 3; i++)
+      if (s21->S[i] == s2)
+	s21->S[i] = s1;
+  if (s11 != &MyNewBoundary && s11 && s11->iEnt)
+    for (i = 0; i < 3; i++)
+      if (s11->S[i] == s1)
+	s11->S[i] = s2;
+  return true;
+}
+
+
+bool Simplex::SwapFace (int iFac, List_T * newsimp, List_T * delsimp){
+  Simplex *s = S[iFac], *s1, *s2, *s3;
+  Vertex *o[2];
+  int i;
+
+  if (!s || s == &MyNewBoundary || !s->iEnt)
+    return false;
+  if (!this || this == &MyNewBoundary || !this->iEnt)
+    return false;
+
+  for (i = 0; i < 4; i++)
+    if (!VertexIn (s->V[i]))
+      o[0] = s->V[i];
+  for (i = 0; i < 4; i++)
+    if (!s->VertexIn (V[i]))
+      o[1] = V[i];
+
+  s1 = Create_Simplex (s->F[iFac].V[0], s->F[iFac].V[1], o[0], o[1]);
+  s2 = Create_Simplex (s->F[iFac].V[1], s->F[iFac].V[2], o[0], o[1]);
+  s3 = Create_Simplex (s->F[iFac].V[2], s->F[iFac].V[0], o[0], o[1]);
+
+  double vol1 = s->Volume_Simplexe () + Volume_Simplexe ();
+  double vol2 = s1->Volume_Simplexe () + s2->Volume_Simplexe () + s3->Volume_Simplexe ();
+
+  if (fabs (fabs (vol1) - fabs (vol2)) > 1.e-5 * (fabs (vol1) + fabs (vol2))){
+    delete s1;
+    delete s2;
+    delete s3;
+    return false;
+  }
+  
+  double gamma1 = GammaShapeMeasure ();
+
+  if (s1->GammaShapeMeasure () < gamma1 ||
+      s2->GammaShapeMeasure () < gamma1 ||
+      s3->GammaShapeMeasure () < gamma1)
+    return false;
+
+  return true;
+}
+
+int compareFace (const void *a, const void *b){
+  Face *q, *w;
+
+  q = (Face *) a;
+  w = (Face *) b;
+  if (q->V[0]->Num > w->V[0]->Num)
+    return (1);
+  if (q->V[0]->Num < w->V[0]->Num)
+    return (-1);
+
+  if (q->V[1]->Num > w->V[1]->Num)
+    return (1);
+  if (q->V[1]->Num < w->V[1]->Num)
+    return (-1);
+
+  if (FACE_DIMENSION == 1 || !q->V[2] || !w->V[2])
+    return 0;
+
+  if (q->V[2]->Num > w->V[2]->Num)
+    return (1);
+  if (q->V[2]->Num < w->V[2]->Num)
+    return (-1);
+  return (0);
+}
diff --git a/Mesh/Simplex.h b/Mesh/Simplex.h
new file mode 100644
index 0000000000000000000000000000000000000000..40bdf703c92726f40d01340281d2cfe705e325d0
--- /dev/null
+++ b/Mesh/Simplex.h
@@ -0,0 +1,63 @@
+#ifndef _SIMPLEX_GMSH_
+#define _SIMPLEX_GMSH_
+#include <stdio.h>
+#include <iostream.h>
+#include <stddef.h>
+#include <math.h>
+#include <stdlib.h>
+#include "Vertex.h"
+
+typedef struct {
+  Vertex *V[3];
+}Face;
+
+class Simplex
+{
+  public:
+  int     Num;           /* Numero                                       */
+  int     iEnt;          /* Entite geometrique                           */
+  Face    F[4];          /* 4 faces                                      */
+  Vertex  **VSUP;        /* noeuds supplem pour les elts de degre eleves */
+  Vertex  *V[4];         /* 4 noeuds                                     */
+  double  Quality;       /* Qualite du simplexe                          */
+  Coord   Center;        /* centre du CC                                 */
+  double  Radius;        /* Rayon du CC                                  */
+  Simplex *S[4];    	 /* 4 Voisins                                    */
+  static  int TotalNumber;
+  static  int TotalAllocated;
+  Simplex();
+  ~Simplex();
+  Simplex(Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4);
+  void Fourre_Simplexe(Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4);
+  int Pt_In_Simplexe (Vertex *v, double uvw[3], double tol);
+  int Pt_In_Simplex_2D(Vertex *v);
+  void Center_Circum();
+  double Volume_Simplexe ();
+  double matsimpl(double mat[3][3]);
+  void center_tet(double X[4],double Y[4], double Z[4], double res[3]);
+  double AireFace (Vertex *V[3]);
+  double surfsimpl();
+  int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3,
+		     double *xc,double *yc);
+  double Volume_Simplexe2D();
+  void Center_Ellipsum_2D (double m[3][3]);
+  int Pt_In_Ellipsis (Vertex *v,double m[3][3]);
+  bool VertexIn(Vertex *v);
+  bool EdgeIn(Vertex *v1, Vertex *v2, Vertex *v[2]);
+  bool SwapEdge (int iFac);
+  bool SwapFace (int iFac, List_T *newsimp, List_T *delsimp);
+  bool ExtractOppositeEdges ( int iFac, Vertex *p[2], Vertex *q[2]);
+  void ExportLcField (FILE *f);
+  void Center_Ellipsum_3D (double m[3][3]);
+  double GammaShapeMeasure ();
+  double RhoShapeMeasure ();
+  double EtaShapeMeasure ();
+  double lij (int i, int j);
+  double rhoin ();
+};
+int compareSimplex(const void *a, const void *b);
+Simplex *Create_Simplex (Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4);
+Simplex *Create_Quadrangle (Vertex *v1, Vertex *v2, Vertex *v3, Vertex *v4);
+int compareFace (const void *a, const void *b);
+
+#endif
diff --git a/Mesh/Smoothing.cpp b/Mesh/Smoothing.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..14883f1e6d86c2d5ea3f06d2f4544d9d2448507a
--- /dev/null
+++ b/Mesh/Smoothing.cpp
@@ -0,0 +1,168 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+
+
+void AmelioreSurface_EliminationTripet (Surface * surf, Mesh * m, Tree_T * tnxe){
+  int i, j, k;
+  List_T *lnxe = Tree2List (tnxe);
+  Vertex *v1, *v2, *v3;
+  List_T *ListNoeuds = List_Create (2, 1, sizeof (Vertex *));
+  Simplex *s[3], *news;
+  NXE nxe;
+  bool ok;
+
+  for (i = 0; i < List_Nbr (lnxe); i++){
+    List_Read (lnxe, i, &nxe);
+    if (List_Nbr (nxe.Liste) == 3){
+      ok = true;
+      if (nxe.v->ListCurves)
+	ok = false;
+      else{
+	for (j = 0; j < 3; j++){
+	  List_Read (nxe.Liste, j, &s[j]);
+	  if (!Tree_Search (surf->Simplexes, &s[j]))
+	    ok = false;
+	  for (k = 0; k < 3; k++)
+	    if (compareVertex (&nxe.v, &s[j]->V[k]))
+	      List_Insert (ListNoeuds, &s[j]->V[k], compareVertex);
+	}
+      }
+      if (ok){
+	List_Read (ListNoeuds, 0, &v1);
+	List_Read (ListNoeuds, 1, &v2);
+	List_Read (ListNoeuds, 2, &v3);
+	news = Create_Simplex (v1, v2, v3, 0);
+	Tree_Suppress (surf->Simplexes, &s[0]);
+	Tree_Suppress (surf->Simplexes, &s[1]);
+	Tree_Suppress (surf->Simplexes, &s[2]);
+	Tree_Suppress (m->Vertices, &nxe.v);
+	Tree_Add (surf->Simplexes, &news);
+      }
+      List_Reset (ListNoeuds);
+    }
+  }
+  List_Delete (ListNoeuds);
+  List_Delete (lnxe);
+}
+
+
+void ActionLiss (void *data, void *dummy){
+  static int deb = 1;
+  static List_T *nodes;
+
+  NXE *pnxe;
+  Simplex *s;
+  double X, Y, Z, Sum;
+  int i, j;
+
+  if (deb){
+    deb = 0;
+    nodes = List_Create (2, 2, sizeof (Vertex *));
+  }
+  List_Reset (nodes);
+  pnxe = (NXE *) data;
+
+  /* On Ne Lisse Point Les Points sur les courbes (quelle horreur) */
+  if (pnxe->v->ListCurves)
+    return;
+
+  X = Y = Z = Sum = 0.0;
+  double volume_before = 0.0;
+  double min_quality_old = 1.0;
+  for (i = 0; i < List_Nbr (pnxe->Liste); i++){
+    List_Read (pnxe->Liste, i, &s);
+    min_quality_old = DMIN (min_quality_old, s->GammaShapeMeasure ());
+    volume_before += s->Volume_Simplexe ();
+    /* On Ne Lisse Point Les Points sur les surfaces quand les volumes sont mailles */
+    if (s->V[3] && pnxe->v->ListSurf)
+      return;
+    for (j = 0; j < 4; j++){
+      if (s->V[j] && compareVertex (&pnxe->v, &s->V[j])){
+	Sum += 0.5;
+	X += s->V[j]->Pos.X * 0.5;
+	Y += s->V[j]->Pos.Y * 0.5;
+	Z += s->V[j]->Pos.Z * 0.5;
+      }
+    }
+  }
+  
+  double xold = pnxe->v->Pos.X;
+  double yold = pnxe->v->Pos.Y;
+  double zold = pnxe->v->Pos.Z;
+  double a = 0.5;
+
+  if (Sum != 0.0){
+    pnxe->v->Pos.X = a * (X / Sum) + (1. - a) * pnxe->v->Pos.X;
+    pnxe->v->Pos.Y = a * (Y / Sum) + (1. - a) * pnxe->v->Pos.Y;
+    pnxe->v->Pos.Z = a * (Z / Sum) + (1. - a) * pnxe->v->Pos.Z;
+  }
+
+  double min_quality_new = 1.0;
+  for (i = 0; i < List_Nbr (pnxe->Liste); i++){
+    List_Read (pnxe->Liste, i, &s);
+    min_quality_new = DMIN (min_quality_new, s->GammaShapeMeasure ());
+  }
+  
+  double volume_after = 0.0;
+  for (i = 0; i < List_Nbr (pnxe->Liste); i++){
+    List_Read (pnxe->Liste, i, &s);
+    volume_after += s->Volume_Simplexe ();
+  }
+  if (fabs (volume_after - volume_before) > 1.e-8 * fabs (volume_after + volume_before)
+      || min_quality_old > min_quality_new){
+    pnxe->v->Pos.X = xold;
+    pnxe->v->Pos.Y = yold;
+    pnxe->v->Pos.Z = zold;
+  }
+  
+}
+
+
+void ActionLissSurf (void *data, void *dummy){
+  NXE *pnxe;
+  Simplex *s;
+  double X, Y, Z, Sum;
+  int i, j;
+
+  pnxe = (NXE *) data;
+
+  /*
+     On Ne Lisse Point Les Points sur les courbes
+   */
+  if (pnxe->v->ListCurves)
+    return;
+
+  X = Y = Z = Sum = 0.0;
+  for (i = 0; i < List_Nbr (pnxe->Liste); i++){
+    List_Read (pnxe->Liste, i, &s);
+    /*
+      On Ne Lisse Point Les Points sur les surfaces quand les
+      volumes sont mailles
+    */
+    for (j = 0; j < 4; j++){
+      if (s->V[j] && compareVertex (&pnxe->v, &s->V[j])){
+	Sum += 0.5;
+	X += s->V[j]->Pos.X * 0.5;
+	Y += s->V[j]->Pos.Y * 0.5;
+	Z += s->V[j]->Pos.Z * 0.5;
+      }
+    }
+  }
+  if (Sum != 0.0){
+    pnxe->v->Pos.X = X / Sum;
+    pnxe->v->Pos.Y = Y / Sum;
+    pnxe->v->Pos.Z = Z / Sum;
+  }
+}
+
+void RandomSwapEdges (Surface * s){
+  int i;
+  List_T *AllTrg = Tree2List (s->Simplexes);
+  Simplex *t;
+  for (i = 0; i < List_Nbr (AllTrg); i++){
+    List_Read (AllTrg, i, &t);
+    t->SwapEdge (1);
+  }
+}
diff --git a/Mesh/SwapEdge.cpp b/Mesh/SwapEdge.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fdbe76273a0c69a80ffc5edde7e9717a71f67081
--- /dev/null
+++ b/Mesh/SwapEdge.cpp
@@ -0,0 +1,303 @@
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Mesh.h"
+#include "SwapPatterns.h"
+
+extern Simplex MyNewBoundary;
+extern int edges_tetra[6][2];
+
+
+int TrouveCoquille (Simplex * s, Vertex * Ed[2],
+		    List_T * Coquille, Tree_T * TreeSimpl,
+		    Vertex * Contour[100]){
+  Simplex *stack[256], *actual;
+  Vertex *other[2];
+  int K, i, N = 0;
+  List_T *Edges = List_Create (12, 2, sizeof (Edge));
+  Edge E;
+
+  stack[N++] = s;
+
+  while (N > 0){
+    actual = stack[--N];
+    if (!Tree_Search (TreeSimpl, &actual)){
+      Tree_Add (TreeSimpl, &actual);
+      if (actual->EdgeIn (Ed[0], Ed[1], other)){
+	List_Add (Coquille, &actual);
+	if (actual != s)
+	  actual->Radius = -1.;
+	E.V[0] = other[0];
+	E.V[1] = other[1];
+	List_Add (Edges, &E);
+	for (i = 0; i < 4; i++){
+	  if (actual->S[i] && actual->S[i] != &MyNewBoundary)
+	    stack[N++] = actual->S[i];
+	  else
+	    return 0;
+	}
+      }
+    }
+  }
+
+  List_Read (Edges, 0, &E);
+  N = 0;
+  Contour[N++] = E.V[0];
+  Contour[N++] = E.V[1];
+  List_Suppress (Edges, &E, compareedge);
+  K = 0;
+
+  while (List_Nbr (Edges)){
+    if (K++ > Tree_Nbr (TreeSimpl))
+      return 0;
+    for (i = 0; i < List_Nbr (Edges); i++){
+      List_Read (Edges, i, &E);
+      if (!compareVertex (&Contour[N - 1], &E.V[0]) &&
+	  compareVertex (&Contour[N - 2], &E.V[1])){
+	Contour[N++] = E.V[1];
+	List_Suppress (Edges, &E, compareedge);
+	break;
+      }
+      if (!compareVertex (&Contour[N - 1], &E.V[1]) &&
+	  compareVertex (&Contour[N - 2], &E.V[0])){
+	Contour[N++] = E.V[0];
+	List_Suppress (Edges, &E, compareedge);
+	break;
+      }
+    }
+    
+  }
+  if (!compareVertex (&Contour[0], &Contour[N - 1]))
+    return N - 1;
+  return 0;
+}
+
+bool FindBestPattern (int N, Vertex * Contour[100], Vertex * Ed[2],
+		      List_T * Coquille, List_T * Pattern){
+  int i, j, k, kk, tri[3];
+  Simplex *s, *Pat[100];
+  double old_volume, new_volume;
+  double worst_tet_old, worst_tet_new;
+  bool stop = false;
+  SwapPattern *sp = NULL;
+  SwapPattern3 *x3;
+  SwapPattern4 *x4;
+  SwapPattern5 *x5;
+  SwapPattern6 *x6;
+  SwapPattern7 *x7;
+  SwapPatternN *xN;
+  switch (N){
+  case 3:
+    x3 = new SwapPattern3;
+    sp = x3;
+    break;
+  case 4:
+    x4 = new SwapPattern4;
+    sp = x4;
+    break;
+  case 5:
+    if (stop)
+      return false;
+    x5 = new SwapPattern5;
+    sp = x5;
+    break;
+  case 6:
+    if (stop)
+      return false;
+    x6 = new SwapPattern6;
+    sp = x6;
+    break;
+  case 7:
+    if (stop)
+      return false;
+    x7 = new SwapPattern7;
+    sp = x7;
+    break;
+  default:
+    if (stop)
+      return false;
+    xN = new SwapPatternN (N);
+    sp = xN;
+    break;
+  }
+
+  old_volume = 0.0;
+  worst_tet_old = 1.;
+  int IENT;
+  for (k = 0; k < List_Nbr (Coquille); k++){
+    List_Read (Coquille, k, &s);
+    IENT = s->iEnt;
+    old_volume += fabs (s->Volume_Simplexe ());
+    worst_tet_old = DMIN (worst_tet_old, s->GammaShapeMeasure ());
+  }
+
+  for (i = 0; i < sp->GetNbPatterns (); i++){
+    for (j = 0; j < sp->GetNbRotations (i); j++){
+      new_volume = 0.;
+      worst_tet_new = 1.;
+      kk = 0;
+      for (k = 0; k < sp->GetNbTriangles (); k++){
+	sp->GetTriangle (i, k, tri);
+	s = Create_Simplex (Contour[tri[0]],
+			    Contour[tri[1]],
+			    Contour[tri[2]],
+			    Ed[0]);
+	s->iEnt = IENT;
+	Pat[kk++] = s;
+	new_volume += fabs (s->Volume_Simplexe ());
+	worst_tet_new = DMIN (worst_tet_new, s->GammaShapeMeasure ());
+	s = Create_Simplex (Contour[tri[0]],
+			    Contour[tri[1]],
+			    Contour[tri[2]],
+			    Ed[1]);
+	s->iEnt = IENT;
+	Pat[kk++] = s;
+	new_volume += fabs (s->Volume_Simplexe ());
+	worst_tet_new = DMIN (worst_tet_new, s->GammaShapeMeasure ());
+      }
+      if (fabs (new_volume - old_volume) > 1.e-5 * fabs (new_volume + old_volume))
+	Msg(INFO, "Edge swapping failed");
+      if (fabs (new_volume - old_volume) > 1.e-5 * fabs (new_volume + old_volume)
+	  || worst_tet_new < worst_tet_old){
+	for (k = 0; k < 2 * sp->GetNbTriangles (); k++){
+	  delete Pat[k];
+	}
+      }
+      else{
+	for (k = 0; k < List_Nbr (Pattern); k++){
+	  List_Read (Pattern, k, &s);
+	  delete s;
+	}
+	List_Reset (Pattern);
+	for (k = 0; k < 2 * sp->GetNbTriangles (); k++){
+	  List_Add (Pattern, &Pat[k]);
+	}
+	worst_tet_old = worst_tet_new;
+      }
+    }
+  }
+  
+  delete sp;
+  return true ;
+}
+
+
+bool SwapEdge (Mesh * M, Volume * v, Simplex * s, int iEdge){
+  int i;
+  Vertex *Contour[100];
+  Vertex *Ed[2];
+  Simplex *simp;
+  Tree_T *TreeSimpl = Tree_Create (sizeof (Simplex *), compareSimplex);
+  List_T *Coquille = List_Create (10, 10, sizeof (Simplex *));
+  Ed[0] = s->V[edges_tetra[iEdge][0]];
+  Ed[1] = s->V[edges_tetra[iEdge][1]];
+  int N = TrouveCoquille (s, Ed, Coquille, TreeSimpl, Contour);
+
+  List_T *Pattern = List_Create (2 * N - 4, 1, sizeof (Simplex *));
+
+  FindBestPattern (N, Contour, Ed, Coquille, Pattern);
+
+  if (List_Nbr (Pattern)){
+    for (i = 0; i < List_Nbr (Coquille); i++){
+      List_Read (Coquille, i, &simp);
+      Tree_Suppress (v->Simplexes, &simp);
+      Tree_Suppress (TreeSimpl, &simp);
+    }
+    for (i = 0; i < List_Nbr (Pattern); i++){
+      List_Read (Pattern, i, &simp);
+      Tree_Add (v->Simplexes, &simp);
+      Tree_Add (TreeSimpl, &simp);
+    }
+    Link_Simplexes (NULL, TreeSimpl /*v->Simplexes */ );
+  }
+  Tree_Delete (TreeSimpl);
+  List_Delete (Coquille);
+  List_Delete (Pattern);
+  return true ;
+}
+
+int GetWorstEdge (Simplex * s, EdgesContainer & ec, bool order){
+  Vertex *v11, *v12;
+  Vertex *v21, *v22;
+  v11 = s->V[edges_tetra[0][0]];
+  v12 = s->V[edges_tetra[0][1]];
+  v21 = s->V[edges_tetra[4][0]];
+  v22 = s->V[edges_tetra[4][1]];
+  Vertex d11 = *(v12) - *(v11);
+  Vertex d12 = *(v22) - *(v21);
+  d12.norme ();
+  d11.norme ();
+  double prosc1 = fabs (d11 * d12);
+
+  v11 = s->V[edges_tetra[1][0]];
+  v12 = s->V[edges_tetra[1][1]];
+  v21 = s->V[edges_tetra[3][0]];
+  v22 = s->V[edges_tetra[3][1]];
+  Vertex d21 = *(v12) - *(v11);
+  Vertex d22 = *(v22) - *(v21);
+  d22.norme ();
+  d21.norme ();
+  double prosc2 = fabs (d21 * d22);
+
+  v11 = s->V[edges_tetra[2][0]];
+  v12 = s->V[edges_tetra[2][1]];
+  v21 = s->V[edges_tetra[5][0]];
+  v22 = s->V[edges_tetra[5][1]];
+  Vertex d31 = *(v12) - *(v11);
+  Vertex d32 = *(v22) - *(v21);
+  d32.norme ();
+  d31.norme ();
+  double prosc3 = fabs (d31 * d32);
+
+  if (prosc1 < prosc2 && prosc1 < prosc3){
+    if (!order && !ec.Search (s->V[edges_tetra[0][0]], s->V[edges_tetra[0][1]]))
+      return 0;
+    if (!ec.Search (s->V[edges_tetra[4][0]], s->V[edges_tetra[4][1]]))
+      return 4;
+    if (!ec.Search (s->V[edges_tetra[0][0]], s->V[edges_tetra[0][1]]))
+      return 0;
+    return -1;
+  }
+  if (prosc2 < prosc1 && prosc2 < prosc3){
+    if (!order && !ec.Search (s->V[edges_tetra[1][0]], s->V[edges_tetra[1][1]]))
+      return 1;
+    if (!ec.Search (s->V[edges_tetra[3][0]], s->V[edges_tetra[3][1]]))
+      return 3;
+    if (!ec.Search (s->V[edges_tetra[1][0]], s->V[edges_tetra[1][1]]))
+      return 1;
+    return -1;
+  }
+  if (prosc3 < prosc2 && prosc3 < prosc1){
+    if (!order && !ec.Search (s->V[edges_tetra[2][0]], s->V[edges_tetra[2][1]]))
+      return 2;
+    if (!ec.Search (s->V[edges_tetra[5][0]], s->V[edges_tetra[5][1]]))
+      return 5;
+    if (!ec.Search (s->V[edges_tetra[2][0]], s->V[edges_tetra[2][1]]))
+      return 2;
+    return -1;
+  }
+  return -1;
+}
+
+void SwapEdges3D (Mesh * M, Volume * v, double GammaPrescribed, bool order){
+  List_T *list = Tree2List (v->Simplexes);
+  List_T *srfs = Tree2List (M->Surfaces);
+  if (!List_Nbr (srfs))
+    return;
+  EdgesContainer ec (srfs);
+  Simplex *s;
+  Progress (102);
+  for (int i = 0; i < List_Nbr (list); i++){
+    if (i % 100 == 1)
+      Progress ((100 * i) / List_Nbr (list));
+    List_Read (list, i, &s);
+    if (s->GammaShapeMeasure () < GammaPrescribed){
+      int iEdge = GetWorstEdge (s, ec, order);
+      if (iEdge >= 0)
+	SwapEdge (M, v, s, iEdge);
+    }
+  }
+  Progress (-1);
+  List_Delete (srfs);
+  List_Delete (list);
+}
diff --git a/Mesh/SwapPatterns.h b/Mesh/SwapPatterns.h
new file mode 100644
index 0000000000000000000000000000000000000000..db379bdf2b670add6bc229b8cc3342952d7f83b5
--- /dev/null
+++ b/Mesh/SwapPatterns.h
@@ -0,0 +1,203 @@
+#ifndef _SWAP_PATTERNS_H_
+#define _SWAP_PATTERNS_H_
+
+int swap_patterns_3 [1][1][3] = {
+  {
+    {0,1,2}
+  }
+};
+
+int swap_patterns_4 [1][2][3] = {
+  {
+    {0,1,3},
+    {1,2,3}
+  }
+};
+
+int swap_patterns_5 [1][3][3] = {
+  {
+    {0,1,2},
+    {0,2,4},
+    {2,3,4}
+  }
+};
+
+int swap_patterns_6 [4][4][3] = {
+  {
+    {0,1,2},
+    {0,2,5},
+    {5,2,4},
+    {4,2,3}
+  },
+  {
+    {0,1,2},
+    {0,2,3},
+    {5,2,3},
+    {5,3,4}
+  },
+  {
+    {0,1,5},
+    {5,1,2},
+    {5,2,4},
+    {4,2,3}
+  },
+  {
+    {0,1,2},
+    {4,0,2},
+    {4,2,3},
+    {0,4,5}
+  }
+};
+
+int swap_patterns_7 [6][5][3] = {
+  {
+    {0,1,3},
+    {1,2,3},
+    {0,3,6},
+    {6,3,5},
+    {5,3,4}
+  },
+  {
+    {0,1,3},
+    {1,2,3},
+    {0,3,4},
+    {0,4,6},
+    {6,4,5}
+  },
+  {
+    {0,1,3},
+    {1,2,3},
+    {0,3,6},
+    {6,3,4},
+    {6,4,5}
+  },
+  {
+    {0,1,2},
+    {0,2,3},
+    {0,3,6},
+    {6,3,5},
+    {5,3,4}
+  },
+  {
+    {0,1,6},
+    {1,2,3},
+    {6,1,3},
+    {6,3,5},
+    {5,3,4}
+  },
+  {
+    {0,1,3},
+    {1,2,3},
+    {0,3,5},
+    {5,3,4},
+    {0,5,6}
+  }
+};
+
+
+class SwapPattern{
+protected :
+  int NbPatterns;
+  int NbNod;
+  int Rot;
+  virtual void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3])=0;
+public :
+  SwapPattern(){Rot = 0;}
+  int GetNbPatterns() {return NbPatterns;}
+  virtual int GetNbRotations(int iPattern) = 0;
+  int GetNbTriangles(){return NbNod-2;}
+  void GetTriangle(int iPattern, int iTriangle,int tri[3]){
+    GetTriangleWithoutRot(iPattern,iTriangle,tri);
+    for(int i=0;i<3;i++){
+      tri[i] = (tri[i]+Rot)%NbNod;
+    }
+  }
+  void Rotate (){Rot++;};
+};
+
+class SwapPattern3 : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = swap_patterns_3[iPattern][iTriangle][0];
+    tri[1] = swap_patterns_3[iPattern][iTriangle][1];
+    tri[2] = swap_patterns_3[iPattern][iTriangle][2];
+  }
+public :
+  SwapPattern3(){NbPatterns = 1;NbNod = 3;}
+  int GetNbRotations (int iPattern){
+    return 1;
+  };
+};
+
+class SwapPattern4 : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = swap_patterns_4[iPattern][iTriangle][0];
+    tri[1] = swap_patterns_4[iPattern][iTriangle][1];
+    tri[2] = swap_patterns_4[iPattern][iTriangle][2];
+  }
+public :
+  SwapPattern4(){NbPatterns = 1;NbNod = 4;}
+  int GetNbRotations (int iPattern){
+    return 2;
+  };
+};
+
+class SwapPattern5 : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = swap_patterns_5[iPattern][iTriangle][0];
+    tri[1] = swap_patterns_5[iPattern][iTriangle][1];
+    tri[2] = swap_patterns_5[iPattern][iTriangle][2];
+  }
+public :
+  SwapPattern5(){NbPatterns = 1;NbNod = 5;}
+  int GetNbRotations (int iPattern){
+    return 5;
+  };
+};
+
+class SwapPattern6 : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = swap_patterns_6[iPattern][iTriangle][0];
+    tri[1] = swap_patterns_6[iPattern][iTriangle][1];
+    tri[2] = swap_patterns_6[iPattern][iTriangle][2];
+  }
+public :
+  SwapPattern6(){NbPatterns = 4;NbNod = 6;}
+  int GetNbRotations (int iPattern){
+    switch(iPattern){
+    case 0:return 6;
+    case 1:return 3;
+    case 2:return 3;
+    case 3:return 2;
+    default: return 0;
+    }
+  }
+};
+
+class SwapPattern7 : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = swap_patterns_7[iPattern][iTriangle][0];
+    tri[1] = swap_patterns_7[iPattern][iTriangle][1];
+    tri[2] = swap_patterns_7[iPattern][iTriangle][2];
+  }
+public :
+  SwapPattern7(){NbPatterns = 6;NbNod = 7;}
+  int GetNbRotations (int iPattern){
+    return 7;
+  }
+};
+
+class SwapPatternN : public SwapPattern{
+  void GetTriangleWithoutRot(int iPattern, int iTriangle,int tri[3]){
+    tri[0] = 0;
+    tri[1] = iTriangle+1;
+    tri[2] = iTriangle+2;
+  }
+public :
+  SwapPatternN(int N){NbPatterns = 1;NbNod = N;}
+  int GetNbRotations (int iPattern){
+    return 8;
+  }
+};
+
+
+#endif
diff --git a/Mesh/Vertex.cpp b/Mesh/Vertex.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e3a04a1abab0e86cc6696382447d87ff099a4fb8
--- /dev/null
+++ b/Mesh/Vertex.cpp
@@ -0,0 +1,120 @@
+#include "Vertex.h"
+#include <stddef.h>
+#include <stdlib.h>
+#include <math.h>
+
+Vertex::Vertex (){
+  Frozen = 0;
+  Pos.X = 0.0;
+  Pos.Y = 0.0;
+  Pos.Z = 0.0;
+  lc = 1.0;
+  Mov = NULL;
+  ListSurf = ListCurves = Extruded_Points = NULL;
+}
+
+Vertex::Vertex (double X, double Y, double Z, double l, double W){
+  Frozen = 0;
+  Pos.X = X;
+  Pos.Y = Y;
+  Pos.Z = Z;
+  w = W;
+  lc = l;
+  Mov = NULL;
+  ListSurf = ListCurves = Extruded_Points = NULL;
+}
+
+void Vertex::norme (){
+  double d = sqrt (Pos.X * Pos.X + Pos.Y * Pos.Y + Pos.Z * Pos.Z);
+  if (d == 0.0)
+    return;
+  Pos.X /= d;
+  Pos.Y /= d;
+  Pos.Z /= d;
+}
+
+
+Vertex Vertex::operator + (const Vertex & other){
+  return Vertex (Pos.X + other.Pos.X, Pos.Y + 
+		 other.Pos.Y, Pos.Z + other.Pos.Z, lc, w);
+}
+
+Vertex Vertex::operator - (const Vertex & other){
+  return Vertex (Pos.X - other.Pos.X, Pos.Y - 
+		 other.Pos.Y, Pos.Z - other.Pos.Z, lc, w);
+}
+
+Vertex Vertex::operator / (double d){
+  return Vertex (Pos.X / d, Pos.Y / d, Pos.Z / d, lc, w);
+}
+Vertex Vertex::operator * (double d){
+  return Vertex (Pos.X * d, Pos.Y * d, Pos.Z * d, lc, w);
+}
+
+Vertex Vertex::operator % (Vertex & autre){ // cross product
+  return Vertex (Pos.Y * autre.Pos.Z - Pos.Z * autre.Pos.Y,
+		 -(Pos.X * autre.Pos.Z - Pos.Z * autre.Pos.X),
+		 Pos.X * autre.Pos.Y - Pos.Y * autre.Pos.X, lc, w);
+}
+
+double Vertex::operator * (const Vertex & other){
+  return Pos.X * other.Pos.X + Pos.Y * other.Pos.Y + Pos.Z * other.Pos.Z;
+}
+
+Vertex *Create_Vertex (int Num, double X, double Y, double Z, double lc, double u){
+  Vertex *pV;
+
+  pV = new Vertex (X, Y, Z, lc);
+  pV->w = 1.0;
+  pV->Num = Num;
+  pV->u = u;
+  return pV;
+}
+
+int compareVertex (const void *a, const void *b){
+  int i, j;
+  Vertex **q, **w;
+
+  q = (Vertex **) a;
+  w = (Vertex **) b;
+  i = abs ((*q)->Num);
+  j = abs ((*w)->Num);
+
+  return (i - j);
+}
+
+int comparePosition (const void *a, const void *b){
+  int i, j;
+  Vertex **q, **w;
+  extern double LC;
+  double eps = 1.e-6 * LC;
+
+  q = (Vertex **) a;
+  w = (Vertex **) b;
+  i = ((*q)->Num);
+  j = ((*w)->Num);
+
+  if ((*q)->Pos.X - (*w)->Pos.X > eps)
+    return (1);
+  if ((*q)->Pos.X - (*w)->Pos.X < -eps)
+    return (-1);
+  if ((*q)->Pos.Y - (*w)->Pos.Y > eps)
+    return (1);
+  if ((*q)->Pos.Y - (*w)->Pos.Y < -eps)
+    return (-1);
+  if ((*q)->Pos.Z - (*w)->Pos.Z > eps)
+    return (1);
+  if ((*q)->Pos.Z - (*w)->Pos.Z < -eps)
+    return (-1);
+
+  if (i != j){
+      /*
+         *w = *q;
+         printf("Les points %d et %d sont a la meme position\n",i,j);
+         printf("%12.5E %12.5E %12.5E\n",(*w)->Pos.X,(*w)->Pos.Y,(*w)->Pos.Z);
+         printf("%12.5E %12.5E %12.5E\n",(*q)->Pos.X,(*q)->Pos.Y,(*q)->Pos.Z);
+       */
+    }
+  return 0;
+
+}
diff --git a/Mesh/Vertex.h b/Mesh/Vertex.h
new file mode 100644
index 0000000000000000000000000000000000000000..831b16735b85c311832ab399cc05a877df313ea4
--- /dev/null
+++ b/Mesh/Vertex.h
@@ -0,0 +1,43 @@
+/*
+  Classe de Points (Vertex)
+  premiere classe de gmsh
+  pas d'encapsulation a priori
+  mais peut-etre dans la suite
+*/
+
+#ifndef _VERTEX_H_
+#define _VERTEX_H_
+
+#include "List.h"
+
+typedef struct {
+  double X,Y,Z;
+}Coord;
+
+class Vertex {
+  public :
+  int     Num;
+  int     Frozen;
+  double  lc,u,us[3],w;
+  Coord   Pos;
+  Coord  *Mov;
+  Coord   Freeze;
+  List_T *ListSurf;
+  List_T *ListCurves;
+  List_T *Extruded_Points;
+  Vertex ();
+  Vertex (double x,double y,double z =0.0, double lc = 1.0, double w = 1.0);
+  Vertex operator + ( const Vertex &other);
+  Vertex operator - ( const Vertex &other);
+  double operator * ( const Vertex &other);
+  Vertex operator * ( double d );
+  Vertex operator / ( double d );
+  Vertex operator % (Vertex &autre); // cross product
+  void norme();
+};
+
+int compareVertex (const void *a, const void *b);
+Vertex *Create_Vertex (int Num, double X, double Y, double Z, double lc, double u);
+int comparePosition (const void *a, const void *b);
+
+#endif
diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l
new file mode 100644
index 0000000000000000000000000000000000000000..222fb5b797f8bec0c20d33c6b9e7a0c4ae2df26a
--- /dev/null
+++ b/Parser/Gmsh.l
@@ -0,0 +1,293 @@
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Gmsh.tab.cpp.h"
+
+char   TmpString[1024];
+int    yywhere = INFILE;
+int    yylineno = 1;
+
+void   parsestring(char endchar);
+char  *strsave(char *ptr);
+void   skipcomments(void);
+void   skipline(void);
+
+#define YY_ALWAYS_INTERACTIVE 1
+
+#define YY_INPUT(buf,result,max_size)					\
+   if ( yy_current_buffer->yy_is_interactive )				\
+     {									\
+       int c = '*', n;							\
+       for ( n = 0; n < max_size &&					\
+	       (c = getc( yyin )) != EOF && c != '\n'; ++n )		\
+	 buf[n] = (char) c;						\
+       if ( c == '\n' ){						\
+	 buf[n++] = (char) c;						\
+	 yylineno++;							\
+       }								\
+       if ( c == EOF && ferror( yyin ) )				\
+	 YY_FATAL_ERROR( "input in flex scanner failed" );		\
+       result = n;							\
+     }									\
+   else if ( ((result = fread( buf, 1, max_size, yyin )) == 0)		\
+	     && ferror( yyin ) )					\
+     YY_FATAL_ERROR( "input in flex scanner failed" );
+
+%}
+
+alpha	[a-zA-Z\_]
+dieze	[\#]
+special	[\.]
+digit	[0-9]
+exp	[Ee][-+]?{digit}+
+string	{alpha}({alpha}|{digit})*
+stepid  {dieze}({digit})*
+
+%e       2000
+%p       7000
+%n       2000
+%k       1500
+%a       7000
+%o       7000
+
+%%
+
+[\ \t\n]		/* none */ ;
+[;]                     return tEND;
+
+"/*"			skipcomments();
+"//"			skipline();
+"\""			{parsestring('\"'); return tBIGSTR;}
+"\'"			{parsestring('\''); return tBIGSTR;}
+"newreg"		{yylval.d = NEWREG(); return tDOUBLE;}
+"newp"  		{yylval.d = NEWPOINT(); return tDOUBLE;}
+"="                     return tAFFECT;
+"..."                   return tDOTS;
+
+
+ACos                    return tAcos ;
+ArcCos                  return tAcos ;
+Asin                    return tAsin;
+ArcSin                  return tAsin;
+Atan                    return tAtan ;
+ArcTan                  return tAtan ;
+Atan2                   return tAtan2 ;
+ArcTan2                 return tAtan2 ;
+Association             return tAssociation;
+Attractor		return tAttractor;
+
+Bump                    return tBump;
+BSpline			return tBSpline;
+Bounds			return tBounds;
+
+Ceil                    return tCeil ;
+Cosh                    return tCosh ;
+Cos                     return tCos ;
+Characteristic          return tCharacteristic;
+Circle                  return tCircle;
+Coherence               return tCoherence;
+Complex                 return tComplex;
+Color                   return tColor;
+CatmullRom		return tSpline;
+
+Delete                  return tDelete;
+Dilate                  return tDilate;
+Duplicata               return tDuplicata;
+
+Exp                     return tExp ;
+Ellipsis                return tEllipsis;
+Extrude                 return tExtrude;
+Elliptic		return tElliptic;
+ELLIPSE                 return tELLIPSE;
+
+Fabs                    return tFabs ;
+Floor                   return tFloor ;
+Fmod                    return tFmod ;
+
+General                 return tGeneral;
+Geometry                return tGeometry;
+
+Hypot                   return tHypot ;
+
+Include                 return tInclude;
+
+Knots			return tKnots;
+
+Length                  return tLength;
+Line                    return tLine;
+Loop                    return tLoop;
+Log                     return tLog ;
+Log10                   return tLog10 ;
+Layers                  return tLayers;
+
+Mesh                    return tMesh;
+Modulo                  return tModulo ;
+
+Nurbs			return tNurbs;
+
+Offset                  return tOffset;
+Order			return tOrder;
+
+Physical                return tPhysical;
+Pi                      return tPi;
+Plane                   return tPlane;
+Point                   return tPoint;
+Power                   return tPower;
+Progression             return tProgression;
+Parametric		return tParametric;
+
+Recombine               return tRecombine;
+Rotate                  return tRotate;
+Ruled                   return tRuled;
+
+Sqrt                    return tSqrt ;
+Sin                     return tSin ;
+Sinh                    return tSinh ;
+Save                    return tPhysical;
+Spline                  return tSpline;
+Surface                 return tSurface;
+Symetry                 return tSymetry;
+
+Transfinite             return tTransfinite;
+Translate               return tTranslate;
+Tanh                    return tTanh ;
+Tan                     return tTan;
+Trimmed			return tTrimmed;
+
+Using                   return tUsing;
+
+View                    return tView;
+Volume                  return tVolume;
+
+With			return tWith;
+
+
+SS                      return tScalarSimplex;
+VS                      return tVectorSimplex;
+TS                      return tTensorSimplex;
+ST                      return tScalarTriangle;
+VT                      return tVectorTriangle;
+TT                      return tTensorTriangle;
+SL                      return tScalarLine;
+VL                      return tVectorLine;
+TL                      return tTensorLine;
+SP                      return tScalarPoint;
+VP                      return tVectorPoint;
+TP                      return tTensorPoint;
+
+
+CARTESIAN_POINT         	   return tCARTESIAN_POINT;
+B_SPLINE_SURFACE_WITH_KNOTS        return tB_SPLINE_SURFACE_WITH_KNOTS;
+B_SPLINE_CURVE_WITH_KNOTS          return tB_SPLINE_CURVE_WITH_KNOTS;
+.UNSPECIFIED.                      return tUNSPECIFIED;
+.CONTINUOUS.                       return tCONTINUOUS;
+".F."                              return tFALSE;
+".T."                              return tTRUE;
+".U."				   return tU;
+".V."				   return tV;
+ORIENTED_EDGE                      return tORIENTED_EDGE;
+EDGE_CURVE			   return tEDGE_CURVE;
+EDGE_LOOP 			   return tEDGE_LOOP;
+VERTEX_POINT			   return tVERTEX_POINT;
+FACE_OUTER_BOUND     		   return tFACE_OUTER_BOUND;
+FACE_BOUND		     	   return tFACE_BOUND;
+ADVANCED_FACE			   return tADVANCED_FACE;
+LINE				   return tLine;
+VECTOR				   return tVECTOR;
+DIRECTION			   return tDIRECTION;
+AXIS2_PLACEMENT_3D 		   return tAXIS2_PLACEMENT_3D;
+PLANE				   return tPLANE;
+HEADER                             return tHEADER;
+DATA                               return tDATA;
+FILE_SCHEMA                        return tFILE_SCHEMA;
+FILE_NAME	                   return tFILE_NAME;
+FILE_DESCRIPTION                   return tFILE_DESCRIPTION;
+"ISO-10303-21"			   return tISO;
+"END-ISO-10303-21"		   return tENDISO;
+ENDSEC				   return tENDSEC;
+CLOSED_SHELL			   return tCLOSED_SHELL;
+ADVANCED_BREP_SHAPE_REPRESENTATION  return  tADVANCED_BREP_SHAPE_REPRESENTATION;
+MANIFOLD_SOLID_BREP		   return tMANIFOLD_SOLID_BREP;
+CYLINDRICAL_SURFACE		   return tCYLINDRICAL_SURFACE;
+CONICAL_SURFACE			   return tCONICAL_SURFACE;
+TOROIDAL_SURFACE		   return tTOROIDAL_SURFACE;
+CIRCLE				   return tCIRCLE;
+TRIMMED_CURVE			   return tTRIMMED_CURVE;
+GEOMETRIC_SET			   return tGEOMETRIC_SET;
+COMPOSITE_CURVE_SEGMENT		   return tCOMPOSITE_CURVE_SEGMENT;
+COMPOSITE_CURVE			   return tCOMPOSITE_CURVE;
+PRODUCT_DEFINITION                 return tPRODUCT_DEFINITION;
+PRODUCT_DEFINITION_SHAPE           return tPRODUCT_DEFINITION_SHAPE;
+SHAPE_DEFINITION_REPRESENTATION    return tSHAPE_DEFINITION_REPRESENTATION;
+
+vertex       return tVertex;
+facet        return tFacet;
+normal       return tNormal;
+outer        return tOuter;
+loop         return tLoopSTL;
+endloop      return tEndLoop;
+endfacet     return tEndFacet;
+endsolid     {skipline();return tEndSolid;}
+solid        {skipline();return tSolid;}
+
+{stepid}                {yylval.d = (double)atoi((char*)(yytext+1)); return tDOUBLE;}
+
+{digit}+ |
+{digit}+"."{digit}*({exp})? |
+{digit}*"."{digit}+({exp})? |
+{digit}+{exp}           {yylval.d = atof((char *)yytext); return tDOUBLE;}
+
+{string}		{yylval.c = strsave((char*)yytext); return tSTRING;}
+
+.                       return yytext[0];
+
+%%
+
+#undef yywrap
+
+int yywrap() {return 1;}
+
+void skipcomments(void) {
+  int c;
+
+  while (1) {
+    while ((c=yyinput()) != '*'){
+      if(c == EOF) {
+        fprintf(stderr, "Error: End of File in Commented Region\n") ;
+        exit(1);
+      }
+    }
+    if ((c = yyinput()) == '/')
+      return;
+    unput(c);
+  }
+}
+
+void parsestring(char endchar){
+  int c, i;
+
+  c = yyinput();
+  i = 0;
+  while (c != endchar) {
+    TmpString[i++] = c;
+    c = yyinput();
+  }
+  TmpString[i++] = '\0';
+  yylval.c = strsave(TmpString);
+}
+
+char *strsave(char *ptr){
+  return((char*)strcpy((char*)malloc(strlen(ptr)+1),ptr));
+}
+
+void skipline(void)
+{
+   while (yyinput() != '\n') ;
+}
+
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6831e1452840358e79820ab9f0f6183e37c5dac6
--- /dev/null
+++ b/Parser/Gmsh.tab.cpp
@@ -0,0 +1,3702 @@
+
+/*  A Bison parser, made from Gmsh.y
+    by GNU Bison version 1.28  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define	tDOUBLE	257
+#define	tSTRING	258
+#define	tBIGSTR	259
+#define	tEND	260
+#define	tAFFECT	261
+#define	tDOTS	262
+#define	tPi	263
+#define	tExp	264
+#define	tLog	265
+#define	tLog10	266
+#define	tSqrt	267
+#define	tSin	268
+#define	tAsin	269
+#define	tCos	270
+#define	tAcos	271
+#define	tTan	272
+#define	tAtan	273
+#define	tAtan2	274
+#define	tSinh	275
+#define	tCosh	276
+#define	tTanh	277
+#define	tFabs	278
+#define	tFloor	279
+#define	tCeil	280
+#define	tFmod	281
+#define	tModulo	282
+#define	tHypot	283
+#define	tPoint	284
+#define	tCircle	285
+#define	tEllipsis	286
+#define	tLine	287
+#define	tSurface	288
+#define	tSpline	289
+#define	tVolume	290
+#define	tCharacteristic	291
+#define	tLength	292
+#define	tParametric	293
+#define	tElliptic	294
+#define	tPlane	295
+#define	tRuled	296
+#define	tTransfinite	297
+#define	tComplex	298
+#define	tPhysical	299
+#define	tUsing	300
+#define	tPower	301
+#define	tBump	302
+#define	tProgression	303
+#define	tAssociation	304
+#define	tRotate	305
+#define	tTranslate	306
+#define	tSymetry	307
+#define	tDilate	308
+#define	tExtrude	309
+#define	tDuplicata	310
+#define	tLoop	311
+#define	tInclude	312
+#define	tRecombine	313
+#define	tDelete	314
+#define	tCoherence	315
+#define	tView	316
+#define	tOffset	317
+#define	tAttractor	318
+#define	tLayers	319
+#define	tScalarSimplex	320
+#define	tVectorSimplex	321
+#define	tTensorSimplex	322
+#define	tScalarTriangle	323
+#define	tVectorTriangle	324
+#define	tTensorTriangle	325
+#define	tScalarLine	326
+#define	tVectorLine	327
+#define	tTensorLine	328
+#define	tScalarPoint	329
+#define	tVectorPoint	330
+#define	tTensorPoint	331
+#define	tBSpline	332
+#define	tNurbs	333
+#define	tOrder	334
+#define	tWith	335
+#define	tBounds	336
+#define	tKnots	337
+#define	tColor	338
+#define	tGeneral	339
+#define	tGeometry	340
+#define	tMesh	341
+#define	tB_SPLINE_SURFACE_WITH_KNOTS	342
+#define	tB_SPLINE_CURVE_WITH_KNOTS	343
+#define	tCARTESIAN_POINT	344
+#define	tTRUE	345
+#define	tFALSE	346
+#define	tUNSPECIFIED	347
+#define	tU	348
+#define	tV	349
+#define	tEDGE_CURVE	350
+#define	tVERTEX_POINT	351
+#define	tORIENTED_EDGE	352
+#define	tPLANE	353
+#define	tFACE_OUTER_BOUND	354
+#define	tEDGE_LOOP	355
+#define	tADVANCED_FACE	356
+#define	tVECTOR	357
+#define	tDIRECTION	358
+#define	tAXIS2_PLACEMENT_3D	359
+#define	tISO	360
+#define	tENDISO	361
+#define	tENDSEC	362
+#define	tDATA	363
+#define	tHEADER	364
+#define	tFILE_DESCRIPTION	365
+#define	tFILE_SCHEMA	366
+#define	tFILE_NAME	367
+#define	tMANIFOLD_SOLID_BREP	368
+#define	tCLOSED_SHELL	369
+#define	tADVANCED_BREP_SHAPE_REPRESENTATION	370
+#define	tFACE_BOUND	371
+#define	tCYLINDRICAL_SURFACE	372
+#define	tCONICAL_SURFACE	373
+#define	tCIRCLE	374
+#define	tTRIMMED_CURVE	375
+#define	tGEOMETRIC_SET	376
+#define	tCOMPOSITE_CURVE_SEGMENT	377
+#define	tCONTINUOUS	378
+#define	tCOMPOSITE_CURVE	379
+#define	tTOROIDAL_SURFACE	380
+#define	tPRODUCT_DEFINITION	381
+#define	tPRODUCT_DEFINITION_SHAPE	382
+#define	tSHAPE_DEFINITION_REPRESENTATION	383
+#define	tELLIPSE	384
+#define	tTrimmed	385
+#define	tSolid	386
+#define	tEndSolid	387
+#define	tVertex	388
+#define	tFacet	389
+#define	tNormal	390
+#define	tOuter	391
+#define	tLoopSTL	392
+#define	tEndLoop	393
+#define	tEndFacet	394
+#define	UMINUS	395
+
+#line 1 "Gmsh.y"
+
+#include <stdarg.h>
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Context.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "DataBase.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "Views.h"
+#include "StepGeomDatabase.h"
+#include "Colors.h"
+#include "Parser.h"
+
+extern Mesh    *THEM;
+extern char     ThePathForIncludes[NAME_STR_L];
+
+FILE           *yyinTab[20];
+int             yylinenoTab[20];
+char            yynameTab[20][256];
+char            tmpstring[256];
+Symbol          TheSymbol;
+Surface        *STL_Surf;
+Shape           TheShape;
+unsigned int    *ptr ;
+int             i,j,k,flag,RecursionLevel=0,Loop[4];
+double          d;
+ExtrudeParams   extr;
+List_T         *Symbol_L;
+List_T         *ListOfDouble_L,*ListOfDouble2_L;
+List_T         *ListOfListOfDouble_L;
+StringXPointer *ColorField ;
+
+void  yyerror (char *s);
+void  vyyerror (char *fmt, ...);
+int   Get_ColorForString(StringX4Int SX4I[], int alpha, 
+			 char * string, int * FlagError);
+void  Get_ColorPointerForString(StringXPointer SXP[], char * string,
+				int * FlagError, unsigned int **Pointer);
+
+
+#line 45 "Gmsh.y"
+typedef union {
+  char    *c;
+  int      i;
+  double   d;
+  double   v[5];
+  Shape    s;
+  List_T  *l;
+} YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		1273
+#define	YYFLAG		-32768
+#define	YYNTBASE	157
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 395 ? yytranslate[x] : 213)
+
+static const short yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,   147,     2,     2,   150,
+   152,   145,   143,   151,   144,     2,   146,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,   141,
+     2,   142,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+   155,     2,   156,   149,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,   153,     2,   154,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
+     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+    47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+    57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+   107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+   117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+   127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+   137,   138,   139,   140,   148
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     6,     8,    30,    32,    33,    36,    38,
+    40,    42,    45,    48,    51,    54,    57,    60,    68,    74,
+    92,   102,   126,   158,   174,   186,   198,   214,   224,   238,
+   248,   260,   274,   284,   294,   306,   316,   328,   338,   350,
+   364,   378,   390,   404,   422,   432,   444,   456,   470,   482,
+   492,   493,   496,   498,   500,   502,   504,   506,   508,   510,
+   512,   514,   516,   518,   521,   528,   537,   538,   541,   544,
+   547,   550,   553,   556,   559,   562,   565,   568,   571,   574,
+   603,   632,   661,   684,   707,   730,   747,   764,   781,   792,
+   803,   814,   819,   827,   836,   849,   856,   862,   870,   878,
+   891,   899,   909,   927,   935,   944,   953,   959,   967,   979,
+   988,   998,  1007,  1030,  1051,  1060,  1069,  1075,  1084,  1092,
+  1101,  1109,  1121,  1129,  1139,  1141,  1143,  1145,  1146,  1149,
+  1154,  1159,  1163,  1171,  1180,  1192,  1205,  1218,  1227,  1240,
+  1249,  1261,  1277,  1279,  1282,  1292,  1299,  1309,  1319,  1329,
+  1338,  1347,  1356,  1363,  1368,  1377,  1380,  1385,  1386,  1389,
+  1390,  1396,  1397,  1403,  1404,  1410,  1411,  1414,  1419,  1428,
+  1433,  1443,  1451,  1453,  1455,  1457,  1459,  1461,  1463,  1467,
+  1471,  1475,  1479,  1483,  1487,  1490,  1493,  1498,  1503,  1508,
+  1513,  1518,  1523,  1528,  1533,  1538,  1543,  1550,  1555,  1560,
+  1565,  1570,  1575,  1580,  1587,  1594,  1601,  1603,  1605,  1607,
+  1611,  1618,  1630,  1640,  1648,  1656,  1657,  1661,  1663,  1667,
+  1668,  1672,  1676,  1678,  1682,  1683,  1685,  1689,  1691,  1693,
+  1697
+};
+
+static const short yyrhs[] = {   164,
+     0,   159,     0,   158,     0,   132,     0,   135,   136,     3,
+     3,     3,   137,   138,   134,     3,     3,     3,   134,     3,
+     3,     3,   134,     3,     3,     3,   139,   140,     0,   133,
+     0,     0,   159,   160,     0,   161,     0,   163,     0,   162,
+     0,     1,     6,     0,   106,     6,     0,   107,     6,     0,
+   109,     6,     0,   108,     6,     0,   110,     6,     0,   111,
+   150,   207,   151,     5,   152,     6,     0,   112,   150,   207,
+   152,     6,     0,   113,   150,     5,   151,     5,   151,   207,
+   151,   207,   151,     5,   151,     5,   151,     5,   152,     6,
+     0,     3,     7,    90,   150,     5,   151,   206,   152,     6,
+     0,     3,     7,    89,   150,     5,   151,   203,   151,   211,
+   151,   202,   151,   202,   151,   202,   151,   211,   151,   211,
+   151,   202,   152,     6,     0,     3,     7,    88,   150,     5,
+   151,   203,   151,   203,   151,   209,   151,   202,   151,   202,
+   151,   202,   151,   202,   151,   211,   151,   211,   151,   211,
+   151,   211,   151,   202,   152,     6,     0,     3,     7,    96,
+   150,     5,   151,     3,   151,     3,   151,     3,   151,   202,
+   152,     6,     0,     3,     7,   100,   150,     5,   151,     3,
+   151,   202,   152,     6,     0,     3,     7,   117,   150,     5,
+   151,     3,   151,   202,   152,     6,     0,     3,     7,    98,
+   150,     5,   151,   145,   151,   145,   151,   203,   151,   202,
+   152,     6,     0,     3,     7,   101,   150,     5,   151,   211,
+   152,     6,     0,     3,     7,   102,   150,     5,   151,   211,
+   151,     3,   151,   202,   152,     6,     0,     3,     7,    97,
+   150,     5,   151,     3,   152,     6,     0,     3,     7,   103,
+   150,     5,   151,     3,   151,   203,   152,     6,     0,     3,
+     7,   105,   150,     5,   151,     3,   151,     3,   151,     3,
+   152,     6,     0,     3,     7,   104,   150,     5,   151,   206,
+   152,     6,     0,     3,     7,    99,   150,     5,   151,     3,
+   152,     6,     0,     3,     7,    33,   150,     5,   151,     3,
+   151,     3,   152,     6,     0,     3,     7,   115,   150,     5,
+   151,   211,   152,     6,     0,     3,     7,   116,   150,     5,
+   151,   211,   151,     3,   152,     6,     0,     3,     7,   114,
+   150,     5,   151,     3,   152,     6,     0,     3,     7,   118,
+   150,     5,   151,     3,   151,   203,   152,     6,     0,     3,
+     7,   119,   150,     5,   151,     3,   151,   203,   151,   203,
+   152,     6,     0,     3,     7,   126,   150,     5,   151,     3,
+   151,   203,   151,   203,   152,     6,     0,     3,     7,   120,
+   150,     5,   151,     3,   151,   203,   152,     6,     0,     3,
+     7,   130,   150,     5,   151,     3,   151,   203,   151,   203,
+   152,     6,     0,     3,     7,   121,   150,     5,   151,     3,
+   151,   211,   151,   211,   151,   202,   151,   202,   152,     6,
+     0,     3,     7,   122,   150,     5,   151,   211,   152,     6,
+     0,     3,     7,   123,   150,   124,   151,   202,   151,     3,
+   152,     6,     0,     3,     7,   125,   150,     5,   151,   211,
+   151,   202,   152,     6,     0,     3,     7,   127,   150,     5,
+   151,     5,   151,     3,   151,     3,   152,     6,     0,     3,
+     7,   128,   150,     5,   151,     5,   151,     3,   152,     6,
+     0,     3,     7,   129,   150,     3,   151,     3,   152,     6,
+     0,     0,   164,   165,     0,   166,     0,   180,     0,   181,
+     0,   182,     0,   185,     0,   186,     0,   188,     0,   191,
+     0,   192,     0,   187,     0,   193,     0,     1,     6,     0,
+    62,     5,   153,   167,   154,     6,     0,    62,     5,    63,
+   206,   153,   167,   154,     6,     0,     0,   167,   168,     0,
+   167,   169,     0,   167,   170,     0,   167,   171,     0,   167,
+   172,     0,   167,   173,     0,   167,   174,     0,   167,   175,
+     0,   167,   176,     0,   167,   177,     0,   167,   178,     0,
+   167,   179,     0,    66,   150,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   151,   203,   152,   211,
+     6,     0,    67,   150,   203,   151,   203,   151,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   151,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   152,   211,     6,
+     0,    68,   150,   203,   151,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   152,   211,     6,     0,
+    69,   150,   203,   151,   203,   151,   203,   151,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   151,   203,   152,
+   211,     6,     0,    70,   150,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   151,   203,   151,   203,
+   151,   203,   152,   211,     6,     0,    71,   150,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   151,   203,   151,
+   203,   151,   203,   151,   203,   152,   211,     6,     0,    72,
+   150,   203,   151,   203,   151,   203,   151,   203,   151,   203,
+   151,   203,   152,   211,     6,     0,    73,   150,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   151,   203,   152,
+   211,     6,     0,    74,   150,   203,   151,   203,   151,   203,
+   151,   203,   151,   203,   151,   203,   152,   211,     6,     0,
+    75,   150,   203,   151,   203,   151,   203,   152,   211,     6,
+     0,    76,   150,   203,   151,   203,   151,   203,   152,   211,
+     6,     0,    77,   150,   203,   151,   203,   151,   203,   152,
+   211,     6,     0,     4,     7,   203,     6,     0,    30,   150,
+   203,   152,     7,   206,     6,     0,    45,    30,   150,   203,
+   152,     7,   211,     6,     0,    64,    30,   150,   203,   151,
+   203,   151,   203,   152,     7,   211,     6,     0,    37,    38,
+   211,     7,   203,     6,     0,    30,   150,   203,   152,     6,
+     0,    33,   150,   203,   152,     7,   211,     6,     0,    35,
+   150,   203,   152,     7,   211,     6,     0,    64,    33,   150,
+   203,   151,   203,   151,   203,   152,     7,   211,     6,     0,
+    31,   150,   203,   152,     7,   211,     6,     0,    31,   150,
+   203,   152,     7,   211,    41,   206,     6,     0,    39,   150,
+   203,   152,     7,   150,   203,   151,   203,   151,     5,   151,
+     5,   151,     5,   152,     6,     0,    32,   150,   203,   152,
+     7,   211,     6,     0,    45,    33,   150,   203,   152,     7,
+   211,     6,     0,    33,    57,   150,   203,   152,     7,   211,
+     6,     0,    33,   150,   203,   152,     6,     0,    78,   150,
+   203,   152,     7,   211,     6,     0,    79,   150,   203,   152,
+     7,   211,    83,   211,    80,   203,     6,     0,    41,    34,
+   150,   203,   152,     7,   211,     6,     0,   131,    34,   150,
+   203,   152,     7,   203,   211,     6,     0,    42,    34,   150,
+   203,   152,     7,   211,     6,     0,    79,    34,    81,    82,
+   150,   203,   152,     7,   209,    83,   153,   211,   151,   211,
+   154,    80,   153,   203,   151,   203,   154,     6,     0,    79,
+    34,   150,   203,   152,     7,   209,    83,   153,   211,   151,
+   211,   154,    80,   153,   203,   151,   203,   154,     6,     0,
+    45,    34,   150,   203,   152,     7,   211,     6,     0,    34,
+    57,   150,   203,   152,     7,   211,     6,     0,    34,   150,
+   203,   152,     6,     0,    44,    36,   150,   203,   152,     7,
+   211,     6,     0,    36,   150,   203,   152,     7,   211,     6,
+     0,    45,    36,   150,   203,   152,     7,   211,     6,     0,
+    52,   150,   206,   152,   153,   183,   154,     0,    51,   150,
+   206,   151,   206,   151,   203,   152,   153,   183,   154,     0,
+    53,   150,   206,   152,   153,   183,   154,     0,    54,   150,
+   206,   151,   203,   152,   153,   183,   154,     0,   185,     0,
+   184,     0,   182,     0,     0,   184,   181,     0,    56,   153,
+   184,   154,     0,    60,   153,   184,   154,     0,    58,     5,
+     6,     0,    55,   150,   203,   151,   206,   152,     6,     0,
+    55,    34,   150,   203,   151,   206,   152,     6,     0,    55,
+   150,   203,   151,   206,   151,   206,   151,   203,   152,     6,
+     0,    55,    34,   150,   203,   151,   206,   151,   206,   151,
+   203,   152,     6,     0,    55,    30,   150,   203,   151,   206,
+   151,   206,   151,   203,   152,     6,     0,    55,    30,   150,
+   203,   151,   206,   152,     6,     0,    55,    33,   150,   203,
+   151,   206,   151,   206,   151,   203,   152,     6,     0,    55,
+    33,   150,   203,   151,   206,   152,     6,     0,    55,    34,
+   150,   203,   151,   206,   152,   153,   189,   154,     6,     0,
+    55,    34,   150,   203,   151,   206,   151,   206,   151,   203,
+   152,   153,   189,   154,     6,     0,   190,     0,   189,   190,
+     0,    65,   153,   211,   151,   211,   151,   211,   154,     6,
+     0,    43,    33,   211,     7,   203,     6,     0,    43,    33,
+   211,     7,   203,    46,    47,   203,     6,     0,    43,    33,
+   211,     7,   203,    46,    48,   203,     6,     0,    43,    33,
+   211,     7,   203,    46,    49,   203,     6,     0,    43,    34,
+   153,   203,   154,     7,   211,     6,     0,    40,    34,   153,
+   203,   154,     7,   211,     6,     0,    43,    36,   153,   203,
+   154,     7,   211,     6,     0,    59,    34,   211,     7,   203,
+     6,     0,    59,    34,   211,     6,     0,    45,    50,   150,
+   203,   152,     7,   211,     6,     0,    61,     6,     0,    84,
+   153,   194,   154,     0,     0,   194,   195,     0,     0,    85,
+   196,   153,   199,   154,     0,     0,    86,   197,   153,   199,
+   154,     0,     0,    87,   198,   153,   199,   154,     0,     0,
+   200,   199,     0,     4,     7,     4,     6,     0,     4,     7,
+   153,     4,   151,   203,   154,     6,     0,     4,     7,   201,
+     6,     0,   153,   203,   151,   203,   151,   203,   151,   203,
+   154,     0,   153,   203,   151,   203,   151,   203,   154,     0,
+    91,     0,    92,     0,    93,     0,    94,     0,    95,     0,
+   204,     0,   150,   203,   152,     0,   203,   144,   203,     0,
+   203,   143,   203,     0,   203,   145,   203,     0,   203,   146,
+   203,     0,   203,   149,   203,     0,   144,   203,     0,   143,
+   203,     0,    10,   150,   203,   152,     0,    11,   150,   203,
+   152,     0,    12,   150,   203,   152,     0,    13,   150,   203,
+   152,     0,    14,   150,   203,   152,     0,    15,   150,   203,
+   152,     0,    16,   150,   203,   152,     0,    17,   150,   203,
+   152,     0,    18,   150,   203,   152,     0,    19,   150,   203,
+   152,     0,    20,   150,   203,   151,   203,   152,     0,    21,
+   150,   203,   152,     0,    22,   150,   203,   152,     0,    23,
+   150,   203,   152,     0,    24,   150,   203,   152,     0,    25,
+   150,   203,   152,     0,    26,   150,   203,   152,     0,    27,
+   150,   203,   151,   203,   152,     0,    28,   150,   203,   151,
+   203,   152,     0,    29,   150,   203,   151,   203,   152,     0,
+     3,     0,     9,     0,     4,     0,   203,     8,   203,     0,
+   203,     8,   155,   203,   156,   203,     0,   153,   203,   151,
+   203,   151,   203,   151,   203,   151,   203,   154,     0,   153,
+   203,   151,   203,   151,   203,   151,   203,   154,     0,   153,
+   203,   151,   203,   151,   203,   154,     0,   150,   203,   151,
+   203,   151,   203,   152,     0,     0,   150,   208,   152,     0,
+     5,     0,   208,   151,     5,     0,     0,   153,   210,   154,
+     0,   150,   210,   152,     0,   211,     0,   210,   151,   211,
+     0,     0,   203,     0,   153,   212,   154,     0,   203,     0,
+   205,     0,   212,   151,   203,     0,   212,   151,   205,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   104,   106,   107,   114,   122,   136,   148,   150,   153,   155,
+   156,   157,   160,   166,   171,   172,   173,   176,   180,   183,
+   189,   194,   200,   208,   213,   217,   223,   228,   232,   237,
+   241,   244,   249,   253,   257,   261,   266,   270,   273,   277,
+   281,   285,   289,   293,   297,   300,   304,   307,   311,   314,
+   323,   325,   331,   333,   334,   335,   336,   337,   338,   339,
+   340,   341,   342,   343,   350,   355,   361,   366,   367,   368,
+   369,   370,   371,   372,   373,   374,   375,   376,   377,   380,
+   390,   400,   410,   419,   428,   437,   445,   453,   461,   468,
+   475,   486,   500,   511,   517,   536,   547,   555,   561,   567,
+   586,   592,   608,   615,   621,   627,   633,   642,   648,   668,
+   674,   693,   712,   720,   726,   732,   738,   750,   756,   762,
+   774,   780,   785,   790,   797,   799,   800,   803,   808,   819,
+   837,   852,   883,   888,   892,   896,   900,   906,   911,   915,
+   919,   924,   932,   936,   941,   965,   983,  1000,  1017,  1034,
+  1054,  1073,  1092,  1107,  1122,  1133,  1144,  1148,  1150,  1153,
+  1156,  1157,  1159,  1160,  1162,  1165,  1167,  1170,  1181,  1191,
+  1201,  1209,  1285,  1287,  1288,  1289,  1290,  1293,  1295,  1296,
+  1297,  1298,  1299,  1300,  1301,  1302,  1303,  1304,  1305,  1306,
+  1307,  1308,  1309,  1310,  1311,  1312,  1313,  1314,  1315,  1316,
+  1317,  1318,  1319,  1320,  1321,  1322,  1325,  1327,  1328,  1339,
+  1346,  1359,  1368,  1376,  1384,  1394,  1398,  1403,  1407,  1412,
+  1416,  1420,  1426,  1432,  1438,  1442,  1448,  1461,  1467,  1476,
+  1480
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","tDOUBLE",
+"tSTRING","tBIGSTR","tEND","tAFFECT","tDOTS","tPi","tExp","tLog","tLog10","tSqrt",
+"tSin","tAsin","tCos","tAcos","tTan","tAtan","tAtan2","tSinh","tCosh","tTanh",
+"tFabs","tFloor","tCeil","tFmod","tModulo","tHypot","tPoint","tCircle","tEllipsis",
+"tLine","tSurface","tSpline","tVolume","tCharacteristic","tLength","tParametric",
+"tElliptic","tPlane","tRuled","tTransfinite","tComplex","tPhysical","tUsing",
+"tPower","tBump","tProgression","tAssociation","tRotate","tTranslate","tSymetry",
+"tDilate","tExtrude","tDuplicata","tLoop","tInclude","tRecombine","tDelete",
+"tCoherence","tView","tOffset","tAttractor","tLayers","tScalarSimplex","tVectorSimplex",
+"tTensorSimplex","tScalarTriangle","tVectorTriangle","tTensorTriangle","tScalarLine",
+"tVectorLine","tTensorLine","tScalarPoint","tVectorPoint","tTensorPoint","tBSpline",
+"tNurbs","tOrder","tWith","tBounds","tKnots","tColor","tGeneral","tGeometry",
+"tMesh","tB_SPLINE_SURFACE_WITH_KNOTS","tB_SPLINE_CURVE_WITH_KNOTS","tCARTESIAN_POINT",
+"tTRUE","tFALSE","tUNSPECIFIED","tU","tV","tEDGE_CURVE","tVERTEX_POINT","tORIENTED_EDGE",
+"tPLANE","tFACE_OUTER_BOUND","tEDGE_LOOP","tADVANCED_FACE","tVECTOR","tDIRECTION",
+"tAXIS2_PLACEMENT_3D","tISO","tENDISO","tENDSEC","tDATA","tHEADER","tFILE_DESCRIPTION",
+"tFILE_SCHEMA","tFILE_NAME","tMANIFOLD_SOLID_BREP","tCLOSED_SHELL","tADVANCED_BREP_SHAPE_REPRESENTATION",
+"tFACE_BOUND","tCYLINDRICAL_SURFACE","tCONICAL_SURFACE","tCIRCLE","tTRIMMED_CURVE",
+"tGEOMETRIC_SET","tCOMPOSITE_CURVE_SEGMENT","tCONTINUOUS","tCOMPOSITE_CURVE",
+"tTOROIDAL_SURFACE","tPRODUCT_DEFINITION","tPRODUCT_DEFINITION_SHAPE","tSHAPE_DEFINITION_REPRESENTATION",
+"tELLIPSE","tTrimmed","tSolid","tEndSolid","tVertex","tFacet","tNormal","tOuter",
+"tLoopSTL","tEndLoop","tEndFacet","'<'","'>'","'+'","'-'","'*'","'/'","'%'",
+"UMINUS","'^'","'('","','","')'","'{'","'}'","'['","']'","All","STLFormatItem",
+"StepFormatItems","StepFormatItem","StepSpecial","StepHeaderItem","StepDataItem",
+"GeomFormatList","GeomFormat","View","Views","ScalarSimplex","VectorSimplex",
+"TensorSimplex","ScalarTriangle","VectorTriangle","TensorTriangle","ScalarLine",
+"VectorLine","TensorLine","ScalarPoint","VectorPoint","TensorPoint","Affectation",
+"Shape","Transform","MultipleShape","ListOfShapes","Duplicata","Delete","Macro",
+"Extrude","ExtrudeParameters","ExtrudeParameter","Transfini","Coherence","Colors",
+"ColorSections","ColorSection","@1","@2","@3","ColorAffects","ColorAffect","RGBAExpr",
+"BoolExpr","FExpr","FExpr_Single","FExpr_Range","VExpr","ListOfStrings","RecursiveListOfStrings",
+"ListOfListOfDouble","RecursiveListOfListOfDouble","ListOfDouble","RecursiveListOfDouble", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+   157,   157,   157,   158,   158,   158,   159,   159,   160,   160,
+   160,   160,   161,   161,   161,   161,   161,   162,   162,   162,
+   163,   163,   163,   163,   163,   163,   163,   163,   163,   163,
+   163,   163,   163,   163,   163,   163,   163,   163,   163,   163,
+   163,   163,   163,   163,   163,   163,   163,   163,   163,   163,
+   164,   164,   165,   165,   165,   165,   165,   165,   165,   165,
+   165,   165,   165,   165,   166,   166,   167,   167,   167,   167,
+   167,   167,   167,   167,   167,   167,   167,   167,   167,   168,
+   169,   170,   171,   172,   173,   174,   175,   176,   177,   178,
+   179,   180,   181,   181,   181,   181,   181,   181,   181,   181,
+   181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
+   181,   181,   181,   181,   181,   181,   181,   181,   181,   181,
+   182,   182,   182,   182,   183,   183,   183,   184,   184,   185,
+   186,   187,   188,   188,   188,   188,   188,   188,   188,   188,
+   188,   188,   189,   189,   190,   191,   191,   191,   191,   191,
+   191,   191,   191,   191,   191,   192,   193,   194,   194,   196,
+   195,   197,   195,   198,   195,   199,   199,   200,   200,   200,
+   201,   201,   202,   202,   202,   202,   202,   203,   203,   203,
+   203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+   203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+   203,   203,   203,   203,   203,   203,   204,   204,   204,   205,
+   205,   206,   206,   206,   206,   207,   207,   208,   208,   209,
+   209,   209,   210,   210,   211,   211,   211,   212,   212,   212,
+   212
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     1,     1,    21,     1,     0,     2,     1,     1,
+     1,     2,     2,     2,     2,     2,     2,     7,     5,    17,
+     9,    23,    31,    15,    11,    11,    15,     9,    13,     9,
+    11,    13,     9,     9,    11,     9,    11,     9,    11,    13,
+    13,    11,    13,    17,     9,    11,    11,    13,    11,     9,
+     0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     1,     2,     6,     8,     0,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,    28,
+    28,    28,    22,    22,    22,    16,    16,    16,    10,    10,
+    10,     4,     7,     8,    12,     6,     5,     7,     7,    12,
+     7,     9,    17,     7,     8,     8,     5,     7,    11,     8,
+     9,     8,    22,    20,     8,     8,     5,     8,     7,     8,
+     7,    11,     7,     9,     1,     1,     1,     0,     2,     4,
+     4,     3,     7,     8,    11,    12,    12,     8,    12,     8,
+    11,    15,     1,     2,     9,     6,     9,     9,     9,     8,
+     8,     8,     6,     4,     8,     2,     4,     0,     2,     0,
+     5,     0,     5,     0,     5,     0,     2,     4,     8,     4,
+     9,     7,     1,     1,     1,     1,     1,     1,     3,     3,
+     3,     3,     3,     3,     2,     2,     4,     4,     4,     4,
+     4,     4,     4,     4,     4,     4,     6,     4,     4,     4,
+     4,     4,     4,     6,     6,     6,     1,     1,     1,     3,
+     6,    11,     9,     7,     7,     0,     3,     1,     3,     0,
+     3,     3,     1,     3,     0,     1,     3,     1,     1,     3,
+     3
+};
+
+static const short yydefact[] = {    51,
+     4,     6,     0,     3,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     8,     9,    11,
+    10,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    52,    53,    54,    55,    56,    57,
+    58,    62,    59,    60,    61,    63,     0,    12,     0,    13,
+    14,    16,    15,    17,   216,   216,     0,    64,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   225,     0,
+     0,     0,     0,   225,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+   128,     0,   225,   128,   156,     0,     0,     0,     0,     0,
+     0,   158,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   207,   209,
+   208,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   178,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,   226,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   132,     0,     0,     0,    67,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,   218,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,   186,   185,     0,    92,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   228,
+   229,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   130,   129,   154,
+     0,   131,     0,     0,     0,     0,     0,     0,     0,     0,
+   160,   162,   164,   157,   159,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   217,     0,
+    19,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   179,   181,   180,   182,   183,   184,    97,     0,
+   225,   225,     0,   107,   225,     0,   117,   225,   225,     0,
+     0,   227,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   128,
+   128,     0,     0,     0,     0,     0,     0,    67,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,     0,     0,   225,     0,     0,   225,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,   225,   225,     0,     0,     0,     0,   225,
+   225,     0,     0,     0,     0,     0,   225,     0,   225,     0,
+     0,     0,     0,     0,   219,     0,   216,   187,   188,   189,
+   190,   191,   192,   193,   194,   195,   196,     0,   198,   199,
+   200,   201,   202,   203,     0,     0,     0,     0,     0,     0,
+   225,     0,   225,     0,     0,     0,   210,   230,   231,    96,
+     0,   225,   225,   225,   146,     0,   225,   225,   225,   225,
+   225,   225,   225,   225,     0,     0,     0,   127,     0,   126,
+   125,     0,     0,     0,     0,     0,     0,     0,   153,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,    65,     0,     0,     0,     0,   220,     0,   166,
+   166,   166,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   173,   174,   175,
+   176,   177,     0,     0,     0,     0,     0,     0,     0,    18,
+     0,     0,     0,     0,     0,    93,   101,     0,   104,     0,
+    98,     0,    99,   119,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,   121,   123,   128,     0,     0,     0,     0,
+     0,     0,     0,   133,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   108,
+     0,   225,   225,     0,   225,     0,     0,   166,     0,     0,
+   225,     0,     0,     0,   225,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,   225,     0,     0,     0,     0,     0,     0,
+     0,     0,   216,   197,   204,   205,   206,     0,   106,   116,
+     0,     0,   151,   110,   112,     0,     0,     0,   150,   152,
+   118,    94,   105,   115,   120,   155,     0,     0,     0,     0,
+     0,   138,     0,   140,     0,   134,     0,     0,    66,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,   220,     0,   223,     0,     0,     0,     0,
+   161,   167,   163,   165,     0,     0,     0,     0,     0,     0,
+     0,    21,     0,    30,     0,    34,     0,    28,     0,     0,
+    33,     0,    38,    36,     0,     0,     0,     0,     0,     0,
+    45,     0,     0,     0,     0,     0,    50,     0,     0,   102,
+   211,     0,   147,   148,   149,   215,     0,   214,   128,   124,
+     0,     0,     0,     0,     0,   143,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   225,   222,   221,   225,     0,     0,     0,     0,
+   181,   180,   111,     0,     0,   220,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   225,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   225,     0,   144,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   225,   225,
+     0,   224,     0,     0,   168,   209,     0,   170,     0,    35,
+     0,     0,     0,     0,    25,     0,    31,     0,    37,    26,
+    39,     0,    42,     0,    46,    47,     0,     0,    49,     0,
+     0,     0,     0,   213,   122,     0,     0,     0,     0,   141,
+   135,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   225,   225,   109,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   137,   139,   136,     0,   225,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   225,
+   225,   225,    95,   100,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    29,    32,    40,     0,    41,    48,    43,
+     0,     0,   212,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   225,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+   225,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    89,    90,    91,     0,     0,   169,     0,     0,     0,     0,
+    24,    27,     0,     0,     0,   142,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   172,
+     0,     0,   225,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,    44,    20,   103,   145,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,   171,     0,     0,
+   225,     0,     0,     0,     0,     0,     0,   225,   225,   225,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     5,   225,     0,     0,
+     0,     0,     0,     0,     0,    86,    87,    88,     0,   114,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   225,
+     0,     0,     0,     0,     0,     0,     0,   113,     0,    22,
+     0,     0,     0,     0,     0,     0,   225,     0,     0,     0,
+   225,   225,   225,     0,     0,     0,     0,     0,     0,     0,
+   225,     0,     0,     0,    83,    84,    85,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+   225,   225,   225,    23,     0,     0,     0,    80,    81,    82,
+     0,     0,     0
+};
+
+static const short yydefgoto[] = {  1271,
+     4,     5,    18,    19,    20,    21,     6,    55,    56,   344,
+   472,   473,   474,   475,   476,   477,   478,   479,   480,   481,
+   482,   483,    57,   339,   578,   579,   580,   581,    61,    62,
+    63,   865,   866,    64,    65,    66,   234,   355,   490,   491,
+   492,   717,   718,   890,   643,   197,   186,   311,   214,   156,
+   268,   714,   805,   806,   312
+};
+
+static const short yypact[] = {   472,
+-32768,-32768,  -109,-32768,   525,  1180,    33,    67,   105,    73,
+   108,   114,   208,   222,    85,    87,    94,-32768,-32768,-32768,
+-32768,   224,   263,   110,   154,   182,   -34,   -31,   191,   199,
+   243,   225,   340,   350,   351,   323,   355,   379,   242,   245,
+   250,   251,   -14,   233,   389,   370,   257,   405,   414,    -1,
+   270,   -12,   268,   392,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,   424,-32768,  1172,-32768,
+-32768,-32768,-32768,-32768,   285,   285,   432,-32768,    40,    40,
+    40,    40,   297,    40,   301,    40,    40,    40,   296,    40,
+   305,   302,   304,   296,   311,   316,   306,   321,   324,   326,
+   328,   329,    39,    39,    39,    39,   330,   331,   345,    40,
+-32768,   491,   296,-32768,-32768,   -38,   349,   374,    40,   -40,
+    40,-32768,   377,   526,   382,   385,   407,   412,   420,   422,
+   423,   425,   426,   427,   436,   439,   440,   444,   445,   447,
+   449,   451,   456,   458,   467,   469,   475,   476,   477,   478,
+   489,   490,   492,   494,   560,   471,   495,   501,-32768,-32768,
+-32768,   496,   503,   510,   511,   515,   516,   517,   518,   522,
+   524,   528,   529,   530,   534,   535,   536,   537,   538,   539,
+   548,    40,    40,    40,    42,-32768,   120,   657,   669,    40,
+   680,    40,   694,   717,   727,    40,   885,   567,   737,    40,
+    40,    40,   634,    40,    40,    40,    40,    40,    40,    40,
+    40,    40,    40,   549,   523,   551,   555,    40,    40,    40,
+   287,   303,-32768,    65,   579,    39,-32768,    40,    40,   761,
+   594,    40,   773,   -48,    40,   570,   703,   718,   720,   721,
+   722,   723,   729,   740,   741,   748,   755,   762,   769,   771,
+   772,   774,   776,   780,   785,   793,   800,   802,   806,   692,
+   812,   814,   817,   822,   827,   826,-32768,   -44,   829,   835,
+   830,    40,    40,    40,    40,    40,    40,    40,    40,    40,
+    40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
+    40,   693,   693,   783,-32768,    40,    40,    40,    40,    40,
+   236,   837,   838,   809,   282,   821,   841,   857,   858,   279,
+-32768,   100,    40,   860,   586,   831,   869,    40,   598,   605,
+   915,   927,   946,   956,   974,   996,   851,  1352,    39,   715,
+   724,    40,  1553,  1685,  1694,    39,    44,-32768,-32768,-32768,
+    40,-32768,   725,   417,  1703,  1712,   867,   734,  1009,   868,
+-32768,-32768,-32768,-32768,-32768,  1042,   747,   736,   739,   742,
+   746,   749,   750,   757,   758,   760,   763,   764,   779,   782,
+   786,   787,   788,   789,   790,   805,   808,   811,   818,   820,
+   836,   839,   847,   848,   850,   865,   866,   883,-32768,   784,
+-32768,   871,  1057,  1102,  1160,  1170,  1181,  1191,  1201,  1218,
+  1228,  1241,  1721,  1255,  1266,  1276,  1286,  1296,  1306,  1730,
+  1739,  1748,-32768,   122,   122,   693,   693,   693,-32768,    39,
+   296,   296,   884,-32768,   296,   891,-32768,   296,   296,    72,
+    40,-32768,   103,   781,   905,   916,   917,   227,   944,   950,
+   961,   965,   975,   979,   981,   982,    40,    40,   872,   409,
+   409,  1316,    39,    39,    39,     3,   112,-32768,   870,   874,
+   876,   882,   912,   913,   918,   919,   924,   925,   930,   931,
+   886,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,    40,    40,   296,    40,  1012,   296,   828,
+   880,   929,  1028,   932,  1062,    40,    40,    39,  1090,  1091,
+   951,  1094,  1100,   296,   296,  1101,    39,  1104,  1106,   296,
+   296,  1107,  1118,  1119,  1121,  1122,   296,    53,   296,  1124,
+  1123,  1125,  1126,  1128,-32768,   928,   285,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,    40,-32768,-32768,
+-32768,-32768,-32768,-32768,    40,    40,    40,  1137,    29,  1138,
+   296,  1140,   296,  1141,  1150,    40,   885,   279,-32768,-32768,
+    40,   296,   296,   296,-32768,    -2,   296,   296,   296,   296,
+   296,   296,   296,   296,  1757,  1766,    40,-32768,   978,   660,
+-32768,  1003,  1006,   144,   151,   209,    39,  1154,-32768,   434,
+    40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
+    40,    40,-32768,  1775,  1784,  1156,  1329,   178,  1083,  1163,
+  1163,  1163,    40,  1165,  1018,  1793,  1802,  1019,  1021,  1025,
+  1022,  1026,  1031,  1027,  1032,  1039,  1040,  1045,  1041,  1046,
+  1053,  1056,  1075,  1076,  1077,  1078,  1085,-32768,-32768,-32768,
+-32768,-32768,  1079,  1092,  1098,  1099,  1105,  1103,  1112,-32768,
+  1114,  1339,  1364,  1374,  1384,-32768,-32768,    39,-32768,  1164,
+-32768,  1202,-32768,-32768,    80,  1811,  1246,  1247,  1251,    40,
+    40,    40,  1260,  1261,  1272,  1273,  1274,  1275,  1277,  1278,
+    40,    40,  1394,-32768,-32768,   409,    39,  1279,    39,  1290,
+    39,    27,  1131,-32768,  1301,  1820,  1829,  1838,  1847,  1856,
+  1865,  1874,  1883,  1892,  1901,  1910,  1919,    40,    40,-32768,
+  1190,   296,   296,  1225,   296,  1303,  1166,  1163,  1167,  1169,
+   148,  1314,  1315,    40,   296,  1322,  1326,  1325,  1187,  1332,
+    53,  1333,  1338,    40,  1336,  1345,  1343,  1346,  1348,    53,
+    40,    40,    40,   296,  1349,  1351,    53,    40,  1353,  1355,
+  1359,    40,   285,-32768,-32768,-32768,-32768,  1360,-32768,-32768,
+    40,    40,-32768,-32768,-32768,   131,   234,   244,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,  1404,   299,  1206,  1214,
+  1224,-32768,  1227,-32768,  1230,-32768,  1304,    40,-32768,    40,
+    40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
+    40,  1414,  1424,   178,   214,-32768,   192,  1223,  1299,    26,
+-32768,-32768,-32768,-32768,    40,    40,  1376,  1385,  1237,  1928,
+  1240,-32768,  1243,-32768,  1244,-32768,  1250,-32768,  1245,  1434,
+-32768,  1252,-32768,-32768,  1253,  1254,  1444,  1937,  1455,  1257,
+-32768,  1264,  1265,  1946,  1282,  1271,-32768,  1955,  1283,-32768,
+   885,  1964,-32768,-32768,-32768,-32768,    40,-32768,   409,-32768,
+    40,    40,    40,  1239,    77,-32768,  1465,  1973,  1982,  1991,
+  2000,  2009,  2018,  2027,  2036,  2045,  2054,  2063,  2072,  1417,
+  1419,  1344,   296,-32768,-32768,   296,    40,  1430,   527,  1431,
+   133,   181,-32768,  1309,  1438,   178,    53,  1443,    40,  1441,
+    53,  1447,  1451,  1450,  1457,  1458,    40,  1460,   296,  1461,
+  1463,    40,  1454,  1470,    40,  1472,  1474,   415,  1335,  1475,
+  1485,  1502,   296,  1480,-32768,  1481,    40,    40,    40,    40,
+    40,    40,    40,    40,    40,    40,    40,    40,   296,   296,
+  1327,-32768,  1341,   253,-32768,  1342,  2081,-32768,  1487,-32768,
+  1361,  1363,  1370,  2090,-32768,  1347,-32768,  1350,-32768,-32768,
+-32768,  1512,-32768,  1371,-32768,-32768,  1522,  1372,-32768,  1533,
+  1380,  1381,    40,-32768,-32768,  1494,  1505,    28,  1383,-32768,
+-32768,  2099,  2108,  2117,  2126,  2135,  2144,  2153,  2162,  2171,
+  1543,  1565,  1575,  1509,  1519,   296,   296,-32768,    40,    40,
+  1532,    53,    53,    53,    53,  1535,  1538,  1539,    53,  1545,
+  1546,  1548,  1556,  1557,   612,-32768,-32768,-32768,  1304,   296,
+    40,    40,    40,    40,    40,    40,    40,    40,    40,   296,
+   296,   296,-32768,-32768,  1413,  1411,   619,  2180,  1568,  1421,
+  1423,  1429,  1432,-32768,-32768,-32768,  1440,-32768,-32768,-32768,
+  1452,  1462,-32768,    78,  1464,  2189,  2198,  2207,  2216,  2225,
+  2234,  2243,  2252,  2261,  1569,  1576,  1579,   296,  1514,  1586,
+    40,  1468,    53,    53,  1589,  1599,    53,  1601,  1607,  1610,
+   296,    40,    40,    40,    40,    40,    40,    40,    40,    40,
+-32768,-32768,-32768,  1469,  1473,-32768,   505,  1619,  1482,  1488,
+-32768,-32768,  1484,  1486,  1489,-32768,  1471,  2270,  2279,  2288,
+  2297,  2306,  2315,  2324,  2333,  2342,  1552,    40,    40,-32768,
+  1637,    53,   296,  1643,  1644,  1646,  1647,    40,    40,    40,
+    40,    40,    40,    40,    40,    40,  1506,  2351,   626,  1657,
+  1518,  1521,-32768,-32768,-32768,-32768,  2360,  2369,  2378,  2387,
+  2396,  2405,  1595,  1605,  1615,    40,    40,-32768,  1524,    53,
+   296,    40,    40,    40,    40,    40,    40,   296,   296,   296,
+  2414,   643,  1530,  1529,  1540,  2423,  2432,  2441,  2450,  2459,
+  2468,  1667,  1669,  1677,    40,  1684,-32768,   296,    53,    40,
+    40,    40,    40,    40,    40,-32768,-32768,-32768,   650,-32768,
+  1542,  1551,  2477,  2486,  2495,  2504,  2513,  2522,  1688,   296,
+  1706,    40,    40,    40,    40,    40,    40,-32768,  1549,-32768,
+  2531,  2540,  2549,  1625,  1635,  1645,   296,    40,    40,    40,
+   296,   296,   296,  1562,  2558,  2567,  2576,  1710,  1716,  1717,
+   296,    40,    40,    40,-32768,-32768,-32768,  1574,  2585,  2594,
+  2603,    53,    40,    40,    40,  1577,  1655,  1665,  1675,  1720,
+   296,   296,   296,-32768,  1722,  1724,  1725,-32768,-32768,-32768,
+  1681,  1732,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1284,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,  1727,  1728,  -445,   239,  1737,-32768,-32768,
+-32768,   726,  -841,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,  -594,-32768,-32768,  -719,   -79,-32768,  1321,   -91,   -72,
+-32768,  -794,  1033,   474,-32768
+};
+
+
+#define	YYLAST		2754
+
+
+static const short yytable[] = {   185,
+   187,   188,   189,   157,   191,   582,   193,   194,   195,   882,
+   199,   827,   215,   216,   217,   107,   719,   720,   108,   109,
+   836,   120,    83,   925,   226,    85,     7,   843,   117,   888,
+   221,   118,   786,  1018,   657,    67,   351,   352,   353,   230,
+   231,   233,   159,   160,   670,   671,   672,   295,   161,   162,
+   163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+   173,   174,   175,   176,   177,   178,   179,   180,   181,   658,
+   340,   341,    68,    98,   159,   160,    99,   100,    70,   101,
+   161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+   171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+   181,   951,   292,   293,   294,   354,   388,   389,   560,   232,
+   304,    69,   306,    71,   227,    84,   310,   589,    86,    72,
+   315,   316,   317,   812,   319,   320,   321,   322,   323,   324,
+   325,   326,   327,   328,   343,   110,   853,   121,   333,   334,
+   335,   864,   864,   638,   639,   640,   641,   642,   345,   346,
+   159,   160,   349,   587,   588,   356,   161,   162,   163,   164,
+   165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+   175,   176,   177,   178,   179,   180,   181,   952,   889,   787,
+  1019,   956,   182,   183,   296,   297,   298,   299,   212,   184,
+   300,   213,   393,   394,   395,   396,   397,   398,   399,   400,
+   401,   402,   403,   404,   405,   406,   407,   408,   409,   410,
+   411,   412,   925,    73,   182,   183,   414,   415,   416,   417,
+   418,   184,   296,   297,   298,   299,   556,    74,   300,    78,
+   924,  1080,   565,   433,    75,   761,    76,   449,   438,   854,
+   780,   419,   420,    77,   456,   296,   297,   298,   299,   855,
+   431,   300,   452,   432,   296,   297,   298,   299,   998,    80,
+   300,   457,   296,   297,   298,   299,   298,   299,   300,    79,
+   300,   301,   566,   296,   297,   298,   299,  -186,  -186,   300,
+    89,   300,  1040,  1041,  1042,  1043,   430,   424,   425,  1047,
+   815,   816,   298,   299,   687,   688,   300,   184,   159,   160,
+   196,   689,   690,    81,   161,   162,   163,   164,   165,   166,
+   167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
+   177,   178,   179,   180,   181,  -185,  -185,   712,   548,   300,
+   713,    82,    24,    25,    26,    27,    28,    29,    30,    31,
+    87,    32,   883,    34,    35,   885,    37,   337,    88,   222,
+   557,   558,   225,  1099,  1100,    94,    95,  1103,    96,   691,
+   692,   584,   585,   586,   883,   884,    50,   575,   576,   296,
+   297,   298,   299,    91,    90,   300,   296,   297,   298,   299,
+    51,    52,   300,    92,    93,   111,   296,   297,   298,   299,
+    97,   103,   300,   112,   104,   296,   297,   298,   299,   105,
+   106,   300,  1141,   113,   604,   605,   618,   607,    98,   114,
+   115,    99,   100,   919,   101,   627,   616,   617,   116,   119,
+   122,   296,   297,   298,   299,   123,   124,   300,   102,   296,
+   297,   298,   299,    54,   155,   300,   158,   336,   182,   183,
+  1174,   296,   297,   298,   299,   184,   190,   300,   196,   857,
+   192,   201,   858,   202,   651,   206,   338,   200,   652,    39,
+    40,    41,    42,   204,    44,   653,   654,   655,   205,  1202,
+   207,    -7,    -7,   208,    -7,   209,   665,   210,   211,   218,
+   219,   666,   459,   460,   461,   462,   463,   464,   465,   466,
+   467,   468,   469,   470,   220,   693,   223,   683,   228,   459,
+   460,   461,   462,   463,   464,   465,   466,   467,   468,   469,
+   470,   696,   697,   698,   699,   700,   701,   702,   703,   704,
+   705,   706,   707,   229,    -2,     8,   235,     9,   236,   159,
+   946,   237,  1256,   721,   238,   161,   162,   163,   164,   165,
+   166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
+   176,   177,   178,   179,   180,   181,   239,   296,   297,   298,
+   299,   240,   198,   300,   267,   973,   758,   203,   974,   241,
+   471,   242,   243,   313,   244,   245,   246,    -7,    -7,    -7,
+    -7,    -7,    -7,    -7,    -7,   247,   224,   695,   248,   249,
+   766,   767,   768,   250,   251,   781,   252,   783,   253,   785,
+   254,   777,   778,     1,     2,   255,     3,   256,    24,    25,
+    26,    27,    28,    29,    30,    31,   257,    32,   258,    34,
+    35,   269,    37,   337,   259,   260,   261,   262,   802,   803,
+    10,    11,    12,    13,    14,    15,    16,    17,   263,   264,
+   318,   265,    50,   266,   820,   272,   270,   296,   297,   298,
+   299,   271,   273,   300,   830,  1119,    51,    52,  1120,   274,
+   275,   837,   838,   839,   276,   277,   278,   279,   844,   182,
+   183,   280,   848,   281,   330,   348,   184,   282,   283,   284,
+   849,   851,   852,   285,   286,   287,   288,   289,   290,    24,
+    25,    26,    27,    28,    29,    30,    31,   291,    32,   329,
+    34,    35,   331,    37,   337,   332,   357,   358,   867,    54,
+   868,   869,   870,   871,   872,   873,   874,   875,   876,   877,
+   878,   879,   359,    50,   360,   361,   362,   363,   296,   297,
+   298,   299,   342,   364,   300,   891,   892,    51,    52,   435,
+   296,   297,   298,   299,   365,   366,   300,   296,   297,   298,
+   299,   439,   367,   300,   296,   297,   298,   299,   440,   368,
+   300,   296,   297,   298,   299,  1053,   369,   300,   296,   297,
+   298,   299,  1070,   370,   300,   371,   372,   918,   373,  1158,
+   374,   920,   921,   922,   375,   296,   297,   298,   299,   376,
+    54,   300,   296,   297,   298,   299,  1186,   377,   300,   296,
+   297,   298,   299,  1209,   378,   300,   379,   944,   302,   947,
+   380,   296,   297,   298,   299,   381,   382,   300,   383,   954,
+   303,   384,   296,   297,   298,   299,   385,   962,   300,   386,
+   387,   305,   967,   390,   392,   970,   296,   297,   298,   299,
+   391,   300,   300,   421,   422,   307,   427,   982,   983,   984,
+   985,   986,   987,   988,   989,   990,   991,   992,   993,   296,
+   297,   298,   299,   428,   429,   300,   434,   450,   308,   296,
+   297,   298,   299,   486,   489,   300,   451,   458,   309,   296,
+   297,   298,   299,   487,   494,   300,   495,   525,   314,   496,
+   551,   603,   497,  1015,   549,   550,   498,   553,   552,   499,
+   500,   554,   555,   296,   297,   298,   299,   501,   502,   300,
+   503,   562,   347,   504,   505,   296,   297,   298,   299,  1037,
+  1038,   300,   563,   564,   350,   296,   297,   298,   299,   506,
+   561,   300,   507,   650,   413,   526,   508,   509,   510,   511,
+   512,  1056,  1057,  1058,  1059,  1060,  1061,  1062,  1063,  1064,
+   567,   296,   297,   298,   299,   513,   568,   300,   514,   606,
+   423,   515,   609,   296,   297,   298,   299,   569,   516,   300,
+   517,   570,   426,   296,   297,   298,   299,   624,   625,   300,
+   610,   571,   436,   630,   631,   572,   518,   573,   574,   519,
+   637,  1097,   644,   296,   297,   298,   299,   520,   521,   300,
+   522,   447,  1108,  1109,  1110,  1111,  1112,  1113,  1114,  1115,
+  1116,   296,   297,   298,   299,   523,   524,   300,   608,   591,
+   437,   527,   577,   592,   660,   593,   662,   296,   297,   298,
+   299,   594,   611,   300,   613,   667,   668,   669,  1138,  1139,
+   673,   674,   675,   676,   677,   678,   679,   680,  1147,  1148,
+  1149,  1150,  1151,  1152,  1153,  1154,  1155,   296,   297,   298,
+   299,   595,   596,   300,   615,   614,   441,   597,   598,   296,
+   297,   298,   299,   599,   600,   300,  1171,  1172,   442,   601,
+   602,   612,  1176,  1177,  1178,  1179,  1180,  1181,   296,   297,
+   298,   299,   619,   620,   300,   621,   622,   443,   296,   297,
+   298,   299,   623,   626,   300,  1199,   628,   444,   629,   632,
+  1203,  1204,  1205,  1206,  1207,  1208,   296,   297,   298,   299,
+   633,   634,   300,   635,   636,   445,   645,   646,   648,   647,
+   649,   684,  1221,  1222,  1223,  1224,  1225,  1226,   296,   297,
+   298,   299,   656,   659,   300,   661,   663,   446,  1235,  1236,
+  1237,   296,   297,   298,   299,   664,   685,   300,   686,   694,
+   488,   710,  1249,  1250,  1251,   715,   716,   722,   723,   759,
+   726,   727,   729,  1257,  1258,  1259,   728,   730,   732,    -1,
+    22,   731,   733,    23,   296,   297,   298,   299,   809,   734,
+   300,   735,   737,   493,   817,   736,   804,   738,   821,   296,
+   297,   298,   299,   739,   125,   300,   740,   760,   528,    24,
+    25,    26,    27,    28,    29,    30,    31,   840,    32,    33,
+    34,    35,    36,    37,    38,   741,   742,   743,   744,   746,
+    39,    40,    41,    42,    43,    44,   745,    45,    46,    47,
+    48,    49,   747,    50,   296,   297,   298,   299,   748,   749,
+   300,   763,   764,   529,   751,   750,   765,    51,    52,   126,
+   127,   128,   752,    53,   753,   769,   770,   129,   130,   131,
+   132,   133,   134,   135,   136,   137,   138,   771,   772,   773,
+   774,   788,   775,   776,   782,   139,   140,   141,   142,   143,
+   144,   145,   146,   147,   148,   784,   149,   150,   151,   152,
+   153,   154,   296,   297,   298,   299,   789,   808,   300,   810,
+    54,   530,   296,   297,   298,   299,   818,   819,   300,   811,
+   813,   531,   814,   296,   297,   298,   299,   822,   823,   300,
+   824,   825,   532,   296,   297,   298,   299,   826,   828,   300,
+   829,   831,   533,   296,   297,   298,   299,   832,   833,   300,
+   835,   834,   534,   842,   841,   845,   942,   846,   859,   943,
+   296,   297,   298,   299,   847,   850,   300,   860,   864,   535,
+   296,   297,   298,   299,   861,   886,   300,   862,   887,   536,
+   863,   893,   964,   296,   297,   298,   299,   894,   895,   300,
+   897,   923,   537,   898,   899,   901,   979,   296,   297,   298,
+   299,   900,   903,   300,   904,   905,   539,   909,   296,   297,
+   298,   299,   994,   995,   300,   910,   911,   540,   296,   297,
+   298,   299,   914,   939,   300,   940,   941,   541,   296,   297,
+   298,   299,   913,   916,   300,   945,   948,   542,   296,   297,
+   298,   299,   949,   950,   300,   953,   955,   543,   296,   297,
+   298,   299,   957,   958,   300,   959,   968,   544,   296,   297,
+   298,   299,   960,   961,   300,   963,   965,   583,   966,  1035,
+  1036,   296,   297,   298,   299,   969,   971,   300,   972,   996,
+   711,   296,   297,   298,   299,   980,   981,   300,   975,  1001,
+   754,   997,   999,  1055,   296,   297,   298,   299,  1006,  1016,
+   300,  1007,   448,  1065,  1066,  1067,   296,   297,   298,   299,
+  1017,  1002,   300,  1003,  1033,   755,   296,   297,   298,   299,
+  1004,  1009,   300,  1011,  1034,   756,   296,   297,   298,   299,
+  1013,  1014,   300,  1020,  1039,   757,   296,   297,   298,   299,
+  1044,  1094,   300,  1045,  1046,   779,   296,   297,   298,   299,
+  1048,  1049,   300,  1050,  1107,   856,   296,   297,   298,   299,
+  1051,  1052,   300,  1068,  1069,   880,   296,   297,   298,   299,
+  1072,  1073,   300,  1074,  1091,   881,   296,   297,   298,   299,
+  1075,  1092,   300,  1076,  1093,   902,   296,   297,   298,   299,
+  1077,  1096,   300,  1095,  1101,   906,  1142,   296,   297,   298,
+   299,  1098,  1078,   300,  1102,  1104,   908,   296,   297,   298,
+   299,  1105,  1079,   300,  1081,  1106,   926,   296,   297,   298,
+   299,  1121,  1117,   300,  1127,  1118,   976,   296,   297,   298,
+   299,  1137,  1122,   300,  1175,  1124,   977,  1125,  1123,  1140,
+  1126,  1182,  1183,  1184,   296,   297,   298,   299,  1143,  1144,
+   300,  1145,  1146,   978,   296,   297,   298,   299,  1156,  1159,
+   300,  1201,  1173,  1008,   296,   297,   298,   299,  1160,  1187,
+   300,  1161,  1196,  1010,  1197,   296,   297,   298,   299,  1188,
+  1272,   300,  1198,  1219,  1012,   296,   297,   298,   299,  1200,
+  1189,   300,  1210,  1218,  1030,   296,   297,   298,   299,  1227,
+  1234,   300,  1211,   453,  1238,  1239,  1240,   296,   297,   298,
+   299,  1220,  1241,   300,  1248,  1245,  1031,   296,   297,   298,
+   299,  1246,  1247,   300,  1252,  1264,  1032,  1268,  1260,  1269,
+  1270,  1273,    58,    59,  1265,  1266,  1267,   296,   297,   298,
+   299,   590,    60,   300,  1054,   807,  1168,   296,   297,   298,
+   299,   559,     0,   300,     0,     0,  1169,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1170,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1231,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1232,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1233,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1261,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1262,   296,   297,   298,
+   299,     0,     0,   300,     0,     0,  1263,   296,   297,   298,
+   299,     0,     0,   300,     0,   454,   296,   297,   298,   299,
+     0,     0,   300,     0,   455,   296,   297,   298,   299,     0,
+     0,   300,     0,   484,   296,   297,   298,   299,     0,     0,
+   300,     0,   485,   296,   297,   298,   299,     0,     0,   300,
+     0,   538,   296,   297,   298,   299,     0,     0,   300,     0,
+   545,   296,   297,   298,   299,     0,     0,   300,     0,   546,
+   296,   297,   298,   299,     0,     0,   300,     0,   547,   296,
+   297,   298,   299,     0,     0,   300,     0,   681,   296,   297,
+   298,   299,     0,     0,   300,     0,   682,   296,   297,   298,
+   299,     0,     0,   300,     0,   708,   296,   297,   298,   299,
+     0,     0,   300,     0,   709,   296,   297,   298,   299,     0,
+     0,   300,     0,   724,   296,   297,   298,   299,     0,     0,
+   300,     0,   725,   296,   297,   298,   299,     0,     0,   300,
+     0,   762,   296,   297,   298,   299,     0,     0,   300,     0,
+   790,   296,   297,   298,   299,     0,     0,   300,     0,   791,
+   296,   297,   298,   299,     0,     0,   300,     0,   792,   296,
+   297,   298,   299,     0,     0,   300,     0,   793,   296,   297,
+   298,   299,     0,     0,   300,     0,   794,   296,   297,   298,
+   299,     0,     0,   300,     0,   795,   296,   297,   298,   299,
+     0,     0,   300,     0,   796,   296,   297,   298,   299,     0,
+     0,   300,     0,   797,   296,   297,   298,   299,     0,     0,
+   300,     0,   798,   296,   297,   298,   299,     0,     0,   300,
+     0,   799,   296,   297,   298,   299,     0,     0,   300,     0,
+   800,   296,   297,   298,   299,     0,     0,   300,     0,   801,
+   296,   297,   298,   299,     0,     0,   300,     0,   896,   296,
+   297,   298,   299,     0,     0,   300,     0,   907,   296,   297,
+   298,   299,     0,     0,   300,     0,   912,   296,   297,   298,
+   299,     0,     0,   300,     0,   915,   296,   297,   298,   299,
+     0,     0,   300,     0,   917,   296,   297,   298,   299,     0,
+     0,   300,     0,   927,   296,   297,   298,   299,     0,     0,
+   300,     0,   928,   296,   297,   298,   299,     0,     0,   300,
+     0,   929,   296,   297,   298,   299,     0,     0,   300,     0,
+   930,   296,   297,   298,   299,     0,     0,   300,     0,   931,
+   296,   297,   298,   299,     0,     0,   300,     0,   932,   296,
+   297,   298,   299,     0,     0,   300,     0,   933,   296,   297,
+   298,   299,     0,     0,   300,     0,   934,   296,   297,   298,
+   299,     0,     0,   300,     0,   935,   296,   297,   298,   299,
+     0,     0,   300,     0,   936,   296,   297,   298,   299,     0,
+     0,   300,     0,   937,   296,   297,   298,   299,     0,     0,
+   300,     0,   938,   296,   297,   298,   299,     0,     0,   300,
+     0,  1000,   296,   297,   298,   299,     0,     0,   300,     0,
+  1005,   296,   297,   298,   299,     0,     0,   300,     0,  1021,
+   296,   297,   298,   299,     0,     0,   300,     0,  1022,   296,
+   297,   298,   299,     0,     0,   300,     0,  1023,   296,   297,
+   298,   299,     0,     0,   300,     0,  1024,   296,   297,   298,
+   299,     0,     0,   300,     0,  1025,   296,   297,   298,   299,
+     0,     0,   300,     0,  1026,   296,   297,   298,   299,     0,
+     0,   300,     0,  1027,   296,   297,   298,   299,     0,     0,
+   300,     0,  1028,   296,   297,   298,   299,     0,     0,   300,
+     0,  1029,   296,   297,   298,   299,     0,     0,   300,     0,
+  1071,   296,   297,   298,   299,     0,     0,   300,     0,  1082,
+   296,   297,   298,   299,     0,     0,   300,     0,  1083,   296,
+   297,   298,   299,     0,     0,   300,     0,  1084,   296,   297,
+   298,   299,     0,     0,   300,     0,  1085,   296,   297,   298,
+   299,     0,     0,   300,     0,  1086,   296,   297,   298,   299,
+     0,     0,   300,     0,  1087,   296,   297,   298,   299,     0,
+     0,   300,     0,  1088,   296,   297,   298,   299,     0,     0,
+   300,     0,  1089,   296,   297,   298,   299,     0,     0,   300,
+     0,  1090,   296,   297,   298,   299,     0,     0,   300,     0,
+  1128,   296,   297,   298,   299,     0,     0,   300,     0,  1129,
+   296,   297,   298,   299,     0,     0,   300,     0,  1130,   296,
+   297,   298,   299,     0,     0,   300,     0,  1131,   296,   297,
+   298,   299,     0,     0,   300,     0,  1132,   296,   297,   298,
+   299,     0,     0,   300,     0,  1133,   296,   297,   298,   299,
+     0,     0,   300,     0,  1134,   296,   297,   298,   299,     0,
+     0,   300,     0,  1135,   296,   297,   298,   299,     0,     0,
+   300,     0,  1136,   296,   297,   298,   299,     0,     0,   300,
+     0,  1157,   296,   297,   298,   299,     0,     0,   300,     0,
+  1162,   296,   297,   298,   299,     0,     0,   300,     0,  1163,
+   296,   297,   298,   299,     0,     0,   300,     0,  1164,   296,
+   297,   298,   299,     0,     0,   300,     0,  1165,   296,   297,
+   298,   299,     0,     0,   300,     0,  1166,   296,   297,   298,
+   299,     0,     0,   300,     0,  1167,   296,   297,   298,   299,
+     0,     0,   300,     0,  1185,   296,   297,   298,   299,     0,
+     0,   300,     0,  1190,   296,   297,   298,   299,     0,     0,
+   300,     0,  1191,   296,   297,   298,   299,     0,     0,   300,
+     0,  1192,   296,   297,   298,   299,     0,     0,   300,     0,
+  1193,   296,   297,   298,   299,     0,     0,   300,     0,  1194,
+   296,   297,   298,   299,     0,     0,   300,     0,  1195,   296,
+   297,   298,   299,     0,     0,   300,     0,  1212,   296,   297,
+   298,   299,     0,     0,   300,     0,  1213,   296,   297,   298,
+   299,     0,     0,   300,     0,  1214,   296,   297,   298,   299,
+     0,     0,   300,     0,  1215,   296,   297,   298,   299,     0,
+     0,   300,     0,  1216,   296,   297,   298,   299,     0,     0,
+   300,     0,  1217,   296,   297,   298,   299,     0,     0,   300,
+     0,  1228,   296,   297,   298,   299,     0,     0,   300,     0,
+  1229,   296,   297,   298,   299,     0,     0,   300,     0,  1230,
+   296,   297,   298,   299,     0,     0,   300,     0,  1242,   296,
+   297,   298,   299,     0,     0,   300,     0,  1243,   296,   297,
+   298,   299,     0,     0,   300,     0,  1244,   296,   297,   298,
+   299,     0,     0,   300,     0,  1253,   296,   297,   298,   299,
+     0,     0,   300,     0,  1254,   296,   297,   298,   299,     0,
+     0,   300,     0,  1255
+};
+
+static const short yycheck[] = {    79,
+    80,    81,    82,    76,    84,   451,    86,    87,    88,   804,
+    90,   731,   104,   105,   106,    30,   611,   612,    33,    34,
+   740,    34,    57,   865,    63,    57,   136,   747,    30,     4,
+   110,    33,     6,     6,     6,     3,    85,    86,    87,   119,
+    81,   121,     3,     4,    47,    48,    49,     6,     9,    10,
+    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+    21,    22,    23,    24,    25,    26,    27,    28,    29,    41,
+     6,     7,     6,    30,     3,     4,    33,    34,     6,    36,
+     9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+    19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+    29,   896,   182,   183,   184,   154,   151,   152,     6,   150,
+   190,     7,   192,     6,   153,   150,   196,     6,   150,     6,
+   200,   201,   202,   718,   204,   205,   206,   207,   208,   209,
+   210,   211,   212,   213,   226,   150,     6,   150,   218,   219,
+   220,    65,    65,    91,    92,    93,    94,    95,   228,   229,
+     3,     4,   232,   151,   152,   235,     9,    10,    11,    12,
+    13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+    23,    24,    25,    26,    27,    28,    29,   897,   153,   153,
+   153,   901,   143,   144,   143,   144,   145,   146,   150,   150,
+   149,   153,   272,   273,   274,   275,   276,   277,   278,   279,
+   280,   281,   282,   283,   284,   285,   286,   287,   288,   289,
+   290,   291,  1054,     6,   143,   144,   296,   297,   298,   299,
+   300,   150,   143,   144,   145,   146,   155,     6,   149,     6,
+   154,   154,     6,   313,   150,   156,   150,   329,   318,     6,
+   686,     6,     7,   150,   336,   143,   144,   145,   146,     6,
+   151,   149,   332,   154,   143,   144,   145,   146,     6,   150,
+   149,   341,   143,   144,   145,   146,   145,   146,   149,     7,
+   149,   152,    46,   143,   144,   145,   146,   145,   146,   149,
+    38,   149,  1002,  1003,  1004,  1005,     8,     6,     7,  1009,
+   143,   144,   145,   146,   151,   152,   149,   150,     3,     4,
+   153,   151,   152,   150,     9,    10,    11,    12,    13,    14,
+    15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+    25,    26,    27,    28,    29,   145,   146,   150,   420,   149,
+   153,   150,    30,    31,    32,    33,    34,    35,    36,    37,
+   150,    39,   151,    41,    42,   154,    44,    45,   150,   111,
+   430,   431,   114,  1073,  1074,    33,    34,  1077,    36,   151,
+   152,   453,   454,   455,   151,   152,    64,   447,   448,   143,
+   144,   145,   146,    34,   150,   149,   143,   144,   145,   146,
+    78,    79,   149,    34,    34,   153,   143,   144,   145,   146,
+    36,   150,   149,     5,   150,   143,   144,   145,   146,   150,
+   150,   149,  1122,    34,   484,   485,   498,   487,    30,   153,
+     6,    33,    34,   859,    36,   507,   496,   497,     5,   150,
+   153,   143,   144,   145,   146,    34,     3,   149,    50,   143,
+   144,   145,   146,   131,   150,   149,     5,   151,   143,   144,
+  1160,   143,   144,   145,   146,   150,   150,   149,   153,   151,
+   150,   150,   154,   150,   527,   150,   154,   153,   538,    51,
+    52,    53,    54,   153,    56,   545,   546,   547,   153,  1189,
+   150,     0,     1,   150,     3,   150,   556,   150,   150,   150,
+   150,   561,    66,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,   150,   587,     6,   577,   150,    66,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,   591,   592,   593,   594,   595,   596,   597,   598,   599,
+   600,   601,   602,   150,     0,     1,   150,     3,     3,     3,
+     4,   150,  1252,   613,   150,     9,    10,    11,    12,    13,
+    14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+    24,    25,    26,    27,    28,    29,   150,   143,   144,   145,
+   146,   150,    89,   149,     5,   151,   658,    94,   154,   150,
+   154,   150,   150,     7,   150,   150,   150,   106,   107,   108,
+   109,   110,   111,   112,   113,   150,   113,   154,   150,   150,
+   670,   671,   672,   150,   150,   687,   150,   689,   150,   691,
+   150,   681,   682,   132,   133,   150,   135,   150,    30,    31,
+    32,    33,    34,    35,    36,    37,   150,    39,   150,    41,
+    42,   151,    44,    45,   150,   150,   150,   150,   708,   709,
+   106,   107,   108,   109,   110,   111,   112,   113,   150,   150,
+     7,   150,    64,   150,   724,   150,   152,   143,   144,   145,
+   146,   151,   150,   149,   734,   151,    78,    79,   154,   150,
+   150,   741,   742,   743,   150,   150,   150,   150,   748,   143,
+   144,   150,   752,   150,   152,    82,   150,   150,   150,   150,
+   753,   761,   762,   150,   150,   150,   150,   150,   150,    30,
+    31,    32,    33,    34,    35,    36,    37,   150,    39,   151,
+    41,    42,   152,    44,    45,   151,   137,     5,   788,   131,
+   790,   791,   792,   793,   794,   795,   796,   797,   798,   799,
+   800,   801,     5,    64,     5,     5,     5,     5,   143,   144,
+   145,   146,   154,     5,   149,   815,   816,    78,    79,   154,
+   143,   144,   145,   146,     5,     5,   149,   143,   144,   145,
+   146,   154,     5,   149,   143,   144,   145,   146,   154,     5,
+   149,   143,   144,   145,   146,   154,     5,   149,   143,   144,
+   145,   146,   154,     5,   149,     5,     5,   857,     5,   154,
+     5,   861,   862,   863,     5,   143,   144,   145,   146,     5,
+   131,   149,   143,   144,   145,   146,   154,     5,   149,   143,
+   144,   145,   146,   154,     5,   149,     5,   887,   152,   889,
+     5,   143,   144,   145,   146,   124,     5,   149,     5,   899,
+   152,     5,   143,   144,   145,   146,     5,   907,   149,     3,
+     5,   152,   912,     5,     5,   915,   143,   144,   145,   146,
+     6,   149,   149,     7,     7,   152,     6,   927,   928,   929,
+   930,   931,   932,   933,   934,   935,   936,   937,   938,   143,
+   144,   145,   146,     7,     7,   149,     7,   153,   152,   143,
+   144,   145,   146,     7,     7,   149,   153,   153,   152,   143,
+   144,   145,   146,   150,   138,   149,   151,     5,   152,   151,
+     7,     6,   151,   973,   421,   422,   151,     7,   425,   151,
+   151,   428,   429,   143,   144,   145,   146,   151,   151,   149,
+   151,     7,   152,   151,   151,   143,   144,   145,   146,   999,
+  1000,   149,     7,     7,   152,   143,   144,   145,   146,   151,
+   150,   149,   151,     6,   152,   152,   151,   151,   151,   151,
+   151,  1021,  1022,  1023,  1024,  1025,  1026,  1027,  1028,  1029,
+     7,   143,   144,   145,   146,   151,     7,   149,   151,   486,
+   152,   151,   489,   143,   144,   145,   146,     7,   151,   149,
+   151,     7,   152,   143,   144,   145,   146,   504,   505,   149,
+   153,     7,   152,   510,   511,     7,   151,     7,     7,   151,
+   517,  1071,   519,   143,   144,   145,   146,   151,   151,   149,
+   151,   151,  1082,  1083,  1084,  1085,  1086,  1087,  1088,  1089,
+  1090,   143,   144,   145,   146,   151,   151,   149,     7,   150,
+   152,   151,   151,   150,   551,   150,   553,   143,   144,   145,
+   146,   150,   153,   149,     7,   562,   563,   564,  1118,  1119,
+   567,   568,   569,   570,   571,   572,   573,   574,  1128,  1129,
+  1130,  1131,  1132,  1133,  1134,  1135,  1136,   143,   144,   145,
+   146,   150,   150,   149,     3,   134,   152,   150,   150,   143,
+   144,   145,   146,   150,   150,   149,  1156,  1157,   152,   150,
+   150,   153,  1162,  1163,  1164,  1165,  1166,  1167,   143,   144,
+   145,   146,     3,     3,   149,   145,     3,   152,   143,   144,
+   145,   146,     3,     3,   149,  1185,     3,   152,     3,     3,
+  1190,  1191,  1192,  1193,  1194,  1195,   143,   144,   145,   146,
+     3,     3,   149,     3,     3,   152,     3,     5,     3,     5,
+     3,   154,  1212,  1213,  1214,  1215,  1216,  1217,   143,   144,
+   145,   146,     6,     6,   149,     6,     6,   152,  1228,  1229,
+  1230,   143,   144,   145,   146,     6,   154,   149,   153,     6,
+   152,     6,  1242,  1243,  1244,    83,     4,     3,   151,     6,
+   152,   151,   151,  1253,  1254,  1255,   152,   152,   152,     0,
+     1,   151,   151,     4,   143,   144,   145,   146,   715,   151,
+   149,   152,   152,   152,   721,   151,     7,   152,   725,   143,
+   144,   145,   146,   151,    33,   149,   151,     6,   152,    30,
+    31,    32,    33,    34,    35,    36,    37,   744,    39,    40,
+    41,    42,    43,    44,    45,   151,   151,   151,   151,   151,
+    51,    52,    53,    54,    55,    56,   152,    58,    59,    60,
+    61,    62,   151,    64,   143,   144,   145,   146,   151,   151,
+   149,     6,     6,   152,   152,   151,     6,    78,    79,    88,
+    89,    90,   151,    84,   151,     6,     6,    96,    97,    98,
+    99,   100,   101,   102,   103,   104,   105,     6,     6,     6,
+     6,   151,     6,     6,     6,   114,   115,   116,   117,   118,
+   119,   120,   121,   122,   123,     6,   125,   126,   127,   128,
+   129,   130,   143,   144,   145,   146,     6,    83,   149,     7,
+   131,   152,   143,   144,   145,   146,     3,     3,   149,   154,
+   154,   152,   154,   143,   144,   145,   146,     6,     3,   149,
+     6,   145,   152,   143,   144,   145,   146,     6,     6,   149,
+     3,     6,   152,   143,   144,   145,   146,     3,     6,   149,
+     3,     6,   152,     3,     6,     3,   883,     3,   153,   886,
+   143,   144,   145,   146,     6,     6,   149,   154,    65,   152,
+   143,   144,   145,   146,   151,   153,   149,   151,    80,   152,
+   151,     6,   909,   143,   144,   145,   146,     3,   152,   149,
+   151,   153,   152,   151,   151,   151,   923,   143,   144,   145,
+   146,   152,   151,   149,   152,   152,   152,   151,   143,   144,
+   145,   146,   939,   940,   149,   152,   152,   152,   143,   144,
+   145,   146,   152,     7,   149,     7,    83,   152,   143,   144,
+   145,   146,   151,   151,   149,     6,     6,   152,   143,   144,
+   145,   146,   134,     6,   149,     3,     6,   152,   143,   144,
+   145,   146,     6,     3,   149,     6,     3,   152,   143,   144,
+   145,   146,     6,     6,   149,     6,     6,   152,     6,   996,
+   997,   143,   144,   145,   146,     6,     5,   149,     5,   153,
+   152,   143,   144,   145,   146,     6,     6,   149,   154,     3,
+   152,   151,   151,  1020,   143,   144,   145,   146,   152,     6,
+   149,   152,   151,  1030,  1031,  1032,   143,   144,   145,   146,
+     6,   151,   149,   151,     6,   152,   143,   144,   145,   146,
+   151,   151,   149,   152,     6,   152,   143,   144,   145,   146,
+   151,   151,   149,   151,     3,   152,   143,   144,   145,   146,
+     6,  1068,   149,     6,     6,   152,   143,   144,   145,   146,
+     6,     6,   149,     6,  1081,   152,   143,   144,   145,   146,
+     5,     5,   149,   151,   154,   152,   143,   144,   145,   146,
+     3,   151,   149,   151,     6,   152,   143,   144,   145,   146,
+   152,     6,   149,   152,     6,   152,   143,   144,   145,   146,
+   151,     6,   149,    80,     6,   152,  1123,   143,   144,   145,
+   146,   134,   151,   149,     6,     5,   152,   143,   144,   145,
+   146,     5,   151,   149,   151,     6,   152,   143,   144,   145,
+   146,     3,   154,   149,   154,   153,   152,   143,   144,   145,
+   146,    80,   151,   149,  1161,   152,   152,   152,   151,     3,
+   152,  1168,  1169,  1170,   143,   144,   145,   146,     6,     6,
+   149,     6,     6,   152,   143,   144,   145,   146,   153,     3,
+   149,  1188,   139,   152,   143,   144,   145,   146,   151,   140,
+   149,   151,     6,   152,     6,   143,   144,   145,   146,   151,
+     0,   149,     6,  1210,   152,   143,   144,   145,   146,     6,
+   151,   149,   151,     6,   152,   143,   144,   145,   146,   151,
+  1227,   149,   152,   151,  1231,  1232,  1233,   143,   144,   145,
+   146,     6,   151,   149,  1241,     6,   152,   143,   144,   145,
+   146,     6,     6,   149,   151,     6,   152,     6,   152,     6,
+     6,     0,     6,     6,  1261,  1262,  1263,   143,   144,   145,
+   146,   458,     6,   149,  1019,   713,   152,   143,   144,   145,
+   146,   431,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,    -1,   152,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,
+   149,    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,
+    -1,   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,
+   151,   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,
+   143,   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,
+   144,   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,
+   145,   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,
+   146,    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,
+    -1,    -1,   149,    -1,   151,   143,   144,   145,   146,    -1,
+    -1,   149,    -1,   151
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+/* This file comes from bison-1.28.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+	 instead, just don't use alloca.  */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include <malloc.h>  */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+		 and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT 	goto yyabortlab
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 217 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  if (yyfree_stacks)
+	    {
+	      free (yyss);
+	      free (yyvs);
+#ifdef YYLSP_NEEDED
+	      free (yyls);
+#endif
+	    }
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+		   size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+		   size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+		   size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 4:
+#line 116 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"STL File Format");
+      STL_Surf = Create_Surface(1,MSH_SURF_STL,1);
+      STL_Surf->STL = new STL_Data;
+      return 1;
+    ;
+    break;}
+case 5:
+#line 130 "Gmsh.y"
+{
+      STL_Surf->STL->Add_Facet( yyvsp[-12].d, yyvsp[-11].d, yyvsp[-10].d,
+				yyvsp[-8].d, yyvsp[-7].d, yyvsp[-6].d,
+				yyvsp[-4].d, yyvsp[-3].d, yyvsp[-2].d);
+      return 1;
+    ;
+    break;}
+case 6:
+#line 137 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"STL File Format Read");
+      Tree_Add(THEM->Surfaces, &STL_Surf);
+      return 1;
+    ;
+    break;}
+case 9:
+#line 154 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 10:
+#line 155 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 11:
+#line 156 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 12:
+#line 157 "Gmsh.y"
+{ yyerrok ; return 1; ;
+    break;}
+case 13:
+#line 162 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"Step Iso-10303-21 File Format");
+      Create_Step_Solid_BRep();
+    ;
+    break;}
+case 14:
+#line 167 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"Step Iso-10303-21 File Format Read");
+      Resolve_BREP ();
+    ;
+    break;}
+case 18:
+#line 178 "Gmsh.y"
+{
+    ;
+    break;}
+case 19:
+#line 181 "Gmsh.y"
+{
+    ;
+    break;}
+case 20:
+#line 185 "Gmsh.y"
+{
+   ;
+    break;}
+case 21:
+#line 191 "Gmsh.y"
+{
+        Add_Cartesian_Point((int)yyvsp[-8].d,yyvsp[-4].c,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2]);
+    ;
+    break;}
+case 22:
+#line 197 "Gmsh.y"
+{
+       Add_BSpline_Curve_With_Knots ((int)yyvsp[-22].d, yyvsp[-18].c, (int) yyvsp[-16].d, yyvsp[-14].l,	yyvsp[-6].l, yyvsp[-4].l, 0., 1.);
+    ;
+    break;}
+case 23:
+#line 204 "Gmsh.y"
+{
+      Add_BSpline_Surface_With_Knots ((int)yyvsp[-30].d, yyvsp[-26].c, (int) yyvsp[-24].d, (int) yyvsp[-22].d, yyvsp[-20].l, yyvsp[-10].l,
+				      yyvsp[-8].l, yyvsp[-6].l, yyvsp[-4].l, 0., 1., 0., 1. );
+    ;
+    break;}
+case 24:
+#line 210 "Gmsh.y"
+{
+      Add_Edge_Curve ((int)yyvsp[-14].d, yyvsp[-10].c , (int)yyvsp[-8].d , (int)yyvsp[-6].d, (int)yyvsp[-4].d);
+    ;
+    break;}
+case 25:
+#line 214 "Gmsh.y"
+{
+      Add_Face_Outer_Bound((int)yyvsp[-10].d,yyvsp[-6].c,(int)yyvsp[-4].d,yyvsp[-2].i,1);
+    ;
+    break;}
+case 26:
+#line 218 "Gmsh.y"
+{
+      /* La je dois voir la norme ! Face_Bound : trou externe a la surface ! */
+      Msg(PARSER_INFO,"Found a Face Bound");
+      Add_Face_Outer_Bound((int)yyvsp[-10].d,yyvsp[-6].c,(int)yyvsp[-4].d,yyvsp[-2].i,0);
+    ;
+    break;}
+case 27:
+#line 225 "Gmsh.y"
+{
+      Add_Oriented_Edge((int)yyvsp[-14].d,yyvsp[-10].c,(int)yyvsp[-4].d,yyvsp[-2].i);
+    ;
+    break;}
+case 28:
+#line 229 "Gmsh.y"
+{
+      Add_Edge_Loop((int)yyvsp[-8].d,yyvsp[-4].c,yyvsp[-2].l);
+    ;
+    break;}
+case 29:
+#line 234 "Gmsh.y"
+{
+      Add_Advanced_Face((int)yyvsp[-12].d,yyvsp[-8].c,yyvsp[-6].l,(int)yyvsp[-4].d,yyvsp[-2].i);
+    ;
+    break;}
+case 30:
+#line 238 "Gmsh.y"
+{
+      Add_Vertex_Point((int)yyvsp[-8].d,yyvsp[-4].c,(int)yyvsp[-2].d);
+    ;
+    break;}
+case 31:
+#line 242 "Gmsh.y"
+{
+    ;
+    break;}
+case 32:
+#line 246 "Gmsh.y"
+{
+      Add_Axis2_Placement3D  ( (int)yyvsp[-12].d, (int)yyvsp[-4].d, (int)yyvsp[-2].d, (int)yyvsp[-6].d);
+    ;
+    break;}
+case 33:
+#line 250 "Gmsh.y"
+{
+      Add_Direction((int)yyvsp[-8].d , yyvsp[-4].c, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2]);
+    ;
+    break;}
+case 34:
+#line 254 "Gmsh.y"
+{
+      Add_Plane((int)yyvsp[-8].d,yyvsp[-4].c,(int)yyvsp[-2].d);
+    ;
+    break;}
+case 35:
+#line 258 "Gmsh.y"
+{
+      Add_Line ((int)yyvsp[-10].d, yyvsp[-6].c , (int) yyvsp[-4].d, (int)yyvsp[-2].d);
+    ;
+    break;}
+case 36:
+#line 262 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"Found a Closed shell");
+      Add_Closed_Shell((int)yyvsp[-8].d, yyvsp[-4].c , yyvsp[-2].l);
+    ;
+    break;}
+case 37:
+#line 268 "Gmsh.y"
+{
+    ;
+    break;}
+case 38:
+#line 271 "Gmsh.y"
+{
+    ;
+    break;}
+case 39:
+#line 274 "Gmsh.y"
+{
+      Add_Cylinder ((int)yyvsp[-10].d, yyvsp[-6].c , (int)yyvsp[-4].d, yyvsp[-2].d);
+    ;
+    break;}
+case 40:
+#line 278 "Gmsh.y"
+{
+      Add_Cone ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d,yyvsp[-2].d);
+    ;
+    break;}
+case 41:
+#line 282 "Gmsh.y"
+{
+      Add_Torus ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d,yyvsp[-2].d);
+    ;
+    break;}
+case 42:
+#line 286 "Gmsh.y"
+{
+      Add_Circle((int) yyvsp[-10].d, yyvsp[-6].c, (int) yyvsp[-4].d, yyvsp[-2].d);
+    ;
+    break;}
+case 43:
+#line 290 "Gmsh.y"
+{
+      Add_Ellipsis((int) yyvsp[-12].d, yyvsp[-8].c, (int) yyvsp[-6].d, yyvsp[-4].d, yyvsp[-2].d);
+    ;
+    break;}
+case 44:
+#line 295 "Gmsh.y"
+{
+    ;
+    break;}
+case 45:
+#line 298 "Gmsh.y"
+{
+    ;
+    break;}
+case 46:
+#line 302 "Gmsh.y"
+{
+    ;
+    break;}
+case 47:
+#line 305 "Gmsh.y"
+{
+    ;
+    break;}
+case 48:
+#line 309 "Gmsh.y"
+{
+    ;
+    break;}
+case 49:
+#line 312 "Gmsh.y"
+{
+    ;
+    break;}
+case 50:
+#line 315 "Gmsh.y"
+{
+    ;
+    break;}
+case 52:
+#line 326 "Gmsh.y"
+{
+      Msg(PARSER_INFO,"Gmsh File Format Read");
+    ;
+    break;}
+case 53:
+#line 332 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 54:
+#line 333 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 55:
+#line 334 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 56:
+#line 335 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 57:
+#line 336 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 58:
+#line 337 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 59:
+#line 338 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 60:
+#line 339 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 61:
+#line 340 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 62:
+#line 341 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 63:
+#line 342 "Gmsh.y"
+{ return 1; ;
+    break;}
+case 64:
+#line 343 "Gmsh.y"
+{ yyerrok; return 1;;
+    break;}
+case 65:
+#line 352 "Gmsh.y"
+{ 
+      EndView(yyvsp[-4].c,0.,0.,0.); 
+    ;
+    break;}
+case 66:
+#line 356 "Gmsh.y"
+{
+      EndView(yyvsp[-6].c,yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2]);
+    ;
+    break;}
+case 67:
+#line 363 "Gmsh.y"
+{
+      BeginView(1); 
+    ;
+    break;}
+case 80:
+#line 385 "Gmsh.y"
+{
+      AddView_ScalarSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 81:
+#line 395 "Gmsh.y"
+{
+      AddView_VectorSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 82:
+#line 405 "Gmsh.y"
+{
+      AddView_TensorSimplex(yyvsp[-25].d,yyvsp[-23].d,yyvsp[-21].d,yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 83:
+#line 414 "Gmsh.y"
+{
+      AddView_ScalarTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 84:
+#line 423 "Gmsh.y"
+{
+      AddView_VectorTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 85:
+#line 432 "Gmsh.y"
+{
+      AddView_TensorTriangle(yyvsp[-19].d,yyvsp[-17].d,yyvsp[-15].d,yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 86:
+#line 440 "Gmsh.y"
+{
+      AddView_ScalarLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 87:
+#line 448 "Gmsh.y"
+{
+      AddView_VectorLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 88:
+#line 456 "Gmsh.y"
+{
+      AddView_TensorLine(yyvsp[-13].d,yyvsp[-11].d,yyvsp[-9].d,yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 89:
+#line 463 "Gmsh.y"
+{
+      AddView_ScalarPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 90:
+#line 470 "Gmsh.y"
+{
+      AddView_VectorPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 91:
+#line 477 "Gmsh.y"
+{
+      AddView_TensorPoint(yyvsp[-7].d,yyvsp[-5].d,yyvsp[-3].d,yyvsp[-1].l);
+    ;
+    break;}
+case 92:
+#line 488 "Gmsh.y"
+{
+      TheSymbol.Name = yyvsp[-3].c;
+      TheSymbol.val  = yyvsp[-1].d;
+      List_Replace(Symbol_L,&TheSymbol,CompareSymbols);
+    ;
+    break;}
+case 93:
+#line 505 "Gmsh.y"
+{
+      Cdbpts101((int)yyvsp[-4].d,yyvsp[-1].v[0],yyvsp[-1].v[1],yyvsp[-1].v[2],yyvsp[-1].v[3],yyvsp[-1].v[4]);
+      yyval.s.Type = MSH_POINT;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 94:
+#line 512 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_POINT,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_PHYSICAL_POINT;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 95:
+#line 518 "Gmsh.y"
+{
+      Vertex *v;
+      Attractor *a;
+      double p;
+      int ip;
+      for(int i=0;i<List_Nbr(yyvsp[-1].l);i++){
+      	List_Read(yyvsp[-1].l,i,&p);
+        ip = (int)p;
+        v = FindVertex(ip,THEM);
+        if(!v)
+	  vyyerror("Unkown Point %d", ip);
+	else{
+	  a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
+			       yyvsp[-8].d,yyvsp[-6].d,yyvsp[-4].d,v,NULL,NULL);
+	  List_Add(THEM->Metric->Attractors,&a);
+        }
+      }
+    ;
+    break;}
+case 96:
+#line 537 "Gmsh.y"
+{
+      for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
+	List_Read(yyvsp[-3].l,i,&d);
+	Vertex *v = FindVertex((int)d,THEM);
+	if(!v)
+	  vyyerror("Unkown Point %d", (int)d);
+	else
+	  v->lc = yyvsp[-1].d;
+      }
+    ;
+    break;}
+case 97:
+#line 548 "Gmsh.y"
+{
+      yyval.s.Type = MSH_POINT;
+      yyval.s.Num  = (int)yyvsp[-2].d;
+    ;
+    break;}
+case 98:
+#line 556 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_LINE,1,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      yyval.s.Type = MSH_SEGM_LINE;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 99:
+#line 562 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_SPLN,3,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      yyval.s.Type = MSH_SEGM_SPLN;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 100:
+#line 568 "Gmsh.y"
+{
+      Curve *c;
+      Attractor *a;
+      double p;
+      int ip;
+      for(int i=0;i<List_Nbr(yyvsp[-1].l);i++){
+      	List_Read(yyvsp[-1].l,i,&p);
+        ip = (int)p;
+        c = FindCurve(ip,THEM);
+        if(!c)
+	  vyyerror("Unkown Curve %d", ip);
+	else{
+	  a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
+			       yyvsp[-8].d,yyvsp[-6].d,yyvsp[-4].d,NULL,c,NULL);
+	  List_Add(THEM->Metric->Attractors,&a);
+        }
+      }
+    ;
+    break;}
+case 101:
+#line 587 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_CIRC,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      yyval.s.Type = MSH_SEGM_CIRC ;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 102:
+#line 593 "Gmsh.y"
+{
+      List_T *temp;
+      int i,j;
+      double d;
+      temp = List_Create(List_Nbr(yyvsp[-3].l),1,sizeof(int));
+      for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
+      	List_Read(yyvsp[-3].l,i,&d);
+        j = (int)d;
+        List_Add(temp,&j);
+      }
+      AddCircleInDataBase ((int) yyvsp[-6].d, MSH_SEGM_CIRC, temp, yyvsp[-1].v);
+      List_Delete(temp);
+      yyval.s.Type = MSH_SEGM_CIRC ;
+      yyval.s.Num  = (int)yyvsp[-6].d;
+    ;
+    break;}
+case 103:
+#line 610 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-14].d,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,yyvsp[-10].d,yyvsp[-8].d,yyvsp[-6].c,yyvsp[-4].c,yyvsp[-2].c);
+      yyval.s.Type = MSH_SEGM_PARAMETRIC ;
+      yyval.s.Num  = (int)yyvsp[-14].d;
+    ;
+    break;}
+case 104:
+#line 616 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_ELLI,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      yyval.s.Type = MSH_SEGM_ELLI ;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 105:
+#line 622 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_LINE,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_PHYSICAL_LINE;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 106:
+#line 628 "Gmsh.y"
+{
+      yyval.s.Type = MSH_SEGM_LOOP;
+      Cdbz101((int)yyvsp[-4].d,yyval.s.Type,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Num = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 107:
+#line 634 "Gmsh.y"
+{
+      yyval.s.Num = (int)yyvsp[-2].d;
+      Curve *c = FindCurve(yyval.s.Num,THEM);
+      if(!c)
+	vyyerror("Unkown Curve %d", yyval.s.Num);
+      else
+	yyval.s.Type = c->Typ;
+    ;
+    break;}
+case 108:
+#line 643 "Gmsh.y"
+{
+      Cdbseg101((int)yyvsp[-4].d,MSH_SEGM_BSPLN,2,yyvsp[-1].l,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      yyval.s.Type = MSH_SEGM_BSPLN;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 109:
+#line 649 "Gmsh.y"
+{
+      List_T *Temp;
+      int i;
+      double d;
+      if(List_Nbr(yyvsp[-5].l) + (int)yyvsp[-1].d + 1 != List_Nbr(yyvsp[-3].l)){
+	yyerror("wrong nurbs curve definition (deg + 1 + nbpts != nbknots)");
+      }
+      Temp = List_Create(List_Nbr(yyvsp[-5].l),1,sizeof(int));
+      for(i=0;i<List_Nbr(yyvsp[-5].l);i++) {
+      	List_Read(yyvsp[-5].l,i,&d);
+        j = (int)d;
+        List_Add(Temp,&j);
+      }
+      AddCurveInDataBase ((int)yyvsp[-8].d,MSH_SEGM_NURBS,(int)yyvsp[-1].d,Temp,yyvsp[-3].l,-1,-1,0.,1.);
+      List_Delete(Temp);
+    ;
+    break;}
+case 110:
+#line 669 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_SURF_PLAN,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_SURF_PLAN;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 111:
+#line 675 "Gmsh.y"
+{
+      Surface *s,*support;
+      support = FindSurface((int)yyvsp[-2].d,THEM);
+      if(!support)
+	vyyerror("Unkown Surface %d", (int)yyvsp[-2].d);
+      else{
+	Cdbz101((int)yyvsp[-5].d,MSH_SURF_PLAN,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+	s = FindSurface((int)yyvsp[-5].d,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", (int)yyvsp[-5].d);
+	else{
+	  s->Typ =  MSH_SURF_TRIMMED;
+	  s->Support = support;
+	  yyval.s.Type = MSH_SURF_TRIMMED;
+	  yyval.s.Num  = (int)yyvsp[-5].d;
+	}
+      }
+    ;
+    break;}
+case 112:
+#line 694 "Gmsh.y"
+{
+      List_Read(yyvsp[-1].l,0,&d);
+      i = (int)d;
+      EdgeLoop *el = FindEdgeLoop(i,THEM);
+      if(!el)
+	vyyerror("Unkown Loop %d", i);
+      else{
+	j = List_Nbr(el->Curves);
+	if(j==4)
+	  yyval.s.Type = MSH_SURF_REGL;
+	else if(j==3)
+	  yyval.s.Type  = MSH_SURF_TRIC;
+	else
+	  vyyerror("Ruled surface %d has not 3 or 4 borders", yyvsp[-4].d);
+	Cdbz101((int)yyvsp[-4].d,yyval.s.Type,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+	yyval.s.Num = (int)yyvsp[-4].d;
+      }
+    ;
+    break;}
+case 113:
+#line 715 "Gmsh.y"
+{
+      CreateNurbsSurface ( (int) yyvsp[-16].d , (int)yyvsp[-4].d , (int)yyvsp[-2].d  , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l);
+      yyval.s.Type  = MSH_SURF_NURBS;
+      yyval.s.Num = (int)yyvsp[-16].d;
+    ;
+    break;}
+case 114:
+#line 723 "Gmsh.y"
+{
+      CreateNurbsSurfaceSupport ((int)yyvsp[-16].d, (int) yyvsp[-4].d , (int) yyvsp[-2].d , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l);
+    ;
+    break;}
+case 115:
+#line 727 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_SURFACE,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_PHYSICAL_SURFACE;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 116:
+#line 733 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_SURF_LOOP,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_SURF_LOOP;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 117:
+#line 739 "Gmsh.y"
+{
+      yyval.s.Num = (int)yyvsp[-2].d;
+      Surface *s = FindSurface(yyval.s.Num,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", yyval.s.Num);
+      else
+	yyval.s.Type = s->Typ;
+     ;
+    break;}
+case 118:
+#line 751 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_VOLUME;
+      yyval.s.Num  = (int)yyvsp[-4].d;      
+    ;
+    break;}
+case 119:
+#line 757 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_VOLUME;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 120:
+#line 763 "Gmsh.y"
+{
+      Cdbz101((int)yyvsp[-4].d,MSH_PHYSICAL_VOLUME,0,0,0,0,0,NULL,yyvsp[-1].l,NULL);
+      yyval.s.Type = MSH_PHYSICAL_VOLUME;
+      yyval.s.Num  = (int)yyvsp[-4].d;
+    ;
+    break;}
+case 121:
+#line 776 "Gmsh.y"
+{
+      TranslateShapes (yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-1].l,1);
+      yyval.l = yyvsp[-1].l;
+    ;
+    break;}
+case 122:
+#line 781 "Gmsh.y"
+{
+      RotateShapes(yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].d,yyvsp[-1].l);
+      yyval.l = yyvsp[-1].l;
+    ;
+    break;}
+case 123:
+#line 786 "Gmsh.y"
+{
+      SymetryShapes(yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-4].v[3],yyvsp[-1].l,1);
+      yyval.l = yyvsp[-1].l;
+    ;
+    break;}
+case 124:
+#line 791 "Gmsh.y"
+{
+      DilatShapes(yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].d,yyvsp[-1].l,1);
+      yyval.l = yyvsp[-1].l;
+    ;
+    break;}
+case 125:
+#line 798 "Gmsh.y"
+{ yyval.l = yyvsp[0].l; ;
+    break;}
+case 126:
+#line 799 "Gmsh.y"
+{ yyval.l = yyvsp[0].l; ;
+    break;}
+case 127:
+#line 800 "Gmsh.y"
+{ yyval.l = yyvsp[0].l; ;
+    break;}
+case 128:
+#line 805 "Gmsh.y"
+{
+      yyval.l = List_Create(3,3,sizeof(Shape));
+    ;
+    break;}
+case 129:
+#line 809 "Gmsh.y"
+{
+      List_Add(yyval.l,&yyvsp[0].s);
+      yyval.l = yyvsp[-1].l;
+    ;
+    break;}
+case 130:
+#line 821 "Gmsh.y"
+{
+      yyval.l = List_Create(3,3,sizeof(Shape));
+      for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
+	List_Read (yyvsp[-1].l,i,&TheShape);
+	CopyShape(TheShape.Type,TheShape.Num,&j);
+	TheShape.Num = j;
+	List_Add(yyval.l,&TheShape);
+      }
+    ;
+    break;}
+case 131:
+#line 839 "Gmsh.y"
+{
+      for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
+	List_Read (yyvsp[-1].l,i,&TheShape);
+	DeleteShape(TheShape.Type,TheShape.Num);
+      }
+    ;
+    break;}
+case 132:
+#line 854 "Gmsh.y"
+{
+      yyinTab[RecursionLevel++] = yyin;
+      strcpy(tmpstring, ThePathForIncludes);
+      if((yyin = fopen(strcat(tmpstring,yyvsp[-1].c),"r"))){
+	strcpy(yynameTab[RecursionLevel-1],yyname);
+	yylinenoTab[RecursionLevel-1]=yylineno;
+	yylineno=1;
+	strcpy(yyname,yyvsp[-1].c);
+	while(!feof(yyin)){
+	  yyparse();
+	}
+	fclose(yyin);
+	yyin = yyinTab[--RecursionLevel];
+	strcpy(yyname,yynameTab[RecursionLevel]);
+	yylineno = yylinenoTab[RecursionLevel];
+      }
+      else{
+	vyyerror("Unknown file: %s", yyvsp[-1].c) ;  
+	yyin = yyinTab[--RecursionLevel];
+      }
+    ;
+    break;}
+case 133:
+#line 885 "Gmsh.y"
+{
+      Extrude_ProtudeSurface(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,0,NULL);
+    ;
+    break;}
+case 134:
+#line 889 "Gmsh.y"
+{
+      Extrude_ProtudeSurface(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,0,NULL);
+    ;
+    break;}
+case 135:
+#line 893 "Gmsh.y"
+{
+      Extrude_ProtudeSurface(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL);
+    ;
+    break;}
+case 136:
+#line 897 "Gmsh.y"
+{
+      Extrude_ProtudeSurface(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL);
+    ;
+    break;}
+case 137:
+#line 901 "Gmsh.y"
+{
+      Curve *pc, *prc;
+      Extrude_ProtudePoint(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,
+			   &pc,&prc,NULL);
+    ;
+    break;}
+case 138:
+#line 907 "Gmsh.y"
+{
+      Curve *pc, *prc;
+      Extrude_ProtudePoint(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,&pc,&prc,NULL);
+    ;
+    break;}
+case 139:
+#line 912 "Gmsh.y"
+{
+      Extrude_ProtudeCurve(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,NULL);
+    ;
+    break;}
+case 140:
+#line 916 "Gmsh.y"
+{
+      Extrude_ProtudeCurve(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,NULL);
+    ;
+    break;}
+case 141:
+#line 920 "Gmsh.y"
+{
+    int vol = NEWREG();
+    Extrude_ProtudeSurface(1,(int)yyvsp[-7].d,yyvsp[-5].v[0],yyvsp[-5].v[1],yyvsp[-5].v[2],0.,0.,0.,0.,vol,&extr);
+  ;
+    break;}
+case 142:
+#line 926 "Gmsh.y"
+{
+    int vol = NEWREG();
+    Extrude_ProtudeSurface(0,(int)yyvsp[-11].d,yyvsp[-9].v[0],yyvsp[-9].v[1],yyvsp[-9].v[2],yyvsp[-7].v[0],yyvsp[-7].v[1],yyvsp[-7].v[2],yyvsp[-5].d,vol,&extr);
+  ;
+    break;}
+case 143:
+#line 934 "Gmsh.y"
+{
+    ;
+    break;}
+case 144:
+#line 937 "Gmsh.y"
+{
+    ;
+    break;}
+case 145:
+#line 943 "Gmsh.y"
+{
+      double d;
+      int j;
+      extr.mesh.NbLayer = List_Nbr(yyvsp[-6].l);
+      extr.mesh.ExtrudeMesh = true;
+      for(int i=0;i<List_Nbr(yyvsp[-6].l);i++){
+	List_Read(yyvsp[-6].l,i,&d);
+	j = (int)d;
+	extr.mesh.NbElmLayer[i] = j;
+	List_Read(yyvsp[-4].l,i,&d);
+	j = (int)d;
+	extr.mesh.ZonLayer[i] = j;
+	List_Read(yyvsp[-2].l,i,&d);
+	extr.mesh.hLayer[i] = d;
+      }
+    ;
+    break;}
+case 146:
+#line 967 "Gmsh.y"
+{
+      Curve *c;
+      for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
+	List_Read(yyvsp[-3].l,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)yyvsp[-1].d;
+	  c->ipar[1] = sign(d);
+	  c->dpar[0] = 1.0;
+	}
+      }
+    ;
+    break;}
+case 147:
+#line 984 "Gmsh.y"
+{
+      Curve *c;
+      for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
+	List_Read(yyvsp[-6].l,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)yyvsp[-4].d;
+	  c->ipar[1] = sign(d); /* Power : code 1 ou -1 */
+	  c->dpar[0] = yyvsp[-1].d;
+	}
+      }
+    ;
+    break;}
+case 148:
+#line 1001 "Gmsh.y"
+{
+      Curve *c;
+      for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
+	List_Read(yyvsp[-6].l,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)yyvsp[-4].d;
+	  c->ipar[1] = 2*sign(d); /* Bump : code 2 ou -2 */
+	  c->dpar[0] = yyvsp[-1].d;
+	}
+      }
+    ;
+    break;}
+case 149:
+#line 1018 "Gmsh.y"
+{
+      Curve *c;
+      for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
+	List_Read(yyvsp[-6].l,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)yyvsp[-4].d;
+	  c->ipar[1] = 3*sign(d); /* Progresion : code 3 ou -3 */
+	  c->dpar[0] = yyvsp[-1].d;
+	}
+      }
+    ;
+    break;}
+case 150:
+#line 1035 "Gmsh.y"
+{
+      Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", (int)yyvsp[-4].d);
+      else{
+	s->Method = TRANSFINI;
+	k = List_Nbr(yyvsp[-1].l);
+	if(k!=3 && k!=4){
+	  vyyerror("Bad Number of Points for Transfinite Surface %d", yyvsp[-4].d) ;
+	}
+	else{
+	  for(i=0;i<k;i++){
+	    List_Read(yyvsp[-1].l,i,&d);
+	    j = (int)fabs(d);
+	    s->ipar[i] = j;
+	  }
+	}
+      }
+    ;
+    break;}
+case 151:
+#line 1055 "Gmsh.y"
+{
+      Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", (int)yyvsp[-4].d);
+      else{
+        s->Method = ELLIPTIC;
+        k = List_Nbr(yyvsp[-1].l);
+        if(k != 4)
+          vyyerror("Bad Number of Points for Elliptic Surface %d", yyvsp[-4].d) ;
+        else{
+	  for(i=0;i<k;i++){
+	    List_Read(yyvsp[-1].l,i,&d);
+	    j = (int)fabs(d);
+	    s->ipar[i] = j;
+	  }
+	}
+      }
+    ;
+    break;}
+case 152:
+#line 1074 "Gmsh.y"
+{
+      Volume *v = FindVolume((int)yyvsp[-4].d,THEM);
+      if(!v)
+	vyyerror("Unkown Volume %d", (int)yyvsp[-4].d);
+      else{
+	v->Method = TRANSFINI;
+	k = List_Nbr(yyvsp[-1].l);
+	if(k!=6 && k!=8)
+	  vyyerror("Bad Number of Points for Transfinite Volume %d", yyvsp[-4].d) ;
+	else{
+	  for(i=0;i<k;i++){
+	    List_Read(yyvsp[-1].l,i,&d);
+	    j = (int)fabs(d);
+	    v->ipar[i] = j;
+	  }
+	}
+      }
+    ;
+    break;}
+case 153:
+#line 1093 "Gmsh.y"
+{
+      Surface *s;
+      for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
+	List_Read(yyvsp[-3].l,i,&d);
+	j = (int)d;
+	s = FindSurface(j,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", j);
+	else{
+	  s->Recombine = 1;
+	  s->RecombineAngle = yyvsp[-1].d;
+	}
+      }
+    ;
+    break;}
+case 154:
+#line 1108 "Gmsh.y"
+{
+      Surface *s;
+      for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
+	List_Read(yyvsp[-1].l,i,&d);
+	j = (int)d;
+        s = FindSurface(j,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", j);
+	else{
+	  s->Recombine = 1;
+	  s->RecombineAngle = 30.;
+        }
+      }
+    ;
+    break;}
+case 155:
+#line 1123 "Gmsh.y"
+{
+      Msg(PARSER_ERROR, "Physical Associations do not exist anymore!");
+    ;
+    break;}
+case 156:
+#line 1135 "Gmsh.y"
+{ 
+      Coherence_PS();
+    ;
+    break;}
+case 160:
+#line 1155 "Gmsh.y"
+{ ColorField = ColorGeneral; ;
+    break;}
+case 162:
+#line 1158 "Gmsh.y"
+{ ColorField = ColorGeometry; ;
+    break;}
+case 164:
+#line 1161 "Gmsh.y"
+{ ColorField = ColorMesh; ;
+    break;}
+case 168:
+#line 1172 "Gmsh.y"
+{
+      i = Get_ColorForString(ColorString, -1, yyvsp[-1].c, &flag);
+      if(flag) vyyerror("Unknown Color: %s", yyvsp[-1].c);
+      Get_ColorPointerForString(ColorField, yyvsp[-3].c, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", yyvsp[-3].c);
+      else
+	*ptr = i ;
+    ;
+    break;}
+case 169:
+#line 1182 "Gmsh.y"
+{
+      i = Get_ColorForString(ColorString, (int)yyvsp[-2].d, yyvsp[-4].c, &flag);
+      if(flag) vyyerror("Unknown Color: %s", yyvsp[-4].c);
+      Get_ColorPointerForString(ColorField, yyvsp[-7].c, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", yyvsp[-7].c);
+      else
+	*ptr = i ;
+    ;
+    break;}
+case 170:
+#line 1192 "Gmsh.y"
+{
+      Get_ColorPointerForString(ColorField, yyvsp[-3].c, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", yyvsp[-1].v);
+      else
+	*ptr = PACK_COLOR((int)yyvsp[-1].v[0], (int)yyvsp[-1].v[1], (int)yyvsp[-1].v[2], (int)yyvsp[-1].v[3]);
+    ;
+    break;}
+case 171:
+#line 1203 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-7].d;
+      yyval.v[1]=yyvsp[-5].d;
+      yyval.v[2]=yyvsp[-3].d;
+      yyval.v[3]=yyvsp[-1].d;
+    ;
+    break;}
+case 172:
+#line 1210 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-5].d;
+      yyval.v[1]=yyvsp[-3].d;
+      yyval.v[2]=yyvsp[-1].d;
+      yyval.v[3]=255.;
+    ;
+    break;}
+case 173:
+#line 1286 "Gmsh.y"
+{yyval.i = 1;;
+    break;}
+case 174:
+#line 1287 "Gmsh.y"
+{yyval.i = 0;;
+    break;}
+case 175:
+#line 1288 "Gmsh.y"
+{yyval.i = -1;;
+    break;}
+case 176:
+#line 1289 "Gmsh.y"
+{yyval.i = -1;;
+    break;}
+case 177:
+#line 1290 "Gmsh.y"
+{yyval.i = -1;;
+    break;}
+case 178:
+#line 1294 "Gmsh.y"
+{ yyval.d = yyvsp[0].d; ;
+    break;}
+case 179:
+#line 1295 "Gmsh.y"
+{ yyval.d = yyvsp[-1].d; ;
+    break;}
+case 180:
+#line 1296 "Gmsh.y"
+{ yyval.d = yyvsp[-2].d - yyvsp[0].d; ;
+    break;}
+case 181:
+#line 1297 "Gmsh.y"
+{ yyval.d = yyvsp[-2].d + yyvsp[0].d; ;
+    break;}
+case 182:
+#line 1298 "Gmsh.y"
+{ yyval.d = yyvsp[-2].d * yyvsp[0].d; ;
+    break;}
+case 183:
+#line 1299 "Gmsh.y"
+{ yyval.d = yyvsp[-2].d / yyvsp[0].d; ;
+    break;}
+case 184:
+#line 1300 "Gmsh.y"
+{ yyval.d = pow(yyvsp[-2].d, yyvsp[0].d); ;
+    break;}
+case 185:
+#line 1301 "Gmsh.y"
+{ yyval.d = - yyvsp[0].d; ;
+    break;}
+case 186:
+#line 1302 "Gmsh.y"
+{ yyval.d = yyvsp[0].d; ;
+    break;}
+case 187:
+#line 1303 "Gmsh.y"
+{ yyval.d = exp(yyvsp[-1].d);      ;
+    break;}
+case 188:
+#line 1304 "Gmsh.y"
+{ yyval.d = log(yyvsp[-1].d);      ;
+    break;}
+case 189:
+#line 1305 "Gmsh.y"
+{ yyval.d = log10(yyvsp[-1].d);    ;
+    break;}
+case 190:
+#line 1306 "Gmsh.y"
+{ yyval.d = sqrt(yyvsp[-1].d);     ;
+    break;}
+case 191:
+#line 1307 "Gmsh.y"
+{ yyval.d = sin(yyvsp[-1].d);      ;
+    break;}
+case 192:
+#line 1308 "Gmsh.y"
+{ yyval.d = asin(yyvsp[-1].d);     ;
+    break;}
+case 193:
+#line 1309 "Gmsh.y"
+{ yyval.d = cos(yyvsp[-1].d);      ;
+    break;}
+case 194:
+#line 1310 "Gmsh.y"
+{ yyval.d = acos(yyvsp[-1].d);     ;
+    break;}
+case 195:
+#line 1311 "Gmsh.y"
+{ yyval.d = tan(yyvsp[-1].d);      ;
+    break;}
+case 196:
+#line 1312 "Gmsh.y"
+{ yyval.d = atan(yyvsp[-1].d);     ;
+    break;}
+case 197:
+#line 1313 "Gmsh.y"
+{ yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
+    break;}
+case 198:
+#line 1314 "Gmsh.y"
+{ yyval.d = sinh(yyvsp[-1].d);     ;
+    break;}
+case 199:
+#line 1315 "Gmsh.y"
+{ yyval.d = cosh(yyvsp[-1].d);     ;
+    break;}
+case 200:
+#line 1316 "Gmsh.y"
+{ yyval.d = tanh(yyvsp[-1].d);     ;
+    break;}
+case 201:
+#line 1317 "Gmsh.y"
+{ yyval.d = fabs(yyvsp[-1].d);     ;
+    break;}
+case 202:
+#line 1318 "Gmsh.y"
+{ yyval.d = floor(yyvsp[-1].d);    ;
+    break;}
+case 203:
+#line 1319 "Gmsh.y"
+{ yyval.d = ceil(yyvsp[-1].d);     ;
+    break;}
+case 204:
+#line 1320 "Gmsh.y"
+{ yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
+    break;}
+case 205:
+#line 1321 "Gmsh.y"
+{ yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
+    break;}
+case 206:
+#line 1322 "Gmsh.y"
+{ yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d);  ;
+    break;}
+case 207:
+#line 1326 "Gmsh.y"
+{ yyval.d = yyvsp[0].d; ;
+    break;}
+case 208:
+#line 1327 "Gmsh.y"
+{ yyval.d = 3.141592653589793; ;
+    break;}
+case 209:
+#line 1329 "Gmsh.y"
+{
+      TheSymbol.Name = yyvsp[0].c ;
+      if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) {
+	vyyerror("Unknown variable: %s", yyvsp[0].c) ;  yyval.d = 0. ;
+      }
+      else  yyval.d = TheSymbol.val ;
+      Free(yyvsp[0].c);
+    ;
+    break;}
+case 210:
+#line 1341 "Gmsh.y"
+{ 
+      ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; 
+      for(d=yyvsp[-2].d ; (yyvsp[-2].d<yyvsp[0].d)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; (yyvsp[-2].d<yyvsp[0].d)?(d+=1.):(d-=1.)) 
+	List_Add(ListOfDouble2_L, &d) ;
+    ;
+    break;}
+case 211:
+#line 1347 "Gmsh.y"
+{
+      ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; 
+      if(!yyvsp[-2].d || (yyvsp[-5].d<yyvsp[0].d && yyvsp[-2].d<0) || (yyvsp[-5].d>yyvsp[0].d && yyvsp[-2].d>0)){
+        vyyerror("Wrong Increment in '%g :[%g] %g'", yyvsp[-5].d, yyvsp[-2].d, yyvsp[0].d) ;
+	List_Add(ListOfDouble2_L, &(yyvsp[-5].d)) ;
+      }
+      else 
+	for(d=yyvsp[-5].d ; (yyvsp[-2].d>0)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; d+=yyvsp[-2].d)
+	  List_Add(ListOfDouble2_L, &d) ;
+   ;
+    break;}
+case 212:
+#line 1361 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-9].d;
+      yyval.v[1]=yyvsp[-7].d;
+      yyval.v[2]=yyvsp[-5].d;
+      yyval.v[3]=yyvsp[-3].d;
+      yyval.v[4]=yyvsp[-1].d;
+    ;
+    break;}
+case 213:
+#line 1369 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-7].d;
+      yyval.v[1]=yyvsp[-5].d;
+      yyval.v[2]=yyvsp[-3].d;
+      yyval.v[3]=yyvsp[-1].d;
+      yyval.v[4]=1.0;
+    ;
+    break;}
+case 214:
+#line 1377 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-5].d;
+      yyval.v[1]=yyvsp[-3].d;
+      yyval.v[2]=yyvsp[-1].d;
+      yyval.v[3]=0.0;
+      yyval.v[4]=1.0;
+    ;
+    break;}
+case 215:
+#line 1385 "Gmsh.y"
+{
+      yyval.v[0]=yyvsp[-5].d;
+      yyval.v[1]=yyvsp[-3].d;
+      yyval.v[2]=yyvsp[-1].d;
+      yyval.v[3]=0.0;
+      yyval.v[4]=1.0;
+    ;
+    break;}
+case 216:
+#line 1396 "Gmsh.y"
+{
+    ;
+    break;}
+case 217:
+#line 1399 "Gmsh.y"
+{
+    ;
+    break;}
+case 218:
+#line 1405 "Gmsh.y"
+{
+    ;
+    break;}
+case 219:
+#line 1408 "Gmsh.y"
+{
+    ;
+    break;}
+case 220:
+#line 1414 "Gmsh.y"
+{
+    ;
+    break;}
+case 221:
+#line 1417 "Gmsh.y"
+{
+       yyval.l=ListOfListOfDouble_L;
+    ;
+    break;}
+case 222:
+#line 1421 "Gmsh.y"
+{
+       yyval.l=ListOfListOfDouble_L;
+    ;
+    break;}
+case 223:
+#line 1428 "Gmsh.y"
+{
+      ListOfListOfDouble_L = List_Create(2,1,sizeof(List_T*)) ;
+      List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ;
+    ;
+    break;}
+case 224:
+#line 1433 "Gmsh.y"
+{
+      List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ;
+    ;
+    break;}
+case 225:
+#line 1440 "Gmsh.y"
+{
+    ;
+    break;}
+case 226:
+#line 1443 "Gmsh.y"
+{
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
+      yyval.l=ListOfDouble_L;
+    ;
+    break;}
+case 227:
+#line 1449 "Gmsh.y"
+{
+      yyval.l=ListOfDouble_L;
+    ;
+    break;}
+case 228:
+#line 1463 "Gmsh.y"
+{
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
+    ;
+    break;}
+case 229:
+#line 1468 "Gmsh.y"
+{ 
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
+	List_Read(ListOfDouble2_L, i, &d) ;
+	List_Add(ListOfDouble_L, &d) ;
+      }
+      List_Delete(ListOfDouble2_L);
+    ;
+    break;}
+case 230:
+#line 1477 "Gmsh.y"
+{
+      List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
+    ;
+    break;}
+case 231:
+#line 1481 "Gmsh.y"
+{
+      for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
+	List_Read(ListOfDouble2_L, i, &d) ;
+	List_Add(ListOfDouble_L, &d) ;
+      }
+      List_Delete(ListOfDouble2_L);
+    ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 543 "/usr/lib/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 1491 "Gmsh.y"
+
+
+void InitSymbols(void){
+  Symbol_L = List_Create(10,1,sizeof(Symbol));
+}
+
+void DeleteSymbols(void){
+  List_Delete(Symbol_L);
+}
+
+int CompareSymbols (const void *a, const void *b){
+  return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name));
+}
+  
+void yyerror(char *s){
+  Msg(PARSER_ERROR, "'%s', line %d : %s (%s)",yyname,yylineno-1,s,yytext);
+  yyerrorstate=1;
+}
+
+void  vyyerror (char *fmt, ...){
+  va_list args;
+  char    tmp[TEXT_BUFFER_SIZE];
+
+  va_start (args, fmt);
+  vsprintf (tmp, fmt, args);
+  va_end (args);
+
+  Msg(PARSER_ERROR, "'%s', line %d : %s", yyname, yylineno-1, tmp);
+  yyerrorstate=1;
+}
+
+int Get_ColorForString(StringX4Int SX4I[], int alpha, 
+		       char * string, int * FlagError) {
+  int  i = 0 ;
+  while ((SX4I[i].string != NULL) && (strcmp(SX4I[i].string, string)))  i++ ;
+  *FlagError = (SX4I[i].string == NULL)? 1 : 0 ;
+  if(alpha > 0)
+    return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,alpha) ;
+  else
+    return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,SX4I[i].int4) ;
+}
+
+void Get_ColorPointerForString(StringXPointer SXP[], char * string,
+			  int * FlagError, unsigned int **Pointer) {
+  int  i = 0 ;
+  while ((SXP[i].string != NULL) && (strcmp(SXP[i].string, string)))  i++ ;
+  *FlagError = (SXP[i].string == NULL)? 1 : 0 ;
+  *Pointer = (unsigned int *)SXP[i].Pointer ;
+}
+
diff --git a/Parser/Gmsh.tab.cpp.h b/Parser/Gmsh.tab.cpp.h
new file mode 100644
index 0000000000000000000000000000000000000000..50f123565a41e0740b22759660fa47a20efafebe
--- /dev/null
+++ b/Parser/Gmsh.tab.cpp.h
@@ -0,0 +1,150 @@
+typedef union {
+  char    *c;
+  int      i;
+  double   d;
+  double   v[5];
+  Shape    s;
+  List_T  *l;
+} YYSTYPE;
+#define	tDOUBLE	257
+#define	tSTRING	258
+#define	tBIGSTR	259
+#define	tEND	260
+#define	tAFFECT	261
+#define	tDOTS	262
+#define	tPi	263
+#define	tExp	264
+#define	tLog	265
+#define	tLog10	266
+#define	tSqrt	267
+#define	tSin	268
+#define	tAsin	269
+#define	tCos	270
+#define	tAcos	271
+#define	tTan	272
+#define	tAtan	273
+#define	tAtan2	274
+#define	tSinh	275
+#define	tCosh	276
+#define	tTanh	277
+#define	tFabs	278
+#define	tFloor	279
+#define	tCeil	280
+#define	tFmod	281
+#define	tModulo	282
+#define	tHypot	283
+#define	tPoint	284
+#define	tCircle	285
+#define	tEllipsis	286
+#define	tLine	287
+#define	tSurface	288
+#define	tSpline	289
+#define	tVolume	290
+#define	tCharacteristic	291
+#define	tLength	292
+#define	tParametric	293
+#define	tElliptic	294
+#define	tPlane	295
+#define	tRuled	296
+#define	tTransfinite	297
+#define	tComplex	298
+#define	tPhysical	299
+#define	tUsing	300
+#define	tPower	301
+#define	tBump	302
+#define	tProgression	303
+#define	tAssociation	304
+#define	tRotate	305
+#define	tTranslate	306
+#define	tSymetry	307
+#define	tDilate	308
+#define	tExtrude	309
+#define	tDuplicata	310
+#define	tLoop	311
+#define	tInclude	312
+#define	tRecombine	313
+#define	tDelete	314
+#define	tCoherence	315
+#define	tView	316
+#define	tOffset	317
+#define	tAttractor	318
+#define	tLayers	319
+#define	tScalarSimplex	320
+#define	tVectorSimplex	321
+#define	tTensorSimplex	322
+#define	tScalarTriangle	323
+#define	tVectorTriangle	324
+#define	tTensorTriangle	325
+#define	tScalarLine	326
+#define	tVectorLine	327
+#define	tTensorLine	328
+#define	tScalarPoint	329
+#define	tVectorPoint	330
+#define	tTensorPoint	331
+#define	tBSpline	332
+#define	tNurbs	333
+#define	tOrder	334
+#define	tWith	335
+#define	tBounds	336
+#define	tKnots	337
+#define	tColor	338
+#define	tGeneral	339
+#define	tGeometry	340
+#define	tMesh	341
+#define	tB_SPLINE_SURFACE_WITH_KNOTS	342
+#define	tB_SPLINE_CURVE_WITH_KNOTS	343
+#define	tCARTESIAN_POINT	344
+#define	tTRUE	345
+#define	tFALSE	346
+#define	tUNSPECIFIED	347
+#define	tU	348
+#define	tV	349
+#define	tEDGE_CURVE	350
+#define	tVERTEX_POINT	351
+#define	tORIENTED_EDGE	352
+#define	tPLANE	353
+#define	tFACE_OUTER_BOUND	354
+#define	tEDGE_LOOP	355
+#define	tADVANCED_FACE	356
+#define	tVECTOR	357
+#define	tDIRECTION	358
+#define	tAXIS2_PLACEMENT_3D	359
+#define	tISO	360
+#define	tENDISO	361
+#define	tENDSEC	362
+#define	tDATA	363
+#define	tHEADER	364
+#define	tFILE_DESCRIPTION	365
+#define	tFILE_SCHEMA	366
+#define	tFILE_NAME	367
+#define	tMANIFOLD_SOLID_BREP	368
+#define	tCLOSED_SHELL	369
+#define	tADVANCED_BREP_SHAPE_REPRESENTATION	370
+#define	tFACE_BOUND	371
+#define	tCYLINDRICAL_SURFACE	372
+#define	tCONICAL_SURFACE	373
+#define	tCIRCLE	374
+#define	tTRIMMED_CURVE	375
+#define	tGEOMETRIC_SET	376
+#define	tCOMPOSITE_CURVE_SEGMENT	377
+#define	tCONTINUOUS	378
+#define	tCOMPOSITE_CURVE	379
+#define	tTOROIDAL_SURFACE	380
+#define	tPRODUCT_DEFINITION	381
+#define	tPRODUCT_DEFINITION_SHAPE	382
+#define	tSHAPE_DEFINITION_REPRESENTATION	383
+#define	tELLIPSE	384
+#define	tTrimmed	385
+#define	tSolid	386
+#define	tEndSolid	387
+#define	tVertex	388
+#define	tFacet	389
+#define	tNormal	390
+#define	tOuter	391
+#define	tLoopSTL	392
+#define	tEndLoop	393
+#define	tEndFacet	394
+#define	UMINUS	395
+
+
+extern YYSTYPE yylval;
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
new file mode 100644
index 0000000000000000000000000000000000000000..236e2dd8c6626e193694d4880e2d32ca7b851e5f
--- /dev/null
+++ b/Parser/Gmsh.y
@@ -0,0 +1,1540 @@
+%{
+#include <stdarg.h>
+
+#include "Gmsh.h"
+#include "Const.h"
+#include "Context.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "DataBase.h"
+#include "Mesh.h"
+#include "Create.h"
+#include "Views.h"
+#include "StepGeomDatabase.h"
+#include "Colors.h"
+#include "Parser.h"
+
+extern Mesh    *THEM;
+extern char     ThePathForIncludes[NAME_STR_L];
+
+FILE           *yyinTab[20];
+int             yylinenoTab[20];
+char            yynameTab[20][256];
+char            tmpstring[256];
+Symbol          TheSymbol;
+Surface        *STL_Surf;
+Shape           TheShape;
+unsigned int    *ptr ;
+int             i,j,k,flag,RecursionLevel=0,Loop[4];
+double          d;
+ExtrudeParams   extr;
+List_T         *Symbol_L;
+List_T         *ListOfDouble_L,*ListOfDouble2_L;
+List_T         *ListOfListOfDouble_L;
+StringXPointer *ColorField ;
+
+void  yyerror (char *s);
+void  vyyerror (char *fmt, ...);
+int   Get_ColorForString(StringX4Int SX4I[], int alpha, 
+			 char * string, int * FlagError);
+void  Get_ColorPointerForString(StringXPointer SXP[], char * string,
+				int * FlagError, unsigned int **Pointer);
+
+%}
+
+%union {
+  char    *c;
+  int      i;
+  double   d;
+  double   v[5];
+  Shape    s;
+  List_T  *l;
+}
+
+%token <d> tDOUBLE
+%token <c> tSTRING tBIGSTR
+
+%token tEND tAFFECT tDOTS tPi
+%token tExp tLog tLog10 tSqrt tSin tAsin tCos tAcos tTan
+%token    tAtan tAtan2 tSinh tCosh tTanh tFabs tFloor tCeil
+%token    tFmod tModulo tHypot
+%token tPoint tCircle tEllipsis tLine tSurface tSpline tVolume
+%token tCharacteristic tLength tParametric tElliptic
+%token tPlane tRuled tTransfinite tComplex tPhysical
+%token tUsing tPower tBump tProgression tAssociation
+%token tRotate tTranslate tSymetry tDilate tExtrude tDuplicata
+%token tLoop tInclude tRecombine tDelete tCoherence
+%token tView tOffset tAttractor tLayers
+%token tScalarSimplex tVectorSimplex tTensorSimplex
+%token tScalarTriangle tVectorTriangle tTensorTriangle
+%token tScalarLine tVectorLine tTensorLine
+%token tScalarPoint tVectorPoint tTensorPoint
+%token tBSpline tNurbs tOrder tWith tBounds tKnots
+%token tColor tGeneral tGeometry tMesh
+
+%token tB_SPLINE_SURFACE_WITH_KNOTS
+%token tB_SPLINE_CURVE_WITH_KNOTS
+%token tCARTESIAN_POINT
+%token tTRUE tFALSE tUNSPECIFIED tU tV tEDGE_CURVE tVERTEX_POINT tORIENTED_EDGE tPLANE
+%token tFACE_OUTER_BOUND tEDGE_LOOP tADVANCED_FACE tVECTOR tDIRECTION tAXIS2_PLACEMENT_3D
+%token tISO tENDISO tENDSEC tDATA tHEADER tFILE_DESCRIPTION tFILE_SCHEMA tFILE_NAME
+%token tMANIFOLD_SOLID_BREP tCLOSED_SHELL tADVANCED_BREP_SHAPE_REPRESENTATION
+%token tFACE_BOUND tCYLINDRICAL_SURFACE tCONICAL_SURFACE tCIRCLE tTRIMMED_CURVE
+%token tGEOMETRIC_SET tCOMPOSITE_CURVE_SEGMENT tCOMPOSITE_CURVE_SEGMENT tCONTINUOUS
+%token tCOMPOSITE_CURVE tTOROIDAL_SURFACE tPRODUCT_DEFINITION tPRODUCT_DEFINITION_SHAPE
+%token tSHAPE_DEFINITION_REPRESENTATION tELLIPSE tTrimmed
+
+%token tSolid tEndSolid tVertex tFacet tNormal tOuter tLoopSTL tEndLoop tEndFacet
+
+%type <d> FExpr  FExpr_Single 
+%type <v> VExpr RGBAExpr
+%type <l> ListOfDouble ListOfShapes Duplicata Transform MultipleShape ListOfListOfDouble
+%type <l> ListOfStrings
+%type <s> Shape
+%type <i> BoolExpr
+
+%left '<' '>'
+%left '+' '-'
+%left '*' '/' '%'
+%left UMINUS
+%right '^'
+
+%%
+
+All : 
+    GeomFormatList
+  | StepFormatItems
+  | STLFormatItem
+;
+
+/*  ----------------------------------------------------------------------
+    S T E R E O L I T H O G R A P H Y  ( S T L )
+    ---------------------------------------------------------------------- */
+
+STLFormatItem : 
+    tSolid
+    {
+      Msg(PARSER_INFO,"STL File Format");
+      STL_Surf = Create_Surface(1,MSH_SURF_STL,1);
+      STL_Surf->STL = new STL_Data;
+      return 1;
+    }
+  | tFacet
+    tNormal tDOUBLE tDOUBLE tDOUBLE
+    tOuter tLoopSTL
+      tVertex tDOUBLE tDOUBLE tDOUBLE
+      tVertex tDOUBLE tDOUBLE tDOUBLE
+      tVertex tDOUBLE tDOUBLE tDOUBLE
+    tEndLoop
+    tEndFacet
+    {
+      STL_Surf->STL->Add_Facet( $9, $10, $11,
+				$13, $14, $15,
+				$17, $18, $19);
+      return 1;
+    }
+  | tEndSolid
+    {
+      Msg(PARSER_INFO,"STL File Format Read");
+      Tree_Add(THEM->Surfaces, &STL_Surf);
+      return 1;
+    }
+;
+
+/*  ----------------------------------------------------------------------
+    S T E P   I S O - 1 0 3 0 3 - 2 1   F I L E   F O R M A T
+    ---------------------------------------------------------------------- */
+
+StepFormatItems :
+    /* nothing */
+  | StepFormatItems StepFormatItem
+;
+
+StepFormatItem :
+    StepSpecial { return 1; }
+  | StepDataItem { return 1; }
+  | StepHeaderItem { return 1; }
+  | error tEND { yyerrok ; return 1; }
+;
+
+StepSpecial :
+    tISO tEND
+    {
+      Msg(PARSER_INFO,"Step Iso-10303-21 File Format");
+      Create_Step_Solid_BRep();
+    }
+  | tENDISO tEND
+    {
+      Msg(PARSER_INFO,"Step Iso-10303-21 File Format Read");
+      Resolve_BREP ();
+    }
+  | tDATA tEND
+  | tENDSEC tEND
+  | tHEADER tEND
+;
+
+StepHeaderItem :
+    tFILE_DESCRIPTION '(' ListOfStrings ',' tBIGSTR ')' tEND
+    {
+    }
+  | tFILE_SCHEMA '(' ListOfStrings ')' tEND
+    {
+    }
+  | tFILE_NAME '(' tBIGSTR ',' tBIGSTR ',' ListOfStrings ',' 
+                    ListOfStrings ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR ')' tEND
+   {
+   }
+;
+
+StepDataItem  :
+    tDOUBLE tAFFECT tCARTESIAN_POINT '(' tBIGSTR ',' VExpr ')' tEND
+    {
+        Add_Cartesian_Point((int)$1,$5,$7[0],$7[1],$7[2]);
+    }
+  | tDOUBLE tAFFECT tB_SPLINE_CURVE_WITH_KNOTS 
+    '(' tBIGSTR ',' FExpr ',' ListOfDouble ',' BoolExpr ',' BoolExpr ',' 
+        BoolExpr ',' ListOfDouble ',' ListOfDouble ',' BoolExpr ')' tEND
+    {
+       Add_BSpline_Curve_With_Knots ((int)$1, $5, (int) $7, $9,	$17, $19, 0., 1.);
+    }
+  | tDOUBLE tAFFECT tB_SPLINE_SURFACE_WITH_KNOTS 
+    '(' tBIGSTR ',' FExpr ',' FExpr ',' ListOfListOfDouble ',' BoolExpr ',' 
+        BoolExpr ',' BoolExpr ',' BoolExpr ',' ListOfDouble ',' ListOfDouble ',' 
+        ListOfDouble ',' ListOfDouble ',' BoolExpr ')' tEND
+    {
+      Add_BSpline_Surface_With_Knots ((int)$1, $5, (int) $7, (int) $9, $11, $21,
+				      $23, $25, $27, 0., 1., 0., 1. );
+    }
+  | tDOUBLE tAFFECT tEDGE_CURVE '(' tBIGSTR ',' tDOUBLE ','  tDOUBLE ',' 
+                                    tDOUBLE ',' BoolExpr ')' tEND
+    {
+      Add_Edge_Curve ((int)$1, $5 , (int)$7 , (int)$9, (int)$11);
+    }
+  | tDOUBLE tAFFECT tFACE_OUTER_BOUND '(' tBIGSTR ',' tDOUBLE ','  BoolExpr  ')' tEND
+    {
+      Add_Face_Outer_Bound((int)$1,$5,(int)$7,$9,1);
+    }
+  | tDOUBLE tAFFECT tFACE_BOUND '(' tBIGSTR ',' tDOUBLE ','  BoolExpr  ')' tEND
+    {
+      /* La je dois voir la norme ! Face_Bound : trou externe a la surface ! */
+      Msg(PARSER_INFO,"Found a Face Bound");
+      Add_Face_Outer_Bound((int)$1,$5,(int)$7,$9,0);
+    }
+  | tDOUBLE tAFFECT tORIENTED_EDGE '(' tBIGSTR ',' '*' ','  '*' ','  FExpr ',' 
+                                       BoolExpr ')' tEND
+    {
+      Add_Oriented_Edge((int)$1,$5,(int)$11,$13);
+    }
+  | tDOUBLE tAFFECT tEDGE_LOOP '(' tBIGSTR ',' ListOfDouble ')' tEND
+    {
+      Add_Edge_Loop((int)$1,$5,$7);
+    }
+  | tDOUBLE tAFFECT tADVANCED_FACE '(' tBIGSTR ',' ListOfDouble ',' 
+                                       tDOUBLE ',' BoolExpr ')' tEND
+    {
+      Add_Advanced_Face((int)$1,$5,$7,(int)$9,$11);
+    }
+  | tDOUBLE tAFFECT tVERTEX_POINT '(' tBIGSTR ',' tDOUBLE ')'  tEND
+    {
+      Add_Vertex_Point((int)$1,$5,(int)$7);
+    }
+  | tDOUBLE tAFFECT tVECTOR '(' tBIGSTR ',' tDOUBLE ',' FExpr ')'  tEND
+    {
+    }
+  | tDOUBLE  tAFFECT tAXIS2_PLACEMENT_3D '(' tBIGSTR ',' tDOUBLE ',' 
+                                             tDOUBLE ',' tDOUBLE ')'  tEND
+    {
+      Add_Axis2_Placement3D  ( (int)$1, (int)$9, (int)$11, (int)$7);
+    }
+  | tDOUBLE tAFFECT tDIRECTION '(' tBIGSTR ',' VExpr ')' tEND
+    {
+      Add_Direction((int)$1 , $5, $7[0], $7[1], $7[2]);
+    }
+  | tDOUBLE tAFFECT tPLANE '(' tBIGSTR ',' tDOUBLE ')' tEND
+    {
+      Add_Plane((int)$1,$5,(int)$7);
+    }
+  | tDOUBLE tAFFECT tLine '(' tBIGSTR ',' tDOUBLE ',' tDOUBLE ')'  tEND
+    {
+      Add_Line ((int)$1, $5 , (int) $7, (int)$9);
+    }
+  | tDOUBLE tAFFECT tCLOSED_SHELL '(' tBIGSTR ',' ListOfDouble ')' tEND
+    {
+      Msg(PARSER_INFO,"Found a Closed shell");
+      Add_Closed_Shell((int)$1, $5 , $7);
+    }
+  | tDOUBLE tAFFECT tADVANCED_BREP_SHAPE_REPRESENTATION
+     '(' tBIGSTR ',' ListOfDouble ',' tDOUBLE')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tMANIFOLD_SOLID_BREP '(' tBIGSTR ',' tDOUBLE ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tCYLINDRICAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ')' tEND
+    {
+      Add_Cylinder ((int)$1, $5 , (int)$7, $9);
+    }
+  | tDOUBLE tAFFECT tCONICAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ','FExpr ')' tEND
+    {
+      Add_Cone ((int)$1, $5 , (int)$7, $9,$11);
+    }
+  | tDOUBLE tAFFECT tTOROIDAL_SURFACE '(' tBIGSTR ',' tDOUBLE ','FExpr ','FExpr ')' tEND
+    {
+      Add_Torus ((int)$1, $5 , (int)$7, $9,$11);
+    }
+  | tDOUBLE tAFFECT tCIRCLE '(' tBIGSTR ',' tDOUBLE ','FExpr ')' tEND
+    {
+      Add_Circle((int) $1, $5, (int) $7, $9);
+    }
+  | tDOUBLE tAFFECT tELLIPSE '(' tBIGSTR ',' tDOUBLE ','FExpr ',' FExpr ')' tEND
+    {
+      Add_Ellipsis((int) $1, $5, (int) $7, $9, $11);
+    }
+  | tDOUBLE tAFFECT tTRIMMED_CURVE '(' tBIGSTR ',' tDOUBLE ','
+            ListOfDouble ',' ListOfDouble ',' BoolExpr ',' BoolExpr ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tGEOMETRIC_SET '(' tBIGSTR ',' ListOfDouble')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tCOMPOSITE_CURVE_SEGMENT 
+       '(' tCONTINUOUS ',' BoolExpr ',' tDOUBLE ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tCOMPOSITE_CURVE '(' tBIGSTR ',' ListOfDouble ',' BoolExpr ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tPRODUCT_DEFINITION 
+       '(' tBIGSTR ',' tBIGSTR ',' tDOUBLE',' tDOUBLE ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tPRODUCT_DEFINITION_SHAPE '(' tBIGSTR ',' tBIGSTR ',' tDOUBLE ')' tEND
+    {
+    }
+  | tDOUBLE tAFFECT tSHAPE_DEFINITION_REPRESENTATION '(' tDOUBLE ',' tDOUBLE ')' tEND
+    {
+    }
+;
+
+/*  ----------------------------------------------------------------------
+    G E O   F I L E   F O R M A T
+    ---------------------------------------------------------------------- */
+
+GeomFormatList : 
+    /* none*/
+  | GeomFormatList GeomFormat
+    {
+      Msg(PARSER_INFO,"Gmsh File Format Read");
+    }
+;
+
+GeomFormat :
+    View        { return 1; }
+  | Affectation { return 1; }
+  | Shape       { return 1; }
+  | Transform   { return 1; }
+  | Duplicata   { return 1; }
+  | Delete      { return 1; }
+  | Extrude     { return 1; }
+  | Transfini   { return 1; }
+  | Coherence   { return 1; }
+  | Macro       { return 1; }
+  | Colors      { return 1; }
+  | error tEND  { yyerrok; return 1;}
+;
+
+/* ------------
+   V I E W 
+   ------------ */
+
+View :
+    tView tBIGSTR '{' Views '}' tEND
+    { 
+      EndView($2,0.,0.,0.); 
+    }
+  | tView tBIGSTR tOffset VExpr '{' Views '}' tEND
+    {
+      EndView($2,$4[0],$4[1],$4[2]);
+    }  
+;
+
+Views :
+    /* none */
+    {
+      BeginView(1); 
+    }
+  | Views ScalarSimplex
+  | Views VectorSimplex
+  | Views TensorSimplex
+  | Views ScalarTriangle
+  | Views VectorTriangle
+  | Views TensorTriangle
+  | Views ScalarLine
+  | Views VectorLine
+  | Views TensorLine
+  | Views ScalarPoint
+  | Views VectorPoint
+  | Views TensorPoint
+;
+		
+ScalarSimplex : 
+    tScalarSimplex '(' FExpr ',' FExpr ',' FExpr ',' 
+		       FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ',' 
+		       FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_ScalarSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27);
+    }
+;
+
+VectorSimplex : 
+    tVectorSimplex '(' FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_VectorSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27);
+    }
+;
+
+TensorSimplex :
+    tTensorSimplex '(' FExpr ',' FExpr ',' FExpr ',' 
+		       FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ','
+		       FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_TensorSimplex($3,$5,$7,$9,$11,$13,$15,$17,$19,$21,$23,$25,$27);
+    }  
+;
+
+ScalarTriangle :
+    tScalarTriangle '(' FExpr ',' FExpr ',' FExpr ','
+			FExpr ',' FExpr ',' FExpr ',' 
+			FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_ScalarTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21);
+    }
+;
+
+VectorTriangle :
+    tVectorTriangle '(' FExpr ',' FExpr ',' FExpr ','
+			FExpr ',' FExpr ',' FExpr ',' 
+			FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_VectorTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21);
+    }  
+;
+
+TensorTriangle :
+    tTensorTriangle '(' FExpr ',' FExpr ',' FExpr ','
+			FExpr ',' FExpr ',' FExpr ','
+			FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_TensorTriangle($3,$5,$7,$9,$11,$13,$15,$17,$19,$21);
+    }
+;
+
+ScalarLine :
+    tScalarLine '(' FExpr ',' FExpr ',' FExpr ','
+		    FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_ScalarLine($3,$5,$7,$9,$11,$13,$15);
+    }  
+;
+
+VectorLine :
+    tVectorLine '(' FExpr ',' FExpr ',' FExpr ','
+		    FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_VectorLine($3,$5,$7,$9,$11,$13,$15);
+    }
+;
+
+TensorLine : 
+    tTensorLine '(' FExpr ',' FExpr ',' FExpr ','
+		    FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_TensorLine($3,$5,$7,$9,$11,$13,$15);
+    }
+;
+
+ScalarPoint : 
+    tScalarPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_ScalarPoint($3,$5,$7,$9);
+    }  
+;
+
+VectorPoint : 
+    tVectorPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_VectorPoint($3,$5,$7,$9);
+    }  
+;
+
+TensorPoint : 
+    tTensorPoint '(' FExpr ',' FExpr ',' FExpr ')' ListOfDouble tEND
+    {
+      AddView_TensorPoint($3,$5,$7,$9);
+    }  
+;
+
+/* -----------------------
+    A F F E C T A T I O N
+   ----------------------- */
+
+Affectation :
+    tSTRING tAFFECT FExpr tEND
+    {
+      TheSymbol.Name = $1;
+      TheSymbol.val  = $3;
+      List_Replace(Symbol_L,&TheSymbol,CompareSymbols);
+    }
+;
+
+
+/* -----------
+    S H A P E
+   ----------- */
+
+Shape :
+
+  /* -------- Points -------- */ 
+
+    tPoint '(' FExpr ')' tAFFECT VExpr tEND
+    {
+      Cdbpts101((int)$3,$6[0],$6[1],$6[2],$6[3],$6[4]);
+      $$.Type = MSH_POINT;
+      $$.Num  = (int)$3;
+    }
+
+  | tPhysical tPoint '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_PHYSICAL_POINT,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_PHYSICAL_POINT;
+      $$.Num  = (int)$4;
+    }
+  | tAttractor tPoint '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Vertex *v;
+      Attractor *a;
+      double p;
+      int ip;
+      for(int i=0;i<List_Nbr($11);i++){
+      	List_Read($11,i,&p);
+        ip = (int)p;
+        v = FindVertex(ip,THEM);
+        if(!v)
+	  vyyerror("Unkown Point %d", ip);
+	else{
+	  a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
+			       $4,$6,$8,v,NULL,NULL);
+	  List_Add(THEM->Metric->Attractors,&a);
+        }
+      }
+    }
+  | tCharacteristic tLength ListOfDouble tAFFECT FExpr tEND
+    {
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	Vertex *v = FindVertex((int)d,THEM);
+	if(!v)
+	  vyyerror("Unkown Point %d", (int)d);
+	else
+	  v->lc = $5;
+      }
+    }  
+  | tPoint '(' FExpr ')' tEND
+    {
+      $$.Type = MSH_POINT;
+      $$.Num  = (int)$3;
+    }
+
+  /* -------- Lines -------- */ 
+
+  | tLine '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_LINE,1,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      $$.Type = MSH_SEGM_LINE;
+      $$.Num  = (int)$3;
+    }
+  | tSpline '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_SPLN,3,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      $$.Type = MSH_SEGM_SPLN;
+      $$.Num  = (int)$3;
+    }
+  | tAttractor tLine '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Curve *c;
+      Attractor *a;
+      double p;
+      int ip;
+      for(int i=0;i<List_Nbr($11);i++){
+      	List_Read($11,i,&p);
+        ip = (int)p;
+        c = FindCurve(ip,THEM);
+        if(!c)
+	  vyyerror("Unkown Curve %d", ip);
+	else{
+	  a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
+			       $4,$6,$8,NULL,c,NULL);
+	  List_Add(THEM->Metric->Attractors,&a);
+        }
+      }
+    }
+  | tCircle '(' FExpr ')'  tAFFECT ListOfDouble tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_CIRC,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      $$.Type = MSH_SEGM_CIRC ;
+      $$.Num  = (int)$3;
+    }
+  | tCircle '(' FExpr ')'  tAFFECT ListOfDouble tPlane VExpr tEND
+    {
+      List_T *temp;
+      int i,j;
+      double d;
+      temp = List_Create(List_Nbr($6),1,sizeof(int));
+      for(i=0;i<List_Nbr($6);i++){
+      	List_Read($6,i,&d);
+        j = (int)d;
+        List_Add(temp,&j);
+      }
+      AddCircleInDataBase ((int) $3, MSH_SEGM_CIRC, temp, $8);
+      List_Delete(temp);
+      $$.Type = MSH_SEGM_CIRC ;
+      $$.Num  = (int)$3;
+    }
+  | tParametric '(' FExpr ')' tAFFECT 
+      '(' FExpr ',' FExpr ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR ')' tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,$7,$9,$11,$13,$15);
+      $$.Type = MSH_SEGM_PARAMETRIC ;
+      $$.Num  = (int)$3;
+    }
+  | tEllipsis '(' FExpr ')'  tAFFECT ListOfDouble tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_ELLI,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      $$.Type = MSH_SEGM_ELLI ;
+      $$.Num  = (int)$3;
+    }
+  | tPhysical tLine '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_PHYSICAL_LINE,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_PHYSICAL_LINE;
+      $$.Num  = (int)$4;
+    }
+  | tLine tLoop '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      $$.Type = MSH_SEGM_LOOP;
+      Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL);
+      $$.Num = (int)$4;
+    }
+  | tLine '(' FExpr ')' tEND
+    {
+      $$.Num = (int)$3;
+      Curve *c = FindCurve($$.Num,THEM);
+      if(!c)
+	vyyerror("Unkown Curve %d", $$.Num);
+      else
+	$$.Type = c->Typ;
+    }
+  | tBSpline '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbseg101((int)$3,MSH_SEGM_BSPLN,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
+      $$.Type = MSH_SEGM_BSPLN;
+      $$.Num  = (int)$3;
+    }
+  | tNurbs  '(' FExpr ')' tAFFECT ListOfDouble tKnots ListOfDouble tOrder FExpr tEND
+    {
+      List_T *Temp;
+      int i;
+      double d;
+      if(List_Nbr($6) + (int)$10 + 1 != List_Nbr($8)){
+	yyerror("wrong nurbs curve definition (deg + 1 + nbpts != nbknots)");
+      }
+      Temp = List_Create(List_Nbr($6),1,sizeof(int));
+      for(i=0;i<List_Nbr($6);i++) {
+      	List_Read($6,i,&d);
+        j = (int)d;
+        List_Add(Temp,&j);
+      }
+      AddCurveInDataBase ((int)$3,MSH_SEGM_NURBS,(int)$10,Temp,$8,-1,-1,0.,1.);
+      List_Delete(Temp);
+    }
+
+  /* -------- Surfaces -------- */ 
+
+  | tPlane tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_SURF_PLAN,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_SURF_PLAN;
+      $$.Num  = (int)$4;
+    }
+  | tTrimmed tSurface '(' FExpr ')' tAFFECT FExpr ListOfDouble tEND
+    {
+      Surface *s,*support;
+      support = FindSurface((int)$7,THEM);
+      if(!support)
+	vyyerror("Unkown Surface %d", (int)$7);
+      else{
+	Cdbz101((int)$4,MSH_SURF_PLAN,0,0,0,0,0,NULL,$8,NULL);
+	s = FindSurface((int)$4,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", (int)$4);
+	else{
+	  s->Typ =  MSH_SURF_TRIMMED;
+	  s->Support = support;
+	  $$.Type = MSH_SURF_TRIMMED;
+	  $$.Num  = (int)$4;
+	}
+      }
+    }
+  | tRuled tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      List_Read($7,0,&d);
+      i = (int)d;
+      EdgeLoop *el = FindEdgeLoop(i,THEM);
+      if(!el)
+	vyyerror("Unkown Loop %d", i);
+      else{
+	j = List_Nbr(el->Curves);
+	if(j==4)
+	  $$.Type = MSH_SURF_REGL;
+	else if(j==3)
+	  $$.Type  = MSH_SURF_TRIC;
+	else
+	  vyyerror("Ruled surface %d has not 3 or 4 borders", $4);
+	Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL);
+	$$.Num = (int)$4;
+      }
+    }
+  | tNurbs tSurface tWith tBounds '(' FExpr ')' tAFFECT 
+    ListOfListOfDouble tKnots  '{' ListOfDouble ',' ListOfDouble '}'
+    tOrder '{' FExpr ',' FExpr '}' tEND
+    {
+      CreateNurbsSurface ( (int) $6 , (int)$18 , (int)$20  , $9, $12, $14);
+      $$.Type  = MSH_SURF_NURBS;
+      $$.Num = (int)$6;
+    }
+  | tNurbs  tSurface '(' FExpr ')' tAFFECT 
+    ListOfListOfDouble tKnots  '{' ListOfDouble ',' ListOfDouble '}'
+    tOrder '{' FExpr ',' FExpr '}' tEND
+    {
+      CreateNurbsSurfaceSupport ((int)$4, (int) $16 , (int) $18 , $7, $10, $12);
+    }
+  | tPhysical tSurface '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_PHYSICAL_SURFACE,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_PHYSICAL_SURFACE;
+      $$.Num  = (int)$4;
+    }
+  | tSurface tLoop '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_SURF_LOOP,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_SURF_LOOP;
+      $$.Num  = (int)$4;
+    }
+  | tSurface '(' FExpr ')' tEND
+    {
+      $$.Num = (int)$3;
+      Surface *s = FindSurface($$.Num,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", $$.Num);
+      else
+	$$.Type = s->Typ;
+     }
+
+  /* -------- Volumes -------- */ 
+
+  | tComplex tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_VOLUME,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_VOLUME;
+      $$.Num  = (int)$4;      
+    }
+  | tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$3,MSH_VOLUME,0,0,0,0,0,NULL,$6,NULL);
+      $$.Type = MSH_VOLUME;
+      $$.Num  = (int)$3;
+    }
+  | tPhysical tVolume '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Cdbz101((int)$4,MSH_PHYSICAL_VOLUME,0,0,0,0,0,NULL,$7,NULL);
+      $$.Type = MSH_PHYSICAL_VOLUME;
+      $$.Num  = (int)$4;
+    }
+;
+
+/* -------------------
+    T R A N S F O R M
+   ------------------- */
+
+Transform :
+    tTranslate '(' VExpr ')' '{' MultipleShape '}'
+    {
+      TranslateShapes ($3[0],$3[1],$3[2],$6,1);
+      $$ = $6;
+    }
+  | tRotate '(' VExpr ',' VExpr ',' FExpr ')' '{' MultipleShape '}'
+    {
+      RotateShapes($3[0],$3[1],$3[2],$5[0],$5[1],$5[2],$7,$10);
+      $$ = $10;
+    }
+  | tSymetry '(' VExpr ')'  '{' MultipleShape '}'
+    {
+      SymetryShapes($3[0],$3[1],$3[2],$3[3],$6,1);
+      $$ = $6;
+    }
+  | tDilate '(' VExpr ',' FExpr ')'  '{' MultipleShape '}'
+    {
+      DilatShapes($3[0],$3[1],$3[2],$5,$8,1);
+      $$ = $8;
+    }
+;
+
+MultipleShape : 
+    Duplicata     { $$ = $1; }
+  | ListOfShapes  { $$ = $1; }
+  | Transform     { $$ = $1; }
+;
+
+ListOfShapes : 
+    /* none */
+    {
+      $$ = List_Create(3,3,sizeof(Shape));
+    }   
+  | ListOfShapes Shape
+    {
+      List_Add($$,&$2);
+      $$ = $1;
+    }
+;
+
+/* -------------------
+    D U P L I C A T A
+   ------------------- */
+
+Duplicata :
+    tDuplicata '{' ListOfShapes '}'
+    {
+      $$ = List_Create(3,3,sizeof(Shape));
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read ($3,i,&TheShape);
+	CopyShape(TheShape.Type,TheShape.Num,&j);
+	TheShape.Num = j;
+	List_Add($$,&TheShape);
+      }
+    }
+;
+
+
+/* -------------
+    D E L E T E 
+   ------------- */
+
+Delete :
+    tDelete '{' ListOfShapes '}'
+    {
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read ($3,i,&TheShape);
+	DeleteShape(TheShape.Type,TheShape.Num);
+      }
+    }
+;
+
+
+/* -----------
+    M A C R O
+   ----------- */
+
+Macro : 
+    tInclude tBIGSTR tEND
+    {
+      yyinTab[RecursionLevel++] = yyin;
+      strcpy(tmpstring, ThePathForIncludes);
+      if((yyin = fopen(strcat(tmpstring,$2),"r"))){
+	strcpy(yynameTab[RecursionLevel-1],yyname);
+	yylinenoTab[RecursionLevel-1]=yylineno;
+	yylineno=1;
+	strcpy(yyname,$2);
+	while(!feof(yyin)){
+	  yyparse();
+	}
+	fclose(yyin);
+	yyin = yyinTab[--RecursionLevel];
+	strcpy(yyname,yynameTab[RecursionLevel]);
+	yylineno = yylinenoTab[RecursionLevel];
+      }
+      else{
+	vyyerror("Unknown file: %s", $2) ;  
+	yyin = yyinTab[--RecursionLevel];
+      }
+    }
+
+;
+
+
+/* ---------------
+    E X T R U D E 
+   --------------- */
+
+Extrude :
+    tExtrude '(' FExpr ',' VExpr ')' tEND
+    {
+      Extrude_ProtudeSurface(1,(int)$3,$5[0],$5[1],$5[2],0.,0.,0.,0.,0,NULL);
+    }
+  | tExtrude tSurface '(' FExpr ',' VExpr ')' tEND
+    {
+      Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,0,NULL);
+    }
+  | tExtrude '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
+    {
+      Extrude_ProtudeSurface(0,(int)$3,$5[0],$5[1],$5[2],$7[0],$7[1],$7[2],$9,0,NULL);
+    }
+  | tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
+    {
+      Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,0,NULL);
+    }
+  | tExtrude tPoint '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
+    {
+      Curve *pc, *prc;
+      Extrude_ProtudePoint(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,
+			   &pc,&prc,NULL);
+    }
+  | tExtrude tPoint '(' FExpr ',' VExpr ')' tEND
+    {
+      Curve *pc, *prc;
+      Extrude_ProtudePoint(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,&pc,&prc,NULL);
+    }
+  | tExtrude tLine'(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
+    {
+      Extrude_ProtudeCurve(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,NULL);
+    }
+  | tExtrude tLine'(' FExpr ',' VExpr ')' tEND
+    {
+      Extrude_ProtudeCurve(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,NULL);
+    }
+  | tExtrude tSurface '(' FExpr ',' VExpr ')' '{' ExtrudeParameters '}' tEND
+  {
+    int vol = NEWREG();
+    Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,vol,&extr);
+  }
+  | tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' 
+     '{' ExtrudeParameters '}'tEND
+  {
+    int vol = NEWREG();
+    Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,vol,&extr);
+  }
+;
+
+ExtrudeParameters :
+    ExtrudeParameter
+    {
+    }
+  | ExtrudeParameters ExtrudeParameter
+    {
+    }
+;
+
+ExtrudeParameter :
+    tLayers '{' ListOfDouble ',' ListOfDouble ',' ListOfDouble '}' tEND
+    {
+      double d;
+      int j;
+      extr.mesh.NbLayer = List_Nbr($3);
+      extr.mesh.ExtrudeMesh = true;
+      for(int i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)d;
+	extr.mesh.NbElmLayer[i] = j;
+	List_Read($5,i,&d);
+	j = (int)d;
+	extr.mesh.ZonLayer[i] = j;
+	List_Read($7,i,&d);
+	extr.mesh.hLayer[i] = d;
+      }
+    }
+;
+
+/* -------------------
+    T R A N S F I N I
+   ------------------- */
+
+Transfini : 
+    tTransfinite tLine ListOfDouble tAFFECT FExpr tEND
+    {
+      Curve *c;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)$5;
+	  c->ipar[1] = sign(d);
+	  c->dpar[0] = 1.0;
+	}
+      }
+    }
+  | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tPower FExpr tEND
+    {
+      Curve *c;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)$5;
+	  c->ipar[1] = sign(d); /* Power : code 1 ou -1 */
+	  c->dpar[0] = $8;
+	}
+      }
+    }
+  | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tBump FExpr tEND
+    {
+      Curve *c;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)$5;
+	  c->ipar[1] = 2*sign(d); /* Bump : code 2 ou -2 */
+	  c->dpar[0] = $8;
+	}
+      }
+    }
+  | tTransfinite tLine ListOfDouble tAFFECT FExpr tUsing tProgression FExpr tEND
+    {
+      Curve *c;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)fabs(d);
+        c = FindCurve(j,THEM);
+	if(!c)
+	  vyyerror("Unkown Curve %d", j);
+	else{
+	  c->Method = TRANSFINI;
+	  c->ipar[0] = (int)$5;
+	  c->ipar[1] = 3*sign(d); /* Progresion : code 3 ou -3 */
+	  c->dpar[0] = $8;
+	}
+      }
+    }
+  | tTransfinite tSurface '{' FExpr '}' tAFFECT ListOfDouble tEND
+    {
+      Surface *s = FindSurface((int)$4,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", (int)$4);
+      else{
+	s->Method = TRANSFINI;
+	k = List_Nbr($7);
+	if(k!=3 && k!=4){
+	  vyyerror("Bad Number of Points for Transfinite Surface %d", $4) ;
+	}
+	else{
+	  for(i=0;i<k;i++){
+	    List_Read($7,i,&d);
+	    j = (int)fabs(d);
+	    s->ipar[i] = j;
+	  }
+	}
+      }
+    }
+  | tElliptic tSurface '{' FExpr '}' tAFFECT ListOfDouble tEND
+    {
+      Surface *s = FindSurface((int)$4,THEM);
+      if(!s)
+	vyyerror("Unkown Surface %d", (int)$4);
+      else{
+        s->Method = ELLIPTIC;
+        k = List_Nbr($7);
+        if(k != 4)
+          vyyerror("Bad Number of Points for Elliptic Surface %d", $4) ;
+        else{
+	  for(i=0;i<k;i++){
+	    List_Read($7,i,&d);
+	    j = (int)fabs(d);
+	    s->ipar[i] = j;
+	  }
+	}
+      }
+    }
+  | tTransfinite tVolume '{' FExpr '}' tAFFECT ListOfDouble tEND
+    {
+      Volume *v = FindVolume((int)$4,THEM);
+      if(!v)
+	vyyerror("Unkown Volume %d", (int)$4);
+      else{
+	v->Method = TRANSFINI;
+	k = List_Nbr($7);
+	if(k!=6 && k!=8)
+	  vyyerror("Bad Number of Points for Transfinite Volume %d", $4) ;
+	else{
+	  for(i=0;i<k;i++){
+	    List_Read($7,i,&d);
+	    j = (int)fabs(d);
+	    v->ipar[i] = j;
+	  }
+	}
+      }
+    }
+  | tRecombine tSurface ListOfDouble tAFFECT FExpr tEND
+    {
+      Surface *s;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)d;
+	s = FindSurface(j,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", j);
+	else{
+	  s->Recombine = 1;
+	  s->RecombineAngle = $5;
+	}
+      }
+    }
+  | tRecombine tSurface ListOfDouble tEND
+    {
+      Surface *s;
+      for(i=0;i<List_Nbr($3);i++){
+	List_Read($3,i,&d);
+	j = (int)d;
+        s = FindSurface(j,THEM);
+	if(!s)
+	  vyyerror("Unkown Surface %d", j);
+	else{
+	  s->Recombine = 1;
+	  s->RecombineAngle = 30.;
+        }
+      }
+    }  
+  | tPhysical tAssociation '(' FExpr ')' tAFFECT ListOfDouble tEND
+    {
+      Msg(PARSER_ERROR, "Physical Associations do not exist anymore!");
+    }  
+;
+
+
+/* -------------------
+    C O H E R E N C E
+   ------------------- */
+
+Coherence : 
+    tCoherence tEND
+    { 
+      Coherence_PS();
+    }
+;
+
+/* -------------
+    C O L O R S 
+   ------------- */
+
+Colors :
+    tColor '{' ColorSections '}'
+;
+
+ColorSections :
+  /* empty */
+  | ColorSections ColorSection
+;
+
+ColorSection : 
+    tGeneral 
+    { ColorField = ColorGeneral; }
+    '{' ColorAffects '}'
+  | tGeometry 
+    { ColorField = ColorGeometry; }
+    '{' ColorAffects '}'
+  | tMesh
+    { ColorField = ColorMesh; }
+    '{' ColorAffects '}'
+;
+
+ColorAffects :
+  /* empty */
+  | ColorAffect ColorAffects
+;
+
+ColorAffect : 
+    tSTRING tAFFECT tSTRING tEND
+    {
+      i = Get_ColorForString(ColorString, -1, $3, &flag);
+      if(flag) vyyerror("Unknown Color: %s", $3);
+      Get_ColorPointerForString(ColorField, $1, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", $1);
+      else
+	*ptr = i ;
+    }
+  | tSTRING tAFFECT '{' tSTRING ',' FExpr '}' tEND
+    {
+      i = Get_ColorForString(ColorString, (int)$6, $4, &flag);
+      if(flag) vyyerror("Unknown Color: %s", $4);
+      Get_ColorPointerForString(ColorField, $1, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", $1);
+      else
+	*ptr = i ;
+    }
+  | tSTRING tAFFECT RGBAExpr tEND
+    {
+      Get_ColorPointerForString(ColorField, $1, &flag, &ptr);
+      if(flag)
+	vyyerror("Unknown Color Field: %s", $3);
+      else
+	*ptr = PACK_COLOR((int)$3[0], (int)$3[1], (int)$3[2], (int)$3[3]);
+    }
+;
+
+RGBAExpr :
+    '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=$8;
+    }
+  | '{' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=255.;
+    }
+;
+
+/*
+Context{
+  
+  General{
+    Axes = 1 ;
+    SmallAxes = 1 ;
+    Orthographic = 1 ;
+    FastDraw = 1 ;
+    DisplayLists = 0 ; 
+    Font = "fixed";
+    ColorBarFont = "fixed";
+    Light0 = {0,0,0};
+    Shininess = 0;
+    Alpha = 0;
+    PrintFormat = EPS;
+  }
+
+  Geometry{
+    Points = 1 ;
+    Lines = 1 ;
+    Surfaces = 1 ;
+    Volumes = 1 ;
+    PointNumbers = 1 ;
+    LineNumbers = 1 ;
+    SurfaceNumbers = 1 ;
+    VolumeNumbers = 1 ;
+    Normals = 0.0 ;
+    Tangents = 0.0 ;
+    HiddenLines = 0 ;
+    Shading = 0 ;
+  }
+
+  Mesh{
+    Draw = 0 ;
+    Points = 1 ;
+    Lines = 1 ;
+    Surfaces = 1 ;
+    Volumes = 1 ;
+    PointNumbers = 1 ;
+    LineNumbers = 1 ;
+    SurfaceNumbers = 1 ;
+    VolumeNumbers = 1 ;
+    Normals = 0.0 ;
+    Tangents = 0.0 ;
+    HiddenLines = 0 ;
+    Shading = 0 ;
+    Format = MSH ;
+    Smoothing = 0 ;
+    Algorithm = 1 ;
+    Degree = 1 ;
+    Explode = 100 ;
+  }
+
+  Post{
+    Draw = 1 ;
+    Scales = 1 ;
+    LinkMode = 0 ;
+  }
+
+}
+*/
+
+/* ---------------
+    G E N E R A L
+    --------------- */
+
+
+BoolExpr :
+    tTRUE {$$ = 1;}
+  | tFALSE {$$ = 0;}
+  | tUNSPECIFIED {$$ = -1;}
+  | tU {$$ = -1;}
+  | tV {$$ = -1;}
+  ;
+
+FExpr :
+    FExpr_Single             { $$ = $1; }
+  | '(' FExpr ')'            { $$ = $2; }
+  | FExpr '-' FExpr          { $$ = $1 - $3; }
+  | FExpr '+' FExpr          { $$ = $1 + $3; }
+  | FExpr '*' FExpr          { $$ = $1 * $3; }
+  | FExpr '/' FExpr          { $$ = $1 / $3; }
+  | FExpr '^' FExpr          { $$ = pow($1, $3); }
+  | '-' FExpr %prec UMINUS   { $$ = - $2; }
+  | '+' FExpr %prec UMINUS   { $$ = $2; }
+  | tExp    '(' FExpr ')'            { $$ = exp($3);      }
+  | tLog    '(' FExpr ')'            { $$ = log($3);      }
+  | tLog10  '(' FExpr ')'            { $$ = log10($3);    }
+  | tSqrt   '(' FExpr ')'            { $$ = sqrt($3);     }
+  | tSin    '(' FExpr ')'            { $$ = sin($3);      }
+  | tAsin   '(' FExpr ')'            { $$ = asin($3);     }
+  | tCos    '(' FExpr ')'            { $$ = cos($3);      }
+  | tAcos   '(' FExpr ')'            { $$ = acos($3);     }
+  | tTan    '(' FExpr ')'            { $$ = tan($3);      }
+  | tAtan   '(' FExpr ')'            { $$ = atan($3);     }
+  | tAtan2  '(' FExpr ',' FExpr ')'  { $$ = atan2($3,$5); }
+  | tSinh   '(' FExpr ')'            { $$ = sinh($3);     }
+  | tCosh   '(' FExpr ')'            { $$ = cosh($3);     }
+  | tTanh   '(' FExpr ')'            { $$ = tanh($3);     }
+  | tFabs   '(' FExpr ')'            { $$ = fabs($3);     }
+  | tFloor  '(' FExpr ')'            { $$ = floor($3);    }
+  | tCeil   '(' FExpr ')'            { $$ = ceil($3);     }
+  | tFmod   '(' FExpr ',' FExpr ')'  { $$ = fmod($3,$5);  }
+  | tModulo '(' FExpr ',' FExpr ')'  { $$ = fmod($3,$5);  }
+  | tHypot  '(' FExpr ',' FExpr ')'  { $$ = sqrt($3*$3+$5*$5);  }
+;
+
+FExpr_Single :
+    tDOUBLE   { $$ = $1; }
+  | tPi       { $$ = 3.141592653589793; }
+  | tSTRING
+    {
+      TheSymbol.Name = $1 ;
+      if (!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) {
+	vyyerror("Unknown variable: %s", $1) ;  $$ = 0. ;
+      }
+      else  $$ = TheSymbol.val ;
+      Free($1);
+    }
+;
+
+FExpr_Range :
+    FExpr tDOTS FExpr
+    { 
+      ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; 
+      for(d=$1 ; ($1<$3)?(d<=$3):(d>=$3) ; ($1<$3)?(d+=1.):(d-=1.)) 
+	List_Add(ListOfDouble2_L, &d) ;
+    }
+  | FExpr tDOTS '[' FExpr ']' FExpr
+   {
+      ListOfDouble2_L = List_Create(2,1,sizeof(double)) ; 
+      if(!$4 || ($1<$6 && $4<0) || ($1>$6 && $4>0)){
+        vyyerror("Wrong Increment in '%g :[%g] %g'", $1, $4, $6) ;
+	List_Add(ListOfDouble2_L, &($1)) ;
+      }
+      else 
+	for(d=$1 ; ($4>0)?(d<=$6):(d>=$6) ; d+=$4)
+	  List_Add(ListOfDouble2_L, &d) ;
+   }
+  ;
+
+VExpr :
+    '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr  '}'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=$8;
+      $$[4]=$10;
+    }
+  | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=$8;
+      $$[4]=1.0;
+    }
+  | '{' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=0.0;
+      $$[4]=1.0;
+    }
+  | '(' FExpr ',' FExpr ',' FExpr ')'
+    {
+      $$[0]=$2;
+      $$[1]=$4;
+      $$[2]=$6;
+      $$[3]=0.0;
+      $$[4]=1.0;
+    }
+;
+
+ListOfStrings :
+    /* none */
+    {
+    }
+  | '(' RecursiveListOfStrings ')'
+    {
+    }
+;
+
+RecursiveListOfStrings :
+    tBIGSTR
+    {
+    }
+  | RecursiveListOfStrings ',' tBIGSTR
+    {
+    }
+;
+
+ListOfListOfDouble :
+    /* none */
+    {
+    }
+  | '{' RecursiveListOfListOfDouble '}'
+    {
+       $$=ListOfListOfDouble_L;
+    }
+  | '(' RecursiveListOfListOfDouble ')'
+    {
+       $$=ListOfListOfDouble_L;
+    }
+;
+
+RecursiveListOfListOfDouble :
+    ListOfDouble
+    {
+      ListOfListOfDouble_L = List_Create(2,1,sizeof(List_T*)) ;
+      List_Add(ListOfListOfDouble_L, &($1)) ;
+    }
+  | RecursiveListOfListOfDouble ',' ListOfDouble
+    {
+      List_Add(ListOfListOfDouble_L, &($3)) ;
+    }
+;
+
+ListOfDouble :
+    /* none */
+    {
+    }
+  | FExpr
+    {
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      List_Add(ListOfDouble_L, &($1)) ;
+      $$=ListOfDouble_L;
+    }
+  | '{' RecursiveListOfDouble '}'
+    {
+      $$=ListOfDouble_L;
+    }
+/*
+  | '(' RecursiveListOfDouble ')'
+    {
+      $$=ListOfDouble_L;
+    }
+*/
+;
+
+
+RecursiveListOfDouble :
+    FExpr
+    {
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      List_Add(ListOfDouble_L, &($1)) ;
+    }
+  | FExpr_Range
+    { 
+      ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
+      for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
+	List_Read(ListOfDouble2_L, i, &d) ;
+	List_Add(ListOfDouble_L, &d) ;
+      }
+      List_Delete(ListOfDouble2_L);
+    }
+  | RecursiveListOfDouble ',' FExpr
+    {
+      List_Add(ListOfDouble_L, &($3)) ;
+    }
+  | RecursiveListOfDouble ',' FExpr_Range
+    {
+      for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
+	List_Read(ListOfDouble2_L, i, &d) ;
+	List_Add(ListOfDouble_L, &d) ;
+      }
+      List_Delete(ListOfDouble2_L);
+    }
+;
+
+
+%%
+
+void InitSymbols(void){
+  Symbol_L = List_Create(10,1,sizeof(Symbol));
+}
+
+void DeleteSymbols(void){
+  List_Delete(Symbol_L);
+}
+
+int CompareSymbols (const void *a, const void *b){
+  return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name));
+}
+  
+void yyerror(char *s){
+  Msg(PARSER_ERROR, "'%s', line %d : %s (%s)",yyname,yylineno-1,s,yytext);
+  yyerrorstate=1;
+}
+
+void  vyyerror (char *fmt, ...){
+  va_list args;
+  char    tmp[TEXT_BUFFER_SIZE];
+
+  va_start (args, fmt);
+  vsprintf (tmp, fmt, args);
+  va_end (args);
+
+  Msg(PARSER_ERROR, "'%s', line %d : %s", yyname, yylineno-1, tmp);
+  yyerrorstate=1;
+}
+
+int Get_ColorForString(StringX4Int SX4I[], int alpha, 
+		       char * string, int * FlagError) {
+  int  i = 0 ;
+  while ((SX4I[i].string != NULL) && (strcmp(SX4I[i].string, string)))  i++ ;
+  *FlagError = (SX4I[i].string == NULL)? 1 : 0 ;
+  if(alpha > 0)
+    return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,alpha) ;
+  else
+    return PACK_COLOR(SX4I[i].int1,SX4I[i].int2,SX4I[i].int3,SX4I[i].int4) ;
+}
+
+void Get_ColorPointerForString(StringXPointer SXP[], char * string,
+			  int * FlagError, unsigned int **Pointer) {
+  int  i = 0 ;
+  while ((SXP[i].string != NULL) && (strcmp(SXP[i].string, string)))  i++ ;
+  *FlagError = (SXP[i].string == NULL)? 1 : 0 ;
+  *Pointer = (unsigned int *)SXP[i].Pointer ;
+}
+
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..11248c6662222803b5f42a2be7bb509588b428a6
--- /dev/null
+++ b/Parser/Gmsh.yy.cpp
@@ -0,0 +1,2931 @@
+#line 2 "Gmsh.yy.cpp"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.1.1.1 2000-11-23 09:22:47 geuzaine Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		*yy_cp = yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 157
+#define YY_END_OF_BUFFER 158
+static yyconst short int yy_accept[941] =
+    {   0,
+        0,    0,  158,  156,    1,    1,    5,  150,    6,  156,
+      156,  151,    2,    9,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,    0,    0,  150,    0,  153,    0,    0,
+        0,    0,    3,    4,  152,  151,    0,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,   61,  155,
+      155,  155,  155,  155,  155,  155,   92,   95,   86,   89,
+      155,  155,  155,  155,  155,  155,   94,  155,   97,  155,
+       88,   91,  155,  155,  155,  155,   93,   96,   87,   90,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,    0,    0,   10,    0,  103,  104,  105,  106,  152,
+        0,    0,  154,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+
+       26,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+       36,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,   52,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,   71,  155,  155,  155,  155,  155,  155,   80,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,    0,    0,    0,  153,    0,
+        0,  152,  155,   11,  155,  155,  155,  155,  155,  155,
+       13,  155,   15,  155,  155,  155,  155,   21,  155,  155,
+
+      155,  155,  155,  155,  155,   24,  155,  155,  155,  155,
+      155,   25,  120,  155,  155,  155,  155,  155,  155,    0,
+      155,  155,  155,  155,  155,   41,  155,   43,  155,  155,
+      155,  155,  155,    0,  155,  155,  114,  155,  155,   50,
+      155,   51,  155,   55,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,   73,   72,  155,   70,  155,  155,  155,  155,   79,
+      155,  155,  155,  155,  155,   83,  155,   85,  155,  155,
+      155,  155,  145,    8,  155,  155,  155,  155,  155,    0,
+        0,    0,  152,  155,  155,  155,  155,  155,  155,  155,
+
+      155,   17,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,   31,  155,  155,  155,
+      155,  155,  155,  155,    0,  155,  155,  155,  155,  155,
+       42,  155,  155,  155,  155,   46,    0,  155,   48,  155,
+      155,   53,  155,  155,   57,  155,  155,   59,  118,  155,
+      155,  155,   62,   63,   64,  155,  155,  155,   69,  155,
+      155,  155,  155,  155,  155,  155,  155,   82,  155,  155,
+      155,  155,  155,  155,  142,  155,  155,  144,  149,  155,
+        0,    0,  155,  155,  155,  155,   12,   14,   16,  155,
+      155,  155,  155,   23,  155,  133,  155,  155,  155,  155,
+
+      155,  155,   28,  155,  155,  155,   33,   34,  155,  155,
+      155,  155,    0,  126,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  119,    0,  155,   54,   49,
+      155,   56,  155,   58,  155,  155,  155,  155,  155,   68,
+      155,   74,  155,  155,  155,  155,  155,  155,  155,  115,
+      155,   84,  155,  155,  155,    7,  143,  141,    0,    0,
+      155,  155,  155,  155,   18,  155,  155,   22,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,   30,  155,  155,
+      155,  155,   40,    0,  155,  155,   38,  155,  155,  155,
+      155,  155,  155,   44,  155,    0,   47,  155,  155,  155,
+
+      155,  155,  155,  155,  155,   75,   76,  155,  155,  155,
+      155,   81,  155,  155,  146,  155,    0,    0,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,    0,   37,   39,
+      155,  155,  155,  155,  155,  155,   45,    0,  155,  155,
+      155,  155,   60,  155,  155,  155,  155,  155,  155,  155,
+      155,  147,  148,    0,    0,  155,  155,  155,  155,  155,
+       20,  155,  155,  155,  155,  155,  155,  155,  155,   29,
+      116,   35,  155,  109,    0,  155,  155,  155,  122,  155,
+      155,    0,  155,  155,  155,  155,  155,   67,  155,  155,
+
+      155,  155,   78,  155,    0,    0,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,   32,
+      155,  108,    0,  112,  155,  155,  155,  155,    0,  155,
+      155,  155,   66,  155,  155,  155,  155,  155,  155,    0,
+        0,  155,  155,  155,  155,  155,   19,  155,  155,  155,
+      155,  155,  155,  155,  155,    0,  155,  155,  121,  155,
+        0,  155,  155,  155,   65,  155,  155,  155,   77,  155,
+      102,    0,  102,  155,  155,  155,  155,  155,  155,  155,
+      127,  155,  155,  155,  155,    0,  155,  155,  155,  124,
+      155,  155,  155,  155,  155,  155,  110,  101,  155,  113,
+
+      101,  155,  155,  155,  155,  155,  155,  155,  155,    0,
+      155,  155,  135,  155,  107,  155,  155,  155,  134,  155,
+      155,  155,  155,  155,  155,  155,  155,   27,    0,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,   98,
+      137,  131,  155,    0,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  125,  111,  123,  155,
+      155,  155,  132,  155,  155,  155,  155,  155,  155,  155,
+      155,  155,  155,  117,  155,  155,  155,  155,  155,  138,
+      155,  155,  155,  155,  155,  130,  129,  155,  155,  155,
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+
+      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
+      136,  155,  155,  155,  155,  155,  139,  155,  155,  100,
+      155,  155,  155,  155,  155,  155,   99,  155,  155,  155,
+      155,  155,  155,  155,  155,  140,  155,  155,  128,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    4,    5,    1,    1,    1,    6,    1,
+        1,    7,    8,    1,    9,   10,   11,   12,   13,   14,
+       15,   16,   16,   16,   16,   16,   16,    1,   17,    1,
+       18,    1,    1,    1,   19,   20,   21,   22,   23,   24,
+       25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
+       28,   35,   36,   37,   38,   39,   40,   41,   42,   28,
+        1,    1,    1,    1,   43,    1,   44,   45,   46,   47,
+
+       48,   49,   50,   51,   52,   28,   28,   53,   54,   55,
+       56,   57,   58,   59,   60,   61,   62,   63,   64,   65,
+       66,   28,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[67] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    3,    3,    3,    3,    3,    1,    1,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[946] =
+    {   0,
+        0,    0, 1168,   46,   47, 1169,   48,   58,   54,   87,
+       69,  117,   56,   57,   98,   85,  147,  124,  131,  129,
+       66,  167,  166,   60,   67,  179,  188,   72,  173,  224,
+      172,  263,  309,  154,  235,   97,  116,  180,  191,  192,
+      204,  222,  258, 1134, 1134,  237, 1155,  336, 1154, 1153,
+       81, 1152, 1169, 1169,  342,  357,  296,    0,  182, 1122,
+     1128, 1132, 1112,   57,  120, 1124, 1099, 1119, 1092, 1099,
+     1117, 1116, 1117,   51, 1119, 1087, 1095, 1102, 1086,  210,
+     1107, 1108, 1089, 1088, 1083, 1114, 1108, 1115, 1083,   55,
+     1114, 1104, 1088, 1076, 1075, 1097,  123, 1110, 1071, 1094,
+
+     1080, 1069, 1092, 1057, 1067, 1066,  232, 1088, 1059, 1071,
+     1058, 1089, 1066, 1067, 1094, 1079, 1052, 1044,    0, 1065,
+      203, 1052, 1061, 1045, 1052, 1085,    0,    0,    0,    0,
+     1040, 1047, 1048, 1041, 1040, 1044,    0, 1062,    0, 1069,
+        0,    0, 1040,  242, 1042,  125,    0,    0,    0,    0,
+     1045, 1039, 1030, 1043, 1043, 1032, 1023, 1027, 1024, 1031,
+     1024, 1050, 1045, 1169,  319, 1169, 1169, 1169, 1169,  362,
+      379,  348,  384, 1048, 1019, 1059, 1041, 1040,  277, 1020,
+     1018, 1018, 1013, 1018, 1036, 1014, 1011, 1030, 1045, 1029,
+     1030, 1036, 1035, 1007, 1007, 1000, 1012, 1009, 1000,  998,
+
+     1003, 1034, 1029, 1003, 1006,  996, 1025, 1020,  106,  994,
+        0,  986, 1021, 1020,  982,  985,  993, 1008,  990,  983,
+     1014,  979, 1025,  980,  971, 1008,  982,  979,  980, 1014,
+      969,  998,  973,  961,  977,  998,  960,  971,  986,  995,
+      972,  955,  959,  958,  964,  961,  954,  965,  960,  973,
+      958,  954,  952,  942,  953,  953,  967,  968,  947,  942,
+      942,  940,  957,  956,  928,  929,  939,  232,  941,  931,
+      180,  933,  938,  933,  923,  946,  948,  399,  404,  413,
+      418,  423,  944,    0,  948,  945,  964,  921,  924,  931,
+        0,  928,  959,  928,  919,  940,  922,    0,  945,  937,
+
+      943,  932,  943,  931,  900,    0,  917,  907,  900,  899,
+      904,    0,    0,  935,  894,  893,  901,  909,  917,  923,
+      926,  891,  885,  903,  902,    0,  885,    0,  920,  883,
+      893,  917,  878,  925,  875,  876,    0,  876,  873,    0,
+      921,    0,  908,    0,  878,  870,  897,  880,  868,  903,
+      887,  870,  871,  874,  860,  861,  860,  864,  856,  869,
+      892,    0,    0,  859,    0,  869,  851,  884,  879,    0,
+      849,  854,  857,  873,  882,    0,  850,    0,  859,  846,
+      845,  839,    0,    0,  851,  854,  838,  849,  847,  867,
+      870,  428,  433,  865,  870,  867,  846,  828,  832,  831,
+
+      833,    0,  838,  828,  855,  821,  844,  856,  856,  841,
+      857,  853,  821,  827,  824,  823,    0,  822,  832,  820,
+      819,  820,  296,  829,  828,  842,  242,  815,  303,  428,
+        0,  824,  816,  798,  823,    0,  845,  809,    0,  795,
+      803,    0,  820,  796,    0,  814,  789,    0,    0,  828,
+      800,  801,    0,    0,    0,  798,  800,  796,    0,  800,
+      794,  795,  781,  817,  815,  269,  789,    0,  801,  794,
+      786,  787,  776,  778,    0,  780,  776,    0,    0,  763,
+      795,  805,  793,  801,  802,  788,    0,    0,  807,  776,
+      758,  770,  785,    0,  789,    0,  772,  787,  783,  777,
+
+      758,  749,    0,  754,  743,  780,    0,    0,  762,  767,
+      771,  780,  769,    0,  749,  748,  751,  765,  759,  773,
+      776,  773,  758,  739,  732,    0,  775,  741,    0,    0,
+      758,    0,  764,    0,  749,  724,  740,  723,  730,    0,
+      759,    0,  732,  713,  759,  755,  724,  731,  727,    0,
+      730,    0,  724,  714,  718,    0,    0,    0,  731,  741,
+      729,  744,  738,  734,    0,  702,  706,    0,  738,  741,
+      723,  721,  714,  729,  720,  706,  707,    0,  719,  690,
+      715,  716,    0,  739,  687,  700,    0,  707,  707,  707,
+      711,  715,  713,    0,  673,  726,    0,  715,  714,  692,
+
+      675,  680,  672,  676,  707,    0,    0,  699,  685,  672,
+      665,    0,  691,  663,    0,  676,  689,  697,  687,  676,
+      694,  698,  664,  656,  671,  681,  686,  688,  674,  688,
+      652,  648,  658,  673,  660,  664,  668,  688,    0,    0,
+      668,  676,  677,  674,  673,  674,    0,  679,  650,  649,
+      669,  638,    0,  637,  640,  663,  643,  664,  632,  635,
+      649,    0,    0,  643,  653,  641,  317,  651,  656,  620,
+        0,  345,  632,  651,  629,  631,  647,  609,   92,    0,
+        0,    0,  147,    0,  185,  194,  184,  206,    0,  215,
+      214,  265,  254,  272,  293,  273,  268,    0,  311,  304,
+
+      341,  321,    0,  356,  350,  366,  365,  367,  384,  381,
+      383,  352,  370,  371,  389,  394,  430,  417,  423,    0,
+      394,    0,  440,    0,  413,  430,  439,  423,  447,  429,
+      441,  441,    0,  411,  435,  430,  434,  422,  439,    0,
+      450,  472,  452,  463,  463,  455,    0,  452,  453,  458,
+      462,  455,  470,  452,  435,  485,  478,  465,    0,  477,
+      488,  472,  478,  477,    0,  478,  471,  468,    0,  471,
+     1169,    0,    0,  475,  487,  510,  490,  483,  499,  497,
+        0,  490,  507,  493,  478,  516,  499,  496,  497, 1169,
+      508,  513,  505,  501,  515,  517,    0, 1169,  498,    0,
+
+        0,  510,  520,  525,  513,  507,  526,  510,  503,  541,
+      513,  525,    0,  531,    0,  527,  528,  537,    0,  521,
+      521,  516,  539,  524,  539,  540,  529,    0,  551,  534,
+      534,  525,  532,  537,  550,  546,  530,  534,  552,    0,
+      533,    0,  553,  565,  557,  548,  561,  555,  551,  561,
+      566,  571,  560,  545,  553,  571, 1169,    0,    0,  556,
+      559,  550,    0,  560,  573,  559,  557,  575,  578,  577,
+      569,  567,  580,    0,  578,  578,  581,  584,  574,  566,
+      587,  568,  569,  576,  583,    0,    0,  579,  582,  582,
+      589,  593,  597,  595,  587,  600,  592,  582,  594,  608,
+
+      605,  595,  597,  602,  595,  599,  598,  600,  599,  605,
+        0,  615,  616,  617,  605,  609,    0,  611,  608,    0,
+      608,  609,  624,  612,  630,  618,    0,  614,  615,  626,
+      635,  622,  619,  625,  631,    0,  626,  628,    0, 1169,
+      658,  661,  664,  667,  670
+    } ;
+
+static yyconst short int yy_def[946] =
+    {   0,
+      940,    1,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  940,  940,  940,  940,  940,
+      940,  940,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  940,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  940,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  940,
+      940,  940,  940,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  940,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  940,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      940,  940,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  940,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  940,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  940,  940,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  940,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  940,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  940,  940,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  940,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  940,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  940,  940,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  940,  941,  941,  941,  941,  941,
+      941,  940,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  940,  940,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  940,  941,  941,  941,  941,  941,  940,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  942,
+      940,  943,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  940,  941,  941,  941,  941,
+      940,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      940,  944,  941,  941,  941,  945,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  940,  941,  941,  941,  940,
+      941,  941,  941,  941,  941,  941,  941,  940,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  940,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  940,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  940,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  940,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,  941,
+      941,  941,  941,  941,  941,  941,  941,  941,  941,    0,
+      940,  940,  940,  940,  940
+    } ;
+
+static yyconst short int yy_nxt[1236] =
+    {   0,
+        4,    5,    6,    7,    8,    9,    4,    4,    4,   10,
+       11,   12,   12,   12,   12,   12,   13,   14,   15,   16,
+       17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
+       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
+       24,   24,   24,   24,   24,   24,   24,   37,   38,   24,
+       24,   24,   39,   24,   40,   41,   24,   24,   24,   42,
+       24,   24,   43,   24,   24,   24,   44,   44,   44,   46,
+       46,   46,   46,   46,   44,   53,   44,   44,   44,   54,
+       66,  191,  192,   45,   45,   45,   66,   66,   96,   44,
+      168,   45,   66,   45,   45,   45,   47,   61,   48,   48,
+
+       48,   48,   48,   61,   61,   66,   45,   44,  180,   61,
+       49,  211,  163,   97,  320,  212,  181,   66,   59,   60,
+       67,  102,   61,   50,   51,   52,   55,   68,   56,   56,
+       56,   56,   56,  111,   61,   61,   66,   44,   62,   57,
+       69,  321,   81,  721,   66,  263,   70,   91,  153,   66,
+       82,   66,   86,   61,   45,   92,   63,   64,   65,  264,
+       87,   61,   88,  182,   57,   71,   61,   66,   61,  722,
+      154,   83,   93,   72,   66,   84,   73,  219,  220,   74,
+      183,   94,   95,   89,   61,   85,   66,   66,   75,   98,
+       76,   61,   66,   66,   77,   90,  723,   78,   79,   66,
+
+       66,  100,   80,   61,   61,  103,  108,  112,   66,   61,
+       61,   66,   66,  145,  174,  724,   61,   61,  725,  123,
+      101,  113,  104,  155,   66,   61,  105,  124,   61,   61,
+      106,  114,   99,  125,  107,  109,  384,  175,  385,  157,
+      726,   61,   66,  110,   66,  727,  156,  158,   46,   46,
+       46,   46,   46,  115,  244,   66,  728,  146,  116,   61,
+      198,   61,  199,  200,  147,  159,  245,  117,  148,  201,
+      149,  150,   61,  729,  118,  119,  120,  160,   66,  121,
+      379,  230,  122,   66,  380,  260,  151,  231,  126,  730,
+      152,  381,  127,  261,  731,   61,  128,  288,  129,  130,
+
+       61,  515,  516,  172,  172,  161,  131,  173,  173,  173,
+      173,  173,  289,  290,  132,  732,  510,  547,  733,  133,
+      134,  548,  518,  734,  135,  511,  278,  278,  136,   66,
+      279,  279,  279,  279,  279,  519,  708,  735,  137,  736,
+      709,  138,  139,  140,  141,  142,   61,   48,   48,   48,
+       48,   48,  143,  170,  170,  170,  170,  170,  165,  173,
+      173,  173,  173,  173,  171,  713,   55,  144,   56,   56,
+       56,   56,   56,  170,  170,  170,  170,  170,  737,   57,
+      714,  738,  739,  165,  280,  740,  281,  281,  741,  171,
+      282,  282,  282,  282,  282,  173,  173,  173,  173,  173,
+
+      742,  743,  744,  745,   57,  746,  747,  748,  749,  280,
+      279,  279,  279,  279,  279,  279,  279,  279,  279,  279,
+      392,  392,  750,  751,  393,  393,  393,  393,  393,  282,
+      282,  282,  282,  282,  282,  282,  282,  282,  282,  393,
+      393,  393,  393,  393,  393,  393,  393,  393,  393,  520,
+      752,  753,  754,  755,  756,  757,  758,  759,  760,  521,
+      761,  762,  763,  522,  764,  765,  766,  767,  768,  769,
+      770,  772,  771,  771,  774,  771,  771,  771,  771,  771,
+      771,  771,  771,  775,  776,  777,  778,  779,  771,  771,
+      780,  781,  782,  783,  784,  785,  786,  787,  788,  789,
+
+      790,  791,  792,  793,  794,  795,  796,  797,  799,  800,
+      798,  798,  802,  798,  798,  798,  798,  798,  798,  798,
+      798,  803,  804,  805,  806,  807,  798,  798,  808,  809,
+      810,  811,  812,  813,  814,  815,  816,  817,  818,  819,
+      820,  821,  822,  823,  824,  825,  826,  827,  828,  829,
+      830,  831,  832,  833,  834,  835,  836,  837,  838,  839,
+      840,  841,  842,  843,  844,  845,  846,  847,  848,  849,
+      850,  851,  852,  853,  854,  855,  856,  857,  858,  859,
+      860,  861,  862,  863,  864,  865,  866,  867,  868,  869,
+      870,  871,  872,  873,  874,  875,  876,  877,  878,  879,
+
+      880,  881,  882,  883,  884,  885,  886,  887,  888,  889,
+      890,  891,  892,  893,  894,  895,  896,  897,  898,  899,
+      900,  901,  902,  903,  904,  905,  906,  907,  908,  909,
+      910,  911,  912,  913,  914,  915,  916,  917,  918,  919,
+      920,  921,  922,  923,  924,  925,  926,  927,  928,  929,
+      930,  931,  932,  933,  934,  935,  936,  937,  938,  939,
+       58,  771,  720,  771,  773,  719,  773,  798,  718,  798,
+      801,  717,  801,  716,  715,  712,  711,  710,  707,  706,
+      705,  704,  703,  702,  701,  700,  699,  698,  697,  696,
+      695,  694,  693,  692,  691,  690,  689,  688,  687,  686,
+
+      685,  684,  683,  682,  681,  680,  679,  678,  677,  676,
+      675,  674,  673,  672,  671,  670,  669,  668,  667,  666,
+      665,  664,  663,  662,  661,  660,  659,  658,  657,  656,
+      655,  654,  653,  652,  651,  650,  649,  648,  647,  646,
+      645,  644,  643,  642,  641,  640,  639,  638,  637,  636,
+      635,  634,  633,  632,  631,  630,  629,  628,  627,  626,
+      625,  624,  623,  622,  621,  620,  619,  618,  617,  616,
+      615,  614,  613,  612,  611,  610,  609,  608,  607,  606,
+      605,  604,  603,  602,  601,  600,  599,  598,  597,  596,
+      595,  594,  593,  592,  591,  590,  589,  588,  587,  586,
+
+      585,  584,  583,  582,  581,  580,  579,  578,  577,  576,
+      575,  574,  573,  572,  571,  570,  569,  568,  567,  566,
+      565,  564,  563,  562,  561,  560,  559,  558,  557,  556,
+      555,  554,  553,  552,  551,  550,  549,  546,  545,  544,
+      543,  542,  541,  540,  539,  538,  537,  536,  535,  534,
+      533,  532,  531,  530,  529,  528,  527,  526,  525,  524,
+      523,  517,  514,  513,  512,  509,  508,  507,  506,  505,
+      504,  503,  502,  501,  500,  499,  498,  497,  496,  495,
+      494,  493,  492,  491,  490,  489,  488,  487,  486,  485,
+      484,  483,  482,  481,  480,  479,  478,  477,  476,  475,
+
+      474,  473,  472,  471,  470,  469,  468,  467,  466,  465,
+      464,  463,  462,  461,  460,  459,  458,  457,  456,  455,
+      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
+      444,  443,  442,  441,  440,  439,  438,  437,  436,  435,
+      434,  433,  432,  431,  430,  429,  428,  427,  426,  425,
+      424,  423,  422,  421,  420,  419,  418,  417,  416,  415,
+      414,  413,  412,  411,  410,  409,  408,  407,  406,  405,
+      404,  403,  402,  401,  400,  399,  398,  397,  396,  395,
+      394,  391,  390,  389,  388,  387,  386,  383,  382,  378,
+      377,  376,  375,  374,  373,  372,  371,  370,  369,  368,
+
+      367,  366,  365,  364,  363,  362,  361,  360,  359,  358,
+      357,  356,  355,  354,  353,  352,  351,  350,  349,  348,
+      347,  346,  345,  344,  343,  342,  341,  340,  339,  338,
+      337,  336,  335,  334,  333,  332,  331,  330,  329,  328,
+      327,  326,  325,  324,  323,  322,  319,  318,  317,  316,
+      315,  314,  313,  312,  311,  310,  309,  308,  307,  306,
+      305,  304,  303,  302,  301,  300,  299,  298,  297,  296,
+      295,  294,  293,  292,  291,  287,  286,  285,  284,  283,
+      277,  276,  275,  274,  273,  272,  271,  270,  269,  268,
+      267,  266,  265,  262,  259,  258,  257,  256,  255,  254,
+
+      253,  252,  251,  250,  249,  248,  247,  246,  243,  242,
+      241,  240,  239,  238,  237,  236,  235,  234,  233,  232,
+      229,  228,  227,  226,  225,  224,  223,  222,  221,  218,
+      217,  216,  215,  214,  213,  210,  209,  208,  207,  206,
+      205,  204,  203,  202,  197,  196,  195,  194,  193,  190,
+      189,  188,  187,  186,  185,  184,  174,  179,  178,  177,
+      176,  169,  167,  166,  164,  163,  162,  940,    3,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940
+    } ;
+
+static yyconst short int yy_chk[1236] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    4,    5,    7,    8,
+        8,    8,    8,    8,    9,   11,   13,   14,    8,   11,
+       24,   74,   74,    4,    5,    7,   21,   25,   21,   11,
+       51,    9,   28,   13,   14,    8,   10,   24,   10,   10,
+
+       10,   10,   10,   21,   25,   16,   11,   10,   64,   28,
+       10,   90,   51,   21,  209,   90,   64,   36,   15,   15,
+       16,   25,   16,   10,   10,   10,   12,   16,   12,   12,
+       12,   12,   12,   28,   36,   15,   37,   12,   15,   12,
+       16,  209,   18,  679,   18,  146,   16,   20,   36,   20,
+       18,   19,   19,   37,   12,   20,   15,   15,   15,  146,
+       19,   18,   19,   65,   12,   17,   20,   17,   19,  683,
+       37,   18,   20,   17,   34,   18,   17,   97,   97,   17,
+       65,   20,   20,   19,   17,   18,   23,   22,   17,   22,
+       17,   34,   31,   29,   17,   19,  685,   17,   17,   26,
+
+       38,   23,   17,   23,   22,   26,   27,   29,   27,   31,
+       29,   39,   40,   34,   59,  686,   26,   38,  687,   31,
+       23,   29,   26,   38,   41,   27,   26,   31,   39,   40,
+       26,   29,   22,   31,   26,   27,  271,   59,  271,   40,
+      688,   41,   42,   27,   30,  690,   39,   40,   46,   46,
+       46,   46,   46,   30,  121,   35,  691,   35,   30,   42,
+       80,   30,   80,   80,   35,   41,  121,   30,   35,   80,
+       35,   35,   35,  692,   30,   30,   30,   42,   43,   30,
+      268,  107,   30,   32,  268,  144,   35,  107,   32,  693,
+       35,  268,   32,  144,  694,   43,   32,  179,   32,   32,
+
+       32,  427,  427,   57,   57,   43,   32,   57,   57,   57,
+       57,   57,  179,  179,   32,  695,  423,  466,  696,   32,
+       32,  466,  429,  697,   32,  423,  165,  165,   32,   33,
+      165,  165,  165,  165,  165,  429,  667,  699,   33,  700,
+      667,   33,   33,   33,   33,   33,   33,   48,   48,   48,
+       48,   48,   33,   55,   55,   55,   55,   55,   48,  172,
+      172,  172,  172,  172,   55,  672,   56,   33,   56,   56,
+       56,   56,   56,  170,  170,  170,  170,  170,  701,   56,
+      672,  702,  704,   48,  170,  705,  171,  171,  706,   55,
+      171,  171,  171,  171,  171,  173,  173,  173,  173,  173,
+
+      707,  708,  709,  710,   56,  711,  712,  713,  714,  170,
+      278,  278,  278,  278,  278,  279,  279,  279,  279,  279,
+      280,  280,  715,  716,  280,  280,  280,  280,  280,  281,
+      281,  281,  281,  281,  282,  282,  282,  282,  282,  392,
+      392,  392,  392,  392,  393,  393,  393,  393,  393,  430,
+      717,  718,  719,  721,  723,  725,  726,  727,  728,  430,
+      729,  730,  731,  430,  732,  734,  735,  736,  737,  738,
+      739,  741,  742,  742,  743,  742,  742,  742,  742,  742,
+      742,  742,  742,  744,  745,  746,  748,  749,  742,  742,
+      750,  751,  752,  753,  754,  755,  756,  757,  758,  760,
+
+      761,  762,  763,  764,  766,  767,  768,  770,  774,  775,
+      776,  776,  777,  776,  776,  776,  776,  776,  776,  776,
+      776,  778,  779,  780,  782,  783,  776,  776,  784,  785,
+      786,  787,  788,  789,  791,  792,  793,  794,  795,  796,
+      799,  802,  803,  804,  805,  806,  807,  808,  809,  810,
+      811,  812,  814,  816,  817,  818,  820,  821,  822,  823,
+      824,  825,  826,  827,  829,  830,  831,  832,  833,  834,
+      835,  836,  837,  838,  839,  841,  843,  844,  845,  846,
+      847,  848,  849,  850,  851,  852,  853,  854,  855,  856,
+      860,  861,  862,  864,  865,  866,  867,  868,  869,  870,
+
+      871,  872,  873,  875,  876,  877,  878,  879,  880,  881,
+      882,  883,  884,  885,  888,  889,  890,  891,  892,  893,
+      894,  895,  896,  897,  898,  899,  900,  901,  902,  903,
+      904,  905,  906,  907,  908,  909,  910,  912,  913,  914,
+      915,  916,  918,  919,  921,  922,  923,  924,  925,  926,
+      928,  929,  930,  931,  932,  933,  934,  935,  937,  938,
+      941,  942,  678,  942,  943,  677,  943,  944,  676,  944,
+      945,  675,  945,  674,  673,  670,  669,  668,  666,  665,
+      664,  661,  660,  659,  658,  657,  656,  655,  654,  652,
+      651,  650,  649,  648,  646,  645,  644,  643,  642,  641,
+
+      638,  637,  636,  635,  634,  633,  632,  631,  630,  629,
+      628,  627,  626,  625,  624,  623,  622,  621,  620,  619,
+      618,  617,  616,  614,  613,  611,  610,  609,  608,  605,
+      604,  603,  602,  601,  600,  599,  598,  596,  595,  593,
+      592,  591,  590,  589,  588,  586,  585,  584,  582,  581,
+      580,  579,  577,  576,  575,  574,  573,  572,  571,  570,
+      569,  567,  566,  564,  563,  562,  561,  560,  559,  555,
+      554,  553,  551,  549,  548,  547,  546,  545,  544,  543,
+      541,  539,  538,  537,  536,  535,  533,  531,  528,  527,
+      525,  524,  523,  522,  521,  520,  519,  518,  517,  516,
+
+      515,  513,  512,  511,  510,  509,  506,  505,  504,  502,
+      501,  500,  499,  498,  497,  495,  493,  492,  491,  490,
+      489,  486,  485,  484,  483,  482,  481,  480,  477,  476,
+      474,  473,  472,  471,  470,  469,  467,  465,  464,  463,
+      462,  461,  460,  458,  457,  456,  452,  451,  450,  447,
+      446,  444,  443,  441,  440,  438,  437,  435,  434,  433,
+      432,  428,  426,  425,  424,  422,  421,  420,  419,  418,
+      416,  415,  414,  413,  412,  411,  410,  409,  408,  407,
+      406,  405,  404,  403,  401,  400,  399,  398,  397,  396,
+      395,  394,  391,  390,  389,  388,  387,  386,  385,  382,
+
+      381,  380,  379,  377,  375,  374,  373,  372,  371,  369,
+      368,  367,  366,  364,  361,  360,  359,  358,  357,  356,
+      355,  354,  353,  352,  351,  350,  349,  348,  347,  346,
+      345,  343,  341,  339,  338,  336,  335,  334,  333,  332,
+      331,  330,  329,  327,  325,  324,  323,  322,  321,  320,
+      319,  318,  317,  316,  315,  314,  311,  310,  309,  308,
+      307,  305,  304,  303,  302,  301,  300,  299,  297,  296,
+      295,  294,  293,  292,  290,  289,  288,  287,  286,  285,
+      283,  277,  276,  275,  274,  273,  272,  270,  269,  267,
+      266,  265,  264,  263,  262,  261,  260,  259,  258,  257,
+
+      256,  255,  254,  253,  252,  251,  250,  249,  248,  247,
+      246,  245,  244,  243,  242,  241,  240,  239,  238,  237,
+      236,  235,  234,  233,  232,  231,  230,  229,  228,  227,
+      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
+      216,  215,  214,  213,  212,  210,  208,  207,  206,  205,
+      204,  203,  202,  201,  200,  199,  198,  197,  196,  195,
+      194,  193,  192,  191,  190,  189,  188,  187,  186,  185,
+      184,  183,  182,  181,  180,  178,  177,  176,  175,  174,
+      163,  162,  161,  160,  159,  158,  157,  156,  155,  154,
+      153,  152,  151,  145,  143,  140,  138,  136,  135,  134,
+
+      133,  132,  131,  126,  125,  124,  123,  122,  120,  118,
+      117,  116,  115,  114,  113,  112,  111,  110,  109,  108,
+      106,  105,  104,  103,  102,  101,  100,   99,   98,   96,
+       95,   94,   93,   92,   91,   89,   88,   87,   86,   85,
+       84,   83,   82,   81,   79,   78,   77,   76,   75,   73,
+       72,   71,   70,   69,   68,   67,   66,   63,   62,   61,
+       60,   52,   50,   49,   47,   45,   44,    3,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,  940,  940
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "Gmsh.l"
+#define INITIAL 0
+#line 2 "Gmsh.l"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "Gmsh.h"
+#include "Geo.h"
+#include "CAD.h"
+#include "Gmsh.tab.cpp.h"
+
+char   TmpString[1024];
+int    yywhere = INFILE;
+int    yylineno = 1;
+
+void   parsestring(char endchar);
+char  *strsave(char *ptr);
+void   skipcomments(void);
+void   skipline(void);
+
+#define YY_ALWAYS_INTERACTIVE 1
+
+#define YY_INPUT(buf,result,max_size)					\
+   if ( yy_current_buffer->yy_is_interactive )				\
+     {									\
+       int c = '*', n;							\
+       for ( n = 0; n < max_size &&					\
+	       (c = getc( yyin )) != EOF && c != '\n'; ++n )		\
+	 buf[n] = (char) c;						\
+       if ( c == '\n' ){						\
+	 buf[n++] = (char) c;						\
+	 yylineno++;							\
+       }								\
+       if ( c == EOF && ferror( yyin ) )				\
+	 YY_FATAL_ERROR( "input in flex scanner failed" );		\
+       result = n;							\
+     }									\
+   else if ( ((result = fread( buf, 1, max_size, yyin )) == 0)		\
+	     && ferror( yyin ) )					\
+     YY_FATAL_ERROR( "input in flex scanner failed" );
+
+#line 989 "Gmsh.yy.cpp"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+		  && ferror( yyin ) ) \
+		YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp = NULL, *yy_bp = NULL;
+	register int yy_act;
+
+#line 59 "Gmsh.l"
+
+
+#line 1143 "Gmsh.yy.cpp"
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yy_start;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				yy_last_accepting_state = yy_current_state;
+				yy_last_accepting_cpos = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 941 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 1169 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = yy_hold_char;
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 61 "Gmsh.l"
+/* none */ ;
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 62 "Gmsh.l"
+return tEND;
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 64 "Gmsh.l"
+skipcomments();
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 65 "Gmsh.l"
+skipline();
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 66 "Gmsh.l"
+{parsestring('\"'); return tBIGSTR;}
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 67 "Gmsh.l"
+{parsestring('\''); return tBIGSTR;}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 68 "Gmsh.l"
+{yylval.d = NEWREG(); return tDOUBLE;}
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 69 "Gmsh.l"
+{yylval.d = NEWPOINT(); return tDOUBLE;}
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 70 "Gmsh.l"
+return tAFFECT;
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 71 "Gmsh.l"
+return tDOTS;
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 74 "Gmsh.l"
+return tAcos ;
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 75 "Gmsh.l"
+return tAcos ;
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 76 "Gmsh.l"
+return tAsin;
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 77 "Gmsh.l"
+return tAsin;
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 78 "Gmsh.l"
+return tAtan ;
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 79 "Gmsh.l"
+return tAtan ;
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 80 "Gmsh.l"
+return tAtan2 ;
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 81 "Gmsh.l"
+return tAtan2 ;
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 82 "Gmsh.l"
+return tAssociation;
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 83 "Gmsh.l"
+return tAttractor;
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 85 "Gmsh.l"
+return tBump;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 86 "Gmsh.l"
+return tBSpline;
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 87 "Gmsh.l"
+return tBounds;
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 89 "Gmsh.l"
+return tCeil ;
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 90 "Gmsh.l"
+return tCosh ;
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 91 "Gmsh.l"
+return tCos ;
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 92 "Gmsh.l"
+return tCharacteristic;
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 93 "Gmsh.l"
+return tCircle;
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 94 "Gmsh.l"
+return tCoherence;
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 95 "Gmsh.l"
+return tComplex;
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 96 "Gmsh.l"
+return tColor;
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 97 "Gmsh.l"
+return tSpline;
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 99 "Gmsh.l"
+return tDelete;
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 100 "Gmsh.l"
+return tDilate;
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 101 "Gmsh.l"
+return tDuplicata;
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 103 "Gmsh.l"
+return tExp ;
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 104 "Gmsh.l"
+return tEllipsis;
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 105 "Gmsh.l"
+return tExtrude;
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 106 "Gmsh.l"
+return tElliptic;
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 107 "Gmsh.l"
+return tELLIPSE;
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 109 "Gmsh.l"
+return tFabs ;
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 110 "Gmsh.l"
+return tFloor ;
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 111 "Gmsh.l"
+return tFmod ;
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 113 "Gmsh.l"
+return tGeneral;
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 114 "Gmsh.l"
+return tGeometry;
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 116 "Gmsh.l"
+return tHypot ;
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 118 "Gmsh.l"
+return tInclude;
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 120 "Gmsh.l"
+return tKnots;
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 122 "Gmsh.l"
+return tLength;
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 123 "Gmsh.l"
+return tLine;
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 124 "Gmsh.l"
+return tLoop;
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 125 "Gmsh.l"
+return tLog ;
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 126 "Gmsh.l"
+return tLog10 ;
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 127 "Gmsh.l"
+return tLayers;
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 129 "Gmsh.l"
+return tMesh;
+	YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 130 "Gmsh.l"
+return tModulo ;
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 132 "Gmsh.l"
+return tNurbs;
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 134 "Gmsh.l"
+return tOffset;
+	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 135 "Gmsh.l"
+return tOrder;
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 137 "Gmsh.l"
+return tPhysical;
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 138 "Gmsh.l"
+return tPi;
+	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 139 "Gmsh.l"
+return tPlane;
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 140 "Gmsh.l"
+return tPoint;
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 141 "Gmsh.l"
+return tPower;
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 142 "Gmsh.l"
+return tProgression;
+	YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 143 "Gmsh.l"
+return tParametric;
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 145 "Gmsh.l"
+return tRecombine;
+	YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 146 "Gmsh.l"
+return tRotate;
+	YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 147 "Gmsh.l"
+return tRuled;
+	YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 149 "Gmsh.l"
+return tSqrt ;
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 150 "Gmsh.l"
+return tSin ;
+	YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 151 "Gmsh.l"
+return tSinh ;
+	YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 152 "Gmsh.l"
+return tPhysical;
+	YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 153 "Gmsh.l"
+return tSpline;
+	YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 154 "Gmsh.l"
+return tSurface;
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 155 "Gmsh.l"
+return tSymetry;
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 157 "Gmsh.l"
+return tTransfinite;
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 158 "Gmsh.l"
+return tTranslate;
+	YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 159 "Gmsh.l"
+return tTanh ;
+	YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 160 "Gmsh.l"
+return tTan;
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 161 "Gmsh.l"
+return tTrimmed;
+	YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 163 "Gmsh.l"
+return tUsing;
+	YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 165 "Gmsh.l"
+return tView;
+	YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 166 "Gmsh.l"
+return tVolume;
+	YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 168 "Gmsh.l"
+return tWith;
+	YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 171 "Gmsh.l"
+return tScalarSimplex;
+	YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 172 "Gmsh.l"
+return tVectorSimplex;
+	YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 173 "Gmsh.l"
+return tTensorSimplex;
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 174 "Gmsh.l"
+return tScalarTriangle;
+	YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 175 "Gmsh.l"
+return tVectorTriangle;
+	YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 176 "Gmsh.l"
+return tTensorTriangle;
+	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 177 "Gmsh.l"
+return tScalarLine;
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 178 "Gmsh.l"
+return tVectorLine;
+	YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 179 "Gmsh.l"
+return tTensorLine;
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 180 "Gmsh.l"
+return tScalarPoint;
+	YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 181 "Gmsh.l"
+return tVectorPoint;
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 182 "Gmsh.l"
+return tTensorPoint;
+	YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 185 "Gmsh.l"
+return tCARTESIAN_POINT;
+	YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 186 "Gmsh.l"
+return tB_SPLINE_SURFACE_WITH_KNOTS;
+	YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 187 "Gmsh.l"
+return tB_SPLINE_CURVE_WITH_KNOTS;
+	YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 188 "Gmsh.l"
+return tUNSPECIFIED;
+	YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 189 "Gmsh.l"
+return tCONTINUOUS;
+	YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 190 "Gmsh.l"
+return tFALSE;
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 191 "Gmsh.l"
+return tTRUE;
+	YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 192 "Gmsh.l"
+return tU;
+	YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 193 "Gmsh.l"
+return tV;
+	YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 194 "Gmsh.l"
+return tORIENTED_EDGE;
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 195 "Gmsh.l"
+return tEDGE_CURVE;
+	YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 196 "Gmsh.l"
+return tEDGE_LOOP;
+	YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 197 "Gmsh.l"
+return tVERTEX_POINT;
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 198 "Gmsh.l"
+return tFACE_OUTER_BOUND;
+	YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 199 "Gmsh.l"
+return tFACE_BOUND;
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 200 "Gmsh.l"
+return tADVANCED_FACE;
+	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 201 "Gmsh.l"
+return tLine;
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 202 "Gmsh.l"
+return tVECTOR;
+	YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 203 "Gmsh.l"
+return tDIRECTION;
+	YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 204 "Gmsh.l"
+return tAXIS2_PLACEMENT_3D;
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 205 "Gmsh.l"
+return tPLANE;
+	YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 206 "Gmsh.l"
+return tHEADER;
+	YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 207 "Gmsh.l"
+return tDATA;
+	YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 208 "Gmsh.l"
+return tFILE_SCHEMA;
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 209 "Gmsh.l"
+return tFILE_NAME;
+	YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 210 "Gmsh.l"
+return tFILE_DESCRIPTION;
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 211 "Gmsh.l"
+return tISO;
+	YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 212 "Gmsh.l"
+return tENDISO;
+	YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 213 "Gmsh.l"
+return tENDSEC;
+	YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 214 "Gmsh.l"
+return tCLOSED_SHELL;
+	YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 215 "Gmsh.l"
+return  tADVANCED_BREP_SHAPE_REPRESENTATION;
+	YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 216 "Gmsh.l"
+return tMANIFOLD_SOLID_BREP;
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 217 "Gmsh.l"
+return tCYLINDRICAL_SURFACE;
+	YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 218 "Gmsh.l"
+return tCONICAL_SURFACE;
+	YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 219 "Gmsh.l"
+return tTOROIDAL_SURFACE;
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 220 "Gmsh.l"
+return tCIRCLE;
+	YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 221 "Gmsh.l"
+return tTRIMMED_CURVE;
+	YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 222 "Gmsh.l"
+return tGEOMETRIC_SET;
+	YY_BREAK
+case 136:
+YY_RULE_SETUP
+#line 223 "Gmsh.l"
+return tCOMPOSITE_CURVE_SEGMENT;
+	YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 224 "Gmsh.l"
+return tCOMPOSITE_CURVE;
+	YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 225 "Gmsh.l"
+return tPRODUCT_DEFINITION;
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 226 "Gmsh.l"
+return tPRODUCT_DEFINITION_SHAPE;
+	YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 227 "Gmsh.l"
+return tSHAPE_DEFINITION_REPRESENTATION;
+	YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 229 "Gmsh.l"
+return tVertex;
+	YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 230 "Gmsh.l"
+return tFacet;
+	YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 231 "Gmsh.l"
+return tNormal;
+	YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 232 "Gmsh.l"
+return tOuter;
+	YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 233 "Gmsh.l"
+return tLoopSTL;
+	YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 234 "Gmsh.l"
+return tEndLoop;
+	YY_BREAK
+case 147:
+YY_RULE_SETUP
+#line 235 "Gmsh.l"
+return tEndFacet;
+	YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 236 "Gmsh.l"
+{skipline();return tEndSolid;}
+	YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 237 "Gmsh.l"
+{skipline();return tSolid;}
+	YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 239 "Gmsh.l"
+{yylval.d = (double)atoi((char*)(yytext+1)); return tDOUBLE;}
+	YY_BREAK
+case 151:
+#line 242 "Gmsh.l"
+case 152:
+#line 243 "Gmsh.l"
+case 153:
+#line 244 "Gmsh.l"
+case 154:
+YY_RULE_SETUP
+#line 244 "Gmsh.l"
+{yylval.d = atof((char *)yytext); return tDOUBLE;}
+	YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 246 "Gmsh.l"
+{yylval.c = strsave((char*)yytext); return tSTRING;}
+	YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 248 "Gmsh.l"
+return yytext[0];
+	YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 250 "Gmsh.l"
+ECHO;
+	YY_BREAK
+#line 2002 "Gmsh.yy.cpp"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state();
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yy_c_buf_p;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer() )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yy_did_buffer_switch_on_eof = 0;
+
+				if ( yywrap() )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yy_c_buf_p =
+					yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yy_c_buf_p =
+				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+	{
+	register char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	yy_n_chars += number_to_move;
+	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			yy_last_accepting_state = yy_current_state;
+			yy_last_accepting_cpos = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 941 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+	}
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+	register char *yy_cp = yy_c_buf_p;
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		yy_last_accepting_state = yy_current_state;
+		yy_last_accepting_cpos = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 941 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 940);
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register char *yy_cp = yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yy_hold_char;
+
+	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			yy_n_chars = yy_current_buffer->yy_buf_size;
+
+		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = yy_hold_char;
+
+	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			/* This was really a NUL. */
+			*yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	yy_hold_char = *++yy_c_buf_p;
+
+
+	return c;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	yy_init_buffer( yy_current_buffer, input_file );
+	yy_load_buffer_state();
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+	{
+	if ( yy_current_buffer == new_buffer )
+		return;
+
+	if ( yy_current_buffer )
+		{
+		/* Flush out information for old buffer. */
+		*yy_c_buf_p = yy_hold_char;
+		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	yy_current_buffer = new_buffer;
+	yy_load_buffer_state();
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yy_did_buffer_switch_on_eof = 1;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+	{
+	yy_n_chars = yy_current_buffer->yy_n_chars;
+	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+	yyin = yy_current_buffer->yy_input_file;
+	yy_hold_char = *yy_c_buf_p;
+	}
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer( b, file );
+
+	return b;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+	{
+	if ( ! b )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		yytext[yyleng] = yy_hold_char; \
+		yy_c_buf_p = yytext + n; \
+		yy_hold_char = *yy_c_buf_p; \
+		*yy_c_buf_p = '\0'; \
+		yyleng = n; \
+		} \
+	while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+#line 250 "Gmsh.l"
+
+
+#undef yywrap
+
+int yywrap() {return 1;}
+
+void skipcomments(void) {
+  int c;
+
+  while (1) {
+    while ((c=yyinput()) != '*'){
+      if(c == EOF) {
+        fprintf(stderr, "Error: End of File in Commented Region\n") ;
+        exit(1);
+      }
+    }
+    if ((c = yyinput()) == '/')
+      return;
+    unput(c);
+  }
+}
+
+void parsestring(char endchar){
+  int c, i;
+
+  c = yyinput();
+  i = 0;
+  while (c != endchar) {
+    TmpString[i++] = c;
+    c = yyinput();
+  }
+  TmpString[i++] = '\0';
+  yylval.c = strsave(TmpString);
+}
+
+char *strsave(char *ptr){
+  return((char*)strcpy((char*)malloc(strlen(ptr)+1),ptr));
+}
+
+void skipline(void)
+{
+   while (yyinput() != '\n') ;
+}
+
diff --git a/Parser/Makefile b/Parser/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d5ec0e3bb1322656589d84ab727c3bdb28a431c3
--- /dev/null
+++ b/Parser/Makefile
@@ -0,0 +1,70 @@
+#
+# Makefile for "libParser.a"
+#
+
+.IGNORE:
+
+CC        = c++
+C_FLAGS   = -g -Wall
+
+OS_FLAGS  = -D_UNIX
+
+RANLIB   = /usr/bin/ranlib
+RM       = rm
+YACC     = bison
+LEX      = flex
+
+RMFLAGS  = -f
+
+LIB      = ../lib/libParser.a
+INCLUDE  = -I../includes -I../Common -I../DataStr -I../Geo -I../Graphics\
+           -I../Mesh -I../Unix
+
+CFLAGS = $(C_FLAGS) $(OS_FLAGS) $(INCLUDE) 
+
+SRC =  	Gmsh.yy.cpp \
+	Gmsh.tab.cpp
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ)
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+parser:
+	$(YACC) --output Gmsh.tab.cpp -d Gmsh.y 
+	$(LEX)  -oGmsh.yy.cpp Gmsh.l
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+Gmsh.yy.o: Gmsh.yy.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Geo/Geo.h ../Geo/CAD.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h Gmsh.tab.cpp.h
+Gmsh.tab.o: Gmsh.tab.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/Const.h \
+  ../Common/Context.h ../Geo/Geo.h ../Geo/CAD.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Geo/DataBase.h \
+  ../Mesh/Create.h ../Common/Views.h ../Graphics/ColorTable.h \
+  ../Geo/StepGeomDatabase.h ../Common/Colors.h Parser.h
diff --git a/Parser/Parser.h b/Parser/Parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..e571192aa6697824fe9b3c560c455d1258c04d1a
--- /dev/null
+++ b/Parser/Parser.h
@@ -0,0 +1,25 @@
+#ifndef _PARSER_H_
+#define _PARSER_H_
+
+typedef struct {
+  char *Name;
+  double val;
+} Symbol;
+
+void InitSymbols (void);
+void DeleteSymbols(void);
+int  CompareSymbols (const void *a, const void *b);
+
+extern List_T *Symbol_L;
+
+int yyparse (void);
+int yylex ();
+
+extern FILE   *yyin;
+extern int     yylineno;
+extern char    yyname[256];
+extern char   *yytext;
+extern int     yyerrorstate;
+
+
+#endif
diff --git a/README b/README
new file mode 100644
index 0000000000000000000000000000000000000000..43fa99c949165e88f70dd823152c7524353d5e26
--- /dev/null
+++ b/README
@@ -0,0 +1,7 @@
+
+some rules to follow:
+
+- please!, enable full warnings with your compiler (e.g. gcc -Wall)
+- use Msg() to print information/erros/etc.
+- indent your files and suppress the tabs (untabify)
+
diff --git a/TODO b/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..e6c50d86dce4c8fd3e638e92c3100124bb57c1f9
--- /dev/null
+++ b/TODO
@@ -0,0 +1,3 @@
+
+affichier un point de couleur au CG de chaque element indiquant sa
+qualite.
diff --git a/Unix/Bitmaps.h b/Unix/Bitmaps.h
new file mode 100644
index 0000000000000000000000000000000000000000..a088563c1882bec639d6a656dab02076eaffa434
--- /dev/null
+++ b/Unix/Bitmaps.h
@@ -0,0 +1,144 @@
+#ifndef _BITMAPS_H_
+#define _BITMAPS_H_
+
+#define g1_width 66
+#define g1_height 29
+static char g1_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc,
+ 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e,
+ 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf,
+ 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd,
+ 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31,
+ 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83,
+ 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc,
+ 0x00,0x07,0x00,0x00,0x00,0x04,0x01,0x00,0xfc,0x80,0x03,0x00,0x00,0x00,0x8c,
+ 0x01,0x00,0xfc,0xc0,0x03,0x00,0x00,0x00,0x8c,0x99,0x26,0xfd,0xe0,0x01,0x00,
+ 0x00,0x00,0x54,0xa5,0x29,0xfd,0xf0,0x01,0x00,0x00,0x00,0x54,0xbd,0x28,0xfd,
+ 0xf0,0x00,0x00,0x00,0x00,0x24,0x85,0x28,0xfd,0x78,0x00,0x00,0x00,0x00,0x24,
+ 0xa5,0x28,0xfd,0x30,0x00,0x00,0x00,0x00,0x24,0x99,0xc8,0xfd,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc};
+
+#define g2_width 66
+#define g2_height 29
+static char g2_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc,
+ 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e,
+ 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf,
+ 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd,
+ 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31,
+ 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83,
+ 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc,
+ 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x80,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x78,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc};
+
+#define g3_width 66
+#define g3_height 29
+static char g3_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xfc,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x30,0x00,0xfc,0x00,0x08,0x00,0x00,0x00,0x18,0x18,0x00,0xfc,
+ 0x00,0x0c,0x00,0x04,0x00,0x3c,0x08,0x06,0xfc,0xc0,0x0f,0x04,0x8f,0x01,0x3e,
+ 0x04,0x0f,0xfc,0x30,0x0e,0x8e,0xcf,0x03,0x7b,0x84,0x0f,0xfc,0x18,0x0e,0xcf,
+ 0xe7,0x83,0x70,0x42,0x0f,0xfc,0x1c,0x8e,0x2f,0x97,0x43,0x70,0x22,0x0e,0xfd,
+ 0x1e,0xcd,0x1e,0x8f,0x23,0x21,0x17,0x8e,0xfc,0xfe,0x68,0x8e,0x87,0x97,0x31,
+ 0x0f,0x4e,0xfc,0x7e,0x38,0x87,0x83,0x8f,0x1b,0x07,0x2e,0xfc,0x1c,0x1c,0x83,
+ 0x01,0x03,0x07,0x02,0x1e,0xfc,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x0c,0xfc,
+ 0x00,0x07,0xe0,0x01,0x00,0x00,0x00,0x00,0xfd,0x80,0x03,0x10,0x02,0x00,0x00,
+ 0x00,0x00,0xfd,0xc0,0x03,0x10,0x70,0x6e,0x6e,0x4e,0x63,0xfd,0xe0,0x01,0x10,
+ 0x88,0x92,0x92,0xd0,0x94,0xfd,0xf0,0x01,0x10,0x88,0x92,0x92,0x5c,0x14,0xfd,
+ 0xf0,0x00,0x10,0x88,0x92,0x92,0x52,0x14,0xfd,0x78,0x00,0x10,0x8a,0x92,0x92,
+ 0x52,0x94,0xfd,0x30,0x00,0xe0,0x71,0x92,0x92,0x6c,0x64,0xfd,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc};
+
+#define about_width 49
+#define about_height 111
+static char about_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0xfe,0x00,0x00,0x00,0x40,0x00,0x00,0xfe,0x00,0x00,0x00,
+ 0xc0,0x00,0x00,0xfe,0x00,0x00,0x00,0xc0,0x01,0x00,0xfe,0x00,0x00,0x00,0xc0,
+ 0x01,0x00,0xfe,0x00,0x00,0x00,0xff,0x03,0x00,0xfe,0x00,0x00,0xf0,0xff,0x03,
+ 0x00,0xfe,0x00,0x00,0xf0,0xff,0x03,0x00,0xfe,0x70,0x00,0xf0,0xff,0x03,0x00,
+ 0xfe,0xfc,0x03,0xe0,0xff,0x00,0x00,0xfe,0xf8,0x0f,0xc0,0x01,0x00,0x00,0xfe,
+ 0xf0,0x3f,0xc0,0x00,0x00,0x00,0xfe,0xe0,0x7f,0x00,0x01,0x00,0x00,0xfe,0x80,
+ 0xff,0x00,0x01,0x00,0x00,0xfe,0x00,0xfe,0x01,0x02,0x00,0x00,0xfe,0x00,0xf8,
+ 0x03,0x0c,0x00,0x00,0xfe,0x00,0xf0,0x07,0x08,0x00,0x00,0xfe,0x00,0xc0,0x0f,
+ 0x10,0x00,0x00,0xfe,0x00,0x00,0x1f,0x70,0x00,0x00,0xfe,0x00,0x00,0x7c,0xf8,
+ 0x00,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00,0x00,0xfe,0x00,0x00,0xc0,0xff,0x01,
+ 0x00,0xfe,0x00,0x00,0x00,0xfe,0x01,0x00,0xfe,0x00,0x00,0x00,0xf8,0x00,0x00,
+ 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,
+ 0x00,0xe0,0x03,0x00,0x00,0xfe,0x00,0x00,0xf0,0x0f,0x00,0x00,0xfe,0x00,0x80,
+ 0xf8,0x1f,0x00,0x00,0xfe,0x00,0x00,0xff,0x21,0x00,0x00,0xfe,0x00,0x00,0xff,
+ 0x40,0x00,0x00,0xfe,0x00,0x00,0x7e,0x80,0x00,0x00,0xfe,0x00,0x00,0x3c,0x80,
+ 0x00,0x00,0xfe,0x00,0x00,0x38,0xc0,0x01,0x00,0xfe,0x00,0x00,0x20,0xf0,0x01,
+ 0x00,0xfe,0x00,0x00,0x40,0xf8,0x01,0x00,0xfe,0x00,0x00,0x80,0xf8,0x01,0x00,
+ 0xfe,0x00,0x00,0x00,0xf1,0x00,0x00,0xfe,0x00,0x00,0x00,0x04,0x00,0x00,0xfe,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0xfe,0x00,0x00,0x00,0x08,0x00,0x00,0xfe,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,0x00,0x30,0x00,0x00,0xfe,0x00,0x00,
+ 0x00,0x70,0x00,0x00,0xfe,0x00,0x00,0x00,0x70,0x00,0x00,0xfe,0x00,0x00,0x00,
+ 0xf8,0x00,0x00,0xfe,0x00,0x00,0xc0,0xff,0x01,0x00,0xfe,0x00,0x00,0xf0,0xff,
+ 0x01,0x00,0xfe,0x00,0x00,0xf0,0xff,0x01,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00,
+ 0x00,0xfe,0x00,0x00,0xe0,0x1f,0x00,0x00,0xfe,0x00,0x00,0xc0,0x01,0x00,0x00,
+ 0xfe,0x00,0x00,0xc0,0x00,0x00,0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00,0xfe,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0xfe,0x00,0x00,0x38,0x08,0x00,0x00,0xfe,0x00,0x00,
+ 0xf8,0x18,0x00,0x00,0xfe,0x00,0x00,0xf8,0x3f,0x00,0x00,0xfe,0x00,0x00,0xf8,
+ 0x7f,0x00,0x00,0xfe,0x00,0x00,0xf0,0xff,0x00,0x00,0xfe,0x00,0x00,0xf0,0xff,
+ 0x00,0x00,0xfe,0x00,0x00,0x60,0xfc,0x01,0x00,0xfe,0x00,0x00,0x40,0xf0,0x01,
+ 0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00,0xfe,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0xfe,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,
+ 0x00,0x00,0x0c,0x06,0x00,0x00,0xfe,0x00,0x00,0x3c,0x04,0x00,0x00,0xfe,0x00,
+ 0x00,0xf8,0x08,0x00,0x00,0xfe,0x00,0x00,0xf8,0x1f,0x00,0x00,0xfe,0x00,0x00,
+ 0xf0,0x3f,0x00,0x00,0xfe,0x00,0x00,0xe0,0x7f,0x00,0x00,0xfe,0x00,0x00,0xc0,
+ 0xff,0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,
+ 0x00,0x00,0xfe,0x00,0x00,0x00,0x0c,0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x00,0xfe,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0xfe,0x00,0x00,0x00,0x60,0x00,0x00,0xfe,0x00,0x00,0x00,0xcf,0x00,0x00,0xfe,
+ 0x00,0x00,0xde,0xbf,0x01,0x00,0xfe,0x00,0x00,0xfe,0xff,0x03,0x00,0xfe,0x00,
+ 0x00,0xfe,0x1f,0x0f,0x00,0xfe,0x00,0x00,0xf8,0x07,0x1e,0x00,0xfe,0x00,0x00,
+ 0xf0,0x03,0x7e,0x00,0xfe,0x00,0x00,0xd0,0x07,0xfc,0x00,0xfe,0x00,0x00,0x10,
+ 0x08,0xf8,0x03,0xfe,0x00,0x00,0x10,0x18,0xf0,0x07,0xfe,0x00,0x00,0x10,0x30,
+ 0xe0,0x0f,0xfe,0x00,0x00,0x10,0x30,0xc0,0x1f,0xfe,0x00,0x00,0x10,0x70,0x80,
+ 0x3f,0xfe,0x00,0x00,0x20,0xf8,0x00,0x7f,0xfe,0x00,0x00,0x60,0xfc,0x00,0xfe,
+ 0xfe,0x00,0x00,0xc0,0xff,0x01,0xfc,0xfe,0x00,0x00,0xc0,0xff,0x01,0x78,0xfe,
+ 0x00,0x00,0x80,0xff,0x01,0x00,0xfe,0x00,0x00,0x00,0xff,0x01,0x00,0xfe,0x00,
+ 0x00,0x00,0xfc,0x01,0x00,0xfe,0x00,0x00,0x00,0xf8,0x00,0x00,0xfe,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfe};
+
+#define abort_width 13
+#define abort_height 13
+static char abort_bits[] = {
+ 0x00,0xe0,0x40,0xe0,0x40,0xe0,0x50,0xe1,0x48,0xe2,0x44,0xe4,0x44,0xe4,0x44,
+ 0xe4,0x04,0xe4,0x04,0xe4,0x08,0xe2,0xf0,0xe1,0x00,0xe0};
+
+#define start_width 9
+#define start_height 13
+static char start_bits[] = {
+ 0x00,0xfe,0x06,0xfe,0x0a,0xfe,0x12,0xfe,0x22,0xfe,0x42,0xfe,0x82,0xfe,0x42,
+ 0xfe,0x22,0xfe,0x12,0xfe,0x0a,0xfe,0x06,0xfe,0x00,0xfe};
+
+#define stop_width 9
+#define stop_height 13
+static char stop_bits[] = {
+ 0x00,0xfe,0xee,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,
+ 0xfe,0xaa,0xfe,0xaa,0xfe,0xaa,0xfe,0xee,0xfe,0x00,0xfe};
+
+#endif
diff --git a/Unix/CbColorbar.cpp b/Unix/CbColorbar.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3f7731104892b81a61c278135508b16c6a245cd1
--- /dev/null
+++ b/Unix/CbColorbar.cpp
@@ -0,0 +1,652 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Const.h"
+#include "XColors.h"
+#include "Widgets.h"
+#include "Register.h"
+#include "Context.h"
+#include "XContext.h"
+#include "ColorTable.h"
+
+#include "CbColorbar.h"
+
+extern Context_T   CTX ;
+extern XContext_T  XCTX ;
+extern Widgets_T   WID;
+
+/* RGB/HSV transformation */
+
+#define RETURN_HSV(h,s,v) {*H=h; *S=s; *V=v; return;} 
+#define RETURN_RGB(r,g,b) {*R=r; *G=g; *B=b; return;} 
+#define UNDEFINED 0
+#define EPS       1.e-10
+
+/* rgb on [0, 1], sv returned on [0, 1] and h on [0, 6]. 
+   Exception: h is returned UNDEFINED if S==0. */
+									     
+void RGB_to_HSV(double  R, double  G, double  B,
+		double *H, double *S, double *V) { 
+  double v, x, f;   
+  int i; 
+   
+  x = DMIN(DMIN(R, G), B);   
+  v = DMAX(DMAX(R, G), B);   
+  if(v == x) RETURN_HSV(UNDEFINED, 0, v);   
+  f = (R == x) ? G - B : ((G == x) ? B - R : R - G);   
+  i = (R == x) ? 3 : ((G == x) ? 5 : 1);   
+  RETURN_HSV(i - f /(v - x), (v - x)/v, v);   
+} 
+
+/* h given on [0, 6] or UNDEFINED. s and v given on [0, 1].      
+   rgb each returned on [0, 1]. */
+
+void HSV_to_RGB(double  H, double  S, double  V,
+		double *R, double *G, double *B) {     
+  double m, n, f;   
+  int i; 
+      
+  if (H == UNDEFINED) RETURN_RGB(V, V, V);
+  i = (int)floor(H);
+  f = H - i;   
+  if ( !(i&1) ) f = 1 - f; /* if i is even */
+  m = V * (1 - S);   
+  n = V * (1 - S * f); 
+  
+  switch (i) {         
+  case 6:         
+  case 0: RETURN_RGB(V, n, m);        
+  case 1: RETURN_RGB(n, V, m);         
+  case 2: RETURN_RGB(m, V, n);        
+  case 3: RETURN_RGB(m, n, V); 	      	      
+  case 4: RETURN_RGB(n, m, V);         
+  case 5: RETURN_RGB(V, m, n);     
+  } 
+} 
+
+
+/* Convert window X coordinate to color table index */
+
+static int x_to_index(ColorBar *cb, int x){
+  int index;
+  index = (int) (x * (float) cb->ct->size / (float) cb->width );
+  if (index<0) 
+    index = 0;
+  else if (index>=cb->ct->size)
+    index = cb->ct->size-1;
+  return index;
+}
+
+/* Convert color table index to window X coordinate */
+
+static int index_to_x(ColorBar *cb, int index){
+  int x;
+  x = (int) (index * (float) cb->width / (float)(cb->ct->size-1) );
+  if (x>=cb->width)
+    x = cb->width - 1;
+  return x;
+}
+
+/* Convert a color intensity to a window Y coordinate */
+
+static int intensity_to_y(ColorBar *cb, int intensity){
+  int y;
+  y = (int) (cb->wedge_y - intensity * (float) cb->wedge_y / 255.0 );
+  if (y<0)
+    y = 0;
+  else if (y>=cb->wedge_y)
+    y = cb->wedge_y - 1;
+  return y;
+}
+
+/* Convert a window Y coordinate to a color intensity */
+
+static int y_to_intensity(ColorBar *cb, int y){
+  int intensity;
+  intensity = (int) ((cb->wedge_y - y ) * 255.0 / (float) cb->wedge_y );
+  if (intensity<0)
+    intensity = 0;
+  else if (intensity>255)
+    intensity = 255;
+  return intensity;
+}
+
+
+/* Redraw part of a Color Widget (between a and b) */
+
+#define HELP_LINES 9
+
+static void redraw_range(ColorBar *cb, int a, int b){
+   Window win;
+   int i;
+   int x,y, px,py;
+   int x1, y1, x2, y2;
+   int intensity;
+   double H,S,V;
+   char rgb_str[] = "RGB", hsv_str[] = "HSV" ;
+   char help_str[HELP_LINES][100] = {
+     "h           show this message",
+     "1 -> 6      choose predefined colormap",
+     "m           switch color mode",
+     "s/l/c/p/r   save/load/copy/paste/reset",
+     "mouse       draw color or alpha",
+     "left/right  move or rotate",
+     "up/down     color or alpha curvature",
+     "i           invert x or y range",
+     "b           increase or decrease gamma"
+   };
+
+   win = cb->window;
+
+   if (a<0)  a = 0;
+   if (b>=cb->ct->size)  b = cb->ct->size-1;
+
+   /* calc region to update */
+   x1 = index_to_x( cb, a );
+   x2 = index_to_x( cb, b);
+
+   y1 = intensity_to_y( cb, 255 );
+   y2 = intensity_to_y( cb, 0 ); 
+
+   /* erase region */
+   XFillRectangle( XCTX.display, win, XCTX.xgc.black,
+                   x1,y1, x2-x1+1, y2-y1+1 );
+
+   /* redraw region of entries in interval [a,b] */
+   if (a>0) a--;
+   if (b<cb->ct->size-1)  b++;
+
+   /* draw red or hue levels */
+   for (i=a;i<=b;i++) {
+      x = index_to_x( cb, i );
+
+      if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){
+	intensity = UNPACK_RED(cb->ct->table[i]);
+      }
+      else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){
+	RGB_to_HSV(UNPACK_RED  (cb->ct->table[i])/255., 
+		   UNPACK_GREEN(cb->ct->table[i])/255.,
+		   UNPACK_BLUE (cb->ct->table[i])/255.,
+		   &H,&S,&V);
+	intensity = (int) (H/6.*255.+EPS);
+      }
+
+      y = intensity_to_y( cb, intensity );
+      if (i!=a)
+         XDrawLine( XCTX.display, win, XCTX.xgc.red, px, py, x, y );
+      px = x;  py = y;
+   }
+
+   /* draw green or saturation levels */
+   for (i=a;i<=b;i++) {
+      x = index_to_x( cb, i );
+
+      if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){
+	intensity = UNPACK_GREEN(cb->ct->table[i]);
+      }
+      else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){
+	RGB_to_HSV(UNPACK_RED  (cb->ct->table[i])/255., 
+		   UNPACK_GREEN(cb->ct->table[i])/255.,
+		   UNPACK_BLUE (cb->ct->table[i])/255.,
+		   &H,&S,&V);
+	intensity = (int) (S*255.);
+      }
+
+      y = intensity_to_y( cb, intensity);
+      if (i!=a)
+         XDrawLine( XCTX.display, win, XCTX.xgc.green, px,py, x,y );
+      px = x;  py = y;
+   }
+
+   /* draw blue or value levels */
+   for (i=a;i<=b;i++) {
+      x = index_to_x( cb, i );
+
+      if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){
+	intensity = UNPACK_BLUE(cb->ct->table[i]);
+      }
+      else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){
+	RGB_to_HSV(UNPACK_RED  (cb->ct->table[i])/255., 
+		   UNPACK_GREEN(cb->ct->table[i])/255.,
+		   UNPACK_BLUE (cb->ct->table[i])/255.,
+		   &H,&S,&V);
+	intensity = (int) (V*255.);
+      }
+
+      y = intensity_to_y( cb, intensity );
+      if (i!=a)
+         XDrawLine( XCTX.display, win, XCTX.xgc.blue, px,py, x,y );
+      px = x;  py = y;
+   }
+
+   /* draw alpha levels */   
+   for (i=a;i<=b;i++) {
+     x = index_to_x( cb, i );
+     y = intensity_to_y( cb, UNPACK_ALPHA(cb->ct->table[i]) );
+     if (i!=a)
+       XDrawLine( XCTX.display, win, XCTX.xgc.white, px,py, x,y );
+     px = x;  py = y;
+   }
+
+   /* draw the color bar */
+   for (x=x1;x<=x2;x++) {
+      int r, g, b;
+      unsigned int color;
+      i = x_to_index( cb, x );
+      color = cb->ct->table[i];
+      r = UNPACK_RED( color );
+      g = UNPACK_GREEN( color );
+      b = UNPACK_BLUE( color );
+      XSetForeground( XCTX.display, XCTX.xgc.xgc, AllocateColorInt(r,g,b) );
+      XDrawLine( XCTX.display, win, XCTX.xgc.xgc, x, cb->wedge_y,
+                 x, cb->wedge_y + WEDGE_HEIGHT-1 ); 
+   }
+
+   /* print colortable mode and help */
+
+   if (cb->helpflag) {
+     for (i=0;i<HELP_LINES;i++) {
+       XDrawString( XCTX.display, win, XCTX.xgc.white,
+		    10,10+(i+1)*XCTX.xfont.fixed_h,
+		    help_str[i], strlen(help_str[i]) );
+     }
+   }
+   else{
+     if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB)
+       XDrawString( XCTX.display, win, XCTX.xgc.white,
+		    10, 10+XCTX.xfont.fixed_h, 
+		    rgb_str, strlen(rgb_str) );
+     else if(cb->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV)
+       XDrawString( XCTX.display, win, XCTX.xgc.white,
+		    10, 10+XCTX.xfont.fixed_h, 
+		    hsv_str, strlen(hsv_str) );
+   }
+}
+
+
+/* Redraw the marker and the text */
+
+static void redraw_marker(ColorBar *cb){
+   Window win;
+   int x, y0, y1;
+   char str[50];
+   int dir,ascent, descent;
+   XCharStruct overall;
+   int xpos;
+   float val;
+
+   win = cb->window;
+
+   y0 = cb->marker_y;
+   y1 = cb->height - 1;
+   XFillRectangle( XCTX.display, win, XCTX.xgc.black,
+                   0, y0, cb->width, y1-y0+1 );
+
+   /* draw marker below color wedge */
+   x = index_to_x( cb, cb->markerpos );
+   XDrawLine( XCTX.display, win, XCTX.xgc.white,
+              x, cb->marker_y, x, cb->marker_y+MARKER_HEIGHT );
+   XDrawLine( XCTX.display, win, XCTX.xgc.white,
+              x, cb->marker_y, x-3, cb->marker_y+6 );
+   XDrawLine( XCTX.display, win, XCTX.xgc.white,
+              x, cb->marker_y, x+3, cb->marker_y+6 );
+
+   /* draw min value */
+   sprintf( str, "%.2g", cb->minval );
+   XDrawString( XCTX.display, win, XCTX.xgc.white,
+                2, cb->label_y, str, strlen(str) );
+
+   /* draw marker value */
+   val = cb->minval + (cb->maxval-cb->minval)
+                  * ( (float) cb->markerpos / (float) (cb->ct->size-1));
+   sprintf(str,"(%.2g)", val );
+   XTextExtents(XCTX.xfont.fixed, str, strlen(str), &dir,&ascent,&descent,&overall );
+   xpos = (cb->width - overall.width) / 2;
+   XDrawString( XCTX.display, win, XCTX.xgc.white,
+                xpos, cb->label_y, str, strlen(str) );
+
+   /* draw max value */
+   sprintf( str, "%.2g", cb->maxval );
+   XTextExtents( XCTX.xfont.fixed, str, strlen(str), &dir,&ascent,&descent,&overall );
+   xpos = cb->width - overall.width - 2;
+   XDrawString( XCTX.display, win, XCTX.xgc.white,
+                xpos, cb->label_y, str, strlen(str) );
+
+}
+
+
+static void set_size(ColorBar *cb, int width, int height){
+   cb->width = width;
+   cb->height = height;
+   cb->label_y = cb->height - 5; 
+   cb->marker_y = cb->label_y + 1 - MARKER_HEIGHT - XCTX.xfont.fixed_h;
+   cb->wedge_y = cb->marker_y - WEDGE_HEIGHT;
+}
+
+
+
+
+/* creation, manipulation and callbacks functions */
+
+static ColorBar *TheCB=NULL ;
+static ColorTable clip;
+
+void ColorBarCopy(ColorTable *ct){
+  memcpy(clip.table, ct->table, ct->size * sizeof(unsigned int));
+  memcpy(clip.ipar,  ct->ipar,  COLORTABLE_NBMAX_PARAM * sizeof(int));
+  memcpy(clip.fpar,  ct->fpar,  COLORTABLE_NBMAX_PARAM * sizeof(float));
+}
+
+void ColorBarPaste(ColorTable *ct){
+  memcpy(ct->table, clip.table, ct->size * sizeof(unsigned int));
+  memcpy(ct->ipar,  clip.ipar,  COLORTABLE_NBMAX_PARAM * sizeof(int));
+  memcpy(ct->fpar,  clip.fpar,  COLORTABLE_NBMAX_PARAM * sizeof(float));
+}
+
+void ColorBarCreate(Window win, int width, int height){
+  static int first=1 ;
+
+  if(!TheCB) TheCB = (ColorBar *) calloc(1, sizeof(ColorBar));
+  TheCB->window = win;
+  set_size(TheCB, width, height);
+
+  if(first){
+    TheCB->helpflag = 1;
+    first=0;
+  }
+}
+
+void ColorBarShow(void){
+  XMapWindow(XCTX.display, TheCB->window);
+}
+
+void ColorBarHide(void){
+  XUnmapWindow(XCTX.display, TheCB->window);
+}
+
+void ColorBarRedraw(void){
+  if(!TheCB) return;
+  redraw_range(TheCB, 0, TheCB->ct->size-1);
+  redraw_marker(TheCB);
+}
+
+void ColorBarChange(char *label, float min, float max, ColorTable *ct, int rgb){
+  strncpy(TheCB->label, label, LABEL_STR_L);
+  TheCB->ct     = ct;
+  TheCB->minval = min;
+  TheCB->maxval = max;
+  if (rgb) redraw_range(TheCB, 0, TheCB->ct->size-1);
+  redraw_marker(TheCB);
+}
+
+void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){
+  Dimension w1,h1;
+
+  if(!TheCB) return;
+  
+  XtVaGetValues(WID.PD.colorDrawingArea, 
+		XmNwidth, &w1, 
+		XmNheight, &h1, 
+		NULL);    
+
+  set_size(TheCB, (int)w1, (int)h1);
+  XResizeWindow(XCTX.display, TheCB->window, (int)w1, (int)h1);
+  ColorBarRedraw();
+}
+
+void ColorBarExposeCb(Widget w,XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){
+  ColorBarRedraw();
+}
+
+#define ANY_MODIFIER (ShiftMask|ControlMask|Mod1Mask)
+
+void ColorBarInputCb (Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data){
+
+  XEvent         *event;
+  static int      p1=0, p2=0, p3=0, p4=0; /* red, green, blue, alpha */
+  static int      pentry, move_marker;
+  int             i, modify, entry, compute;
+  char            keybuf[50];
+  KeySym          key;
+  XComposeStatus  compose;
+
+  event  = call_data->event;   
+  modify = 0;
+  compute = 0;
+
+  /* touche */
+  
+  if (event->type==KeyPress) {
+    XLookupString(&event->xkey, keybuf, 50, &key, &compose);
+
+    switch(key){
+    case XK_1 : color_table_init_param(1, TheCB->ct, 1, 1); compute=1; break;
+    case XK_2 : color_table_init_param(2, TheCB->ct, 1, 1); compute=1; break;
+    case XK_3 : color_table_init_param(3, TheCB->ct, 1, 1); compute=1; break;
+    case XK_4 : color_table_init_param(4, TheCB->ct, 1, 1); compute=1; break;
+    case XK_5 : color_table_init_param(5, TheCB->ct, 1, 1); compute=1; break;
+    case XK_6 : color_table_init_param(6, TheCB->ct, 1, 1); compute=1; break;
+    case XK_7 : color_table_init_param(7, TheCB->ct, 1, 1); compute=1; break;
+    case XK_8 : color_table_init_param(8, TheCB->ct, 1, 1); compute=1; break;
+    case XK_9 : color_table_init_param(9, TheCB->ct, 1, 1); compute=1; break;
+    case XK_0 : color_table_init_param(0, TheCB->ct, 1, 1); compute=1; break;
+
+    case XK_c : case XK_C : ColorBarCopy(TheCB->ct); break;
+    case XK_p : case XK_P : ColorBarPaste(TheCB->ct); ColorBarRedraw(); break;
+    case XK_s : case XK_S : ManageCb(NULL, (XtPointer)WID.FD.saveDialog, NULL); break;
+    case XK_l : case XK_L : ManageCb(NULL, (XtPointer)WID.FD.mergeDialog, NULL); return ;
+    case XK_h : case XK_H : TheCB->helpflag = !TheCB->helpflag; ColorBarRedraw(); break;
+
+    case XK_r : 
+    case XK_R : 
+      color_table_init_param(TheCB->ct->ipar[COLORTABLE_NUMBER], 
+			     TheCB->ct, 1, 1); 
+      compute=1; break;
+
+    case XK_m : 
+    case XK_M : 
+      if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB)
+	TheCB->ct->ipar[COLORTABLE_MODE] = COLORTABLE_HSV;
+      else
+	TheCB->ct->ipar[COLORTABLE_MODE] = COLORTABLE_RGB;
+      ColorBarRedraw(); 
+      break;
+
+    case XK_i : 
+    case XK_I : 
+      if (event->xkey.state&ANY_MODIFIER) {
+	TheCB->ct->ipar[COLORTABLE_INVERT] = !TheCB->ct->ipar[COLORTABLE_INVERT]; 
+      }
+      else{
+	TheCB->ct->ipar[COLORTABLE_SWAP] = !TheCB->ct->ipar[COLORTABLE_SWAP]; 	
+      }
+      compute=1; break;
+
+    case XK_b :
+    case XK_B :
+      if (event->xkey.state&ANY_MODIFIER) {
+	TheCB->ct->fpar[COLORTABLE_BETA] -= 0.05;
+	if(TheCB->ct->fpar[COLORTABLE_BETA]<-1.0) 
+	  TheCB->ct->fpar[COLORTABLE_BETA] = -1.0;
+      }
+      else{
+	TheCB->ct->fpar[COLORTABLE_BETA] += 0.05;
+	if(TheCB->ct->fpar[COLORTABLE_BETA]>1.0) 
+	  TheCB->ct->fpar[COLORTABLE_BETA] = 1.0;
+      }
+      compute = 1; break;
+
+    case XK_Left  : 
+      if (event->xkey.state&ANY_MODIFIER) {
+	TheCB->ct->ipar[COLORTABLE_ROTATE] += 5;
+	if(TheCB->ct->ipar[COLORTABLE_ROTATE] > TheCB->ct->size-1) 
+	  TheCB->ct->ipar[COLORTABLE_ROTATE] -= TheCB->ct->size-1;
+      }
+      else {
+	TheCB->ct->fpar[COLORTABLE_BIAS] -= 0.05; 
+      }
+      compute = 1; break;
+
+    case XK_Right : 
+      if (event->xkey.state&ANY_MODIFIER) {
+	TheCB->ct->ipar[COLORTABLE_ROTATE] -= 5;
+	if(TheCB->ct->ipar[COLORTABLE_ROTATE]<-(TheCB->ct->size-1)) 
+	  TheCB->ct->ipar[COLORTABLE_ROTATE] += TheCB->ct->size-1;
+      }
+      else{
+	TheCB->ct->fpar[COLORTABLE_BIAS] += 0.05; 
+      }
+      compute = 1; break;
+
+    case XK_Up :
+      if (event->xkey.state&ANY_MODIFIER) {
+	TheCB->ct->fpar[COLORTABLE_ALPHAPOW] -= 0.05;
+	if (TheCB->ct->fpar[COLORTABLE_ALPHAPOW]<0.0)
+	  TheCB->ct->fpar[COLORTABLE_ALPHAPOW] = 0.0;
+      }
+      else {
+	TheCB->ct->fpar[COLORTABLE_CURVE] -= 0.05;
+      }
+      compute = 1; break;
+
+    case XK_Down :
+      if (event->xkey.state&ANY_MODIFIER)
+	TheCB->ct->fpar[COLORTABLE_ALPHAPOW] += 0.05;
+      else
+	TheCB->ct->fpar[COLORTABLE_CURVE] += 0.05;
+      compute = 1; break;      
+
+    }
+
+    if(compute){
+      color_table_recompute(TheCB->ct, 1, 1);
+      ColorBarRedraw();
+    }
+
+  }
+
+  /* souris enfoncee */
+
+  else if (event->type==ButtonPress) {
+
+    if(TheCB->helpflag){
+      TheCB->helpflag = 0;
+      ColorBarRedraw();
+    }
+
+    if (event->xbutton.y<TheCB->wedge_y) {
+      /* change color function */
+      move_marker = 0;
+    }
+    else {
+      /* change marker position */
+      move_marker = 1;
+    }
+    /* determine which curve to modify */
+    if (event->xbutton.state&ANY_MODIFIER) {
+      p4 = 1;
+    }
+    else {
+      if (event->xbutton.button==Button1)  p1 = 1;
+      if (event->xbutton.button==Button2)  p2 = 1;
+      if (event->xbutton.button==Button3)  p3 = 1;
+    }
+    pentry = x_to_index(TheCB, event->xbutton.x);
+    modify = 1;
+  }
+
+  /* souris relachee */
+
+  else if (event->type==ButtonRelease) {
+    if (event->xbutton.button==Button1)  p1 = 0;
+    if (event->xbutton.button==Button2)  p2 = 0;
+    if (event->xbutton.button==Button3)  p3 = 0;
+    p4 = 0;
+  }
+
+  /* bouger */
+
+  else if (event->type==MotionNotify) {
+    /* Flush extra MotionNotify events */
+    while (QLength(XCTX.display)>0) {
+      XEvent next;
+      XPeekEvent(XCTX.display, &next);
+      if (next.type!=MotionNotify)
+	break;
+      XNextEvent(XCTX.display, event);
+    }
+    modify = 1;
+  }
+
+  /* Modify one or more of the color curves */
+  
+   if (modify && (p1 || p2 || p3 || p4)) {
+      /* calculate which entry in color table to change */
+      entry = x_to_index(TheCB, event->xbutton.x);
+      /* update */
+      if (move_marker) {
+         /* changing marker position */
+         TheCB->markerpos = entry;
+         redraw_marker(TheCB);
+      }
+      else {
+         /* changing color graph */
+         int a, b, value;
+
+         value = y_to_intensity(TheCB, event->xbutton.y);
+
+         if (pentry<=entry) {
+            a = pentry;
+            b = entry;
+         }
+         else {
+            a = entry;
+            b = pentry;
+         }
+
+         /* update entries from 'pentry' to 'entry' */
+         for (i=a; i<=b; i++) {
+            int red, green, blue, alpha;
+	    double R,G,B,H,S,V;
+
+	    red   = UNPACK_RED  (TheCB->ct->table[i]);
+	    green = UNPACK_GREEN(TheCB->ct->table[i]);
+	    blue  = UNPACK_BLUE (TheCB->ct->table[i]);
+	    alpha = UNPACK_ALPHA(TheCB->ct->table[i]);
+	    
+	    if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_RGB){
+	      if (p1) { red = value; }
+	      if (p2) { green = value; }
+	      if (p3) { blue = value; }
+	      if (p4) { alpha = value; }
+	    }	   
+	    else if(TheCB->ct->ipar[COLORTABLE_MODE]==COLORTABLE_HSV){
+	      RGB_to_HSV((double)red/255.,(double)green/255.,(double)blue/255.,
+			 &H,&S,&V);
+	      if (p1) { H = 6.*(double)value/255.+EPS ; }
+	      if (p2) { S = (double)value/255.; }
+	      if (p3) { V = (double)value/255.; }
+	      if (p4) { alpha = value; }	      
+	      HSV_to_RGB(H, S, V, &R,&G,&B);
+	      red   = (int)(255 * R);
+	      green = (int)(255 * G);
+	      blue  = (int)(255 * B);
+	    }
+
+            TheCB->ct->table[i] = PACK_COLOR(red,green,blue,alpha);
+         } 
+
+         /* redraw the color curves */
+         if (pentry<entry)
+           redraw_range(TheCB, pentry-1, entry+1);
+         else
+           redraw_range(TheCB, entry-1, pentry+1);
+
+         pentry = entry;
+	 
+      }
+   }
+   
+   
+}
+
diff --git a/Unix/CbColorbar.h b/Unix/CbColorbar.h
new file mode 100644
index 0000000000000000000000000000000000000000..1bd5357ffbb70b826e0030c6d1db5136666eff8a
--- /dev/null
+++ b/Unix/CbColorbar.h
@@ -0,0 +1,28 @@
+#ifndef _COLORBAR_H
+#define _COLORBAR_H
+
+typedef struct _colorbar {
+  Window window;
+  int width, height;           /* size */
+  int wedge_y;                 /* top coord of color wedge */
+  int marker_y;                /* top coord of marker arrow */
+  int label_y;                 /* y coord of text labels */
+  char label[LABEL_STR_L];     /* text label at bottom */
+  float minval, maxval;        /* min and max data values */
+  int markerpos;               /* position of marker as index into table */
+  int helpflag;                /* if nonzero, print help messages */  
+  ColorTable *ct;              /* pointer to color table (allocated in Post_View) */
+} ColorBar;
+
+#define WEDGE_HEIGHT    12  /* epaisseur de la colorbar */
+#define MARKER_HEIGHT   10  /* hauteur de la fleche */
+
+void ColorBarCreate(Window win, int width, int height);
+void ColorBarShow(void);
+void ColorBarChange(char *label, float min, float max, ColorTable *ct, int rgb);
+void ColorBarCopy(ColorTable *ct);
+void ColorBarPaste(ColorTable *ct);
+void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *call_data);
+void ColorBarRedraw(void);
+
+#endif
diff --git a/Unix/CbContext.cpp b/Unix/CbContext.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9eace8844f97e9809b917f675dea04196bbd3fe8
--- /dev/null
+++ b/Unix/CbContext.cpp
@@ -0,0 +1,651 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Views.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "XContext.h"
+#include "CbContext.h"
+#include "CbGeom.h"
+#include "CbMesh.h"
+
+extern Context_T   CTX;
+extern XContext_T  XCTX;
+extern Widgets_T   WID; 
+extern Mesh        M;
+extern List_T     *Post_ViewList;
+
+static char *txt_new [] = 
+  { "Parameter", "Point", "Line", "Spline", "Bezier", "BSpline", "Circle", "Ellipsis", 
+    "Plane Surface", "Ruled Surface", "Nurbs Surface", "Volume", NULL };  
+
+static char *txt_translate_rotate_dilate_symetry_delete [] = 
+  { "Point", "Line", "Surface", NULL };  
+
+static char *txt_add [] = 
+  { "Create", "Translate", "Rotate", "Dilate", "Symmetry", NULL };  
+
+static char *txt_move [] = 
+  { "Translate", "Rotate", "Dilate", "Symmetry", NULL };  
+
+static char *txt_elem [] = 
+  { "Add", "Move", "Extrude", "Delete", "Coherence", NULL };  
+
+static char *txt_phys [] = 
+  { "Add", "Delete", NULL };  
+
+static char *txt_phys_add [] = 
+  { "Point", "Line", "Surface", "Volume", NULL };  
+
+static char *txt_geom [] = 
+  { "Elementary", "Physical", "Reload", NULL };  
+
+static char *txt_mesh [] = 
+  { "Define", "1D", "2D", "3D", NULL };  
+
+static char *txt_mesh_define [] = 
+  { "Length", "Recombine", "Transfinite Line", "Transfinite Surface", 
+    "Transfinite Volume", NULL };  
+
+static char *txt_post[NB_BUTT_MAX] = 
+  {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+
+static long int   actual_context, actual_global_context;
+
+void UpdatePostButtons(void){
+  Post_View  *v;
+  int         i;
+
+  for(i = 0 ; i < NB_BUTT_MAX ; i++) {
+    
+    if(txt_post[i]){
+      
+      v = (Post_View*)List_Pointer(Post_ViewList,i);
+
+      /* defaultButt[i] */
+      if(i==0 && XtIsManaged(WID.M.defaultButt)) XtUnmanageChild(WID.M.defaultButt);
+
+      /* pushButt[i] */
+      if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]);
+
+      /* toggleButt[i] */
+      XtVaSetValues(WID.M.toggleButt[i],
+		    XmNlabelString, XmStringCreateSimple(txt_post[i]),
+		    XmNset, v->Visible?True:False,
+		    NULL);      
+      XtManageChild(WID.M.toggleButt[i]);
+
+      /* timeStepButt[i] */
+      XtSetSensitive(WID.M.timeStepButt[i], (v->NbTimeStep>1)?1:0);
+      XtManageChild(WID.M.timeStepButt[i]);
+
+      /* vectorButt[i] */
+      XtSetSensitive(WID.M.vectorButt[i], v->ScalarOnly?0:1);
+      XtManageChild(WID.M.vectorButt[i]);
+
+      /* exportBGMButt[i] */
+      XtSetSensitive(WID.M.exportBGMButt[i], v->ScalarOnly?1:0);
+      XtManageChild(WID.M.exportBGMButt[i]);
+
+      /* applyBGMButtXXX */
+      XtSetSensitive(WID.M.applyBGMButt[i], v->ScalarOnly?1:0);
+      XtManageChild(WID.M.applyBGMButt[i]);
+    }
+    else{
+      if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]);
+      if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]);
+      if(i==0) XtManageChild(WID.M.defaultButt);      
+    }
+  }
+
+}
+
+
+#define NB_HISTORY_MAX 100
+
+void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data){
+  char         **ButtonText;
+  int            i, last;
+  static int     last_context[NB_HISTORY_MAX], numc = 0, numf = 0;
+
+  if((long int)client_data == CONTEXT_BACKWARD){
+    if(numc > 1){
+      numc--;
+      numf++;
+      actual_context = last_context[numc-1];
+    }
+    else return;
+  }
+  else if((long int)client_data == CONTEXT_FORWARD){
+    if(numf > 0){
+      numc++;
+      numf--;
+      actual_context = last_context[numc-1];
+    }
+    else return;
+  }
+  else{
+    actual_context = (long int)client_data;
+    if(last_context[numc-1] != actual_context){
+      last_context[numc] = actual_context;
+      numc++;
+    }
+    numf = 0;
+  }
+
+  if(numc > NB_HISTORY_MAX-1) numc = 1; /* Il faudrait faire un truc circulaire */
+
+  switch (actual_context){
+
+  case CONTEXT_GEOM :
+    actual_global_context = CONTEXT_GEOM;
+    XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Geometry"), NULL);
+    CTX.geom.level = ELEMENTARY;
+    //if(M.status>0) mesh_event_handler(MESH_DELETE);
+    Msg(INFO, "");
+    ButtonText = txt_geom;
+    break;
+
+  case CONTEXT_GEOM_ELEM :
+    actual_global_context = CONTEXT_GEOM;
+    CTX.geom.level = ELEMENTARY;
+    Msg(INFO, "Elementary");
+    ButtonText = txt_elem;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD :       
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add");
+    ButtonText = txt_add;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_NEW :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add Create");
+    ButtonText = txt_new;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_TRANSLATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add Translate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_ROTATE : 
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add Rotate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_DILATE : 
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add Dilate"); 
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_SYMETRY :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Add Symetry");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Move");
+    ButtonText = txt_move;
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_TRANSLATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Move Translate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_ROTATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Move Rotate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_DILATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Move Dilate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_SYMETRY :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Move Symetry");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Extrude");
+    ButtonText = txt_move;
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Extrude Translate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Extrude Rotate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_DILATE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Extrude Dilate");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Extrude Symetry");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_ELEM_DELETE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Elementary Delete");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_GEOM_PHYS :
+    actual_global_context = CONTEXT_GEOM;
+    CTX.geom.level = PHYSICAL;
+    Msg(INFO, "Physical");
+    ButtonText = txt_phys;
+    break;
+
+  case CONTEXT_GEOM_PHYS_ADD :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Physical Add");
+    ButtonText = txt_phys_add;
+    break;
+
+  case CONTEXT_GEOM_PHYS_DELETE :
+    actual_global_context = CONTEXT_GEOM;
+    Msg(INFO, "Physical Delete");
+    ButtonText = txt_translate_rotate_dilate_symetry_delete;
+    break;
+
+  case CONTEXT_MESH :
+    actual_global_context = CONTEXT_MESH;
+    XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Mesh"), NULL); 
+    Msg(INFO,"");
+    ButtonText = txt_mesh;
+    break;
+
+  case CONTEXT_MESH_DEFINE :
+    actual_global_context = CONTEXT_MESH;
+    Msg(INFO,"Define");
+    ButtonText = txt_mesh_define;
+    break;
+
+  case CONTEXT_POST :
+    actual_global_context = CONTEXT_POST;
+    XtVaSetValues(WID.M.modButt, XmNlabelString, XmStringCreateSimple("Post Processing"), NULL);
+    Msg(INFO,"");
+    UpdatePostButtons();
+    return;    
+
+  default :
+    Msg(WARNING, "Unknown Event in ActualizeContextCb : %d", actual_context); 
+    return;
+
+  }
+
+  last = 0;
+
+  if(XtIsManaged(WID.M.defaultButt)) XtUnmanageChild(WID.M.defaultButt);
+
+  for(i=0 ; i < NB_BUTT_MAX ; i++){
+
+    if(!last && ButtonText[i] != NULL){
+      if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]);
+      XtVaSetValues(WID.M.pushButt[i], 
+		    XmNlabelString,XmStringCreateSimple(ButtonText[i]),
+		    NULL);
+      XtManageChild(WID.M.pushButt[i]);
+    }
+    else {
+      last = 1 ;
+      if(XtIsManaged(WID.M.pushButt[i])) XtUnmanageChild(WID.M.pushButt[i]);
+      if(XtIsManaged(WID.M.toggleButt[i])) XtUnmanageChild(WID.M.toggleButt[i]);
+    }
+  }
+}  
+
+#undef NB_HISTORY_MAX
+
+
+void PreviousContextCb (Widget w, XtPointer client_data, XtPointer call_data){
+  ActualizeContextCb(w,client_data,call_data);
+}
+
+void NextContextCb (Widget w, XtPointer client_data, XtPointer call_data){
+
+  switch(actual_context){
+
+  case CONTEXT_GEOM :
+    switch((long int)client_data){
+    case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM,call_data); break;
+    case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS,call_data); break;
+    case 3: geom_event_handler(GEOM_PARSE); break;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM :
+    switch((long int)client_data){
+    case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD,call_data); break;
+    case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE,call_data); break;
+    case 3: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE,call_data); break;
+    case 4: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_DELETE,call_data); break;
+    case 5: geom_event_handler(GEOM_ELEM_SKETCH); break;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD :
+    switch((long int)client_data){
+    case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_NEW,call_data); break;
+    case 2: 
+      XtManageChild(WID.GD.tranDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_TRANSLATE,call_data);
+      break;
+    case 3:
+      XtManageChild(WID.GD.rotDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_ROTATE,call_data);
+      break;
+    case 4:
+      XtManageChild(WID.GD.dilatDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_DILATE,call_data);
+      break;
+    case 5: 
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_ADD_SYMETRY,call_data); 
+      break;
+    }
+    break;    
+
+  case CONTEXT_GEOM_ELEM_ADD_NEW :
+    switch((long int)client_data){
+    case 1: XtManageChild(WID.GD.paramDialog); break ;
+    case 2: XtManageChild(WID.GD.pointDialog); break ;
+    case 3: geom_event_handler(GEOM_ELEM_ADD_NEW_LINE); break;
+    case 4: geom_event_handler(GEOM_ELEM_ADD_NEW_SPLINE); break;
+    case 5: geom_event_handler(GEOM_ELEM_ADD_NEW_BEZIER); break;
+    case 6: geom_event_handler(GEOM_ELEM_ADD_NEW_BSPLINE); break;
+    case 7: geom_event_handler(GEOM_ELEM_ADD_NEW_CIRCLE); break;
+    case 8: geom_event_handler(GEOM_ELEM_ADD_NEW_ELLIPSIS); break;
+    case 9: geom_event_handler(GEOM_ELEM_ADD_NEW_PLANE_SURF); break;
+    case 10:geom_event_handler(GEOM_ELEM_ADD_NEW_RULED_SURF); break;
+    case 11:geom_event_handler(GEOM_ELEM_ADD_NEW_NURBS_SURF); break;
+    case 12:geom_event_handler(GEOM_ELEM_ADD_NEW_VOLUME); break;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_TRANSLATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_ADD_TRANSLATE_SURF); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_ROTATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_ADD_ROTATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_ADD_ROTATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_ADD_ROTATE_SURF); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_DILATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_ADD_DILATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_ADD_DILATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_ADD_DILATE_SURF); break ;
+    case 4: break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_ADD_SYMETRY :
+    Msg(WARNING, "CONTEXT_GEOM_ELEM_ADD_SYMETRY not done yet!"); 
+    break;
+     
+  case CONTEXT_GEOM_ELEM_MOVE :
+    switch((long int)client_data){
+    case 1:
+      XtManageChild(WID.GD.tranDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_TRANSLATE,call_data);
+      break;
+    case 2:
+      XtManageChild(WID.GD.rotDialog);
+      ActualizeContextCb(w,(XtPointer) CONTEXT_GEOM_ELEM_MOVE_ROTATE,call_data);
+      break;
+    case 3:
+      XtManageChild(WID.GD.dilatDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_DILATE,call_data);
+      break;
+    case 4:
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_MOVE_SYMETRY,call_data);
+      break;
+    }
+    break;    
+
+  case CONTEXT_GEOM_ELEM_MOVE_TRANSLATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_MOVE_TRANSLATE_SURF); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_ROTATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_MOVE_ROTATE_SURF); break ;
+    }
+    break;
+    
+  case CONTEXT_GEOM_ELEM_MOVE_DILATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_MOVE_DILATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_MOVE_DILATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_MOVE_DILATE_SURF); break ;
+    case 4: break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_MOVE_SYMETRY :
+    Msg(WARNING, "CONTEXT_GEOM_ELEM_MOVE_SYMETRY not done yet!"); 
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE :
+    switch((long int)client_data){
+    case 1:
+      XtManageChild(WID.GD.tranDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE,call_data);
+      break;
+    case 2:
+      XtManageChild(WID.GD.rotDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE,call_data);
+      break;
+    case 3:
+      XtManageChild(WID.GD.dilatDialog);
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_DILATE,call_data);
+      break;
+    case 4:
+      ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY,call_data);
+      break;
+    }
+    break;    
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_EXTRUDE_TRANSLATE_SURF); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_EXTRUDE_ROTATE_SURF); break ;
+    }
+    break;
+    
+  case CONTEXT_GEOM_ELEM_EXTRUDE_DILATE :
+    Msg(WARNING, "CONTEXT_GEOM_ELEM_EXTRUDE_DILATE not done yet!"); 
+    break;
+
+  case CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY :
+    Msg(WARNING, "CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY not done yet!"); 
+    break;
+     
+  case CONTEXT_GEOM_ELEM_DELETE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_ELEM_DELETE_POINT); break ;
+    case 2: geom_event_handler(GEOM_ELEM_DELETE_LINE); break ;
+    case 3: geom_event_handler(GEOM_ELEM_DELETE_SURF); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_PHYS :
+    switch((long int)client_data){
+    case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS_ADD,call_data); break;
+    case 2: ActualizeContextCb(w,(XtPointer)CONTEXT_GEOM_PHYS_DELETE,call_data); break;
+    }
+    break;
+
+  case CONTEXT_GEOM_PHYS_ADD :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_PHYS_ADD_POINT); break ;
+    case 2: geom_event_handler(GEOM_PHYS_ADD_LINE); break ;
+    case 3: geom_event_handler(GEOM_PHYS_ADD_SURF); break ;
+    case 4: geom_event_handler(GEOM_PHYS_ADD_VOLUME); break ;
+    }
+    break;
+
+  case CONTEXT_GEOM_PHYS_DELETE :
+    switch((long int)client_data){
+    case 1: geom_event_handler(GEOM_PHYS_DELETE_POINT); break ;
+    case 2: geom_event_handler(GEOM_PHYS_DELETE_LINE); break ;
+    case 3: geom_event_handler(GEOM_PHYS_DELETE_SURF); break ;
+    case 4: geom_event_handler(GEOM_PHYS_DELETE_VOLUME); break ;
+    }
+    break;
+    
+  case CONTEXT_MESH :
+
+    switch((long int)client_data){
+    case 1: ActualizeContextCb(w,(XtPointer)CONTEXT_MESH_DEFINE,call_data); break;
+    case 2: mesh_event_handler(MESH_1D); break;
+    case 3: mesh_event_handler(MESH_2D); break;
+    case 4: mesh_event_handler(MESH_3D); break;
+    }
+    break;
+
+  case CONTEXT_MESH_DEFINE :
+    switch((long int)client_data){
+    case 1: 
+      XtManageChild(WID.MD.charLengthDialog);      
+      mesh_event_handler(MESH_DEFINE_CHAR_LENGTH); break;
+    case 2: 
+      mesh_event_handler(MESH_DEFINE_RECOMBINE); break;
+    case 3: 
+      XtManageChild(WID.MD.trsfLineDialog);
+      mesh_event_handler(MESH_DEFINE_TRSF_LINE); break;
+    case 4: 
+      mesh_event_handler(MESH_DEFINE_TRSF_SURFACE); break;
+    case 5: 
+      XtManageChild(WID.MD.trsfVolumeDialog);
+      mesh_event_handler(MESH_DEFINE_TRSF_VOLUME); break;
+    }
+    break;
+
+  default :
+    Msg(WARNING, "Unknown Context in NextContextCb : %d", actual_global_context); 
+    break;
+    
+  }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  PostProcessing specific context changes                                 */
+/* ------------------------------------------------------------------------ */
+
+static int fcmpPostView(const void *v1, const void *v2){
+  return (((Post_View *)v1)->Num - ((Post_View *)v2)->Num);
+}
+
+int AddView(int i, char *Name, int dummy){
+  if(i > NB_BUTT_MAX -1) return 1;
+
+  txt_post[i-1] = (char*)Malloc(NAME_STR_L*sizeof(char));
+  strncpy(txt_post[i-1],Name,NAME_STR_L);
+
+  if(actual_global_context == CONTEXT_POST)
+    ActualizeContextCb(NULL,(XtPointer)actual_global_context,NULL);
+
+  return 0;
+}
+
+void RemoveViewCb(Widget w, XtPointer client_data, XtPointer call_data){
+  Post_View      *v;
+  int            i;
+
+  i = (long int)client_data ;
+
+  while(txt_post[i]){
+    strncpy(txt_post[i-1], txt_post[i], NAME_STR_L);
+    i++;
+  }
+  txt_post[i-1] = NULL;
+
+  v = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1);
+
+  if(v->Allocated){
+
+    for(i=0 ; i<List_Nbr(v->Simplices) ; i++)    
+      Free(((Post_Simplex*)List_Pointer(v->Simplices, i))->V);
+    List_Delete(v->Simplices);
+    
+    for(i=0 ; i<List_Nbr(v->Triangles) ; i++)    
+      Free(((Post_Triangle*)List_Pointer(v->Triangles, i))->V);
+    List_Delete(v->Triangles);
+    
+    for(i=0 ; i<List_Nbr(v->Lines) ; i++)    
+      Free(((Post_Line*)List_Pointer(v->Lines, i))->V);
+    List_Delete(v->Lines);
+    
+    for(i=0 ; i<List_Nbr(v->Points) ; i++)
+      Free(((Post_Point*)List_Pointer(v->Points, i))->V);
+    List_Delete(v->Points);
+    
+  }
+
+  List_Suppress(Post_ViewList, v, fcmpPostView);
+
+  if(actual_global_context == CONTEXT_POST)
+    ActualizeContextCb(NULL,(XtPointer)actual_global_context,NULL);  
+
+  Init();
+  Draw();
+}
+
diff --git a/Unix/CbContext.h b/Unix/CbContext.h
new file mode 100644
index 0000000000000000000000000000000000000000..903049ce6bcfbcbb14a5d957252cbd7b99702ad1
--- /dev/null
+++ b/Unix/CbContext.h
@@ -0,0 +1,32 @@
+#ifndef _CB_CONTEXT_H_
+#define _CB_CONTEXT_H_
+
+#define  CONTEXT_GEOM                         101
+#define  CONTEXT_GEOM_ELEM                    102
+#define  CONTEXT_GEOM_ELEM_ADD                103
+#define  CONTEXT_GEOM_ELEM_ADD_NEW            104
+#define  CONTEXT_GEOM_ELEM_ADD_TRANSLATE      105
+#define  CONTEXT_GEOM_ELEM_ADD_ROTATE         106
+#define  CONTEXT_GEOM_ELEM_ADD_DILATE         107
+#define  CONTEXT_GEOM_ELEM_ADD_SYMETRY        108
+#define  CONTEXT_GEOM_ELEM_MOVE               109
+#define  CONTEXT_GEOM_ELEM_MOVE_TRANSLATE     110
+#define  CONTEXT_GEOM_ELEM_MOVE_ROTATE        111
+#define  CONTEXT_GEOM_ELEM_MOVE_DILATE        112
+#define  CONTEXT_GEOM_ELEM_MOVE_SYMETRY       113
+#define  CONTEXT_GEOM_ELEM_EXTRUDE            114
+#define  CONTEXT_GEOM_ELEM_EXTRUDE_TRANSLATE  115
+#define  CONTEXT_GEOM_ELEM_EXTRUDE_ROTATE     116
+#define  CONTEXT_GEOM_ELEM_EXTRUDE_DILATE     117
+#define  CONTEXT_GEOM_ELEM_EXTRUDE_SYMETRY    118
+#define  CONTEXT_GEOM_ELEM_DELETE             119
+#define  CONTEXT_GEOM_PHYS                    120
+#define  CONTEXT_GEOM_PHYS_ADD                121
+#define  CONTEXT_GEOM_PHYS_DELETE             122
+#define  CONTEXT_MESH                         123
+#define  CONTEXT_MESH_DEFINE                  124
+#define  CONTEXT_POST                         125
+#define  CONTEXT_BACKWARD                     126
+#define  CONTEXT_FORWARD                      127
+
+#endif
diff --git a/Unix/CbFile.cpp b/Unix/CbFile.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..64b2f51a3734d4cb090f0347953dbf36efc5d72b
--- /dev/null
+++ b/Unix/CbFile.cpp
@@ -0,0 +1,157 @@
+
+#include <unistd.h>
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Main.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "ColorTable.h"
+#include "XContext.h"
+
+#include "CbFile.h"
+#include "CbColorbar.h"
+
+#include "XDump.h"
+#include "gl2ps.h"
+#include "gl2gif.h"
+
+extern Context_T   CTX;
+extern XContext_T  XCTX;
+extern Widgets_T   WID;
+extern Mesh        M;
+extern int         WARNING_OVERRIDE;
+
+/* ------------------------------------------------------------------------ */
+/*  C r e a t e I m a g e                                                   */
+/* ------------------------------------------------------------------------ */
+
+static char KeepFileName[256];
+
+void SaveToDisk (char *FileName, Widget warning, 
+		 void (*function)(FILE *file)){
+  FILE    *fp ;
+
+  if(!WARNING_OVERRIDE){
+    fp = fopen(FileName,"r");
+    if(fp) {      
+      XtManageChild(warning);
+      WARNING_OVERRIDE = 1;
+      strcpy(KeepFileName,FileName);
+      fclose(fp);
+      return;
+    }
+    else{
+      strcpy(KeepFileName,FileName);
+    }
+  }
+
+  if(!(fp = fopen(KeepFileName,"w"))) {
+    Msg(WARNING, "Unable to open file '%s'", KeepFileName); 
+    WARNING_OVERRIDE = 0;
+    return;
+  }
+
+  function(fp);
+
+  fclose(fp);
+
+  WARNING_OVERRIDE = 0;
+}
+
+void CreateImage (FILE *fp) {
+  FILE    *tmp;
+  GLint    size3d;
+  char     cmd[1000];
+  char     *tmpFileName="tmp.xwd";
+  int      res;
+
+  switch(CTX.print.type){
+    
+  case XDUMP :    
+    switch(CTX.print.format){
+    case FORMAT_XPM :
+      Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), fp);    
+      break;
+    case FORMAT_PS :
+    case FORMAT_EPS :
+      tmp = fopen(tmpFileName,"w");
+      Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), tmp);
+      fclose(tmp);
+      sprintf(cmd, "xpr -device ps -gray 4 %s >%s", tmpFileName, KeepFileName);
+      Msg(INFOS, "Executing: %s\n", cmd);
+      system(cmd);
+      unlink(tmpFileName);
+      break;
+    }
+    Msg(INFOS, "X image dump complete: '%s'", KeepFileName);
+    break ;
+
+  case GIF :
+    create_gif(fp, CTX.viewport[2]-CTX.viewport[0],
+	       CTX.viewport[3]-CTX.viewport[1]);
+    Msg(INFOS, "GIF dump complete: '%s'", KeepFileName);
+    break;
+
+  case GLPRPAINTER :
+  case GLPRRECURSIVE :
+    size3d = 0 ;
+    res = GL2PS_OVERFLOW ;
+    while(res == GL2PS_OVERFLOW){
+      size3d += 1024*1024 ;
+      gl2psBeginPage(TheBaseFileName, "Gmsh", 
+		     (CTX.print.type == GLPRPAINTER ? 
+		      GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT),
+		     GL2PS_SIMPLE_LINE_OFFSET | GL2PS_DRAW_BACKGROUND,
+		     GL_RGBA, 0, NULL, size3d, fp);
+      CTX.stream = TO_FILE ;
+      Init();
+      Draw();
+      CTX.stream = TO_SCREEN ;
+      res = gl2psEndPage();
+    }
+    Msg(INFOS, "GL2PS postscript output complete: '%s'", KeepFileName);
+    break;
+
+  default :
+    Msg(WARNING, "Unknown print type");
+    break;
+  }
+
+}
+
+/* ------------------------------------------------------------------------ */
+/*  file                                                                    */
+/* ------------------------------------------------------------------------ */
+
+void SaveColorTable(FILE *fp);
+
+void FileCb(Widget w, XtPointer client_data, XtPointer call_data){
+  char      *c;
+  XmString  xms;
+  
+  if((long int)client_data == FILE_SAVE_MESH){
+    Print_Mesh(&M, NULL, CTX.mesh.format); 
+    return;
+  }
+
+  XtVaGetValues(w, XmNtextString, &xms, NULL);
+  XmStringGetLtoR(xms, XmSTRING_DEFAULT_CHARSET, &c);
+  XmStringFree(xms);
+  
+  switch ((long int)client_data) {
+  case FILE_LOAD_GEOM          : OpenProblem(c); Init(); Draw(); break;
+  case FILE_LOAD_POST          : MergeProblem(c); ColorBarRedraw(); Init(); Draw(); break;
+  case FILE_SAVE_MESH_AS       : Print_Mesh(&M, c, CTX.mesh.format); break;
+  case FILE_SAVE_COLORTABLE_AS : SaveToDisk(c, WID.ED.saveDialog, SaveColorTable); break;
+  case FILE_CANCEL             : WARNING_OVERRIDE = 0; break;
+  case FILE_PRINT              : SaveToDisk(c, WID.ED.printDialog, CreateImage); Init(); Draw(); break;
+  default :
+    Msg(WARNING, "Unknown event in FileCb : %d", (long int)client_data); 
+    break;
+  }
+
+}
+
diff --git a/Unix/CbFile.h b/Unix/CbFile.h
new file mode 100644
index 0000000000000000000000000000000000000000..67f8eec775ed02f8c916fca3cd2ef7427ee2187c
--- /dev/null
+++ b/Unix/CbFile.h
@@ -0,0 +1,12 @@
+#ifndef _CB_FILE_H_
+#define _CB_FILE_H_
+
+#define  FILE_LOAD_GEOM                         301
+#define  FILE_LOAD_POST                         302
+#define  FILE_SAVE_MESH                         303
+#define  FILE_SAVE_MESH_AS                      304
+#define  FILE_SAVE_COLORTABLE_AS                305
+#define  FILE_PRINT                             306
+#define  FILE_CANCEL                            308
+
+#endif
diff --git a/Unix/CbGeneral.cpp b/Unix/CbGeneral.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b4c3314d24b0d44cc1bd505c91c4776c614e4b53
--- /dev/null
+++ b/Unix/CbGeneral.cpp
@@ -0,0 +1,191 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Views.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Widgets.h"
+
+extern Context_T   CTX;
+extern XContext_T  XCTX;
+extern Widgets_T   WID;
+
+extern List_T    *Post_ViewList;
+
+extern void GetStatistics(double s[50]);
+
+static char label[32];
+
+/* ------------------------------------------------------------------------ 
+    E x i t C b                                                             
+   ------------------------------------------------------------------------ */
+
+void ExitCb(Widget w, XtPointer cd, XtPointer cb){
+  exit(0);
+}
+
+/* ------------------------------------------------------------------------ 
+    M a n a g e C b                                                         
+   ------------------------------------------------------------------------ */
+
+void ManageCb (Widget w, XtPointer client_data, XtPointer call_data){
+  XtIsManaged((Widget)client_data) ? 
+    XtUnmanageChild((Widget)client_data) : 
+    XtManageChild((Widget)client_data) ;
+}
+
+
+/* ------------------------------------------------------------------------ 
+    P o p u p H a n d l e r                                                 
+   ------------------------------------------------------------------------ */
+
+void PopupHandler (Widget w, Widget pw, XEvent *event, Boolean *ctd ){
+  if(((XButtonEvent *)event)->button != Button3) return;
+
+  /* force the pointer to be slightly over the remove button */
+  ((XButtonEvent *)event)->x_root -= 7 ;
+  ((XButtonEvent *)event)->y_root -= 7 ;
+
+  XmMenuPosition(pw, (XButtonEvent *)event);
+  XtManageChild(pw);
+}
+
+
+
+/* ------------------------------------------------------------------------ 
+    CurrentInfoCb
+   ------------------------------------------------------------------------ */
+
+void CurrentInfoCb (Widget w, XtPointer client_data, XtPointer call_data){
+  double  s[50];
+  int     i;
+  Post_View  *v ;
+
+  if((long int)client_data && XtIsManaged(WID.OD.infoDialog)){
+    XtUnmanageChild(WID.OD.infoDialog);
+  }
+  else{
+    GetStatistics(s);
+
+#define VLAB(caca)  WID.OD.infoValueLabel[(caca)], XmNlabelString, \
+                    XmStringCreateSimple(label), NULL
+
+    /* info geom */
+    sprintf(label, "%g", s[0]);   XtVaSetValues(VLAB(0));
+    sprintf(label, "%g", s[1]/2); XtVaSetValues(VLAB(1));
+    sprintf(label, "%g", s[2]);   XtVaSetValues(VLAB(2));
+    sprintf(label, "%g", s[3]);   XtVaSetValues(VLAB(3));
+						
+    /* info mesh */				
+    sprintf(label, "%g", s[4]);   XtVaSetValues(VLAB(4));
+    sprintf(label, "%g", s[5]);   XtVaSetValues(VLAB(5));
+    sprintf(label, "%g", s[6]);   XtVaSetValues(VLAB(6));
+    sprintf(label, "%g", s[7]);   XtVaSetValues(VLAB(7));
+    sprintf(label, "%g", s[8]);   XtVaSetValues(VLAB(8));
+    sprintf(label, "%g", s[9]);   XtVaSetValues(VLAB(9));
+    sprintf(label, "%g", s[10]);  XtVaSetValues(VLAB(10));
+    sprintf(label, "%g", s[11]);  XtVaSetValues(VLAB(11));
+    sprintf(label, "%g", s[12]);  XtVaSetValues(VLAB(12));
+    sprintf(label, "%g", s[13]);  XtVaSetValues(VLAB(13));
+    sprintf(label, "%g", s[14]);  XtVaSetValues(VLAB(14));
+
+    sprintf(label, "%.4g (%.4g->%.4g)", s[17], s[19], s[18]); XtVaSetValues(VLAB(15));
+    sprintf(label, "%.4g (%.4g->%.4g)", s[20], s[22], s[21]); XtVaSetValues(VLAB(16));
+    sprintf(label, "%.4g (%.4g->%.4g)", s[23], s[25], s[24]); XtVaSetValues(VLAB(17));
+
+    /* info post */
+
+    s[15] = Post_ViewList ? List_Nbr(Post_ViewList) : 0 ;
+    sprintf(label, "%g", s[15]); XtVaSetValues(VLAB(18));
+
+    s[16] = s[17] = s[18] = s[19] = 0 ;
+    if(Post_ViewList){
+      for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){
+	v = (Post_View*)List_Pointer(Post_ViewList, i);
+	if(v->Visible){
+	  s[16] += List_Nbr(v->Points);
+	  s[17] += List_Nbr(v->Lines);
+	  s[18] += List_Nbr(v->Triangles);
+	  s[19] += List_Nbr(v->Simplices);
+	}
+      }
+    }
+    sprintf(label, "%g", s[16]); XtVaSetValues(VLAB(19));
+    sprintf(label, "%g", s[17]); XtVaSetValues(VLAB(20));
+    sprintf(label, "%g", s[18]); XtVaSetValues(VLAB(21));
+    sprintf(label, "%g", s[19]); XtVaSetValues(VLAB(22));
+
+#undef VLAB
+
+    if((long int)client_data)
+      XtManageChild(WID.OD.infoDialog) ;
+    else
+      XmUpdateDisplay(WID.OD.infoDialog);
+  }
+  
+}
+
+/* ------------------------------------------------------------------------ 
+    set_XXX
+   ------------------------------------------------------------------------ */
+
+void set_r(int i, double val){
+  if(!CTX.rlock[i]){
+    CTX.r[i] = val;
+    if(XtIsManaged(WID.OD.viewportDialog)){
+      sprintf(label, "%.5g", CTX.r[i]);
+      XtVaSetValues(WID.OD.viewportText[0][i], XmNvalue, label, NULL);
+      XmUpdateDisplay(WID.OD.viewportText[0][i]);  
+    }
+  }
+}
+
+void set_t(int i, double val){
+  if(!CTX.tlock[i]){
+    CTX.t[i] = val;
+    if(XtIsManaged(WID.OD.viewportDialog)){
+      sprintf(label, "%.5g", CTX.t[i]);
+      XtVaSetValues(WID.OD.viewportText[1][i], XmNvalue, label, NULL);
+      XmUpdateDisplay(WID.OD.viewportText[1][i]);  
+    }
+  }
+}
+
+void set_s(int i, double val){
+  if(!CTX.slock[i]){
+    CTX.s[i] = val;
+    if(XtIsManaged(WID.OD.viewportDialog)){
+      sprintf(label, "%.5g", CTX.s[i]);
+      XtVaSetValues(WID.OD.viewportText[2][i], XmNvalue, label, NULL);
+      XmUpdateDisplay(WID.OD.viewportText[2][i]);  
+    }
+  }
+}
+
+
+/* ------------------------------------------------------------------------ 
+    CurrentViewportCb
+   ------------------------------------------------------------------------ */
+
+void CurrentViewportCb (Widget w, XtPointer client_data, XtPointer call_data){
+  int     i;
+
+  if(XtIsManaged(WID.OD.viewportDialog)){ 
+    XtUnmanageChild(WID.OD.viewportDialog);
+  }
+  else{
+    for(i=0 ; i<3 ; i++){
+      sprintf(label, "%.5g", CTX.r[i]);
+      XtVaSetValues(WID.OD.viewportText[0][i], XmNvalue, label, NULL);
+      sprintf(label, "%.5g", CTX.t[i]);
+      XtVaSetValues(WID.OD.viewportText[1][i], XmNvalue, label, NULL);
+      sprintf(label, "%.5g", CTX.s[i]);
+      XtVaSetValues(WID.OD.viewportText[2][i], XmNvalue, label, NULL);
+    }    
+    XtManageChild(WID.OD.viewportDialog) ;    
+  }
+
+}
+
diff --git a/Unix/CbGeneral.h b/Unix/CbGeneral.h
new file mode 100644
index 0000000000000000000000000000000000000000..d9854cb8778c0403ccc2a36b88849f260360f503
--- /dev/null
+++ b/Unix/CbGeneral.h
@@ -0,0 +1,8 @@
+#ifndef _CB_GENERAL_H_
+#define _CB_GENERAL_H_
+
+void set_r(int i, double val);
+void set_t(int i, double val);
+void set_s(int i, double val);
+
+#endif
diff --git a/Unix/CbGeom.cpp b/Unix/CbGeom.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..418f00dd257688dfe1471fc8ef86b978f65b3e49
--- /dev/null
+++ b/Unix/CbGeom.cpp
@@ -0,0 +1,576 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "Verif.h"
+#include "Main.h"
+
+#include "CbGeom.h"
+
+extern Context_T  CTX;
+extern Widgets_T  WID;
+
+extern Mesh       M;
+extern char       TheFileName[256];
+
+extern char     x_text[100], y_text[100], z_text[100], l_text[100];
+extern char     tx_text[100], ty_text[100], tz_text[100];
+extern char     px_text[100], py_text[100], pz_text[100], angle_text[100];
+extern char     ax_text[100], ay_text[100], az_text[100], angle_text[100];
+extern char     dx_text[100], dy_text[100], dz_text[100], df_text[100];
+
+static char     name_text[100], value_text[100];
+
+int SelectContour (int type, int num, List_T *Liste1){
+  int      k,ip,i;
+  List_T  *Liste2;
+
+  Liste2 = List_Create(1,1,sizeof(int));
+
+  if(!List_Nbr(Liste1)){
+    switch(type){
+    case ENT_LINE    : k = alledgeslinked (num, Liste1, (List_T*)NULL); break;
+    case ENT_SURFACE : k = allfaceslinked (num, Liste1, (List_T*)NULL); break;
+    }
+  }
+  else{
+    List_Reset(Liste2);
+    for(i=0;i<List_Nbr(Liste1);i++)
+      List_Add(Liste2,List_Pointer(Liste1,i));
+    List_Reset(Liste1);
+    switch(type){
+    case ENT_LINE    : k = alledgeslinked (num, Liste1, Liste2); break;
+    case ENT_SURFACE : k = allfaceslinked (num, Liste1, Liste2); break;
+    }
+  }
+
+  for(i=0;i<List_Nbr(Liste1);i++){
+    List_Read(Liste1,i,&ip);
+    switch(type){
+    case ENT_LINE    : highlight_entity_num(0,abs(ip),0,1); break ;
+    case ENT_SURFACE : highlight_entity_num(0,0,abs(ip),1); break ;
+    }
+  }
+
+  List_Delete(Liste2);
+  return k;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  g e o m _ e v e n t _ h a n d l e r                                     */
+/* ------------------------------------------------------------------------ */
+
+void geom_event_handler (int event) {
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  static int n=0, p[100];
+
+  int      ib,zone,type;
+  List_T  *Liste1, *Liste2;
+
+  if(CTX.threads_lock) return ;
+
+  switch (event) {
+
+  case GEOM_PARSE :
+    OpenProblem(TheFileName);
+    Init();
+    Draw();
+    break;
+
+  case GEOM_ELEM_ADD_NEW_POINT :
+    add_point(TheFileName);
+    ZeroHighlight(&M);
+    Replot();
+    break;
+
+  case GEOM_ELEM_ADD_NEW_LINE :
+  case GEOM_ELEM_ADD_NEW_SPLINE :   
+  case GEOM_ELEM_ADD_NEW_BEZIER :
+  case GEOM_ELEM_ADD_NEW_BSPLINE :
+    n=0;
+    while(1){
+      Msg(STATUS,"Select Point: (e) to end, (q) to quit");
+      ib = SelectEntity(ENT_POINT, &v,&c,&s);
+      if(ib == 1){ /* left mouse butt */
+	p[n++] = v->Num; 
+      }
+      if (ib == -1){ /* 'e' */
+	if(n >= 2) {
+	  switch(event){
+	  case GEOM_ELEM_ADD_NEW_LINE   : add_multline(n,p,TheFileName); break;
+	  case GEOM_ELEM_ADD_NEW_SPLINE : add_spline  (n,p,TheFileName); break;
+	  case GEOM_ELEM_ADD_NEW_BEZIER : add_bezier  (n,p,TheFileName); break;
+	  case GEOM_ELEM_ADD_NEW_BSPLINE: add_bspline (n,p,TheFileName); break;
+	  }
+	}
+	n=0;
+	ZeroHighlight(&M);
+	Replot();
+      }
+      if(ib == 0){ /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+    }
+    break;
+
+  case GEOM_ELEM_ADD_NEW_CIRCLE :
+    n=0;
+    while(1){
+      if(n == 0) Msg(STATUS,"Select Center: (q) to quit");
+      if(n == 1) Msg(STATUS,"Select Starting Point: (q) to quit");
+      if(n == 2) Msg(STATUS,"Select Ending Point: (q) to quit");
+      ib = SelectEntity(ENT_POINT, &v,&c,&s);
+      if(ib == 1) { /* left mouse butt */
+	p[n++] = v->Num; 
+      }
+      if(ib == 0) { /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      if(n == 3){
+	add_circ(p[1],p[0],p[2],TheFileName); /* begin, center, end */
+	ZeroHighlight(&M);
+	Replot();
+	n=0;
+      }
+    }
+    break;
+
+  case GEOM_ELEM_ADD_NEW_ELLIPSIS :
+    n = 0;
+    while(1){
+      if(n == 0) Msg(STATUS,"Select Center: (q) to quit");
+      if(n == 1) Msg(STATUS,"Select an Axis Point: (q) to quit");
+      if(n == 2) Msg(STATUS,"Select Starting Point: (q) to quit");
+      if(n == 3) Msg(STATUS,"Select Ending Point: (q) to quit");
+      ib = SelectEntity(ENT_POINT, &v,&c,&s);
+      if(ib == 1) { /* left mouse butt */
+	p[n++] = v->Num; 
+      }
+      if(ib == 0){ /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      if(n == 4){
+	add_ell(p[3],p[2],p[0],p[1],TheFileName);
+	ZeroHighlight(&M);
+	Replot();
+	n=0;
+      }
+    }
+    break;
+
+  case GEOM_ELEM_ADD_NEW_PLANE_SURF :
+  case GEOM_ELEM_ADD_NEW_RULED_SURF :
+  case GEOM_ELEM_ADD_NEW_VOLUME :
+    Liste1 = List_Create(10,10,sizeof(int));
+    Liste2 = List_Create(10,10,sizeof(int));
+
+    if(event == GEOM_ELEM_ADD_NEW_VOLUME)
+      type = ENT_SURFACE;
+    else
+      type = ENT_LINE;      
+
+    while(1){      
+      List_Reset(Liste1);
+      List_Reset(Liste2);
+      
+      while(1) {	
+	Msg(STATUS,"Select Boundary: (q) to quit");
+	ib = SelectEntity(type, &v,&c,&s);
+	if(ib <= 0){
+	  ZeroHighlight(&M);
+	  Replot();
+	  goto stopall;
+	}  	
+	if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){
+	  if(type==ENT_LINE) 
+	    add_loop(Liste1,TheFileName,&zone);
+	  else
+	    add_vol(Liste1,TheFileName,&zone);
+	  List_Reset(Liste1);
+	  List_Add(Liste2,&zone);
+	  while(1){
+	    Msg(STATUS,"Select Holes: (q) to quit");
+	    ib = SelectEntity(type, &v,&c,&s); 
+	    if(ib <= 0){
+	      ZeroHighlight(&M);
+	      Replot();
+	      break;
+	    }
+	    List_Reset(Liste1);
+	    if(SelectContour (type, (type==ENT_LINE)?c->Num:s->Num, Liste1)){
+	      if(type==ENT_LINE) 
+		add_loop(Liste1,TheFileName,&zone);
+	      else
+		add_vol(Liste1,TheFileName,&zone);
+	      List_Reset(Liste1);
+	      List_Add(Liste2,&zone);
+	    }
+	  }
+	  if(List_Nbr(Liste2)){
+	    switch(event){
+	    case GEOM_ELEM_ADD_NEW_RULED_SURF : add_surf(Liste2,TheFileName,0,1); break;
+	    case GEOM_ELEM_ADD_NEW_PLANE_SURF : add_surf(Liste2,TheFileName,0,2); break;
+	    case GEOM_ELEM_ADD_NEW_VOLUME :  add_multvol(Liste2,TheFileName); break;
+	    }
+	    ZeroHighlight(&M);
+	    Replot();
+	    break;
+	  }
+	}
+      }
+    }
+    stopall : ;
+    List_Delete(Liste1);
+    List_Delete(Liste2);
+    break;
+
+
+  case GEOM_ELEM_ADD_TRANSLATE_POINT :
+  case GEOM_ELEM_MOVE_TRANSLATE_POINT :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      translate_pt(event==GEOM_ELEM_ADD_TRANSLATE_POINT?1:0,v->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_TRANSLATE_LINE :
+  case GEOM_ELEM_MOVE_TRANSLATE_LINE :
+    while(1){
+      Msg(STATUS,"Select Line: (q) to quit");
+      if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      translate_seg(event==GEOM_ELEM_ADD_TRANSLATE_LINE?1:0,c->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_TRANSLATE_SURF :
+  case GEOM_ELEM_MOVE_TRANSLATE_SURF :
+    while(1){
+      Msg(STATUS,"Select Surface: (q) to quit");
+      if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      translate_surf(event==GEOM_ELEM_ADD_TRANSLATE_SURF?1:0,s->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+
+
+  case GEOM_ELEM_ADD_ROTATE_POINT :
+  case GEOM_ELEM_MOVE_ROTATE_POINT :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      rotate(event==GEOM_ELEM_ADD_ROTATE_POINT?1:0,v->Num,TheFileName,"Point");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_ROTATE_LINE :
+  case GEOM_ELEM_MOVE_ROTATE_LINE :
+    while(1){
+      Msg(STATUS,"Select Line: (q) to quit");
+      if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      rotate(event==GEOM_ELEM_ADD_ROTATE_LINE?1:0,c->Num,TheFileName,"Line");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_ROTATE_SURF :
+  case GEOM_ELEM_MOVE_ROTATE_SURF :
+    while(1){
+      Msg(STATUS,"Select Surface: (q) to quit");
+      if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      rotate(event==GEOM_ELEM_ADD_ROTATE_SURF?1:0,s->Num,TheFileName,"Surface");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+
+
+
+  case GEOM_ELEM_EXTRUDE_TRANSLATE_POINT :
+  case GEOM_ELEM_EXTRUDE_ROTATE_POINT :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot(); 
+	break;
+      }
+      event==GEOM_ELEM_EXTRUDE_TRANSLATE_POINT ? 
+	extrude(v->Num,TheFileName, "Point") :
+	protude(v->Num,TheFileName, "Point") ;
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_EXTRUDE_TRANSLATE_LINE :
+  case GEOM_ELEM_EXTRUDE_ROTATE_LINE :
+    while(1){
+      Msg(STATUS,"Select Line: (q) to quit");
+      if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      event==GEOM_ELEM_EXTRUDE_TRANSLATE_LINE ? 
+	extrude(c->Num,TheFileName, "Line") :
+	protude(c->Num,TheFileName, "Line") ;
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_EXTRUDE_TRANSLATE_SURF :
+  case GEOM_ELEM_EXTRUDE_ROTATE_SURF :
+    while(1){
+      Msg(STATUS,"Select Surface: (q) to quit");
+      if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      event==GEOM_ELEM_EXTRUDE_TRANSLATE_SURF ? 
+	extrude(s->Num,TheFileName, "Surface") :
+	protude(s->Num,TheFileName, "Surface") ;
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+
+
+  case GEOM_ELEM_ADD_DILATE_POINT :
+  case GEOM_ELEM_MOVE_DILATE_POINT :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      dilate(event==GEOM_ELEM_ADD_DILATE_POINT?1:0,v->Num,TheFileName,"Point");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_DILATE_LINE :
+  case GEOM_ELEM_MOVE_DILATE_LINE :
+    while(1){
+      Msg(STATUS,"Select Line: (q) to quit");
+      if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      dilate(event==GEOM_ELEM_ADD_DILATE_LINE?1:0,c->Num,TheFileName,"Line");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_ADD_DILATE_SURF :
+  case GEOM_ELEM_MOVE_DILATE_SURF :
+    while(1){
+      Msg(STATUS,"Select Surface: (q) to quit");
+      if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      dilate(event==GEOM_ELEM_ADD_DILATE_SURF?1:0,s->Num,TheFileName,"Surface");
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+
+
+
+
+  case GEOM_ELEM_DELETE_POINT :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_POINT, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      del_pnt(v->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_DELETE_LINE :
+    while(1){
+      Msg(STATUS,"Select Line: (q) to quit");
+      if(!SelectEntity(ENT_LINE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      del_seg(c->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+  case GEOM_ELEM_DELETE_SURF :
+    while(1){
+      Msg(STATUS,"Select Point: (q) to quit");
+      if(!SelectEntity(ENT_SURFACE, &v,&c,&s)){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+      del_srf(s->Num,TheFileName);
+      ZeroHighlight(&M);
+      Replot();
+    }
+    break;
+
+
+  case GEOM_ELEM_SKETCH :
+    Msg(STATUS,"Verifying Geometry");
+    add_infile("Coherence;",TheFileName);
+    ZeroHighlight(&M);
+    Replot();
+    break;
+
+  case GEOM_PHYS_ADD_POINT:
+  case GEOM_PHYS_ADD_LINE:
+  case GEOM_PHYS_ADD_SURF:
+    Liste1 = List_Create(5,5,sizeof(int));
+    while(1){
+      switch(event){
+	case GEOM_PHYS_ADD_POINT:
+	  Msg(STATUS,"Select Point: (e) to end, (q) to quit"); 
+	  type = 0;
+	  break;
+	case GEOM_PHYS_ADD_LINE:
+	  Msg(STATUS,"Select Line: (e) to end, (q) to quit"); 
+	  type = 1;
+	  break;
+	case GEOM_PHYS_ADD_SURF:
+	  Msg(STATUS,"Select Surface: (e) to end, (q) to quit"); 
+	  type = 2;
+	  break;
+      }
+      ib = SelectEntity(type, &v,&c,&s);
+      if(ib == 1){ /* left mouse */
+	switch(event){
+	case GEOM_PHYS_ADD_POINT: List_Add(Liste1, &v->Num); break;
+	case GEOM_PHYS_ADD_LINE:  List_Add(Liste1, &c->Num); break;
+	case GEOM_PHYS_ADD_SURF:  List_Add(Liste1, &s->Num); break;
+	}
+      }
+      if(ib == -1){ /* end */
+	if(List_Nbr(Liste1)){
+	  add_physical_entity(Liste1,TheFileName,type,&zone);
+	  List_Reset(Liste1);
+	  ZeroHighlight(&M);
+	  Replot();
+	}
+      }
+      if(ib == 0){
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+    }
+    break;
+
+  case GEOM_PHYS_ADD_VOLUME :  
+  case GEOM_PHYS_DELETE_POINT :
+  case GEOM_PHYS_DELETE_LINE :
+  case GEOM_PHYS_DELETE_SURF :
+  case GEOM_PHYS_DELETE_VOLUME :
+  case GEOM_ELEM_ADD_NEW_NURBS_SURF :
+    Msg(WARNING, "Not done interactively yet. Sorry!"); 
+    break;
+
+  default :
+    Msg(WARNING, "Unknown event in geom_event_handler"); 
+    break;
+
+  }
+
+  Msg(STATUS,"Ready");
+}
+
+
+/* ------------------------------------------------------------------------ 
+    G e o m C b                                                       
+   ------------------------------------------------------------------------ */
+
+void GeomCb (Widget w, XtPointer client_data, XtPointer call_data){
+
+  switch((long int)client_data){
+
+  case GEOM_PARAMETER_ADD   : add_param(name_text,value_text,TheFileName); break;
+  case GEOM_PARAMETER_NAME  : strcpy(name_text,XmTextGetString(w)); break;
+  case GEOM_PARAMETER_VALUE : strcpy(value_text,XmTextGetString(w)); break;
+  case GEOM_POINT_ADD  : geom_event_handler(GEOM_ELEM_ADD_NEW_POINT); Replot(); break;
+  case GEOM_POINT_X    : strcpy(x_text,XmTextGetString(w)); break;
+  case GEOM_POINT_Y    : strcpy(y_text,XmTextGetString(w)); break;
+  case GEOM_POINT_Z    : strcpy(z_text,XmTextGetString(w)); break;
+  case GEOM_POINT_L    : strcpy(l_text,XmTextGetString(w)); break;
+  case GEOM_TRAN_X     : strcpy(tx_text,XmTextGetString(w)); break;
+  case GEOM_TRAN_Y     : strcpy(ty_text,XmTextGetString(w)); break;
+  case GEOM_TRAN_Z     : strcpy(tz_text,XmTextGetString(w)); break;
+  case GEOM_ROT_PX     : strcpy(px_text,XmTextGetString(w)); break;
+  case GEOM_ROT_PY     : strcpy(py_text,XmTextGetString(w)); break;
+  case GEOM_ROT_PZ     : strcpy(pz_text,XmTextGetString(w)); break;
+  case GEOM_ROT_AX     : strcpy(ax_text,XmTextGetString(w)); break;  
+  case GEOM_ROT_AY     : strcpy(ay_text,XmTextGetString(w)); break; 
+  case GEOM_ROT_AZ     : strcpy(az_text,XmTextGetString(w)); break;
+  case GEOM_ROT_ANGLE  : strcpy(angle_text,XmTextGetString(w)); break;
+  case GEOM_DILAT_X    : strcpy(dx_text,XmTextGetString(w)); break;
+  case GEOM_DILAT_Y    : strcpy(dy_text,XmTextGetString(w)); break;
+  case GEOM_DILAT_Z    : strcpy(dz_text,XmTextGetString(w)); break;
+  case GEOM_DILAT_F    : strcpy(df_text,XmTextGetString(w)); break;
+
+  default :
+    Msg(WARNING, "Unknown value in GeomCb : %d", (long int)client_data); 
+    break;
+
+  }
+}
+
diff --git a/Unix/CbGeom.h b/Unix/CbGeom.h
new file mode 100644
index 0000000000000000000000000000000000000000..ec4c7579e8e806474a8fdad14d0d7ec42c255132
--- /dev/null
+++ b/Unix/CbGeom.h
@@ -0,0 +1,83 @@
+#ifndef _CB_GEOM_H_
+#define _CB_GEOM_H_
+
+/* geom event handler */
+
+#define  GEOM_ELEM_ADD_NEW_PARAMETER         1
+#define  GEOM_ELEM_ADD_NEW_POINT             2
+#define  GEOM_ELEM_ADD_NEW_LINE              3
+#define  GEOM_ELEM_ADD_NEW_SPLINE            4
+#define  GEOM_ELEM_ADD_NEW_BEZIER            5
+#define  GEOM_ELEM_ADD_NEW_BSPLINE           6
+#define  GEOM_ELEM_ADD_NEW_CIRCLE            7
+#define  GEOM_ELEM_ADD_NEW_ELLIPSIS          8
+#define  GEOM_ELEM_ADD_NEW_PLANE_SURF        9
+#define  GEOM_ELEM_ADD_NEW_RULED_SURF        10
+#define  GEOM_ELEM_ADD_NEW_NURBS_SURF        11
+#define  GEOM_ELEM_ADD_NEW_VOLUME            12
+#define  GEOM_ELEM_ADD_TRANSLATE_POINT       13
+#define  GEOM_ELEM_ADD_TRANSLATE_LINE        14
+#define  GEOM_ELEM_ADD_TRANSLATE_SURF        15
+#define  GEOM_ELEM_ADD_ROTATE_POINT          16
+#define  GEOM_ELEM_ADD_ROTATE_LINE           17
+#define  GEOM_ELEM_ADD_ROTATE_SURF           18
+#define  GEOM_ELEM_ADD_DILATE_POINT          19
+#define  GEOM_ELEM_ADD_DILATE_LINE           20
+#define  GEOM_ELEM_ADD_DILATE_SURF           21
+#define  GEOM_ELEM_MOVE_TRANSLATE_POINT      22
+#define  GEOM_ELEM_MOVE_TRANSLATE_LINE       23
+#define  GEOM_ELEM_MOVE_TRANSLATE_SURF       24
+#define  GEOM_ELEM_MOVE_ROTATE_POINT         25
+#define  GEOM_ELEM_MOVE_ROTATE_LINE          26
+#define  GEOM_ELEM_MOVE_ROTATE_SURF          27
+#define  GEOM_ELEM_MOVE_DILATE_POINT         28
+#define  GEOM_ELEM_MOVE_DILATE_LINE          29
+#define  GEOM_ELEM_MOVE_DILATE_SURF          30
+#define  GEOM_ELEM_EXTRUDE_TRANSLATE_POINT   31
+#define  GEOM_ELEM_EXTRUDE_TRANSLATE_LINE    32
+#define  GEOM_ELEM_EXTRUDE_TRANSLATE_SURF    33
+#define  GEOM_ELEM_EXTRUDE_ROTATE_POINT      34
+#define  GEOM_ELEM_EXTRUDE_ROTATE_LINE       35
+#define  GEOM_ELEM_EXTRUDE_ROTATE_SURF       36
+#define  GEOM_ELEM_DELETE_POINT              37
+#define  GEOM_ELEM_DELETE_LINE               38
+#define  GEOM_ELEM_DELETE_SURF               39
+#define  GEOM_ELEM_SKETCH                    40
+#define  GEOM_PHYS_ADD_POINT                 41
+#define  GEOM_PHYS_ADD_LINE                  42
+#define  GEOM_PHYS_ADD_SURF                  43
+#define  GEOM_PHYS_ADD_VOLUME                44
+#define  GEOM_PHYS_DELETE_POINT              45
+#define  GEOM_PHYS_DELETE_LINE               46
+#define  GEOM_PHYS_DELETE_SURF               47
+#define  GEOM_PHYS_DELETE_VOLUME             48
+#define  GEOM_PARSE                          49
+
+/* GeomCb */
+
+#define  GEOM_PARAMETER_ADD                  1
+#define  GEOM_PARAMETER_NAME                 2
+#define  GEOM_PARAMETER_VALUE                3
+#define  GEOM_POINT_ADD                      4
+#define  GEOM_POINT_X                        5
+#define  GEOM_POINT_Y                        6
+#define  GEOM_POINT_Z                        7
+#define  GEOM_POINT_L                        8
+#define  GEOM_TRAN_X                         9
+#define  GEOM_TRAN_Y                         10
+#define  GEOM_TRAN_Z                         11
+#define  GEOM_ROT_PX                         12
+#define  GEOM_ROT_PY                         13
+#define  GEOM_ROT_PZ                         14
+#define  GEOM_ROT_AX                         15
+#define  GEOM_ROT_AY                         16
+#define  GEOM_ROT_AZ                         17
+#define  GEOM_ROT_ANGLE                      18
+#define  GEOM_DILAT_X                        19
+#define  GEOM_DILAT_Y                        20
+#define  GEOM_DILAT_Z                        21
+#define  GEOM_DILAT_F                        22
+
+void geom_event_handler (int event);
+
+#endif
diff --git a/Unix/CbInput.cpp b/Unix/CbInput.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..46b14b9eaf33d65d0f2af86d5b71744808b97227
--- /dev/null
+++ b/Unix/CbInput.cpp
@@ -0,0 +1,697 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Register.h"
+
+#include "CbContext.h"
+#include "CbGeneral.h"
+#include "CbGeom.h"
+#include "CbPost.h"
+#include "CbMesh.h"
+
+extern Context_T   CTX ;
+extern XContext_T  XCTX ;
+extern Widgets_T   WID ;
+
+extern GLdouble   vxmin, vxmax, vymin, vymax;
+extern Mesh       M;
+extern double     LC, MiddleLC;
+extern double     ClipPlane[4];
+
+static int        Modifier=0;
+
+void KeyboardAccel(XEvent *event){
+  XComposeStatus  stat;
+  KeySym          keysym;
+  char            buf[100];
+  double          delay ;
+
+  XLookupString(&event->xkey, buf, sizeof(buf), &keysym, &stat);
+
+  switch(Modifier){
+
+    /* ----------------------------------------------------- */
+    /* No modifier or shift is pressed                       */
+    /* ----------------------------------------------------- */
+
+  case 0 : 
+
+      /* modifier check and trash */
+    switch (keysym) {
+    case XK_Control_L : case XK_Control_R : 
+      Modifier = 1; 
+      break;
+    case XK_Alt_L : case XK_Alt_R : 
+    case XK_Meta_L : case XK_Meta_R : 
+      Modifier = 2; 
+      break;
+
+      /* hacks */
+
+      /*
+    case XK_Up :
+      ClipPlane[2] = 1. ;
+      if(fabs(ClipPlane[3]-LC/20 <1.)) ClipPlane[3] -= LC/20. ;
+      Init(); Draw();
+      break;
+    case XK_Down :
+      ClipPlane[2] = 1. ;
+      if(fabs(ClipPlane[3]+LC/20 <1.)) ClipPlane[3] += LC/20. ;
+      Init(); Draw();
+      break;
+      */
+
+      /* mesh shortcuts */
+    case XK_0 : case XK_KP_0 : 
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_GEOM,NULL); 
+      geom_event_handler(GEOM_PARSE);
+      break;
+    case XK_1 : case XK_KP_1 :
+    case XK_F1 : case XK_KP_F1 :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); 
+      mesh_event_handler(MESH_1D);
+      break;
+    case XK_2 : case XK_KP_2 :
+    case XK_F2 : case XK_KP_F2 :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL);
+      mesh_event_handler(MESH_2D);
+      break;
+    case XK_3 : case XK_KP_3 :
+    case XK_F3 : case XK_KP_F3 :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL);
+      mesh_event_handler(MESH_3D);
+      break;
+
+      /* post shortcuts */
+    case XK_s: 
+      CTX.post.anim_delay += 100000 ;
+      delay = CTX.post.anim_delay / 1.e6 ;
+      XtVaSetValues(WID.OD.postAnimScale, XmNvalue, (int)(10*delay), NULL);
+      XmUpdateDisplay(WID.OD.postAnimScale);
+      break ;
+    case XK_S: 
+      CTX.post.anim_delay -= 100000 ;
+      if(CTX.post.anim_delay < 0) CTX.post.anim_delay = 0 ;
+      delay = CTX.post.anim_delay / 1.e6 ;
+      XtVaSetValues(WID.OD.postAnimScale, XmNvalue, (int)(10*delay), NULL);
+      XmUpdateDisplay(WID.OD.postAnimScale);
+      break ;
+
+      /* module shortcuts */
+    case XK_g :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_GEOM,NULL); 
+      break;
+    case XK_m :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_MESH,NULL); 
+      break;
+    case XK_p :
+      ActualizeContextCb (NULL,(XtPointer)CONTEXT_POST,NULL); 
+      break;
+
+      /* options menu shortcuts */
+    case XK_G :
+      ManageCb(NULL,(XtPointer)WID.OD.geomDialog,NULL); 
+      break;
+    case XK_M :
+      ManageCb(NULL,(XtPointer)WID.OD.meshDialog,NULL); 
+      break;
+    case XK_P :
+      ManageCb(NULL,(XtPointer)WID.OD.postDialog,NULL); 
+      break;
+    case XK_O :
+      ManageCb(NULL,(XtPointer)WID.OD.miscDialog,NULL); 
+      break;
+    case XK_I :  
+      Modifier = 0 ;
+      CurrentInfoCb(NULL, (XtPointer)1, NULL); 
+      break;
+    case XK_V : 
+      Modifier = 0 ;
+      CurrentViewportCb (NULL, NULL, NULL);
+      break;
+    }
+    break;
+
+
+    /* ----------------------------------------------------- */
+    /* Control is pressed                                    */
+    /* ----------------------------------------------------- */
+
+  case 1 :
+
+    switch (keysym) {
+
+      /* file menu shortcuts */
+    case XK_q : case XK_Q : 
+      exit(1);
+    case XK_a : case XK_A : 
+    case XK_c : case XK_C : 
+      CancelMeshThread();
+      break;
+    case XK_s :  
+      Print_Mesh(&M,NULL, CTX.mesh.format); 
+      break; 
+    case XK_S : 
+      Modifier = 0 ;
+      ManageCb(NULL,(XtPointer)WID.FD.saveAsDialog,NULL); 
+      break ;
+    case XK_o : case XK_O : 
+      Modifier = 0 ;
+      ManageCb(NULL,(XtPointer)WID.FD.openDialog,NULL); 
+      break;
+    case XK_m : case XK_M : 
+      Modifier = 0 ;
+      ManageCb(NULL,(XtPointer)WID.FD.mergeDialog,NULL); 
+      break;
+    case XK_p : case XK_P : 
+      Modifier = 0 ;
+      ManageCb(NULL,(XtPointer)WID.FD.printDialog,NULL); 
+      break;
+    }
+    break ;
+    
+
+    /* ----------------------------------------------------- */
+    /* Alt is pressed                                        */
+    /* ----------------------------------------------------- */
+
+  case 2 :
+    
+    /* everything that is not "cascade menu" */
+    switch (keysym) {
+    case XK_f : case XK_F : 
+      CTX.fast = !CTX.fast; 
+      XtVaSetValues(WID.OD.miscMiscButt[2], XmNset, CTX.fast, NULL);
+      XmUpdateDisplay(WID.OD.miscMiscCheck);
+      break;
+    case XK_b : case XK_B :
+      CTX.post.scales = !CTX.post.scales;
+      Init(); Draw();
+      break;
+    case XK_o : case XK_O :
+      CTX.ortho = !CTX.ortho; 
+      XtVaSetValues(WID.OD.miscProjButt[0], XmNset, CTX.ortho, NULL);
+      XtVaSetValues(WID.OD.miscProjButt[1], XmNset, !CTX.ortho, NULL);
+      XmUpdateDisplay(WID.OD.miscProjCheck);
+      Init(); Draw();
+      break;
+    case XK_h : case XK_H :
+      CTX.geom.highlight = !CTX.geom.highlight;
+      CTX.geom.highlight ? Msg(INFOS, "Highlight enabled") : 
+	Msg(INFOS, "Highlight disabled");
+      break;
+    case XK_c : case XK_C :
+      if(CTX.color.id==0) InitColors(&CTX.color,1);
+      else if(CTX.color.id==1) InitColors(&CTX.color,2);
+      else InitColors(&CTX.color,0);
+      XtVaSetValues(WID.OD.miscColorSchemeScale,XmNvalue, CTX.color.id, NULL);
+      XmUpdateDisplay(WID.OD.miscColorSchemeScale);  
+      Init(); Draw();
+      break;
+    case XK_d : case XK_D :
+      if(!CTX.mesh.hidden && !CTX.mesh.shade)
+	CTX.mesh.hidden = 1;
+      else if(CTX.mesh.hidden && !CTX.mesh.shade)  
+	CTX.mesh.shade = 1;
+      else{
+	CTX.mesh.hidden = 0; CTX.mesh.shade = 0; 
+      }
+      XtVaSetValues(WID.OD.meshAspectButt[2],XmNset,CTX.mesh.hidden&&CTX.mesh.shade, NULL);
+      XtVaSetValues(WID.OD.meshAspectButt[1],XmNset,CTX.mesh.hidden&&!CTX.mesh.shade, NULL);
+      XtVaSetValues(WID.OD.meshAspectButt[0],XmNset,!CTX.mesh.hidden&&!CTX.mesh.shade, NULL);
+      XmUpdateDisplay(WID.OD.meshAspectCheck);  
+      Init(); Draw();
+      break;
+    case XK_x : case XK_X :
+      set_r(0,0.);  set_r(1,90.);set_r(2,0.); Init(); Draw(); 
+      break;
+    case XK_y : case XK_Y : 
+      set_r(0,-90.);set_r(1,0.); set_r(2,0.); Init(); Draw(); 
+      break;
+    case XK_z : case XK_Z : 
+      set_r(0,0.);  set_r(1,0.); set_r(2,0.); Init(); Draw(); 
+      break;
+    case XK_a :
+      CTX.little_axes = !CTX.little_axes;
+      XtVaSetValues(WID.OD.miscMiscButt[1], XmNset, CTX.little_axes, NULL);
+      XmUpdateDisplay(WID.OD.miscMiscCheck);
+      Init(); Draw();
+      break;
+    case XK_A :
+      CTX.axes = !CTX.axes;
+      XtVaSetValues(WID.OD.miscMiscButt[0], XmNset, CTX.axes, NULL);
+      XmUpdateDisplay(WID.OD.miscMiscCheck);
+      Init(); Draw();
+      break;
+    case XK_p :
+      CTX.geom.points = !CTX.geom.points;
+      if(!CTX.geom.vis_type){
+	XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points, NULL);
+	XmUpdateDisplay(WID.OD.geomVisibleButt[0]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_P :
+      CTX.mesh.points = !CTX.mesh.points;
+      if(!CTX.mesh.vis_type){
+	XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points, NULL);
+	XmUpdateDisplay(WID.OD.meshVisibleButt[0]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_l :
+      CTX.geom.lines = !CTX.geom.lines;
+      if(!CTX.geom.vis_type){
+	XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines, NULL);
+	XmUpdateDisplay(WID.OD.geomVisibleButt[1]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_L :
+      CTX.mesh.lines = !CTX.mesh.lines;
+      if(!CTX.mesh.vis_type){
+	XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines, NULL);
+	XmUpdateDisplay(WID.OD.meshVisibleButt[1]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_s :
+      CTX.geom.surfaces = !CTX.geom.surfaces;
+      if(!CTX.geom.vis_type){
+	XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces, NULL);
+	XmUpdateDisplay(WID.OD.geomVisibleButt[2]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_S :
+      CTX.mesh.surfaces = !CTX.mesh.surfaces;
+      if(!CTX.mesh.vis_type){
+	XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces, NULL);
+	XmUpdateDisplay(WID.OD.meshVisibleButt[2]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_v :
+      CTX.geom.volumes = !CTX.geom.volumes;
+      if(!CTX.geom.vis_type){
+	XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes, NULL);
+	XmUpdateDisplay(WID.OD.geomVisibleButt[3]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_V :
+      CTX.mesh.volumes = !CTX.mesh.volumes;
+      if(!CTX.mesh.vis_type){
+	XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes, NULL);
+	XmUpdateDisplay(WID.OD.meshVisibleButt[3]); 
+      }
+      Init(); Draw();
+      break;
+    case XK_m : case XK_M :
+      CTX.mesh.points   = !CTX.mesh.points;
+      CTX.mesh.lines    = !CTX.mesh.lines;
+      CTX.mesh.surfaces = !CTX.mesh.surfaces;
+      CTX.mesh.volumes  = !CTX.mesh.volumes;
+      XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points, NULL);
+      XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines, NULL);
+      XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces, NULL);
+      XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes, NULL);
+      XmUpdateDisplay(WID.OD.meshVisibleCheck); 
+      Init(); Draw();
+      break;
+    case XK_t : case XK_T :
+      MarkAllViewsChanged(1);
+      Init(); Draw();
+      break;
+    }
+    break ;
+
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  I n p u t                                                               */
+/* ------------------------------------------------------------------------ */
+
+void myZoom(GLdouble x1, GLdouble x2, GLdouble y1, GLdouble y2,
+	    GLdouble xc1, GLdouble xc2, GLdouble yc1, GLdouble yc2);
+void process_selection(int x, int y, int *n, GLuint *ii, GLuint *jj);
+void filtre_selection(int n, GLuint *typ, GLuint *ient, Vertex **thev,
+		      Curve **thec, Surface **thes, Mesh *m);
+
+void InputCb (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb){
+  XEvent         *event;
+  XComposeStatus  stat;
+  KeySym          keysym;
+  GLuint          ii[SELECTION_BUFFER_SIZE], jj[SELECTION_BUFFER_SIZE];
+  char            buf[100];
+  int             previous_mesh_draw, previous_post_draw ;
+  int             width, height ;
+
+  static int      ibut, hits;
+  static int      ButtonPressed=0, ZoomClick=0, FirstClick=0;
+  static int      x, y, movx, movy;
+  static GLdouble xc1, yc1, xc2, yc2, xt1, yt1, xscale1, yscale1;
+  static GLdouble xb, yb, xc, yc, xe, ye, xz, yz;
+  static GLdouble movzx, movzy;
+  static Vertex   *v=NULL, *ov;
+  static Curve    *c=NULL, *oc;
+  static Surface  *s=NULL, *os;
+  
+  width  = CTX.viewport[2]-CTX.viewport[0] ;
+  height = CTX.viewport[3]-CTX.viewport[1] ;
+  
+  event = cb->event;
+  
+  switch(event->type){
+    
+  /* -------------------------------------------------------------
+     K e y s 
+     ------------------------------------------------------------- */
+    
+  case KeyPress :
+    KeyboardAccel(event);
+    break;
+    
+  case KeyRelease :
+    XLookupString(&event->xkey, buf, sizeof(buf), &keysym, &stat);
+    if(keysym == XK_Control_L ||
+       keysym == XK_Control_R ||
+       keysym == XK_Alt_L ||
+       keysym == XK_Alt_R ||
+       keysym == XK_Meta_L ||
+       keysym == XK_Meta_R) 
+      Modifier = 0;
+    break;
+    
+  /* -------------------------------------------------------------
+     B u t t o n P r e s s
+     ------------------------------------------------------------- */
+    
+  case ButtonPress :
+    ButtonPressed++;
+    FirstClick=1;
+    ibut = event->xbutton.button;
+    x    = event->xbutton.x;
+    y    = event->xbutton.y;
+
+    switch(ibut){
+    case 1:
+      if(!ZoomClick && Modifier){
+	xb = vxmin + ((GLdouble) x / width) * (vxmax - vxmin);
+	yb = vymax - ((GLdouble) y / height) * (vymax - vymin);
+	xc1 = xb/CTX.s[0] - CTX.t[0];
+	yc1 = yb/CTX.s[1] - CTX.t[1];
+	ZoomClick=1;
+	movzx = movzy = 0;
+	Modifier = 0;
+      }
+      else if(ZoomClick){
+	xe = vxmin + ((GLdouble) x / width) * (vxmax - vxmin);
+	ye = vymax - ((GLdouble) y / height) * (vymax - vymin);
+	xc2 = xe/CTX.s[0] - CTX.t[0];
+	yc2 = ye/CTX.s[1] - CTX.t[1];	  
+	ZoomClick=0;
+	if(CTX.overlay){
+	  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+	  glClearIndex(0);
+	  glClear(GL_COLOR_BUFFER_BIT);  
+	  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+	}
+	if(xb!=xe && yb!=ye)
+	  myZoom(xb,xe,yb,ye,xc1,xc2,yc1,yc2);
+      } 
+      break;
+    case 2:
+      if(Modifier && !ZoomClick){
+	Modifier = 0;
+	set_s(1, CTX.s[0]);
+	set_s(2, CTX.s[0]);
+	Init();
+	Draw();
+      }
+      else{
+	ZoomClick=0;
+	if(CTX.overlay){
+	  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+	  glClearIndex(0);
+	  glClear(GL_COLOR_BUFFER_BIT);  
+	  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+	}
+      }
+      break;      
+    case 3:
+      if(Modifier && !ZoomClick){
+	Modifier = 0;
+	set_r(0,0.); set_r(1,0.); set_r(2,0.); 
+	set_t(0,0.); set_t(1,0.); set_t(2,0.);
+	set_s(0,1.); set_s(1,1.); set_s(2,1.);
+	Init();
+	Draw();
+      }
+      else{
+	ZoomClick=0;
+	if(CTX.overlay){
+	  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+	  glClearIndex(0);
+	  glClear(GL_COLOR_BUFFER_BIT);  
+	  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+	}
+      }
+      break;
+    }
+    break;
+
+  /* -------------------------------------------------------------
+      B u t t o n R e l e a s e
+     ------------------------------------------------------------- */
+
+  case ButtonRelease :
+    if(ButtonPressed>0){
+      ButtonPressed--;
+      ibut = event->xbutton.button;
+      x    = event->xbutton.x;
+      y    = event->xbutton.y;
+    }
+    if(!ZoomClick){
+      Init();
+      previous_mesh_draw = CTX.mesh.draw ;
+      previous_post_draw = CTX.post.draw ;
+      if(ButtonPressed>0){
+	if(CTX.fast) CTX.mesh.draw = CTX.post.draw = 0;
+      }
+      Draw();
+      CTX.mesh.draw = previous_mesh_draw ;
+      CTX.post.draw = previous_post_draw ;
+    }
+    break;
+      
+  /* -------------------------------------------------------------
+      E n t e r / L e a v e N o t i f y
+     ------------------------------------------------------------- */
+
+  case EnterNotify :
+  case LeaveNotify :
+    ButtonPressed = 0;
+    Modifier = 0;
+    break;
+    
+  /* -------------------------------------------------------------
+      M o t i o n N o t i f y 
+     ------------------------------------------------------------- */
+
+  case MotionNotify :
+    movx = (event->xbutton.x-x);
+    movy = (event->xbutton.y-y);
+
+    if(ZoomClick) {
+
+      xz = vxmin + ((GLdouble) event->xbutton.x / width) * (vxmax - vxmin);
+      yz = vymax - ((GLdouble) event->xbutton.y / height) * (vymax - vymin) ;
+      if(CTX.overlay) {
+	movzx = xz - xb; movzy = yz - yb;
+	InitOv();
+	glLineWidth(1.);
+	glClearIndex(0);
+	glClear(GL_COLOR_BUFFER_BIT);  
+	glIndexi((CTX.color.bg<CTX.color.fg)?XCTX.xcolor.ovwhite:XCTX.xcolor.ovblack);
+	glBegin(GL_LINE_STRIP);
+	glVertex2d(xb,yb);
+	glVertex2d(xb+movzx,yb);
+	glVertex2d(xb+movzx,yb+movzy);
+	glVertex2d(xb,yb+movzy);
+	glVertex2d(xb,yb);
+	glEnd();
+
+	/* Dessine le plus gd rectangle possible si ortho */
+
+	/*
+	if(fabs((double)movzx/(double)movzy) > ((double)width/(double)height)){
+	  constry = movzy;
+	  constrx = sign(movzx)*fabs(movzy)*((double)width/(double)height);
+	}
+	else{
+	  constrx = movzx;
+	  constry = sign(movzy)*fabs(movzx)*((double)height/(double)width);
+	}
+	glIndexi(theRed);
+	glBegin(GL_LINE_STRIP);
+	glVertex2d(xb+constrx,yb);
+	glVertex2d(xb+constrx,yb+constry);
+	glVertex2d(xb,yb+constry);
+	glEnd();
+	*/
+
+	glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+      }
+      else {
+	glPopMatrix();
+	glDisable(GL_DEPTH_TEST);
+	glDisable(GL_LIGHTING);
+	glMatrixMode(GL_PROJECTION);
+	glPushMatrix();
+	glLoadIdentity();
+	gluOrtho2D(vxmin, vxmax, vymin, vymax);
+	glMatrixMode(GL_MODELVIEW);
+	glPushMatrix();
+	glLoadIdentity();
+	
+	if(CTX.db) glDrawBuffer(GL_BACK);
+	
+	glDisable(GL_DEPTH_TEST);
+	/* c'est une maniere de contourner l'absence de XOR, mais ca ne marche 
+	   evidemment qu'avec un background tout noir ou tout blanc !*/
+	glColor3f(1.,1.,1.);
+	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
+	glEnable(GL_BLEND);
+
+	glBegin(GL_LINE_STRIP);
+	glVertex2d(xb,yb);
+	glVertex2d(xb+movzx,yb);
+	glVertex2d(xb+movzx,yb+movzy);
+	glVertex2d(xb,yb+movzy);
+	glVertex2d(xb,yb);
+	glEnd();
+	movzx = xz - xb; movzy = yz - yb;
+	
+	glBegin(GL_LINE_STRIP);
+	glVertex2d(xb,yb);
+	glVertex2d(xb+movzx,yb);
+	glVertex2d(xb+movzx,yb+movzy);
+	glVertex2d(xb,yb+movzy);
+	glVertex2d(xb,yb);
+	glEnd();
+
+	glDisable(GL_BLEND);
+	glEnable(GL_DEPTH_TEST);
+	glPopMatrix();
+	glMatrixMode(GL_PROJECTION);
+	glPopMatrix();
+	glMatrixMode(GL_MODELVIEW);
+	
+	if(CTX.db)
+	  glXSwapBuffers(XCTX.display,XtWindow(WID.G.glw));
+	else
+	  glFlush();
+
+      }
+    }
+    else {
+      if(ButtonPressed){
+
+	if(CTX.overlay){
+	  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+	  glClearIndex(0);
+	  glClear(GL_COLOR_BUFFER_BIT);  
+	  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+	}
+
+	if(FirstClick){
+	  xc1 = ( ((GLdouble) x / width) * (vxmax - vxmin) + vxmin )/CTX.s[0] - CTX.t[0];
+	  yc1 = ( vymax - ((GLdouble) y / height) * (vymax - vymin))/CTX.s[1] - CTX.t[1];
+	  xt1 = CTX.t[0];
+	  yt1 = CTX.t[1];
+	  xscale1 = CTX.s[0];
+	  yscale1 = CTX.s[1];
+	  FirstClick=0;
+	}
+
+	switch(ibut){
+	case 1:
+	  set_r(1, CTX.r[1] + ((abs(movx) > abs(movy))?180*(float)movx/(float)width:0));
+	  set_r(0, CTX.r[0] + ((abs(movx) > abs(movy))?0:180*(float)movy/(float)height));
+	  break;
+	case 2:
+	  set_r(2, CTX.r[2] + ((abs(movy) > abs(movx))?0:-180*(float)movx/(float)width));	  
+
+	  set_s(0, CTX.s[0] * ( (abs(movy) > abs(movx)) ?
+				( (movy>0) ? (float)(1.04*(abs(movy)+height))/(float)height
+				  : (float)(height)/(float)(1.04*(abs(movy)+height)) )
+				: 1.) );		    
+	  set_s(1, CTX.s[0]);
+	  set_s(2, CTX.s[0]);
+
+	  if(abs(movy) > abs(movx)){
+	    set_t(0, xt1*(xscale1/CTX.s[0])-xc1*(1.-(xscale1/CTX.s[0])));
+	    set_t(1, yt1*(yscale1/CTX.s[1])-yc1*(1.-(yscale1/CTX.s[1])));
+	  }
+	  break;
+	case 3:
+	  xc = ( ((GLdouble) x / width) * (vxmax - vxmin) + vxmin ) / CTX.s[0];
+	  yc = ( vymax - ((GLdouble) y / height) * (vymax - vymin)) / CTX.s[1];
+	  set_t(0, xc-xc1);
+	  set_t(1, yc-yc1);
+	  set_t(2, 0.);
+	  break;
+	}
+	Init();
+	previous_mesh_draw = CTX.mesh.draw ;
+	previous_post_draw = CTX.post.draw ;
+	if(CTX.fast) CTX.mesh.draw = CTX.post.draw = 0;
+	Draw();
+	CTX.mesh.draw = previous_mesh_draw ;
+	CTX.post.draw = previous_post_draw ;
+      }
+      else{
+	process_selection(event->xbutton.x, event->xbutton.y, &hits, ii, jj);
+	ov = v; oc = c; os = s;	
+	v = NULL; c = NULL; s = NULL;
+	filtre_selection(hits,ii,jj,&v,&c,&s,&M);
+
+	if(CTX.overlay){
+	  glXMakeCurrent(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), XCTX.glo.context);
+	  if(ov != v || oc != c || os != s) { 
+	    glClearIndex(0);
+	    glClear(GL_COLOR_BUFFER_BIT);  
+	    glIndexi((CTX.color.bg<CTX.color.fg)?XCTX.xcolor.ovwhite:XCTX.xcolor.ovblack);
+	    begin_highlight();
+	    highlight_entity(v,c,s,0);
+	    end_highlight(0);
+	  }
+	  glXMakeCurrent(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), XCTX.glw.context);
+	}
+	else{
+	  if(ov != v || oc != c || os != s) { 
+	    if(CTX.geom.highlight){
+	      Init();
+	      Draw();
+	    }
+	    begin_highlight();
+	    highlight_entity(v,c,s,0);
+	    end_highlight(0);
+	  }
+	}
+      }
+      x += movx; 
+      y += movy; 
+    }
+    break;
+  }
+}
diff --git a/Unix/CbMesh.cpp b/Unix/CbMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..40952364ad2de3eac292b6ac23b5488a9da97288
--- /dev/null
+++ b/Unix/CbMesh.cpp
@@ -0,0 +1,297 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "CbMesh.h"
+#include "Context.h"
+#include "Widgets.h"
+
+extern Widgets_T  WID;
+extern Context_T  CTX;
+extern Mesh       M;
+extern char       TheFileName[256];
+
+extern char   trsf_pts_text[100], trsf_type_text[100];
+extern char   trsf_vol_text[100], char_length_text[100];
+extern char   attrx_text[100], attry_text[100], attrz_text[100], attrdec_text[100];
+
+/* ------------------------------------------------------------------------ */
+/*  m e s h _ e v e n t _ h a n d l e r                                     */
+/* ------------------------------------------------------------------------ */
+
+#ifndef _NOTHREADS
+#include <pthread.h>
+
+int               MeshDim ;
+pthread_t         MeshThread ;
+//pthread_mutex_t   MeshMutex ;
+
+void* StartMeshThread(void * data){
+
+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+  //  pthread_mutex_unlock(&MeshMutex);
+
+  mai3d(&M,MeshDim);
+  Msg(STATUS,"Ready");
+  CTX.mesh.draw = 1;
+  CTX.threads_lock = 0;
+  XtSetSensitive(WID.G.Butt[5], 0);
+  Init();
+  Draw();
+  pthread_exit(NULL);
+  return NULL ;
+}
+
+void CancelMeshThread(void){
+  if(CTX.threads){
+    //  pthread_mutex_lock(&MeshMutex);
+    //  pthread_join(MeshThread,NULL);
+    //  pthread_detach(MeshThread);
+    
+    pthread_cancel(MeshThread);
+    CTX.mesh.draw = 1;
+    CTX.threads_lock = 0;
+    XtSetSensitive(WID.G.Butt[5], 0);    
+    Msg(INFO,"Mesh Aborted");
+    mesh_event_handler(MESH_DELETE);
+    Msg(STATUS,"Ready");
+    Init();
+    Draw();
+  }
+}
+
+#else
+
+void CancelMeshThread(void){
+  
+}
+
+#endif
+
+
+
+void mesh_event_handler (int event) {
+  Vertex   *v;
+  Curve    *c;
+  Surface  *s;
+  int       ib;
+  static int n=0, p[100];
+
+  if(CTX.threads_lock) return ;
+
+  switch (event) {    
+
+  case MESH_DELETE : 
+    mai3d(&M, 0); 
+    break;
+    
+  case MESH_1D : 
+#ifndef _NOTHREADS
+    if(CTX.threads){
+      XtSetSensitive(WID.G.Butt[5], 1);
+      CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 1 ; 
+      //      pthread_mutex_init(&MeshMutex,NULL);
+      //      pthread_mutex_lock(&MeshMutex);
+      pthread_create(&MeshThread, NULL, StartMeshThread, NULL);
+    }
+    else
+#endif
+      mai3d(&M, 1); 
+    break;
+    
+  case MESH_2D : 
+#ifndef _NOTHREADS
+    if(CTX.threads){
+      XtSetSensitive(WID.G.Butt[5], 1);
+      CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 2 ; 
+      //      pthread_mutex_init(&MeshMutex,NULL);
+      //      pthread_mutex_lock(&MeshMutex);
+      pthread_create(&MeshThread, NULL, StartMeshThread, NULL);
+    }
+    else
+#endif
+      mai3d(&M, 2);
+    break;    
+
+  case MESH_3D : 
+#ifndef _NOTHREADS
+    if(CTX.threads){
+      XtSetSensitive(WID.G.Butt[5], 1);
+      CTX.mesh.draw = 0; CTX.threads_lock = 1 ; MeshDim = 3 ; 
+      //      pthread_mutex_init(&MeshMutex,NULL);
+      //      pthread_mutex_lock(&MeshMutex);
+      pthread_create(&MeshThread, NULL, StartMeshThread, NULL);
+    }
+    else
+#endif
+      mai3d(&M, 3); 
+    break;
+
+
+  case MESH_DEFINE_CHAR_LENGTH :
+    n=0;
+    while(1){
+      Msg(STATUS,"Select Point: (e) to end, (q) to quit");
+      ib = SelectEntity(ENT_POINT, &v,&c,&s);
+      if(ib == 1){ /* left mouse butt */
+	p[n++] = v->Num; 
+      }
+      if (ib == -1){ /* 'e' */
+	if(n >= 1) {
+	  add_charlength(n,p,TheFileName); break;
+	}
+	n=0;
+	ZeroHighlight(&M);
+	Replot();
+      }
+      if(ib == 0){ /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+    }
+    break ;
+
+  case MESH_DEFINE_RECOMBINE :
+    n=0;
+    while(1){
+      Msg(STATUS,"Select Surface: (e) to end, (q) to quit");
+      ib = SelectEntity(ENT_SURFACE, &v,&c,&s);
+      if(ib == 1){ /* left mouse butt */
+	p[n++] = s->Num; 
+      }
+      if (ib == -1){ /* 'e' */
+	if(n >= 1) {
+	  add_recosurf(n,p,TheFileName); break;
+	}
+	n=0;
+	ZeroHighlight(&M);
+	Replot();
+      }
+      if(ib == 0){ /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+    }
+    break ;
+
+  case MESH_DEFINE_TRSF_LINE :
+  case MESH_DEFINE_TRSF_SURFACE :
+  case MESH_DEFINE_TRSF_VOLUME :
+    n=0;
+    while(1){
+      switch (event) {    
+      case MESH_DEFINE_TRSF_LINE :
+	Msg(STATUS,"Select Line: (e) to end, (q) to quit");
+	ib = SelectEntity(ENT_LINE, &v,&c,&s);
+	break ;
+      case MESH_DEFINE_TRSF_SURFACE :
+	Msg(STATUS,"Select Surface: (e) to end, (q) to quit");
+	ib = SelectEntity(ENT_SURFACE, &v,&c,&s);
+	break;
+      case MESH_DEFINE_TRSF_VOLUME :
+	ib = 1;
+	break;
+      }
+      if(ib == 1){ /* left mouse butt */
+	switch (event) {    
+	case MESH_DEFINE_TRSF_LINE : p[n++] = c->Num ; break ;
+	case MESH_DEFINE_TRSF_SURFACE : p[n++] = s->Num;
+	case MESH_DEFINE_TRSF_VOLUME :
+	  while(1){
+	    Msg(STATUS,"Select Point: (e) to end, (q) to quit");
+	    ib = SelectEntity(ENT_POINT, &v,&c,&s);
+	    if(ib == 1){ /* left mouse butt */
+	      p[n++] = v->Num ;
+	    }
+	    if (ib == -1){ /* 'e' */
+	      switch (event) {    
+	      case MESH_DEFINE_TRSF_SURFACE :
+		if(n == 3+1 || n == 4+1)
+		  add_trsfsurf(n,p,TheFileName); 
+		else
+		  Msg(INFO, "Wrong Number of Points for Transfinite Surface");
+		break;
+	      case MESH_DEFINE_TRSF_VOLUME :
+		if(n == 6 || n == 8)
+		  add_trsfvol(n,p,TheFileName);
+		else
+		  Msg(INFO, "Wrong Number of Points for Transfinite Volume");
+		break;
+	      }
+	      n=0;
+	      ZeroHighlight(&M);
+	      Replot();
+	      break;
+	    }
+	    if(ib == 0){ /* 'q' */
+	      n=0 ;
+	      ZeroHighlight(&M);
+	      Replot();
+	      break;
+	    }
+	  }
+	  break ;
+	}
+      }
+      if (ib == -1){ /* 'e' */
+	if (event == MESH_DEFINE_TRSF_LINE){ 
+	  if(n >= 1) add_trsfline(n,p,TheFileName);
+	}
+	n=0;
+	ZeroHighlight(&M);
+	Replot();
+      }
+      if(ib == 0){ /* 'q' */
+	n=0 ;
+	ZeroHighlight(&M);
+	Replot();
+	break;
+      }
+    }
+    break ;
+
+  case MESH_DEFINE_ATTRACTOR_POINT :
+  case MESH_DEFINE_ATTRACTOR_LINE :
+  case MESH_DEFINE_ATTRACTOR_SURFACE :
+    Msg(WARNING, "Interactive Attractor Definition not Done..."); 
+    break ;
+
+  default : 
+    Msg(WARNING, "Unkown event in mesh_event_handler"); 
+    break;
+  }
+
+  if(!CTX.threads){
+    Msg(STATUS,"Ready");
+    Init();
+    Draw();
+  }
+}
+
+/* ------------------------------------------------------------------------ 
+    M e s h C b                                                       
+   ------------------------------------------------------------------------ */
+
+void MeshCb (Widget w, XtPointer client_data, XtPointer call_data){
+
+  switch((long int)client_data){
+
+  case MESH_TRSF_LINE_PTS  : strcpy(trsf_pts_text,XmTextGetString(w)); break;
+  case MESH_TRSF_LINE_TYPE : strcpy(trsf_type_text,XmTextGetString(w)); break;
+  case MESH_TRSF_VOL_NUM   : strcpy(trsf_vol_text,XmTextGetString(w)); break;
+  case MESH_CHAR_LENGTH    : strcpy(char_length_text,XmTextGetString(w)); break;
+  case MESH_ATTRACTOR_X    : strcpy(attrx_text,XmTextGetString(w)); break;
+  case MESH_ATTRACTOR_Y    : strcpy(attry_text,XmTextGetString(w)); break;
+  case MESH_ATTRACTOR_Z    : strcpy(attrz_text,XmTextGetString(w)); break;
+  default :
+    Msg(WARNING, "Unknown value in MeshCb : %d", (long int)client_data); 
+    break;
+
+  }
+}
diff --git a/Unix/CbMesh.h b/Unix/CbMesh.h
new file mode 100644
index 0000000000000000000000000000000000000000..42599e572979fe343d2e8cdfb12bf65d3a93f218
--- /dev/null
+++ b/Unix/CbMesh.h
@@ -0,0 +1,32 @@
+#ifndef _CB_MESH_H_
+#define _CB_MESH_H_
+
+/* mesh event handler */
+					     
+#define  MESH_DELETE                         1
+#define  MESH_1D                             2
+#define  MESH_2D                             3 
+#define  MESH_3D                             4
+#define  MESH_DEFINE_CHAR_LENGTH             5
+#define  MESH_DEFINE_TRSF_LINE               6
+#define  MESH_DEFINE_TRSF_SURFACE            7
+#define  MESH_DEFINE_TRSF_VOLUME             8
+#define  MESH_DEFINE_RECOMBINE               9
+#define  MESH_DEFINE_ATTRACTOR_POINT         10
+#define  MESH_DEFINE_ATTRACTOR_LINE          11
+#define  MESH_DEFINE_ATTRACTOR_SURFACE       12
+
+/* MeshCb */
+
+#define  MESH_TRSF_LINE_PTS                  100
+#define  MESH_TRSF_LINE_TYPE                 101
+#define  MESH_TRSF_VOL_NUM                   102
+#define  MESH_CHAR_LENGTH                    103
+#define  MESH_ATTRACTOR_X                    104
+#define  MESH_ATTRACTOR_Y                    105
+#define  MESH_ATTRACTOR_Z                    106
+
+void CancelMeshThread(void);
+void mesh_event_handler (int event);
+					     
+#endif
diff --git a/Unix/CbOptions.cpp b/Unix/CbOptions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ef771d3cfb7c8559d2e3f48a87ebdacdd983b14d
--- /dev/null
+++ b/Unix/CbOptions.cpp
@@ -0,0 +1,313 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Verif.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Widgets.h"
+#include "Pixmaps.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Register.h"
+
+#include "CbGeneral.h"
+#include "CbOptions.h"
+#include "CbGeom.h"
+#include "CbMesh.h"
+#include "CbPost.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+extern Context_T  CTX;
+extern XContext_T XCTX ;
+extern Widgets_T  WID;
+extern Pixmaps_T  PIX;
+extern Mesh       M;
+extern Tree_T    *EntitesVisibles;
+extern double   LC;
+extern int      ACTUAL_ENTITY, SHOW_ALL;
+
+static int stop_anim ;
+static long anim_time ;
+
+/* ------------------------------------------------------------------------ 
+    O p t i o n s C b                                                       
+   ------------------------------------------------------------------------ */
+
+long Get_AnimTime(){
+  struct timeval tp;
+  gettimeofday(&tp, (struct timezone *) 0);
+  return (long)tp.tv_sec * 1000000 + (long)tp.tv_usec;
+}
+
+void OptionsCb (Widget w, XtPointer client_data, XtPointer call_data){
+  int                i, e;
+  char              *c, label[32];
+  XWindowAttributes  xattrib;
+  XEvent             event;
+  
+  switch((long int)client_data){
+
+    /* globales */
+    
+  case OPTIONS_REPLOT        : Init(); Draw(); break;
+  case OPTIONS_AXES          : CTX.axes = !CTX.axes; break;
+  case OPTIONS_LITTLE_AXES   : CTX.little_axes = !CTX.little_axes; break;
+  case OPTIONS_FAST_REDRAW   : CTX.fast = !CTX.fast ; break ;
+  case OPTIONS_DISPLAY_LISTS : CTX.display_lists = !CTX.display_lists ; break ;
+  case OPTIONS_ALPHA_BLENDING: CTX.alpha = !CTX.alpha; break;
+  case OPTIONS_COLOR_SCHEME_SCALE: 
+    XmScaleGetValue(WID.OD.miscColorSchemeScale, &e); InitColors(&CTX.color, e);
+    Init(); Draw();
+    break ;
+  case OPTIONS_ORTHOGRAPHIC  : CTX.ortho = 1; break;
+  case OPTIONS_PERSPECTIVE   : CTX.ortho = 0; break;
+  case OPTIONS_LIGHT_X_SCALE : 
+    XmScaleGetValue(WID.OD.miscLightScale[0], &e); CTX.light0[0] = 0.04*e ;
+    MarkAllViewsChanged (0); break ;
+  case OPTIONS_LIGHT_Y_SCALE : 
+    XmScaleGetValue(WID.OD.miscLightScale[1], &e); CTX.light0[1] = 0.04*e ; 
+    MarkAllViewsChanged (0); break ;
+  case OPTIONS_LIGHT_Z_SCALE : 
+    XmScaleGetValue(WID.OD.miscLightScale[2], &e); CTX.light0[2] = 0.04*e ; 
+    MarkAllViewsChanged (0);break ;
+  case OPTIONS_SHINE_SCALE   :
+    XmScaleGetValue(WID.OD.miscShineScale, &e); CTX.shine = 0.04*e ; 
+    MarkAllViewsChanged (0);break ;
+  case OPTIONS_SCALEX        : CTX.s[0] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_SCALEY        : CTX.s[1] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_SCALEZ        : CTX.s[2] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_TRANX         : CTX.t[0] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_TRANY         : CTX.t[1] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_TRANZ         : CTX.t[2] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_ROTX          : CTX.r[0] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_ROTY          : CTX.r[1] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_ROTZ          : CTX.r[2] = (GLdouble)atof(XmTextGetString(w)); break;
+  case OPTIONS_ROTX_LOCKED   : CTX.rlock[0] = !CTX.rlock[0];  break;
+  case OPTIONS_ROTY_LOCKED   : CTX.rlock[1] = !CTX.rlock[1];  break;
+  case OPTIONS_ROTZ_LOCKED   : CTX.rlock[2] = !CTX.rlock[2];  break;
+  case OPTIONS_TRANX_LOCKED  : CTX.tlock[0] = !CTX.tlock[0];  break;
+  case OPTIONS_TRANY_LOCKED  : CTX.tlock[1] = !CTX.tlock[1];  break;
+  case OPTIONS_TRANZ_LOCKED  : CTX.tlock[2] = !CTX.tlock[2];  break;
+  case OPTIONS_SCALEX_LOCKED : CTX.slock[0] = !CTX.slock[0];  break;
+  case OPTIONS_SCALEY_LOCKED : CTX.slock[1] = !CTX.slock[1];  break;
+  case OPTIONS_SCALEZ_LOCKED : CTX.slock[2] = !CTX.slock[2];  break;
+  case OPTIONS_XVIEW : set_r(0,0.);  set_r(1,90.);set_r(2,0.); Init(); Draw(); break;
+  case OPTIONS_YVIEW : set_r(0,-90.);set_r(1,0.); set_r(2,0.); Init(); Draw(); break;
+  case OPTIONS_ZVIEW : set_r(0,0.);  set_r(1,0.); set_r(2,0.); Init(); Draw(); break;
+  case OPTIONS_CVIEW : set_t(0,0.);  set_t(1,0.); set_t(2,0.); 
+                       set_s(0,1.);  set_s(1,1.); set_s(2,1.); Init(); Draw(); break;
+  case OPTIONS_PVIEW :
+    XGetWindowAttributes(XtDisplay(WID.G.shell),XtWindow(WID.G.shell),&xattrib);
+    fprintf(stderr, "-geometry %dx%d -viewport %g %g %g %g %g %g %g %g %g\n",
+	    xattrib.width, xattrib.height,
+	    CTX.r[0],CTX.r[1],CTX.r[2],
+	    CTX.t[0],CTX.t[1],CTX.t[2],
+	    CTX.s[0],CTX.s[1],CTX.s[2]);
+    break ;
+
+    /* print */
+
+  case OPTIONS_PRINT_XDUMP        : CTX.print.type = XDUMP; CTX.print.format = FORMAT_XPM; break;
+  case OPTIONS_PRINT_GIF          : CTX.print.type = GIF; CTX.print.format = FORMAT_GIF; break;
+  case OPTIONS_PRINT_GLPPAINTER   : CTX.print.type = GLPPAINTER; CTX.print.format = FORMAT_EPS; break;
+  case OPTIONS_PRINT_GLPRECURSIVE : CTX.print.type = GLPRECURSIVE; CTX.print.format = FORMAT_EPS; break;
+  case OPTIONS_PRINT_GLPIMAGE     : CTX.print.type = GLPIMAGE; CTX.print.format = FORMAT_EPS; break;
+  case OPTIONS_PRINT_GL2PS_SIMPLE : CTX.print.type = GLPRPAINTER; CTX.print.format = FORMAT_EPS;break;
+  case OPTIONS_PRINT_GL2PS_COMPLEX: CTX.print.type = GLPRRECURSIVE; CTX.print.format = FORMAT_EPS;break;
+  case OPTIONS_PRINT_GL2PS_IMAGE  : CTX.print.type = XDUMP; CTX.print.format = FORMAT_EPS;break;
+
+    /* geometrie */
+
+  case OPTIONS_GEOM_CHECK      : /* Print_Geo(&M,filename); */ break;    
+  case OPTIONS_GEOM_VISIBILITY_ENTITY : 
+    CTX.geom.vis_type = 0; 
+    XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points?True:False, NULL);
+    XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines?True:False, NULL); 
+    XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces?True:False, NULL);
+    XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes?True:False, NULL);
+    for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.geomVisibleButt[i]);
+    break;
+  case OPTIONS_GEOM_VISIBILITY_NUMBER : 
+    CTX.geom.vis_type = 1; 
+    XtVaSetValues(WID.OD.geomVisibleButt[0], XmNset, CTX.geom.points_num?True:False, NULL);
+    XtVaSetValues(WID.OD.geomVisibleButt[1], XmNset, CTX.geom.lines_num?True:False, NULL); 
+    XtVaSetValues(WID.OD.geomVisibleButt[2], XmNset, CTX.geom.surfaces_num?True:False, NULL);
+    XtVaSetValues(WID.OD.geomVisibleButt[3], XmNset, CTX.geom.volumes_num?True:False, NULL);
+    for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.geomVisibleButt[i]);
+    break;
+  case OPTIONS_GEOM_POINTS     : 
+    if(!CTX.geom.vis_type) CTX.geom.points = !CTX.geom.points; 
+    else                   CTX.geom.points_num = !CTX.geom.points_num; break; 
+  case OPTIONS_GEOM_LINES      :
+    if(!CTX.geom.vis_type) CTX.geom.lines = !CTX.geom.lines;
+    else                   CTX.geom.lines_num = !CTX.geom.lines_num; break; 
+  case OPTIONS_GEOM_SURFACES   :
+    if(!CTX.geom.vis_type) CTX.geom.surfaces = !CTX.geom.surfaces;
+    else                   CTX.geom.surfaces_num = !CTX.geom.surfaces_num; break; 
+  case OPTIONS_GEOM_VOLUMES    :
+    if(!CTX.geom.vis_type) CTX.geom.volumes = !CTX.geom.volumes;
+    else                   CTX.geom.volumes_num = !CTX.geom.volumes_num; break; 
+  case OPTIONS_GEOM_NORMALS_SCALE : 
+    XmScaleGetValue(WID.OD.geomNormalsScale, &e); CTX.geom.normals = e ;  
+    sprintf(label,"%g",CTX.geom.normals);   
+    XtVaSetValues(WID.OD.geomNormalsText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.OD.geomNormalsText); break;
+  case OPTIONS_GEOM_NORMALS_TEXT : 
+    CTX.geom.normals = atof(XmTextGetString(w));
+    XtVaSetValues(WID.OD.geomNormalsScale, XmNvalue, 
+		  THRESHOLD((int)CTX.geom.normals,0,100), NULL);
+    XmUpdateDisplay(WID.OD.geomNormalsScale); break;
+  case OPTIONS_GEOM_TANGENTS_SCALE : 
+    XmScaleGetValue(WID.OD.geomTangentsScale, &e); CTX.geom.tangents = e ;  
+    sprintf(label,"%g",CTX.geom.tangents);   
+    XtVaSetValues(WID.OD.geomTangentsText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.OD.geomTangentsText); break;
+  case OPTIONS_GEOM_TANGENTS_TEXT : 
+    CTX.geom.tangents = atof(XmTextGetString(w));
+    XtVaSetValues(WID.OD.geomTangentsScale, XmNvalue,
+		  THRESHOLD((int)CTX.geom.tangents,0,100), NULL);
+    XmUpdateDisplay(WID.OD.geomTangentsScale); break;
+    
+
+    /* mesh */
+
+  case OPTIONS_MESH_SHADING      : CTX.mesh.hidden = 1; CTX.mesh.shade = 1; break; 
+  case OPTIONS_MESH_HIDDEN_LINES : CTX.mesh.hidden = 1; CTX.mesh.shade = 0; break; 
+  case OPTIONS_MESH_WIREFRAME    : CTX.mesh.hidden = 0; CTX.mesh.shade = 0; break; 
+  case OPTIONS_MESH_VISIBILITY_ENTITY : 
+    CTX.mesh.vis_type = 0; 
+    XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points?True:False, NULL);
+    XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines?True:False, NULL); 
+    XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces?True:False, NULL);
+    XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes?True:False, NULL);
+    for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.meshVisibleButt[i]);
+    break;
+  case OPTIONS_MESH_VISIBILITY_NUMBER : 
+    CTX.mesh.vis_type = 1; 
+    XtVaSetValues(WID.OD.meshVisibleButt[0], XmNset, CTX.mesh.points_num?True:False, NULL);
+    XtVaSetValues(WID.OD.meshVisibleButt[1], XmNset, CTX.mesh.lines_num?True:False, NULL); 
+    XtVaSetValues(WID.OD.meshVisibleButt[2], XmNset, CTX.mesh.surfaces_num?True:False, NULL);
+    XtVaSetValues(WID.OD.meshVisibleButt[3], XmNset, CTX.mesh.volumes_num?True:False, NULL);
+    for(i=0;i<4;i++)XmUpdateDisplay(WID.OD.meshVisibleButt[i]);
+    break;
+  case OPTIONS_MESH_POINTS     :
+    if(!CTX.mesh.vis_type) CTX.mesh.points = !CTX.mesh.points; 
+    else                   CTX.mesh.points_num = !CTX.mesh.points_num; break; 
+  case OPTIONS_MESH_LINES      :
+    if(!CTX.mesh.vis_type) CTX.mesh.lines = !CTX.mesh.lines;
+    else                   CTX.mesh.lines_num = !CTX.mesh.lines_num; break; 
+  case OPTIONS_MESH_SURFACES   :
+    if(!CTX.mesh.vis_type) CTX.mesh.surfaces = !CTX.mesh.surfaces;
+    else                   CTX.mesh.surfaces_num = !CTX.mesh.surfaces_num; break; 
+  case OPTIONS_MESH_VOLUMES    :
+    if(!CTX.mesh.vis_type) CTX.mesh.volumes = !CTX.mesh.volumes;
+    else                   CTX.mesh.volumes_num = !CTX.mesh.volumes_num; break; 
+  case OPTIONS_MESH_FORMAT_MSH   : CTX.mesh.format = FORMAT_MSH ; break ;
+  case OPTIONS_MESH_FORMAT_UNV   : CTX.mesh.format = FORMAT_UNV ; break ;
+  case OPTIONS_MESH_FORMAT_GREF  : CTX.mesh.format = FORMAT_GREF ; break ;
+  case OPTIONS_MESH_DEGRE2       : 
+    (CTX.mesh.degree==2) ? CTX.mesh.degree=1 : CTX.mesh.degree=2; break ;
+  case OPTIONS_MESH_ANISOTROPIC  : 
+    (CTX.mesh.algo==DELAUNAY_OLDALGO) ?
+      CTX.mesh.algo=DELAUNAY_NEWALGO :
+	CTX.mesh.algo=DELAUNAY_OLDALGO; break ;
+  case OPTIONS_MESH_SMOOTHING_SCALE : 
+    XmScaleGetValue(WID.OD.meshSmoothingScale, &e); CTX.mesh.nb_smoothing = e ;  
+    sprintf(label,"%d",CTX.mesh.nb_smoothing);   
+    XtVaSetValues(WID.OD.meshSmoothingText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.OD.meshSmoothingText); break;
+  case OPTIONS_MESH_SMOOTHING_TEXT : 
+    CTX.mesh.nb_smoothing = atoi(XmTextGetString(w));
+    XtVaSetValues(WID.OD.meshSmoothingScale, XmNvalue, 
+		  THRESHOLD(CTX.mesh.nb_smoothing,0,100), NULL);
+    XmUpdateDisplay(WID.OD.meshSmoothingScale); break;
+  case OPTIONS_MESH_EXPLODE_SCALE : 
+    XmScaleGetValue(WID.OD.meshExplodeScale, &e); CTX.mesh.explode = 0.01*e ;  
+    sprintf(label,"%g",CTX.mesh.explode);   
+    XtVaSetValues(WID.OD.meshExplodeText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.OD.meshExplodeText); break;
+  case OPTIONS_MESH_EXPLODE_TEXT : 
+    CTX.mesh.explode = atof(XmTextGetString(w));
+    XtVaSetValues(WID.OD.meshExplodeScale, XmNvalue,
+		  THRESHOLD((int)(100*CTX.mesh.explode),0,100), NULL);
+    XmUpdateDisplay(WID.OD.meshExplodeScale); break;
+  case OPTIONS_MESH_NORMALS_SCALE : 
+    XmScaleGetValue(WID.OD.meshNormalsScale, &e); CTX.mesh.normals = e ;  
+    sprintf(label,"%g",CTX.mesh.normals);   
+    XtVaSetValues(WID.OD.meshNormalsText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.OD.meshNormalsText); break;
+  case OPTIONS_MESH_NORMALS_TEXT : 
+    CTX.mesh.normals = atof(XmTextGetString(w));
+    XtVaSetValues(WID.OD.meshNormalsScale, XmNvalue,
+		  THRESHOLD((int)CTX.mesh.normals,0,100), NULL);
+    XmUpdateDisplay(WID.OD.meshNormalsScale); break;
+  case OPTIONS_MESH_ABORT : 
+    CancelMeshThread();
+    break;
+
+    /* post */
+    
+  case OPTIONS_POST_LINK_NONE    : CTX.post.link = 0; break; 
+  case OPTIONS_POST_LINK_VISIBLE : CTX.post.link = 1; break; 
+  case OPTIONS_POST_LINK_ALL     : CTX.post.link = 2; break; 
+  case OPTIONS_POST_ANIM_START: 
+    stop_anim = 0 ;
+    Set_AnimPixmap(&WID, &PIX, 0) ;
+    Set_AnimCallback(&WID, 0) ;
+    anim_time = Get_AnimTime();
+    while(1){
+      if(XtAppPending(XCTX.AppContext)){
+	XtAppNextEvent(XCTX.AppContext,&event);
+	XtDispatchEvent(&event);
+	if(stop_anim) break ;
+      }
+      else{
+	if(Get_AnimTime() - anim_time > CTX.post.anim_delay){
+	  anim_time = Get_AnimTime();
+	  MarkAllViewsChanged(2);
+	  Init(); Draw();
+	}
+      }
+    }
+    break ;
+  case OPTIONS_POST_ANIM_STOP: 
+    stop_anim = 1;
+    Set_AnimPixmap(&WID, &PIX, 1) ;
+    Set_AnimCallback(&WID, 1) ;
+    break ;
+  case OPTIONS_POST_ANIM_DELAY: 
+    XmScaleGetValue(WID.OD.postAnimScale, &e);
+    CTX.post.anim_delay = (long)(1.e5*e) ; 
+    break ;
+
+    /* mesh + geom : a changer...*/
+  case OPTIONS_GEOM_HIDE_SHOW :  
+  case OPTIONS_MESH_HIDE_SHOW :  
+    c = XmTextGetString(w); 
+    if (!strcmp(c,"all") || !strcmp(c,"*")){
+      if(SHOW_ALL){ 
+	RemplirEntitesVisibles(0); SHOW_ALL = 0; 
+      }
+      else { 
+	RemplirEntitesVisibles(1); SHOW_ALL = 1; 
+      }
+    }
+    else{
+      ACTUAL_ENTITY = atoi(c);
+      if(EntiteEstElleVisible(ACTUAL_ENTITY))
+	ToutesLesEntitesRelatives(ACTUAL_ENTITY,EntitesVisibles,0);
+      else
+	ToutesLesEntitesRelatives(ACTUAL_ENTITY,EntitesVisibles,1);
+    }
+    break;
+
+  default :
+    Msg(WARNING, "Unknown value in OptionsCb : %d", (long int)client_data); 
+    break;
+  }
+
+}
+
diff --git a/Unix/CbOptions.h b/Unix/CbOptions.h
new file mode 100644
index 0000000000000000000000000000000000000000..e30741453e3a4cafa5acc8d8a54dfa395050fce1
--- /dev/null
+++ b/Unix/CbOptions.h
@@ -0,0 +1,105 @@
+#ifndef _CB_OPTIONS_H_
+#define _CB_OPTIONS_H_
+
+/* options globales */
+					     
+#define  OPTIONS_REPLOT                         1
+#define  OPTIONS_AXES                           2
+#define  OPTIONS_LITTLE_AXES                    3
+#define  OPTIONS_XVIEW                          4
+#define  OPTIONS_YVIEW                          5
+#define  OPTIONS_ZVIEW                          6
+#define  OPTIONS_CVIEW                          7
+#define  OPTIONS_PVIEW                          8
+#define  OPTIONS_SCALEX                         9
+#define  OPTIONS_SCALEY                         10
+#define  OPTIONS_SCALEZ                         11
+#define  OPTIONS_ROTX                           12
+#define  OPTIONS_ROTY                           13
+#define  OPTIONS_ROTZ                           14
+#define  OPTIONS_TRANX                          15
+#define  OPTIONS_TRANY                          16
+#define  OPTIONS_TRANZ                          17
+#define  OPTIONS_ROTX_LOCKED                    18
+#define  OPTIONS_ROTY_LOCKED                    19
+#define  OPTIONS_ROTZ_LOCKED                    20
+#define  OPTIONS_TRANX_LOCKED                   21
+#define  OPTIONS_TRANY_LOCKED                   22
+#define  OPTIONS_TRANZ_LOCKED                   23
+#define  OPTIONS_SCALEX_LOCKED                  24
+#define  OPTIONS_SCALEY_LOCKED                  25
+#define  OPTIONS_SCALEZ_LOCKED                  26
+#define  OPTIONS_ORTHOGRAPHIC                   27
+#define  OPTIONS_PERSPECTIVE                    28
+#define  OPTIONS_LIGHT_X_SCALE                  29
+#define  OPTIONS_LIGHT_Y_SCALE                  30
+#define  OPTIONS_LIGHT_Z_SCALE                  31
+#define  OPTIONS_SHINE_SCALE                    32
+#define  OPTIONS_ALPHA_BLENDING                 33
+#define  OPTIONS_DISPLAY_LISTS                  34
+#define  OPTIONS_FAST_REDRAW                    35
+#define  OPTIONS_COLOR_SCHEME_SCALE             36
+
+/* options geometrie */
+
+#define  OPTIONS_GEOM_CHECK                     100
+#define  OPTIONS_GEOM_POINTS                    101
+#define  OPTIONS_GEOM_LINES                     102
+#define  OPTIONS_GEOM_SURFACES                  103
+#define  OPTIONS_GEOM_VOLUMES                   104
+#define  OPTIONS_GEOM_NORMALS_SCALE             105
+#define  OPTIONS_GEOM_NORMALS_TEXT              106
+#define  OPTIONS_GEOM_TANGENTS_SCALE            107
+#define  OPTIONS_GEOM_TANGENTS_TEXT             108
+#define  OPTIONS_GEOM_HIDE_SHOW                 109
+#define  OPTIONS_GEOM_VISIBILITY_ENTITY         110
+#define  OPTIONS_GEOM_VISIBILITY_NUMBER         111
+
+/* options mesh */
+
+#define  OPTIONS_MESH_POINTS                    200
+#define  OPTIONS_MESH_LINES                     201
+#define  OPTIONS_MESH_SURFACES                  202
+#define  OPTIONS_MESH_VOLUMES                   203
+#define  OPTIONS_MESH_HIDDEN_LINES              204
+#define  OPTIONS_MESH_SHADING                   205
+#define  OPTIONS_MESH_WIREFRAME                 206
+#define  OPTIONS_MESH_NORMALS_SCALE             207
+#define  OPTIONS_MESH_NORMALS_TEXT              208
+#define  OPTIONS_MESH_TANGENTS_SCALE            209
+#define  OPTIONS_MESH_TANGENTS_TEXT             210
+#define  OPTIONS_MESH_EXPLODE_SCALE             211
+#define  OPTIONS_MESH_EXPLODE_TEXT              212
+#define  OPTIONS_MESH_FORMAT_MSH                213
+#define  OPTIONS_MESH_FORMAT_UNV                214
+#define  OPTIONS_MESH_FORMAT_GREF               215
+#define  OPTIONS_MESH_HIDE_SHOW                 216
+#define  OPTIONS_MESH_ABORT                     217
+#define  OPTIONS_MESH_SMOOTHING_SCALE           218
+#define  OPTIONS_MESH_SMOOTHING_TEXT            219
+#define  OPTIONS_MESH_DEGRE2                    220
+#define  OPTIONS_MESH_ANISOTROPIC               221
+#define  OPTIONS_MESH_VISIBILITY_ENTITY         222
+#define  OPTIONS_MESH_VISIBILITY_NUMBER         223
+
+/* options post */
+
+#define  OPTIONS_POST_LINK_NONE                 300
+#define  OPTIONS_POST_LINK_VISIBLE              301
+#define  OPTIONS_POST_LINK_ALL                  302
+#define  OPTIONS_POST_ANIM_START                303
+#define  OPTIONS_POST_ANIM_STOP                 304
+#define  OPTIONS_POST_ANIM_DELAY                305
+
+/* options print */
+
+#define  OPTIONS_PRINT_XDUMP                    400
+#define  OPTIONS_PRINT_GLPPAINTER               401
+#define  OPTIONS_PRINT_GLPRECURSIVE             402
+#define  OPTIONS_PRINT_GLPIMAGE                 403
+#define  OPTIONS_PRINT_GL2PS_SIMPLE             404
+#define  OPTIONS_PRINT_GL2PS_COMPLEX            405
+#define  OPTIONS_PRINT_GL2PS_IMAGE              406
+#define  OPTIONS_PRINT_GIF                      407
+					     
+#endif
diff --git a/Unix/CbPost.cpp b/Unix/CbPost.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..67db8d958b99925680457a6ad459cc7d9de2f6e3
--- /dev/null
+++ b/Unix/CbPost.cpp
@@ -0,0 +1,669 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Views.h"
+#include "ColorTable.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Main.h"
+
+#include "CbPost.h"
+#include "CbGeom.h"
+#include "CbMesh.h"
+#include "CbColorbar.h"
+
+
+extern Widgets_T  WID ;
+extern Context_T  CTX ;
+extern XContext_T XCTX ;
+extern Mesh       *THEM;
+extern int         TYPBGMESH;
+extern int         LC_ORDER;
+extern List_T     *Post_ViewList;
+
+
+static double      ADAPTATION_ERROR=10. ;
+static int         ADAPTATION_METHOD=3 ;
+static int         OFFSET_MODE = 0;
+static Post_View  *CurrentView = NULL;
+static long int    CurrentViewNumber = -1;
+static Post_View  *ViewForDialog[10];
+
+/* ------------------------------------------------------------------------ 
+   set view visible or not
+   ------------------------------------------------------------------------ */
+
+void MarkAllViewsChanged (int action){
+  int i;
+  char label[256];
+  Post_View *v;
+
+  for(i = 0 ; i< List_Nbr(Post_ViewList) ; i++){
+    v = (Post_View*)List_Pointer(Post_ViewList, i);
+    switch(action){
+    case 1: // toggle drawing mode
+      if(v->IntervalsType == DRAW_POST_ISO) 
+	v->IntervalsType = DRAW_POST_DISCRETE ;
+      else if(v->IntervalsType == DRAW_POST_DISCRETE) 
+	v->IntervalsType = DRAW_POST_CONTINUOUS ;
+      else 
+	v->IntervalsType = DRAW_POST_ISO ;
+      break;
+    case 2: // time step++
+      if(v->TimeStep < v->NbTimeStep-1)
+	v->TimeStep++ ;
+      else
+	v->TimeStep = 0 ;
+      sprintf(label, "%d", v->TimeStep);
+      XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL);
+      XmUpdateDisplay(WID.PD.timeStepScale);
+      XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL);
+      XmUpdateDisplay(WID.PD.timeStepText);    
+      break;
+    case 3: // time step--
+      if(v->TimeStep > 0)
+	v->TimeStep-- ;
+      else
+	v->TimeStep = v->NbTimeStep-1 ;
+      sprintf(label, "%d", v->TimeStep);
+      XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL);
+      XmUpdateDisplay(WID.PD.timeStepScale);
+      XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL);
+      XmUpdateDisplay(WID.PD.timeStepText);    
+      break;
+    default :
+      break;
+    }
+    
+    v->Changed = 1 ;
+  }
+}
+
+void SwapViewCb (Widget w, XtPointer client_data, XtPointer call_data){
+  Post_View  *v ;
+
+  if(!Post_ViewList) return;
+
+  v = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1);
+  v->Visible = !v->Visible;
+
+  Init();
+  Draw();
+}
+
+void DuplicateViewCb (Widget w, XtPointer client_data, XtPointer call_data){
+  Post_View  *v1, *v2 ;
+
+  if(!Post_ViewList) return;
+
+  v1 = (Post_View*)List_Pointer(Post_ViewList,(long int)client_data-1);
+
+  BeginView(0);
+  EndView(v1->Name, 0., 0., 0.);
+
+  /* Trash: interdit de desallouer cette view-ci car il existe un duplicata qque part.
+     A changer : garder le num du duplicata et desallouer si ce duplicata n'existe plus, 
+     etc, etc...  */
+  v1->Allocated = 0 ;
+
+  v2 = (Post_View*)List_Pointer(Post_ViewList,List_Nbr(Post_ViewList)-1);
+
+  v2->Simplices  = v1->Simplices;
+  v2->Triangles  = v1->Triangles;
+  v2->Lines      = v1->Lines;
+  v2->Points     = v1->Points;
+  v2->ScalarOnly = v1->ScalarOnly;
+  v2->Min        = v1->Min;       
+  v2->Max        = v1->Max;      
+  v2->NbTimeStep = v1->NbTimeStep;
+  v2->CustomMin  = v1->CustomMin; 
+  v2->CustomMax  = v1->CustomMax; 
+
+  Init();
+  Draw();
+}
+
+void SaveColorTable(FILE *fp){
+  if(!CurrentView){
+    Msg(WARNING, "No View to get Color Information from"); 
+  }
+  else{
+    save_color_table(fp, &CurrentView->CT);
+  }
+}
+
+/* ------------------------------------------------------------------------ 
+   create a post dialog 
+   ------------------------------------------------------------------------ */
+
+void CurrentViewCb (Widget w, XtPointer client_data, XtPointer call_data){
+  CurrentViewNumber = (long int)client_data;
+  CurrentView = (Post_View*)List_Pointer(Post_ViewList, CurrentViewNumber-1);
+}
+
+void PostDialogCb (Widget w, XtPointer client_data, XtPointer call_data){
+  double       d, sfact;
+  char         label[256];
+  int          nb, i;
+  Post_View   *v;
+
+  v = CurrentView ;
+
+  /* le slider (gradue en interne de -100 a 100) va de -LC a +LC  */
+  sfact = pow(10.,2.-LC_ORDER); 
+
+  sprintf(label, "\"%s\" (%ld)", v->Name, CurrentViewNumber);
+
+  switch((long int)client_data){
+
+    /* Toggle Lightning */
+  case POST_LIGHT:     
+    v->Light = !v->Light;
+    v->Changed = 1;
+    Init() ;
+    Draw() ;
+    break;
+
+    /* Toggle Show Elements */
+  case POST_ELEMENT:     
+    v->ShowElement = !v->ShowElement;
+    v->Changed = 1;
+    Init() ;
+    Draw() ;
+    break;
+
+    /* Offset */
+  case POST_OFFSET: 
+    ViewForDialog[POST_OFFSET] = v;
+    XtVaSetValues(WID.PD.offsetDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);
+    XtVaSetValues(WID.PD.offsetModeButt[0], XmNset, (OFFSET_MODE==0)?True:False, NULL);
+    XtVaSetValues(WID.PD.offsetModeButt[1], XmNset, (OFFSET_MODE==1)?True:False, NULL);
+    for(i=0 ; i<3 ; i++){
+      d = (OFFSET_MODE==1)?v->Raise[i]:v->Offset[i] ;
+      sprintf(label, "%g", d);
+      XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL);
+      XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL);    
+    }
+    XtManageChild(WID.PD.offsetDialog);
+    break;
+
+    /* Time Step */
+  case POST_TIME_STEP: 
+    ViewForDialog[POST_TIME_STEP] = v;
+    XtVaSetValues(WID.PD.timeStepDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);
+    XtVaSetValues(WID.PD.timeStepScale, XmNmaximum, v->NbTimeStep-1, XmNvalue, v->TimeStep, NULL);
+    sprintf(label, "%d", v->TimeStep);
+    XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL);
+    XtManageChild(WID.PD.timeStepDialog);
+    break;
+
+    /* Scale */
+  case POST_SCALE: 
+    ViewForDialog[POST_SCALE] = v;
+    XtVaSetValues(WID.PD.scaleDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);
+
+    XtVaSetValues(WID.PD.scaleShowButt, XmNset, v->ShowScale?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleTransButt, XmNset, v->TransparentScale?True:False, NULL);
+
+    XtVaSetValues(WID.PD.scaleText[0], XmNvalue, v->Format, NULL);
+    XtSetSensitive(WID.PD.scaleText[0], v->ShowScale?1:0);
+    XtVaSetValues(WID.PD.scaleText[1], XmNvalue, v->Name, NULL);
+    XtSetSensitive(WID.PD.scaleText[1], v->ShowScale?1:0);
+
+    XtVaSetValues(WID.PD.scaleRangeButt, XmNset, (v->RangeType==DRAW_POST_CUSTOM)?True:False, NULL);
+    sprintf(label, v->Format, v->CustomMin);
+    XtVaSetValues(WID.PD.scaleRangeText[0], XmNvalue, label, NULL);
+    sprintf(label, v->Format, v->CustomMax);
+    XtVaSetValues(WID.PD.scaleRangeText[1], XmNvalue, label, NULL);
+    XtSetSensitive(WID.PD.scaleRangeText[0], (v->RangeType==DRAW_POST_CUSTOM)?1:0);
+    XtSetSensitive(WID.PD.scaleRangeText[1], (v->RangeType==DRAW_POST_CUSTOM)?1:0);
+
+    XtVaSetValues(WID.PD.scaleTypeButt[0], XmNset,(v->ScaleType==DRAW_POST_LINEAR)?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleTypeButt[1], XmNset,(v->ScaleType==DRAW_POST_LOGARITHMIC)?True:False, NULL);
+
+    XtVaSetValues(WID.PD.scaleIntervalsButt[0], XmNset,
+		  (v->IntervalsType==DRAW_POST_ISO)?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleIntervalsButt[1], XmNset,
+		  (v->IntervalsType==DRAW_POST_DISCRETE)?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleIntervalsButt[2], XmNset,
+		  (v->IntervalsType==DRAW_POST_CONTINUOUS)?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleIntervalsButt[3], XmNset,
+		  (v->IntervalsType==DRAW_POST_NUMERIC)?True:False, NULL);
+    XtVaSetValues(WID.PD.scaleIntervalsScale, XmNvalue, THRESHOLD((int)v->NbIso,1,100), NULL);
+
+    sprintf(label, "%d", v->NbIso);
+    XtVaSetValues(WID.PD.scaleIntervalsText, XmNvalue, label, NULL);
+
+    XtManageChild(WID.PD.scaleDialog);
+    break;
+
+    /* Color */
+  case POST_COLOR: 
+    ViewForDialog[POST_COLOR] = v;
+    XtVaSetValues(WID.PD.colorDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);
+    XtManageChild(WID.PD.colorDialog);
+
+    XSelectInput(XCTX.display, XtWindow(WID.PD.colorDrawingArea), EV_MASK);
+    ColorBarCreate(XtWindow(WID.PD.colorDrawingArea),255,200);
+    ColorBarChange(v->Name, 
+		   (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMin:v->Min, 
+		   (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMax:v->Max, 
+		   &v->CT, 1);
+    ColorBarResizeCb((Widget)NULL, NULL, NULL); // Force resize
+    ColorBarShow();
+    break;
+
+    /* Vector */
+  case POST_VECTOR: 
+    ViewForDialog[POST_VECTOR] = v;
+    XtVaSetValues(WID.PD.vectorDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);
+    XtVaSetValues(WID.PD.vectorTypeButt[0], XmNset, (v->ArrowType == DRAW_POST_SEGMENT)?True:False, NULL);
+    XtVaSetValues(WID.PD.vectorTypeButt[1], XmNset, (v->ArrowType == DRAW_POST_ARROW)?True:False, NULL);
+    XtVaSetValues(WID.PD.vectorTypeButt[2], XmNset, (v->ArrowType == DRAW_POST_PYRAMID)?True:False, NULL);
+    XtVaSetValues(WID.PD.vectorTypeButt[3], XmNset, (v->ArrowType == DRAW_POST_CONE)?True:False, NULL);  
+    XtVaSetValues(WID.PD.vectorTypeButt[4], XmNset, 
+		  (v->ArrowType == DRAW_POST_DISPLACEMENT)?True:False, NULL);
+    sprintf(label, "%g", v->ArrowScale);
+    XtVaSetValues(WID.PD.vectorScaleText, XmNvalue, label, NULL);
+    XtVaSetValues(WID.PD.vectorScaleScale, XmNvalue, THRESHOLD((int)v->ArrowScale,0,200), NULL);
+    XtVaSetValues(WID.PD.vectorLocationButt[0], XmNset, 
+		  (v->ArrowLocation == DRAW_POST_LOCATE_COG)?True:False, NULL);
+    XtVaSetValues(WID.PD.vectorLocationButt[1], XmNset, 
+		  (v->ArrowLocation == DRAW_POST_LOCATE_VERTEX)?True:False, NULL);
+    XtSetSensitive(WID.PD.vectorLocationCheck, v->ArrowType==DRAW_POST_DISPLACEMENT?False:True);
+    XtManageChild(WID.PD.vectorDialog);
+    break;
+
+    /* Export BGM */
+  case POST_EXPORT_BGM:
+    ViewForDialog[POST_EXPORT_BGM] = v;
+    strcat(label, " : Export as Background Mesh");
+    XtVaSetValues(WID.PD.exportBGMDialog, XmNdialogTitle, XmStringCreateSimple(label), NULL);    
+    d = ErrorInView(v,&nb) ;
+    sprintf(label, "Options (Current: %d elements, error=%g%%)", nb, d); 
+    XtVaSetValues(WID.PD.exportBGMFrame[1], XmNlabelString, XmStringCreateSimple(label), NULL);
+    XtManageChild(WID.PD.exportBGMDialog);
+    break;
+
+    
+    /* apply BGM */
+  case POST_APPLY_BGM  : 
+    ViewForDialog[POST_APPLY_BGM] = v;
+    BGMWithView(v); 
+    TYPBGMESH = ONFILE; 
+    Create_BgMesh(TYPBGMESH,.2,THEM); 
+    break;
+
+  default:
+    Msg(WARNING, "Unknown event in PostDialogCb : %d", (long int)client_data); 
+    break;
+  }
+}
+
+
+/* ------------------------------------------------------------------------ 
+   functions in post dialogs  
+   ------------------------------------------------------------------------ */
+
+void ChangeViewParam (Post_View *v, XtPointer client_data, XtPointer call_data) ;
+
+void PostCb (Widget w, XtPointer client_data, XtPointer call_data){
+  int          j;
+  Post_View   *v=NULL;
+  double       d;
+  char        *c;
+  XmString     xms;
+  static int   LastTimeStep = 0;
+
+  switch((long int)client_data){
+
+  case POST_EXPORT_BGM_METHOD_H_ERROR    : ADAPTATION_METHOD = 3; break;
+  case POST_EXPORT_BGM_METHOD_H_ELEMENTS : ADAPTATION_METHOD = 4; break;
+  case POST_EXPORT_BGM_METHOD_P_ERROR    : ADAPTATION_METHOD = 1; break;
+  case POST_EXPORT_BGM_METHOD_P_ELEMENTS : ADAPTATION_METHOD = 2; break;
+  case POST_EXPORT_BGM_CONSTRAINT : 
+    v = ViewForDialog[POST_EXPORT_BGM];
+    ADAPTATION_ERROR = atof(XmTextGetString(w)); 
+    return ;
+  case POST_EXPORT_BGM_CREATE   : 
+    v = ViewForDialog[POST_EXPORT_BGM];
+    XtVaGetValues(w, XmNtextString, &xms, NULL);
+    XmStringGetLtoR(xms, XmSTRING_DEFAULT_CHARSET, &c);
+    XmStringFree(xms);
+    CreateBGM(v, ADAPTATION_METHOD, 1.0, ADAPTATION_ERROR, &d, c); 
+    MergeProblem(c);     
+    Init(); 
+    Draw();
+    return;
+  case POST_COLOR_REPLOT : 
+    v = ViewForDialog[POST_COLOR];
+    ColorBarChange(v->Name, 
+		   (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMin:v->Min, 
+		   (v->RangeType==DRAW_POST_CUSTOM)?v->CustomMax:v->Max, 
+		   &v->CT, 0);
+    ColorBarShow();
+    if(v->CT.ipar[COLORTABLE_CHANGED]){
+      v->Changed = 1;
+      if(CTX.post.link){
+	ColorBarCopy(&v->CT);
+	for(j=0 ; j< List_Nbr(Post_ViewList) ; j++){
+	  v = (Post_View*)List_Pointer(Post_ViewList, j);
+	  if(v->Visible || CTX.post.link>1){
+	    ColorBarPaste(&v->CT);
+	    v->Changed=1;
+	  }
+	}
+      }
+    }
+    Init();
+    Draw();
+    return;
+  }
+
+  if(CTX.post.link){
+    for(j=0 ; j< List_Nbr(Post_ViewList) ; j++){
+      v = (Post_View*)List_Pointer(Post_ViewList, j);
+      if(v->Visible || CTX.post.link>1) ChangeViewParam(v, client_data, call_data);
+    }
+  }
+  else{
+    switch((long int)client_data){
+    case POST_OFFSET_TRANSLATE: 
+    case POST_OFFSET_RAISE: 
+    case POST_OFFSET_X_TEXT:       
+    case POST_OFFSET_Y_TEXT:       
+    case POST_OFFSET_Z_TEXT:       
+    case POST_OFFSET_X_SCALE:
+    case POST_OFFSET_Y_SCALE:
+    case POST_OFFSET_Z_SCALE:
+      v = ViewForDialog[POST_OFFSET];
+      break;
+    case POST_TIME_STEP_TEXT:
+    case POST_TIME_STEP_SCALE:
+      v = ViewForDialog[POST_TIME_STEP];
+      break;
+    case POST_SCALE_SHOW: 
+    case POST_SCALE_TRANSPARENCY: 
+    case POST_SCALE_FORMAT: 
+    case POST_SCALE_LABEL:
+    case POST_SCALE_MIN:
+    case POST_SCALE_MAX:      
+    case POST_SCALE_TYPE_LIN: 
+    case POST_SCALE_TYPE_LOG: 
+    case POST_SCALE_FORCE_RANGE:   
+    case POST_SCALE_INTERVALS_TYPE_ISO : 
+    case POST_SCALE_INTERVALS_TYPE_DISCRETE : 
+    case POST_SCALE_INTERVALS_TYPE_CONTINUOUS: 
+    case POST_SCALE_INTERVALS_TYPE_NUMERIC: 
+    case POST_SCALE_INTERVALS_TEXT:    
+    case POST_SCALE_INTERVALS_SCALE:   
+      v = ViewForDialog[POST_SCALE];
+      break;
+    case POST_VECTOR_TYPE_SEGMENT:
+    case POST_VECTOR_TYPE_ARROW:        
+    case POST_VECTOR_TYPE_PYRAMID:      
+    case POST_VECTOR_TYPE_CONE:
+    case POST_VECTOR_TYPE_DISPLACEMENT:
+    case POST_VECTOR_SCALE_TEXT:    
+    case POST_VECTOR_SCALE_SCALE:   
+    case POST_VECTOR_LOCATION_COG:    
+    case POST_VECTOR_LOCATION_VERTEX: 
+      v = ViewForDialog[POST_VECTOR];
+      break;
+    default :
+      Msg(WARNING, "Unknown event in PostCb");
+      break;
+    }
+    ChangeViewParam(v, client_data, call_data);
+  }
+
+
+  if((long int)client_data == POST_TIME_STEP_SCALE){
+    if(LastTimeStep != v->TimeStep){
+      LastTimeStep = v->TimeStep;
+      Init();
+      Draw();
+    }
+  }
+
+}
+
+void ChangeViewParam (Post_View *v, XtPointer client_data, XtPointer call_data){
+  double       d, sfact;
+  char        *c, label[256];
+  int          i;
+
+  /* le slider (gradue en interne de -100 a 100) va de -LC a +LC  */
+  sfact = pow(10.,2.-LC_ORDER); 
+
+  switch((long int)client_data){
+
+    /* Offset */
+  case POST_OFFSET_TRANSLATE: 
+    OFFSET_MODE = 0;
+    for(i=0 ; i<3 ; i++){
+      sprintf(label, "%g", v->Offset[i]);
+      XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL);
+      XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, 
+		    THRESHOLD((int)(sfact*v->Offset[i]),-100,100), NULL);    
+      XmUpdateDisplay(WID.PD.offsetText[i]);
+      XmUpdateDisplay(WID.PD.offsetScale[i]);
+    }
+    break;
+  case POST_OFFSET_RAISE: 
+    OFFSET_MODE = 1;
+    for(i=0 ; i<3 ; i++){
+      sprintf(label, "%g", v->Raise[i]);
+      XtVaSetValues(WID.PD.offsetText[i], XmNvalue, label, NULL);
+      XtVaSetValues(WID.PD.offsetScale[i], XmNvalue, 
+		    THRESHOLD((int)(sfact*v->Raise[i]),-100,100), NULL);    
+      XmUpdateDisplay(WID.PD.offsetText[i]);
+      XmUpdateDisplay(WID.PD.offsetScale[i]);
+    }
+    break;
+  case POST_OFFSET_X_TEXT:       
+    d = atof(XmTextGetString(WID.PD.offsetText[0])); 
+    OFFSET_MODE ? (v->Raise[0] = d) : (v->Offset[0] = d);
+    XtVaSetValues(WID.PD.offsetScale[0], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL);
+    XmUpdateDisplay(WID.PD.offsetScale[0]);
+    v->Changed = 1;
+    break;
+  case POST_OFFSET_Y_TEXT:       
+    d = atof(XmTextGetString(WID.PD.offsetText[1])); 
+    OFFSET_MODE ? (v->Raise[1] = d) : (v->Offset[1] = d);
+    XtVaSetValues(WID.PD.offsetScale[1], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL);
+    XmUpdateDisplay(WID.PD.offsetScale[1]);
+    v->Changed = 1;
+    break;
+  case POST_OFFSET_Z_TEXT:       
+    d = atof(XmTextGetString(WID.PD.offsetText[2])); 
+    OFFSET_MODE ? (v->Raise[2] = d) : (v->Offset[2] = d);
+    XtVaSetValues(WID.PD.offsetScale[2], XmNvalue, THRESHOLD((int)(sfact*d),-100,100), NULL);
+    XmUpdateDisplay(WID.PD.offsetScale[2]);
+    v->Changed = 1;
+    break;
+  case POST_OFFSET_X_SCALE:
+    XmScaleGetValue (WID.PD.offsetScale[0], &i);
+    d = i/sfact ;
+    sprintf(label, "%g", d);
+    OFFSET_MODE ? (v->Raise[0] = d) : (v->Offset[0] = d);
+    XtVaSetValues(WID.PD.offsetText[0],XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.offsetText[0]);
+    v->Changed = 1;
+    break;
+  case POST_OFFSET_Y_SCALE:
+    XmScaleGetValue (WID.PD.offsetScale[1], &i);
+    d = i/sfact ;
+    sprintf(label, "%g",d);
+    OFFSET_MODE ? (v->Raise[1]) = d : (v->Offset[1] = d);
+    XtVaSetValues(WID.PD.offsetText[1],XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.offsetText[1]);
+    v->Changed = 1;
+    break;
+  case POST_OFFSET_Z_SCALE:
+    XmScaleGetValue (WID.PD.offsetScale[2], &i);
+    d = i/sfact ;
+    sprintf(label, "%g", d);
+    OFFSET_MODE ? (v->Raise[2] = d) : (v->Offset[2] = d);
+    XtVaSetValues(WID.PD.offsetText[2],XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.offsetText[2]);
+    v->Changed = 1;
+    break;
+
+    /* Time Step */
+  case POST_TIME_STEP_TEXT:
+    i = atoi(XmTextGetString(WID.PD.timeStepText));
+    if(i < 0)
+      v->TimeStep = 0;
+    else if(i > v->NbTimeStep-1) 
+      v->TimeStep = v->NbTimeStep-1;
+    else
+      v->TimeStep = i;
+    XtVaSetValues(WID.PD.timeStepScale, XmNvalue, v->TimeStep, NULL);
+    XmUpdateDisplay(WID.PD.timeStepScale);
+    v->Changed = 1;
+    break;
+  case POST_TIME_STEP_SCALE:
+    XmScaleGetValue (WID.PD.timeStepScale, &i);
+    if(i < 0)
+      v->TimeStep = 0;
+    else if(i > v->NbTimeStep-1) 
+      v->TimeStep = v->NbTimeStep-1;
+    else
+      v->TimeStep = i;
+    sprintf(label, "%d", v->TimeStep);
+    XtVaSetValues(WID.PD.timeStepText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.timeStepText);    
+    v->Changed = 1;
+    break;
+
+
+    /* Scale */
+  case POST_SCALE_SHOW: 
+    v->ShowScale = !v->ShowScale; 
+    XtSetSensitive(WID.PD.scaleText[0], v->ShowScale?1:0);
+    XtSetSensitive(WID.PD.scaleText[1], v->ShowScale?1:0);
+    break;
+  case POST_SCALE_TRANSPARENCY: 
+    v->TransparentScale = !v->TransparentScale; 
+    break;
+  case POST_SCALE_FORMAT: 
+    c = XmTextGetString(WID.PD.scaleText[0]); strcpy(v->Format,c); 
+    break;
+  case POST_SCALE_LABEL:
+    c = XmTextGetString(WID.PD.scaleText[1]); strcpy(v->Name,c); 
+    break;
+  case POST_SCALE_MIN:
+    v->CustomMin = atof(XmTextGetString(WID.PD.scaleRangeText[0])); 
+    if(v->RangeType==DRAW_POST_CUSTOM) v->Changed = 1;
+    break;
+  case POST_SCALE_MAX:      
+    v->CustomMax = atof(XmTextGetString(WID.PD.scaleRangeText[1])); 
+    if(v->RangeType==DRAW_POST_CUSTOM) v->Changed = 1;
+    break;
+  case POST_SCALE_TYPE_LIN: 
+    v->ScaleType = DRAW_POST_LINEAR;  
+    v->Changed = 1;
+    break;
+  case POST_SCALE_TYPE_LOG: 
+    v->ScaleType = DRAW_POST_LOGARITHMIC; 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_FORCE_RANGE:   
+    (v->RangeType == DRAW_POST_DEFAULT) ? 
+      (v->RangeType=DRAW_POST_CUSTOM) : (v->RangeType=DRAW_POST_DEFAULT);
+    XtSetSensitive(WID.PD.scaleRangeText[0], (v->RangeType==DRAW_POST_CUSTOM)?1:0);
+    XtSetSensitive(WID.PD.scaleRangeText[1], (v->RangeType==DRAW_POST_CUSTOM)?1:0); 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_TYPE_ISO : 
+    v->IntervalsType = DRAW_POST_ISO; 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_TYPE_DISCRETE : 
+    v->IntervalsType = DRAW_POST_DISCRETE; 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_TYPE_CONTINUOUS: 
+    v->IntervalsType = DRAW_POST_CONTINUOUS; 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_TYPE_NUMERIC: 
+    v->IntervalsType = DRAW_POST_NUMERIC; 
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_TEXT:    
+    v->NbIso = atoi(XmTextGetString(WID.PD.scaleIntervalsText));
+    XtVaSetValues(WID.PD.scaleIntervalsScale, XmNvalue, THRESHOLD((int)v->NbIso,1,100), NULL);
+    XmUpdateDisplay(WID.PD.scaleIntervalsScale);
+    v->Changed = 1;
+    break;
+  case POST_SCALE_INTERVALS_SCALE:   
+    XmScaleGetValue(WID.PD.scaleIntervalsScale, &v->NbIso);
+    sprintf(label, "%d", v->NbIso);
+    XtVaSetValues(WID.PD.scaleIntervalsText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.scaleIntervalsText);
+    v->Changed = 1;
+    break;
+
+    /* Vector */
+  case POST_VECTOR_TYPE_SEGMENT:
+    v->ArrowType = DRAW_POST_SEGMENT; 
+    XtSetSensitive(WID.PD.vectorLocationCheck, True);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_TYPE_ARROW:        
+    v->ArrowType = DRAW_POST_ARROW; 
+    XtSetSensitive(WID.PD.vectorLocationCheck, True);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_TYPE_PYRAMID:      
+    v->ArrowType = DRAW_POST_PYRAMID; 
+    XtSetSensitive(WID.PD.vectorLocationCheck, True);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_TYPE_CONE:
+    v->ArrowType = DRAW_POST_CONE; 
+    XtSetSensitive(WID.PD.vectorLocationCheck, True);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_TYPE_DISPLACEMENT:
+    v->ArrowType = DRAW_POST_DISPLACEMENT; 
+    XtSetSensitive(WID.PD.vectorLocationCheck, False);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_SCALE_TEXT:    
+    v->ArrowScale = atof(XmTextGetString(WID.PD.vectorScaleText));
+    XtVaSetValues(WID.PD.vectorScaleScale, XmNvalue, THRESHOLD((int)v->ArrowScale,0,200), NULL);
+    XmUpdateDisplay(WID.PD.vectorScaleScale);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_SCALE_SCALE:   
+    XmScaleGetValue(WID.PD.vectorScaleScale, &i);
+    v->ArrowScale = (double)i;
+    sprintf(label, "%g", v->ArrowScale);
+    XtVaSetValues(WID.PD.vectorScaleText, XmNvalue, label, NULL);
+    XmUpdateDisplay(WID.PD.vectorScaleText);
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_LOCATION_COG:    
+    v->ArrowLocation = DRAW_POST_LOCATE_COG; 
+    v->Changed = 1;
+    break;
+  case POST_VECTOR_LOCATION_VERTEX: 
+    v->ArrowLocation = DRAW_POST_LOCATE_VERTEX; 
+    v->Changed = 1;
+    break;
+
+  default:
+    Msg(WARNING, "Unknown event in PostCb : %d", (long int)client_data); 
+    break;
+
+  }
+
+}
+
diff --git a/Unix/CbPost.h b/Unix/CbPost.h
new file mode 100644
index 0000000000000000000000000000000000000000..98fd4a5aa85ea02b9ce6b875ae0aabd8109d6b57
--- /dev/null
+++ b/Unix/CbPost.h
@@ -0,0 +1,64 @@
+#ifndef _CB_POST_H_
+#define _CB_POST_H_
+
+#define  POST_LINK                                 1
+#define  POST_OFFSET                               2
+#define  POST_TIME_STEP                            3
+#define  POST_SCALE                                4
+#define  POST_VECTOR                               5
+#define  POST_EXPORT_BGM                           6
+#define  POST_APPLY_BGM                            7
+#define  POST_LIGHT                                8
+#define  POST_COLOR                                9
+#define  POST_ELEMENT                              10
+
+#define  POST_OFFSET_TRANSLATE                     403
+#define  POST_OFFSET_RAISE                         404
+#define  POST_OFFSET_X_TEXT                        405
+#define  POST_OFFSET_Y_TEXT                        406
+#define  POST_OFFSET_Z_TEXT                        407
+#define  POST_OFFSET_X_SCALE                       408
+#define  POST_OFFSET_Y_SCALE                       409
+#define  POST_OFFSET_Z_SCALE                       410
+
+#define  POST_TIME_STEP_TEXT                       417
+#define  POST_TIME_STEP_SCALE                      418
+
+#define  POST_SCALE_SHOW                           421
+#define  POST_SCALE_TRANSPARENCY                   422
+#define  POST_SCALE_FORMAT                         423
+#define  POST_SCALE_LABEL                          424
+#define  POST_SCALE_FORCE_RANGE                    425
+#define  POST_SCALE_MIN                            426
+#define  POST_SCALE_MAX                            427
+#define  POST_SCALE_TYPE_LIN                       428
+#define  POST_SCALE_TYPE_LOG                       429
+#define  POST_SCALE_INTERVALS_TYPE_ISO             430
+#define  POST_SCALE_INTERVALS_TYPE_DISCRETE        431
+#define  POST_SCALE_INTERVALS_TYPE_CONTINUOUS      432
+#define  POST_SCALE_INTERVALS_TYPE_NUMERIC         433
+#define  POST_SCALE_INTERVALS_SCALE                434
+#define  POST_SCALE_INTERVALS_TEXT                 435
+
+#define  POST_COLOR_REPLOT                         440
+
+#define  POST_VECTOR_TYPE_SEGMENT                  450
+#define  POST_VECTOR_TYPE_ARROW                    451
+#define  POST_VECTOR_TYPE_PYRAMID                  452
+#define  POST_VECTOR_TYPE_CONE                     453
+#define  POST_VECTOR_TYPE_DISPLACEMENT             454
+#define  POST_VECTOR_SCALE_TEXT                    455
+#define  POST_VECTOR_SCALE_SCALE                   456
+#define  POST_VECTOR_LOCATION_COG                  457
+#define  POST_VECTOR_LOCATION_VERTEX               458
+						    
+#define  POST_EXPORT_BGM_METHOD_H_ERROR            461
+#define  POST_EXPORT_BGM_METHOD_H_ELEMENTS         462
+#define  POST_EXPORT_BGM_METHOD_P_ERROR            463
+#define  POST_EXPORT_BGM_METHOD_P_ELEMENTS         464
+#define  POST_EXPORT_BGM_CONSTRAINT                465
+#define  POST_EXPORT_BGM_CREATE                    466
+
+void MarkAllViewsChanged (int action);
+
+#endif
diff --git a/Unix/Geometry.cpp b/Unix/Geometry.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4e31e85ef0c8bfcad7268d95676d4504ce237f54
--- /dev/null
+++ b/Unix/Geometry.cpp
@@ -0,0 +1,829 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Widgets.h"
+
+extern Context_T   CTX ;
+extern XContext_T  XCTX ;
+
+#define WINDOW_SHADOW   1
+#define SHADOW          2
+#define IN_FRAME_TYPE   XmSHADOW_ETCHED_IN
+#define IN_FRAME_SHADOW 2
+#define TITLE_SPACE     0
+#define TITLE_ALIGN     XmALIGNMENT_WIDGET_TOP
+#define DIALOG_W        6
+#define DIALOG_H        4
+
+
+/* 
+   XmNchildVerticalAlignment : 
+   CENTER, WIDGET_TOP, WIDGET_BOTTOM, BASELINE_BOTTOM, BASELINE_TOP  
+
+   XmNshadowType :
+   ETCHED_IN, ETCHED_OUT, IN, OUT
+*/
+
+/* ------------------------------------------------------------------------ 
+    MENU WINDOW
+   ------------------------------------------------------------------------ */
+
+void ForceGeometry_M (Widgets_T *w){
+  int     n;
+
+  XtVaSetValues(w->M.containerWin,
+		XmNmenuBar, w->M.menuBar,
+  		NULL);
+
+  XtVaSetValues(w->M.menuBar,
+		XmNmenuHelpWidget, w->M.helpCascade, 
+		NULL);
+
+  XtVaSetValues(w->M.menuFrame,
+		XmNshadowType, XmSHADOW_OUT,
+		XmNshadowThickness, WINDOW_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->M.menuForm,
+		XmNfractionBase, 100,
+		XmNmarginWidth, 3,
+		XmNmarginHeight, 3,
+		NULL);
+
+  XtVaSetValues(w->M.modButt,
+		XmNmarginHeight, 5,
+		XmNmarginWidth, 2,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_WIDGET,
+		XmNleftWidget, w->M.navigButt[0],
+		XmNrightAttachment, XmATTACH_WIDGET,
+		XmNrightWidget, w->M.navigButt[1],
+		NULL);
+
+  XtVaSetValues(w->M.navigButt[0],
+		XmNshadowThickness, 0,
+		XmNwidth, 20,
+		XmNleftAttachment, XmATTACH_FORM,
+		NULL);
+
+  XtVaSetValues(w->M.navigButt[1],
+		XmNshadowThickness, 0,
+		XmNwidth, 20,
+		XmNrightAttachment, XmATTACH_FORM,
+		NULL);
+
+  XtVaSetValues(w->M.defaultButt,
+		XmNmarginHeight, 5,
+		XmNtopAttachment, XmATTACH_WIDGET,
+		XmNtopWidget, w->M.modButt,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		NULL);
+
+  XtVaSetValues(w->M.pushButt[0],
+		XmNshadowThickness, SHADOW,
+		XmNmarginHeight, 5,
+		XmNtopAttachment, XmATTACH_WIDGET,
+		XmNtopWidget, w->M.modButt,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		NULL);
+  
+  XtVaSetValues(w->M.toggleButt[0],
+		XmNshadowThickness, SHADOW,
+		XmNmarginHeight, 3,
+		XmNtopAttachment, XmATTACH_WIDGET,
+		XmNtopWidget, w->M.modButt,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		NULL);
+
+  for(n=1 ; n<NB_BUTT_MAX ; n++){
+    XtVaSetValues(w->M.pushButt[n],
+		  XmNtopAttachment, XmATTACH_WIDGET,
+		  XmNtopWidget, w->M.pushButt[n-1],
+		  XmNleftAttachment, XmATTACH_FORM,
+		  XmNrightAttachment, XmATTACH_FORM,
+		  XmNshadowThickness, SHADOW,
+		  XmNmarginHeight, 5,
+		  NULL);
+
+    XtVaSetValues(w->M.toggleButt[n],
+		  XmNtopAttachment, XmATTACH_WIDGET,
+		  XmNtopWidget, w->M.toggleButt[n-1],
+		  XmNleftAttachment, XmATTACH_FORM,
+		  XmNrightAttachment, XmATTACH_FORM,
+		  XmNshadowThickness, SHADOW,
+		  XmNmarginHeight, 3,
+		  NULL);
+  }
+
+}
+
+/* ------------------------------------------------------------------------ 
+    GRAPHIC WINDOW
+   ------------------------------------------------------------------------ */
+
+void ForceGeometry_G (Widgets_T *w){
+  int  i;
+
+  XtVaSetValues(w->G.glw,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_WIDGET,
+		XmNbottomWidget, w->G.bottomForm,
+		NULL);
+
+  if(CTX.overlay)
+    XtVaSetValues(w->G.glo,
+		  XmNtopAttachment, XmATTACH_FORM,
+		  XmNleftAttachment, XmATTACH_FORM,
+		  XmNrightAttachment, XmATTACH_FORM,
+		  XmNbottomAttachment, XmATTACH_WIDGET,
+		  XmNbottomWidget, w->G.bottomForm,
+		  NULL);
+
+  XtVaSetValues(w->G.bottomForm,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNmarginHeight, 2,
+		XmNmarginWidth, 1,
+		XmNshadowThickness, WINDOW_SHADOW,
+		XmNfractionBase, 100,
+		NULL);
+
+  XtVaSetValues(w->G.Butt[0],
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_FORM,
+                XmNshadowThickness, 0,
+		XmNmarginHeight, 1,
+                NULL);
+
+  for(i=1 ; i<7 ; i++) {
+    XtVaSetValues(w->G.Butt[i],
+		  XmNtopAttachment, XmATTACH_FORM,
+		  XmNbottomAttachment, XmATTACH_FORM,
+		  XmNleftAttachment, XmATTACH_WIDGET,
+		  XmNleftWidget, w->G.Butt[i-1],
+		  XmNshadowThickness, 0,
+		  XmNmarginHeight, 1,
+		  NULL);
+  }
+
+  XtVaSetValues(w->G.textForm,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_WIDGET,
+		XmNleftWidget, w->G.Butt[6],
+		XmNrightAttachment, XmATTACH_FORM,
+		XmNfractionBase, 300,
+		NULL);
+
+  XtVaSetValues(w->G.selectLabel,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_POSITION,
+                XmNleftPosition, 2,
+		XmNrightAttachment, XmATTACH_POSITION,
+                XmNrightPosition, 90,
+		XmNmarginHeight, 0,
+                NULL);
+
+  XtVaSetValues(w->G.infoLabel,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_POSITION,
+                XmNleftPosition, 92,
+		XmNrightAttachment, XmATTACH_POSITION,
+                XmNrightPosition, 180,
+		XmNmarginHeight, 0,
+                NULL);
+
+  XtVaSetValues(w->G.statusLabel,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_POSITION,
+                XmNleftPosition, 182,
+		XmNrightAttachment, XmATTACH_POSITION,
+                XmNrightPosition, 298,
+		XmNmarginHeight, 0,
+                NULL);
+
+
+}
+
+/* ------------------------------------------------------------------------ 
+    COMMAND WINDOW
+   ------------------------------------------------------------------------ */
+
+void ForceGeometry_C (Widgets_T *w){
+  
+  XtVaSetValues(w->C.command,
+		XmNshadowThickness, WINDOW_SHADOW,
+		XmNshadowType, XmSHADOW_OUT,
+		XmNmarginHeight, 2,
+		XmNmarginWidth, 2,
+		NULL);
+
+  XtVaSetValues(w->C.commandList,
+		XmNshadowThickness, SHADOW,
+		XmNmarginHeight, 0,
+		NULL);
+
+  XtVaSetValues(w->C.commandText,
+		XmNshadowThickness, SHADOW,
+		XmNmarginHeight, 4,
+		NULL);
+}
+
+/* ------------------------------------------------------------------------ 
+    DIALOGS
+   ------------------------------------------------------------------------ */
+
+void ForceGeometry_ED (Widgets_T *w){
+}
+
+void ForceGeometry_FD (Widgets_T *w){
+
+  XtVaSetValues(w->FD.openDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->FD.mergeDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->FD.saveDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->FD.saveAsDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->FD.saveAsFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->FD.saveAsFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->FD.saveAsRowCol,
+		XmNmarginWidth, 0,
+		NULL);
+
+  XtVaSetValues(w->FD.printDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->FD.printFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->FD.printFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->FD.printRowCol,
+		XmNmarginWidth, 0,
+		NULL);
+
+}
+
+void ForceGeometry_OD (Widgets_T *w){
+  int  i,j;
+
+  XtVaSetValues(w->OD.geomDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->OD.geomVisibleFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.geomVisibleFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.geomVisibleByNumFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.geomVisibleByNumFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.geomNormalsFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.geomNormalsFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.geomTangentsFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.geomTangentsFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->OD.meshAlgoFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshAlgoFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+  
+  XtVaSetValues(w->OD.meshSmoothingFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshSmoothingFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshVisibleFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshVisibleFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshVisibleByNumFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshVisibleByNumFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshAspectFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshAspectFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshExplodeFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshExplodeFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.meshNormalsFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.meshNormalsFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.postDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->OD.postLinkFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.postLinkFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.postAnimFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.postAnimFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.miscDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->OD.miscMiscFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.miscMiscFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.miscColorSchemeFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.miscColorSchemeFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+  
+  XtVaSetValues(w->OD.miscProjFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.miscProjFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.miscLightFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.miscLightFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.miscShineFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->OD.miscShineFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->OD.viewportDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+  
+  for(i=0 ; i<3 ; i++){
+    XtVaSetValues(w->OD.viewportFrame[0][i],    
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+		  
+    XtVaSetValues(w->OD.viewportFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+
+    for(j=0 ; j<3 ; j++){
+      XtVaSetValues(w->OD.viewportLockButt[j][i],
+		    XmNmarginHeight, 0,
+		    NULL);
+    }
+  }
+
+  XtVaSetValues(w->OD.infoDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<3 ; i++){
+    XtVaSetValues(w->OD.infoFrame[0][i],    
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+		  
+    XtVaSetValues(w->OD.infoFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+}
+
+void ForceGeometry_HD (Widgets_T *w){
+
+  XtVaSetValues(w->HD.keysDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+}
+
+void ForceGeometry_GD (Widgets_T *w){
+  int  i;
+
+  XtVaSetValues(w->GD.paramDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<2 ; i++){
+    XtVaSetValues(w->GD.paramFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+
+    XtVaSetValues(w->GD.paramFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+
+  XtVaSetValues(w->GD.pointDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<2 ; i++){
+    XtVaSetValues(w->GD.pointFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+
+    XtVaSetValues(w->GD.pointFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+  XtVaSetValues(w->GD.rotDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<3 ; i++){
+    XtVaSetValues(w->GD.rotFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+
+    XtVaSetValues(w->GD.rotFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+  XtVaSetValues(w->GD.tranDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->GD.tranFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->GD.tranFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->GD.dilatDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<2 ; i++){
+    XtVaSetValues(w->GD.dilatFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+
+    XtVaSetValues(w->GD.dilatFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+}
+
+void ForceGeometry_MD (Widgets_T *w){
+  int  i;
+
+  XtVaSetValues(w->MD.charLengthDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->MD.charLengthFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->MD.charLengthFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->MD.trsfLineDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<2 ; i++){
+    XtVaSetValues(w->MD.trsfLineFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+    XtVaSetValues(w->MD.trsfLineFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+  
+  XtVaSetValues(w->MD.trsfVolumeDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->MD.trsfVolumeFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->MD.trsfVolumeFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+}
+
+void ForceGeometry_PD (Widgets_T *w){
+  int  i;
+  
+
+  XtVaSetValues(w->PD.offsetDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<4 ; i++){
+    XtVaSetValues(w->PD.offsetFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+    XtVaSetValues(w->PD.offsetFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+  
+  XtVaSetValues(w->PD.timeStepDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->PD.timeStepFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+  XtVaSetValues(w->PD.timeStepFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->PD.scaleDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<3 ; i++){
+    XtVaSetValues(w->PD.scaleFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+    XtVaSetValues(w->PD.scaleFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+
+  XtVaSetValues(w->PD.colorDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+  XtVaSetValues(w->PD.colorFrame[0][0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+  XtVaSetValues(w->PD.colorFrame[1][0],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+  XtVaSetValues(w->PD.colorDrawingArea,
+		XmNtopAttachment, XmATTACH_FORM,
+		XmNleftAttachment, XmATTACH_FORM,
+		XmNrightAttachment, XmATTACH_FORM,
+		XmNbottomAttachment, XmATTACH_FORM,
+		XmNwidth, 255,
+		XmNheight, 200,
+		NULL);
+
+
+  XtVaSetValues(w->PD.vectorDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  for(i=0 ; i<3 ; i++){
+    XtVaSetValues(w->PD.vectorFrame[0][i],
+		  XmNshadowType, IN_FRAME_TYPE,
+		  XmNshadowThickness, IN_FRAME_SHADOW,
+		  NULL);
+    XtVaSetValues(w->PD.vectorFrame[1][i],
+		  XmNchildHorizontalSpacing, TITLE_SPACE,
+		  XmNchildVerticalAlignment, TITLE_ALIGN,
+		  NULL);
+  }
+
+  XtVaSetValues(w->PD.exportBGMDialog,
+		XmNmarginHeight, DIALOG_H,
+		XmNmarginWidth, DIALOG_W,
+		NULL);
+
+  XtVaSetValues(w->PD.exportBGMFrame[0],
+		XmNshadowType, IN_FRAME_TYPE,
+		XmNshadowThickness, IN_FRAME_SHADOW,
+		NULL);
+
+  XtVaSetValues(w->PD.exportBGMFrame[1],
+		XmNchildHorizontalSpacing, TITLE_SPACE,
+		XmNchildVerticalAlignment, TITLE_ALIGN,
+		NULL);
+
+  XtVaSetValues(w->PD.exportBGMText,
+		XmNmarginHeight, 2,
+		NULL);
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    F o r c e G e o m e t r y
+   ------------------------------------------------------------------------ */
+
+void ForceGeometry (Widgets_T *w){  
+  ForceGeometry_M(w) ; /* menu win */
+  ForceGeometry_G(w) ; /* graphic win */
+  if(CTX.command_win) ForceGeometry_C(w) ; /* command win */
+
+  ForceGeometry_ED(w); /* error dialogs */
+  ForceGeometry_FD(w); /* file dialogs */
+  ForceGeometry_OD(w); /* option dialogs */
+  ForceGeometry_HD(w); /* help dialogs */
+  ForceGeometry_GD(w); /* geometry dialogs */
+  ForceGeometry_MD(w); /* mesh dialogs */
+  ForceGeometry_PD(w); /* post dialogs */
+}
+
diff --git a/Unix/Geometry.h b/Unix/Geometry.h
new file mode 100644
index 0000000000000000000000000000000000000000..9793884fc83258996240a4f5bb8d79c7683c22c3
--- /dev/null
+++ b/Unix/Geometry.h
@@ -0,0 +1,6 @@
+#ifndef _GEOMETRY_H_
+#define _GEOMETRY_H_
+
+void ForceGeometry(Widgets_T *w);
+
+#endif
diff --git a/Unix/Help.h b/Unix/Help.h
new file mode 100644
index 0000000000000000000000000000000000000000..0676081aff0607a2a82c6898c39eca6ba9de1fe4
--- /dev/null
+++ b/Unix/Help.h
@@ -0,0 +1,90 @@
+#ifndef _HELP_H_
+#define _HELP_H_
+
+static char txt_help[]=
+"\n"
+"  (x)         stands for \"press x\"\n"
+"  (x-y)       stands for \"press x and, keeping it down, press y\"\n"
+"  C, M and S  stand for Control, Meta (or Alt) and Shift\n"
+"\n"
+"MOUSE:\n"
+"\n"
+"  move        when passing over the entity, highlight it and\n"
+"                display its properties on the bottom line\n"
+"              size a rubber zoom started with (C-left)\n"
+"\n"
+"  (left)      apply Y rotation (horizontal move)\n"
+"              apply X rotation (vertical move)\n"
+"              accept a rubber zoom started by (C-left)\n" 
+"  (middle)    apply Z rotation (horizontal move)\n"
+"              zoom (vertical move)\n"
+"              cancel a rubber zoom\n"
+"  (right)     pan X (horizontal move)\n"
+"              pan Y (vertical move)\n"
+"              cancel a rubber zoom\n"
+"              popup menu on module name\n"
+"              popup menu on post processor toggle buttons\n"
+"\n"
+"  (C-left)    start a rubber zoom\n" 
+"  (C-middle)  re-orthogonalise viewport\n" 
+"  (C-right)   reset viewport to default\n"   
+"\n"
+"KEYBOARD:\n"
+"\n"
+"No modifier: basic module interaction\n"
+"\n"
+"  (0)         reparse file\n"
+"  (1),(f1)    mesh lines\n"
+"  (2),(f2)    mesh surfaces\n"
+"  (3),(f3)    mesh volumes\n"
+"  (g)         go to geometry module\n"
+"  (m)         go to mesh module\n"
+"  (p)         go to post processor module\n"
+"\n"
+"Control modifier: popup file menus\n"
+"\n"
+"  (C-a),(C-c) abort mesh thread\n"
+"  (C-q)       quit\n"
+"  (C-o)       hide/show open file dialog\n" 
+"  (C-p)       hide/show print dialog\n"
+"  (C-m)       hide/show merge file dialog\n" 
+"  (C-s)       quick mesh save\n"
+"  (C-S-s)     hide/show save mesh dialog\n"
+"\n"
+"Shift modifier: popup option menus\n"
+"\n"
+"  (S-g)       hide/show geometry options\n"
+"  (S-i)       hide/show info window\n" 
+"  (S-m)       hide/show mesh options\n"
+"  (S-o)       hide/show miscellaneous options\n" 
+"  (S-p)       hide/show post processor general options\n"
+"  (S-v)       hide/show viewport options\n" 
+"\n"
+"Meta (Alt) modifier: quick shortcuts (no popup)\n"
+"\n"
+"  (M-a)       hide/show 2D axes\n" 
+"  (M-S-a)     hide/show 3D axes\n" 
+"  (M-b)       hide/show all post processing scales\n"
+"  (M-c)       alternate between predefined color modes\n"
+"  (M-d)       alternate between mesh wireframe, hidden lines and shading modes\n"
+"  (M-f)       toggle redraw mode (fast/display all)\n" 
+"  (M-h)       toggle highlight mode\n"
+"  (M-l)       hide/show geometry lines\n"
+"  (M-S-l)     hide/show mesh lines\n"
+"  (M-m)       toggle all mesh entities visibility\n"
+"  (M-o)       change projection mode\n"
+"  (M-p)       hide/show geometry points\n"
+"  (M-S-p)     hide/show mesh points\n"
+"  (M-s)       hide/show geometry surfaces\n"
+"  (M-S-s)     hide/show mesh surfaces\n"
+"  (M-v)       hide/show geometry volumes\n"
+"  (M-S-v)     hide/show mesh volumes\n"
+"  (M-x)       set X view\n" 
+"  (M-y)       set Y view\n" 
+"  (M-z)       set Z view\n" 
+"  (M-t)       alternate intervals mode in post-processing\n" 
+"\n"
+;
+
+
+#endif
diff --git a/Unix/Info.h b/Unix/Info.h
new file mode 100644
index 0000000000000000000000000000000000000000..6a15f32ee3cdd14ab7391f9b3b4885f8125ac0d2
--- /dev/null
+++ b/Unix/Info.h
@@ -0,0 +1,37 @@
+#ifndef _INFO_H_
+#define _INFO_H_
+
+static char *txt_info [] = 
+  { 
+    /* Geometry */
+    "Points", 
+    "Curves", 
+    "Surfaces", 
+    "Volumes", 
+
+    /* Mesh */
+    "Nodes on Curves",
+    "Nodes on Surfaces",
+    "Nodes in Volumes",
+    "Triangles", 
+    "Quadrangles",
+    "Tetrahedra",
+    "Hexahedra",
+    "Prisms", 
+    "Time for 1D Mesh",
+    "Time for 2D Mesh",
+    "Time for 3D Mesh",
+
+    "Gamma",
+    "Eta",
+    "R",
+  
+    /* Post */
+    "Views loaded",
+    "Visible Points",
+    "Visible Lines",
+    "Visible Triangles",
+    "Visible Tetrahedra"
+  } ;
+
+#endif
diff --git a/Unix/Main.cpp b/Unix/Main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ad3b9ee75ff9420013500643310a39ce9eeb48b6
--- /dev/null
+++ b/Unix/Main.cpp
@@ -0,0 +1,759 @@
+
+#include <signal.h>
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Geo.h"
+#include "Verif.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+#include "ColorTable.h"
+#include "Parser.h"
+#include "MinMax.h"
+
+#include "Widgets.h"
+#include "Pixmaps.h"
+
+#include "XColors.h"
+#include "XContext.h"
+#include "XRessources.h"
+
+#include "CbContext.h"
+#include "CbGeom.h"
+#include "Register.h"
+#include "Geometry.h"
+
+#include "Static.h"
+#include "XStatic.h"
+
+/* ------------------------------------------------------------------------ */
+/*  P a r s e                                                               */
+/* ------------------------------------------------------------------------ */
+
+void ParseFile(char *f){
+  char String[256];
+  Post_View *v;
+
+  strncpy(yyname,f,NAME_STR_L);
+  yyerrorstate=0;
+  yylineno=1;
+
+  if(!(yyin = fopen(yyname,"r"))){
+    Msg(INFO, "File '%s' dos not exist", f);
+    return;
+  }
+
+  fgets(String, sizeof(String), yyin) ; 
+  rewind(yyin);
+
+  if(!strncmp(String, "$PTS", 4) || 
+     !strncmp(String, "$NO", 3) || 
+     !strncmp(String, "$ELM", 4)){
+    if(THEM->status < 0) mai3d(THEM, 0);
+    Read_Mesh(THEM, yyin, FORMAT_MSH);
+  }
+  else if(!strncmp(String, "$COL", 4)){
+    if(List_Nbr(Post_ViewList)){
+      v = (Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1);
+      load_color_table(yyin, &v->CT);
+    }
+    else{
+      Msg(WARNING, "No Post-Processing View available to set Colors");
+    }
+  }
+  else{
+    while(!feof(yyin)) yyparse();
+  }
+  fclose(yyin);
+}
+
+void MergeProblem(char *name){
+  Msg(INFOS, "Merging %s",name); 
+
+  ParseFile(name);  
+  if (yyerrorstate) return;
+
+  if (!EntitesVisibles) {
+    RemplirEntitesVisibles(1);
+    SHOW_ALL=1;
+  }
+}
+
+void OpenProblem(char *name){
+  char ext[6];
+  
+  InitSymbols();
+  Init_Mesh(&M, 1);
+  BD_EXISTS = 1;
+
+  strncpy(TheFileName,name,NAME_STR_L);
+  strncpy(TheBaseFileName,name,NAME_STR_L);
+
+  strcpy(ext,name+(strlen(name)-4));
+  if(!strcmp(ext,".GEO") || 
+     !strcmp(ext,".geo") || 
+     !strcmp(ext,".msh") || 
+     !strcmp(ext,".pos")){
+    TheBaseFileName[strlen(name)-4] = '\0';
+  }
+  else{
+    strcat(TheFileName,".geo");
+  }
+
+  strncpy(THEM->name, TheBaseFileName,NAME_STR_L);
+
+  if(!CTX.interactive)
+    XtVaSetValues(WID.G.shell,
+		  XmNtitle, TheFileName,
+		  XmNiconName, TheBaseFileName,
+		  NULL);
+
+  Msg(INFOS, "Opening %s", TheFileName); 
+
+  ParseFile(TheFileName);  
+
+  mai3d(THEM,0);  
+  
+  Maillage_Dimension_0(&M);
+  ZeroHighlight(&M); 
+  CalculateMinMax(THEM->Points);  
+  if (!EntitesVisibles) {
+    RemplirEntitesVisibles(1);
+    SHOW_ALL=1;
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  G e t _ O p t i o n s                                                   */
+/* ------------------------------------------------------------------------ */
+
+void Get_Options (int argc, char *argv[]) {
+  int i=1;
+  
+  strncpy(TheFileNameTab[0], "unnamed.geo",NAME_STR_L);
+  
+  while (i < argc) {
+    
+    if (argv[i][0] == '-') {
+      
+      if(!strcmp(argv[i]+1, "0")){ 
+	CTX.interactive = -1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "1")){ 
+	CTX.interactive = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "2")){ 
+	CTX.interactive = 2; i++;
+      }
+      else if(!strcmp(argv[i]+1, "3")){ 
+	CTX.interactive = 3; i++;
+      }
+      else if(!strcmp(argv[i]+1, "path")){ 
+	i++;
+	if(argv[i] != NULL){
+	  strncpy(ThePathForIncludes,argv[i++],NAME_STR_L);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "bgm")){ 
+	i++;
+	if(argv[i] != NULL){
+	  strncpy(TheBgmFileName,argv[i++],NAME_STR_L);
+	  INITIALBGMESH = ONFILE;
+	}
+      }
+      else if(!strcmp(argv[i]+1, "alpha")){ 
+	CTX.alpha = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "flash")){ 
+	CTX.flash = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "old")){ 
+	FLAG_OLD_CIRCLE = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "dual")){ 
+	CTX.mesh.dual = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "recombine")){
+	CTX.mesh.reco_extrude = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "samevisual")){ 
+	CTX.same_visual = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "factor")){
+	i++;
+	FACTEUR_MULTIPLICATIF = atof(argv[i]); i++;
+      }
+      else if(!strcmp(argv[i]+1, "scale") ||
+	      !strcmp(argv[i]+1, "scaling")){
+	i++;
+	GLOBALSCALINGFACTOR = atof(argv[i]); i++;
+      }
+      else if(!strcmp(argv[i]+1, "raw")){ 
+	LISSAGE = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "smooth")){ 
+	i++;
+	LISSAGE = atoi(argv[i]); i++;
+      }
+      else if(!strcmp(argv[i]+1, "degree")){  
+	i++;
+	if(argv[i]!=NULL){
+	  CTX.mesh.degree = atoi(argv[i]); i++;
+	  if(CTX.mesh.degree != 1 || CTX.mesh.degree != 2){
+	    fprintf(stderr, "Error: Wrong degree\n");
+	    exit(1);
+	  }
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing Number\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "format") ||  
+	      !strcmp(argv[i]+1, "f")){  
+	i++;
+	if(argv[i]!=NULL){
+	  if(!strcmp(argv[i],"msh") || 
+	     !strcmp(argv[i],"MSH") || 
+	     !strcmp(argv[i],"gmsh")){
+	    CTX.mesh.format = FORMAT_MSH ;
+	  }
+	  else if(!strcmp(argv[i],"unv") ||
+		  !strcmp(argv[i],"UNV") || 
+		  !strcmp(argv[i],"ideas")){
+	    CTX.mesh.format = FORMAT_UNV ;
+	  }
+	  else if(!strcmp(argv[i],"gref") ||
+		  !strcmp(argv[i],"GREF") || 
+		  !strcmp(argv[i],"Gref")){
+	    CTX.mesh.format = FORMAT_GREF ;
+	  }
+	  else{
+	    fprintf(stderr, "Error: Unknown mesh format\n");
+	    exit(1);
+	  }
+	  i++;
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing format\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "algo")){  
+	i++;
+	if(argv[i]!=NULL){
+	  if(!strcmp(argv[i],"iso"))
+	    CTX.mesh.algo = DELAUNAT_OLDALGO ;
+	  else if(!strcmp(argv[i],"aniso"))
+	    CTX.mesh.algo = DELAUNAT_NEWALGO ;
+	  else{
+	    fprintf(stderr, "Error: Unknown mesh algorithm\n");
+	    exit(1);
+	  }
+	  i++;
+	}
+	else {	  
+	  fprintf(stderr, "Error: Missing algorithm\n");
+	  exit(1);
+	}
+      }
+      else if(!strcmp(argv[i]+1, "noview")){ 
+	CTX.post.initial_visibility = 0 ; i++;
+      }
+      else if(!strcmp(argv[i]+1, "fill")){ 
+	CTX.post.initial_intervals = DRAW_POST_DISCRETE ; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nbiso")){ 
+	i++ ;
+	CTX.post.initial_nbiso = atoi(argv[i]) ; i++ ;
+      }
+      else if(!strcmp(argv[i]+1, "command") || 
+	      !strcmp(argv[i]+1, "c")){ 
+	CTX.command_win = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nocommand") ||
+	      !strcmp(argv[i]+1, "noc")){ 
+	CTX.command_win = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "overlay") ||
+	      !strcmp(argv[i]+1, "ov")){ 
+	CTX.overlay = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nooverlay") ||
+	      !strcmp(argv[i]+1, "noov")){ 
+	CTX.overlay = CTX.geom.highlight = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "perspective") ||
+	      !strcmp(argv[i]+1, "p")){ 
+	CTX.ortho = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "ortho") ||
+	      !strcmp(argv[i]+1, "o")){ 
+	CTX.ortho = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "threads")){
+	CTX.threads = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nothreads")){
+	CTX.threads = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "viewport")){ 
+	i++ ;
+	CTX.r[0] = atof(argv[i]) ; i++ ;
+	CTX.r[1] = atof(argv[i]) ; i++ ;
+	CTX.r[2] = atof(argv[i]) ; i++ ;
+	CTX.t[0] = atof(argv[i]) ; i++ ;
+	CTX.t[1] = atof(argv[i]) ; i++ ;
+	CTX.t[2] = atof(argv[i]) ; i++ ;
+	CTX.s[0] = atof(argv[i]) ; i++ ;
+	CTX.s[1] = atof(argv[i]) ; i++ ;
+	CTX.s[2] = atof(argv[i]) ; i++ ;
+      }
+      else if(!strcmp(argv[i]+1, "db")){ 
+	CTX.db = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nodb")){ 
+	CTX.db = 0; CTX.geom.highlight = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "dl")){ 
+	CTX.display_lists = 1; i++;
+      }
+      else if(!strcmp(argv[i]+1, "nodl")){ 
+	CTX.display_lists = 0; i++;
+      }
+      else if(!strcmp(argv[i]+1, "geometry") ||
+	      !strcmp(argv[i]+1, "iconic")   ||
+	      !strcmp(argv[i]+1, "display")  ||
+	      !strcmp(argv[i]+1, "fg")       ||
+	      !strcmp(argv[i]+1, "bg")){
+	i+=2;
+      }
+      else if(!strcmp(argv[i]+1, "version") || 
+	      !strcmp(argv[i]+1, "v") ||
+	      !strcmp(argv[i]+1, "-version") || 
+	      !strcmp(argv[i]+1, "-v")){
+	Info(2,argv[0]); 
+      }
+      else if(!strcmp(argv[i]+1, "info") || 
+	      !strcmp(argv[i]+1, "-info")){
+	Info(1,argv[0]); 
+      }
+      else if(!strcmp(argv[i]+1, "help") || 
+	      !strcmp(argv[i]+1, "h") || 
+	      !strcmp(argv[i]+1, "-help") || 
+	      !strcmp(argv[i]+1, "-h")){
+	Info(0,argv[0]);
+      }
+      else{
+	fprintf(stderr, "Warning: Unknown option '%s'\n", argv[i]);
+	Info(0,argv[0]);
+      }
+    }
+
+    else {
+      if(NbFileName<MAX_OPEN_FILES){
+	strncpy(TheFileNameTab[NbFileName++], argv[i++], NAME_STR_L); 
+      }
+      else{
+	fprintf(stderr, "Error: Too many input files\n");
+	exit(1);
+      }
+    }
+
+  }
+
+  strncpy(TheFileName, TheFileNameTab[0], NAME_STR_L);
+
+}
+
+char* ShowVisualClass(int cls){
+  if(cls==TrueColor)   return "TrueColor";
+  if(cls==DirectColor) return "DirectColor";
+  if(cls==PseudoColor) return "PseudoColor";
+  if(cls==StaticColor) return "StaticColor";
+  if(cls==GrayScale)   return "GrayScale";
+  if(cls==StaticGray)  return "StaticGray";
+  return "Unknown";
+}
+
+/* ------------------------------------------------------------------------ */
+/*  M a i n                                                                 */
+/* ------------------------------------------------------------------------ */
+
+int main(int argc, char *argv[]){
+  int     i;
+  XColor  ov_color_def, ov_color_exact;
+  
+  /* Gmsh default context options */
+  
+  InitContext(&CTX);
+
+  /* Command line options */
+
+  Get_Options(argc, argv);
+
+  /* Initialize the static Mesh */
+
+  M.Vertices = NULL ;
+  M.VertexEdges = NULL ;
+  M.Simplexes = NULL ;
+  M.Points = NULL ;
+  M.Curves = NULL ;
+  M.SurfaceLoops = NULL ;
+  M.EdgeLoops = NULL ;
+  M.Surfaces = NULL ;
+  M.Volumes = NULL ;
+  M.PhysicalGroups = NULL ;
+  M.Metric = NULL ;
+
+  /* Signal handling */
+
+  signal(SIGINT,  Signal); 
+  signal(SIGSEGV, Signal);
+  signal(SIGFPE,  Signal); 
+
+  /* Non-interactive Gmsh */
+
+  if(CTX.interactive){
+    OpenProblem(TheFileName);
+    if(yyerrorstate)
+      exit(1);
+    else{
+      if(NbFileName>1){
+	for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]);
+      }
+      if(INITIALBGMESH == ONFILE){
+	MergeProblem(TheBgmFileName);
+	if(List_Nbr(Post_ViewList)){
+	  BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1));
+	  TYPBGMESH = ONFILE; 
+	  Create_BgMesh(TYPBGMESH,.2,THEM);
+	}
+	else{
+	  Msg(ERROR, "Invalid background mesh (no view)");
+	}
+      }
+      if(CTX.interactive > 0){
+	mai3d(THEM, CTX.interactive);
+	Print_Mesh(THEM,NULL,CTX.mesh.format);
+      }
+      exit(1);
+    }    
+  }
+  
+
+  /* Interactive Gmsh */
+
+  CTX.interactive = -1 ; /* The GUI is not ready yet for interactivity */
+
+  /* Text for about window */
+
+  sprintf(TextAbout, "%s\n \n%s%g\n%s\n%s\n%s\n%s\n%s\n%s\n \n%s\n \n"
+	  "Type 'gmsh -help' for command line options",
+	  gmsh_progname, gmsh_version, GMSH_VERSION, 
+	  gmsh_os, gmsh_date, gmsh_host, gmsh_packager, 
+	  gmsh_email, gmsh_url, gmsh_copyright);
+  
+  /* Xlib Threads init */
+  
+#ifndef _NOTHREADS  
+  if(CTX.threads){
+    if(!XInitThreads()){
+      Msg(WARNING, "Xlib is not thread safe: reverting to '-nothreads'");
+      CTX.threads = 0;
+    }
+  }
+#else
+  CTX.threads = 0;
+#endif
+  
+  /* Xtoolkit init */
+  
+  XtToolkitInitialize();
+  
+#ifndef _NOTHREADS  
+  if(CTX.threads){
+    if(!XtToolkitThreadInitialize()){
+      Msg(WARNING, "Xtoolkit is not thread safe: reverting to '-nothreads'");
+      CTX.threads = 0;
+    }
+  }
+#endif
+  
+  XCTX.AppContext = XtCreateApplicationContext();
+  
+  /* X/Motif default resources */
+
+  XtAppSetFallbackResources(XCTX.AppContext, FallbackResources);
+
+  /* Open display */
+
+  XCTX.display = XtOpenDisplay(XCTX.AppContext, NULL, "gmshGW", ".gmshrc", 
+			       NULL, 0, &argc, argv);
+
+  if(!XCTX.display)
+    Msg(ERROR, "Unable to open the specified display. Set the `DISPLAY'\n"
+   	"       environment variable properly or use the `xhost' command\n"
+	"       to authorize access to the display");
+
+  /* Check for GLX extension; for Mesa, this is always OK */
+  
+  if(!glXQueryExtension(XCTX.display,NULL,NULL))
+    Msg(ERROR, "The specified display does not support the OpenGL extension (GLX).\n"
+	"       You may consider using Mesa instead");
+  
+  /* Init with default screen num and default depth */
+  
+  XCTX.scrnum = DefaultScreen(XCTX.display);
+  XCTX.depth  = DefaultDepth(XCTX.display, XCTX.scrnum);
+
+  /* Init with default visual for the gui */
+
+  XCTX.gui.visual = DefaultVisual(XCTX.display,XCTX.scrnum);
+
+  /* Find visual the regular way for glw */
+  
+  if(CTX.db){
+    if(!(XCTX.glw.visinfo = 
+	 glXChooseVisual(XCTX.display,XCTX.scrnum, glw_attrib_db))){
+      Msg(WARNING,"GBA double buffured visual not available");
+      CTX.db = 0;
+    }
+  }
+  
+  if(!CTX.db){
+    if(!(XCTX.glw.visinfo = 
+	 glXChooseVisual(XCTX.display,XCTX.scrnum, glw_attrib_sb)))
+      Msg(ERROR, "RGBA single buffured visual not available");
+  }
+  
+  Msg(INFOS,"Visual id=%lx depth=%d screen=%d bits/rgb=%d class=%s dblbuf=%d",
+      XCTX.glw.visinfo->visualid, XCTX.glw.visinfo->depth,
+      XCTX.glw.visinfo->screen, XCTX.glw.visinfo->bits_per_rgb,
+#if defined(__cplusplus) || defined(c_plusplus)
+      ShowVisualClass(XCTX.glw.visinfo->c_class), 
+#else
+      ShowVisualClass(XCTX.glw.visinfo->class), 
+#endif
+      CTX.db);
+
+  /* Find visual the regular way for glo */
+  
+#ifndef _NOOV
+  if(CTX.overlay){
+    if(!(XCTX.glo.visinfo = glXChooseVisual(XCTX.display,XCTX.scrnum,glo_attrib))){
+      Msg(INFOS, "Overlay visual not available (using blend function instead)");
+      CTX.overlay = 0;
+      CTX.geom.highlight = 0;
+    }
+  }
+#else
+  CTX.overlay = 0 ;
+  CTX.geom.highlight = 0;
+#endif
+
+  if(CTX.overlay){
+    Msg(INFO,"Overlay Visual id=%lx depth=%d screen=%d bits/rgb=%d class=%s\n",
+	XCTX.glo.visinfo->visualid, XCTX.glo.visinfo->depth, 
+	XCTX.glo.visinfo->screen, XCTX.glo.visinfo->bits_per_rgb, 
+#if defined(__cplusplus) || defined(c_plusplus)
+	ShowVisualClass(XCTX.glo.visinfo->c_class)
+#else
+	ShowVisualClass(XCTX.glo.visinfo->class)
+#endif
+	);
+  }
+
+
+  /* Init with default colormaps */
+
+  XCTX.gui.colormap = DefaultColormap(XCTX.display,0);
+  XCTX.glw.colormap = DefaultColormap(XCTX.display,0);
+  XCTX.glo.colormap = DefaultColormap(XCTX.display,0);
+  
+  /*
+    If not using default visual (i.e. not using the gui visual), we need a colormap for 
+    this visual. Yes, the GL widget can allocate one itself, but we want to make sure 
+    the GUI and the 3D have the same one (if hardware does not allow more than one 
+    simultaneously). This prevents nasty flashing when the window with the 3D widget 
+    looses the focus.
+    */
+  
+  if(!CTX.flash && (XCTX.glw.visinfo->visual != XCTX.gui.visual)){
+    Msg(INFOS,"Making another colormap for graphic window");
+    XCTX.glw.colormap = XCreateColormap(XCTX.display, RootWindow(XCTX.display,XCTX.scrnum),
+					XCTX.glw.visinfo->visual, AllocNone);
+    if(!XCTX.glw.colormap)
+      Msg(ERROR, "Unable to create colormap for graphic window: Try option '-flash'");
+  }
+
+  if(CTX.overlay){
+    if(!CTX.flash && (XCTX.glo.visinfo->visual != XCTX.gui.visual)){
+      Msg(INFOS, "Making another colormap for overlay window");
+      XCTX.glo.colormap = XCreateColormap(XCTX.display, RootWindow(XCTX.display,XCTX.scrnum),
+					  XCTX.glo.visinfo->visual, AllocNone);
+      if(!XCTX.glo.colormap)
+	Msg(ERROR, "Unable to create private colormap for overlay window:\n"
+	    "       Try '-noov' and/or '-flash' options");
+    }
+  }
+  
+  /* Force to use common visual for GUI and GL? Maybe you can invoke
+     some hardware interrogation function and see if more than one
+     hardware map is supported.  Here, we check for the -samevisual
+     flag */
+  
+  if(CTX.same_visual){
+    XCTX.gui.visual = XCTX.glw.visinfo->visual;
+    XCTX.gui.colormap = XCTX.glw.colormap;
+  }
+
+  /* Create all the motif widgets */
+   
+  CreateWidgets(&WID);
+
+  /* create the OpenGL contexts */
+
+  XCTX.glw.context = glXCreateContext(XtDisplay(WID.G.glw),XCTX.glw.visinfo,NULL,GL_TRUE);  
+
+  if(CTX.overlay){
+    XCTX.glo.context = glXCreateContext(XtDisplay(WID.G.glo),
+					XCTX.glo.visinfo,NULL,GL_TRUE);  
+
+    if (!XAllocNamedColor(XCTX.display, XCTX.glo.colormap, 
+			  "white", &ov_color_def, &ov_color_exact)) {
+      Msg(WARNING, "Couldn't allocate white for overlay window: Reverting to '-noov'");
+      CTX.overlay = 0;
+    }
+    else
+      XCTX.xcolor.ovwhite = ov_color_def.pixel;
+  }
+
+  if(CTX.overlay){
+    if (!XAllocNamedColor(XCTX.display, XCTX.glo.colormap, 
+			  "black", &ov_color_def, &ov_color_exact)) {
+      Msg(WARNING, "Couldn't allocate black for overlay window: Reverting to '-noov'");
+      CTX.overlay = 0;
+    }
+    else
+      XCTX.xcolor.ovblack = ov_color_def.pixel;
+  }
+
+  /* X font initialisation */
+  XCTX.xfont.helve = XLoadQueryFont(XCTX.display, CTX.font_string); 
+  XCTX.xfont.fixed = XLoadQueryFont(XCTX.display, CTX.colorbar_font_string);
+
+  if(XCTX.xfont.helve == NULL){
+    Msg(WARNING, "Unable to load font %s", CTX.font_string);
+    XCTX.xfont.helve = XCTX.xfont.fixed ;
+  }
+  if(XCTX.xfont.fixed == NULL){
+    Msg(ERROR, "Unable to load font %s", CTX.colorbar_font_string);
+    exit(1);
+  }
+  
+  XCTX.xfont.helve_h = XCTX.xfont.helve->max_bounds.ascent + 
+    XCTX.xfont.helve->max_bounds.descent;
+  XCTX.xfont.helve_a = XCTX.xfont.helve->max_bounds.ascent;
+  XCTX.xfont.helve_w = XCTX.xfont.helve->max_bounds.width;
+
+  XCTX.xfont.fixed_h = XCTX.xfont.fixed->max_bounds.ascent +
+    XCTX.xfont.fixed->max_bounds.descent;
+  XCTX.xfont.fixed_a = XCTX.xfont.fixed->max_bounds.ascent;
+  XCTX.xfont.fixed_w = XCTX.xfont.fixed->max_bounds.width;
+
+  /* X color initialisation (set the pixel format and allocate some colors in XCTX) */
+
+  XColorInitialize();
+
+  /* Force widget geometry */
+
+  ForceGeometry(&WID);
+
+  /* Register all the callbacks */
+
+  RegisterCallbacks(&WID);
+
+  /* Realize widgets in the 3 windows (M=menu, G=graphics, C=command) */
+
+  XtRealizeWidget(WID.M.shell);
+  XtRealizeWidget(WID.G.shell);
+  if(CTX.command_win) XtRealizeWidget(WID.C.shell);
+
+  /* Create the pixmaps */
+
+  CreatePixmaps(&WID, &PIX, XCTX.depth);
+
+  /* Select input events for the graphic window and raise overlay window */
+
+  if(CTX.overlay){
+    XRaiseWindow(XtDisplay(WID.G.glo), XtWindow(WID.G.glo));
+    XSelectInput(XtDisplay(WID.G.glo), XtWindow(WID.G.glo), EV_MASK);
+  }
+  else{
+    XSelectInput(XtDisplay(WID.G.glw), XtWindow(WID.G.glw), EV_MASK);
+  }
+
+  /* OpenGL display list for the font */
+
+  if((CTX.font_base = glGenLists(XCTX.xfont.helve->max_char_or_byte2+1)) == 0)
+    Msg(ERROR, "Font out of OpenGL display lists");
+
+  glXUseXFont(XCTX.xfont.helve->fid, 
+	      XCTX.xfont.helve->min_char_or_byte2, 
+	      XCTX.xfont.helve->max_char_or_byte2-XCTX.xfont.helve->min_char_or_byte2+1, 
+	      CTX.font_base+XCTX.xfont.helve->min_char_or_byte2);
+
+  /* The GUI is ready */
+  CTX.interactive = 0 ; 
+
+  /* Say welcome! */
+
+  TextBuffer = (char*)Malloc(1024*sizeof(char));
+  Msg(STATUS, "Ready");
+  Msg(SELECT, "Gmsh %g", GMSH_VERSION);
+
+  /* Open input file */
+
+  OpenProblem(TheFileName);
+
+  /* Merge all Input Files if any, then init first context (geometry or post) */
+
+  if(NbFileName>1){
+    for(i=1;i<NbFileName;i++) MergeProblem(TheFileNameTab[i]);
+    ActualizeContextCb (NULL,(XtPointer)CONTEXT_POST,NULL); 
+  }
+  else {
+    ActualizeContextCb(NULL,(XtPointer)CONTEXT_GEOM,NULL);
+  }
+
+  /* Read background mesh on disk if any */ 
+
+  if(INITIALBGMESH == ONFILE){
+    MergeProblem(TheBgmFileName);
+    if(List_Nbr(Post_ViewList)){
+      BGMWithView((Post_View*)List_Pointer(Post_ViewList, List_Nbr(Post_ViewList)-1));
+      TYPBGMESH = ONFILE; 
+      Create_BgMesh(TYPBGMESH,.2,THEM);
+    }
+    else{
+      Msg(ERROR, "Invalid background mesh (no view)");
+    }
+  }
+  
+  /* Compute viewport and Draw */
+  EXPOSE = 1;
+  Init();
+  Draw();
+  
+  /* Loop until were done */
+  
+  XtAppMainLoop(XCTX.AppContext);
+  
+  /* never here */
+  
+}
+  
diff --git a/Unix/Main.h b/Unix/Main.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc72b7e065057375bf3054d2f26c10926dae51f5
--- /dev/null
+++ b/Unix/Main.h
@@ -0,0 +1,11 @@
+#ifndef _MAIN_H_
+#define _MAIN_H_
+
+#include "Const.h"
+
+void OpenProblem(char *name);
+void MergeProblem(char *name);
+
+extern char TheFileName[NAME_STR_L], TheBaseFileName[NAME_STR_L];
+
+#endif
diff --git a/Unix/Makefile b/Unix/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..01131100b588ad7721e1b07bc5f070d013aea3e9
--- /dev/null
+++ b/Unix/Makefile
@@ -0,0 +1,174 @@
+#
+# Makefile for "libUnix.a"
+#
+
+.IGNORE:
+
+CC            = c++
+C_FLAGS       = -g -Wall
+
+VERSION_FLAGS = -D_NOTHREADS
+OS_FLAGS      = -D_UNIX 
+
+GL_INCLUDE    = -I$(HOME)/SOURCES/Mesa-3.1/include\
+                -I$(HOME)/SOURCES/Mesa-3.1/include/GL
+MOTIF_INCLUDE = -I/usr/X11R6/LessTif/Motif1.2/include
+
+RM       = rm
+RMFLAGS  = -f
+RANLIB   = ranlib
+
+LIB      = ../lib/libUnix.a
+INCLUDE  = -I../Common -I../DataStr -I../Graphics -I../Geo\
+           -I../Mesh -I../Parser -I../Unix
+
+CFLAGS   = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE)\
+           $(MOTIF_INCLUDE) $(GL_INCLUDE)
+
+SRC = Main.cpp \
+      Widgets.cpp \
+      Geometry.cpp \
+      Register.cpp \
+      Pixmaps.cpp \
+      XDump.cpp \
+      XColors.cpp \
+      Message.cpp \
+      CbContext.cpp \
+      CbPost.cpp \
+      CbColorbar.cpp \
+      CbGeom.cpp \
+      CbMesh.cpp \
+      CbOptions.cpp \
+      CbFile.cpp \
+      CbInput.cpp \
+      CbGeneral.cpp 
+
+
+OBJ = $(SRC:.cpp=.o)
+
+.SUFFIXES: .o .cpp
+
+$(LIB): $(OBJ) 
+	ar ruvs $(LIB) $(OBJ) 
+	$(RANLIB) $(LIB)
+
+.cpp.o:
+	$(CC) $(CFLAGS) -c $<
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+lint:
+	$(LINT) $(CFLAGS) $(SRC)
+
+depend:
+	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
+	$(CC) -MM $(CFLAGS) ${SRC} \
+	) >Makefile.new
+	cp Makefile Makefile.bak
+	cp Makefile.new Makefile
+	$(RM) $(RMFLAGS) Makefile.new
+
+# DO NOT DELETE THIS LINE
+Main.o: Main.cpp ../Common/Gmsh.h ../Common/Message.h ../DataStr/Malloc.h \
+  ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \
+  ../Common/GmshUI.h ../Geo/Geo.h ../Geo/Verif.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h \
+  ../Common/Context.h ../Parser/Parser.h ../Geo/MinMax.h Widgets.h \
+  Pixmaps.h XColors.h XContext.h XRessources.h CbContext.h CbGeom.h \
+  Register.h Geometry.h ../Common/Static.h ../Common/Version.h XStatic.h
+Widgets.o: Widgets.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Common/Context.h XContext.h \
+  Info.h Widgets.h Help.h
+Geometry.o: Geometry.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \
+  ../Common/Context.h XContext.h Widgets.h
+Register.o: Register.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \
+  ../Common/Context.h XContext.h Widgets.h Register.h CbOptions.h \
+  CbContext.h CbFile.h CbGeom.h CbMesh.h CbPost.h
+Pixmaps.o: Pixmaps.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h Widgets.h \
+  ../Common/Context.h Pixmaps.h Bitmaps.h XColors.h
+XDump.o: XDump.cpp
+XColors.o: XColors.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h XContext.h
+Message.o: Message.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \
+  ../Common/Version.h ../Common/Context.h Widgets.h
+CbContext.o: CbContext.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \
+  ../Common/Context.h XContext.h CbContext.h CbGeom.h CbMesh.h
+CbPost.o: CbPost.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \
+  ../Common/Context.h XContext.h Main.h CbPost.h CbGeom.h CbMesh.h \
+  CbColorbar.h
+CbColorbar.o: CbColorbar.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h \
+  ../Common/Const.h XColors.h Widgets.h Register.h ../Common/Context.h \
+  XContext.h ../Graphics/ColorTable.h CbColorbar.h
+CbGeom.o: CbGeom.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \
+  ../Common/Context.h ../Geo/Verif.h Main.h CbGeom.h
+CbMesh.o: CbMesh.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h CbMesh.h \
+  ../Common/Context.h Widgets.h
+CbOptions.o: CbOptions.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Geo/Geo.h \
+  ../Geo/Verif.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \
+  ../Graphics/Draw.h ../Common/Views.h ../Common/Const.h \
+  ../Graphics/ColorTable.h Widgets.h Pixmaps.h ../Common/Context.h \
+  XContext.h Register.h CbGeneral.h CbOptions.h CbGeom.h CbMesh.h \
+  CbPost.h
+CbFile.o: CbFile.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h Main.h \
+  ../Common/Const.h ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Simplex.h \
+  ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/Metric.h \
+  ../Graphics/Draw.h ../Common/Views.h ../Graphics/ColorTable.h Widgets.h \
+  ../Common/Context.h XContext.h CbFile.h CbColorbar.h XDump.h \
+  ../Graphics/gl2ps.h ../Graphics/gl2gif.h
+CbInput.o: CbInput.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h Widgets.h \
+  ../Common/Context.h XContext.h Register.h CbContext.h CbGeneral.h \
+  CbGeom.h CbPost.h CbMesh.h
+CbGeneral.o: CbGeneral.cpp ../Common/Gmsh.h ../Common/Message.h \
+  ../DataStr/Malloc.h ../DataStr/List.h ../DataStr/Tree.h \
+  ../DataStr/avl.h ../DataStr/Tools.h ../Common/GmshUI.h ../Mesh/Mesh.h \
+  ../Mesh/Vertex.h ../Mesh/Simplex.h ../Mesh/Edge.h \
+  ../Geo/ExtrudeParams.h ../Mesh/Metric.h ../Graphics/Draw.h \
+  ../Common/Views.h ../Common/Const.h ../Graphics/ColorTable.h \
+  ../Common/Context.h XContext.h Widgets.h
diff --git a/Unix/Message.cpp b/Unix/Message.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..52543d16e9c05dcc8bbefdec9ee6c70eb0897adc
--- /dev/null
+++ b/Unix/Message.cpp
@@ -0,0 +1,243 @@
+
+#include <signal.h>
+#include <sys/resource.h>
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Version.h"
+#include "Context.h"
+#include "Widgets.h"
+
+extern Context_T   CTX;
+extern Widgets_T   WID;
+
+/* ------------------------------------------------------------------------ */
+/*  I n f o                                                                 */
+/* ------------------------------------------------------------------------ */
+
+extern char gmsh_progname[], gmsh_version[], gmsh_os[], gmsh_date[];
+extern char gmsh_host[], gmsh_packager[], gmsh_email[], gmsh_url[];
+extern char gmsh_copyright[] ;
+
+char clargs[]    = 
+  "Usage: %s [options] [files]\n"
+  "Mesh options:\n"
+  "  -0                    parse input and exit\n"
+  "  -1, -2, -3            batch 1-, 2- or 3-dimensional mesh\n"
+  "  -format msh|unv       mesh format (default: msh)\n"
+  "  -algo iso|aniso       mesh algorithm (default: iso)\n"
+  "  -smooth int           mesh smoothing (default: 3)\n"
+  "  -degree int           mesh degree (default: 1)\n"
+  "  -scale float          scaling factor (default: 1.0)\n"
+  "  -bgm file             load backround mesh from file\n"
+  "  -recombine            recombine extruded meshes\n"
+  "Post Processing options:\n"
+  "  -dl                   enable display lists\n"
+  "  -noview               hide all views at startup\n"
+  "Display options:\n"	  
+  "  -nodb                 no double buffer\n"
+  "  -noov                 no overlay visual\n"
+  "  -alpha                enable alpha blending\n"
+  "  -visinfo              show visual information at startup\n"
+  "  -geometry geom        specify main window geometry\n"
+  "  -viewport 9*float     specify rotation, translation and scale\n"
+  "  -display disp         specify display\n"
+  "  -perspective          perspective instead of orthographic projection\n"
+  "  -flash                allow colormap flashing\n"
+  "  -samevisual           force same visual for OpenGL and GUI\n"
+  "Other options:\n"	  
+  "  -threads              enable threads\n"
+  "  -path string          path for included files\n"
+  "  -version              show version number\n"
+  "  -info                 show detailed version information\n"
+  "  -help                 show this message\n"
+  ;
+
+void Info (int level, char *arg0){
+  switch(level){
+  case 0 :
+    fprintf(stderr, "%s\n", gmsh_progname);
+    fprintf(stderr, "%s\n", gmsh_copyright);
+    fprintf(stderr, clargs, arg0);
+    exit(1);
+  case 1:
+    fprintf(stderr, "%s%g\n", gmsh_version, GMSH_VERSION);
+    fprintf(stderr, "%s\n", gmsh_os);
+    fprintf(stderr, "%s\n", gmsh_date);
+    fprintf(stderr, "%s\n", gmsh_host);
+    fprintf(stderr, "%s\n", gmsh_packager);
+    fprintf(stderr, "%s\n", gmsh_email);
+    fprintf(stderr, "%s\n", gmsh_url);
+    exit(1) ; 
+  case 2 :
+    fprintf(stderr, "%g\n", GMSH_VERSION);
+    exit(1);
+  default :
+    break;
+  }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  S i g n a l                                                             */
+/* ------------------------------------------------------------------------ */
+
+
+void Signal (int sig_num){
+
+  switch (sig_num){
+  case SIGSEGV : 
+    Msg(ERROR, "Segmentation Violation (invalid memory reference)\n"
+	"----------------------------------------------------------------------\n"
+	"You have probably discovered a bug in Gmsh...\n"
+	"You may e-mail the context in which it occurred to one of the authors.\n"
+	"Type 'gmsh -version' to get feedback information.");
+    break;
+  case SIGFPE  : Msg(ERROR, "Floating point exception (division by zero?)"); break;
+  case SIGINT  : Msg(ERROR, "Interrupt (generated from terminal special char)"); break;
+  default      : Msg(ERROR, "Unknown signal"); break;
+  }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  M s g                                                                   */
+/* ------------------------------------------------------------------------ */
+
+extern char      *TextBuffer;
+
+#define PUT_IN_COMMAND_WIN						\
+  vsprintf(TextBuffer, fmt, args);					\
+  XmListAddItem(WID.C.commandList,XmStringCreateSimple(TextBuffer),0);	\
+  XtSetArg(arg[0], XmNitemCount, &nb);					\
+  XtSetArg(arg[1], XmNvisibleItemCount, &nbvis);			\
+  XtGetValues(WID.C.commandList, arg, 2);				\
+  XmListSetPos(WID.C.commandList,(nb>nbvis)?nb-nbvis+1:0);		\
+  XmUpdateDisplay(WID.C.commandList);
+
+void Msg(int level, char *fmt, ...){
+  va_list  args;
+  int      abort=0;
+  Arg      arg[2];
+  int      nb, nbvis;
+
+  va_start (args, fmt);
+
+  switch(level){
+
+  case PARSER_ERROR :
+    if(CTX.interactive || !CTX.command_win){
+      fprintf(stderr, "Parse Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      PUT_IN_COMMAND_WIN ;
+    }
+    break ;
+
+  case PARSER_INFO :
+    if(CTX.interactive || !CTX.command_win){
+      fprintf(stderr, "Parse Info: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      PUT_IN_COMMAND_WIN ;
+    }
+    break ;
+
+  case ERROR :
+    if(CTX.interactive || !CTX.command_win){
+      fprintf(stderr, "Error: "); vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+      abort = 1;
+    }
+    else{
+      PUT_IN_COMMAND_WIN ;
+    }
+    break ;
+
+  case WARNING :
+    if(CTX.interactive || !CTX.command_win){
+      fprintf(stderr, "Warning: "); vfprintf(stderr, fmt,args); fprintf(stderr, "\n");
+    }
+    else {
+      PUT_IN_COMMAND_WIN ;
+    }
+    break;
+
+  case INFOS :
+    if(CTX.interactive || !CTX.command_win){
+      vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      PUT_IN_COMMAND_WIN ;
+    }
+    break;
+
+  case INFO :
+    if(CTX.interactive){
+      vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      vsprintf(TextBuffer, fmt, args);
+      XtVaSetValues(WID.G.infoLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL);
+      XmUpdateDisplay(WID.G.infoLabel);
+    }
+    break;
+
+  case SELECT :
+    if(CTX.interactive){
+      vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      vsprintf(TextBuffer, fmt, args);
+      XtVaSetValues(WID.G.selectLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL);
+      XmUpdateDisplay(WID.G.selectLabel);
+    }
+    break;
+
+  case STATUS :
+    if(CTX.interactive){
+      vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+    }
+    else{
+      vsprintf(TextBuffer, fmt, args);
+      XtVaSetValues(WID.G.statusLabel, XmNlabelString, XmStringCreateSimple(TextBuffer), NULL);
+      XmUpdateDisplay(WID.G.statusLabel);
+    }
+    break;
+  }
+
+  va_end (args);
+
+  if(abort) exit(1);
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/*  C p u                                                                   */
+/* ------------------------------------------------------------------------ */
+
+void GetResources(long *s, long *us, long *mem){
+  static struct rusage r;
+
+  getrusage(RUSAGE_SELF,&r);
+  *s   = (long)r.ru_utime.tv_sec ;
+  *us  = (long)r.ru_utime.tv_usec ;
+  *mem = (long)r.ru_maxrss ;
+}
+
+void PrintResources(FILE *stream, char *fmt, long s, long us, long mem){
+  fprintf(stream, "Resources: %scpu %ld.%ld s / mem %ld kb\n", fmt, s, us, mem);
+}
+
+double Cpu(void){
+  long s, us, mem;
+  GetResources(&s, &us, &mem);
+  return (double)s + (double)us/1.e6 ;
+}
+
+/* ------------------------------------------------------------------------ */
+/*  P r o g r e s s                                                         */
+/* ------------------------------------------------------------------------ */
+
+void Progress(int i){
+}
diff --git a/Unix/Pixmaps.cpp b/Unix/Pixmaps.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..41095f5fc4cadd53d1908625c4e4bfb4e193eb09
--- /dev/null
+++ b/Unix/Pixmaps.cpp
@@ -0,0 +1,128 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Widgets.h"
+#include "Context.h"
+#include "Pixmaps.h"
+#include "Bitmaps.h"
+#include "XColors.h"
+
+extern Widgets_T  WID;
+extern Context_T  CTX;
+
+Pixmap bm_to_px(Widget w, void *bits, int width, int height, int depth, int mode){
+  Display  *display ;
+  Window    window ;
+  int       screen ;
+  Pixmap    ret_pixmap;
+  Pixel     fg, bg;
+  
+  display = XtDisplay(w);
+  window = XtScreen(WID.M.shell)->root; /* XtWindow(w); */
+  screen = DefaultScreen(display);
+
+  if (DisplayCells(display, screen) > 2 && depth > 1) {
+
+    switch (mode) {
+    case BM_PX_BW: 
+      fg = BlackPixel(display, screen);
+      bg = WhitePixel(display, screen);
+      break;      
+    case BM_PX_BWREV:
+      fg = WhitePixel(display, screen);
+      bg = BlackPixel(display, screen);
+      break;
+    case BM_PX_WHITE:
+      fg = WhitePixel(display, screen);
+      XtVaGetValues(w,XmNbackground, &bg,NULL);
+      break;      
+    case BM_PX_BLACK:
+      fg = BlackPixel(display, screen);
+      XtVaGetValues(w,XmNbackground, &bg,NULL);
+      break;      
+    case BM_PX_RED:
+      fg = AllocateColorInt(255,0,0) ;
+      XtVaGetValues(w,XmNbackground, &bg,NULL);
+      break;      
+    case BM_PX_HIGHLIGHT:
+      XtVaGetValues(w,XmNhighlightColor, &fg,XmNbackground, &bg,NULL);
+      break;      
+    case BM_PX_NORMAL:
+    default:
+      XtVaGetValues(w,XmNforeground, &fg,XmNbackground, &bg,NULL );
+      break;
+    }
+  }
+  else {
+    fg = BlackPixel(display, screen);
+    bg = WhitePixel(display, screen);
+  }
+  
+  ret_pixmap = 
+    XCreatePixmapFromBitmapData(display, window, (char*)bits, width, height, fg, bg, depth);
+  
+  if (ret_pixmap == (Pixmap) NULL){
+    Msg(WARNING, "Failing to create pixmap");
+    return ((Pixmap) NULL);
+  }
+
+  return (ret_pixmap);
+}
+
+
+void Set_AnimPixmap(Widgets_T *w, Pixmaps_T *p, int start){
+  if(start)
+    XtVaSetValues(w->G.Butt[5], XmNlabelPixmap, p->G.start, NULL);
+  else
+    XtVaSetValues(w->G.Butt[5], XmNlabelPixmap, p->G.stop, NULL);
+}
+
+void CreatePixmaps(Widgets_T *w, Pixmaps_T *p, int depth){
+
+  /* Icons for 3 main windows */
+
+  XtVaSetValues(w->M.shell, 
+		XmNiconPixmap, 
+		XCreateBitmapFromData(XtDisplay(w->M.shell),XtScreen(w->M.shell)->root,
+				      (char*)g1_bits, g1_width, g1_height), 
+		NULL);
+
+
+  XtVaSetValues(w->G.shell, 
+		XmNiconPixmap, 
+		XCreateBitmapFromData(XtDisplay(w->G.shell), XtScreen(w->G.shell)->root,
+				      (char*)g2_bits, g2_width, g2_height),
+		NULL);
+
+  if(CTX.command_win)
+    XtVaSetValues(w->C.shell, 
+		  XmNiconPixmap, 
+		  XCreateBitmapFromData(XtDisplay(w->C.shell), XtScreen(w->C.shell)->root,
+					(char*)g3_bits, g3_width, g3_height),
+		  NULL);
+
+  /* Graphic window */
+
+  p->G.abort = bm_to_px(w->G.Butt[6], abort_bits, 
+			abort_width, abort_height, depth, BM_PX_RED);
+  XtVaSetValues(w->G.Butt[6], XmNlabelPixmap, p->G.abort, NULL);
+
+  p->G.abort_insens = bm_to_px(w->G.Butt[6], abort_bits, 
+			       abort_width, abort_height, depth, BM_PX_NORMAL);
+  XtVaSetValues(w->G.Butt[6], XmNlabelInsensitivePixmap, p->G.abort_insens, NULL);
+
+  p->G.start = bm_to_px(w->G.Butt[5], start_bits, 
+			start_width, start_height, depth, BM_PX_NORMAL);
+  p->G.stop = bm_to_px(w->G.Butt[5], stop_bits, 
+		       stop_width, stop_height, depth, BM_PX_NORMAL);
+  Set_AnimPixmap(w, p, 1);
+
+  /* About window  */
+
+  p->HD.about = bm_to_px(w->HD.aboutDialog, about_bits, 
+			 about_width, about_height, depth, BM_PX_NORMAL);
+  XtVaSetValues(w->HD.aboutDialog, XmNsymbolPixmap, p->HD.about, NULL);
+
+
+}
+
diff --git a/Unix/Pixmaps.h b/Unix/Pixmaps.h
new file mode 100644
index 0000000000000000000000000000000000000000..88b301ef76f55c0d4cba456887d8b24caf8c2e3d
--- /dev/null
+++ b/Unix/Pixmaps.h
@@ -0,0 +1,28 @@
+#ifndef _PIXMAPS_H_
+#define _PIXMAPS_H_
+
+#define BM_PX_NORMAL    0        /* normal/normal */
+#define BM_PX_HIGHLIGHT 1        /* highlight/normal */
+#define BM_PX_WHITE     2        /* white/normal */
+#define BM_PX_BLACK     3        /* black/normal */
+#define BM_PX_BW        4        /* black/white */
+#define BM_PX_BWREV     5        /* white/black */
+#define BM_PX_RED       6        /* red/normal */
+
+typedef struct {
+  
+  struct {
+    Pixmap  abort, abort_insens, start, stop ; 
+  } G ;
+
+  struct {
+    Pixmap  about ; 
+  } HD ;
+  
+} Pixmaps_T ;
+
+void CreatePixmaps(Widgets_T *w, Pixmaps_T *p, int depth);
+void Set_AnimCallback(Widgets_T *w, int start) ;
+void Set_AnimPixmap(Widgets_T *w, Pixmaps_T *p, int start) ;
+
+#endif
diff --git a/Unix/Register.cpp b/Unix/Register.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a4bccb36ddaa6516860d580ea7877cea69c4eeca
--- /dev/null
+++ b/Unix/Register.cpp
@@ -0,0 +1,401 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Widgets.h"
+#include "Register.h"
+#include "CbOptions.h"
+#include "CbContext.h"
+#include "CbFile.h"
+#include "CbGeom.h"
+#include "CbMesh.h"
+#include "CbPost.h"
+
+extern Context_T   CTX ;
+extern XContext_T  XCTX ;
+
+void RegisterCallbacks_M(Widgets_T *w){
+  long int   n ;
+  XtPointer  l[5] ;
+
+  register_activate_cb (w->M.fileButt[0],   ManageCb,           w->FD.openDialog);
+  register_activate_cb (w->M.fileButt[1],   ManageCb,           w->FD.mergeDialog);
+  register_activate_cb (w->M.fileButt[2],   FileCb,             FILE_SAVE_MESH);
+  register_activate_cb (w->M.fileButt[3],   ManageCb,           w->FD.saveAsDialog);
+  register_activate_cb (w->M.fileButt[4],   ManageCb,           w->FD.printDialog);
+  register_activate_cb (w->M.fileButt[5],   ExitCb,             NULL);
+
+  register_activate_cb (w->M.moduleButt[0], ActualizeContextCb, CONTEXT_GEOM);
+  register_activate_cb (w->M.moduleButt[1], ActualizeContextCb, CONTEXT_MESH);
+  register_activate_cb (w->M.moduleButt[2], ActualizeContextCb, CONTEXT_POST);
+
+  register_activate_cb (w->M.optionButt[0], ManageCb,           w->OD.geomDialog);
+  register_activate_cb (w->M.optionButt[1], ManageCb,           w->OD.meshDialog);
+  register_activate_cb (w->M.optionButt[2], ManageCb,           w->OD.postDialog);
+  register_activate_cb (w->M.optionButt[3], ManageCb,           w->OD.miscDialog);
+  register_activate_cb (w->M.optionButt[4], CurrentViewportCb,  NULL);
+  register_activate_cb (w->M.optionButt[5], CurrentInfoCb,      1);
+
+  register_activate_cb (w->M.helpButt[0],   ManageCb,           w->HD.keysDialog);
+  register_activate_cb (w->M.helpButt[1],   ManageCb,           w->HD.aboutDialog);
+
+  register_popup_ev    (w->M.modButt,       w->M.modPop);
+  register_activate_cb (w->M.geomButt,      ActualizeContextCb, CONTEXT_GEOM);
+  register_activate_cb (w->M.meshButt,      ActualizeContextCb, CONTEXT_MESH);
+  register_activate_cb (w->M.postButt,      ActualizeContextCb, CONTEXT_POST);
+								
+  register_activate_cb (w->M.navigButt[0],  PreviousContextCb,  CONTEXT_BACKWARD);
+  register_activate_cb (w->M.navigButt[1],  PreviousContextCb,  CONTEXT_FORWARD);
+
+  l[0] = (XtPointer)CurrentViewCb ;
+  l[2] = (XtPointer)PostDialogCb ;
+
+  for(n=0 ; n<NB_BUTT_MAX ; n++){
+    register_activate_cb (w->M.pushButt[n],   NextContextCb, n+1);
+    register_valchg_cb   (w->M.toggleButt[n], SwapViewCb, n+1);
+    register_popup_ev    (w->M.toggleButt[n], w->M.popMenu[n]);
+    register_activate_cb (w->M.removeButt[n], RemoveViewCb, n+1);
+    register_activate_cb (w->M.duplicateButt[n], DuplicateViewCb, n+1);
+
+    l[1] = (XtPointer)(n+1) ;
+    l[4] = NULL ;
+    l[3] = (XtPointer)POST_LIGHT;      register_valchg_cb_list (w->M.lightButt[n],l);
+    l[3] = (XtPointer)POST_ELEMENT;    register_valchg_cb_list (w->M.elementButt[n],l);
+    l[3] = (XtPointer)POST_OFFSET;     register_activate_cb_list (w->M.offsetButt[n],l);
+    l[3] = (XtPointer)POST_TIME_STEP;  register_activate_cb_list (w->M.timeStepButt[n],l);
+    l[3] = (XtPointer)POST_SCALE;      register_activate_cb_list (w->M.scaleButt[n],l);
+    l[3] = (XtPointer)POST_COLOR;      register_activate_cb_list (w->M.colorButt[n],l);
+    l[3] = (XtPointer)POST_VECTOR;     register_activate_cb_list (w->M.vectorButt[n],l);
+    l[3] = (XtPointer)POST_TIME_STEP;  register_activate_cb_list (w->M.timeStepButt[n],l);
+    l[3] = (XtPointer)POST_EXPORT_BGM; register_activate_cb_list (w->M.exportBGMButt[n],l);
+    l[3] = (XtPointer)POST_APPLY_BGM;  register_activate_cb_list (w->M.applyBGMButt[n],l);
+  }
+
+}
+
+
+void RegisterCallbacks_G(Widgets_T *w){
+
+  register_GLexpose_cb   (w->G.glw, ExposeCb, NULL);
+  register_GLresize_cb   (w->G.glw, ResizeCb, NULL);
+  register_GLinit_cb     (w->G.glw, InitCb,   NULL);
+  register_GLinput_cb    (w->G.glw, InputCb,  NULL);
+
+  if(CTX.overlay){
+    register_GLexpose_cb (w->G.glo, ExposeCb, NULL);
+    register_GLresize_cb (w->G.glo, ResizeCb, NULL);
+    register_GLinput_cb  (w->G.glo, InputCb,  NULL);
+  }
+
+  register_activate_cb (w->G.Butt[0], OptionsCb, OPTIONS_XVIEW);
+  register_activate_cb (w->G.Butt[1], OptionsCb, OPTIONS_YVIEW);
+  register_activate_cb (w->G.Butt[2], OptionsCb, OPTIONS_ZVIEW);
+  register_activate_cb (w->G.Butt[3], OptionsCb, OPTIONS_CVIEW);
+  register_activate_cb (w->G.Butt[4], OptionsCb, OPTIONS_PVIEW);
+  register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START);
+  register_activate_cb (w->G.Butt[6], OptionsCb, OPTIONS_MESH_ABORT);
+
+}
+
+void Set_AnimCallback(Widgets_T *w, int start){
+  if(start){
+    register_remove_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_STOP);
+    register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START);
+  }
+  else{
+    register_remove_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_START);
+    register_activate_cb (w->G.Butt[5], OptionsCb, OPTIONS_POST_ANIM_STOP);
+  }
+}
+
+
+void RegisterCallbacks_C(Widgets_T *w){
+
+}
+
+
+void RegisterCallbacks_ED(Widgets_T *w){
+
+  register_ok_cb     (w->ED.printDialog, FileCb, FILE_PRINT);
+  register_cancel_cb (w->ED.printDialog, FileCb, FILE_CANCEL);
+
+  register_ok_cb     (w->ED.saveDialog, FileCb, FILE_SAVE_COLORTABLE_AS);
+  register_cancel_cb (w->ED.saveDialog, FileCb, FILE_CANCEL);
+
+}
+
+
+void RegisterCallbacks_FD(Widgets_T *w){ 
+
+  register_ok_cb       (w->FD.openDialog,      FileCb,    FILE_LOAD_GEOM);
+  register_cancel_cb   (w->FD.openDialog,      ManageCb,  w->FD.openDialog);
+
+  register_ok_cb       (w->FD.mergeDialog,     FileCb,    FILE_LOAD_POST);
+  register_cancel_cb   (w->FD.mergeDialog,     ManageCb,  w->FD.mergeDialog);
+
+  register_ok_cb       (w->FD.saveDialog,     FileCb,    FILE_SAVE_COLORTABLE_AS);
+  register_cancel_cb   (w->FD.saveDialog,     ManageCb,  w->FD.saveDialog);
+
+  register_ok_cb       (w->FD.saveAsDialog,      FileCb,    FILE_SAVE_MESH_AS);
+  register_cancel_cb   (w->FD.saveAsDialog,      ManageCb,  w->FD.saveAsDialog);
+  register_activate_cb (w->FD.saveAsButt[0],     OptionsCb, OPTIONS_MESH_FORMAT_MSH);
+  register_activate_cb (w->FD.saveAsButt[1],     OptionsCb, OPTIONS_MESH_FORMAT_UNV);
+  /*
+  register_activate_cb (w->FD.saveAsButt[2],     OptionsCb, OPTIONS_MESH_FORMAT_GREF);
+  */
+
+  register_ok_cb       (w->FD.printDialog,     FileCb,    FILE_PRINT);
+  register_cancel_cb   (w->FD.printDialog,     ManageCb,  w->FD.printDialog);
+  register_activate_cb (w->FD.printButt[0],    OptionsCb, OPTIONS_PRINT_GL2PS_SIMPLE);
+  register_activate_cb (w->FD.printButt[1],    OptionsCb, OPTIONS_PRINT_GL2PS_COMPLEX);
+  register_activate_cb (w->FD.printButt[2],    OptionsCb, OPTIONS_PRINT_XDUMP);
+  register_activate_cb (w->FD.printButt[3],    OptionsCb, OPTIONS_PRINT_GIF);
+  register_activate_cb (w->FD.printButt[4],    OptionsCb, OPTIONS_PRINT_GLPRECURSIVE);
+  register_activate_cb (w->FD.printButt[5],    OptionsCb, OPTIONS_PRINT_GLPIMAGE);
+  /*
+  register_activate_cb (w->FD.printButt[6],    OptionsCb, OPTIONS_PRINT_XPM);
+  register_activate_cb (w->FD.printButt[7],    OptionsCb, OPTIONS_PRINT_PS);
+  register_activate_cb (w->FD.printButt[8],    OptionsCb, OPTIONS_PRINT_EPS);
+  */
+}
+
+void RegisterCallbacks_OD(Widgets_T *w){
+
+  register_ok_cb      (w->OD.geomDialog,         OptionsCb,  OPTIONS_REPLOT);
+  register_cancel_cb  (w->OD.geomDialog,         ManageCb,   w->OD.geomDialog); 
+  register_valchg_cb  (w->OD.geomVisibleTypeButt[0], OptionsCb,  OPTIONS_GEOM_VISIBILITY_ENTITY);
+  register_valchg_cb  (w->OD.geomVisibleTypeButt[1], OptionsCb,  OPTIONS_GEOM_VISIBILITY_NUMBER);
+  register_valchg_cb  (w->OD.geomVisibleButt[0], OptionsCb,  OPTIONS_GEOM_POINTS);
+  register_valchg_cb  (w->OD.geomVisibleButt[1], OptionsCb,  OPTIONS_GEOM_LINES);
+  register_valchg_cb  (w->OD.geomVisibleButt[2], OptionsCb,  OPTIONS_GEOM_SURFACES);
+  register_valchg_cb  (w->OD.geomVisibleButt[3], OptionsCb,  OPTIONS_GEOM_VOLUMES);
+  register_activate_cb(w->OD.geomVisibleByNumText, OptionsCb,  OPTIONS_GEOM_HIDE_SHOW);
+  register_valchg_cb  (w->OD.geomNormalsScale,   OptionsCb,  OPTIONS_GEOM_NORMALS_SCALE);
+  register_drag_cb    (w->OD.geomNormalsScale,   OptionsCb,  OPTIONS_GEOM_NORMALS_SCALE);
+  register_activate_cb(w->OD.geomNormalsText,    OptionsCb,  OPTIONS_GEOM_NORMALS_TEXT);
+  register_valchg_cb  (w->OD.geomTangentsScale,  OptionsCb,  OPTIONS_GEOM_TANGENTS_SCALE);
+  register_drag_cb    (w->OD.geomTangentsScale,  OptionsCb,  OPTIONS_GEOM_TANGENTS_SCALE);
+  register_activate_cb(w->OD.geomTangentsText,   OptionsCb,  OPTIONS_GEOM_TANGENTS_TEXT);
+
+  register_ok_cb      (w->OD.meshDialog,         OptionsCb,  OPTIONS_REPLOT);
+  register_cancel_cb  (w->OD.meshDialog,         ManageCb,   w->OD.meshDialog); 
+  register_valchg_cb  (w->OD.meshAlgoButt[0],    OptionsCb,  OPTIONS_MESH_DEGRE2);
+  register_valchg_cb  (w->OD.meshAlgoButt[1],    OptionsCb,  OPTIONS_MESH_ANISOTROPIC);
+  register_valchg_cb  (w->OD.meshSmoothingScale, OptionsCb,  OPTIONS_MESH_SMOOTHING_SCALE);
+  register_drag_cb    (w->OD.meshSmoothingScale, OptionsCb,  OPTIONS_MESH_SMOOTHING_SCALE);
+  register_activate_cb(w->OD.meshSmoothingText,  OptionsCb,  OPTIONS_MESH_SMOOTHING_TEXT);
+  register_valchg_cb  (w->OD.meshVisibleTypeButt[0], OptionsCb,  OPTIONS_MESH_VISIBILITY_ENTITY);
+  register_valchg_cb  (w->OD.meshVisibleTypeButt[1], OptionsCb,  OPTIONS_MESH_VISIBILITY_NUMBER);
+  register_valchg_cb  (w->OD.meshVisibleButt[0], OptionsCb,  OPTIONS_MESH_POINTS);
+  register_valchg_cb  (w->OD.meshVisibleButt[1], OptionsCb,  OPTIONS_MESH_LINES);
+  register_valchg_cb  (w->OD.meshVisibleButt[2], OptionsCb,  OPTIONS_MESH_SURFACES);
+  register_valchg_cb  (w->OD.meshVisibleButt[3], OptionsCb,  OPTIONS_MESH_VOLUMES);
+  register_activate_cb(w->OD.meshVisibleByNumText,    OptionsCb,  OPTIONS_MESH_HIDE_SHOW);
+  register_valchg_cb  (w->OD.meshAspectButt[0],  OptionsCb,  OPTIONS_MESH_WIREFRAME);
+  register_valchg_cb  (w->OD.meshAspectButt[1],  OptionsCb,  OPTIONS_MESH_HIDDEN_LINES);
+  register_valchg_cb  (w->OD.meshAspectButt[2],  OptionsCb,  OPTIONS_MESH_SHADING);
+  register_valchg_cb  (w->OD.meshExplodeScale,   OptionsCb,  OPTIONS_MESH_EXPLODE_SCALE);
+  register_drag_cb    (w->OD.meshExplodeScale,   OptionsCb,  OPTIONS_MESH_EXPLODE_SCALE);
+  register_activate_cb(w->OD.meshExplodeText,    OptionsCb,  OPTIONS_MESH_EXPLODE_TEXT);
+  register_valchg_cb  (w->OD.meshNormalsScale,   OptionsCb,  OPTIONS_MESH_NORMALS_SCALE);
+  register_drag_cb    (w->OD.meshNormalsScale,   OptionsCb,  OPTIONS_MESH_NORMALS_SCALE);
+  register_activate_cb(w->OD.meshNormalsText,    OptionsCb,  OPTIONS_MESH_NORMALS_TEXT);
+
+  register_ok_cb      (w->OD.postDialog,         OptionsCb,  OPTIONS_REPLOT);
+  register_cancel_cb  (w->OD.postDialog,         ManageCb,   w->OD.postDialog); 
+  register_valchg_cb  (w->OD.postLinkButt[0],    OptionsCb,  OPTIONS_POST_LINK_NONE);
+  register_valchg_cb  (w->OD.postLinkButt[1],    OptionsCb,  OPTIONS_POST_LINK_VISIBLE);
+  register_valchg_cb  (w->OD.postLinkButt[2],    OptionsCb,  OPTIONS_POST_LINK_ALL);
+  register_valchg_cb  (w->OD.postAnimScale,      OptionsCb,  OPTIONS_POST_ANIM_DELAY);
+  register_drag_cb    (w->OD.postAnimScale,      OptionsCb,  OPTIONS_POST_ANIM_DELAY);
+
+  register_ok_cb      (w->OD.miscDialog,         OptionsCb,  OPTIONS_REPLOT);
+  register_cancel_cb  (w->OD.miscDialog,         ManageCb,   w->OD.miscDialog); 
+  register_valchg_cb  (w->OD.miscMiscButt[0],    OptionsCb,  OPTIONS_AXES);
+  register_valchg_cb  (w->OD.miscMiscButt[1],    OptionsCb,  OPTIONS_LITTLE_AXES);
+  register_valchg_cb  (w->OD.miscMiscButt[2],    OptionsCb,  OPTIONS_FAST_REDRAW);
+  register_valchg_cb  (w->OD.miscMiscButt[3],    OptionsCb,  OPTIONS_DISPLAY_LISTS);
+  register_valchg_cb  (w->OD.miscMiscButt[4],    OptionsCb,  OPTIONS_ALPHA_BLENDING);
+  register_valchg_cb  (w->OD.miscColorSchemeScale, OptionsCb, OPTIONS_COLOR_SCHEME_SCALE);
+  register_drag_cb    (w->OD.miscColorSchemeScale, OptionsCb, OPTIONS_COLOR_SCHEME_SCALE);
+  register_valchg_cb  (w->OD.miscProjButt[0],    OptionsCb,  OPTIONS_ORTHOGRAPHIC);
+  register_valchg_cb  (w->OD.miscProjButt[1],    OptionsCb,  OPTIONS_PERSPECTIVE);
+  register_valchg_cb  (w->OD.miscLightScale[0],  OptionsCb,  OPTIONS_LIGHT_X_SCALE);
+  register_drag_cb    (w->OD.miscLightScale[0],  OptionsCb,  OPTIONS_LIGHT_X_SCALE);
+  register_valchg_cb  (w->OD.miscLightScale[1],  OptionsCb,  OPTIONS_LIGHT_Y_SCALE);
+  register_drag_cb    (w->OD.miscLightScale[1],  OptionsCb,  OPTIONS_LIGHT_Y_SCALE);
+  register_valchg_cb  (w->OD.miscLightScale[2],  OptionsCb,  OPTIONS_LIGHT_Z_SCALE);
+  register_drag_cb    (w->OD.miscLightScale[2],  OptionsCb,  OPTIONS_LIGHT_Z_SCALE);
+  register_valchg_cb  (w->OD.miscShineScale,     OptionsCb,  OPTIONS_SHINE_SCALE);
+  register_drag_cb    (w->OD.miscShineScale,     OptionsCb,  OPTIONS_SHINE_SCALE);
+
+  register_ok_cb      (w->OD.viewportDialog,         OptionsCb,  OPTIONS_REPLOT);
+  register_cancel_cb  (w->OD.viewportDialog,         ManageCb,   w->OD.viewportDialog); 
+  register_valchg_cb  (w->OD.viewportText[0][0],     OptionsCb,  OPTIONS_ROTX);
+  register_valchg_cb  (w->OD.viewportText[0][1],     OptionsCb,  OPTIONS_ROTY);
+  register_valchg_cb  (w->OD.viewportText[0][2],     OptionsCb,  OPTIONS_ROTZ);
+  register_valchg_cb  (w->OD.viewportText[1][0],     OptionsCb,  OPTIONS_TRANX);
+  register_valchg_cb  (w->OD.viewportText[1][1],     OptionsCb,  OPTIONS_TRANY);
+  register_valchg_cb  (w->OD.viewportText[1][2],     OptionsCb,  OPTIONS_TRANZ);
+  register_valchg_cb  (w->OD.viewportText[2][0],     OptionsCb,  OPTIONS_SCALEX);
+  register_valchg_cb  (w->OD.viewportText[2][1],     OptionsCb,  OPTIONS_SCALEY);
+  register_valchg_cb  (w->OD.viewportText[2][2],     OptionsCb,  OPTIONS_SCALEZ);
+  register_valchg_cb  (w->OD.viewportLockButt[0][0], OptionsCb,  OPTIONS_ROTX_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[0][1], OptionsCb,  OPTIONS_ROTY_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[0][2], OptionsCb,  OPTIONS_ROTZ_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[1][0], OptionsCb,  OPTIONS_TRANX_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[1][1], OptionsCb,  OPTIONS_TRANY_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[1][2], OptionsCb,  OPTIONS_TRANZ_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[2][0], OptionsCb,  OPTIONS_SCALEX_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[2][1], OptionsCb,  OPTIONS_SCALEY_LOCKED);
+  register_valchg_cb  (w->OD.viewportLockButt[2][2], OptionsCb,  OPTIONS_SCALEZ_LOCKED);
+
+  register_ok_cb      (w->OD.infoDialog,         CurrentInfoCb,    0);
+  register_cancel_cb  (w->OD.infoDialog,         ManageCb,         w->OD.infoDialog); 
+
+}
+
+void RegisterCallbacks_HD(Widgets_T *w){
+  
+}
+
+void RegisterCallbacks_GD(Widgets_T *w){
+  
+  register_ok_cb      (w->GD.paramDialog,    GeomCb,    GEOM_PARAMETER_ADD);
+  register_cancel_cb  (w->GD.paramDialog,    ManageCb,  w->GD.paramDialog); 
+  register_valchg_cb  (w->GD.paramText[0],   GeomCb,    GEOM_PARAMETER_NAME);
+  register_valchg_cb  (w->GD.paramText[1],   GeomCb,    GEOM_PARAMETER_VALUE);
+
+  register_ok_cb      (w->GD.pointDialog,    GeomCb,    GEOM_POINT_ADD);
+  register_cancel_cb  (w->GD.pointDialog,    ManageCb,  w->GD.pointDialog); 
+  register_valchg_cb  (w->GD.pointText[0],   GeomCb,    GEOM_POINT_X);
+  register_valchg_cb  (w->GD.pointText[1],   GeomCb,    GEOM_POINT_Y);
+  register_valchg_cb  (w->GD.pointText[2],   GeomCb,    GEOM_POINT_Z);
+  register_valchg_cb  (w->GD.pointText[3],   GeomCb,    GEOM_POINT_L);
+
+  register_cancel_cb  (w->GD.rotDialog,      ManageCb,  w->GD.rotDialog); 
+  register_valchg_cb  (w->GD.rotText[0],     GeomCb,    GEOM_ROT_PX);
+  register_valchg_cb  (w->GD.rotText[1],     GeomCb,    GEOM_ROT_PY);
+  register_valchg_cb  (w->GD.rotText[2],     GeomCb,    GEOM_ROT_PZ);
+  register_valchg_cb  (w->GD.rotText[3],     GeomCb,    GEOM_ROT_AX);
+  register_valchg_cb  (w->GD.rotText[4],     GeomCb,    GEOM_ROT_AY);
+  register_valchg_cb  (w->GD.rotText[5],     GeomCb,    GEOM_ROT_AZ);
+  register_valchg_cb  (w->GD.rotText[6],     GeomCb,    GEOM_ROT_ANGLE);
+
+  register_cancel_cb  (w->GD.tranDialog,     ManageCb,  w->GD.tranDialog); 
+  register_valchg_cb  (w->GD.tranText[0],    GeomCb,    GEOM_TRAN_X);
+  register_valchg_cb  (w->GD.tranText[1],    GeomCb,    GEOM_TRAN_Y);
+  register_valchg_cb  (w->GD.tranText[2],    GeomCb,    GEOM_TRAN_Z);
+
+  register_cancel_cb  (w->GD.dilatDialog,    ManageCb,  w->GD.dilatDialog); 
+  register_valchg_cb  (w->GD.dilatText[0],   GeomCb,    GEOM_DILAT_X);
+  register_valchg_cb  (w->GD.dilatText[1],   GeomCb,    GEOM_DILAT_Y);
+  register_valchg_cb  (w->GD.dilatText[2],   GeomCb,    GEOM_DILAT_Z);
+  register_valchg_cb  (w->GD.dilatText[3],   GeomCb,    GEOM_DILAT_F);
+
+}
+
+void RegisterCallbacks_MD(Widgets_T *w){
+
+  register_cancel_cb  (w->MD.charLengthDialog,   ManageCb,  w->MD.charLengthDialog); 
+  register_valchg_cb  (w->MD.charLengthText,     MeshCb,    MESH_CHAR_LENGTH);
+
+  register_cancel_cb  (w->MD.trsfLineDialog,     ManageCb,  w->MD.trsfLineDialog); 
+  register_valchg_cb  (w->MD.trsfLineText[0],    MeshCb,    MESH_TRSF_LINE_TYPE);
+  register_valchg_cb  (w->MD.trsfLineText[1],    MeshCb,    MESH_TRSF_LINE_PTS);
+
+  register_cancel_cb  (w->MD.trsfVolumeDialog,   ManageCb,  w->MD.trsfVolumeDialog); 
+  register_valchg_cb  (w->MD.trsfVolumeText,     MeshCb,    MESH_TRSF_VOL_NUM);
+  
+}
+
+void RegisterCallbacks_PD(Widgets_T *w){
+
+  register_ok_cb       (w->PD.offsetDialog,      OptionsCb, OPTIONS_REPLOT); 
+  register_cancel_cb   (w->PD.offsetDialog,      ManageCb,  w->PD.offsetDialog); 
+  register_valchg_cb   (w->PD.offsetModeButt[0], PostCb,    POST_OFFSET_TRANSLATE);
+  register_valchg_cb   (w->PD.offsetModeButt[1], PostCb,    POST_OFFSET_RAISE);
+  register_valchg_cb   (w->PD.offsetScale[0],    PostCb,    POST_OFFSET_X_SCALE);
+  register_drag_cb     (w->PD.offsetScale[0],    PostCb,    POST_OFFSET_X_SCALE);
+  register_activate_cb (w->PD.offsetText[0],     PostCb,    POST_OFFSET_X_TEXT);
+  register_valchg_cb   (w->PD.offsetScale[1],    PostCb,    POST_OFFSET_Y_SCALE);
+  register_drag_cb     (w->PD.offsetScale[1],    PostCb,    POST_OFFSET_Y_SCALE);
+  register_activate_cb (w->PD.offsetText[1],     PostCb,    POST_OFFSET_Y_TEXT);
+  register_valchg_cb   (w->PD.offsetScale[2],    PostCb,    POST_OFFSET_Z_SCALE);
+  register_drag_cb     (w->PD.offsetScale[2],    PostCb,    POST_OFFSET_Z_SCALE);
+  register_activate_cb (w->PD.offsetText[2],     PostCb,    POST_OFFSET_Z_TEXT);
+  
+  register_ok_cb       (w->PD.timeStepDialog,    OptionsCb, OPTIONS_REPLOT); 
+  register_cancel_cb   (w->PD.timeStepDialog,    ManageCb,  w->PD.timeStepDialog); 
+  register_valchg_cb   (w->PD.timeStepScale,     PostCb,    POST_TIME_STEP_SCALE);
+  register_drag_cb     (w->PD.timeStepScale,     PostCb,    POST_TIME_STEP_SCALE);
+  register_activate_cb (w->PD.timeStepText,      PostCb,    POST_TIME_STEP_TEXT);
+
+  register_ok_cb       (w->PD.scaleDialog,       OptionsCb, OPTIONS_REPLOT); 
+  register_cancel_cb   (w->PD.scaleDialog,       ManageCb,  w->PD.scaleDialog); 
+  register_valchg_cb   (w->PD.scaleShowButt,     PostCb,    POST_SCALE_SHOW);
+  register_valchg_cb   (w->PD.scaleTransButt,    PostCb,    POST_SCALE_TRANSPARENCY);
+  register_valchg_cb   (w->PD.scaleText[0],      PostCb,    POST_SCALE_FORMAT);
+  register_valchg_cb   (w->PD.scaleText[1],      PostCb,    POST_SCALE_LABEL);
+  register_valchg_cb   (w->PD.scaleRangeButt,    PostCb,    POST_SCALE_FORCE_RANGE);
+  register_valchg_cb   (w->PD.scaleRangeText[0], PostCb,    POST_SCALE_MIN);
+  register_valchg_cb   (w->PD.scaleRangeText[1], PostCb,    POST_SCALE_MAX);
+  register_valchg_cb   (w->PD.scaleTypeButt[0],  PostCb,    POST_SCALE_TYPE_LIN);
+  register_valchg_cb   (w->PD.scaleTypeButt[1],  PostCb,    POST_SCALE_TYPE_LOG);
+  register_valchg_cb   (w->PD.scaleIntervalsButt[0], PostCb, POST_SCALE_INTERVALS_TYPE_ISO);
+  register_valchg_cb   (w->PD.scaleIntervalsButt[1], PostCb, POST_SCALE_INTERVALS_TYPE_DISCRETE);
+  register_valchg_cb   (w->PD.scaleIntervalsButt[2], PostCb, POST_SCALE_INTERVALS_TYPE_CONTINUOUS);
+  register_valchg_cb   (w->PD.scaleIntervalsButt[3], PostCb, POST_SCALE_INTERVALS_TYPE_NUMERIC);
+  register_valchg_cb   (w->PD.scaleIntervalsScale,   PostCb, POST_SCALE_INTERVALS_SCALE);
+  register_drag_cb     (w->PD.scaleIntervalsScale,   PostCb, POST_SCALE_INTERVALS_SCALE);
+  register_activate_cb (w->PD.scaleIntervalsText,    PostCb, POST_SCALE_INTERVALS_TEXT);
+
+  register_ok_cb       (w->PD.colorDialog,        PostCb,    POST_COLOR_REPLOT); 
+  register_cancel_cb   (w->PD.colorDialog,        ManageCb,  w->PD.colorDialog); 
+  register_expose_cb   (w->PD.colorDrawingArea,   ColorBarExposeCb, NULL);
+  register_resize_cb   (w->PD.colorDrawingArea,   ColorBarResizeCb, NULL);
+  register_input_cb    (w->PD.colorDrawingArea,   ColorBarInputCb,  NULL);
+
+  register_ok_cb       (w->PD.vectorDialog,       OptionsCb, OPTIONS_REPLOT); 
+  register_cancel_cb   (w->PD.vectorDialog,       ManageCb,  w->PD.vectorDialog); 
+  register_valchg_cb   (w->PD.vectorTypeButt[0],  PostCb,    POST_VECTOR_TYPE_SEGMENT);
+  register_valchg_cb   (w->PD.vectorTypeButt[1],  PostCb,    POST_VECTOR_TYPE_ARROW);
+  register_valchg_cb   (w->PD.vectorTypeButt[2],  PostCb,    POST_VECTOR_TYPE_PYRAMID);
+  register_valchg_cb   (w->PD.vectorTypeButt[3],  PostCb,    POST_VECTOR_TYPE_CONE);
+  register_valchg_cb   (w->PD.vectorTypeButt[4],  PostCb,    POST_VECTOR_TYPE_DISPLACEMENT);
+  register_valchg_cb   (w->PD.vectorScaleScale,   PostCb,    POST_VECTOR_SCALE_SCALE);
+  register_drag_cb     (w->PD.vectorScaleScale,   PostCb,    POST_VECTOR_SCALE_SCALE);
+  register_activate_cb (w->PD.vectorScaleText,    PostCb,    POST_VECTOR_SCALE_TEXT);
+  register_valchg_cb   (w->PD.vectorLocationButt[0],PostCb,  POST_VECTOR_LOCATION_COG);
+  register_valchg_cb   (w->PD.vectorLocationButt[1],PostCb,  POST_VECTOR_LOCATION_VERTEX);
+
+  register_ok_cb       (w->PD.exportBGMDialog,   PostCb,    POST_EXPORT_BGM_CREATE);
+  register_cancel_cb   (w->PD.exportBGMDialog,   ManageCb,  w->PD.exportBGMDialog);
+  register_activate_cb (w->PD.exportBGMButt[0],  PostCb,    POST_EXPORT_BGM_METHOD_H_ERROR) ;
+  register_activate_cb (w->PD.exportBGMButt[1],  PostCb,    POST_EXPORT_BGM_METHOD_H_ELEMENTS) ;
+  register_activate_cb (w->PD.exportBGMButt[2],  PostCb,    POST_EXPORT_BGM_METHOD_P_ERROR) ;
+  register_activate_cb (w->PD.exportBGMButt[3],  PostCb,    POST_EXPORT_BGM_METHOD_P_ELEMENTS) ;
+  register_valchg_cb   (w->PD.exportBGMText,     PostCb,    POST_EXPORT_BGM_CONSTRAINT) ;
+
+}
+
+
+
+void RegisterCallbacks(Widgets_T *w){
+
+  RegisterCallbacks_M(w); /* menu win */   
+  RegisterCallbacks_G(w); /* graphic win */
+  if(CTX.command_win) RegisterCallbacks_C(w); /* command win */
+
+  RegisterCallbacks_ED(w); /* error dialogs */
+  RegisterCallbacks_FD(w); /* file dialogs */
+  RegisterCallbacks_OD(w); /* option dialogs */
+  RegisterCallbacks_HD(w); /* help dialogs */
+  RegisterCallbacks_GD(w); /* geometry dialogs */
+  RegisterCallbacks_MD(w); /* mesh dialogs */
+  RegisterCallbacks_PD(w); /* post dialogs */
+
+}
+
+
diff --git a/Unix/Register.h b/Unix/Register.h
new file mode 100644
index 0000000000000000000000000000000000000000..c18456cfa724f5eecac5d7fbfed7b0202f348bdd
--- /dev/null
+++ b/Unix/Register.h
@@ -0,0 +1,139 @@
+#ifndef _REGISTER_H_
+#define _REGISTER_H_
+
+void InitCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *cb);
+void ResizeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb);
+void ExposeCb(Widget w,XtPointer client_data, GLwDrawingAreaCallbackStruct *cb);
+
+void RegisterCallbacks(Widgets_T *w);
+
+void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data);
+
+void ExposeCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data);
+void InitCb  (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data);
+void InputCb (Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data);
+void ResizeCb(Widget w, XtPointer client_data, GLwDrawingAreaCallbackStruct *call_data);
+
+void ColorBarResizeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb);
+void ColorBarExposeCb(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb);
+void ColorBarInputCb (Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cb);
+
+void ExitCb             (Widget w, XtPointer client_data, XtPointer call_data);
+void ManageCb           (Widget w, XtPointer client_data, XtPointer call_data);
+void PreviousContextCb  (Widget w, XtPointer client_data, XtPointer call_data);
+void NextContextCb      (Widget w, XtPointer client_data, XtPointer call_data);
+void ActualizeContextCb (Widget w, XtPointer client_data, XtPointer call_data);
+void DrawAboutCb        (Widget w, XtPointer client_data, XtPointer call_data);
+void CurrentInfoCb      (Widget w, XtPointer client_data, XtPointer call_data);
+void CurrentViewportCb  (Widget w, XtPointer client_data, XtPointer call_data);
+void CurrentViewCb      (Widget w, XtPointer client_data, XtPointer call_data);
+void SwapViewCb         (Widget w, XtPointer client_data, XtPointer call_data);
+void RemoveViewCb       (Widget w, XtPointer client_data, XtPointer call_data);
+void DuplicateViewCb    (Widget w, XtPointer client_data, XtPointer call_data);
+
+void OptionsCb          (Widget w, XtPointer client_data, XtPointer call_data);
+void FileCb             (Widget w, XtPointer client_data, XtPointer call_data);
+void GeomCb             (Widget w, XtPointer client_data, XtPointer call_data);
+void MeshCb             (Widget w, XtPointer client_data, XtPointer call_data);
+void PostDialogCb       (Widget w, XtPointer client_data, XtPointer call_data);
+void PostCb             (Widget w, XtPointer client_data, XtPointer call_data);
+
+void PopupHandler       (Widget w, Widget pw, XEvent *event, Boolean *ctd);
+
+
+/* special GL callback registering */
+
+#define register_GLexpose_cb(w, func, arg)			\
+        XtAddCallback((w), GLwNexposeCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+                                                        
+#define register_GLresize_cb(w, func, arg)			\
+        XtAddCallback((w), GLwNresizeCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+
+#define register_GLinput_cb(w, func, arg)			\
+        XtAddCallback((w), GLwNinputCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+                                                        
+#define register_GLinit_cb(w, func, arg)			\
+        XtAddCallback((w), GLwNginitCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+                                                        
+/* classic motif callback registering */
+                                                        
+#define register_help_cb(w, func, arg)	            		\
+        XtAddCallback((w), XmNhelpCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+
+#define register_expose_cb(w, func, arg)			\
+        XtAddCallback((w), XmNexposeCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+                                                        
+#define register_resize_cb(w, func, arg)			\
+        XtAddCallback((w), XmNresizeCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+
+#define register_input_cb(w, func, arg)				\
+        XtAddCallback((w), XmNinputCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+                                                        
+#define register_activate_cb(w, func, arg)			\
+        XtAddCallback((w), XmNactivateCallback,			\
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+
+#define register_remove_cb(w, func, arg)			\
+        XtRemoveCallback((w), XmNactivateCallback,	        \
+                (XtCallbackProc) (func),			\
+                (XtPointer) (arg))                      
+
+#define register_activate_cb_list(w, list)		\
+        XtAddCallbacks((w), XmNactivateCallback,	\
+                (XtCallbackList)(list))
+
+#define register_valchg_cb(w, func, arg)		\
+        XtAddCallback((w), XmNvalueChangedCallback,	\
+                (XtCallbackProc) (func),		\
+                (XtPointer) (arg))
+
+#define register_valchg_cb_list(w, list)		\
+        XtAddCallbacks((w), XmNvalueChangedCallback,	\
+                (XtCallbackList)(list))
+
+#define register_ok_cb(w, func, arg)		\
+        XtAddCallback((w), XmNokCallback,	\
+                (XtCallbackProc) (func),	\
+                (XtPointer) (arg))
+
+#define register_cancel_cb(w, func, arg)	\
+        XtAddCallback((w), XmNcancelCallback,	\
+                (XtCallbackProc) (func),	\
+                (XtPointer) (arg))
+
+#define register_apply_cb(w, func, arg)	\
+        XtAddCallback((w), XmNapplyCallback,	\
+                (XtCallbackProc) (func),	\
+                (XtPointer) (arg))
+
+#define register_drag_cb(w, func, arg)		\
+        XtAddCallback((w), XmNdragCallback,	\
+                (XtCallbackProc) (func),	\
+                (XtPointer) (arg))
+
+/* event loop  */
+
+#define register_popup_ev(parent, w)				\
+        XtAddEventHandler((parent), ButtonPressMask,		\
+                          False,				\
+                          (XtEventHandler)PopupHandler,	\
+                          (XtPointer)(w))
+
+#endif
diff --git a/Unix/Widgets.cpp b/Unix/Widgets.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c2614bb008b3f36b67f9e65c9e892ab348129716
--- /dev/null
+++ b/Unix/Widgets.cpp
@@ -0,0 +1,2684 @@
+
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "Mesh.h"
+#include "Context.h"
+#include "XContext.h"
+#include "Info.h"
+#include "Widgets.h"
+#include "Help.h"
+
+extern Context_T   CTX ;
+extern XContext_T  XCTX ;
+
+/* hardcoded this one, since it is required for the motion handling */
+
+static char DrawingAreaTranslations[] = "#replace\n\
+~s ~m ~a <Key>Return:DrawingAreaInput() ManagerParentActivate()\n\
+<Key>Return:DrawingAreaInput() ManagerGadgetSelect()\n\
+<Key>osfActivate:DrawingAreaInput() ManagerParentActivate()\n\
+<Key>osfCancel:DrawingAreaInput() ManagerParentCancel()\n\
+<Key>osfHelp:DrawingAreaInput() ManagerGadgetHelp()\n\
+<Key>space:DrawingAreaInput() ManagerGadgetSelect()\n\
+<Key>osfSelect:DrawingAreaInput() ManagerGadgetSelect()\n\
+<KeyDown>:DrawingAreaInput() ManagerGadgetKeyInput()\n\
+<KeyUp>:DrawingAreaInput()\n\
+<BtnMotion>:DrawingAreaInput() ManagerGadgetButtonMotion()\n\
+<Motion>:DrawingAreaInput() ManagerGadgetButtonMotion()\n\
+<Btn1Down>:DrawingAreaInput() ManagerGadgetArm()\n\
+<Btn1Up>:DrawingAreaInput() ManagerGadgetActivate()\n\
+<Btn2Down>:DrawingAreaInput() ManagerGadgetDrag()\n\
+<BtnDown>:DrawingAreaInput()\n\
+<BtnUp>:DrawingAreaInput()";
+
+/* ------------------------------------------------------------------------ 
+    MENU WINDOW
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_M(Widgets_T *w){
+  int   i, n ;
+  Arg   arg[10] ;
+
+  /* menu shell */
+  w->M.shell = 
+    XtVaAppCreateShell("Gmsh", "gmshMW", applicationShellWidgetClass, XCTX.display, 
+		       XmNvisual, XCTX.gui.visual,
+		       XmNcolormap, XCTX.gui.colormap,
+		       NULL);
+  
+  /* menu main window */
+  i=0;
+  w->M.containerWin = XmCreateMainWindow(w->M.shell, "McontainerWin", arg, i);
+  XtManageChild(w->M.containerWin);
+  
+  /* menu bar */
+  i=0;
+  w->M.menuBar = XmCreateMenuBar(w->M.containerWin, "MmenuBar", arg, i);
+  XtManageChild(w->M.menuBar);
+
+  /* file menu */
+  i=0;
+  w->M.filePane = XmCreatePulldownMenu(w->M.menuBar, "MfilePane", arg, i);
+					
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Open")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-o)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>o:"); i++;
+  w->M.fileButt[0] = XmCreatePushButton(w->M.filePane, "MfileButt0", arg, i);
+  XtManageChild(w->M.fileButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Merge")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-m)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>m:"); i++;
+  w->M.fileButt[1] = XmCreatePushButton(w->M.filePane, "MfileButt1", arg, i);
+  XtManageChild(w->M.fileButt[1]);
+
+  i=0;
+  w->M.fileSep[0] = XmCreateSeparator(w->M.filePane, "MfileSep0", arg, i);
+  XtManageChild(w->M.fileSep[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Save")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-s)")); i++;
+  w->M.fileButt[2] = XmCreatePushButton(w->M.filePane, "MfileButt2", arg, i);
+  XtManageChild(w->M.fileButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Save as")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-S-s)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>s:"); i++;
+  w->M.fileButt[3] = XmCreatePushButton(w->M.filePane, "MfileButt3", arg, i);
+  XtManageChild(w->M.fileButt[3]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Print")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-p)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>p:"); i++;
+  w->M.fileButt[4] = XmCreatePushButton(w->M.filePane, "MfileButt4", arg, i);
+  XtManageChild(w->M.fileButt[4]);
+
+  i=0;
+  w->M.fileSep[1] = XmCreateSeparator(w->M.filePane, "MfileSep1", arg, i);
+  XtManageChild(w->M.fileSep[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Quit")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(C-q)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Ctrl<Key>q:"); i++;
+  w->M.fileButt[5] = XmCreatePushButton(w->M.filePane, "MfileButt5", arg, i);
+  XtManageChild(w->M.fileButt[5]);
+
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->M.filePane); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("File")); i++;
+  w->M.fileCascade = XmCreateCascadeButton(w->M.menuBar, "MfileCascade", arg, i);
+  XtManageChild(w->M.fileCascade);
+
+  /* module menu */
+  i=0;
+  w->M.modulePane = XmCreatePulldownMenu(w->M.menuBar, "MmodulePane", arg, i);
+					
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(g)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "<Key>g:"); i++;
+  w->M.moduleButt[0] = XmCreatePushButton(w->M.modulePane, "MmoduleButt0", arg, i);
+  XtManageChild(w->M.moduleButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(m)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "<Key>m:"); i++;
+  w->M.moduleButt[1] = XmCreatePushButton(w->M.modulePane, "MmoduleButt1", arg, i);
+  XtManageChild(w->M.moduleButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(p)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "<Key>p:"); i++;
+  w->M.moduleButt[2] = XmCreatePushButton(w->M.modulePane, "MmoduleButt2", arg, i);
+  XtManageChild(w->M.moduleButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->M.modulePane); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Module")); i++;
+  w->M.moduleCascade = XmCreateCascadeButton(w->M.menuBar, "MmoduleCascade", arg, i);
+  XtManageChild(w->M.moduleCascade);
+
+  /* option menu */
+  i=0;
+  w->M.optionPane = XmCreatePulldownMenu(w->M.menuBar, "MoptionPane", arg, i);
+					
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry Options")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-g)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>g:"); i++;
+  w->M.optionButt[0] = XmCreatePushButton(w->M.optionPane, "MoptionButt0", arg, i);
+  XtManageChild(w->M.optionButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh Options")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-m)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>m:"); i++;
+  w->M.optionButt[1] = XmCreatePushButton(w->M.optionPane, "MoptionButt1", arg, i);
+  XtManageChild(w->M.optionButt[1]);
+
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing Options")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-p)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>p:"); i++;
+  w->M.optionButt[2] = XmCreatePushButton(w->M.optionPane, "MoptionButt2", arg, i);
+  XtManageChild(w->M.optionButt[2]);
+
+  i=0;
+  w->M.optionSep[0] = XmCreateSeparator(w->M.optionPane, "MoptionSep0", arg, i);
+  XtManageChild(w->M.optionSep[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("General Options")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-o)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>o:"); i++;
+  w->M.optionButt[3] = XmCreatePushButton(w->M.optionPane, "MoptionButt3", arg, i);
+  XtManageChild(w->M.optionButt[3]);
+
+  i=0;
+  w->M.optionSep[1] = XmCreateSeparator(w->M.optionPane, "MoptionSep1", arg, i);
+  XtManageChild(w->M.optionSep[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Viewport")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-v)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>v:"); i++;
+  w->M.optionButt[4] = XmCreatePushButton(w->M.optionPane, "MoptionButt4", arg, i);
+  XtManageChild(w->M.optionButt[4]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Current Info")); i++;
+  XtSetArg(arg[i], XmNacceleratorText, XmStringCreateSimple("(S-i)")); i++;
+  XtSetArg(arg[i], XmNaccelerator, "Shift<Key>i:"); i++;
+  w->M.optionButt[5] = XmCreatePushButton(w->M.optionPane, "MoptionButt5", arg, i);
+  XtManageChild(w->M.optionButt[5]);
+
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->M.optionPane); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Options")); i++;
+  w->M.optionCascade = XmCreateCascadeButton(w->M.menuBar, "MoptionCascade", arg, i);
+  XtManageChild(w->M.optionCascade);
+
+  /* help menu */
+  i=0;
+  w->M.helpPane = XmCreatePulldownMenu(w->M.menuBar, "MhelpPane", arg, i);
+					
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Short Help")); i++;
+  w->M.helpButt[0] = XmCreatePushButton(w->M.helpPane, "MhelpButt0", arg, i);
+  XtManageChild(w->M.helpButt[0]);
+
+  i=0;
+  w->M.helpSep[0] = XmCreateSeparator(w->M.helpPane, "MhelpSep0", arg, i);
+  XtManageChild(w->M.helpSep[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("About Gmsh...")); i++;
+  w->M.helpButt[1] = XmCreatePushButton(w->M.helpPane, "MhelpButt1", arg, i);
+  XtManageChild(w->M.helpButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->M.helpPane); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("?")); i++;
+  w->M.helpCascade = XmCreateCascadeButton(w->M.menuBar, "MhelpCascade", arg, i);
+  XtManageChild(w->M.helpCascade);
+
+  /* menu frame */
+  
+  i=0;
+  w->M.menuFrame = XmCreateFrame(w->M.containerWin, "MmenuFrame", arg, i);
+  XtManageChild(w->M.menuFrame);
+
+  /* menu form */
+  
+  i=0;
+  XtSetArg(arg[i], XmNresizable, False); i++;  
+  XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++;
+  /* pour eviter des redimensionnements intempestifs sous HP */
+  w->M.menuForm = XmCreateForm(w->M.menuFrame, "MmenuForm", arg, i);
+  XtManageChild(w->M.menuForm);
+
+  /* module butt */
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++;
+  w->M.modButt = XmCreateLabel(w->M.menuForm, "MmodButt", arg, i);
+  XtManageChild(w->M.modButt);
+
+  i=0;
+  w->M.modPop = XmCreatePopupMenu(w->M.modButt, "MmodPop", arg, i);
+  XtUnmanageChild(w->M.modPop);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++;
+  w->M.geomButt = XmCreatePushButton(w->M.modPop, "MgeomButt", arg, i);
+  XtManageChild(w->M.geomButt);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++;
+  w->M.meshButt = XmCreatePushButton(w->M.modPop, "MmeshButt", arg, i);
+  XtManageChild(w->M.meshButt);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++;
+  w->M.postButt = XmCreatePushButton(w->M.modPop, "MpostButt", arg, i);
+  XtManageChild(w->M.postButt);
+
+  /* navigation arrows */
+
+  i=0;
+  XtSetArg(arg[i], XmNarrowDirection, XmARROW_LEFT); i++;
+  w->M.navigButt[0] = XmCreateArrowButton(w->M.menuForm, "MnavigButt0", arg, i);
+  XtManageChild(w->M.navigButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNarrowDirection, XmARROW_RIGHT); i++;
+  w->M.navigButt[1] = XmCreateArrowButton(w->M.menuForm, "MnavigButt1", arg, i);
+  XtManageChild(w->M.navigButt[1]);
+
+  /* default button */
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("No View Loaded")); i++;
+  w->M.defaultButt = XmCreateLabel(w->M.menuForm, "MdefaultButt", arg, i);
+  XtUnmanageChild(w->M.defaultButt);
+
+  /* buttons */
+  
+  for(n=0 ; n<NB_BUTT_MAX ; n++){
+    i=0;
+    w->M.pushButt[n] = XmCreatePushButton(w->M.menuForm, "MpushButtn", arg, i);
+    XtUnmanageChild(w->M.pushButt[n]);
+
+    i=0;
+    w->M.toggleButt[n] = XmCreateToggleButton(w->M.menuForm, "MtoggleButtn", arg, i);
+    XtUnmanageChild(w->M.toggleButt[n]);
+
+    i=0;
+    w->M.popMenu[n] = XmCreatePopupMenu(w->M.toggleButt[n], "MpopMenun", arg, i);
+    XtUnmanageChild(w->M.popMenu[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Remove")); i++;
+    w->M.removeButt[n] = XmCreatePushButton(w->M.popMenu[n], "MremoveButtn", arg, i);
+    XtManageChild(w->M.removeButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Duplicate")); i++;
+    w->M.duplicateButt[n] = XmCreatePushButton(w->M.popMenu[n], "MduplicateButtn", arg, i);
+    XtManageChild(w->M.duplicateButt[n]);
+
+    i=0;
+    w->M.popSep[0][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep0n", arg, i);
+    XtManageChild(w->M.popSep[0][n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lighting")); i++;
+    w->M.lightButt[n] = XmCreateToggleButton(w->M.popMenu[n], "MlightButtn", arg, i);
+    XtManageChild(w->M.lightButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Elements")); i++;
+    w->M.elementButt[n] = XmCreateToggleButton(w->M.popMenu[n], "MelementButtn", arg, i);
+    XtManageChild(w->M.elementButt[n]);
+
+    i=0;
+    w->M.popSep[1][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep1n", arg, i);
+    XtManageChild(w->M.popSep[1][n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale, Range and Intervals")); i++;
+    w->M.scaleButt[n] = XmCreatePushButton(w->M.popMenu[n], "MscaleButtn", arg, i);
+    XtManageChild(w->M.scaleButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Colors")); i++;
+    w->M.colorButt[n] = XmCreatePushButton(w->M.popMenu[n], "McolorButtn", arg, i);
+    XtManageChild(w->M.colorButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Offset")); i++;
+    w->M.offsetButt[n] = XmCreatePushButton(w->M.popMenu[n], "MoffsetButtn", arg, i);
+    XtManageChild(w->M.offsetButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector Display")); i++;
+    w->M.vectorButt[n] = XmCreatePushButton(w->M.popMenu[n], "MvectorButtn", arg, i);
+    XtManageChild(w->M.vectorButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Time Step")); i++;
+    w->M.timeStepButt[n] = XmCreatePushButton(w->M.popMenu[n], "MtimeStepButtn", arg, i);
+    XtManageChild(w->M.timeStepButt[n]);
+
+    i=0;
+    w->M.popSep[2][n] = XmCreateSeparator(w->M.popMenu[n], "MpopSep2n", arg, i);
+    XtManageChild(w->M.popSep[2][n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Export as Background Mesh")); i++;
+    w->M.exportBGMButt[n] = XmCreatePushButton(w->M.popMenu[n], "MexportBGMButtn", arg, i);
+    XtManageChild(w->M.exportBGMButt[n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Apply as Current Background Mesh")); i++;
+    w->M.applyBGMButt[n] = XmCreatePushButton(w->M.popMenu[n], "MapplyBGMButtn", arg, i);
+    XtManageChild(w->M.applyBGMButt[n]);
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    GRAPHIC WINDOW
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_G(Widgets_T *w){  
+  int   i;
+  Arg   arg[10];
+
+  /* graphic shell */
+  w->G.shell = 
+    XtVaAppCreateShell("Gmsh graphics", "gmshGW", applicationShellWidgetClass, XCTX.display, 
+		       XmNvisual,XCTX.gui.visual,
+		       XmNcolormap,XCTX.gui.colormap,
+		       NULL);
+  
+  /* container form */
+  i=0;
+  XtSetArg(arg[i], XmNresizable, False); i++;  
+  XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++;
+  w->G.containerForm = XmCreateForm(w->G.shell, "GcontainerForm", arg, i);
+  XtManageChild(w->G.containerForm);
+
+  /* opengl drawing area */
+  i=0;
+  XtSetArg(arg[i], XmNcolormap, XCTX.glw.colormap); i++;
+  XtSetArg(arg[i], GLwNvisualInfo, XCTX.glw.visinfo); i++;
+  XtSetArg(arg[i], GLwNinstallColormap, True); i++;
+  w->G.glw = GLwCreateMDrawingArea(w->G.containerForm, "glw", arg, i);
+  XtManageChild(w->G.glw);
+
+  /* overlay opengl drawing area */
+  if(CTX.overlay){
+    i=0;
+    XtSetArg(arg[i], XmNcolormap, XCTX.glo.colormap); i++;
+    XtSetArg(arg[i], GLwNvisualInfo, XCTX.glo.visinfo); i++;
+    XtSetArg(arg[i], GLwNinstallColormap, True); i++;    
+    w->G.glo = GLwCreateMDrawingArea(w->G.containerForm, "glo", arg, i);
+    XtManageChild(w->G.glo);
+  }    
+
+  /* bottom */
+
+  i=0;
+  XtSetArg(arg[i], XmNresizable, False); i++;  
+  XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++;
+  w->G.bottomForm = XmCreateForm(w->G.containerForm, "GbottomForm", arg, i);
+  XtManageChild(w->G.bottomForm);
+
+  /* buttons de gauche: X Y Z 1 Geometry Abort Play Stop */
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("X")); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[0] = XmCreatePushButton(w->G.bottomForm, "GButt0", arg, i);
+  XtManageChild(w->G.Butt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Y")); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[1] = XmCreatePushButton(w->G.bottomForm, "GButt1", arg, i);
+  XtManageChild(w->G.Butt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Z")); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[2] = XmCreatePushButton(w->G.bottomForm, "GButt2", arg, i);
+  XtManageChild(w->G.Butt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("1")); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[3] = XmCreatePushButton(w->G.bottomForm, "GButt3", arg, i);
+  XtManageChild(w->G.Butt[3]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("g")); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[4] = XmCreatePushButton(w->G.bottomForm, "GButt4", arg, i);
+  XtManageChild(w->G.Butt[4]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelType, XmPIXMAP); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[5] = XmCreatePushButton(w->G.bottomForm, "GButt5", arg, i);
+  XtManageChild(w->G.Butt[5]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelType, XmPIXMAP); i++;
+  XtSetArg(arg[i], XmNtraversalOn, False); i++;
+  w->G.Butt[6] = XmCreatePushButton(w->G.bottomForm, "GButt6", arg, i);
+  XtManageChild(w->G.Butt[6]);
+  XtSetSensitive(w->G.Butt[6],0);
+
+  /* 3 textes au milieu */
+
+  i=0;
+  XtSetArg(arg[i], XmNresizable, False); i++;  
+  XtSetArg(arg[i], XmNresizePolicy, XmRESIZE_NONE); i++;
+  w->G.textForm = XmCreateForm(w->G.bottomForm, "GtextForm", arg, i);
+  XtManageChild(w->G.textForm);
+
+  i=0;
+  XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++;
+  w->G.selectLabel = XmCreateLabel(w->G.textForm, "GselectLabel", arg, i);
+  XtManageChild(w->G.selectLabel);
+
+  i=0;
+  XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++;
+  w->G.infoLabel = XmCreateLabel(w->G.textForm, "GinfoLabel", arg, i);
+  XtManageChild(w->G.infoLabel);
+
+  i=0;
+  XtSetArg(arg[i], XmNalignment, XmALIGNMENT_BEGINNING); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(" ")); i++;
+  w->G.statusLabel = XmCreateLabel(w->G.textForm, "GstatusLabel", arg, i);
+  XtManageChild(w->G.statusLabel);
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    COMMAND WINDOW
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_C(Widgets_T *w){
+  int   i;
+  Arg   arg[10];
+
+  w->C.shell =
+    XtVaAppCreateShell("Gmsh commands", "gmshCW", applicationShellWidgetClass, XCTX.display,
+		       XmNvisual,XCTX.gui.visual,
+		       XmNcolormap,XCTX.gui.colormap,
+		       NULL);
+
+  i=0;
+  XtSetArg(arg[i], XmNpromptString, XmStringCreateSimple("")); i++;
+  w->C.command = XmCreateCommand(w->C.shell, "Ccommand", arg, i);
+  XtManageChild(w->C.command);
+
+  w->C.commandList = XmCommandGetChild(w->C.command, XmDIALOG_HISTORY_LIST);
+  w->C.commandText = XmCommandGetChild(w->C.command, XmDIALOG_COMMAND_TEXT);
+}
+
+
+/* ------------------------------------------------------------------------ 
+    ERROR DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_ED(Widgets_T *w){
+  int     i;
+  Arg     arg[10];
+  Widget  tmp ;
+
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Warning")); i++;
+  XtSetArg(arg[i], XmNmessageString, XmStringCreateSimple("File exists")); i++;
+  w->ED.printDialog = XmCreateWarningDialog(w->M.shell, "EDprintDialog", arg, i);
+
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Warning")); i++;
+  XtSetArg(arg[i], XmNmessageString, XmStringCreateSimple("File exists")); i++;
+  w->ED.saveDialog = XmCreateWarningDialog(w->M.shell, "EDsaveDialog", arg, i);
+
+  tmp = XmMessageBoxGetChild(w->ED.printDialog, XmDIALOG_HELP_BUTTON); 
+  XtUnmanageChild(tmp);
+  tmp = XmMessageBoxGetChild(w->ED.saveDialog, XmDIALOG_HELP_BUTTON); 
+  XtUnmanageChild(tmp);
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    FILE DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_FD(Widgets_T *w){
+  int     i;
+  Arg     arg[10];
+  Widget  tmp ;
+
+  /* open */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Open")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*.geo")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->FD.openDialog = XmCreateFileSelectionDialog(w->M.shell, "FDopenDialog", arg, i);
+  XtUnmanageChild(w->FD.openDialog);
+  
+  /* merge */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Merge")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*.[pm][os][sh]")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->FD.mergeDialog = XmCreateFileSelectionDialog(w->M.shell, "FDmergeDialog", arg, i);
+  XtUnmanageChild(w->FD.mergeDialog);
+
+  /* save */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Save")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->FD.saveDialog = XmCreateFileSelectionDialog(w->M.shell, "FDsaveDialog", arg, i);
+  XtUnmanageChild(w->FD.saveDialog);
+
+  /* save as */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Save Mesh")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->FD.saveAsDialog = XmCreateFileSelectionDialog(w->M.shell, "FDsaveAsDialog", arg, i);
+  XtUnmanageChild(w->FD.saveAsDialog);
+
+  i=0;
+  w->FD.saveAsFrame[0] = XmCreateFrame(w->FD.saveAsDialog, "FDsaveFrame0", arg, i);
+  XtManageChild(w->FD.saveAsFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Format")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->FD.saveAsFrame[1] = XmCreateLabel(w->FD.saveAsFrame[0], "FDsaveAsFrame1", arg, i);
+  XtManageChild(w->FD.saveAsFrame[1]);
+
+  i=0 ;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->FD.saveAsRowCol = XmCreateRowColumn(w->FD.saveAsFrame[0], "FDsaveAsRowCol", arg, i);
+  XtManageChild(w->FD.saveAsRowCol);
+
+  i=0;
+  w->FD.saveAsPane = XmCreatePulldownMenu(w->FD.saveAsRowCol, "FDsaveAsPane", arg, i);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Gmsh [.msh]")); i++;
+  w->FD.saveAsButt[0] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt0", arg, i);
+  XtManageChild(w->FD.saveAsButt[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Ideas universal [.unv]")); i++;
+  w->FD.saveAsButt[1] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt1", arg, i);
+  XtManageChild(w->FD.saveAsButt[1]);
+  /*
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Gref [.gre]")); i++;
+  w->FD.saveAsButt[2] = XmCreatePushButton(w->FD.saveAsPane, "MsaveAsButt2", arg, i);
+  XtManageChild(w->FD.saveAsButt[2]);
+  */
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->FD.saveAsPane); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->FD.saveAsMenu = XmCreateOptionMenu(w->FD.saveAsRowCol, "FDsaveAsMenu", arg, i);
+  XtManageChild(w->FD.saveAsMenu);
+
+  /* print */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Print Image to File")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++; /* + pratique qd on sauve des animations */
+  w->FD.printDialog = XmCreateFileSelectionDialog(w->M.shell, "FDprintDialog", arg, i);
+  XtUnmanageChild(w->FD.printDialog);
+
+  i=0;
+  w->FD.printFrame[0] = XmCreateFrame(w->FD.printDialog, "FDprintFrame0", arg, i);
+  XtManageChild(w->FD.printFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Format")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->FD.printFrame[1] = XmCreateLabel(w->FD.printFrame[0], "FDprintFrame1", arg, i);
+  XtManageChild(w->FD.printFrame[1]);
+
+  i=0 ;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->FD.printRowCol = XmCreateRowColumn(w->FD.printFrame[0], "FDprintRowCol", arg, i);
+  XtManageChild(w->FD.printRowCol);
+
+  /* print - type */ 
+  i=0;
+  w->FD.printPane[0] = XmCreatePulldownMenu(w->FD.printRowCol, "FDprintPane0", arg, i);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (fast)")); i++;
+  w->FD.printButt[0] = XmCreatePushButton(w->FD.printPane[0], "MprintButt0", arg, i);
+  XtManageChild(w->FD.printButt[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (accurate)")); i++;
+  w->FD.printButt[1] = XmCreatePushButton(w->FD.printPane[0], "MprintButt1", arg, i);
+  XtManageChild(w->FD.printButt[1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("XPM")); i++;
+  w->FD.printButt[2] = XmCreatePushButton(w->FD.printPane[0], "MprintButt2", arg, i);
+  XtManageChild(w->FD.printButt[2]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GIF")); i++;
+  w->FD.printButt[3] = XmCreatePushButton(w->FD.printPane[0], "MprintButt3", arg, i);
+  XtManageChild(w->FD.printButt[3]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (GLPr)")); i++;
+  w->FD.printButt[4] = XmCreatePushButton(w->FD.printPane[0], "MprintButt4", arg, i);
+  XtManageChild(w->FD.printButt[4]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS Bitmap (GLPr)")); i++;
+  w->FD.printButt[5] = XmCreatePushButton(w->FD.printPane[0], "MprintButt5", arg, i);
+  XtManageChild(w->FD.printButt[5]);
+  i=0;
+
+  XtSetArg(arg[i], XmNsubMenuId, w->FD.printPane[0]); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->FD.printMenu[0] = XmCreateOptionMenu(w->FD.printRowCol, "FDprintMenu0", arg, i);
+  XtManageChild(w->FD.printMenu[0]);
+
+  /* print - format options 
+  i=0;
+  w->FD.printPane[1] = XmCreatePulldownMenu(w->FD.printRowCol, "FDprintPane1", arg, i);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("xpm")); i++;
+  w->FD.printButt[6] = XmCreatePushButton(w->FD.printPane[1], "MprintButt6", arg, i);
+  XtManageChild(w->FD.printButt[6]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("ps")); i++;
+  w->FD.printButt[7] = XmCreatePushButton(w->FD.printPane[1], "MprintButt7", arg, i);
+  XtManageChild(w->FD.printButt[7]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("eps")); i++;
+  w->FD.printButt[8] = XmCreatePushButton(w->FD.printPane[1], "MprintButt8", arg, i);
+  XtManageChild(w->FD.printButt[8]);
+
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->FD.printPane[1]); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->FD.printMenu[1] = XmCreateOptionMenu(w->FD.printRowCol, "FDprintMenu1", arg, i);
+  XtManageChild(w->FD.printMenu[1]);
+  */
+
+#ifndef _GL_PRINT
+  XtSetSensitive(w->FD.printButt[4], 0);
+  XtSetSensitive(w->FD.printButt[5], 0);
+#endif
+
+  tmp = XmFileSelectionBoxGetChild(w->FD.openDialog, XmDIALOG_HELP_BUTTON); 
+  XtUnmanageChild(tmp);
+  tmp = XmFileSelectionBoxGetChild(w->FD.mergeDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+  tmp = XmFileSelectionBoxGetChild(w->FD.saveDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+  tmp = XmFileSelectionBoxGetChild(w->FD.saveAsDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+  tmp = XmFileSelectionBoxGetChild(w->FD.printDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    OPTIONS DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_OD(Widgets_T *w){
+  int   i, n;
+  Arg   arg[10];
+  char  label[32];
+
+  /* Geometry */
+  
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Geometry Options")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.geomDialog = XmCreateTemplateDialog(w->M.shell, "ODgeomDialog", arg, i);
+  XtUnmanageChild(w->OD.geomDialog);
+
+  i=0;
+  w->OD.geomRowCol = XmCreateRowColumn(w->OD.geomDialog, "ODgeomRowCol", arg, i);
+  XtManageChild(w->OD.geomRowCol);
+
+  /* Geometry - Visible */
+
+  i=0;
+  w->OD.geomVisibleFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomVisibleFrame0", arg, i);
+  XtManageChild(w->OD.geomVisibleFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.geomVisibleFrame[1] = XmCreateLabel(w->OD.geomVisibleFrame[0], "ODgeomVisibleFrame1", arg, i);
+  XtManageChild(w->OD.geomVisibleFrame[1]);
+  
+  i=0;
+  w->OD.geomVisibleRowCol = XmCreateRowColumn(w->OD.geomVisibleFrame[0], "ODgeomVisibleRowCol", arg, i);
+  XtManageChild(w->OD.geomVisibleRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 1); i++;
+  w->OD.geomVisibleTypeCheck = XmCreateRadioBox(w->OD.geomVisibleRowCol, "ODgeomVisibleTypeCheck", arg, i);
+  XtManageChild(w->OD.geomVisibleTypeCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Entity")); i++;
+  XtSetArg(arg[i], XmNset, True); i++;
+  w->OD.geomVisibleTypeButt[0] = XmCreateToggleButton(w->OD.geomVisibleTypeCheck, "ODgeomVisibleTypeButt0", arg, i);
+  XtManageChild(w->OD.geomVisibleTypeButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Label")); i++;
+  XtSetArg(arg[i], XmNset, False); i++;
+  w->OD.geomVisibleTypeButt[1] = XmCreateToggleButton(w->OD.geomVisibleTypeCheck, "ODgeomVisibleTypeButt1", arg, i);
+  XtManageChild(w->OD.geomVisibleTypeButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.geomVisibleCheck = XmCreateSimpleCheckBox(w->OD.geomVisibleRowCol, "ODgeomVisibleCheck", arg, i);
+  XtManageChild(w->OD.geomVisibleCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Points")); i++;
+  XtSetArg(arg[i], XmNset, CTX.geom.points?True:False); i++;
+  w->OD.geomVisibleButt[0] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt0", arg, i);
+  XtManageChild(w->OD.geomVisibleButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lines")); i++;
+  XtSetArg(arg[i], XmNset, CTX.geom.lines?True:False); i++;
+  w->OD.geomVisibleButt[1] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt1", arg, i);
+  XtManageChild(w->OD.geomVisibleButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Surfaces")); i++;
+  XtSetArg(arg[i], XmNset, CTX.geom.surfaces?True:False); i++;
+  w->OD.geomVisibleButt[2] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt2", arg, i);
+  XtManageChild(w->OD.geomVisibleButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Volumes")); i++;
+  XtSetArg(arg[i], XmNset, CTX.geom.volumes?True:False); i++;
+  w->OD.geomVisibleButt[3] = XmCreateToggleButton(w->OD.geomVisibleCheck, "ODgeomVisibleButt3", arg, i);
+  XtManageChild(w->OD.geomVisibleButt[3]);
+
+  /* Geometry - Visible by Number */
+
+  i=0;
+  w->OD.geomVisibleByNumFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomVisibleByNumFrame0", arg, i);
+  XtManageChild(w->OD.geomVisibleByNumFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility by Number")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.geomVisibleByNumFrame[1] = XmCreateLabel(w->OD.geomVisibleByNumFrame[0], "ODgeomVisibleByNumFrame1", arg, i);
+  XtManageChild(w->OD.geomVisibleByNumFrame[1]);
+  
+  i=0;
+  w->OD.geomVisibleByNumRowCol = XmCreateRowColumn(w->OD.geomVisibleByNumFrame[0], "ODgeomVisibleByNumRowCol", arg, i);
+  XtManageChild(w->OD.geomVisibleByNumRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, "*"); i++;
+  w->OD.geomVisibleByNumText = XmCreateTextField(w->OD.geomVisibleByNumRowCol, "ODgeomVisibleByNumText", arg, i);
+  XtManageChild(w->OD.geomVisibleByNumText);
+
+  /* Geometry - normals */
+   
+  i=0;
+  w->OD.geomNormalsFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomNormalsFrame0", arg, i);
+  XtManageChild(w->OD.geomNormalsFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Normals")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.geomNormalsFrame[1] = XmCreateLabel(w->OD.geomNormalsFrame[0], "ODgeomNormalsFrame1", arg, i);
+  XtManageChild(w->OD.geomNormalsFrame[1]);
+
+  i=0;
+  w->OD.geomNormalsRowCol = XmCreateRowColumn(w->OD.geomNormalsFrame[0], "ODgeomNormalsRowCol", arg, i);
+  XtManageChild(w->OD.geomNormalsRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.geom.normals); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.geomNormalsScale = XmCreateScale(w->OD.geomNormalsRowCol, "ODgeomNormalsScale", arg, i);
+  XtManageChild(w->OD.geomNormalsScale);
+  
+  i=0;
+  sprintf(label, "%g", CTX.geom.normals);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  w->OD.geomNormalsText = XmCreateTextField(w->OD.geomNormalsRowCol, "ODgeomNormalsText", arg, i);
+  XtManageChild(w->OD.geomNormalsText);
+
+  /* Geometry - tangents */
+   
+  i=0;
+  w->OD.geomTangentsFrame[0] = XmCreateFrame(w->OD.geomRowCol, "ODgeomTangentsFrame0", arg, i);
+  XtManageChild(w->OD.geomTangentsFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Tangents")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.geomTangentsFrame[1] = XmCreateLabel(w->OD.geomTangentsFrame[0], "ODgeomTangentsFrame1", arg, i);
+  XtManageChild(w->OD.geomTangentsFrame[1]);
+
+  i=0;
+  w->OD.geomTangentsRowCol = XmCreateRowColumn(w->OD.geomTangentsFrame[0], "ODgeomTangentsRowCol", arg, i);
+  XtManageChild(w->OD.geomTangentsRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.geom.tangents); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.geomTangentsScale = XmCreateScale(w->OD.geomTangentsRowCol, "ODgeomTangentsScale", arg, i);
+  XtManageChild(w->OD.geomTangentsScale);
+  
+  i=0;
+  sprintf(label, "%g", CTX.geom.tangents);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  w->OD.geomTangentsText = XmCreateTextField(w->OD.geomTangentsRowCol, "ODgeomTangentsText", arg, i);
+  XtManageChild(w->OD.geomTangentsText);
+
+  /* Mesh */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Mesh Options")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.meshDialog = XmCreateTemplateDialog(w->M.shell, "ODmeshDialog", arg, i);
+  XtUnmanageChild(w->OD.meshDialog);
+
+  i=0;
+  w->OD.meshRowCol = XmCreateRowColumn(w->OD.meshDialog, "ODmeshRowCol", arg, i);
+  XtManageChild(w->OD.meshRowCol);
+
+
+  /* Mesh - algo */
+  
+  i=0;
+  w->OD.meshAlgoFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshAlgoFrame0", arg, i);
+  XtManageChild(w->OD.meshAlgoFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Algorithm")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshAlgoFrame[1] = XmCreateLabel(w->OD.meshAlgoFrame[0], "ODmeshAlgoFrame1", arg, i);
+  XtManageChild(w->OD.meshAlgoFrame[1]);
+  
+  i=0;
+  w->OD.meshAlgoRowCol = XmCreateRowColumn(w->OD.meshAlgoFrame[0], "ODmeshAlgoRowCol", arg, i);
+  XtManageChild(w->OD.meshAlgoRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.meshAlgoCheck = XmCreateSimpleCheckBox(w->OD.meshAlgoRowCol, "ODmeshAlgoCheck", arg, i);
+  XtManageChild(w->OD.meshAlgoCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Degree 2")); i++;
+  XtSetArg(arg[i], XmNset, (CTX.mesh.degree==2)?True:False); i++;
+  w->OD.meshAlgoButt[0] = XmCreateToggleButton(w->OD.meshAlgoCheck, "ODmeshAlgoButt0", arg, i);
+  XtManageChild(w->OD.meshAlgoButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Anisotropic")); i++;
+  XtSetArg(arg[i], XmNset, (CTX.mesh.algo==DELAUNAY_NEWALGO)?True:False); i++;
+  w->OD.meshAlgoButt[1] = XmCreateToggleButton(w->OD.meshAlgoCheck, "ODmeshAlgoButt1", arg, i);
+  XtManageChild(w->OD.meshAlgoButt[1]);
+
+  /* Mesh - smoothing */
+
+  i=0;
+  w->OD.meshSmoothingFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshSmoothingFrame0", arg, i);
+  XtManageChild(w->OD.meshSmoothingFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Smoothing")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshSmoothingFrame[1] = XmCreateLabel(w->OD.meshSmoothingFrame[0], "ODmeshSmoothingFrame1", arg, i);
+  XtManageChild(w->OD.meshSmoothingFrame[1]);
+
+  i=0;
+  w->OD.meshSmoothingRowCol = XmCreateRowColumn(w->OD.meshSmoothingFrame[0], "ODmeshSmoothingRowCol", arg, i);
+  XtManageChild(w->OD.meshSmoothingRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 2); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.mesh.nb_smoothing); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.meshSmoothingScale = XmCreateScale(w->OD.meshSmoothingRowCol, "ODmeshSmoothingScale", arg, i);
+  XtManageChild(w->OD.meshSmoothingScale);
+  
+  i=0;
+  sprintf(label, "%d", CTX.mesh.nb_smoothing);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  w->OD.meshSmoothingText = XmCreateTextField(w->OD.meshSmoothingRowCol, "ODmeshSmoothingText", arg, i);
+  XtManageChild(w->OD.meshSmoothingText);
+
+  /* Mesh - Visible */
+
+  i=0;
+  w->OD.meshVisibleFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshVisibleFrame0", arg, i);
+  XtManageChild(w->OD.meshVisibleFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshVisibleFrame[1] = XmCreateLabel(w->OD.meshVisibleFrame[0], "ODmeshVisibleFrame1", arg, i);
+  XtManageChild(w->OD.meshVisibleFrame[1]);
+  
+  i=0;
+  w->OD.meshVisibleRowCol = XmCreateRowColumn(w->OD.meshVisibleFrame[0], "ODmeshVisibleRowCol", arg, i);
+  XtManageChild(w->OD.meshVisibleRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 1); i++;
+  w->OD.meshVisibleTypeCheck = XmCreateRadioBox(w->OD.meshVisibleRowCol, "ODmeshVisibleTypeCheck", arg, i);
+  XtManageChild(w->OD.meshVisibleTypeCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Entity")); i++;
+  XtSetArg(arg[i], XmNset, True); i++;
+  w->OD.meshVisibleTypeButt[0] = XmCreateToggleButton(w->OD.meshVisibleTypeCheck, "ODmeshVisibleTypeButt0", arg, i);
+  XtManageChild(w->OD.meshVisibleTypeButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Label")); i++;
+  XtSetArg(arg[i], XmNset, False); i++;
+  w->OD.meshVisibleTypeButt[1] = XmCreateToggleButton(w->OD.meshVisibleTypeCheck, "ODmeshVisibleTypeButt1", arg, i);
+  XtManageChild(w->OD.meshVisibleTypeButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.meshVisibleCheck = XmCreateSimpleCheckBox(w->OD.meshVisibleRowCol, "ODmeshVisibleCheck", arg, i);
+  XtManageChild(w->OD.meshVisibleCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Points")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.points?True:False); i++;
+  w->OD.meshVisibleButt[0] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt0", arg, i);
+  XtManageChild(w->OD.meshVisibleButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Lines")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.lines?True:False); i++;
+  w->OD.meshVisibleButt[1] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt1", arg, i);
+  XtManageChild(w->OD.meshVisibleButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Surfaces")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.surfaces?True:False); i++;
+  w->OD.meshVisibleButt[2] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt2", arg, i);
+  XtManageChild(w->OD.meshVisibleButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Volumes")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.volumes?True:False); i++;
+  w->OD.meshVisibleButt[3] = XmCreateToggleButton(w->OD.meshVisibleCheck, "ODmeshVisibleButt3", arg, i);
+  XtManageChild(w->OD.meshVisibleButt[3]);
+
+  /* Mesh - Visible by Number */
+
+  i=0;
+  w->OD.meshVisibleByNumFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshVisibleByNumFrame0", arg, i);
+  XtManageChild(w->OD.meshVisibleByNumFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility by Number")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshVisibleByNumFrame[1] = XmCreateLabel(w->OD.meshVisibleByNumFrame[0], "ODmeshVisibleByNumFrame1", arg, i);
+  XtManageChild(w->OD.meshVisibleByNumFrame[1]);
+  
+  i=0;
+  w->OD.meshVisibleByNumRowCol = XmCreateRowColumn(w->OD.meshVisibleByNumFrame[0], "ODmeshVisibleByNumRowCol", arg, i);
+  XtManageChild(w->OD.meshVisibleByNumRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, "*"); i++;
+  w->OD.meshVisibleByNumText = XmCreateTextField(w->OD.meshVisibleByNumRowCol, "ODmeshVisibleByNumText", arg, i);
+  XtManageChild(w->OD.meshVisibleByNumText);
+
+  /* Mesh - aspect */
+
+  i=0;
+  w->OD.meshAspectFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshAspectFrame0", arg, i);
+  XtManageChild(w->OD.meshAspectFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Aspect")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshAspectFrame[1] = XmCreateLabel(w->OD.meshAspectFrame[0], "ODmeshAspectFrame1", arg, i);
+  XtManageChild(w->OD.meshAspectFrame[1]);
+  
+  i=0;
+  w->OD.meshAspectCheck = XmCreateRadioBox(w->OD.meshAspectFrame[0], "ODmeshAspectCheck", arg, i);
+  XtManageChild(w->OD.meshAspectCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Wireframe")); i++;
+  XtSetArg(arg[i], XmNset, (!CTX.mesh.hidden)?True:False); i++;
+  w->OD.meshAspectButt[0] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt0", arg, i);
+  XtManageChild(w->OD.meshAspectButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Hidden Lines")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.hidden?True:False); i++;
+  w->OD.meshAspectButt[1] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt1", arg, i);
+  XtManageChild(w->OD.meshAspectButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Solid")); i++;
+  XtSetArg(arg[i], XmNset, CTX.mesh.shade?True:False); i++;
+  w->OD.meshAspectButt[2] = XmCreateToggleButton(w->OD.meshAspectCheck, "ODmeshAspectButt2", arg, i);
+  XtManageChild(w->OD.meshAspectButt[2]);
+  
+  /* Mesh - explode */
+
+  i=0;
+  w->OD.meshExplodeFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshExplodeFrame0", arg, i);
+  XtManageChild(w->OD.meshExplodeFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Explode")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshExplodeFrame[1] = XmCreateLabel(w->OD.meshExplodeFrame[0], "ODmeshExplodeFrame1", arg, i);
+  XtManageChild(w->OD.meshExplodeFrame[1]);
+
+  i=0;
+  w->OD.meshExplodeRowCol = XmCreateRowColumn(w->OD.meshExplodeFrame[0], "ODmeshExplodeRowCol", arg, i);
+  XtManageChild(w->OD.meshExplodeRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 2); i++;
+  XtSetArg(arg[i], XmNvalue, (int)100*CTX.mesh.explode); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.meshExplodeScale = XmCreateScale(w->OD.meshExplodeRowCol, "ODmeshExplodeScale", arg, i);
+  XtManageChild(w->OD.meshExplodeScale);
+  
+  i=0;
+  sprintf(label, "%g", CTX.mesh.explode);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  w->OD.meshExplodeText = XmCreateTextField(w->OD.meshExplodeRowCol, "ODmeshExplodeText", arg, i);
+  XtManageChild(w->OD.meshExplodeText);
+
+  /* Mesh - normals */
+   
+  i=0;
+  w->OD.meshNormalsFrame[0] = XmCreateFrame(w->OD.meshRowCol, "ODmeshNormalsFrame0", arg, i);
+  XtManageChild(w->OD.meshNormalsFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Normals")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.meshNormalsFrame[1] = XmCreateLabel(w->OD.meshNormalsFrame[0], "ODmeshNormalsFrame1", arg, i);
+  XtManageChild(w->OD.meshNormalsFrame[1]);
+
+  i=0;
+  w->OD.meshNormalsRowCol = XmCreateRowColumn(w->OD.meshNormalsFrame[0], "ODmeshNormalsRowCol", arg, i);
+  XtManageChild(w->OD.meshNormalsRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.mesh.normals); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.meshNormalsScale = XmCreateScale(w->OD.meshNormalsRowCol, "ODmeshNormalsScale", arg, i);
+  XtManageChild(w->OD.meshNormalsScale);
+  
+  i=0;
+  sprintf(label, "%g", CTX.mesh.normals);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  w->OD.meshNormalsText = XmCreateTextField(w->OD.meshNormalsRowCol, "ODmeshNormalsText", arg, i);
+  XtManageChild(w->OD.meshNormalsText);
+
+
+  /* Post */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Post Options")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.postDialog = XmCreateTemplateDialog(w->M.shell, "ODpostDialog", arg, i);
+  XtUnmanageChild(w->OD.postDialog);
+
+  i=0;
+  w->OD.postRowCol = XmCreateRowColumn(w->OD.postDialog, "ODpostRowCol", arg, i);
+  XtManageChild(w->OD.postRowCol);
+
+  /* Post - link */
+
+  i=0;
+  w->OD.postLinkFrame[0] = XmCreateFrame(w->OD.postRowCol, "ODpostLinkFrame0", arg, i);
+  XtManageChild(w->OD.postLinkFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Links")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.postLinkFrame[1] = XmCreateLabel(w->OD.postLinkFrame[0], "ODpostLinkFrame1", arg, i);
+  XtManageChild(w->OD.postLinkFrame[1]);
+  
+  i=0;
+  w->OD.postLinkRowCol = XmCreateRowColumn(w->OD.postLinkFrame[0], "ODpostLinkRowCol", arg, i);
+  XtManageChild(w->OD.postLinkRowCol);
+
+  i=0;
+  w->OD.postLinkCheck = XmCreateRadioBox(w->OD.postLinkRowCol, "ODpostLinkCheck", arg, i);
+  XtManageChild(w->OD.postLinkCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("No Links")); i++;
+  XtSetArg(arg[i], XmNset, CTX.post.link?False:True); i++;
+  w->OD.postLinkButt[0] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt0", arg, i);
+  XtManageChild(w->OD.postLinkButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Link Visible Views")); i++;
+  XtSetArg(arg[i], XmNset, (CTX.post.link==1)?True:False); i++;
+  w->OD.postLinkButt[1] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt1", arg, i);
+  XtManageChild(w->OD.postLinkButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Link All Views")); i++;
+  XtSetArg(arg[i], XmNset, (CTX.post.link==2)?True:False); i++;
+  w->OD.postLinkButt[2] = XmCreateToggleButton(w->OD.postLinkCheck, "ODpostLinkButt2", arg, i);
+  XtManageChild(w->OD.postLinkButt[2]);
+
+  /* post - anim */
+  i=0;
+  w->OD.postAnimFrame[0] = XmCreateFrame(w->OD.postRowCol, "ODpostAnimFrame0", arg, i);
+  XtManageChild(w->OD.postAnimFrame[0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Animation Delay")); i++;
+  w->OD.postAnimFrame[1] = XmCreateLabel(w->OD.postAnimFrame[0], "ODpostAnimFrame1", arg, i);
+  XtManageChild(w->OD.postAnimFrame[1]);
+  
+  i=0;
+  w->OD.postAnimFrameRowCol = XmCreateRowColumn(w->OD.postAnimFrame[0], "ODpostAnimFrameRowCol", arg, i);
+  XtManageChild(w->OD.postAnimFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 1); i++;
+  XtSetArg(arg[i], XmNshowValue, true); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.post.anim_delay/1.e5); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.postAnimScale = XmCreateScale(w->OD.postAnimFrameRowCol, "ODpostAnimScale", arg, i);
+  XtManageChild(w->OD.postAnimScale);
+
+
+  /* Miscellaneous */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("General Options")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.miscDialog = XmCreateTemplateDialog(w->M.shell, "ODmiscDialog", arg, i);
+  XtUnmanageChild(w->OD.miscDialog);
+
+  i=0;
+  w->OD.miscRowCol = XmCreateRowColumn(w->OD.miscDialog, "ODmiscRowCol", arg, i);
+  XtManageChild(w->OD.miscRowCol);
+
+  /* misc - Misc */
+  
+  i=0;
+  w->OD.miscMiscFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscMiscFrame0", arg, i);
+  XtManageChild(w->OD.miscMiscFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Miscellaneous")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.miscMiscFrame[1] = XmCreateLabel(w->OD.miscMiscFrame[0], "ODmiscMiscFrame1", arg, i);
+  XtManageChild(w->OD.miscMiscFrame[1]);
+  
+  i=0;
+  w->OD.miscMiscCheck = XmCreateSimpleCheckBox(w->OD.miscMiscFrame[0], "ODmiscMiscCheck", arg, i);
+  XtManageChild(w->OD.miscMiscCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Moving Axes")); i++;
+  XtSetArg(arg[i], XmNset, CTX.axes?True:False); i++;
+  w->OD.miscMiscButt[0] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt0", arg, i);
+  XtManageChild(w->OD.miscMiscButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Show Small Axes")); i++;
+  XtSetArg(arg[i], XmNset, CTX.little_axes?True:False); i++;
+  w->OD.miscMiscButt[1] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt1", arg, i);
+  XtManageChild(w->OD.miscMiscButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Enable Fast Redraw")); i++;
+  XtSetArg(arg[i], XmNset, CTX.fast?True:False); i++;
+  w->OD.miscMiscButt[2] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt3", arg, i);
+  XtManageChild(w->OD.miscMiscButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Use Display Lists")); i++;
+  XtSetArg(arg[i], XmNset, CTX.display_lists?True:False); i++;
+  w->OD.miscMiscButt[3] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt4", arg, i);
+  XtManageChild(w->OD.miscMiscButt[3]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Enable Alpha Blending")); i++;
+  XtSetArg(arg[i], XmNset, CTX.alpha?True:False); i++;
+  w->OD.miscMiscButt[4] = XmCreateToggleButton(w->OD.miscMiscCheck, "ODmiscMiscButt2", arg, i);
+  XtManageChild(w->OD.miscMiscButt[4]);
+
+
+  /* misc - colorscheme */
+
+  i=0;
+  w->OD.miscColorSchemeFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscColorSchemeFrame0", arg, i);
+  XtManageChild(w->OD.miscColorSchemeFrame[0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Predefined Color Schemes")); i++;
+  w->OD.miscColorSchemeFrame[1] = XmCreateLabel(w->OD.miscColorSchemeFrame[0], "ODmiscColorSchemeFrame1", arg, i);
+  XtManageChild(w->OD.miscColorSchemeFrame[1]);
+  
+  i=0;
+  w->OD.miscColorSchemeFrameRowCol = XmCreateRowColumn(w->OD.miscColorSchemeFrame[0], "ODmiscColorSchemeFrameRowCol", arg, i);
+  XtManageChild(w->OD.miscColorSchemeFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 2); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+  XtSetArg(arg[i], XmNshowValue, true); i++;
+  XtSetArg(arg[i], XmNvalue, CTX.color.id); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.miscColorSchemeScale = XmCreateScale(w->OD.miscColorSchemeFrameRowCol, "ODmiscColorSchemeScale", arg, i);
+  XtManageChild(w->OD.miscColorSchemeScale);
+
+  /* misc - projection */
+  
+  i=0;
+  w->OD.miscProjFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscProjFrame0", arg, i);
+  XtManageChild(w->OD.miscProjFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Projection")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.miscProjFrame[1] = XmCreateLabel(w->OD.miscProjFrame[0], "ODmiscProjFrame1", arg, i);
+  XtManageChild(w->OD.miscProjFrame[1]);
+  
+  i=0;
+  w->OD.miscProjCheck = XmCreateRadioBox(w->OD.miscProjFrame[0], "ODmiscProjCheck", arg, i);
+  XtManageChild(w->OD.miscProjCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Orthographic")); i++;
+  XtSetArg(arg[i], XmNset, CTX.ortho?True:False); i++;
+  w->OD.miscProjButt[0] = XmCreateToggleButton(w->OD.miscProjCheck, "ODmiscProjButt0", arg, i);
+  XtManageChild(w->OD.miscProjButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Perspective")); i++;
+  XtSetArg(arg[i], XmNset, CTX.ortho?False:True); i++;
+  w->OD.miscProjButt[1] = XmCreateToggleButton(w->OD.miscProjCheck, "ODmiscProjButt1", arg, i);
+  XtManageChild(w->OD.miscProjButt[1]);
+
+
+  /* misc - light position */
+  i=0;
+  w->OD.miscLightFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscLightFrame0", arg, i);
+  XtManageChild(w->OD.miscLightFrame[0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Light Position")); i++;
+  w->OD.miscLightFrame[1] = XmCreateLabel(w->OD.miscLightFrame[0], "ODmiscLightFrame1", arg, i);
+  XtManageChild(w->OD.miscLightFrame[1]);
+  
+  i=0;
+  w->OD.miscLightFrameRowCol = XmCreateRowColumn(w->OD.miscLightFrame[0], "ODmiscLightFrameRowCol", arg, i);
+  XtManageChild(w->OD.miscLightFrameRowCol);
+
+  for(n=0 ; n<3 ; n++){
+    i=0;
+    XtSetArg(arg[i], XmNminimum, -25); i++;
+    XtSetArg(arg[i], XmNmaximum, 25); i++;
+    XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+    XtSetArg(arg[i], XmNshowValue, False); i++;
+    XtSetArg(arg[i], XmNvalue, (int)25*CTX.light0[n]); i++;
+    XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+    w->OD.miscLightScale[n] = XmCreateScale(w->OD.miscLightFrameRowCol, "ODmiscLightScalen", arg, i);
+    XtManageChild(w->OD.miscLightScale[n]);
+  }
+
+  /* misc - shininess */
+  i=0;
+  w->OD.miscShineFrame[0] = XmCreateFrame(w->OD.miscRowCol, "ODmiscShineFrame0", arg, i);
+  XtManageChild(w->OD.miscShineFrame[0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Shininess")); i++;
+  w->OD.miscShineFrame[1] = XmCreateLabel(w->OD.miscShineFrame[0], "ODmiscShineFrame1", arg, i);
+  XtManageChild(w->OD.miscShineFrame[1]);
+  
+  i=0;
+  w->OD.miscShineFrameRowCol = XmCreateRowColumn(w->OD.miscShineFrame[0], "ODmiscShineFrameRowCol", arg, i);
+  XtManageChild(w->OD.miscShineFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 25); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 0); i++;
+  XtSetArg(arg[i], XmNshowValue, false); i++;
+  XtSetArg(arg[i], XmNvalue, (int)25*CTX.shine); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->OD.miscShineScale = XmCreateScale(w->OD.miscShineFrameRowCol, "ODmiscShineScale", arg, i);
+  XtManageChild(w->OD.miscShineScale);
+
+  /* Viewport */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Viewport")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.viewportDialog = XmCreateTemplateDialog(w->M.shell, "ODviewportDialog", arg, i);
+  XtUnmanageChild(w->OD.viewportDialog);
+
+  i=0;
+  w->OD.viewportRowCol = XmCreateRowColumn(w->OD.viewportDialog, "ODviewportRowCol", arg, i);
+  XtManageChild(w->OD.viewportRowCol);
+
+  /* viewport - rotate */
+  
+  i=0;
+  w->OD.viewportFrame[0][0] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame00", arg, i);
+  XtManageChild(w->OD.viewportFrame[0][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Rotation")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.viewportFrame[1][0] = XmCreateLabel(w->OD.viewportFrame[0][0], "ODviewportFrame10", arg, i);
+  XtManageChild(w->OD.viewportFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 3); i++;
+  w->OD.viewportFrameRowCol[0] = XmCreateRowColumn(w->OD.viewportFrame[0][0], "ODviewportFrameRowCol0", arg, i);
+  XtManageChild(w->OD.viewportFrameRowCol[0]);
+
+  i=0;
+  sprintf(label, "%g", CTX.r[0]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[0][0] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText00", arg, i);
+  XtManageChild(w->OD.viewportText[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.rlock[0]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++;
+  w->OD.viewportLockButt[0][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt00", arg, i);
+  XtManageChild(w->OD.viewportLockButt[0][0]);
+
+  i=0;
+  sprintf(label, "%g", CTX.r[1]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[0][1] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText01", arg, i);
+  XtManageChild(w->OD.viewportText[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.rlock[1]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++;
+  w->OD.viewportLockButt[0][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt00", arg, i);
+  XtManageChild(w->OD.viewportLockButt[0][1]);
+
+  i=0;
+  sprintf(label, "%g", CTX.r[2]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[0][2] = XmCreateTextField(w->OD.viewportFrameRowCol[0], "ODviewportText02", arg, i);
+  XtManageChild(w->OD.viewportText[0][2]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.rlock[2]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++;
+  w->OD.viewportLockButt[0][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[0], "ODviewportLockButt02", arg, i);
+  XtManageChild(w->OD.viewportLockButt[0][2]);
+
+
+  /* viewport - translate */
+  
+  i=0;
+  w->OD.viewportFrame[0][1] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame01", arg, i);
+  XtManageChild(w->OD.viewportFrame[0][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Translation")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.viewportFrame[1][1] = XmCreateLabel(w->OD.viewportFrame[0][1], "ODviewportFrame11", arg, i);
+  XtManageChild(w->OD.viewportFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 3); i++;
+  w->OD.viewportFrameRowCol[1] = XmCreateRowColumn(w->OD.viewportFrame[0][1], "ODviewportFrameRowCol1", arg, i);
+  XtManageChild(w->OD.viewportFrameRowCol[1]);
+
+  i=0;
+  sprintf(label, "%g", CTX.t[0]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[1][0] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText10", arg, i);
+  XtManageChild(w->OD.viewportText[1][0]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.tlock[0]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++;
+  w->OD.viewportLockButt[1][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt10", arg, i);
+  XtManageChild(w->OD.viewportLockButt[1][0]);
+
+  i=0;
+  sprintf(label, "%g", CTX.t[1]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[1][1] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText11", arg, i);
+  XtManageChild(w->OD.viewportText[1][1]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.tlock[1]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++;
+  w->OD.viewportLockButt[1][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt00", arg, i);
+  XtManageChild(w->OD.viewportLockButt[1][1]);
+
+  i=0;
+  sprintf(label, "%g", CTX.t[2]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[1][2] = XmCreateTextField(w->OD.viewportFrameRowCol[1], "ODviewportText12", arg, i);
+  XtManageChild(w->OD.viewportText[1][2]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.tlock[2]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++;
+  w->OD.viewportLockButt[1][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[1], "ODviewportLockButt12", arg, i);
+  XtManageChild(w->OD.viewportLockButt[1][2]);
+
+
+  /* viewport - scale */
+  
+  i=0;
+  w->OD.viewportFrame[0][2] = XmCreateFrame(w->OD.viewportRowCol, "ODviewportFrame02", arg, i);
+  XtManageChild(w->OD.viewportFrame[0][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.viewportFrame[1][2] = XmCreateLabel(w->OD.viewportFrame[0][2], "ODviewportFrame12", arg, i);
+  XtManageChild(w->OD.viewportFrame[1][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 3); i++;
+  w->OD.viewportFrameRowCol[2] = XmCreateRowColumn(w->OD.viewportFrame[0][2], "ODviewportFrameRowCol2", arg, i);
+  XtManageChild(w->OD.viewportFrameRowCol[2]);
+
+  i=0;
+  sprintf(label, "%g", CTX.s[0]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[2][0] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText20", arg, i);
+  XtManageChild(w->OD.viewportText[2][0]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.slock[0]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("x-lock")); i++;
+  w->OD.viewportLockButt[2][0] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt20", arg, i);
+  XtManageChild(w->OD.viewportLockButt[2][0]);
+
+  i=0;
+  sprintf(label, "%g", CTX.s[1]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[2][1] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText21", arg, i);
+  XtManageChild(w->OD.viewportText[2][1]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.slock[1]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("y-lock")); i++;
+  w->OD.viewportLockButt[2][1] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt20", arg, i);
+  XtManageChild(w->OD.viewportLockButt[2][1]);
+
+  i=0;
+  sprintf(label, "%g", CTX.s[2]);
+  XtSetArg(arg[i], XmNvalue, label); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->OD.viewportText[2][2] = XmCreateTextField(w->OD.viewportFrameRowCol[2], "ODviewportText22", arg, i);
+  XtManageChild(w->OD.viewportText[2][2]);
+  i=0;
+  XtSetArg(arg[i], XmNset, CTX.slock[2]); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("z-lock")); i++;
+  w->OD.viewportLockButt[2][2] = XmCreateToggleButton(w->OD.viewportFrameRowCol[2], "ODviewportLockButt22", arg, i);
+  XtManageChild(w->OD.viewportLockButt[2][2]);
+
+  /* Info */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Info")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Update")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->OD.infoDialog = XmCreateTemplateDialog(w->M.shell, "ODinfoDialog", arg, i);
+  XtUnmanageChild(w->OD.infoDialog);
+
+  i=0;
+  w->OD.infoRowCol = XmCreateRowColumn(w->OD.infoDialog, "ODinfoRowCol", arg, i);
+  XtManageChild(w->OD.infoRowCol);
+
+  /* info - geom */
+
+  i=0;
+  w->OD.infoFrame[0][0] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame00", arg, i);
+  XtManageChild(w->OD.infoFrame[0][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Geometry")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.infoFrame[1][0] = XmCreateLabel(w->OD.infoFrame[0][0], "ODinfoFrame10", arg, i);
+  XtManageChild(w->OD.infoFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.infoFrameRowCol[0] = XmCreateRowColumn(w->OD.infoFrame[0][0], "ODinfoFrameRowCol0", arg, i);
+  XtManageChild(w->OD.infoFrameRowCol[0]);
+  
+  for(n=0 ; n<NB_INFO_GEOM ; n++){    
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++;
+    w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[0], "ODinfoKeyLabel", arg, i);
+    XtManageChild(w->OD.infoKeyLabel[n]);
+  }
+  for(n=0 ; n<NB_INFO_GEOM ; n++){
+    i=0;
+    w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[0], "ODinfoValueLabel", arg, i);
+    XtManageChild(w->OD.infoValueLabel[n]);
+  }
+
+  /* info - mesh */
+
+  i=0;
+  w->OD.infoFrame[0][1] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame01", arg, i);
+  XtManageChild(w->OD.infoFrame[0][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Mesh")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.infoFrame[1][1] = XmCreateLabel(w->OD.infoFrame[0][1], "ODinfoFrame11", arg, i);
+  XtManageChild(w->OD.infoFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.infoFrameRowCol[1] = XmCreateRowColumn(w->OD.infoFrame[0][1], "ODinfoFrameRowCol1", arg, i);
+  XtManageChild(w->OD.infoFrameRowCol[1]);
+  
+  for(n=NB_INFO_GEOM ; n<NB_INFO_GEOM+NB_INFO_MESH ; n++){    
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++;
+    w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[1], "ODinfoKeyLabel", arg, i);
+    XtManageChild(w->OD.infoKeyLabel[n]);
+  }
+  for(n=NB_INFO_GEOM ; n<NB_INFO_GEOM+NB_INFO_MESH ; n++){
+    i=0;
+    w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[1], "ODinfoValueLabel", arg, i);
+    XtManageChild(w->OD.infoValueLabel[n]);
+  }
+
+  /* info - post */
+
+  i=0;
+  w->OD.infoFrame[0][2] = XmCreateFrame(w->OD.infoRowCol, "ODinfoFrame02", arg, i);
+  XtManageChild(w->OD.infoFrame[0][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Post Processing")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->OD.infoFrame[1][2] = XmCreateLabel(w->OD.infoFrame[0][2], "ODinfoFrame12", arg, i);
+  XtManageChild(w->OD.infoFrame[1][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNpacking, XmPACK_COLUMN); i++;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->OD.infoFrameRowCol[2] = XmCreateRowColumn(w->OD.infoFrame[0][2], "ODinfoFrameRowCol2", arg, i);
+  XtManageChild(w->OD.infoFrameRowCol[2]);
+  
+  for(n=NB_INFO_GEOM+NB_INFO_MESH ; n<NB_INFO_MAX ; n++){    
+    i=0;
+    XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple(txt_info[n])); i++;
+    w->OD.infoKeyLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[2], "ODinfoKeyLabel", arg, i);
+    XtManageChild(w->OD.infoKeyLabel[n]);
+  }
+  for(n=NB_INFO_GEOM+NB_INFO_MESH ; n<NB_INFO_MAX ; n++){    
+    i=0;
+    w->OD.infoValueLabel[n] = XmCreateLabel(w->OD.infoFrameRowCol[2], "ODinfoValueLabel", arg, i);
+    XtManageChild(w->OD.infoValueLabel[n]);
+  }
+
+}
+
+
+/* ------------------------------------------------------------------------ 
+    HELP DIALOGS
+   ------------------------------------------------------------------------ */
+
+extern char TextAbout[1024];
+
+void CreateWidgets_HD(Widgets_T *w){
+  int     i;
+  Arg     arg[10];
+  Widget  tmp ;
+
+  /* keys */
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Short Help")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->HD.keysDialog = XmCreateTemplateDialog(w->M.shell, "HDkeysDialog", arg, i);
+  XtUnmanageChild(w->HD.keysDialog);
+
+  i=0;
+  XtSetArg(arg[i], XmNeditable, False); i++;
+  XtSetArg(arg[i], XmNeditMode, XmMULTI_LINE_EDIT); i++;
+  XtSetArg(arg[i], XmNcolumns, 66); i++;
+  XtSetArg(arg[i], XmNrows, 25); i++;
+  XtSetArg(arg[i], XmNvalue, txt_help); i++;
+  w->HD.keysText = XmCreateScrolledText(w->HD.keysDialog, "HDkeysText", arg, i);
+  XtManageChild(w->HD.keysText);
+  
+
+  /* about */
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("About Gmsh...")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  XtSetArg(arg[i], XmNmessageString, XmStringCreateLtoR(TextAbout,XmFONTLIST_DEFAULT_TAG)); i++;
+  w->HD.aboutDialog = XmCreateInformationDialog(w->M.shell, "HDaboutDialog", arg, i);
+  XtUnmanageChild(w->HD.aboutDialog);
+
+  tmp = XmMessageBoxGetChild(w->HD.aboutDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+  tmp = XmMessageBoxGetChild(w->HD.aboutDialog, XmDIALOG_CANCEL_BUTTON);
+  XtUnmanageChild(tmp);
+
+}
+
+/* ------------------------------------------------------------------------ 
+    GEOMETRY DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_GD(Widgets_T *w){
+  int   i;
+  Arg   arg[10];
+  
+  /* Parameter */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Add Parameter")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Add")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->GD.paramDialog = XmCreateTemplateDialog(w->M.shell, "GDparamDialog", arg, i);
+  XtUnmanageChild(w->GD.paramDialog);
+
+  i=0;
+  w->GD.paramRowCol = XmCreateRowColumn(w->GD.paramDialog, "ODparamRowCol", arg, i);
+  XtManageChild(w->GD.paramRowCol);
+
+  /* param - name */
+  
+  i=0;
+  w->GD.paramFrame[0][0] = XmCreateFrame(w->GD.paramRowCol, "GDparamFrame00", arg, i);
+  XtManageChild(w->GD.paramFrame[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Name")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.paramFrame[1][0] = XmCreateLabel(w->GD.paramFrame[0][0], "GDparamFrame10", arg, i);
+  XtManageChild(w->GD.paramFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.paramFrameRowCol[0] = XmCreateRowColumn(w->GD.paramFrame[0][0], "ODparamFrameRowCol0", arg, i);
+  XtManageChild(w->GD.paramFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  w->GD.paramText[0] = XmCreateTextField(w->GD.paramFrameRowCol[0], "GDparamText0", arg, i);
+  XtManageChild(w->GD.paramText[0]);
+
+  /* param - value */
+  
+  i=0;
+  w->GD.paramFrame[0][1] = XmCreateFrame(w->GD.paramRowCol, "GDparamFrame01", arg, i);
+  XtManageChild(w->GD.paramFrame[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.paramFrame[1][1] = XmCreateLabel(w->GD.paramFrame[0][1], "GDparamFrame11", arg, i);
+  XtManageChild(w->GD.paramFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.paramFrameRowCol[1] = XmCreateRowColumn(w->GD.paramFrame[0][1], "ODparamFrameRowCol1", arg, i);
+  XtManageChild(w->GD.paramFrameRowCol[1]); 
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  w->GD.paramText[1] = XmCreateTextField(w->GD.paramFrameRowCol[1], "GDparamText1", arg, i);
+  XtManageChild(w->GD.paramText[1]);
+  
+
+  /* Point */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Add Point")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Add")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->GD.pointDialog = XmCreateTemplateDialog(w->M.shell, "GDpointDialog", arg, i);
+  XtUnmanageChild(w->GD.pointDialog);
+
+  i=0;
+  w->GD.pointRowCol = XmCreateRowColumn(w->GD.pointDialog, "ODpointRowCol", arg, i);
+  XtManageChild(w->GD.pointRowCol);
+
+  /* point - coords */
+  
+  i=0;
+  w->GD.pointFrame[0][0] = XmCreateFrame(w->GD.pointRowCol, "GDpointFrame00", arg, i);
+  XtManageChild(w->GD.pointFrame[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Coordinates")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.pointFrame[1][0] = XmCreateLabel(w->GD.pointFrame[0][0], "GDpointFrame10", arg, i);
+  XtManageChild(w->GD.pointFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.pointFrameRowCol[0] = XmCreateRowColumn(w->GD.pointFrame[0][0], "ODpointFrameRowCol0", arg, i);
+  XtManageChild(w->GD.pointFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.pointText[0] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText0", arg, i);
+  XtManageChild(w->GD.pointText[0]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.pointText[1] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText1", arg, i);
+  XtManageChild(w->GD.pointText[1]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.pointText[2] = XmCreateTextField(w->GD.pointFrameRowCol[0], "GDpointText2", arg, i);
+  XtManageChild(w->GD.pointText[2]);
+
+  /* point - char length */
+  
+  i=0;
+  w->GD.pointFrame[0][1] = XmCreateFrame(w->GD.pointRowCol, "GDpointFrame01", arg, i);
+  XtManageChild(w->GD.pointFrame[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Characteristc Length")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.pointFrame[1][1] = XmCreateLabel(w->GD.pointFrame[0][1], "GDpointFrame11", arg, i);
+  XtManageChild(w->GD.pointFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.pointFrameRowCol[1] = XmCreateRowColumn(w->GD.pointFrame[0][1], "ODpointFrameRowCol1", arg, i);
+  XtManageChild(w->GD.pointFrameRowCol[1]); 
+  
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.pointText[3] = XmCreateTextField(w->GD.pointFrameRowCol[1], "GDpointText3", arg, i);
+  XtManageChild(w->GD.pointText[3]);
+
+
+  /* Rotation */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Current Rotation")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->GD.rotDialog = XmCreateTemplateDialog(w->M.shell, "GDrotDialog", arg, i);
+  XtUnmanageChild(w->GD.rotDialog);
+
+  i=0;
+  w->GD.rotRowCol = XmCreateRowColumn(w->GD.rotDialog, "ODrotRowCol", arg, i);
+  XtManageChild(w->GD.rotRowCol);
+
+  /* rot - axis point */
+  
+  i=0;
+  w->GD.rotFrame[0][0] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame00", arg, i);
+  XtManageChild(w->GD.rotFrame[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Axis Point")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.rotFrame[1][0] = XmCreateLabel(w->GD.rotFrame[0][0], "GDrotFrame10", arg, i);
+  XtManageChild(w->GD.rotFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.rotFrameRowCol[0] = XmCreateRowColumn(w->GD.rotFrame[0][0], "ODrotFrameRowCol0", arg, i);
+  XtManageChild(w->GD.rotFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[0] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText0", arg, i);
+  XtManageChild(w->GD.rotText[0]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[1] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText1", arg, i);
+  XtManageChild(w->GD.rotText[1]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[2] = XmCreateTextField(w->GD.rotFrameRowCol[0], "GDrotText2", arg, i);
+  XtManageChild(w->GD.rotText[2]);
+
+  /* rot - direction */
+  
+  i=0;
+  w->GD.rotFrame[0][1] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame01", arg, i);
+  XtManageChild(w->GD.rotFrame[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Direction")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.rotFrame[1][1] = XmCreateLabel(w->GD.rotFrame[0][1], "GDrotFrame11", arg, i);
+  XtManageChild(w->GD.rotFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.rotFrameRowCol[1] = XmCreateRowColumn(w->GD.rotFrame[0][1], "ODrotFrameRowCol1", arg, i);
+  XtManageChild(w->GD.rotFrameRowCol[1]); 
+  
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[3] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText3", arg, i);
+  XtManageChild(w->GD.rotText[3]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[4] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText4", arg, i);
+  XtManageChild(w->GD.rotText[4]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[5] = XmCreateTextField(w->GD.rotFrameRowCol[1], "GDrotText5", arg, i);
+  XtManageChild(w->GD.rotText[5]);
+
+  /* rot - angle */
+  
+  i=0;
+  w->GD.rotFrame[0][2] = XmCreateFrame(w->GD.rotRowCol, "GDrotFrame02", arg, i);
+  XtManageChild(w->GD.rotFrame[0][2]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Angle")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.rotFrame[1][2] = XmCreateLabel(w->GD.rotFrame[0][2], "GDrotFrame12", arg, i);
+  XtManageChild(w->GD.rotFrame[1][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.rotFrameRowCol[2] = XmCreateRowColumn(w->GD.rotFrame[0][2], "ODrotFrameRowCol2", arg, i);
+  XtManageChild(w->GD.rotFrameRowCol[2]); 
+  
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.rotText[6] = XmCreateTextField(w->GD.rotFrameRowCol[2], "GDrotText6", arg, i);
+  XtManageChild(w->GD.rotText[6]);
+
+
+  /* Translation */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("CurrentTranslation")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->GD.tranDialog = XmCreateTemplateDialog(w->M.shell, "GDtranDialog", arg, i);
+  XtUnmanageChild(w->GD.tranDialog);
+
+  i=0;
+  w->GD.tranFrame[0] = XmCreateFrame(w->GD.tranDialog, "GDtranFrame0", arg, i);
+  XtManageChild(w->GD.tranFrame[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.tranFrame[1] = XmCreateLabel(w->GD.tranFrame[0], "GDtranFrame1", arg, i);
+  XtManageChild(w->GD.tranFrame[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.tranFrameRowCol = XmCreateRowColumn(w->GD.tranFrame[0], "ODtranFrameRowCol", arg, i);
+  XtManageChild(w->GD.tranFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.tranText[0] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText0", arg, i);
+  XtManageChild(w->GD.tranText[0]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.tranText[1] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText1", arg, i);
+  XtManageChild(w->GD.tranText[1]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.tranText[2] = XmCreateTextField(w->GD.tranFrameRowCol, "GDtranText2", arg, i);
+  XtManageChild(w->GD.tranText[2]);
+
+
+  /* Dilatation */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Current Dilatation")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->GD.dilatDialog = XmCreateTemplateDialog(w->M.shell, "GDdilatDialog", arg, i);
+  XtUnmanageChild(w->GD.dilatDialog);
+
+  i=0;
+  w->GD.dilatRowCol = XmCreateRowColumn(w->GD.dilatDialog, "ODdilatRowCol", arg, i);
+  XtManageChild(w->GD.dilatRowCol);
+
+  /* dilat - coords */
+  
+  i=0;
+  w->GD.dilatFrame[0][0] = XmCreateFrame(w->GD.dilatRowCol, "GDdilatFrame00", arg, i);
+  XtManageChild(w->GD.dilatFrame[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.dilatFrame[1][0] = XmCreateLabel(w->GD.dilatFrame[0][0], "GDdilatFrame10", arg, i);
+  XtManageChild(w->GD.dilatFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.dilatFrameRowCol[0] = XmCreateRowColumn(w->GD.dilatFrame[0][0], "ODdilatFrameRowCol0", arg, i);
+  XtManageChild(w->GD.dilatFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.dilatText[0] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText0", arg, i);
+  XtManageChild(w->GD.dilatText[0]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.dilatText[1] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText1", arg, i);
+  XtManageChild(w->GD.dilatText[1]);
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.dilatText[2] = XmCreateTextField(w->GD.dilatFrameRowCol[0], "GDdilatText2", arg, i);
+  XtManageChild(w->GD.dilatText[2]);
+
+  /* dilat - char length */
+  
+  i=0;
+  w->GD.dilatFrame[0][1] = XmCreateFrame(w->GD.dilatRowCol, "GDdilatFrame01", arg, i);
+  XtManageChild(w->GD.dilatFrame[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Factor")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->GD.dilatFrame[1][1] = XmCreateLabel(w->GD.dilatFrame[0][1], "GDdilatFrame11", arg, i);
+  XtManageChild(w->GD.dilatFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->GD.dilatFrameRowCol[1] = XmCreateRowColumn(w->GD.dilatFrame[0][1], "ODdilatFrameRowCol1", arg, i);
+  XtManageChild(w->GD.dilatFrameRowCol[1]); 
+  
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  XtSetArg(arg[i], XmNcolumns, 10); i++;
+  w->GD.dilatText[3] = XmCreateTextField(w->GD.dilatFrameRowCol[1], "GDdilatText3", arg, i);
+  XtManageChild(w->GD.dilatText[3]);
+
+}
+
+/* ------------------------------------------------------------------------ 
+    MESH DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_MD(Widgets_T *w){
+  int   i;
+  Arg   arg[10];
+
+  /* Characteristic length */
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Characteristic Length")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->MD.charLengthDialog = XmCreateTemplateDialog(w->M.shell, "MDcharLengthDialog", arg, i);
+  XtUnmanageChild(w->MD.charLengthDialog);
+
+  i=0;
+  w->MD.charLengthFrame[0] = XmCreateFrame(w->MD.charLengthDialog, "MDcharLengthFrame0", arg, i);
+  XtManageChild(w->MD.charLengthFrame[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->MD.charLengthFrame[1] = XmCreateLabel(w->MD.charLengthFrame[0], "MDcharLengthFrame1", arg, i);
+  XtManageChild(w->MD.charLengthFrame[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->MD.charLengthFrameRowCol = XmCreateRowColumn(w->MD.charLengthFrame[0], "MDcharLengthFrameRowCol", arg, i);
+  XtManageChild(w->MD.charLengthFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  w->MD.charLengthText = XmCreateTextField(w->MD.charLengthFrameRowCol, "MDcharLengthText", arg, i);
+  XtManageChild(w->MD.charLengthText);
+
+  /* Transfinite Line */
+
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Transfinite Line")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->MD.trsfLineDialog = XmCreateTemplateDialog(w->M.shell, "MDtrsfLineDialog", arg, i);
+  XtUnmanageChild(w->MD.trsfLineDialog);
+
+  i=0;
+  w->MD.trsfLineRowCol = XmCreateRowColumn(w->MD.trsfLineDialog, "MDtrsfLineRowCol", arg, i);
+  XtManageChild(w->MD.trsfLineRowCol);
+
+  /* trsf line  - type */
+  
+  i=0;
+  w->MD.trsfLineFrame[0][0] = XmCreateFrame(w->MD.trsfLineRowCol, "MDtrsfLineFrame00", arg, i);
+  XtManageChild(w->MD.trsfLineFrame[0][0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Type")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->MD.trsfLineFrame[1][0] = XmCreateLabel(w->MD.trsfLineFrame[0][0], "MDtrsfLineFrame10", arg, i);
+  XtManageChild(w->MD.trsfLineFrame[1][0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->MD.trsfLineFrameRowCol[0] = XmCreateRowColumn(w->MD.trsfLineFrame[0][0], "MDtrsfLineFrameRowCol0", arg, i);
+  XtManageChild(w->MD.trsfLineFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, "Power 1.0"); i++;
+  w->MD.trsfLineText[0] = XmCreateTextField(w->MD.trsfLineFrameRowCol[0], "MDtrsfLineText0", arg, i);
+  XtManageChild(w->MD.trsfLineText[0]);
+
+  /* trsf line - nb pts */
+  
+  i=0;
+  w->MD.trsfLineFrame[0][1] = XmCreateFrame(w->MD.trsfLineRowCol, "MDtrsfLineFrame01", arg, i);
+  XtManageChild(w->MD.trsfLineFrame[0][1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Number of Points")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->MD.trsfLineFrame[1][1] = XmCreateLabel(w->MD.trsfLineFrame[0][1], "MDtrsfLineFrame11", arg, i);
+  XtManageChild(w->MD.trsfLineFrame[1][1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->MD.trsfLineFrameRowCol[1] = XmCreateRowColumn(w->MD.trsfLineFrame[0][1], "MDtrsfLineFrameRowCol1", arg, i);
+  XtManageChild(w->MD.trsfLineFrameRowCol[1]); 
+  
+  i=0;
+  XtSetArg(arg[i], XmNvalue, "2"); i++;
+  w->MD.trsfLineText[1] = XmCreateTextField(w->MD.trsfLineFrameRowCol[1], "MDtrsfLineText1", arg, i);
+  XtManageChild(w->MD.trsfLineText[1]);
+
+  /* Transfinite Volume */
+  i=0;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Transfinite Volume")); i++;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Ok")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->MD.trsfVolumeDialog = XmCreateTemplateDialog(w->M.shell, "MDtrsfVolumeDialog", arg, i);
+  XtUnmanageChild(w->MD.trsfVolumeDialog);
+
+  i=0;
+  w->MD.trsfVolumeFrame[0] = XmCreateFrame(w->MD.trsfVolumeDialog, "MDtrsfVolumeFrame0", arg, i);
+  XtManageChild(w->MD.trsfVolumeFrame[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Number")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->MD.trsfVolumeFrame[1] = XmCreateLabel(w->MD.trsfVolumeFrame[0], "MDtrsfVolumeFrame1", arg, i);
+  XtManageChild(w->MD.trsfVolumeFrame[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->MD.trsfVolumeFrameRowCol = XmCreateRowColumn(w->MD.trsfVolumeFrame[0], "MDtrsfVolumeFrameRowCol", arg, i);
+  XtManageChild(w->MD.trsfVolumeFrameRowCol);
+
+  i=0;
+  XtSetArg(arg[i], XmNvalue, ""); i++;
+  w->MD.trsfVolumeText = XmCreateTextField(w->MD.trsfVolumeFrameRowCol, "MDtrsfVolumeText", arg, i);
+  XtManageChild(w->MD.trsfVolumeText);
+
+}
+
+/* ------------------------------------------------------------------------ 
+    POST PROCESSING DIALOGS
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets_PD(Widgets_T *w){
+  int     i, n;
+  Arg     arg[10];
+  Widget  tmp;
+
+  /* Offset */
+  i=0;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->PD.offsetDialog = XmCreateTemplateDialog(w->M.shell, "PDoffsetDialog", arg, i);
+  XtUnmanageChild(w->PD.offsetDialog);
+
+  i=0;
+  w->PD.offsetRowCol = XmCreateRowColumn(w->PD.offsetDialog, "PDoffsetRowCol", arg, i);
+  XtManageChild(w->PD.offsetRowCol);
+
+
+  /* Offset mode */
+  i=0;
+  w->PD.offsetFrame[0][0] = XmCreateFrame(w->PD.offsetRowCol, "ODoffsetFrame00", arg, i);
+  XtManageChild(w->PD.offsetFrame[0][0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Offset Mode")); i++;
+  w->PD.offsetFrame[1][0] = XmCreateLabel(w->PD.offsetFrame[0][0], "PDoffsetFrame10", arg, i);
+  XtManageChild(w->PD.offsetFrame[1][0]);
+  
+  i=0;
+  w->PD.offsetFrameRowCol[0] = XmCreateRowColumn(w->PD.offsetFrame[0][0], "PDoffsetFrameRowCol0", arg, i);
+  XtManageChild(w->PD.offsetFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;  
+  w->PD.offsetModeCheck = XmCreateRadioBox(w->PD.offsetFrameRowCol[0], "PDoffsetModeCheck", arg, i);
+  XtManageChild(w->PD.offsetModeCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Translation")); i++;
+  w->PD.offsetModeButt[0] = XmCreateToggleButton(w->PD.offsetModeCheck, "PDoffsetModeButt0", arg, i);
+  XtManageChild(w->PD.offsetModeButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Raise")); i++;
+  w->PD.offsetModeButt[1] = XmCreateToggleButton(w->PD.offsetModeCheck, "PDoffsetModeButt1", arg, i);
+  XtManageChild(w->PD.offsetModeButt[1]);
+  
+  /* Offset sliders and text fields */
+
+  for(n=1 ; n<4 ; n++){
+    i=0;
+    w->PD.offsetFrame[0][n] = XmCreateFrame(w->PD.offsetRowCol, "ODoffsetFrame0n", arg, i);
+    XtManageChild(w->PD.offsetFrame[0][n]);
+
+    i=0;
+    XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+    w->PD.offsetFrame[1][n] = XmCreateLabel(w->PD.offsetFrame[0][n], "PDoffsetFrame1n", arg, i);
+    XtManageChild(w->PD.offsetFrame[1][n]);
+
+    i=0;
+    w->PD.offsetFrameRowCol[n] = XmCreateRowColumn(w->PD.offsetFrame[0][n], "PDoffsetFrameRowColn", arg, i);
+    XtManageChild(w->PD.offsetFrameRowCol[n]);
+  
+    i=0;
+    XtSetArg(arg[i], XmNminimum, -100); i++;
+    XtSetArg(arg[i], XmNmaximum, 100); i++;
+    XtSetArg(arg[i], XmNdecimalPoints, 2); i++;
+    XtSetArg(arg[i], XmNshowValue, False); i++;
+    XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+    w->PD.offsetScale[n-1] = XmCreateScale(w->PD.offsetFrameRowCol[n], "PDoffsetScalen", arg, i);
+    XtManageChild(w->PD.offsetScale[n-1]);
+    
+    i=0;
+    w->PD.offsetText[n-1] = XmCreateTextField(w->PD.offsetFrameRowCol[n], "PDoffsetTextn", arg, i);
+    XtManageChild(w->PD.offsetText[n-1]);
+  }
+  
+  XtVaSetValues(w->PD.offsetFrame[1][1], XmNlabelString, XmStringCreateSimple("X"), NULL);
+  XtVaSetValues(w->PD.offsetFrame[1][2], XmNlabelString, XmStringCreateSimple("Y"), NULL);
+  XtVaSetValues(w->PD.offsetFrame[1][3], XmNlabelString, XmStringCreateSimple("Z"), NULL);
+
+
+  /* TimeStep */
+  i=0;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->PD.timeStepDialog = XmCreateTemplateDialog(w->M.shell, "PDtimeStepDialog", arg, i);
+  XtUnmanageChild(w->PD.timeStepDialog);
+
+  i=0;
+  w->PD.timeStepFrame[0] = XmCreateFrame(w->PD.timeStepDialog, "ODtimeStepFrame0", arg, i);
+  XtManageChild(w->PD.timeStepFrame[0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Time Step")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.timeStepFrame[1] = XmCreateLabel(w->PD.timeStepFrame[0], "PDtimeStepFrame1", arg, i);
+  XtManageChild(w->PD.timeStepFrame[1]);
+  
+  i=0;
+  w->PD.timeStepFrameRowCol = XmCreateRowColumn(w->PD.timeStepFrame[0], "PDtimeStepRowCol", arg, i);
+  XtManageChild(w->PD.timeStepFrameRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->PD.timeStepScale = XmCreateScale(w->PD.timeStepFrameRowCol, "PDtimeStepScale", arg, i);
+  XtManageChild(w->PD.timeStepScale);
+  
+  i=0;
+  w->PD.timeStepText = XmCreateTextField(w->PD.timeStepFrameRowCol, "PDtimeStepText", arg, i);
+  XtManageChild(w->PD.timeStepText);
+
+  /* Scale */
+  i=0;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->PD.scaleDialog = XmCreateTemplateDialog(w->M.shell, "PDscaleDialog", arg, i);
+  XtUnmanageChild(w->PD.scaleDialog);
+
+  i=0;
+  w->PD.scaleRowCol = XmCreateRowColumn(w->PD.scaleDialog, "PDscaleRowCol", arg, i);
+  XtManageChild(w->PD.scaleRowCol);
+
+  /* Scale - bar */
+  i=0;
+  w->PD.scaleFrame[0][0] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame00", arg, i);
+  XtManageChild(w->PD.scaleFrame[0][0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale Bar")); i++;  
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.scaleFrame[1][0] = XmCreateLabel(w->PD.scaleFrame[0][0], "PDscaleFrame10", arg, i);
+  XtManageChild(w->PD.scaleFrame[1][0]);
+  
+  i=0;
+  w->PD.scaleFrameRowCol[0] = XmCreateRowColumn(w->PD.scaleFrame[0][0], "PDscaleFrameRowCol0", arg, i);
+  XtManageChild(w->PD.scaleFrameRowCol[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Visibility")); i++;
+  w->PD.scaleShowButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[0], "PDscaleShowButt", arg, i);
+  XtManageChild(w->PD.scaleShowButt);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Transparency")); i++;
+  w->PD.scaleTransButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[0], "PDscaleTransButt", arg, i);
+  XtManageChild(w->PD.scaleTransButt);
+
+  for(n=0 ; n<2 ; n++){
+    i=0;
+    XtSetArg(arg[i], XmNvalue, "0.00000000000000000001e-1"); i++; /* lesstif bug */
+    w->PD.scaleText[n] = XmCreateTextField(w->PD.scaleFrameRowCol[0], "PDscaleTextn", arg, i);
+    XtManageChild(w->PD.scaleText[n]);
+  }
+
+  /* Scale - range */
+  i=0;
+  w->PD.scaleFrame[0][1] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame01", arg, i);
+  XtManageChild(w->PD.scaleFrame[0][1]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Value Range")); i++;  
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.scaleFrame[1][1] = XmCreateLabel(w->PD.scaleFrame[0][1], "PDscaleFrame11", arg, i);
+  XtManageChild(w->PD.scaleFrame[1][1]);
+  
+  i=0;
+  w->PD.scaleFrameRowCol[1] = XmCreateRowColumn(w->PD.scaleFrame[0][1], "PDscaleFrameRowCol1", arg, i);
+  XtManageChild(w->PD.scaleFrameRowCol[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Custom")); i++;
+  w->PD.scaleRangeButt = XmCreateToggleButton(w->PD.scaleFrameRowCol[1], "PDscaleRangeButt", arg, i);
+  XtManageChild(w->PD.scaleRangeButt);
+
+  for(n=0 ; n<2 ; n++){
+    i=0;
+    XtSetArg(arg[i], XmNvalue, "0.00000000000000000001e-1"); i++; /* lesstif bug */
+    w->PD.scaleRangeText[n] = XmCreateTextField(w->PD.scaleFrameRowCol[1], "PDscaleRangeTextn", arg, i);
+    XtManageChild(w->PD.scaleRangeText[n]);
+  }
+
+  i=0;
+  w->PD.scaleTypeCheck = XmCreateRadioBox(w->PD.scaleFrameRowCol[1], "PDscaleTypeCheck", arg, i);
+  XtManageChild(w->PD.scaleTypeCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Linear")); i++;
+  w->PD.scaleTypeButt[0] = XmCreateToggleButton(w->PD.scaleTypeCheck, "PDscaleTypeButt0", arg, i);
+  XtManageChild(w->PD.scaleTypeButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Logarithmic")); i++;
+  w->PD.scaleTypeButt[1] = XmCreateToggleButton(w->PD.scaleTypeCheck, "PDscaleTypeButt1", arg, i);
+  XtManageChild(w->PD.scaleTypeButt[1]);
+
+
+  /* Scale - intervals */
+  i=0;
+  w->PD.scaleFrame[0][2] = XmCreateFrame(w->PD.scaleRowCol, "ODscaleFrame02", arg, i);
+  XtManageChild(w->PD.scaleFrame[0][2]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Intervals")); i++;  
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.scaleFrame[1][2] = XmCreateLabel(w->PD.scaleFrame[0][2], "PDscaleFrame12", arg, i);
+  XtManageChild(w->PD.scaleFrame[1][2]);
+  
+  i=0;
+  w->PD.scaleFrameRowCol[2] = XmCreateRowColumn(w->PD.scaleFrame[0][2], "PDscaleFrameRowCol2", arg, i);
+  XtManageChild(w->PD.scaleFrameRowCol[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 1); i++;
+  XtSetArg(arg[i], XmNmaximum, 100); i++;
+  XtSetArg(arg[i], XmNvalue, 15); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->PD.scaleIntervalsScale = XmCreateScale(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsScale", arg, i);
+  XtManageChild(w->PD.scaleIntervalsScale);
+  
+  i=0;
+  w->PD.scaleIntervalsText = XmCreateTextField(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsText", arg, i);
+  XtManageChild(w->PD.scaleIntervalsText);
+
+  i=0;
+  XtSetArg(arg[i], XmNnumColumns, 2); i++;
+  w->PD.scaleIntervalsCheck = XmCreateRadioBox(w->PD.scaleFrameRowCol[2], "PDscaleIntervalsCheck", arg, i);
+  XtManageChild(w->PD.scaleIntervalsCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Iso")); i++;
+  w->PD.scaleIntervalsButt[0] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt0", arg, i);
+  XtManageChild(w->PD.scaleIntervalsButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Filled Iso")); i++;
+  w->PD.scaleIntervalsButt[1] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt1", arg, i);
+  XtManageChild(w->PD.scaleIntervalsButt[1]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Continous")); i++;
+  w->PD.scaleIntervalsButt[2] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt2", arg, i);
+  XtManageChild(w->PD.scaleIntervalsButt[2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Numeric")); i++;
+  w->PD.scaleIntervalsButt[3] = XmCreateToggleButton(w->PD.scaleIntervalsCheck, "PDscaleIntervalsButt3", arg, i);
+  XtManageChild(w->PD.scaleIntervalsButt[3]);
+
+  /* Color */
+  i=0;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->PD.colorDialog = XmCreateTemplateDialog(w->M.shell, "PDcolorDialog", arg, i);
+  XtUnmanageChild(w->PD.colorDialog);
+
+  i=0;
+  w->PD.colorFrame[0][0] = XmCreateFrame(w->PD.colorDialog, "ODcolorFrame00", arg, i);
+  XtManageChild(w->PD.colorFrame[0][0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Colors")); i++;  
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.colorFrame[1][0] = XmCreateLabel(w->PD.colorFrame[0][0], "PDcolorFrame10", arg, i);
+  XtManageChild(w->PD.colorFrame[1][0]);
+
+  i=0;
+  /* hardcoded this one, since its is required for the motion handling */
+  XtSetArg(arg[i], XmNtranslations, XtParseTranslationTable(DrawingAreaTranslations)); i++;
+  w->PD.colorDrawingArea = XmCreateDrawingArea(w->PD.colorFrame[0][0], "PDcolorDrawingArea", arg, i);
+  XtManageChild(w->PD.colorDrawingArea);
+
+
+  /* Vectors */
+  i=0;
+  XtSetArg(arg[i], XmNokLabelString, XmStringCreateSimple("Apply")); i++;
+  XtSetArg(arg[i], XmNcancelLabelString, XmStringCreateSimple("Cancel")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, False); i++;
+  w->PD.vectorDialog = XmCreateTemplateDialog(w->M.shell, "PDvectorDialog", arg, i);
+  XtUnmanageChild(w->PD.vectorDialog);
+
+  i=0;
+  w->PD.vectorRowCol = XmCreateRowColumn(w->PD.vectorDialog, "PDvectorRowCol", arg, i);
+  XtManageChild(w->PD.vectorRowCol);
+
+  /* vector - type */
+
+  i=0;
+  w->PD.vectorFrame[0][0] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame00", arg, i);
+  XtManageChild(w->PD.vectorFrame[0][0]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vector Display Type")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.vectorFrame[1][0] = XmCreateLabel(w->PD.vectorFrame[0][0], "PDvectorFrame10", arg, i);
+  XtManageChild(w->PD.vectorFrame[1][0]);
+
+  i=0;
+  w->PD.vectorTypeCheck = XmCreateRadioBox(w->PD.vectorFrame[0][0], "PDvectorTypeCheck", arg, i);
+  XtManageChild(w->PD.vectorTypeCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Line")); i++;
+  w->PD.vectorTypeButt[0] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt0", arg, i);
+  XtManageChild(w->PD.vectorTypeButt[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Arrow")); i++;
+  w->PD.vectorTypeButt[1] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt1", arg, i);
+  XtManageChild(w->PD.vectorTypeButt[1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Pyramid")); i++;
+  w->PD.vectorTypeButt[2] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt2", arg, i);
+  XtManageChild(w->PD.vectorTypeButt[2]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Cone")); i++;
+  w->PD.vectorTypeButt[3] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt3", arg, i);
+  XtManageChild(w->PD.vectorTypeButt[3]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Displacement")); i++;
+  w->PD.vectorTypeButt[4] = XmCreateToggleButton(w->PD.vectorTypeCheck, "PDvectorTypeButt4", arg, i);
+  XtManageChild(w->PD.vectorTypeButt[4]);
+
+  /* vector - scale */
+  
+  i=0;
+  w->PD.vectorFrame[0][1] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame01", arg, i);
+  XtManageChild(w->PD.vectorFrame[0][1]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Scale")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.vectorFrame[1][1] = XmCreateLabel(w->PD.vectorFrame[0][1], "PDvectorFrame11", arg, i);
+  XtManageChild(w->PD.vectorFrame[1][1]);
+  
+  i=0;
+  w->PD.vectorScaleRowCol = XmCreateRowColumn(w->PD.vectorFrame[0][1], "PDvectorFrameRowCol1", arg, i);
+  XtManageChild(w->PD.vectorScaleRowCol);
+  
+  i=0;
+  XtSetArg(arg[i], XmNminimum, 0); i++;
+  XtSetArg(arg[i], XmNmaximum, 200); i++;
+  XtSetArg(arg[i], XmNdecimalPoints, 2); i++;
+  XtSetArg(arg[i], XmNshowValue, False); i++;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->PD.vectorScaleScale = XmCreateScale(w->PD.vectorScaleRowCol, "PDvectorScaleScale", arg, i);
+  XtManageChild(w->PD.vectorScaleScale);
+  
+  i=0;
+  w->PD.vectorScaleText = XmCreateTextField(w->PD.vectorScaleRowCol, "PDvectorScaleText", arg, i);
+  XtManageChild(w->PD.vectorScaleText);
+
+  /* vector - location */
+
+  i=0;
+  w->PD.vectorFrame[0][2] = XmCreateFrame(w->PD.vectorRowCol, "ODvectorFrame02", arg, i);
+  XtManageChild(w->PD.vectorFrame[0][2]);
+  
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Location")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.vectorFrame[1][2] = XmCreateLabel(w->PD.vectorFrame[0][2], "PDvectorFrame12", arg, i);
+  XtManageChild(w->PD.vectorFrame[1][2]);
+
+  i=0;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  w->PD.vectorLocationCheck = XmCreateRadioBox(w->PD.vectorFrame[0][2], "PDvectorLocationCheck", arg, i);
+  XtManageChild(w->PD.vectorLocationCheck);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("COG")); i++;
+  w->PD.vectorLocationButt[0] = XmCreateToggleButton(w->PD.vectorLocationCheck, "PDvectorLocationButt0", arg, i);
+  XtManageChild(w->PD.vectorLocationButt[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Vertex")); i++;
+  w->PD.vectorLocationButt[1] = XmCreateToggleButton(w->PD.vectorLocationCheck, "PDvectorLocationButt1", arg, i);
+  XtManageChild(w->PD.vectorLocationButt[1]);
+
+
+  /* export BGM  */
+  i=0 ;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Export BGM")); i++;
+  XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
+  XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++;
+  XtSetArg(arg[i], XmNautoUnmanage, True); i++;
+  w->PD.exportBGMDialog = XmCreateFileSelectionDialog(w->M.shell, "FDexportBGMDialog", arg, i);
+  XtUnmanageChild(w->PD.exportBGMDialog);
+
+  tmp = XmFileSelectionBoxGetChild(w->PD.exportBGMDialog, XmDIALOG_HELP_BUTTON);
+  XtUnmanageChild(tmp);
+
+  i=0;
+  w->PD.exportBGMFrame[0] = XmCreateFrame(w->PD.exportBGMDialog, "FDexportBGMFrame0", arg, i);
+  XtManageChild(w->PD.exportBGMFrame[0]);
+
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("Options")); i++;
+  XtSetArg(arg[i], XmNchildType, XmFRAME_TITLE_CHILD); i++;
+  w->PD.exportBGMFrame[1] = XmCreateLabel(w->PD.exportBGMFrame[0], "FDexportBGMFrame1", arg, i);
+  XtManageChild(w->PD.exportBGMFrame[1]);
+
+  i=0 ;
+  XtSetArg(arg[i], XmNorientation, XmHORIZONTAL); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->PD.exportBGMRowCol = XmCreateRowColumn(w->PD.exportBGMFrame[0], "FDexportBGMRowCol", arg, i);
+  XtManageChild(w->PD.exportBGMRowCol);
+
+  /* export BGM - method */
+  i=0;
+  w->PD.exportBGMPane = XmCreatePulldownMenu(w->PD.exportBGMRowCol, "FDexportBGMPane", arg, i);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("h: error (%)")); i++;
+  w->PD.exportBGMButt[0] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt0", arg, i);
+  XtManageChild(w->PD.exportBGMButt[0]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("h: elements")); i++;
+  w->PD.exportBGMButt[1] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt1", arg, i);
+  XtManageChild(w->PD.exportBGMButt[1]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("p: error (%)")); i++;
+  w->PD.exportBGMButt[2] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt2", arg, i);
+  XtManageChild(w->PD.exportBGMButt[2]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("p: elements")); i++;
+  w->PD.exportBGMButt[3] = XmCreatePushButton(w->PD.exportBGMPane, "MexportBGMButt3", arg, i);
+  XtManageChild(w->PD.exportBGMButt[3]);
+  i=0;
+  XtSetArg(arg[i], XmNsubMenuId, w->PD.exportBGMPane); i++;
+  XtSetArg(arg[i], XmNspacing, 0); i++;
+  w->PD.exportBGMMenu = XmCreateOptionMenu(w->PD.exportBGMRowCol, "FDexportBGMMenu", arg, i);
+  XtManageChild(w->PD.exportBGMMenu);
+
+  /* export BGM - constraint */
+  i=0;
+  w->PD.exportBGMText = XmCreateTextField(w->PD.exportBGMRowCol, "FDexportBGMText", arg, i);
+  XtManageChild(w->PD.exportBGMText);
+
+  
+}
+
+
+
+/* ------------------------------------------------------------------------ 
+    C r e a t e W i d g e t s
+   ------------------------------------------------------------------------ */
+
+void CreateWidgets (Widgets_T *w){
+  CreateWidgets_M(w); /* menu win */
+  CreateWidgets_G(w); /* graphic win */
+  if(CTX.command_win) CreateWidgets_C(w); /* command win */
+
+  CreateWidgets_ED(w); /* error dialogs */
+  CreateWidgets_FD(w); /* file dialogs */
+  CreateWidgets_OD(w); /* option dialogs */
+  CreateWidgets_HD(w); /* help dialogs */
+  CreateWidgets_GD(w); /* geometry dialogs */
+  CreateWidgets_MD(w); /* mesh dialogs */
+  CreateWidgets_PD(w); /* post dialogs */
+}
+
+
diff --git a/Unix/Widgets.h b/Unix/Widgets.h
new file mode 100644
index 0000000000000000000000000000000000000000..20c923ff0de2210c4b8538c86579ebe01c8666ea
--- /dev/null
+++ b/Unix/Widgets.h
@@ -0,0 +1,236 @@
+#ifndef _WIDGETS_H_
+#define _WIDGETS_H_
+
+#define NB_BUTT_MAX  50 
+
+/* check Info.h */
+#define NB_INFO_GEOM   4
+#define NB_INFO_MESH   14
+#define NB_INFO_POST   5
+#define NB_INFO_MAX    23
+
+/* Holder for all Widgets */
+
+typedef struct {
+
+  /* menu window */
+
+  struct {
+    Widget   shell, containerWin ; 
+    Widget   menuBar ;
+    Widget     fileCascade, filePane, fileButt[6], fileSep[2] ;
+    Widget     moduleCascade, modulePane, moduleButt[3] ;
+    Widget     optionCascade, optionPane, optionButt[6], optionSep[2] ;
+    Widget     helpCascade, helpPane, helpButt[2], helpSep[1] ;
+    Widget   menuFrame, menuForm ;
+    Widget     modButt, modPop, geomButt, meshButt, postButt ;
+    Widget     navigButt[2]; 
+    Widget     defaultButt ;
+    Widget     pushButt     [NB_BUTT_MAX] ;
+    Widget     toggleButt   [NB_BUTT_MAX] ;
+    Widget     popMenu      [NB_BUTT_MAX] ;
+    Widget     popSep    [3][NB_BUTT_MAX] ;
+    Widget     lightButt    [NB_BUTT_MAX] ;
+    Widget     elementButt  [NB_BUTT_MAX] ;
+    Widget     offsetButt   [NB_BUTT_MAX] ;
+    Widget     timeStepButt [NB_BUTT_MAX] ;
+    Widget     scaleButt    [NB_BUTT_MAX] ;
+    Widget     colorButt    [NB_BUTT_MAX] ;
+    Widget     vectorButt   [NB_BUTT_MAX] ;
+    Widget     exportBGMButt[NB_BUTT_MAX] ;
+    Widget     applyBGMButt [NB_BUTT_MAX] ;
+    Widget     removeButt   [NB_BUTT_MAX] ;
+    Widget     duplicateButt[NB_BUTT_MAX] ;
+  } M;
+
+  /* graphic window */
+
+  struct {
+    Widget   shell, containerForm ;
+    Widget   drawForm ;
+    Widget     glw, glo ; 
+    Widget   bottomForm ;
+    Widget     Butt[7] ;
+    Widget     textForm, infoLabel, selectLabel, statusLabel ;
+  } G;
+
+  /* command window */
+
+  struct {
+    Widget   shell ;
+    Widget   command, commandList, commandText ; 
+  } C;
+
+
+  /* error dialogs */
+
+  struct {
+    Widget   printDialog, saveDialog ;
+  } ED;
+
+  /* file dialogs */
+
+  struct {
+    Widget   openDialog ;
+    Widget   mergeDialog ;
+    Widget   saveDialog ;
+    Widget   saveAsDialog ;
+    Widget     saveAsFrame[2], saveAsRowCol ;
+    Widget     saveAsPane, saveAsButt[3], saveAsMenu ;
+    Widget   printDialog ;
+    Widget     printFrame[2], printRowCol ;
+    Widget     printPane[3], printButt[13], printMenu[3] ;
+  } FD;
+
+  /* options dialogs */
+
+  struct {
+    Widget   geomDialog, geomRowCol ;
+    Widget   geomVisibleFrame[2], geomVisibleRowCol ;
+    Widget     geomVisibleTypeCheck, geomVisibleTypeButt[2] ;
+    Widget     geomVisibleCheck, geomVisibleButt[4] ;
+    Widget   geomVisibleByNumFrame[2], geomVisibleByNumRowCol ;
+    Widget     geomVisibleByNumText ;
+    Widget   geomNormalsFrame[2], geomNormalsRowCol ;
+    Widget     geomNormalsScale, geomNormalsText ;
+    Widget   geomTangentsFrame[2], geomTangentsRowCol ;
+    Widget     geomTangentsScale, geomTangentsText ;
+
+    Widget   meshDialog, meshRowCol;
+    Widget   meshAlgoFrame[2], meshAlgoRowCol  ;
+    Widget     meshAlgoCheck, meshAlgoButt[4] ;
+    Widget   meshSmoothingFrame[2], meshSmoothingRowCol  ;
+    Widget     meshSmoothingScale, meshSmoothingText ;
+    Widget   meshVisibleFrame[2], meshVisibleRowCol ;
+    Widget     meshVisibleTypeCheck, meshVisibleTypeButt[2] ;
+    Widget     meshVisibleCheck, meshVisibleButt[4] ;
+    Widget   meshVisibleByNumFrame[2], meshVisibleByNumRowCol ;
+    Widget     meshVisibleByNumText ;
+    Widget   meshAspectFrame[2] ;
+    Widget     meshAspectCheck, meshAspectButt[3] ;
+    Widget   meshExplodeFrame[2], meshExplodeRowCol ;
+    Widget     meshExplodeScale, meshExplodeText ;
+    Widget   meshNormalsFrame[2], meshNormalsRowCol ;
+    Widget     meshNormalsScale, meshNormalsText ;
+
+    Widget   postDialog, postRowCol;
+    Widget   postLinkFrame[2], postLinkRowCol  ;
+    Widget     postLinkCheck, postLinkButt[3] ;
+    Widget   postAnimFrame[2] ;
+    Widget     postAnimFrameRowCol, postAnimScale ;
+
+    Widget   miscDialog, miscRowCol ; 
+    Widget   miscMiscFrame[2] ;
+    Widget     miscMiscCheck, miscMiscButt[5] ;
+    Widget   miscColorSchemeFrame[2] ;
+    Widget     miscColorSchemeFrameRowCol, miscColorSchemeScale ;
+    Widget   miscProjFrame[2] ;
+    Widget     miscProjCheck, miscProjButt[2] ;
+    Widget   miscLightFrame[2] ;
+    Widget     miscLightFrameRowCol, miscLightScale[3] ;
+    Widget   miscShineFrame[2] ;
+    Widget     miscShineFrameRowCol, miscShineScale ;
+
+    Widget   viewportDialog, viewportRowCol ;
+    Widget     viewportFrame[2][3], viewportFrameRowCol[3] ;
+    Widget     viewportText[3][3], viewportLockButt[3][3] ;
+
+    Widget   infoDialog, infoRowCol ;
+    Widget     infoFrame[2][3], infoFrameRowCol[3] ;
+    Widget     infoKeyLabel[NB_INFO_MAX], infoValueLabel[NB_INFO_MAX] ;
+
+  } OD;
+
+  /* help dialogs */
+
+  struct {
+    Widget   keysDialog, keysText ;
+
+    Widget   aboutDialog ;
+  } HD;
+
+  /* geometry dialogs */
+
+  struct {
+    Widget   paramDialog, paramRowCol ;
+    Widget   paramFrame[2][2], paramFrameRowCol[2], paramText[2] ;
+
+    Widget   pointDialog, pointRowCol ;
+    Widget   pointFrame[2][2], pointFrameRowCol[2], pointText[4] ;
+
+    Widget   rotDialog, rotRowCol ;
+    Widget   rotFrame[2][3], rotFrameRowCol[3], rotText[7] ;
+    
+    Widget   tranDialog ;
+    Widget   tranFrame[2], tranFrameRowCol, tranText[3] ;
+
+    Widget   dilatDialog, dilatRowCol ;
+    Widget   dilatFrame[2][2], dilatFrameRowCol[2], dilatText[4] ;
+  } GD;
+
+  /* mesh dialogs */
+
+  struct {
+    Widget   charLengthDialog ;
+    Widget   charLengthFrame[2], charLengthFrameRowCol, charLengthText ;
+
+    Widget   trsfLineDialog, trsfLineRowCol ;
+    Widget   trsfLineFrame[2][2], trsfLineFrameRowCol[2], trsfLineText[2] ;
+
+    Widget   trsfVolumeDialog ;
+    Widget   trsfVolumeFrame[2], trsfVolumeFrameRowCol, trsfVolumeText ;
+  } MD;
+
+  /* post dialogs */
+
+  struct {
+    Widget   offsetDialog, offsetRowCol ;
+    Widget   offsetFrame[2][4], offsetFrameRowCol[4] ;
+    Widget   /* 1 */ offsetModeCheck, offsetModeButt[2] ;
+    Widget   /* 2 */ offsetText[3], offsetScale[3] ;
+    
+    Widget   timeStepDialog ;
+    Widget   timeStepFrame[2], timeStepFrameRowCol ;
+    Widget   timeStepText, timeStepScale ;
+    
+    Widget   scaleDialog, scaleRowCol ;
+    Widget   scaleFrame[2][4], scaleFrameRowCol[4] ;
+    Widget   /* 1 */ scaleShowButt, scaleTransButt, scaleText[2] ;
+    Widget   /* 2 */ scaleRangeButt, scaleRangeText[2], scaleTypeCheck, 
+                     scaleTypeButt[2] ;
+    Widget   /* 3 */ scaleIntervalsCheck, scaleIntervalsButt[4], 
+                     scaleIntervalsScale, scaleIntervalsText ;
+
+    Widget   colorDialog, colorRowCol ;
+    Widget   colorFrame[2][4] ;
+    Widget   /* 1 */ colorDrawingArea ;
+
+    Widget   vectorDialog, vectorRowCol ;
+    Widget   vectorFrame[2][3];
+    Widget   /* 1 */ vectorTypeCheck, vectorTypeButt[5];
+    Widget   /* 2 */ vectorScaleRowCol, vectorScaleScale, vectorScaleText ;
+    Widget   /* 3 */ vectorLocationCheck, vectorLocationButt[2];
+
+    Widget   exportBGMDialog ;
+    Widget   exportBGMFrame[2], exportBGMRowCol ;
+    Widget   exportBGMPane, exportBGMButt[4], exportBGMMenu ;
+    Widget   exportBGMText ;
+  } PD;
+
+
+  /* tooltips */    
+
+  struct {
+    Widget   shell; 
+    Widget   tooltip_lbl;
+  } tooltip;
+
+
+} Widgets_T;
+
+
+
+void CreateWidgets(Widgets_T *w);
+
+#endif
+
diff --git a/Unix/XColors.cpp b/Unix/XColors.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b87d295238743c61f2ea6d0fdb14e5e55a2d3278
--- /dev/null
+++ b/Unix/XColors.cpp
@@ -0,0 +1,244 @@
+/*
+  Attention. Toutes les couleurs sont crees a partir de la colormap de
+  l'interface : XCTX.gui.colormap
+*/
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include "Gmsh.h"
+#include "GmshUI.h"
+#include "XContext.h"
+
+extern XContext_T XCTX ;
+
+#define PF_TRUECOLOR 0
+#define PF_XALLOC    1
+#define PF_8BIT      2
+
+static int pixelformat;
+static unsigned long ctable8[5][9][5];   /* Only for PF_8BIT */
+static unsigned long rtable[256], gtable[256], btable[256];  /* PF_TRUECOLOR */
+
+/*
+ * Replacement for XAllocColor.  This function should never fail
+ * to allocate a color.  When XAllocColor fails we return the nearest
+ * matching color.
+ */
+
+#define DISTANCE(r1,g1,b1,r2,g2,b2)  ( ((r2)-(r1)) * ((r2)-(r1)) + \
+    ((g2)-(g1)) * ((g2)-(g1)) + ((b2)-(b1)) * ((b2)-(b1)) )
+
+Status New_XAllocColor( Display *dpy, Colormap cmap, int cmap_size,
+                        XColor *color )
+{
+   int p, bestmatch;
+   double dist, mindist;  /* 3*2^16^2 exceeds long int precision */
+   static XColor *allcolors = NULL;
+   XColor *acptr;
+
+   if (!XAllocColor(dpy, cmap, color)) {
+      /* query whole colormap if not yet done */
+      if (!allcolors) {
+         allcolors = (XColor *) malloc( cmap_size * sizeof(XColor) );
+         for (p = 0;  p < cmap_size;  p++)
+           allcolors[p].pixel = p;
+         XQueryColors (dpy, cmap, allcolors, cmap_size);
+      }
+ 
+      /* find best match */
+      bestmatch = -1;
+      mindist = 0.0;
+      p = cmap_size;
+      while (p--) {
+         acptr = allcolors + p;
+         dist = DISTANCE( (double)color->red, (double)color->green,
+                          (double)color->blue, (double)acptr->red,
+                          (double)acptr->green, (double)acptr->blue);
+         if (bestmatch < 0 || dist < mindist)
+           mindist = dist, bestmatch = p;
+      }
+      color->red   = allcolors[bestmatch].red;
+      color->green = allcolors[bestmatch].green;
+      color->blue  = allcolors[bestmatch].blue;
+      if (!XAllocColor( dpy, cmap, color )) {
+         /* this is a real hack but should be good enough */
+         color->pixel = bestmatch;
+         /*printf("code problem in lui.c\n");*/
+      }
+   }
+   return 1;
+}
+
+#undef DISTANCE
+
+
+
+
+/*
+ * Given an RGB color, return the corresponding pixel value.
+ * Input;  r, g, b - red, green, and blue in [0,255]
+ * Return:  a pixel value
+ */
+unsigned long AllocateColorInt( int r, int g, int b )
+{
+   XColor xcol;
+
+   switch (pixelformat) {
+      case PF_TRUECOLOR:
+         return rtable[r] | gtable[g] | btable[b];
+      case PF_8BIT:
+         return ctable8[r/52][g/31][b/52];
+      case PF_XALLOC:
+         xcol.red = r << 8;
+         xcol.green = g << 8;
+         xcol.blue = b << 8;
+         New_XAllocColor( XCTX.display, XCTX.gui.colormap, XCTX.gui.visual->map_entries,
+                          &xcol );
+         return xcol.pixel;
+      default:
+         printf("Error in AllocateColorInt %d\n", pixelformat);
+         exit(0);
+   }
+   return 0;
+}
+
+
+
+
+/*
+ * Allocate a color specified by red, green, and blue and return a pixel
+ * value.  If the color allocation fails, the white pixel will be returned.
+ * Input:  red, green, blue - values in [0,1]
+ * Return:  a pixel value
+ */
+unsigned long AllocateColor( float red, float green, float blue )
+{
+   return AllocateColorInt( (int) (red*255.0), (int) (green*255.0),
+			    (int) (blue*255.0) );
+}
+
+
+void XColorInitialize(void) {
+  XSetWindowAttributes attr;
+  XGCValues gcv;
+  unsigned long gc_mask;
+  static int initialized = 0;
+  static Window DummyWindow;
+
+  if (initialized)
+    return;
+  else
+    initialized = 1;
+
+#if defined(__cplusplus) || defined(c_plusplus)
+  if (XCTX.gui.visual->c_class==TrueColor || XCTX.gui.visual->c_class==DirectColor) {
+#else
+  if (XCTX.gui.visual->class==TrueColor || XCTX.gui.visual->class==DirectColor) {
+#endif
+
+    XColor xcol;
+    int i;
+    xcol.green = 0;
+    xcol.blue = 0;
+    for (i=0;i<256;i++) {
+      xcol.red = i * 0xffff / 0xff;
+      XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol );
+      rtable[i] = xcol.pixel;
+    }
+    xcol.red = 0;
+    xcol.blue = 0;
+    for (i=0;i<256;i++) {
+      xcol.green = i * 0xffff / 0xff;
+      XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol );
+      gtable[i] = xcol.pixel;
+    }
+    xcol.red = 0;
+    xcol.green = 0;
+    for (i=0;i<256;i++) {
+      xcol.blue = i * 0xffff / 0xff;
+      XAllocColor( XCTX.display, XCTX.gui.colormap, &xcol );
+      btable[i] = xcol.pixel;
+    }
+    pixelformat = PF_TRUECOLOR;
+  }
+
+#if defined(__cplusplus) || defined(c_plusplus)
+  else if (XCTX.gui.visual->c_class==PseudoColor) {
+#else
+  else if (XCTX.gui.visual->class==PseudoColor) {
+#endif
+    /* Note: the color allocation scheme must be the same as what's used */
+    /* in Mesa to allow colormap sharing! */
+    int r, g, b;
+    for (r=0;r<5;r++) {
+      for (g=0;g<9;g++) {
+	for (b=0;b<5;b++) {
+	  XColor xcol;
+	  xcol.red   = r * 65535 / 4;
+	  xcol.green = g * 65535 / 8;
+	  xcol.blue  = b * 65535 / 4;
+	  New_XAllocColor( XCTX.display, XCTX.gui.colormap,
+			   XCTX.gui.visual->map_entries, &xcol );
+	  ctable8[r][g][b] = xcol.pixel;
+	}
+      }
+    }
+    pixelformat = PF_8BIT;
+  }
+
+  else {
+    pixelformat = PF_XALLOC;
+  }
+
+
+  /* Create a dummy window.  This is needed because XCreateGC needs a
+     drawable of the type which we'll be using in LUI.  Unfortunately,
+     the RootWindow may not have the visual we want.  For example,
+     on the SGI PI, the default root window is pseudo color but we want
+     LUI to use TrueColor if it's available.  In this case using RootWindow
+     in XCreateGC will make a GC of the wrong type. */
+  attr.border_pixel = 0;
+  attr.background_pixel = 255;
+  attr.colormap = XCTX.gui.colormap;
+  DummyWindow = XCreateWindow( XCTX.display, DefaultRootWindow(XCTX.display),
+			       0, 0, 10, 10, 1,
+			       XCTX.depth, InputOutput, XCTX.gui.visual,
+			       CWBorderPixel | CWBackPixel | CWColormap,
+			       &attr );
+  
+  /*** The basic GC ***/
+  gc_mask        = GCForeground | GCBackground | GCFont | GCArcMode;
+  gcv.font       = XCTX.xfont.fixed->fid;
+  gcv.arc_mode   = ArcChord;
+  XCTX.xgc.xgc   = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv);
+  
+  /*** Black ***/
+  XCTX.xcolor.black = AllocateColor( 0.0, 0.0, 0.0 );
+  gcv.foreground = XCTX.xcolor.black;
+  XCTX.xgc.black = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv);
+  
+  /*** White ***/
+  XCTX.xcolor.white = AllocateColor( 1.0, 1.0, 1.0 );
+  gcv.foreground = XCTX.xcolor.white;
+  XCTX.xgc.white = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv);
+  
+  /*** Red (black on monochrome) ***/
+  XCTX.xcolor.red = AllocateColor( 1.0, 0.0, 0.0 );
+  if (XCTX.xcolor.red == XCTX.xcolor.white) {
+    XCTX.xcolor.red = XCTX.xcolor.black;
+  }
+  gcv.foreground = XCTX.xcolor.red;
+  XCTX.xgc.red  = XCreateGC(XCTX.display, DummyWindow, gc_mask, &gcv);
+  
+  /*** Green ***/
+  XCTX.xcolor.green = AllocateColor( 0.0, 1.0, 0.0 );
+  gcv.foreground = XCTX.xcolor.green;
+  XCTX.xgc.green = XCreateGC( XCTX.display, DummyWindow, gc_mask, &gcv );
+  
+  /*** Blue ***/
+  XCTX.xcolor.blue = AllocateColor( 0.0, 0.5, 1.0 );
+  gcv.foreground = XCTX.xcolor.blue;
+  XCTX.xgc.blue = XCreateGC( XCTX.display, DummyWindow, gc_mask, &gcv );
+
+}
+
diff --git a/Unix/XColors.h b/Unix/XColors.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a8088dd489eac01fc35595778d51ef58431e4f4
--- /dev/null
+++ b/Unix/XColors.h
@@ -0,0 +1,9 @@
+#ifndef _XCOLORS_H_
+#define _XCOLORS_H_
+
+void XColorInitialize(void);
+unsigned long AllocateColorInt( int r, int g, int b );
+unsigned long AllocateColor( float red, float green, float blue );
+
+#endif
+
diff --git a/Unix/XContext.h b/Unix/XContext.h
new file mode 100644
index 0000000000000000000000000000000000000000..b5b82c681734a5412682724b4385e801d1497871
--- /dev/null
+++ b/Unix/XContext.h
@@ -0,0 +1,56 @@
+#ifndef _XCONTEXT_H_
+#define _XCONTEXT_H_
+
+/* 
+   X/GLX context
+*/
+
+typedef struct {
+  Display       *display;       /* the X display */
+  int            scrnum, depth; /* the X screen number and depth */
+  XtAppContext   AppContext;
+
+  struct {
+    XVisualInfo *visinfo ;
+    GLXContext   context ;
+    Colormap     colormap ;    
+  } glw ;
+
+  struct {
+    XVisualInfo *visinfo ;
+    GLXContext   context ;
+    Colormap     colormap ;    
+  } glo ;
+
+  struct {
+    Visual     *visual ;
+    Colormap    colormap ;
+  } gui ;
+
+  struct {
+    XFontStruct *helve, *fixed ;
+    int          helve_h, helve_a, helve_w ; 
+    int          fixed_h, fixed_a, fixed_w ; 
+  } xfont ;
+
+  struct {
+    unsigned long  black, white ;
+    unsigned long  red, green, blue ;
+    unsigned long  ovblack, ovwhite ;
+  } xcolor ;
+
+  struct {
+    GC  xgc;
+    GC  black, white ;
+    GC  red, green, blue ;
+  } xgc ;
+
+} XContext_T ;
+
+#define	EV_MASK  KeyPressMask|KeyReleaseMask|\
+                 ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|\
+                 PointerMotionMask|ExposureMask|ResizeRedirectMask|\
+                 EnterWindowMask|LeaveWindowMask|ShiftMask|ControlMask|Mod1Mask
+
+
+#endif
diff --git a/Unix/XCursor.cpp b/Unix/XCursor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dfbc445d605f19752c506e31f6f125ecb76c7f39
--- /dev/null
+++ b/Unix/XCursor.cpp
@@ -0,0 +1,44 @@
+
+#include <X11/cursorfont.h>
+
+#include "xcontext.h"
+
+extern XContext_T XCTX ;
+
+#define MAIN_CURSOR     0 
+#define DIAL_CURSOR     1
+#define DIAL_CW_CURSOR  2
+#define DIAL_CCW_CURSOR 3
+#define DIAL_RES_CURSOR 4
+#define QUESTION_CURSOR 5
+#define DOWN_CURSOR     6
+#define UP_CURSOR       7
+#define UP_DOWN_CURSOR  8
+#define CLOCK_CURSOR    9
+#define PENCIL_CURSOR  10
+#define ARROW_HAND_CURSOR  11
+
+static Cursor CursorTable[32];
+
+void SetCursor(Window window, int cursor){
+  static int init = 0;
+
+  if (!init) {
+    init = 1;
+    CursorTable[MAIN_CURSOR]      = XCreateFontCursor(XCTX.display,XC_top_left_arrow);
+    CursorTable[DIAL_CURSOR]      = XCreateFontCursor(XCTX.display,XC_draft_small);
+    CursorTable[DIAL_CW_CURSOR]   = XCreateFontCursor(XCTX.display,XC_exchange);
+    CursorTable[DIAL_CCW_CURSOR]  = XCreateFontCursor(XCTX.display,XC_exchange);
+    CursorTable[DIAL_RES_CURSOR]  = XCreateFontCursor(XCTX.display,XC_circle);
+    CursorTable[QUESTION_CURSOR]  = XCreateFontCursor(XCTX.display,XC_question_arrow);
+    CursorTable[DOWN_CURSOR]      = XCreateFontCursor(XCTX.display,XC_sb_down_arrow);
+    CursorTable[UP_CURSOR]        = XCreateFontCursor(XCTX.display,XC_sb_up_arrow);
+    CursorTable[UP_DOWN_CURSOR]   = XCreateFontCursor(XCTX.display,XC_sb_v_double_arrow);
+    CursorTable[CLOCK_CURSOR]     = XCreateFontCursor(XCTX.display,XC_watch);
+    CursorTable[PENCIL_CURSOR]    = XCreateFontCursor(XCTX.display,XC_pencil);
+    CursorTable[ARROW_HAND_CURSOR]= XCreateFontCursor(XCTX.display,XC_draft_large);
+  }
+  
+  XDefineCursor(XCTX.display, window, CursorTable[cursor]);
+}
+
diff --git a/Unix/XDump.cpp b/Unix/XDump.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e144621773431b0de5bba52b931a4021d7b004fb
--- /dev/null
+++ b/Unix/XDump.cpp
@@ -0,0 +1,450 @@
+
+/* This is a modified version for Gmsh (mainly for c++ compliance) */
+
+/* Dump the image in an X xindow to a .xwd file.
+ * This code was extracted by Brian Paul from the xwd program which is
+ * included with X11.  The OMIT preprocessor identifier denotes regions
+ * of code I've had to omit.
+ */
+
+/* from xwd.c: */
+
+/* $XConsortium: xwd.c,v 1.56 91/07/25 18:00:15 rws Exp $ */
+
+/* Copyright 1987 Massachusetts Institute of Technology */
+
+/*
+ * xwd.c MIT Project Athena, X Window system window raster image dumper.
+ *
+ * This program will dump a raster image of the contents of a window into a 
+ * file for output on graphics printers or for other uses.
+ *
+ *  Author:        Tony Della Fera, DEC
+ *                17-Jun-85
+ * 
+ *  Modification history:
+ *
+ *  11/14/86 Bill Wyatt, Smithsonian Astrophysical Observatory
+ *    - Removed Z format option, changing it to an XY option. Monochrome 
+ *      windows will always dump in XY format. Color windows will dump
+ *      in Z format by default, but can be dumped in XY format with the
+ *      -xy option.
+ *
+ *  11/18/86 Bill Wyatt
+ *    - VERSION 6 is same as version 5 for monchrome. For colors, the 
+ *      appropriate number of Color structs are dumped after the header,
+ *      which has the number of colors (=0 for monochrome) in place of the
+ *      V5 padding at the end. Up to 16-bit displays are supported. I
+ *      don't yet know how 24- to 32-bit displays will be handled under
+ *      the Version 11 protocol.
+ *
+ *  6/15/87 David Krikorian, MIT Project Athena
+ *    - VERSION 7 runs under the X Version 11 servers, while the previous
+ *      versions of xwd were are for X Version 10.  This version is based
+ *      on xwd version 6, and should eventually have the same color
+ *      abilities. (Xwd V7 has yet to be tested on a color machine, so
+ *      all color-related code is commented out until color support
+ *      becomes practical.)
+ */
+
+
+/*
+ * The following XCOLOR struct is to be used in place of X's XColor
+ * struct because on 32-bit systems, sizeof(XColor)=12 while on 64-bit
+ * systems, sizeof(XColor)=16.  We MUST have an XColor struct of size
+ * 12 so a correct file is written.  BEP July-21-95
+ */
+typedef struct {
+        unsigned int /*long*/ pixel;
+        unsigned short red, green, blue;
+        char flags;  /* do_red, do_green, do_blue */
+        char pad;
+} XCOLOR;
+
+
+#include <assert.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xutil.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/XWDFile.h>
+
+static Bool debug = False;
+static Bool nobdrs = False;
+static Bool on_root = False;
+static Bool use_installed = False;
+static long add_pixel_value = 0;
+static int format = ZPixmap;
+
+static Display *dpy;
+static char *program_name = "xdump";
+static int screen;
+
+typedef unsigned long Pixel;
+
+
+
+/*
+ * outl: a debugging routine.  Flushes stdout then prints a message on stderr
+ *       and flushes stderr.  Used to print messages when past certain points
+ *       in code so we can tell where we are.  Outl may be invoked like
+ *       printf with up to 7 arguments.
+ */
+/* VARARGS1 */
+static void outl( char *msg )
+{
+        fflush(stdout);
+        fprintf(stderr, "%s\n", msg );
+        fflush(stderr);
+}
+
+
+/*
+ * Standard fatal error routine - call like printf but maximum of 7 arguments.
+ * Does not require dpy or screen defined.
+ */
+/* VARARGS1 */
+static void Fatal_Error( char *msg )
+{
+        fflush(stdout);
+        fflush(stderr);
+        fprintf(stderr, "%s: error: %s\n", program_name, msg);
+        exit(1);
+}
+
+
+/*
+ * Determine the pixmap size.
+ */
+
+static int Image_Size( XImage *image )
+{
+    if (image->format != ZPixmap)
+      return(image->bytes_per_line * image->height * image->depth);
+
+    return(image->bytes_per_line * image->height);
+}
+
+
+
+#define lowbit(x) ((x) & (~(x) + 1))
+
+/*
+ * Get the XColors of all pixels in image - returns # of colors
+ */
+static int Get_XColors( XWindowAttributes *win_info, XColor **colors )
+{
+    int i, ncolors;
+    Colormap cmap = win_info->colormap;
+
+    if (use_installed)
+        /* assume the visual will be OK ... */
+        cmap = XListInstalledColormaps(dpy, win_info->root, &i)[0];
+    if (!cmap)
+        return(0);
+
+    ncolors = win_info->visual->map_entries;
+    if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors)))
+      Fatal_Error("Out of memory!");
+
+#if defined(__cplusplus) || defined(c_plusplus)
+    if (win_info->visual->c_class == DirectColor ||
+        win_info->visual->c_class == TrueColor) {
+#else
+    if (win_info->visual->class == DirectColor ||
+        win_info->visual->class == TrueColor) {
+#endif
+
+        Pixel red, green, blue, red1, green1, blue1;
+
+        red = green = blue = 0;
+        red1 = lowbit(win_info->visual->red_mask);
+        green1 = lowbit(win_info->visual->green_mask);
+        blue1 = lowbit(win_info->visual->blue_mask);
+        for (i=0; i<ncolors; i++) {
+          (*colors)[i].pixel = red|green|blue;
+          (*colors)[i].pad = 0;
+          red += red1;
+          if (red > win_info->visual->red_mask)
+            red = 0;
+          green += green1;
+          if (green > win_info->visual->green_mask)
+            green = 0;
+          blue += blue1;
+          if (blue > win_info->visual->blue_mask)
+            blue = 0;
+        }
+    } else {
+        for (i=0; i<ncolors; i++) {
+          (*colors)[i].pixel = i;
+          (*colors)[i].pad = 0;
+        }
+    }
+
+    XQueryColors(dpy, cmap, *colors, ncolors);
+    
+    return(ncolors);
+}
+
+
+
+static void _swapshort( char *bp, unsigned n )
+{
+    register char c;
+    register char *ep = bp + n;
+
+    while (bp < ep) {
+        c = *bp;
+        *bp = *(bp + 1);
+        bp++;
+        *bp++ = c;
+    }
+}
+
+static void _swaplong ( char *bp, unsigned n )
+{
+    register char c;
+    register char *ep = bp + n;
+    register char *sp;
+
+    while (bp < ep) {
+        sp = bp + 3;
+        c = *sp;
+        *sp = *bp;
+        *bp++ = c;
+        sp = bp + 1;
+        c = *sp;
+        *sp = *bp;
+        *bp++ = c;
+        bp += 2;
+    }
+}
+
+
+
+
+
+
+/*
+ * Window_Dump: dump a window to a file which must already be open for
+ *              writting.
+ */
+
+
+void Window_Dump(Display *display, int scr, Window window, FILE *out){
+    unsigned long swaptest = 1;
+    XColor *colors;
+    unsigned buffer_size;
+    int win_name_size;
+    int header_size;
+    int ncolors, i;
+    char *win_name;
+    Bool got_win_name;
+    XWindowAttributes win_info;
+    XImage *image;
+    int absx, absy, x, y;
+    int width, height; /* unsigned */
+    int dwidth, dheight;
+    int bw;
+    Window dummywin;
+    XWDFileHeader header;
+
+    dpy = display;
+    screen = scr;
+
+    /*
+     * Inform the user not to alter the screen.
+     */
+#ifdef OMIT
+    Beep();
+#endif
+
+    /*
+     * Get the parameters of the window being dumped.
+     */
+    if (debug) outl("xwd: Getting target window information.\n");
+    if(!XGetWindowAttributes(dpy, window, &win_info)) 
+      Fatal_Error("Can't get target window attributes.");
+
+    /* handle any frame window */
+    if (!XTranslateCoordinates (dpy, window, RootWindow (dpy, screen), 0, 0,
+                                &absx, &absy, &dummywin)) {
+        fprintf (stderr, 
+                 "%s:  unable to translate window coordinates (%d,%d)\n",
+                 program_name, absx, absy);
+        exit (1);
+    }
+    win_info.x = absx;
+    win_info.y = absy;
+    width = win_info.width;
+    height = win_info.height;
+    bw = 0;
+
+    if (!nobdrs) {
+        absx -= win_info.border_width;
+        absy -= win_info.border_width;
+        bw = win_info.border_width;
+        width += (2 * bw);
+        height += (2 * bw);
+    }
+    dwidth = DisplayWidth (dpy, screen);
+    dheight = DisplayHeight (dpy, screen);
+
+
+    /* clip to window */
+    if (absx < 0) width += absx, absx = 0;
+    if (absy < 0) height += absy, absy = 0;
+    if (absx + width > dwidth) width = dwidth - absx;
+    if (absy + height > dheight) height = dheight - absy;
+
+    XFetchName(dpy, window, &win_name);
+    if (!win_name || !win_name[0]) {
+        win_name = "xwdump";
+        got_win_name = False;
+    } else {
+        got_win_name = True;
+    }
+
+    /* sizeof(char) is included for the null string terminator. */
+    win_name_size = strlen(win_name) + sizeof(char);
+
+    /*
+     * Snarf the pixmap with XGetImage.
+     */
+
+    x = absx - win_info.x;
+    y = absy - win_info.y;
+    if (on_root)
+        image = XGetImage (dpy, RootWindow(dpy, screen), absx, absy, width, height, AllPlanes, format);
+    else
+        image = XGetImage (dpy, window, x, y, width, height, AllPlanes, format);
+    if (!image) {
+        fprintf (stderr, "%s:  unable to get image at %dx%d+%d+%d\n",
+                 program_name, width, height, x, y);
+        exit (1);
+    }
+
+    if (add_pixel_value != 0) XAddPixel (image, add_pixel_value);
+
+    /*
+     * Determine the pixmap size.
+     */
+    buffer_size = Image_Size(image);
+
+    if (debug) outl("xwd: Getting Colors.\n");
+
+    ncolors = Get_XColors(&win_info, &colors);
+
+    /*
+     * Inform the user that the image has been retrieved.
+     */
+#ifdef OMIT
+    XBell(dpy, FEEP_VOLUME);
+    XBell(dpy, FEEP_VOLUME);
+#endif
+    XFlush(dpy);
+
+    /*
+     * Calculate header size.
+     */
+    if (debug) outl("xwd: Calculating header size.\n");
+    header_size = sizeof(header) + win_name_size;
+
+    /*
+     * Write out header information.
+     */
+    if (debug) outl("xwd: Constructing and dumping file header.\n");
+    header.header_size = (CARD32) header_size;
+    header.file_version = (CARD32) XWD_FILE_VERSION;
+    header.pixmap_format = (CARD32) format;
+    header.pixmap_depth = (CARD32) image->depth;
+    header.pixmap_width = (CARD32) image->width;
+    header.pixmap_height = (CARD32) image->height;
+    header.xoffset = (CARD32) image->xoffset;
+    header.byte_order = (CARD32) image->byte_order;
+    header.bitmap_unit = (CARD32) image->bitmap_unit;
+    header.bitmap_bit_order = (CARD32) image->bitmap_bit_order;
+    header.bitmap_pad = (CARD32) image->bitmap_pad;
+    header.bits_per_pixel = (CARD32) image->bits_per_pixel;
+    header.bytes_per_line = (CARD32) image->bytes_per_line;
+#if defined(__cplusplus) || defined(c_plusplus)
+    header.visual_class = (CARD32) win_info.visual->c_class;
+#else
+    header.visual_class = (CARD32) win_info.visual->class;
+#endif
+    header.red_mask = (CARD32) win_info.visual->red_mask;
+    header.green_mask = (CARD32) win_info.visual->green_mask;
+    header.blue_mask = (CARD32) win_info.visual->blue_mask;
+    header.bits_per_rgb = (CARD32) win_info.visual->bits_per_rgb;
+    header.colormap_entries = (CARD32) win_info.visual->map_entries;
+    header.ncolors = ncolors;
+    header.window_width = (CARD32) win_info.width;
+    header.window_height = (CARD32) win_info.height;
+    header.window_x = absx;
+    header.window_y = absy;
+    header.window_bdrwidth = (CARD32) win_info.border_width;
+
+    if (*(char *) &swaptest) {
+        _swaplong((char *) &header, sizeof(header));
+        for (i = 0; i < ncolors; i++) {
+            _swaplong((char *) &colors[i].pixel, sizeof(long));
+            _swapshort((char *) &colors[i].red, 3 * sizeof(short));
+         }
+    }
+
+    (void) fwrite((char *)&header, sizeof(header), 1, out);
+    (void) fwrite(win_name, win_name_size, 1, out);
+
+    /*
+     * Write out the color maps, if any
+     */
+
+    /*if (debug) outl("xwd: Dumping %d colors.\n", ncolors);*/
+    for (i=0;i<ncolors;i++) {
+       XCOLOR xc;
+       assert( sizeof(xc)==12 );
+       xc.pixel = colors[i].pixel;
+       xc.red   = colors[i].red;
+       xc.green = colors[i].green;
+       xc.blue  = colors[i].blue;
+       xc.flags = colors[i].flags;
+       xc.pad   = colors[i].pad;
+       (void) fwrite( (char *) &xc, sizeof(XCOLOR), 1, out );
+    } 
+/* OLD:
+    (void) fwrite((char *) colors, sizeof(XColor), ncolors, out);
+*/
+
+    /*
+     * Write out the buffer.
+     */
+    /*if (debug) outl("xwd: Dumping pixmap.  bufsize=%d\n",buffer_size);*/
+
+    /*
+     *    This copying of the bit stream (data) to a file is to be replaced
+     *  by an Xlib call which hasn't been written yet.  It is not clear
+     *  what other functions of xwd will be taken over by this (as yet)
+     *  non-existant X function.
+     */
+    (void) fwrite(image->data, (int) buffer_size, 1, out);
+
+    /*
+     * free the color buffer.
+     */
+
+    if(debug && ncolors > 0) outl("xwd: Freeing colors.\n");
+    if(ncolors > 0) free(colors);
+
+    /*
+     * Free window name string.
+     */
+    if (debug) outl("xwd: Freeing window name string.\n");
+    if (got_win_name) XFree(win_name);
+
+    /*
+     * Free image
+     */
+    XDestroyImage(image);
+}
diff --git a/Unix/XDump.h b/Unix/XDump.h
new file mode 100644
index 0000000000000000000000000000000000000000..981d0be2b0da033f15a9b0ed528f686526b1336c
--- /dev/null
+++ b/Unix/XDump.h
@@ -0,0 +1,6 @@
+#ifndef _XDUMP_H_
+#define _XDUMP_H_
+
+void Window_Dump(Display *display, int scr, Window window, FILE *out);
+
+#endif
diff --git a/Unix/XRessources.h b/Unix/XRessources.h
new file mode 100644
index 0000000000000000000000000000000000000000..bb692d739d40f9bf67d62670066c71cff43896b2
--- /dev/null
+++ b/Unix/XRessources.h
@@ -0,0 +1,80 @@
+
+/* 
+   Les resources ci-dessous sont prises en compte par defaut. Toutre 
+   resource definie dans ~/.gmshrc ou dans APP_DEFAULTS/.gmshrc est 
+   prioritaire
+
+   Palette I-DEAS   R   G   B 
+   background      42  71  94 
+   foreground     255 232 148 
+   highlight       42  71  95 
+   topshadow       84 127 158 
+   bottomshadow     8  12  28 
+
+   Palette netscape   
+   background              gray70
+   foreground              black
+   highlightColor          gray71
+   XmTextField*background  MistyRose3
+   XmList*background       MistyRose3
+   ArrowBack*foreground    MistyRose3
+*/
+
+String FallbackResources[] = {
+
+  /* couleurs */
+  "gmshGW*background: Grey75",
+  "gmshGW*borderColor: Grey75",
+  "gmshGW*foreground: Black",
+  "gmshGW*highlightColor: Grey76",
+  
+  "gmshMW*background: Grey75",
+  "gmshMW*borderColor: Grey75",
+  "gmshMW*foreground: Black",
+  "gmshMW*XmText*background: White",
+  "gmshMW*XmText*foreground: Black",
+  "gmshMW*XmTextField*background: White",
+  "gmshMW*XmList*background: White",
+  "gmshMW*selectColor: Yellow",
+  "gmshMW*highlightColor: DarkOrchid",
+  
+  "gmshCW*background: Grey75",
+  "gmshCW*foreground: Black",
+  "gmshCW*borderColor: Gray75",
+  "gmshCW*XmTextField*background: Gray75",
+  "gmshCW*XmList*background: Gray75",
+  "gmshCW*highlightColor: Grey76",
+
+  /* fontes */
+  "*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*",
+  "*XmTextField*fontList:  -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*",
+  "*XmList*fontList:  -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*",
+  "gmshMW*HDkeysText*fontList: fixed",
+  "gmshMW*HDkeysText*XmPushButton*fontList: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*",
+  "gmshMW*HDaboutDialog*fontList: fixed",
+
+  /* geometrie */
+  "gmshGW*geometry: 700x525+20+30",
+  "gmshMW*geometry: x405+800+90",
+  "gmshCW*geometry: 440x130+30+570",
+
+  /* sizes -> compact layout */
+
+  "*XmCascadeButton*marginWidth: 2",
+
+  NULL };
+
+/*
+  *toolbar*XmPushButton.baseTranslations: #override\n\
+  : CustomShadows(on) Arm()\n\
+  :  CustomShadows(on) Enter()\n\
+  :  CustomShadows(off) Leave()\n\
+  : MapCheck()
+
+  *toolbar*XmToggleButton.baseTranslations: #override\n\
+  : CustomShadows(on) Arm()\n\
+  : Select() Disarm() CustomShadows(check)\n\
+  :  CustomShadows(on) Enter()\n\
+  :  CustomShadows(off) Leave()\n\
+  : MapCheck()
+  */
diff --git a/Unix/XStatic.h b/Unix/XStatic.h
new file mode 100644
index 0000000000000000000000000000000000000000..d6845b39237feee43a0c70d17f7c4af00fc54473
--- /dev/null
+++ b/Unix/XStatic.h
@@ -0,0 +1,37 @@
+#ifndef _XSTATIC_H_
+#define _XSTATIC_H_
+
+/* Fenetre OpenGL principale : visual RGBA, simple ou double buffer */
+
+int glw_attrib_sb[] = { 
+  GLX_RGBA, 
+  GLX_DEPTH_SIZE, 16, 
+  GLX_RED_SIZE, 1, 
+  GLX_GREEN_SIZE, 1, 
+  GLX_BLUE_SIZE, 1,
+  None };
+
+int glw_attrib_db[] = { 
+  GLX_RGBA, 
+  GLX_DOUBLEBUFFER, 
+  GLX_DEPTH_SIZE, 16, 
+  GLX_RED_SIZE, 1, 
+  GLX_GREEN_SIZE, 1, 
+  GLX_BLUE_SIZE, 1,
+  None };
+
+/* Fenetre OpenGL overlay : visual INDEXE, simple buffer */
+
+int glo_attrib[] = { GLX_LEVEL, 1, None };
+
+/* variables globales */
+
+XContext_T  XCTX ;
+Widgets_T   WID ;
+Pixmaps_T   PIX ;
+
+GLdouble    vxmin, vxmax, vymin, vymax;
+
+double      ClipPlane[4] = {0.0, 0.0, 0.0, 0.0};
+
+#endif
diff --git a/archives/Makefile b/archives/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..418e1ce085b89a2e137aa6668e8bfa83293ed64e
--- /dev/null
+++ b/archives/Makefile
@@ -0,0 +1,4 @@
+
+purge:
+	$(RM) $(RMFLAGS) *~
+
diff --git a/benchmarks/1d/ligne.geo b/benchmarks/1d/ligne.geo
new file mode 100644
index 0000000000000000000000000000000000000000..a3f4b3bc95db336b61cc751152228925eac2a4e8
--- /dev/null
+++ b/benchmarks/1d/ligne.geo
@@ -0,0 +1,3 @@
+Point(1) = {0.0,0.0,0.0,.1}; 
+Point(2) = {1,0.0,0.0,.1}; 
+Line(1) = {1,2}; 
diff --git a/benchmarks/2d/Square-01.geo b/benchmarks/2d/Square-01.geo
new file mode 100644
index 0000000000000000000000000000000000000000..f480020abebfa68dff488b163d3d59b42019fee4
--- /dev/null
+++ b/benchmarks/2d/Square-01.geo
@@ -0,0 +1,15 @@
+/******************************      
+Square uniformly meshed      
+******************************/      
+lc = .49999;       
+Point(1) = {0.0,0.0,0,lc};       
+Point(2) = {1,0.0,0,lc};       
+Point(3) = {1,1,0,lc};       
+Point(4) = {0,1,0,lc};       
+Line(1) = {3,2};       
+Line(2) = {2,1};       
+Line(3) = {1,4};       
+Line(4) = {4,3};       
+Line Loop(5) = {1,2,3,4};       
+Plane Surface(6) = {5};       
+Attractor Point(0.05,0.05,2) = {2};                
diff --git a/benchmarks/2d/Square-02.geo b/benchmarks/2d/Square-02.geo
new file mode 100644
index 0000000000000000000000000000000000000000..d1b5976cd62d242edd90ac51429d77eaa67ebda9
--- /dev/null
+++ b/benchmarks/2d/Square-02.geo
@@ -0,0 +1,15 @@
+/******************************  
+Square non uniformly 
+meshed  
+******************************/  
+lc = .1;   
+Point(1) = {0.0,0.0,0,lc*.1};   
+Point(2) = {1,0.0,0,lc};   
+Point(3) = {1,1,0,lc};   
+Point(4) = {0,1,0,lc};   
+Line(1) = {3,2};   
+Line(2) = {2,1};   
+Line(3) = {1,4};   
+Line(4) = {4,3};   
+Line Loop(5) = {1,2,3,4};   
+Plane Surface(6) = {5};   
diff --git a/benchmarks/2d/Square-03.geo b/benchmarks/2d/Square-03.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b303fff71b5032ba2f4dfbfbb591ec18f1e7ef78
--- /dev/null
+++ b/benchmarks/2d/Square-03.geo
@@ -0,0 +1,16 @@
+/******************************       
+Square uniformly meshed       
+******************************/       
+lc = .49999;        
+Point(1) = {0.0,0.0,0,lc};        
+Point(2) = {1,0.0,0,lc};        
+Point(3) = {1,1,0,lc};        
+Point(4) = {0,1,0,lc};  
+Point(5) = {0,2,0,lc};       
+Line(1) = {3,2};        
+Line(2) = {2,1};        
+Line(3) = {1,4};        
+Line(4) = {4,3};        
+Line Loop(5) = {1,2,3,4};        
+Plane Surface(6) = {5};        
+Line(7) = {4,5};
diff --git a/benchmarks/2d/Square-Attr1.geo b/benchmarks/2d/Square-Attr1.geo
new file mode 100644
index 0000000000000000000000000000000000000000..06f930f13f60441a1e658ad517a4b095c8a0f77d
--- /dev/null
+++ b/benchmarks/2d/Square-Attr1.geo
@@ -0,0 +1,18 @@
+/******************************                   
+Square uniformly meshed                   
+******************************/                   
+lc = .1;                    
+Point(1) = {0.0,0.0,0,lc};                    
+Point(2) = {1,0.0,0,lc};                    
+Point(3) = {1,1,0,lc};                    
+Point(4) = {0,1,0,lc};                    
+Line(1) = {3,2};                    
+Line(2) = {2,1};                    
+Line(3) = {1,4};                    
+Line(4) = {4,3};                    
+Line Loop(5) = {1,2,3,4};                    
+Plane Surface(6) = {5};      
+Point(11) = {0.5,0.5,-1,lc};                    
+Point(22) = {0.5,0.5,1,lc};                    
+Line(5) = {11,22};                    
+Attractor Line(1,0.1,7) = {5};                             
diff --git a/benchmarks/2d/Square-Attr2.geo b/benchmarks/2d/Square-Attr2.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1367babc94cc1a7521704c4acd93f2c4817edf69
--- /dev/null
+++ b/benchmarks/2d/Square-Attr2.geo
@@ -0,0 +1,35 @@
+/******************************                       
+Square uniformly meshed                       
+******************************/                       
+lc = .1;                        
+Point(1) = {0.0,0.0,0,lc};                        
+Point(2) = {1,0.0,0,lc};                        
+Point(3) = {1,1,0,lc};                        
+Point(4) = {0,1,0,lc};                        
+Line(1) = {3,2};                        
+Line(2) = {2,1};                        
+Line(3) = {1,4};                        
+Line(4) = {4,3};                        
+Line Loop(5) = {1,2,3,4};                        
+Plane Surface(6) = {5};       
+e = .03;          
+Point(11) = {-.2,.5,0,lc};                        
+Point(12) = {.2,.5,0,lc};                        
+Point(13) = {.5,.8-e,0,lc};                        
+Point(14) = { (.8)-(2*e),.5,0,lc};                        
+Point(15) = { .5,(.2)+(3*e),0,lc};                        
+Point(16) = {.2+(4*e),.5,0,lc};                        
+Point(17) = {.5,.8-(5*e),0,lc};                        
+Point(18) = { .8-(6*e),.5,0,lc};                        
+Point(19) = { .5,.2+(7*e),0,lc};                        
+Point(20) = {.2+(8*e),.5,0,lc};                        
+Line(7) = {11,12};         
+Line(8) = {12,13};         
+Line(9) = {13,14};         
+Line(10) = {14,15};         
+Line(11) = {15,16};         
+Line(12) = {16,17};         
+Line(13) = {17,18};         
+Line(14) = {18,19};         
+Line(15) = {19,20};         
+Attractor Line(.1,0.01,10) = {7,8,9,10,11,12,13,14,15};         
diff --git a/benchmarks/2d/Square-Attr3.geo b/benchmarks/2d/Square-Attr3.geo
new file mode 100644
index 0000000000000000000000000000000000000000..a46321004f8214c0f109a2fb0419e14dc9931797
--- /dev/null
+++ b/benchmarks/2d/Square-Attr3.geo
@@ -0,0 +1,16 @@
+/******************************                   
+Square uniformly meshed                   
+******************************/                   
+lc = .1;                    
+Point(1) = {0.0,0.0,0,lc};                    
+Point(2) = {1,0.0,0,lc};                    
+Point(3) = {1,1,0,lc};                    
+Point(4) = {0,1,0,lc};                    
+Line(1) = {3,2};                    
+Line(2) = {2,1};                    
+Line(3) = {1,4};                    
+Line(4) = {4,3};                    
+Line Loop(5) = {1,2,3,4};                    
+Plane Surface(6) = {5};      
+Line(5) = {3,1};                    
+Attractor Line(1,0.01,3) = {5};                             
diff --git a/benchmarks/2d/Square-Attr4.geo b/benchmarks/2d/Square-Attr4.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b12f1e06fd40c3d6cb5fa5817cbebecc3ea35c98
--- /dev/null
+++ b/benchmarks/2d/Square-Attr4.geo
@@ -0,0 +1,16 @@
+/******************************               
+Square uniformly meshed               
+******************************/               
+lc = .149999;                
+Point(1) = {0.0,0.0,0,lc};                
+Point(2) = {1,0.0,0,lc};                
+Point(3) = {1,1,0,lc};                
+Point(4) = {0,1,0,lc};                
+Line(1) = {3,2};                
+Line(2) = {2,1};                
+Line(3) = {1,4};                
+Line(4) = {4,3};   
+Point(55) = {0.2,.5,0,lc};                 
+Line Loop(5) = {1,2,3,4};                
+Plane Surface(6) = {5};                
+Attractor Point (.01,.1,3.0) = {55};       
diff --git a/benchmarks/2d/conge.geo b/benchmarks/2d/conge.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b7cb6024f36a6b422c713ffc6f31abac2ceb52ac
--- /dev/null
+++ b/benchmarks/2d/conge.geo
@@ -0,0 +1,80 @@
+unit = 1.0e-02 ;
+
+e1 =  4.5 * unit ;
+e2 =  6.0 * unit / 2.0 ;
+e3 =  5.0 * unit / 2.0 ;
+h1 =  5.0 * unit ;
+h2 = 10.0 * unit ;
+h3 =  5.0 * unit ;
+h4 =  2.0 * unit ;
+h5 =  4.5 * unit ;
+R1 =  1.0 * unit ;
+R2 =  1.5 * unit ;
+r  =  1.0 * unit ;
+ccos = (-h5*R1+e2* (h5*h5+e2*e2-R1*R1)^0.5) / (h5*h5+e2*e2) ;
+ssin = ( 1.0 - ccos*ccos )^0.5 ;
+
+Lc1 = 0.01 ;
+Lc2 = 0.003 ;
+
+Point(1) = { -e1-e2, 0.0  , 0.0 , Lc1};
+Point(2) = { -e1-e2, h1   , 0.0 , Lc1};
+Point(3) = { -e3-r , h1   , 0.0 , Lc2};
+Point(4) = { -e3-r , h1+r , 0.0 , Lc2};
+Point(5) = { -e3   , h1+r , 0.0 , Lc2};
+Point(6) = { -e3   , h1+h2, 0.0 , Lc1};
+Point(7) = {  e3   , h1+h2, 0.0 , Lc1};
+Point(8) = {  e3   , h1+r , 0.0 , Lc2};
+Point(9) = {  e3+r , h1+r , 0.0 , Lc2};
+Point(10)= {  e3+r , h1   , 0.0 , Lc2};
+Point(11)= {  e1+e2, h1   , 0.0 , Lc1};
+Point(12)= {  e1+e2, 0.0  , 0.0 , Lc1};
+Point(13)= {  e2   , 0.0  , 0.0 , Lc1};
+
+Point(14)= {  R1 / ssin , h5+R1*ccos, 0.0 , Lc2};
+Point(15)= {  0.0       , h5        , 0.0 , Lc2};
+Point(16)= { -R1 / ssin , h5+R1*ccos, 0.0 , Lc2};
+Point(17)= { -e2        , 0.0       , 0.0 , Lc1};
+
+Point(18)= { -R2  , h1+h3   , 0.0 , Lc2};
+Point(19)= { -R2  , h1+h3+h4, 0.0 , Lc2};
+Point(20)= {  0.0 , h1+h3+h4, 0.0 , Lc2};
+Point(21)= {  R2  , h1+h3+h4, 0.0 , Lc2};
+Point(22)= {  R2  , h1+h3   , 0.0 , Lc2};
+Point(23)= {  0.0 , h1+h3   , 0.0 , Lc2};
+
+Point(24)= {  0 , h1+h3+h4+R2, 0.0 , Lc2};
+Point(25)= {  0 , h1+h3-R2,    0.0 , Lc2};
+
+Line(1)  = {1 ,17};    /* ux=uy=0 */
+Line(2)  = {17,16};
+Circle(3) = {14,15,16};
+Line(4)  = {14,13};
+Line(5)  = {13,12};    /* ux=uy=0 */
+Line(6)  = {12,11};
+Line(7)  = {11,10};
+Circle(8) = { 8, 9,10};
+Line(9)  = { 8, 7};
+Line(10) = { 7, 6};    /* T=10000 N */
+Line(11) = { 6, 5};
+Circle(12) = { 3, 4, 5};
+Line(13) = { 3, 2};
+Line(14) = { 2, 1};
+
+Line(15) = {18,19};
+Circle(16) = {21,20,24};
+Circle(17) = {24,20,19};
+Circle(18) = {18,23,25};
+Circle(19) = {25,23,22};
+Line(20) = {21,22};
+
+Line Loop(21) = {17,-15,18,19,-20,16};
+Plane Surface(22) = {21};
+Line Loop(23) = {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10};
+Plane Surface(24) = {23,21};
+
+
+
+
+
+
diff --git a/benchmarks/2d/francois.geo b/benchmarks/2d/francois.geo
new file mode 100644
index 0000000000000000000000000000000000000000..569fde384229d2d6ceeae16d3c7f6057991e81c3
--- /dev/null
+++ b/benchmarks/2d/francois.geo
@@ -0,0 +1,33 @@
+r = 2.24; 
+Point(1) = {0.0,0.0,0.0,.2};   
+Point(2) = {r,.0,0.0,.2};   
+Point(3) = {-r,0.0,0.0,.2};   
+Point(4) = {0,r,0.0,.2};   
+Point(5) = {0,-r,0.0,.2};   
+Circle(1) = {2,1,4};   
+Circle(2) = {4,1,3};   
+Circle(3) = {3,1,5};   
+Circle(4) = {5,1,2};   
+Point(6) = {10,10,0.0,1};   
+Point(7) = {-10,10,0.0,1};   
+Point(8) = {-10,-10,0.0,1};   
+Point(9) = {10,-10,0.0,1};   
+Line(5) = {8,7};   
+Line(6) = {7,6};   
+Line(7) = {6,9};   
+Line(8) = {9,8};   
+Line Loop(9) = {6,7,8,5};   
+Line Loop(10) = {4,1,2,3};   
+Plane Surface(11) = {9,10};   
+Extrude Surface (11, {0,0.0,2.0})
+{
+   Layers { {2,1,2} , {100,200,100} , {.05,.95,1.} } ;
+};
+Coherence; 
+Physical Surface(54) = {53};
+Physical Surface(55) = {11};
+Physical Surface(56) = {40,44,48,52};
+Physical Surface(57) = {53};
+
+Surface Loop(58) = {53,24,11,28,32,36,40,44,48,52};
+Complex Volume(59) = {58};
diff --git a/benchmarks/2d/gmsh.tmp b/benchmarks/2d/gmsh.tmp
new file mode 100644
index 0000000000000000000000000000000000000000..0b7c980569bfc58e08726a5c083429e72478f7f2
--- /dev/null
+++ b/benchmarks/2d/gmsh.tmp
@@ -0,0 +1 @@
+Complex Volume(59) = {58};
diff --git a/benchmarks/2d/runner_simple_2d.geo b/benchmarks/2d/runner_simple_2d.geo
new file mode 100644
index 0000000000000000000000000000000000000000..4eaf6f51b1eb8685fe4fbcf37c5d0d7a005559d6
--- /dev/null
+++ b/benchmarks/2d/runner_simple_2d.geo
@@ -0,0 +1,119 @@
+/*simple runner for 3d-studies;  07.07.1999/hm*/
+
+
+/*variables*/
+r=0.004;
+a=0.005;
+b=0.005;
+m=0.010;
+mh=0.020;
+
+h1=0.005;
+h2=0.005;
+h3=0.005;
+h4=0.005;
+hl = 0.012;
+f   =0.015;
+l   =0.040;
+
+lc1 = 0.001;
+
+/*points*/
+
+Point(1) = {-r,0.0,0.0,lc1};
+
+Point(2) = {0,0.0,0.0,lc1};
+
+Point(3) = {+r,0.0,0.0,lc1};
+Point(4) = {r+a,0.0,0.0,lc1};
+Point(5) = {r+a+b,0.0,0.0,lc1};
+Point(6) = {r+a+b,-h4,0.0,lc1};
+
+Point(11) = {-r,h1,0.0,lc1};
+
+Point(13) = {+r,h1,0.0,lc1};
+Point(14) = {r+a,h2,0.0,lc1};
+Point(15) = {r+a+b,h3,0.0,lc1};
+
+/*flange*/
+
+Point(25) = {r+a+b+f,0,0.0,lc1};
+Point(26) = {r+a+b+f,h3,0.0,lc1};
+Point(27) = {r+a+b+f,-h4,0.0,lc1};
+Point(28) = {r+a+b+f,-hl,0.0,lc1};
+
+/*laminate*/
+
+Point(30) = {r+a+b+f+l,0.0,0.0,lc1};
+Point(31) = {r+a+b+f+l,h3,0.0,lc1};
+Point(32) = {r+a+b+f+l,-h4,0.0,lc1};
+Point(33) = {r+a+b+f+l,-hl,0.0,lc1};
+
+/*lines*/
+
+Circle(100) = {1,2,3};
+
+Line(101) = {1,11};
+Line(102) = {11,13};
+Line(103) = {13,14};
+Line(104) = {14,15};
+Line(105) = {3,13};
+Line(106) = {3,4};
+Line(107) = {4,14};
+Line(108) = {4,5};
+Line(109) = {5,15};
+
+
+
+Line(110) = {15,26};
+Line(111) = {5,25};
+Line(112) = {6,27};
+Line(113) = {5,6};
+Line(114) = {26,25};
+Line(115) = {25,27};
+Line(116) = {26,31};
+Line(117) = {25,30};
+Line(118) = {27,32};
+Line(119) = {31,30};
+Line(120) = {30,32};
+
+Line(121) = {27,28};
+Line(122) = {28,33};
+Line(123) = {32,33};
+
+Line Loop(300) = {-102,-101,100,105};
+Plane Surface(301) = {300};
+Line Loop(400) = {107,-103,-105,106};
+Plane Surface(401) = {400};
+Line Loop(402) = {109,-104,-107,108};
+Plane Surface(403) = {402};
+
+
+Line Loop(404) = {-114,-110,-109,111};
+Plane Surface(405) = {404};
+Line Loop(406) = {-112,-113,111,115};
+Plane Surface(407) = {406};
+Line Loop(408) = {117,-119,-116,114};
+Plane Surface(409) = {408};
+Line Loop(410) = {118,-120,-117,115};
+Plane Surface(411) = {410};
+Line Loop(412) = {118,123,-122,-121};
+Plane Surface(413) = {412};
+
+/*mould*/
+
+Point(511) = {-m,h1,0.0,lc1};
+Point(512) = {-m,h1-mh,0.0,lc1};
+Point(533) = {r+a+b+f+l,h1-mh,0.0,lc1};
+
+Line(614) = {511,512};
+Line(615) = {511,11};
+Line(616) = {512,533};
+Line(617) = {533,33};
+/*
+Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122,-617,-616,-614,615,-101,100,106,108,113,112};*/
+
+Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122};
+Plane Surface(619) = {618};
+
+
diff --git a/benchmarks/3d/Cube-01-ExtrMesh.geo b/benchmarks/3d/Cube-01-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..167d77eed86f903e6e50e5c8442de606849da0b4
--- /dev/null
+++ b/benchmarks/3d/Cube-01-ExtrMesh.geo
@@ -0,0 +1,19 @@
+/*****************************                                  
+cube meshed uniformly                                  
+*****************************/         
+x = .0;                                  
+Point(1) = {0.0,0.0,0.0,.2+x};                                          
+Point(2) = {1,0.0,0.0,.2+x};                                          
+Point(3) = {1,1,0.0,.2+x};                                          
+Point(4) = {0,1,0.0,.002+x};                                          
+Line(1) = {4,3};                                          
+Line(2) = {3,2};                                          
+Line(3) = {2,1};                                          
+Line(4) = {1,4};                                          
+Line Loop(5) = {2,3,4,1};                                          
+Plane Surface(6) = {5};                                          
+Extrude Surface (6, {0,0.0,1})                               
+{                               
+      Layers {{10,5,10},{100,200,300},{.1,.9,1.}};                                  
+} ;                              
+     
diff --git a/benchmarks/3d/Cube-02-ExtrMesh.geo b/benchmarks/3d/Cube-02-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..e0dbda6c8971805d5b5421cf7780601200085a08
--- /dev/null
+++ b/benchmarks/3d/Cube-02-ExtrMesh.geo
@@ -0,0 +1,30 @@
+/*****************************                                        
+cube meshed uniformly                                        
+*****************************/               
+x = .0;                                        
+Point(1) = {0.0,0.,0.0,.2+x};                                                
+Point(2) = {1,0.,0.0,.2+x};                                                
+Point(3) = {1,1,0.0,.2+x};                                                
+Point(4) = {0,1,0.0,.2+x};                                                
+Point(5) = {1,2,0.0,.2+x};                                                
+Point(6) = {0,2,0.0,.2+x};                                                
+Line(1) = {4,3};                                                
+Line(2) = {3,2};                                                
+Line(3) = {2,1};                                                
+Line(4) = {1,4};                                                
+Line Loop(5) = {2,3,4,1};                                                
+Plane Surface(6) = {5};                                                
+Extrude Surface (6, {0,0.0,1})                                     
+{                                     
+      Layers {120}{1.}{1};                                        
+} ;                                    
+           
+Line(29) = {4,6};        
+Line(30) = {6,5};        
+Line(31) = {5,3};        
+Line Loop(32) = {-31,-30,-29,1};        
+Plane Surface(33) = {32};        
+Extrude Surface (33, {0,0.0,1});        
+Coherence;        
+Surface Loop(56) = {54,33,42,46,50,55};        
+Complex Volume(57) = {56};        
diff --git a/benchmarks/3d/Cube-02.geo b/benchmarks/3d/Cube-02.geo
new file mode 100644
index 0000000000000000000000000000000000000000..56888f64042701663aa76d577696a5991d01fdfe
--- /dev/null
+++ b/benchmarks/3d/Cube-02.geo
@@ -0,0 +1,18 @@
+/*****************************  
+cube meshed  
+non uniformly  
+*****************************/  
+Point(1) = {0.0,0.0,0.0,.04};          
+Point(2) = {1,0.0,0.0,.2};          
+Point(3) = {1,1,0.0,.1};          
+Point(4) = {0,1,0.0,.2};          
+Line(1) = {4,3};          
+Line(2) = {3,2};          
+Line(3) = {2,1};          
+Line(4) = {1,4};          
+Line Loop(5) = {2,3,4,1};          
+Plane Surface(6) = {5};          
+Extrude Surface (6, {0,0.0,1});          
+     
+Surface Loop(29) = {23,6,15,19,28,27};    
+Complex Volume(30) = {29};    
diff --git a/benchmarks/3d/Cube-03.geo b/benchmarks/3d/Cube-03.geo
new file mode 100644
index 0000000000000000000000000000000000000000..8fbdd49467635e19eb9939a3b3c13f3769fc0fd6
--- /dev/null
+++ b/benchmarks/3d/Cube-03.geo
@@ -0,0 +1,10 @@
+/*****************************  
+Another Way to generate
+a cube  
+*****************************/  
+Point(1) = {0.0,0.0,0.0,.2};          
+Extrude Point (1, {1,0.0,0});               
+Extrude Line (1, {0.0,0.0,1});
+Extrude Surface (5, {0,1,0});
+Surface Loop(28) = {26,5,14,18,22,27};
+Complex Volume(29) = {28};
diff --git a/benchmarks/3d/Cube-04.geo b/benchmarks/3d/Cube-04.geo
new file mode 100644
index 0000000000000000000000000000000000000000..692558731428da2249a2c87f6fb2603c3098f732
--- /dev/null
+++ b/benchmarks/3d/Cube-04.geo
@@ -0,0 +1,20 @@
+/*****************************      
+A cube with a hole   
+*****************************/      
+  
+Point(1) = {0.0,0.0,0.0,.1};              
+Extrude Point (1, {1,0.0,0});                   
+Extrude Line (1, {0.0,0.0,1});    
+Extrude Surface (5, {0,1,0});    
+  
+Point(100) = {0.3,0.3,0.3,.02};              
+Extrude Point (100, {.4,0.0,0});                   
+Extrude Line (28, {0,0.4,0});   
+Coherence;   
+Extrude Surface (32, {0,0.,0.4});   
+Coherence;   
+ 
+Surface Loop(55) = {26,5,14,18,22,27};   
+Surface Loop(56) = {41,32,45,49,53,54};   
+Complex Volume(57) = {55,56};   
+  
diff --git a/benchmarks/3d/Cube-05-ExtrMesh.geo b/benchmarks/3d/Cube-05-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..9777a3a115fa1f8725ad455481899aaadb9fe97c
--- /dev/null
+++ b/benchmarks/3d/Cube-05-ExtrMesh.geo
@@ -0,0 +1,35 @@
+/*****************************                
+cube with a hole              
+*****************************/             
+lv = .1;             
+lc = .04;                
+Point(1) = {0.0,0.0,0.0,lv};                        
+Point(2) = {1,0.0,0.0,lv};                        
+Point(3) = {1,1,0.0,lv};                        
+Point(4) = {0,1,0.0,lv};                        
+Line(1) = {4,3};                        
+Line(2) = {3,2};                        
+Line(3) = {2,1};                        
+Line(4) = {1,4};                        
+Point(11) = {0.5,0.5,0.0,lc};                        
+Point(12) = {0.5,0.7,0.0,lc};                        
+Point(13) = {0.5,0.3,0.0,lc};                        
+Point(14) = {0.3,0.5,0.0,lc};                        
+Point(15) = {0.7,0.5,0.0,lc};                        
+Circle(5) = {15,11,12};              
+Circle(6) = {12,11,14};              
+Circle(7) = {14,11,13};              
+Circle(8) = {13,11,15};              
+Line Loop(9) = {1,2,3,4};              
+Line Loop(10) = {7,8,5,6};              
+Plane Surface(11) = {9,10};              
+            
+Extrude Surface(11, {0.0,1,0}, {-.5,0.0,0.0}, 3.14159/4)          
+{                                                
+      Layers {5,15,5}{10,20,10}{.1,.9,1.};                                                   
+} ;            
+Coherence;            
+Extrude Surface(24, {0.0,.3,0});            
+Coherence;            
+Surface Loop(76) = {24,62,66,70,74,75};
+Complex Volume(77) = {76};
diff --git a/benchmarks/3d/Cube-05.geo b/benchmarks/3d/Cube-05.geo
new file mode 100644
index 0000000000000000000000000000000000000000..07dc09de0242d780501c3a5c978b00bdbc51ec44
--- /dev/null
+++ b/benchmarks/3d/Cube-05.geo
@@ -0,0 +1,30 @@
+/*****************************       
+cube with a hole     
+*****************************/    
+lv = .1;    
+lc = .04;       
+Point(1) = {0.0,0.0,0.0,lv};               
+Point(2) = {1,0.0,0.0,lv};               
+Point(3) = {1,1,0.0,lv};               
+Point(4) = {0,1,0.0,lv};               
+Line(1) = {4,3};               
+Line(2) = {3,2};               
+Line(3) = {2,1};               
+Line(4) = {1,4};               
+Point(11) = {0.5,0.5,0.0,lc};               
+Point(12) = {0.5,0.7,0.0,lc};               
+Point(13) = {0.5,0.3,0.0,lc};               
+Point(14) = {0.3,0.5,0.0,lc};               
+Point(15) = {0.7,0.5,0.0,lc};               
+Circle(5) = {15,11,12};     
+Circle(6) = {12,11,14};     
+Circle(7) = {14,11,13};     
+Circle(8) = {13,11,15};     
+Line Loop(9) = {1,2,3,4};     
+Line Loop(10) = {7,8,5,6};     
+Plane Surface(11) = {9,10};     
+   
+Extrude Surface(11, {0.0,1,0}, {-.5,0.0,0.0}, 3.14159/4) ;   
+Coherence;   
+Surface Loop(54) = {36,11,24,28,32,53,40,44,48,52};
+Complex Volume(55) = {54};
diff --git a/benchmarks/3d/Cube-06-ExtrMesh.geo b/benchmarks/3d/Cube-06-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..d11eaaa0c43e794f18c91f0b539b7a3bd9f1c4bd
--- /dev/null
+++ b/benchmarks/3d/Cube-06-ExtrMesh.geo
@@ -0,0 +1,30 @@
+/*****************************          
+cube with a hole        
+*****************************/       
+lv = .1;       
+lc = .04;          
+Point(1) = {0.0,0.0,0.0,lv};                  
+Point(2) = {2.5,0.0,0.0,lv};                  
+Point(3) = {2.5,1,0.0,lv};                  
+Point(4) = {0,1,0.0,lv};                  
+Line(1) = {4,3};                  
+Line(2) = {3,2};                  
+Line(3) = {2,1};                  
+Line(4) = {1,4};                  
+Point(11) = {0.5,0.5,0.0,lc};                  
+Point(12) = {0.5,0.7,0.0,lc};                  
+Point(13) = {0.5,0.3,0.0,lc};                  
+Point(14) = {0.3,0.5,0.0,lc};                  
+Point(15) = {0.7,0.5,0.0,lc};                  
+Circle(5) = {15,11,12};        
+Circle(6) = {12,11,14};        
+Circle(7) = {14,11,13};        
+Circle(8) = {13,11,15};        
+Line Loop(9) = {1,2,3,4};        
+Line Loop(10) = {7,8,5,6};        
+Plane Surface(11) = {9,10};        
+Extrude Surface (11, {.0,0.0,.1})    
+{    
+ Layers {2,3,2}{44,55,44}{.1,.9,1.};                 
+};        
+Coherence;        
diff --git a/benchmarks/3d/Cube-06.geo b/benchmarks/3d/Cube-06.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b7a591ca0ab3766a4052d01b1bf7a37ddcd9a3aa
--- /dev/null
+++ b/benchmarks/3d/Cube-06.geo
@@ -0,0 +1,29 @@
+/*****************************    
+cube with a hole  
+*****************************/ 
+lv = .1; 
+lc = .04;    
+Point(1) = {0.0,0.0,0.0,lv};            
+Point(2) = {1,0.0,0.0,lv};            
+Point(3) = {1,1,0.0,lv};            
+Point(4) = {0,1,0.0,lv};            
+Line(1) = {4,3};            
+Line(2) = {3,2};            
+Line(3) = {2,1};            
+Line(4) = {1,4};            
+Point(11) = {0.5,0.5,0.0,lc};            
+Point(12) = {0.5,0.7,0.0,lc};            
+Point(13) = {0.5,0.3,0.0,lc};            
+Point(14) = {0.3,0.5,0.0,lc};            
+Point(15) = {0.7,0.5,0.0,lc};            
+Circle(5) = {15,11,12};  
+Circle(6) = {12,11,14};  
+Circle(7) = {14,11,13};  
+Circle(8) = {13,11,15};  
+Line Loop(9) = {1,2,3,4};  
+Line Loop(10) = {7,8,5,6};  
+Plane Surface(11) = {9,10};  
+Extrude Surface (11, {.0,0.0,.5});  
+Coherence;  
+Surface Loop(54) = {24,11,28,32,36,53,40,44,48,52};  
+Complex Volume(55) = {54};  
diff --git a/benchmarks/3d/Cube-07.geo b/benchmarks/3d/Cube-07.geo
new file mode 100644
index 0000000000000000000000000000000000000000..e515fb1a0ef09a319648a560da6bc92ffdc172db
--- /dev/null
+++ b/benchmarks/3d/Cube-07.geo
@@ -0,0 +1,12 @@
+Point(1) = {0.0,0.0,0.0,.1}; 
+Point(2) = {0.0,0.0,1,.1}; 
+Point(3) = {0.0,1,1,.1}; 
+Point(4) = {0.0,1,0,.1}; 
+Line(1) = {1,2}; 
+Line(2) = {2,3}; 
+Line(3) = {3,4}; 
+Line(4) = {4,1}; 
+Line Loop(5) = {1,2,3,4}; 
+Plane Surface(6) = {5}; 
+Extrude Surface (6, {1.0,0.0,0.0}); 
+Coherence; 
diff --git a/benchmarks/3d/Cube-Attr-01.geo b/benchmarks/3d/Cube-Attr-01.geo
new file mode 100644
index 0000000000000000000000000000000000000000..ee891bbc6c30f3cb28390687766cccb42303461b
--- /dev/null
+++ b/benchmarks/3d/Cube-Attr-01.geo
@@ -0,0 +1,32 @@
+/*****************************                  
+cube meshed uniformly                  
+*****************************/                  
+Point(1) = {0.0,0.0,0.0,.2};                          
+Point(2) = {1,0.0,0.0,.2};                          
+Point(3) = {1,1,0.0,.2};                          
+Point(4) = {0,1,0.0,.2};                          
+Line(1) = {4,3};                          
+Line(2) = {3,2};                          
+Line(3) = {2,1};                          
+Line(4) = {1,4};                          
+Line Loop(5) = {2,3,4,1};                          
+Plane Surface(6) = {5};                          
+Extrude Surface (6, {0,0.0,1});                          
+                     
+Surface Loop(29) = {23,6,15,19,28,27};                    
+Complex Volume(30) = {29};                    
+                
+Attractor Point(0.05,0.05,2) = {1,4,5,6,10,14};                                                                                               
+/*    
+Point(15) = {0,.5,.5,1.0};      
+Attractor Point(0.05,0.05,2) = {15};                                                                                               
+*/    
+Point(16) = {-.5,.5,.5,1.0};      
+Point(17) = {1.5,.5,.8,1.0};      
+Line(30) = {16,17};      
+Attractor Line(0.1,0.1,2) = {30};                                                                                               
+
+Point(18) = {-.2,.7,1.3,1.0};      
+Point(19) = {1.22,.1,-.8,1.0};      
+Line(31) = {18,19};      
+Attractor Line(0.01,0.01,2) = {31};                                                                                               
diff --git a/benchmarks/3d/Cube-Attr-02.geo b/benchmarks/3d/Cube-Attr-02.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1c92c4278594773c14721dd67d86a3d194ee850f
--- /dev/null
+++ b/benchmarks/3d/Cube-Attr-02.geo
@@ -0,0 +1,19 @@
+/*****************************                      
+cube meshed uniformly                      
+*****************************/                      
+Point(1) = {0.0,0.0,0.0,.3};                              
+Point(2) = {1,0.0,0.0,.3};                              
+Point(3) = {1,1,0.0,.3};                              
+Point(4) = {0,1,0.0,.3};                              
+Line(1) = {4,3};                              
+Line(2) = {3,2};                              
+Line(3) = {2,1};                              
+Line(4) = {1,4};                              
+Line Loop(5) = {2,3,4,1};                              
+Plane Surface(6) = {5};                              
+Extrude Surface (6, {0,0.0,1});                              
+                         
+Surface Loop(29) = {23,6,15,19,28,27};                        
+Complex Volume(30) = {29};                        
+                    
+Attractor Point(0.1,0.1,2) = {1};                                                                                   
diff --git a/benchmarks/3d/Revolve.geo b/benchmarks/3d/Revolve.geo
new file mode 100644
index 0000000000000000000000000000000000000000..897b4bc1d6ffb2078f85c37110a5f615324387e4
--- /dev/null
+++ b/benchmarks/3d/Revolve.geo
@@ -0,0 +1,17 @@
+lc = .1;          
+Point(1) = {2.0,0.0,0.0,lc};          
+Point(2) = {2.0,1,0.0,lc};          
+Point(3) = {1,0,0.0,lc};          
+Point(4) = {3,0,0.0,lc};          
+Point(5) = {2,-1,0.0,lc};          
+Line(1) = {4,2};          
+         
+Line(2) = {2,3};         
+Line(3) = {3,5};         
+Line(4) = {5,4};         
+Line Loop(5) = {4,1,2,3};         
+Plane Surface(6) = {5};         
+       
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0},  3.14159/4);         
+       
+Coherence;         
diff --git a/benchmarks/3d/Revolve2-Attr.geo b/benchmarks/3d/Revolve2-Attr.geo
new file mode 100644
index 0000000000000000000000000000000000000000..4ab2f181bb7256aa6655983deaf3832a02c5766c
--- /dev/null
+++ b/benchmarks/3d/Revolve2-Attr.geo
@@ -0,0 +1,17 @@
+lc = .3;                
+Point(2) = {3.0,-1.0,0.0,lc};                
+Point(3) = {1,-1,0.0,lc};                
+Point(4) = {3,1,0.0,lc};                
+Point(5) = {1,1,0.0,lc};                
+Line(1) = {4,2};                           
+Line(2) = {2,3};               
+Line(3) = {3,5};               
+Line(4) = {5,4};               
+Line Loop(5) = {4,1,2,3};               
+Plane Surface(6) = {5};               
+             
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0},  3.14159/2);               
+             
+Coherence;               
+  
+Attractor Line (.1,.1,1.0) = {14};  
diff --git a/benchmarks/3d/Revolve2.geo b/benchmarks/3d/Revolve2.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0c7fb52965b8136750ef8be9c9e6ebd17320adea
--- /dev/null
+++ b/benchmarks/3d/Revolve2.geo
@@ -0,0 +1,30 @@
+lc = .3;             
+Point(2) = {3.0,-1.0,0.0,lc};             
+Point(3) = {1,-1,0.0,lc};             
+Point(4) = {3,1,0.0,lc};             
+Point(5) = {1,1,0.0,lc};             
+Line(1) = {4,2};                        
+Line(2) = {2,3};            
+Line(3) = {3,5};            
+Line(4) = {5,4};            
+Line Loop(5) = {4,1,2,3};            
+Plane Surface(6) = {5};            
+          
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0},  3.14159/2);            
+          
+Coherence;            
+Delete { 
+ Surface(6); 
+} 
+Delete { 
+ Surface(15); 
+} 
+Delete { 
+ Surface(28); 
+} 
+Delete { 
+ Surface(23); 
+} 
+Delete { 
+ Surface(27); 
+} 
diff --git a/benchmarks/3d/Revolve3.geo b/benchmarks/3d/Revolve3.geo
new file mode 100644
index 0000000000000000000000000000000000000000..2e3d6dafe4889402b836eb1aa849eb27c504243c
--- /dev/null
+++ b/benchmarks/3d/Revolve3.geo
@@ -0,0 +1,8 @@
+Point(1) = {0.0,0.0,0.0,.2};   
+Point(2) = {1,1,0.0,.2};   
+Point(3) = {2,1.2,0.0,.2};   
+Point(4) = {3,0,0.0,.2};   
+Point(5) = {4,1,0.0,.2};   
+CatmullRom(1) = {1,2,3,4,5};   
+Extrude Line(1, {0.0,1,0}, {-1,0.0,0.0}, 3.14159/2);   
+Coherence;   
diff --git a/benchmarks/3d/Splere.geo b/benchmarks/3d/Splere.geo
new file mode 100644
index 0000000000000000000000000000000000000000..ad2efdc8fae7fc9a5ded1b1baf4237f33d2afb9e
--- /dev/null
+++ b/benchmarks/3d/Splere.geo
@@ -0,0 +1,38 @@
+lc = .1;
+Point(1) = {0.0,0.0,0.0,lc};
+Point(2) = {1,0.0,0.0,lc};
+Point(3) = {0,1,0.0,lc};
+Circle(1) = {2,1,3};
+Point(4) = {-1,0,0.0,lc};
+Point(5) = {0,-1,0.0,lc};
+Circle(2) = {3,1,4};
+Circle(3) = {4,1,5};
+Circle(4) = {5,1,2};
+Point(6) = {0,0,-1,lc};
+Point(7) = {0,0,1,lc};
+Circle(5) = {3,1,6};
+Circle(6) = {6,1,5};
+Circle(7) = {5,1,7};
+Circle(8) = {7,1,3};
+Circle(9) = {2,1,7};
+Circle(10) = {7,1,4};
+Circle(11) = {4,1,6};
+Circle(12) = {6,1,2};
+Line Loop(13) = {-2,-8,10};
+Ruled Surface(14) = {13};
+Line Loop(15) = {10,3,7};
+Ruled Surface(16) = {15};
+Line Loop(17) = {-8,-9,1};
+Ruled Surface(18) = {17};
+Line Loop(19) = {-11,-2,5};
+Ruled Surface(20) = {19};
+Line Loop(21) = {5,12,1};
+Ruled Surface(22) = {21};
+Line Loop(23) = {-3,11,6};
+Ruled Surface(24) = {23};
+Line Loop(25) = {-7,4,9};
+Ruled Surface(26) = {25};
+Line Loop(27) = {4,-12,6};
+Ruled Surface(28) = {27};
+Surface Loop(29) = {28,26,16,14,20,24,22,18};
+Complex Volume(30) = {29};
diff --git a/benchmarks/3d/Torus-Attr.geo b/benchmarks/3d/Torus-Attr.geo
new file mode 100644
index 0000000000000000000000000000000000000000..38ef03dd482d97e171adfe22f5db49320ffa68db
--- /dev/null
+++ b/benchmarks/3d/Torus-Attr.geo
@@ -0,0 +1,18 @@
+lc = .2;              
+Point(1) = {2.0,0.0,0.0,lc};              
+Point(2) = {2.0,1,0.0,lc};              
+Point(3) = {1,0,0.0,lc};              
+Point(4) = {3,0,0.0,lc};              
+Point(5) = {2,-1,0.0,lc};              
+Circle(1) = {4,1,2};              
+             
+Circle(2) = {2,1,3};             
+Circle(3) = {3,1,5};             
+Circle(4) = {5,1,4};             
+Line Loop(5) = {4,1,2,3};             
+Plane Surface(6) = {5};             
+           
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 1.5*3.14159/2);             
+           
+Coherence;             
+Attractor Line (1,.1,2.0) = {22};   
diff --git a/benchmarks/3d/Torus-ExtrMesh.geo b/benchmarks/3d/Torus-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..5db300b7a0e1bd9f7fe180e374b79a0ec402d07d
--- /dev/null
+++ b/benchmarks/3d/Torus-ExtrMesh.geo
@@ -0,0 +1,28 @@
+lc = .2;               
+Point(1) = {2.0,0.0,0.0,lc};               
+Point(2) = {2.0,1,0.0,lc};               
+Point(3) = {1,0,0.0,lc};               
+Point(4) = {3,0,0.0,lc};               
+Point(5) = {2,-1,0.0,lc};               
+Circle(1) = {4,1,2};               
+              
+Circle(2) = {2,1,3};              
+Circle(3) = {3,1,5};              
+Circle(4) = {5,1,4};              
+Line Loop(5) = {4,1,2,3};              
+Plane Surface(6) = {5};              
+            
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 3.14159/2)    
+{    
+   Layers {{10,25,10},{11,22,11},{.1,.9,1.}} ;    
+} ;            
+            
+Coherence;              
+Extrude Surface (6, {0,0.0,2}) ; 
+Surface Loop(51) = {6,37,41,45,49,50}; 
+Complex Volume(52) = {51}; 
+Extrude Surface (45, {0,2,0.0})
+{    
+   Layers {{10,25,10},{111,222,111},{.1,.9,1.}};    
+} ; 
+Coherence; 
diff --git a/benchmarks/3d/Torus.geo b/benchmarks/3d/Torus.geo
new file mode 100644
index 0000000000000000000000000000000000000000..a2c5e9fbabb9b2f90f978e3224f4a4b46b76556b
--- /dev/null
+++ b/benchmarks/3d/Torus.geo
@@ -0,0 +1,17 @@
+lc = .2;          
+Point(1) = {2.0,0.0,0.0,lc};          
+Point(2) = {2.0,1,0.0,lc};          
+Point(3) = {1,0,0.0,lc};          
+Point(4) = {3,0,0.0,lc};          
+Point(5) = {2,-1,0.0,lc};          
+Circle(1) = {4,1,2};          
+         
+Circle(2) = {2,1,3};         
+Circle(3) = {3,1,5};         
+Circle(4) = {5,1,4};         
+Line Loop(5) = {4,1,2,3};         
+Plane Surface(6) = {5};         
+       
+Extrude Surface(6, {0.0,1,0}, {0,0.0,0.0}, 1*3.14159/2);         
+       
+Coherence;         
diff --git a/benchmarks/3d/aa b/benchmarks/3d/aa
new file mode 100644
index 0000000000000000000000000000000000000000..46f3fc19f0aa2599dec07b5a6e19605e280f878c
--- /dev/null
+++ b/benchmarks/3d/aa
@@ -0,0 +1,1711 @@
+%!PS-Adobe-3.0
+%%LanguageLevel: 1
+%%Title: Cube-01
+%%Creator: Gmsh
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+% RGB color command - r g b C
+/C { setrgbcolor } bind def
+% Font choose - size fontname FC
+/FC { findfont exch scalefont setfont } bind def
+% String primitive - (string) x y r g b size fontname S
+/S { FC C moveto show } bind def
+% Point primitive - x y r g b P
+/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def
+% Flat-shaded line - x2 y2 x1 y1 r g b L
+/L { C newpath moveto lineto stroke } bind def
+% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL
+/SL {
+/b1 exch def
+/g1 exch def
+/r1 exch def
+/y1 exch def
+/x1 exch def
+/b2 exch def
+/g2 exch def
+/r2 exch def
+/y2 exch def
+/x2 exch def
+b2 b1 sub abs 0.01 gt
+g2 g1 sub abs 0.005 gt
+r2 r1 sub abs 0.008 gt
+or or {
+/bm b1 b2 add 0.5 mul def
+/gm g1 g2 add 0.5 mul def
+/rm r1 r2 add 0.5 mul def
+/ym y1 y2 add 0.5 mul def
+/xm x1 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 xm ym rm gm bm SL
+xm ym rm gm bm x2 y2 r2 g2 b2 SL
+} {
+x1 y1 x2 y2 r1 g1 b1 L
+} ifelse
+} bind def
+% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T
+/T { C newpath moveto lineto lineto closepath fill } bind def
+% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST
+/ST {
+/b1 exch def
+/g1 exch def
+/r1 exch def
+/y1 exch def
+/x1 exch def
+/b2 exch def
+/g2 exch def
+/r2 exch def
+/y2 exch def
+/x2 exch def
+/b3 exch def
+/g3 exch def
+/r3 exch def
+/y3 exch def
+/x3 exch def
+b2 b1 sub abs 0.05 gt
+g2 g1 sub abs 0.017 gt
+r2 r1 sub abs 0.032 gt
+b3 b1 sub abs 0.05 gt
+g3 g1 sub abs 0.017 gt
+r3 r1 sub abs 0.032 gt
+b2 b3 sub abs 0.05 gt
+g2 g3 sub abs 0.017 gt
+r2 r3 sub abs 0.032 gt
+or or or or or or or or {
+/b12 b1 b2 add 0.5 mul def
+/g12 g1 g2 add 0.5 mul def
+/r12 r1 r2 add 0.5 mul def
+/y12 y1 y2 add 0.5 mul def
+/x12 x1 x2 add 0.5 mul def
+/b13 b1 b3 add 0.5 mul def
+/g13 g1 g3 add 0.5 mul def
+/r13 r1 r3 add 0.5 mul def
+/y13 y1 y3 add 0.5 mul def
+/x13 x1 x3 add 0.5 mul def
+/b32 b3 b2 add 0.5 mul def
+/g32 g3 g2 add 0.5 mul def
+/r32 r3 r2 add 0.5 mul def
+/y32 y3 y2 add 0.5 mul def
+/x32 x3 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32
+x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13
+x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+ST ST ST ST
+} {
+x1 y1 x2 y2 x3 y3 r1 g1 b1 T
+} ifelse
+} bind def
+%%EndProlog
+%%Page: 1
+%%PageBoundingBox: 0 0 800 579
+gsave
+674.644 103.364 549.299 200.303 0 0 1 L
+225.3 162.8 549.299 200.303 0 0 1 L
+549.299 200.303 549.299 531.789 0 0 1 L
+549.299 200.303 0.698039 0.713726 0.505882 P
+549.299 200.303 0 0.482353 0.231373 P
+549.299 200.303 0 0.482353 0.231373 P
+580.635 176.068 549.299 200.303 0 1 0 L
+549.299 200.303 517.225 178.596 0 1 0 L
+580.635 176.068 549.299 200.303 517.225 178.596 1 0 0 T
+517.225 178.596 549.299 200.303 0 1 0 L
+549.299 200.303 468.299 190.927 0 1 0 L
+549.299 200.303 468.299 190.927 517.225 178.596 1 0 0 T
+580.635 176.068 549.299 200.303 0 1 0 L
+549.299 200.303 569.537 238.173 0 1 0 L
+580.635 176.068 549.299 200.303 569.537 238.173 1 0 0 T
+569.537 238.173 549.299 200.303 0 1 0 L
+549.299 200.303 549.299 283.174 0 1 0 L
+549.299 200.303 549.299 283.174 569.537 238.173 1 0 0 T
+496.986 247.769 549.299 200.303 0 1 0 L
+549.299 200.303 468.299 190.927 0 1 0 L
+549.299 200.303 468.299 190.927 496.986 247.769 1 0 0 T
+549.299 283.174 549.299 200.303 0 1 0 L
+549.299 200.303 496.986 247.769 0 1 0 L
+549.299 283.174 549.299 200.303 496.986 247.769 1 0 0 T
+549.299 283.174 0 0.482353 0.231373 P
+549.299 283.174 0 0.482353 0.231373 P
+569.537 238.173 549.299 283.174 0 1 0 L
+549.299 283.174 566.089 304.665 0 1 0 L
+569.537 238.173 549.299 283.174 566.089 304.665 1 0 0 T
+566.089 304.665 549.299 283.174 0 1 0 L
+549.299 283.174 549.299 366.046 0 1 0 L
+549.299 283.174 549.299 366.046 566.089 304.665 1 0 0 T
+549.299 283.174 569.537 238.173 0 1 0 L
+505.899 312.627 549.299 283.174 0 1 0 L
+549.299 283.174 496.986 247.769 0 1 0 L
+549.299 283.174 496.986 247.769 505.899 312.627 1 0 0 T
+549.299 366.046 549.299 283.174 0 1 0 L
+549.299 283.174 505.899 312.627 0 1 0 L
+549.299 366.046 549.299 283.174 505.899 312.627 1 0 0 T
+496.986 247.769 549.299 283.174 0 1 0 L
+468.299 190.927 0 0.482353 0.231373 P
+468.299 190.927 0 0.482353 0.231373 P
+517.225 178.596 468.299 190.927 0 1 0 L
+468.299 190.927 451.392 174.042 0 1 0 L
+517.225 178.596 468.299 190.927 451.392 174.042 1 0 0 T
+451.392 174.042 468.299 190.927 0 1 0 L
+468.299 190.927 387.299 181.551 0 1 0 L
+468.299 190.927 387.299 181.551 451.392 174.042 1 0 0 T
+468.299 190.927 517.225 178.596 0 1 0 L
+496.986 247.769 468.299 190.927 0 1 0 L
+468.299 190.927 434.602 231.43 0 1 0 L
+496.986 247.769 468.299 190.927 434.602 231.43 1 0 0 T
+434.602 231.43 468.299 190.927 0 1 0 L
+468.299 190.927 387.299 181.551 0 1 0 L
+468.299 190.927 387.299 181.551 434.602 231.43 1 0 0 T
+468.299 190.927 496.986 247.769 0 1 0 L
+496.986 247.769 0 0.482353 0.231373 P
+505.899 312.627 496.986 247.769 0 1 0 L
+496.986 247.769 454.799 286.048 0 1 0 L
+496.986 247.769 454.799 286.048 505.899 312.627 1 0 0 T
+496.986 247.769 505.899 312.627 0 1 0 L
+454.799 286.048 496.986 247.769 0 1 0 L
+496.986 247.769 434.602 231.43 0 1 0 L
+454.799 286.048 496.986 247.769 434.602 231.43 1 0 0 T
+434.602 231.43 496.986 247.769 0 1 0 L
+549.299 366.046 0 0.482353 0.231373 P
+549.299 366.046 0 0.482353 0.231373 P
+566.089 304.665 549.299 366.046 0 1 0 L
+549.299 366.046 576.905 344.696 0 1 0 L
+549.299 366.046 576.905 344.696 566.089 304.665 1 0 0 T
+549.299 366.046 566.089 304.665 0 1 0 L
+576.905 344.696 549.299 366.046 0 1 0 L
+549.299 366.046 566.089 401.456 0 1 0 L
+576.905 344.696 549.299 366.046 566.089 401.456 1 0 0 T
+566.089 401.456 549.299 366.046 0 1 0 L
+549.299 366.046 549.299 448.918 0 1 0 L
+549.299 366.046 549.299 448.918 566.089 401.456 1 0 0 T
+477.942 357.786 549.299 366.046 0 1 0 L
+549.299 366.046 505.899 312.627 0 1 0 L
+477.942 357.786 549.299 366.046 505.899 312.627 1 0 0 T
+505.899 312.627 549.299 366.046 0 1 0 L
+505.899 409.418 549.299 366.046 0 1 0 L
+549.299 366.046 477.942 357.786 0 1 0 L
+549.299 366.046 477.942 357.786 505.899 409.418 1 0 0 T
+549.299 448.918 549.299 366.046 0 1 0 L
+549.299 366.046 505.899 409.418 0 1 0 L
+549.299 448.918 549.299 366.046 505.899 409.418 1 0 0 T
+505.899 312.627 0 0.482353 0.231373 P
+454.799 286.048 505.899 312.627 0 1 0 L
+505.899 312.627 454.799 286.048 0 1 0 L
+477.942 357.786 505.899 312.627 0 1 0 L
+454.799 286.048 477.942 357.786 505.899 312.627 1 0 0 T
+505.899 312.627 477.942 357.786 0 1 0 L
+434.602 231.43 0 0.482353 0.231373 P
+434.602 231.43 454.799 286.048 0 1 0 L
+434.602 231.43 387.299 254.557 0 1 0 L
+454.799 286.048 434.602 231.43 0 1 0 L
+387.299 254.557 454.799 286.048 434.602 231.43 1 0 0 T
+434.602 231.43 387.299 181.551 0 1 0 L
+387.299 254.557 434.602 231.43 0 1 0 L
+387.299 181.551 387.299 254.557 434.602 231.43 1 0 0 T
+387.299 181.551 434.602 231.43 0 1 0 L
+387.299 181.551 0 0.482353 0.231373 P
+387.299 181.551 0 0.482353 0.231373 P
+414.905 160.202 387.299 181.551 0 1 0 L
+387.299 181.551 356.787 163.091 0 1 0 L
+414.905 160.202 387.299 181.551 356.787 163.091 1 0 0 T
+356.787 163.091 387.299 181.551 0 1 0 L
+387.299 181.551 306.3 172.176 0 1 0 L
+387.299 181.551 306.3 172.176 356.787 163.091 1 0 0 T
+451.392 174.042 387.299 181.551 0 1 0 L
+387.299 181.551 414.905 160.202 0 1 0 L
+387.299 181.551 414.905 160.202 451.392 174.042 1 0 0 T
+387.299 181.551 451.392 174.042 0 1 0 L
+387.299 254.557 387.299 181.551 0 1 0 L
+387.299 181.551 339.997 220.479 0 1 0 L
+387.299 254.557 387.299 181.551 339.997 220.479 1 0 0 T
+339.997 220.479 387.299 181.551 0 1 0 L
+387.299 181.551 306.3 172.176 0 1 0 L
+387.299 181.551 306.3 172.176 339.997 220.479 1 0 0 T
+387.299 181.551 387.299 254.557 0 1 0 L
+454.799 286.048 0 0.482353 0.231373 P
+454.799 286.048 477.942 357.786 0 1 0 L
+387.299 254.557 454.799 286.048 0 1 0 L
+387.299 347.295 454.799 286.048 0 1 0 L
+454.799 286.048 387.299 254.557 0 1 0 L
+387.299 347.295 454.799 286.048 387.299 254.557 1 0 0 T
+477.942 357.786 454.799 286.048 0 1 0 L
+454.799 286.048 387.299 347.295 0 1 0 L
+454.799 286.048 387.299 347.295 477.942 357.786 1 0 0 T
+569.537 238.173 0 0.482353 0.231373 P
+585.858 268.712 569.537 238.173 0 1 0 L
+569.537 238.173 566.089 304.665 0 1 0 L
+585.858 268.712 569.537 238.173 566.089 304.665 1 0 0 T
+566.089 304.665 569.537 238.173 0 1 0 L
+593.672 210.389 569.537 238.173 0 1 0 L
+569.537 238.173 585.858 268.712 0 1 0 L
+569.537 238.173 585.858 268.712 593.672 210.389 1 0 0 T
+580.635 176.068 569.537 238.173 0 1 0 L
+569.537 238.173 593.672 210.389 0 1 0 L
+580.635 176.068 569.537 238.173 593.672 210.389 1 0 0 T
+569.537 238.173 580.635 176.068 0 1 0 L
+517.225 178.596 0 0.482353 0.231373 P
+550.272 160.962 517.225 178.596 0 1 0 L
+517.225 178.596 491.358 161.091 0 1 0 L
+517.225 178.596 491.358 161.091 550.272 160.962 1 0 0 T
+580.635 176.068 517.225 178.596 0 1 0 L
+517.225 178.596 550.272 160.962 0 1 0 L
+580.635 176.068 517.225 178.596 550.272 160.962 1 0 0 T
+491.358 161.091 517.225 178.596 0 1 0 L
+517.225 178.596 451.392 174.042 0 1 0 L
+491.358 161.091 517.225 178.596 451.392 174.042 1 0 0 T
+451.392 174.042 517.225 178.596 0 1 0 L
+517.225 178.596 580.635 176.068 0 1 0 L
+333.273 167.011 317.073 181.71 1 1 0 L
+580.635 176.068 0 0.482353 0.231373 P
+580.635 176.068 0 0.482353 0.231373 P
+550.272 160.962 580.635 176.068 0 1 0 L
+611.972 151.833 580.635 176.068 0 1 0 L
+580.635 176.068 550.272 160.962 0 1 0 L
+611.972 151.833 580.635 176.068 550.272 160.962 1 0 0 T
+593.672 210.389 580.635 176.068 0 1 0 L
+611.972 151.833 580.635 176.068 0 1 0 L
+580.635 176.068 593.672 210.389 0 1 0 L
+611.972 151.833 580.635 176.068 593.672 210.389 1 0 0 T
+322.039 185.071 328.306 163.65 1 1 0 L
+549.299 448.918 0 0.482353 0.231373 P
+549.299 448.918 0 0.482353 0.231373 P
+566.089 401.456 549.299 448.918 0 1 0 L
+549.299 448.918 569.537 462.616 0 1 0 L
+549.299 448.918 569.537 462.616 566.089 401.456 1 0 0 T
+549.299 448.918 566.089 401.456 0 1 0 L
+569.537 462.616 549.299 448.918 0 1 0 L
+549.299 448.918 549.299 531.789 0 1 0 L
+549.299 448.918 549.299 531.789 569.537 462.616 1 0 0 T
+496.986 472.213 549.299 448.918 0 1 0 L
+549.299 448.918 505.899 409.418 0 1 0 L
+496.986 472.213 549.299 448.918 505.899 409.418 1 0 0 T
+505.899 409.418 549.299 448.918 0 1 0 L
+549.299 531.789 549.299 448.918 0 1 0 L
+549.299 448.918 496.986 472.213 0 1 0 L
+549.299 531.789 549.299 448.918 496.986 472.213 1 0 0 T
+566.089 304.665 0 0.482353 0.231373 P
+566.089 304.665 585.858 268.712 0 1 0 L
+566.089 304.665 576.905 344.696 0 1 0 L
+585.858 268.712 566.089 304.665 0 1 0 L
+576.905 344.696 585.858 268.712 566.089 304.665 1 0 0 T
+576.905 344.696 566.089 304.665 0 1 0 L
+477.942 357.786 0 0.482353 0.231373 P
+505.899 409.418 477.942 357.786 0 1 0 L
+477.942 357.786 454.799 424.167 0 1 0 L
+477.942 357.786 454.799 424.167 505.899 409.418 1 0 0 T
+477.942 357.786 505.899 409.418 0 1 0 L
+477.942 357.786 387.299 347.295 0 1 0 L
+454.799 424.167 477.942 357.786 0 1 0 L
+387.299 347.295 454.799 424.167 477.942 357.786 1 0 0 T
+387.299 347.295 477.942 357.786 0 1 0 L
+387.299 254.557 0 0.482353 0.231373 P
+319.8 270.422 387.299 254.557 0 1 0 L
+387.299 254.557 339.997 220.479 0 1 0 L
+319.8 270.422 387.299 254.557 339.997 220.479 1 0 0 T
+339.997 220.479 387.299 254.557 0 1 0 L
+387.299 254.557 387.299 347.295 0 1 0 L
+387.299 254.557 319.8 270.422 0 1 0 L
+387.299 347.295 387.299 254.557 0 1 0 L
+319.8 270.422 387.299 347.295 387.299 254.557 1 0 0 T
+505.899 409.418 0 0.482353 0.231373 P
+505.899 409.418 454.799 424.167 0 1 0 L
+496.986 472.213 505.899 409.418 0 1 0 L
+454.799 424.167 496.986 472.213 505.899 409.418 1 0 0 T
+454.799 424.167 505.899 409.418 0 1 0 L
+505.899 409.418 496.986 472.213 0 1 0 L
+451.392 174.042 0 0.482353 0.231373 P
+451.392 174.042 491.358 161.091 0 1 0 L
+451.392 174.042 414.905 160.202 0 1 0 L
+491.358 161.091 451.392 174.042 0 1 0 L
+414.905 160.202 491.358 161.091 451.392 174.042 1 0 0 T
+414.905 160.202 451.392 174.042 0 1 0 L
+306.3 172.176 225.3 162.8 1 1 0 L
+306.3 172.176 0 0.482353 0.231373 P
+306.3 172.176 0 0.482353 0.231373 P
+356.787 163.091 306.3 172.176 0 1 0 L
+306.3 172.176 297.85 153.204 0 1 0 L
+306.3 172.176 297.85 153.204 356.787 163.091 1 0 0 T
+306.3 172.176 356.787 163.091 0 1 0 L
+297.85 153.204 306.3 172.176 0 1 0 L
+306.3 172.176 225.3 162.8 0 1 0 L
+306.3 172.176 225.3 162.8 297.85 153.204 1 0 0 T
+339.997 220.479 306.3 172.176 0 1 0 L
+306.3 172.176 277.612 222.376 0 1 0 L
+306.3 172.176 277.612 222.376 339.997 220.479 1 0 0 T
+306.3 172.176 339.997 220.479 0 1 0 L
+277.612 222.376 306.3 172.176 0 1 0 L
+306.3 172.176 225.3 162.8 0 1 0 L
+306.3 172.176 225.3 162.8 277.612 222.376 1 0 0 T
+339.997 220.479 0 0.482353 0.231373 P
+339.997 220.479 277.612 222.376 0 1 0 L
+319.8 270.422 339.997 220.479 0 1 0 L
+277.612 222.376 319.8 270.422 339.997 220.479 1 0 0 T
+339.997 220.479 319.8 270.422 0 1 0 L
+277.612 222.376 339.997 220.479 0 1 0 L
+279.246 169.044 279.246 224.237 1 1 0 L
+300.116 152.904 279.246 169.044 1 1 0 L
+674.644 434.85 549.299 531.789 0 0 1 L
+549.299 531.789 225.3 494.286 0 0 1 L
+549.299 531.789 0.698039 0.713726 0.505882 P
+549.299 531.789 0 0.482353 0.231373 P
+549.299 531.789 0 0.482353 0.231373 P
+580.635 507.554 549.299 531.789 0 1 0 L
+549.299 531.789 517.225 510.082 0 1 0 L
+580.635 507.554 549.299 531.789 517.225 510.082 1 0 0 T
+517.225 510.082 549.299 531.789 0 1 0 L
+549.299 531.789 468.299 522.413 0 1 0 L
+549.299 531.789 468.299 522.413 517.225 510.082 1 0 0 T
+569.537 462.616 549.299 531.789 0 1 0 L
+549.299 531.789 580.635 507.554 0 1 0 L
+549.299 531.789 580.635 507.554 569.537 462.616 1 0 0 T
+549.299 531.789 569.537 462.616 0 1 0 L
+496.986 472.213 549.299 531.789 0 1 0 L
+468.299 522.413 549.299 531.789 0 1 0 L
+549.299 531.789 496.986 472.213 0 1 0 L
+468.299 522.413 549.299 531.789 496.986 472.213 1 0 0 T
+496.986 472.213 0 0.482353 0.231373 P
+434.602 474.11 496.986 472.213 0 1 0 L
+496.986 472.213 454.799 424.167 0 1 0 L
+496.986 472.213 454.799 424.167 434.602 474.11 1 0 0 T
+468.299 522.413 496.986 472.213 0 1 0 L
+496.986 472.213 434.602 474.11 0 1 0 L
+468.299 522.413 496.986 472.213 434.602 474.11 1 0 0 T
+454.799 424.167 496.986 472.213 0 1 0 L
+496.986 472.213 468.299 522.413 0 1 0 L
+454.799 424.167 0 0.482353 0.231373 P
+454.799 424.167 434.602 474.11 0 1 0 L
+434.602 474.11 454.799 424.167 0 1 0 L
+454.799 424.167 387.299 440.032 0 1 0 L
+454.799 424.167 387.299 440.032 434.602 474.11 1 0 0 T
+387.299 440.032 454.799 424.167 0 1 0 L
+454.799 424.167 387.299 347.295 0 1 0 L
+454.799 424.167 387.299 347.295 387.299 440.032 1 0 0 T
+387.299 347.295 454.799 424.167 0 1 0 L
+566.089 401.456 0 0.482353 0.231373 P
+566.089 401.456 569.537 462.616 0 1 0 L
+585.858 406.832 566.089 401.456 0 1 0 L
+569.537 462.616 585.858 406.832 566.089 401.456 1 0 0 T
+566.089 401.456 585.858 406.832 0 1 0 L
+576.905 344.696 566.089 401.456 0 1 0 L
+585.858 406.832 576.905 344.696 566.089 401.456 1 0 0 T
+566.089 401.456 576.905 344.696 0 1 0 L
+569.537 462.616 566.089 401.456 0 1 0 L
+387.299 347.295 0 0.482353 0.231373 P
+387.299 347.295 387.299 440.032 0 1 0 L
+387.299 440.032 387.299 347.295 0 1 0 L
+387.299 347.295 319.8 408.541 0 1 0 L
+387.299 347.295 319.8 408.541 387.299 440.032 1 0 0 T
+296.657 336.803 387.299 347.295 0 1 0 L
+387.299 347.295 319.8 270.422 0 1 0 L
+387.299 347.295 319.8 270.422 296.657 336.803 1 0 0 T
+319.8 408.541 387.299 347.295 0 1 0 L
+387.299 347.295 296.657 336.803 0 1 0 L
+319.8 408.541 387.299 347.295 296.657 336.803 1 0 0 T
+319.8 270.422 387.299 347.295 0 1 0 L
+319.8 270.422 0 0.482353 0.231373 P
+277.612 222.376 319.8 270.422 0 1 0 L
+268.7 285.171 319.8 270.422 0 1 0 L
+319.8 270.422 277.612 222.376 0 1 0 L
+319.8 270.422 277.612 222.376 268.7 285.171 1 0 0 T
+296.657 336.803 319.8 270.422 0 1 0 L
+319.8 270.422 268.7 285.171 0 1 0 L
+296.657 336.803 319.8 270.422 268.7 285.171 1 0 0 T
+319.8 270.422 296.657 336.803 0 1 0 L
+279.246 224.237 225.3 217.992 1 1 0 L
+277.612 222.376 0 0.482353 0.231373 P
+277.612 222.376 268.7 285.171 0 1 0 L
+268.7 285.171 277.612 222.376 0 1 0 L
+277.612 222.376 225.3 245.672 0 1 0 L
+277.612 222.376 225.3 245.672 268.7 285.171 1 0 0 T
+277.612 222.376 225.3 162.8 0 1 0 L
+225.3 245.672 277.612 222.376 0 1 0 L
+225.3 162.8 225.3 245.672 277.612 222.376 1 0 0 T
+225.3 162.8 277.612 222.376 0 1 0 L
+356.787 163.091 0 0.482353 0.231373 P
+356.787 163.091 297.85 153.204 0 1 0 L
+356.359 145.464 356.787 163.091 0 1 0 L
+297.85 153.204 356.359 145.464 356.787 163.091 1 0 0 T
+356.787 163.091 356.359 145.464 0 1 0 L
+414.905 160.202 356.787 163.091 0 1 0 L
+356.359 145.464 414.905 160.202 356.787 163.091 1 0 0 T
+297.85 153.204 356.787 163.091 0 1 0 L
+356.787 163.091 414.905 160.202 0 1 0 L
+765.824 26.6287 755 35 1 1 1 L
+755 63.6257 755 35 1 1 1 L
+782.979 38.2386 755 35 1 1 1 L
+(Z) 767.824 28.6287 1 1 1 9 /Helvetica S
+(Y) 757 65.6258 1 1 1 9 /Helvetica S
+(X) 784.979 40.2386 1 1 1 9 /Helvetica S
+256.636 138.565 225.3 162.8 1 1 0 L
+225.3 245.672 225.3 162.8 1 1 0 L
+350.646 65.8608 225.3 162.8 0 0 1 L
+225.3 494.286 225.3 162.8 0 0 1 L
+225.3 162.8 0.698039 0.713726 0.505882 P
+225.3 162.8 0 0.482353 0.231373 P
+225.3 162.8 0 0.482353 0.231373 P
+256.636 138.565 225.3 162.8 0 1 0 L
+225.3 162.8 245.538 200.67 0 1 0 L
+256.636 138.565 225.3 162.8 245.538 200.67 1 0 0 T
+245.538 200.67 225.3 162.8 0 1 0 L
+225.3 162.8 225.3 245.672 0 1 0 L
+225.3 162.8 225.3 245.672 245.538 200.67 1 0 0 T
+297.85 153.204 225.3 162.8 0 1 0 L
+225.3 162.8 256.636 138.565 0 1 0 L
+225.3 162.8 256.636 138.565 297.85 153.204 1 0 0 T
+225.3 162.8 297.85 153.204 0 1 0 L
+225.3 162.8 225.3 245.672 0 1 0 L
+576.905 344.696 0 0.482353 0.231373 P
+576.905 344.696 585.858 268.712 0 1 0 L
+585.858 406.832 576.905 344.696 0 1 0 L
+576.905 344.696 611.972 317.576 0 1 0 L
+585.858 268.712 576.905 344.696 0 1 0 L
+611.972 317.576 585.858 268.712 576.905 344.696 1 0 0 T
+576.905 344.696 585.858 406.832 0 1 0 L
+611.972 317.576 576.905 344.696 0 1 0 L
+585.858 406.832 611.972 317.576 576.905 344.696 1 0 0 T
+585.858 268.712 0 0.482353 0.231373 P
+585.858 268.712 593.672 210.389 0 1 0 L
+593.672 210.389 585.858 268.712 0 1 0 L
+585.858 268.712 611.972 224.839 0 1 0 L
+585.858 268.712 611.972 224.839 593.672 210.389 1 0 0 T
+611.972 224.839 585.858 268.712 0 1 0 L
+585.858 268.712 611.972 317.576 0 1 0 L
+585.858 268.712 611.972 317.576 611.972 224.839 1 0 0 T
+611.972 317.576 585.858 268.712 0 1 0 L
+593.672 210.389 0 0.482353 0.231373 P
+611.972 224.839 593.672 210.389 0 1 0 L
+593.672 210.389 611.972 224.839 0 1 0 L
+611.972 151.833 593.672 210.389 0 1 0 L
+611.972 224.839 611.972 151.833 593.672 210.389 1 0 0 T
+593.672 210.389 611.972 151.833 0 1 0 L
+491.358 161.091 0 0.482353 0.231373 P
+491.358 161.091 550.272 160.962 0 1 0 L
+550.272 160.962 491.358 161.091 0 1 0 L
+491.358 161.091 540.615 143.574 0 1 0 L
+491.358 161.091 540.615 143.574 550.272 160.962 1 0 0 T
+414.905 160.202 491.358 161.091 0 1 0 L
+540.615 143.574 491.358 161.091 0 1 0 L
+491.358 161.091 449.972 133.082 0 1 0 L
+491.358 161.091 449.972 133.082 540.615 143.574 1 0 0 T
+449.972 133.082 491.358 161.091 0 1 0 L
+491.358 161.091 414.905 160.202 0 1 0 L
+449.972 133.082 491.358 161.091 414.905 160.202 1 0 0 T
+550.272 160.962 0 0.482353 0.231373 P
+540.615 143.574 550.272 160.962 0 1 0 L
+550.272 160.962 540.615 143.574 0 1 0 L
+611.972 151.833 550.272 160.962 0 1 0 L
+540.615 143.574 611.972 151.833 550.272 160.962 1 0 0 T
+550.272 160.962 611.972 151.833 0 1 0 L
+414.905 160.202 0 0.482353 0.231373 P
+356.359 145.464 414.905 160.202 0 1 0 L
+414.905 160.202 356.359 145.464 0 1 0 L
+449.972 133.082 414.905 160.202 0 1 0 L
+356.359 145.464 449.972 133.082 414.905 160.202 1 0 0 T
+414.905 160.202 449.972 133.082 0 1 0 L
+434.602 474.11 0 0.482353 0.231373 P
+387.299 440.032 434.602 474.11 0 1 0 L
+434.602 474.11 468.299 522.413 0 1 0 L
+434.602 474.11 387.299 440.032 0 1 0 L
+387.299 513.038 434.602 474.11 0 1 0 L
+387.299 440.032 387.299 513.038 434.602 474.11 1 0 0 T
+434.602 474.11 387.299 513.038 0 1 0 L
+468.299 522.413 434.602 474.11 0 1 0 L
+387.299 513.038 468.299 522.413 434.602 474.11 1 0 0 T
+468.299 522.413 0 0.482353 0.231373 P
+468.299 522.413 0 0.482353 0.231373 P
+517.225 510.082 468.299 522.413 0 1 0 L
+468.299 522.413 451.392 505.528 0 1 0 L
+517.225 510.082 468.299 522.413 451.392 505.528 1 0 0 T
+451.392 505.528 468.299 522.413 0 1 0 L
+468.299 522.413 387.299 513.038 0 1 0 L
+468.299 522.413 387.299 513.038 451.392 505.528 1 0 0 T
+468.299 522.413 517.225 510.082 0 1 0 L
+387.299 513.038 468.299 522.413 0 1 0 L
+225.3 217.992 246.17 201.852 1 1 0 L
+569.537 462.616 0 0.482353 0.231373 P
+585.858 406.832 569.537 462.616 0 1 0 L
+569.537 462.616 593.672 453.069 0 1 0 L
+585.858 406.832 569.537 462.616 593.672 453.069 1 0 0 T
+593.672 453.069 569.537 462.616 0 1 0 L
+569.537 462.616 580.635 507.554 0 1 0 L
+569.537 462.616 580.635 507.554 593.672 453.069 1 0 0 T
+569.537 462.616 585.858 406.832 0 1 0 L
+580.635 507.554 569.537 462.616 0 1 0 L
+268.7 285.171 0 0.482353 0.231373 P
+268.7 285.171 296.657 336.803 0 1 0 L
+268.7 285.171 225.3 328.543 0 1 0 L
+296.657 336.803 268.7 285.171 0 1 0 L
+225.3 328.543 296.657 336.803 268.7 285.171 1 0 0 T
+225.3 245.672 268.7 285.171 0 1 0 L
+268.7 285.171 225.3 245.672 0 1 0 L
+225.3 328.543 268.7 285.171 0 1 0 L
+225.3 245.672 225.3 328.543 268.7 285.171 1 0 0 T
+387.299 440.032 0 0.482353 0.231373 P
+387.299 440.032 387.299 513.038 0 1 0 L
+339.997 463.159 387.299 440.032 0 1 0 L
+387.299 440.032 319.8 408.541 0 1 0 L
+387.299 440.032 319.8 408.541 339.997 463.159 1 0 0 T
+387.299 513.038 387.299 440.032 0 1 0 L
+387.299 440.032 339.997 463.159 0 1 0 L
+387.299 513.038 387.299 440.032 339.997 463.159 1 0 0 T
+319.8 408.541 387.299 440.032 0 1 0 L
+296.657 336.803 0 0.482353 0.231373 P
+319.8 408.541 296.657 336.803 0 1 0 L
+296.657 336.803 268.7 381.962 0 1 0 L
+319.8 408.541 296.657 336.803 268.7 381.962 1 0 0 T
+268.7 381.962 296.657 336.803 0 1 0 L
+296.657 336.803 225.3 328.543 0 1 0 L
+296.657 336.803 225.3 328.543 268.7 381.962 1 0 0 T
+225.3 328.543 296.657 336.803 0 1 0 L
+296.657 336.803 319.8 408.541 0 1 0 L
+225.3 245.672 0 0.482353 0.231373 P
+225.3 245.672 0 0.482353 0.231373 P
+245.538 200.67 225.3 245.672 0 1 0 L
+225.3 245.672 242.09 267.162 0 1 0 L
+245.538 200.67 225.3 245.672 242.09 267.162 1 0 0 T
+242.09 267.162 225.3 245.672 0 1 0 L
+225.3 245.672 225.3 328.543 0 1 0 L
+225.3 245.672 225.3 328.543 242.09 267.162 1 0 0 T
+225.3 245.672 245.538 200.67 0 1 0 L
+225.3 245.672 225.3 328.543 0 1 0 L
+222.166 275.691 225.3 264.981 1 1 0 L
+297.85 153.204 0 0.482353 0.231373 P
+297.85 153.204 356.359 145.464 0 1 0 L
+356.359 145.464 297.85 153.204 0 1 0 L
+297.85 153.204 313.073 133.507 0 1 0 L
+356.359 145.464 297.85 153.204 313.073 133.507 1 0 0 T
+313.073 133.507 297.85 153.204 0 1 0 L
+297.85 153.204 256.636 138.565 0 1 0 L
+297.85 153.204 256.636 138.565 313.073 133.507 1 0 0 T
+256.636 138.565 297.85 153.204 0 1 0 L
+246.17 146.66 300.116 152.904 1 1 0 L
+230.917 255.951 225.3 264.981 1 1 0 L
+225.3 264.981 217.2 272.33 1 1 0 L
+611.972 151.833 0 0.482353 0.231373 P
+611.972 151.833 0 0.482353 0.231373 P
+586.871 132.657 611.972 151.833 0 1 0 L
+611.972 151.833 540.615 143.574 0 1 0 L
+611.972 151.833 540.615 143.574 586.871 132.657 1 0 0 T
+643.308 127.599 611.972 151.833 0 1 0 L
+611.972 151.833 586.871 132.657 0 1 0 L
+643.308 127.599 611.972 151.833 586.871 132.657 1 0 0 T
+540.615 143.574 611.972 151.833 0 1 0 L
+630.272 182.084 611.972 151.833 0 1 0 L
+611.972 151.833 611.972 224.839 0 1 0 L
+611.972 151.833 611.972 224.839 630.272 182.084 1 0 0 T
+643.308 127.599 611.972 151.833 0 1 0 L
+611.972 151.833 630.272 182.084 0 1 0 L
+643.308 127.599 611.972 151.833 630.272 182.084 1 0 0 T
+611.972 224.839 611.972 151.833 0 1 0 L
+319.8 408.541 0 0.482353 0.231373 P
+277.612 446.82 319.8 408.541 0 1 0 L
+319.8 408.541 268.7 381.962 0 1 0 L
+277.612 446.82 319.8 408.541 268.7 381.962 1 0 0 T
+268.7 381.962 319.8 408.541 0 1 0 L
+339.997 463.159 319.8 408.541 0 1 0 L
+319.8 408.541 277.612 446.82 0 1 0 L
+319.8 408.541 277.612 446.82 339.997 463.159 1 0 0 T
+319.8 408.541 339.997 463.159 0 1 0 L
+387.299 513.038 0 0.482353 0.231373 P
+387.299 513.038 0 0.482353 0.231373 P
+451.392 505.528 387.299 513.038 0 1 0 L
+387.299 513.038 414.905 491.688 0 1 0 L
+387.299 513.038 414.905 491.688 451.392 505.528 1 0 0 T
+387.299 513.038 451.392 505.528 0 1 0 L
+414.905 491.688 387.299 513.038 0 1 0 L
+387.299 513.038 356.787 494.577 0 1 0 L
+414.905 491.688 387.299 513.038 356.787 494.577 1 0 0 T
+356.787 494.577 387.299 513.038 0 1 0 L
+387.299 513.038 306.3 503.662 0 1 0 L
+387.299 513.038 306.3 503.662 356.787 494.577 1 0 0 T
+339.997 463.159 387.299 513.038 0 1 0 L
+306.3 503.662 387.299 513.038 0 1 0 L
+387.299 513.038 339.997 463.159 0 1 0 L
+306.3 503.662 387.299 513.038 339.997 463.159 1 0 0 T
+585.858 406.832 0 0.482353 0.231373 P
+593.672 453.069 585.858 406.832 0 1 0 L
+611.972 410.314 585.858 406.832 0 1 0 L
+585.858 406.832 593.672 453.069 0 1 0 L
+611.972 410.314 585.858 406.832 593.672 453.069 1 0 0 T
+611.972 317.576 585.858 406.832 0 1 0 L
+585.858 406.832 611.972 410.314 0 1 0 L
+611.972 317.576 585.858 406.832 611.972 410.314 1 0 0 T
+585.858 406.832 611.972 317.576 0 1 0 L
+339.997 463.159 0 0.482353 0.231373 P
+277.612 446.82 339.997 463.159 0 1 0 L
+339.997 463.159 277.612 446.82 0 1 0 L
+306.3 503.662 339.997 463.159 0 1 0 L
+277.612 446.82 306.3 503.662 339.997 463.159 1 0 0 T
+339.997 463.159 306.3 503.662 0 1 0 L
+268.7 381.962 0 0.482353 0.231373 P
+268.7 381.962 277.612 446.82 0 1 0 L
+268.7 381.962 225.3 411.415 0 1 0 L
+277.612 446.82 268.7 381.962 0 1 0 L
+225.3 411.415 277.612 446.82 268.7 381.962 1 0 0 T
+225.3 328.543 268.7 381.962 0 1 0 L
+268.7 381.962 225.3 328.543 0 1 0 L
+225.3 411.415 268.7 381.962 0 1 0 L
+225.3 328.543 225.3 411.415 268.7 381.962 1 0 0 T
+246.17 201.852 246.17 146.66 1 1 0 L
+225.3 328.543 0 0.482353 0.231373 P
+225.3 328.543 0 0.482353 0.231373 P
+252.906 307.193 225.3 328.543 0 1 0 L
+225.3 328.543 242.09 363.953 0 1 0 L
+252.906 307.193 225.3 328.543 242.09 363.953 1 0 0 T
+242.09 363.953 225.3 328.543 0 1 0 L
+225.3 328.543 225.3 411.415 0 1 0 L
+225.3 328.543 225.3 411.415 242.09 363.953 1 0 0 T
+242.09 267.162 225.3 328.543 0 1 0 L
+225.3 328.543 252.906 307.193 0 1 0 L
+225.3 328.543 252.906 307.193 242.09 267.162 1 0 0 T
+225.3 328.543 242.09 267.162 0 1 0 L
+225.3 328.543 225.3 411.415 0 1 0 L
+517.225 510.082 0 0.482353 0.231373 P
+491.358 492.577 517.225 510.082 0 1 0 L
+517.225 510.082 451.392 505.528 0 1 0 L
+491.358 492.577 517.225 510.082 451.392 505.528 1 0 0 T
+451.392 505.528 517.225 510.082 0 1 0 L
+550.272 492.449 517.225 510.082 0 1 0 L
+517.225 510.082 491.358 492.577 0 1 0 L
+517.225 510.082 491.358 492.577 550.272 492.449 1 0 0 T
+580.635 507.554 517.225 510.082 0 1 0 L
+517.225 510.082 550.272 492.449 0 1 0 L
+580.635 507.554 517.225 510.082 550.272 492.449 1 0 0 T
+517.225 510.082 580.635 507.554 0 1 0 L
+356.359 145.464 0 0.482353 0.231373 P
+313.073 133.507 356.359 145.464 0 1 0 L
+359.33 122.59 356.359 145.464 0 1 0 L
+356.359 145.464 313.073 133.507 0 1 0 L
+359.33 122.59 356.359 145.464 313.073 133.507 1 0 0 T
+449.972 133.082 356.359 145.464 0 1 0 L
+356.359 145.464 359.33 122.59 0 1 0 L
+449.972 133.082 356.359 145.464 359.33 122.59 1 0 0 T
+356.359 145.464 449.972 133.082 0 1 0 L
+611.972 224.839 0 0.482353 0.231373 P
+630.272 182.084 611.972 224.839 0 1 0 L
+611.972 224.839 638.085 228.321 0 1 0 L
+611.972 224.839 638.085 228.321 630.272 182.084 1 0 0 T
+611.972 224.839 630.272 182.084 0 1 0 L
+611.972 224.839 611.972 317.576 0 1 0 L
+638.085 228.321 611.972 224.839 0 1 0 L
+611.972 317.576 638.085 228.321 611.972 224.839 1 0 0 T
+611.972 317.576 611.972 224.839 0 1 0 L
+540.615 143.574 0 0.482353 0.231373 P
+586.871 132.657 540.615 143.574 0 1 0 L
+540.615 143.574 543.586 120.699 0 1 0 L
+540.615 143.574 543.586 120.699 586.871 132.657 1 0 0 T
+540.615 143.574 586.871 132.657 0 1 0 L
+540.615 143.574 449.972 133.082 0 1 0 L
+543.586 120.699 540.615 143.574 0 1 0 L
+449.972 133.082 543.586 120.699 540.615 143.574 1 0 0 T
+449.972 133.082 540.615 143.574 0 1 0 L
+580.635 507.554 0 0.482353 0.231373 P
+580.635 507.554 0 0.482353 0.231373 P
+550.272 492.449 580.635 507.554 0 1 0 L
+611.972 483.32 580.635 507.554 0 1 0 L
+580.635 507.554 550.272 492.449 0 1 0 L
+611.972 483.32 580.635 507.554 550.272 492.449 1 0 0 T
+580.635 507.554 593.672 453.069 0 1 0 L
+593.672 453.069 580.635 507.554 0 1 0 L
+580.635 507.554 611.972 483.32 0 1 0 L
+580.635 507.554 611.972 483.32 593.672 453.069 1 0 0 T
+245.538 200.67 0 0.482353 0.231373 P
+261.859 231.21 245.538 200.67 0 1 0 L
+245.538 200.67 242.09 267.162 0 1 0 L
+261.859 231.21 245.538 200.67 242.09 267.162 1 0 0 T
+242.09 267.162 245.538 200.67 0 1 0 L
+269.673 172.886 245.538 200.67 0 1 0 L
+245.538 200.67 261.859 231.21 0 1 0 L
+245.538 200.67 261.859 231.21 269.673 172.886 1 0 0 T
+256.636 138.565 245.538 200.67 0 1 0 L
+245.538 200.67 269.673 172.886 0 1 0 L
+256.636 138.565 245.538 200.67 269.673 172.886 1 0 0 T
+245.538 200.67 256.636 138.565 0 1 0 L
+277.612 446.82 0 0.482353 0.231373 P
+225.3 411.415 277.612 446.82 0 1 0 L
+277.612 446.82 306.3 503.662 0 1 0 L
+277.612 446.82 225.3 411.415 0 1 0 L
+225.3 494.286 277.612 446.82 0 1 0 L
+225.3 411.415 225.3 494.286 277.612 446.82 1 0 0 T
+277.612 446.82 225.3 494.286 0 1 0 L
+306.3 503.662 277.612 446.82 0 1 0 L
+225.3 494.286 306.3 503.662 277.612 446.82 1 0 0 T
+451.392 505.528 0 0.482353 0.231373 P
+451.392 505.528 491.358 492.577 0 1 0 L
+451.392 505.528 414.905 491.688 0 1 0 L
+491.358 492.577 451.392 505.528 0 1 0 L
+414.905 491.688 491.358 492.577 451.392 505.528 1 0 0 T
+414.905 491.688 451.392 505.528 0 1 0 L
+306.3 503.662 0 0.482353 0.231373 P
+306.3 503.662 0 0.482353 0.231373 P
+356.787 494.577 306.3 503.662 0 1 0 L
+306.3 503.662 297.85 484.69 0 1 0 L
+306.3 503.662 297.85 484.69 356.787 494.577 1 0 0 T
+306.3 503.662 356.787 494.577 0 1 0 L
+297.85 484.69 306.3 503.662 0 1 0 L
+306.3 503.662 225.3 494.286 0 1 0 L
+306.3 503.662 225.3 494.286 297.85 484.69 1 0 0 T
+225.3 494.286 306.3 503.662 0 1 0 L
+256.636 138.565 0 0.482353 0.231373 P
+256.636 138.565 0 0.482353 0.231373 P
+269.673 172.886 256.636 138.565 0 1 0 L
+287.973 114.33 256.636 138.565 0 1 0 L
+256.636 138.565 269.673 172.886 0 1 0 L
+287.973 114.33 256.636 138.565 269.673 172.886 1 0 0 T
+256.636 138.565 313.073 133.507 0 1 0 L
+313.073 133.507 256.636 138.565 0 1 0 L
+256.636 138.565 287.973 114.33 0 1 0 L
+256.636 138.565 287.973 114.33 313.073 133.507 1 0 0 T
+225.3 411.415 0 0.482353 0.231373 P
+225.3 411.415 0 0.482353 0.231373 P
+242.09 363.953 225.3 411.415 0 1 0 L
+225.3 411.415 245.538 425.113 0 1 0 L
+225.3 411.415 245.538 425.113 242.09 363.953 1 0 0 T
+225.3 411.415 242.09 363.953 0 1 0 L
+245.538 425.113 225.3 411.415 0 1 0 L
+225.3 411.415 225.3 494.286 0 1 0 L
+225.3 411.415 225.3 494.286 245.538 425.113 1 0 0 T
+225.3 411.415 225.3 494.286 0 1 0 L
+242.09 267.162 0 0.482353 0.231373 P
+242.09 267.162 261.859 231.21 0 1 0 L
+242.09 267.162 252.906 307.193 0 1 0 L
+261.859 231.21 242.09 267.162 0 1 0 L
+252.906 307.193 261.859 231.21 242.09 267.162 1 0 0 T
+252.906 307.193 242.09 267.162 0 1 0 L
+593.672 453.069 0 0.482353 0.231373 P
+593.672 453.069 611.972 410.314 0 1 0 L
+593.672 453.069 611.972 483.32 0 1 0 L
+611.972 410.314 593.672 453.069 0 1 0 L
+611.972 483.32 611.972 410.314 593.672 453.069 1 0 0 T
+611.972 483.32 593.672 453.069 0 1 0 L
+611.972 317.576 0 0.482353 0.231373 P
+611.972 317.576 638.085 228.321 0 1 0 L
+638.085 228.321 611.972 317.576 0 1 0 L
+611.972 317.576 647.039 290.457 0 1 0 L
+638.085 228.321 611.972 317.576 647.039 290.457 1 0 0 T
+647.039 290.457 611.972 317.576 0 1 0 L
+611.972 317.576 638.085 366.44 0 1 0 L
+611.972 317.576 638.085 366.44 647.039 290.457 1 0 0 T
+638.085 366.44 611.972 317.576 0 1 0 L
+611.972 317.576 611.972 410.314 0 1 0 L
+638.085 366.44 611.972 317.576 611.972 410.314 1 0 0 T
+611.972 410.314 611.972 317.576 0 1 0 L
+272.038 125.569 267.071 122.208 1 1 0 L
+267.071 122.208 260.804 143.629 1 1 0 L
+260.804 143.629 255.838 140.268 1 1 0 L
+313.073 133.507 0 0.482353 0.231373 P
+313.073 133.507 359.33 122.59 0 1 0 L
+313.073 133.507 287.973 114.33 0 1 0 L
+359.33 122.59 313.073 133.507 0 1 0 L
+287.973 114.33 359.33 122.59 313.073 133.507 1 0 0 T
+287.973 114.33 313.073 133.507 0 1 0 L
+630.272 182.084 0 0.482353 0.231373 P
+630.272 182.084 638.085 228.321 0 1 0 L
+654.406 172.537 630.272 182.084 0 1 0 L
+638.085 228.321 654.406 172.537 630.272 182.084 1 0 0 T
+638.085 228.321 630.272 182.084 0 1 0 L
+630.272 182.084 654.406 172.537 0 1 0 L
+643.308 127.599 630.272 182.084 0 1 0 L
+654.406 172.537 643.308 127.599 630.272 182.084 1 0 0 T
+630.272 182.084 643.308 127.599 0 1 0 L
+449.972 133.082 0 0.482353 0.231373 P
+408.586 105.073 449.972 133.082 0 1 0 L
+449.972 133.082 359.33 122.59 0 1 0 L
+408.586 105.073 449.972 133.082 359.33 122.59 1 0 0 T
+359.33 122.59 449.972 133.082 0 1 0 L
+485.039 105.962 449.972 133.082 0 1 0 L
+449.972 133.082 408.586 105.073 0 1 0 L
+449.972 133.082 408.586 105.073 485.039 105.962 1 0 0 T
+543.586 120.699 449.972 133.082 0 1 0 L
+449.972 133.082 485.039 105.962 0 1 0 L
+543.586 120.699 449.972 133.082 485.039 105.962 1 0 0 T
+449.972 133.082 543.586 120.699 0 1 0 L
+586.871 132.657 0 0.482353 0.231373 P
+586.871 132.657 543.586 120.699 0 1 0 L
+602.094 112.96 586.871 132.657 0 1 0 L
+543.586 120.699 602.094 112.96 586.871 132.657 1 0 0 T
+543.586 120.699 586.871 132.657 0 1 0 L
+586.871 132.657 602.094 112.96 0 1 0 L
+643.308 127.599 586.871 132.657 0 1 0 L
+602.094 112.96 643.308 127.599 586.871 132.657 1 0 0 T
+586.871 132.657 643.308 127.599 0 1 0 L
+356.787 494.577 0 0.482353 0.231373 P
+356.787 494.577 297.85 484.69 0 1 0 L
+356.359 476.951 356.787 494.577 0 1 0 L
+297.85 484.69 356.359 476.951 356.787 494.577 1 0 0 T
+356.787 494.577 356.359 476.951 0 1 0 L
+414.905 491.688 356.787 494.577 0 1 0 L
+356.359 476.951 414.905 491.688 356.787 494.577 1 0 0 T
+356.787 494.577 414.905 491.688 0 1 0 L
+297.85 484.69 356.787 494.577 0 1 0 L
+350.646 397.347 225.3 494.286 0 0 1 L
+225.3 494.286 0.698039 0.713726 0.505882 P
+225.3 494.286 0 0.482353 0.231373 P
+225.3 494.286 0 0.482353 0.231373 P
+297.85 484.69 225.3 494.286 0 1 0 L
+225.3 494.286 256.636 470.051 0 1 0 L
+225.3 494.286 256.636 470.051 297.85 484.69 1 0 0 T
+225.3 494.286 297.85 484.69 0 1 0 L
+245.538 425.113 225.3 494.286 0 1 0 L
+225.3 494.286 256.636 470.051 0 1 0 L
+225.3 494.286 256.636 470.051 245.538 425.113 1 0 0 T
+225.3 494.286 245.538 425.113 0 1 0 L
+242.09 363.953 0 0.482353 0.231373 P
+242.09 363.953 245.538 425.113 0 1 0 L
+261.859 369.329 242.09 363.953 0 1 0 L
+245.538 425.113 261.859 369.329 242.09 363.953 1 0 0 T
+242.09 363.953 261.859 369.329 0 1 0 L
+252.906 307.193 242.09 363.953 0 1 0 L
+261.859 369.329 252.906 307.193 242.09 363.953 1 0 0 T
+245.538 425.113 242.09 363.953 0 1 0 L
+242.09 363.953 252.906 307.193 0 1 0 L
+491.358 492.577 0 0.482353 0.231373 P
+414.905 491.688 491.358 492.577 0 1 0 L
+491.358 492.577 550.272 492.449 0 1 0 L
+550.272 492.449 491.358 492.577 0 1 0 L
+491.358 492.577 540.615 475.06 0 1 0 L
+491.358 492.577 540.615 475.06 550.272 492.449 1 0 0 T
+540.615 475.06 491.358 492.577 0 1 0 L
+491.358 492.577 449.972 464.568 0 1 0 L
+491.358 492.577 449.972 464.568 540.615 475.06 1 0 0 T
+449.972 464.568 491.358 492.577 0 1 0 L
+491.358 492.577 414.905 491.688 0 1 0 L
+449.972 464.568 491.358 492.577 414.905 491.688 1 0 0 T
+550.272 492.449 0 0.482353 0.231373 P
+540.615 475.06 550.272 492.449 0 1 0 L
+550.272 492.449 540.615 475.06 0 1 0 L
+611.972 483.32 550.272 492.449 0 1 0 L
+540.615 475.06 611.972 483.32 550.272 492.449 1 0 0 T
+550.272 492.449 611.972 483.32 0 1 0 L
+414.905 491.688 0 0.482353 0.231373 P
+356.359 476.951 414.905 491.688 0 1 0 L
+414.905 491.688 449.972 464.568 0 1 0 L
+414.905 491.688 356.359 476.951 0 1 0 L
+449.972 464.568 414.905 491.688 0 1 0 L
+356.359 476.951 449.972 464.568 414.905 491.688 1 0 0 T
+643.308 127.599 0 0.482353 0.231373 P
+643.308 127.599 0 0.482353 0.231373 P
+602.094 112.96 643.308 127.599 0 1 0 L
+674.644 103.364 643.308 127.599 0 1 0 L
+643.308 127.599 602.094 112.96 0 1 0 L
+674.644 103.364 643.308 127.599 602.094 112.96 1 0 0 T
+654.406 172.537 643.308 127.599 0 1 0 L
+674.644 103.364 643.308 127.599 0 1 0 L
+643.308 127.599 654.406 172.537 0 1 0 L
+674.644 103.364 643.308 127.599 654.406 172.537 1 0 0 T
+611.972 410.314 0 0.482353 0.231373 P
+638.085 366.44 611.972 410.314 0 1 0 L
+611.972 410.314 630.272 424.764 0 1 0 L
+638.085 366.44 611.972 410.314 630.272 424.764 1 0 0 T
+630.272 424.764 611.972 410.314 0 1 0 L
+611.972 410.314 611.972 483.32 0 1 0 L
+611.972 410.314 611.972 483.32 630.272 424.764 1 0 0 T
+611.972 483.32 611.972 410.314 0 1 0 L
+611.972 410.314 638.085 366.44 0 1 0 L
+252.906 307.193 0 0.482353 0.231373 P
+261.859 369.329 252.906 307.193 0 1 0 L
+252.906 307.193 261.859 231.21 0 1 0 L
+252.906 307.193 261.859 369.329 0 1 0 L
+287.973 280.073 252.906 307.193 0 1 0 L
+261.859 369.329 287.973 280.073 252.906 307.193 1 0 0 T
+252.906 307.193 287.973 280.073 0 1 0 L
+261.859 231.21 252.906 307.193 0 1 0 L
+287.973 280.073 261.859 231.21 252.906 307.193 1 0 0 T
+261.859 231.21 0 0.482353 0.231373 P
+261.859 231.21 269.673 172.886 0 1 0 L
+269.673 172.886 261.859 231.21 0 1 0 L
+261.859 231.21 287.973 187.336 0 1 0 L
+261.859 231.21 287.973 187.336 269.673 172.886 1 0 0 T
+287.973 187.336 261.859 231.21 0 1 0 L
+261.859 231.21 287.973 280.073 0 1 0 L
+261.859 231.21 287.973 280.073 287.973 187.336 1 0 0 T
+287.973 280.073 261.859 231.21 0 1 0 L
+269.673 172.886 0 0.482353 0.231373 P
+287.973 187.336 269.673 172.886 0 1 0 L
+269.673 172.886 287.973 187.336 0 1 0 L
+287.973 114.33 269.673 172.886 0 1 0 L
+287.973 187.336 287.973 114.33 269.673 172.886 1 0 0 T
+269.673 172.886 287.973 114.33 0 1 0 L
+359.33 122.59 0 0.482353 0.231373 P
+408.586 105.073 359.33 122.59 0 1 0 L
+359.33 122.59 349.673 105.201 0 1 0 L
+408.586 105.073 359.33 122.59 349.673 105.201 1 0 0 T
+349.673 105.201 359.33 122.59 0 1 0 L
+359.33 122.59 287.973 114.33 0 1 0 L
+359.33 122.59 287.973 114.33 349.673 105.201 1 0 0 T
+287.973 114.33 359.33 122.59 0 1 0 L
+359.33 122.59 408.586 105.073 0 1 0 L
+638.085 228.321 0 0.482353 0.231373 P
+638.085 228.321 654.406 172.537 0 1 0 L
+654.406 172.537 638.085 228.321 0 1 0 L
+638.085 228.321 657.854 233.697 0 1 0 L
+654.406 172.537 638.085 228.321 657.854 233.697 1 0 0 T
+657.854 233.697 638.085 228.321 0 1 0 L
+638.085 228.321 647.039 290.457 0 1 0 L
+638.085 228.321 647.039 290.457 657.854 233.697 1 0 0 T
+647.039 290.457 638.085 228.321 0 1 0 L
+543.586 120.699 0 0.482353 0.231373 P
+543.586 120.699 602.094 112.96 0 1 0 L
+602.094 112.96 543.586 120.699 0 1 0 L
+543.586 120.699 543.157 103.073 0 1 0 L
+602.094 112.96 543.586 120.699 543.157 103.073 1 0 0 T
+543.157 103.073 543.586 120.699 0 1 0 L
+543.586 120.699 485.039 105.962 0 1 0 L
+543.586 120.699 485.039 105.962 543.157 103.073 1 0 0 T
+485.039 105.962 543.586 120.699 0 1 0 L
+297.85 484.69 0 0.482353 0.231373 P
+297.85 484.69 356.359 476.951 0 1 0 L
+356.359 476.951 297.85 484.69 0 1 0 L
+297.85 484.69 313.073 464.993 0 1 0 L
+356.359 476.951 297.85 484.69 313.073 464.993 1 0 0 T
+313.073 464.993 297.85 484.69 0 1 0 L
+297.85 484.69 256.636 470.051 0 1 0 L
+297.85 484.69 256.636 470.051 313.073 464.993 1 0 0 T
+256.636 470.051 297.85 484.69 0 1 0 L
+245.538 425.113 0 0.482353 0.231373 P
+245.538 425.113 261.859 369.329 0 1 0 L
+261.859 369.329 245.538 425.113 0 1 0 L
+245.538 425.113 269.673 415.566 0 1 0 L
+261.859 369.329 245.538 425.113 269.673 415.566 1 0 0 T
+269.673 415.566 245.538 425.113 0 1 0 L
+245.538 425.113 256.636 470.051 0 1 0 L
+245.538 425.113 256.636 470.051 269.673 415.566 1 0 0 T
+256.636 470.051 245.538 425.113 0 1 0 L
+611.972 483.32 0 0.482353 0.231373 P
+611.972 483.32 0 0.482353 0.231373 P
+586.871 464.143 611.972 483.32 0 1 0 L
+611.972 483.32 540.615 475.06 0 1 0 L
+611.972 483.32 540.615 475.06 586.871 464.143 1 0 0 T
+643.308 459.085 611.972 483.32 0 1 0 L
+611.972 483.32 586.871 464.143 0 1 0 L
+643.308 459.085 611.972 483.32 586.871 464.143 1 0 0 T
+540.615 475.06 611.972 483.32 0 1 0 L
+611.972 483.32 630.272 424.764 0 1 0 L
+630.272 424.764 611.972 483.32 0 1 0 L
+611.972 483.32 643.308 459.085 0 1 0 L
+611.972 483.32 643.308 459.085 630.272 424.764 1 0 0 T
+287.973 114.33 0 0.482353 0.231373 P
+287.973 114.33 0 0.482353 0.231373 P
+306.273 144.581 287.973 114.33 0 1 0 L
+287.973 114.33 287.973 187.336 0 1 0 L
+287.973 114.33 287.973 187.336 306.273 144.581 1 0 0 T
+319.309 90.0956 287.973 114.33 0 1 0 L
+287.973 114.33 306.273 144.581 0 1 0 L
+319.309 90.0956 287.973 114.33 306.273 144.581 1 0 0 T
+287.973 187.336 287.973 114.33 0 1 0 L
+287.973 114.33 349.673 105.201 0 1 0 L
+349.673 105.201 287.973 114.33 0 1 0 L
+287.973 114.33 319.309 90.0956 0 1 0 L
+287.973 114.33 319.309 90.0956 349.673 105.201 1 0 0 T
+654.406 172.537 0 0.482353 0.231373 P
+657.854 233.697 654.406 172.537 0 1 0 L
+674.644 186.235 654.406 172.537 0 1 0 L
+654.406 172.537 657.854 233.697 0 1 0 L
+674.644 186.235 654.406 172.537 657.854 233.697 1 0 0 T
+654.406 172.537 674.644 103.364 0 1 0 L
+654.406 172.537 674.644 186.235 0 1 0 L
+674.644 103.364 654.406 172.537 0 1 0 L
+674.644 186.235 674.644 103.364 654.406 172.537 1 0 0 T
+602.094 112.96 0 0.482353 0.231373 P
+543.157 103.073 602.094 112.96 0 1 0 L
+593.645 93.988 602.094 112.96 0 1 0 L
+602.094 112.96 543.157 103.073 0 1 0 L
+593.645 93.988 602.094 112.96 543.157 103.073 1 0 0 T
+602.094 112.96 674.644 103.364 0 1 0 L
+602.094 112.96 593.645 93.988 0 1 0 L
+674.644 103.364 602.094 112.96 0 1 0 L
+593.645 93.988 674.644 103.364 602.094 112.96 1 0 0 T
+356.359 476.951 0 0.482353 0.231373 P
+313.073 464.993 356.359 476.951 0 1 0 L
+359.33 454.076 356.359 476.951 0 1 0 L
+356.359 476.951 313.073 464.993 0 1 0 L
+359.33 454.076 356.359 476.951 313.073 464.993 1 0 0 T
+449.972 464.568 356.359 476.951 0 1 0 L
+356.359 476.951 359.33 454.076 0 1 0 L
+449.972 464.568 356.359 476.951 359.33 454.076 1 0 0 T
+356.359 476.951 449.972 464.568 0 1 0 L
+261.859 369.329 0 0.482353 0.231373 P
+269.673 415.566 261.859 369.329 0 1 0 L
+287.973 372.811 261.859 369.329 0 1 0 L
+261.859 369.329 269.673 415.566 0 1 0 L
+287.973 372.811 261.859 369.329 269.673 415.566 1 0 0 T
+287.973 280.073 261.859 369.329 0 1 0 L
+261.859 369.329 287.973 372.811 0 1 0 L
+287.973 280.073 261.859 369.329 287.973 372.811 1 0 0 T
+261.859 369.329 287.973 280.073 0 1 0 L
+540.615 475.06 0 0.482353 0.231373 P
+586.871 464.143 540.615 475.06 0 1 0 L
+540.615 475.06 543.586 452.185 0 1 0 L
+540.615 475.06 543.586 452.185 586.871 464.143 1 0 0 T
+540.615 475.06 586.871 464.143 0 1 0 L
+540.615 475.06 449.972 464.568 0 1 0 L
+543.586 452.185 540.615 475.06 0 1 0 L
+449.972 464.568 543.586 452.185 540.615 475.06 1 0 0 T
+449.972 464.568 540.615 475.06 0 1 0 L
+630.272 424.764 0 0.482353 0.231373 P
+630.272 424.764 654.406 396.98 0 1 0 L
+638.085 366.44 630.272 424.764 0 1 0 L
+654.406 396.98 638.085 366.44 630.272 424.764 1 0 0 T
+630.272 424.764 638.085 366.44 0 1 0 L
+630.272 424.764 643.308 459.085 0 1 0 L
+654.406 396.98 630.272 424.764 0 1 0 L
+643.308 459.085 654.406 396.98 630.272 424.764 1 0 0 T
+643.308 459.085 630.272 424.764 0 1 0 L
+638.085 366.44 0 0.482353 0.231373 P
+654.406 396.98 638.085 366.44 0 1 0 L
+657.854 330.487 638.085 366.44 0 1 0 L
+638.085 366.44 654.406 396.98 0 1 0 L
+638.085 366.44 654.406 396.98 657.854 330.487 1 0 0 T
+647.039 290.457 638.085 366.44 0 1 0 L
+638.085 366.44 657.854 330.487 0 1 0 L
+647.039 290.457 638.085 366.44 657.854 330.487 1 0 0 T
+638.085 366.44 647.039 290.457 0 1 0 L
+647.039 290.457 0 0.482353 0.231373 P
+647.039 290.457 657.854 233.697 0 1 0 L
+657.854 233.697 647.039 290.457 0 1 0 L
+647.039 290.457 674.644 269.107 0 1 0 L
+647.039 290.457 674.644 269.107 657.854 233.697 1 0 0 T
+657.854 330.487 647.039 290.457 0 1 0 L
+674.644 269.107 647.039 290.457 0 1 0 L
+647.039 290.457 657.854 330.487 0 1 0 L
+674.644 269.107 647.039 290.457 657.854 330.487 1 0 0 T
+287.973 187.336 0 0.482353 0.231373 P
+306.273 144.581 287.973 187.336 0 1 0 L
+287.973 187.336 314.087 190.818 0 1 0 L
+287.973 187.336 314.087 190.818 306.273 144.581 1 0 0 T
+287.973 187.336 306.273 144.581 0 1 0 L
+287.973 187.336 287.973 280.073 0 1 0 L
+314.087 190.818 287.973 187.336 0 1 0 L
+287.973 280.073 314.087 190.818 287.973 187.336 1 0 0 T
+287.973 280.073 287.973 187.336 0 1 0 L
+256.636 470.051 0 0.482353 0.231373 P
+256.636 470.051 0 0.482353 0.231373 P
+256.636 470.051 313.073 464.993 0 1 0 L
+313.073 464.993 256.636 470.051 0 1 0 L
+256.636 470.051 287.973 445.817 0 1 0 L
+256.636 470.051 287.973 445.817 313.073 464.993 1 0 0 T
+256.636 470.051 269.673 415.566 0 1 0 L
+269.673 415.566 256.636 470.051 0 1 0 L
+256.636 470.051 287.973 445.817 0 1 0 L
+256.636 470.051 287.973 445.817 269.673 415.566 1 0 0 T
+485.039 105.962 0 0.482353 0.231373 P
+448.552 92.1222 485.039 105.962 0 1 0 L
+485.039 105.962 408.586 105.073 0 1 0 L
+485.039 105.962 408.586 105.073 448.552 92.1222 1 0 0 T
+512.645 84.6123 485.039 105.962 0 1 0 L
+485.039 105.962 448.552 92.1222 0 1 0 L
+512.645 84.6123 485.039 105.962 448.552 92.1222 1 0 0 T
+485.039 105.962 543.157 103.073 0 1 0 L
+543.157 103.073 485.039 105.962 0 1 0 L
+485.039 105.962 512.645 84.6123 0 1 0 L
+485.039 105.962 512.645 84.6123 543.157 103.073 1 0 0 T
+408.586 105.073 485.039 105.962 0 1 0 L
+349.673 105.201 0 0.482353 0.231373 P
+349.673 105.201 382.72 87.5676 0 1 0 L
+408.586 105.073 349.673 105.201 0 1 0 L
+382.72 87.5676 408.586 105.073 349.673 105.201 1 0 0 T
+349.673 105.201 408.586 105.073 0 1 0 L
+349.673 105.201 319.309 90.0956 0 1 0 L
+382.72 87.5676 349.673 105.201 0 1 0 L
+319.309 90.0956 382.72 87.5676 349.673 105.201 1 0 0 T
+319.309 90.0956 349.673 105.201 0 1 0 L
+408.586 105.073 0 0.482353 0.231373 P
+382.72 87.5676 408.586 105.073 0 1 0 L
+448.552 92.1222 408.586 105.073 0 1 0 L
+408.586 105.073 382.72 87.5676 0 1 0 L
+408.586 105.073 382.72 87.5676 448.552 92.1222 1 0 0 T
+408.586 105.073 448.552 92.1222 0 1 0 L
+657.854 233.697 0 0.482353 0.231373 P
+657.854 233.697 674.644 186.235 0 1 0 L
+674.644 269.107 657.854 233.697 0 1 0 L
+657.854 233.697 674.644 269.107 0 1 0 L
+674.644 186.235 657.854 233.697 0 1 0 L
+674.644 269.107 674.644 186.235 657.854 233.697 1 0 0 T
+350.646 65.8608 674.644 103.364 0 0 1 L
+674.644 103.364 674.644 434.85 0 0 1 L
+674.644 103.364 0.698039 0.713726 0.505882 P
+674.644 103.364 0 0.482353 0.231373 P
+674.644 103.364 0 0.482353 0.231373 P
+674.644 103.364 0 0.482353 0.231373 P
+622.332 150.83 674.644 103.364 0 1 0 L
+674.644 103.364 593.645 93.988 0 1 0 L
+674.644 103.364 593.645 93.988 622.332 150.83 1 0 0 T
+674.644 186.235 674.644 103.364 0 1 0 L
+674.644 103.364 622.332 150.83 0 1 0 L
+674.644 186.235 674.644 103.364 622.332 150.83 1 0 0 T
+593.645 93.988 674.644 103.364 0 1 0 L
+674.644 186.235 674.644 103.364 0 1 0 L
+543.157 103.073 0 0.482353 0.231373 P
+512.645 84.6123 543.157 103.073 0 1 0 L
+543.157 103.073 593.645 93.988 0 1 0 L
+543.157 103.073 512.645 84.6123 0 1 0 L
+593.645 93.988 543.157 103.073 0 1 0 L
+512.645 84.6123 593.645 93.988 543.157 103.073 1 0 0 T
+313.073 464.993 0 0.482353 0.231373 P
+313.073 464.993 359.33 454.076 0 1 0 L
+313.073 464.993 287.973 445.817 0 1 0 L
+359.33 454.076 313.073 464.993 0 1 0 L
+287.973 445.817 359.33 454.076 313.073 464.993 1 0 0 T
+287.973 445.817 313.073 464.993 0 1 0 L
+449.972 464.568 0 0.482353 0.231373 P
+543.586 452.185 449.972 464.568 0 1 0 L
+449.972 464.568 485.039 437.448 0 1 0 L
+543.586 452.185 449.972 464.568 485.039 437.448 1 0 0 T
+485.039 437.448 449.972 464.568 0 1 0 L
+449.972 464.568 408.586 436.559 0 1 0 L
+449.972 464.568 408.586 436.559 485.039 437.448 1 0 0 T
+449.972 464.568 543.586 452.185 0 1 0 L
+408.586 436.559 449.972 464.568 0 1 0 L
+449.972 464.568 359.33 454.076 0 1 0 L
+408.586 436.559 449.972 464.568 359.33 454.076 1 0 0 T
+359.33 454.076 449.972 464.568 0 1 0 L
+269.673 415.566 0 0.482353 0.231373 P
+269.673 415.566 287.973 372.811 0 1 0 L
+269.673 415.566 287.973 445.817 0 1 0 L
+287.973 372.811 269.673 415.566 0 1 0 L
+287.973 445.817 287.973 372.811 269.673 415.566 1 0 0 T
+287.973 445.817 269.673 415.566 0 1 0 L
+586.871 464.143 0 0.482353 0.231373 P
+586.871 464.143 543.586 452.185 0 1 0 L
+602.094 444.446 586.871 464.143 0 1 0 L
+543.586 452.185 602.094 444.446 586.871 464.143 1 0 0 T
+543.586 452.185 586.871 464.143 0 1 0 L
+586.871 464.143 602.094 444.446 0 1 0 L
+643.308 459.085 586.871 464.143 0 1 0 L
+602.094 444.446 643.308 459.085 586.871 464.143 1 0 0 T
+586.871 464.143 643.308 459.085 0 1 0 L
+287.973 280.073 0 0.482353 0.231373 P
+323.04 252.954 287.973 280.073 0 1 0 L
+287.973 280.073 314.087 328.937 0 1 0 L
+287.973 280.073 314.087 328.937 323.04 252.954 1 0 0 T
+314.087 190.818 287.973 280.073 0 1 0 L
+287.973 280.073 323.04 252.954 0 1 0 L
+314.087 190.818 287.973 280.073 323.04 252.954 1 0 0 T
+314.087 328.937 287.973 280.073 0 1 0 L
+287.973 280.073 287.973 372.811 0 1 0 L
+314.087 328.937 287.973 280.073 287.973 372.811 1 0 0 T
+287.973 372.811 287.973 280.073 0 1 0 L
+287.973 280.073 314.087 190.818 0 1 0 L
+306.273 144.581 0 0.482353 0.231373 P
+306.273 144.581 314.087 190.818 0 1 0 L
+330.408 135.034 306.273 144.581 0 1 0 L
+314.087 190.818 330.408 135.034 306.273 144.581 1 0 0 T
+314.087 190.818 306.273 144.581 0 1 0 L
+306.273 144.581 330.408 135.034 0 1 0 L
+319.309 90.0956 306.273 144.581 0 1 0 L
+330.408 135.034 319.309 90.0956 306.273 144.581 1 0 0 T
+306.273 144.581 319.309 90.0956 0 1 0 L
+657.854 330.487 0 0.482353 0.231373 P
+654.406 396.98 657.854 330.487 0 1 0 L
+657.854 330.487 674.644 269.107 0 1 0 L
+657.854 330.487 654.406 396.98 0 1 0 L
+674.644 351.978 657.854 330.487 0 1 0 L
+654.406 396.98 674.644 351.978 657.854 330.487 1 0 0 T
+657.854 330.487 674.644 351.978 0 1 0 L
+674.644 269.107 657.854 330.487 0 1 0 L
+674.644 351.978 674.644 269.107 657.854 330.487 1 0 0 T
+674.644 186.235 0 0.482353 0.231373 P
+674.644 186.235 0 0.482353 0.231373 P
+631.244 215.688 674.644 186.235 0 1 0 L
+674.644 186.235 622.332 150.83 0 1 0 L
+674.644 186.235 622.332 150.83 631.244 215.688 1 0 0 T
+674.644 269.107 674.644 186.235 0 1 0 L
+674.644 186.235 631.244 215.688 0 1 0 L
+674.644 269.107 674.644 186.235 631.244 215.688 1 0 0 T
+622.332 150.83 674.644 186.235 0 1 0 L
+674.644 269.107 674.644 186.235 0 1 0 L
+643.308 459.085 0 0.482353 0.231373 P
+643.308 459.085 0 0.482353 0.231373 P
+602.094 444.446 643.308 459.085 0 1 0 L
+674.644 434.85 643.308 459.085 0 1 0 L
+643.308 459.085 602.094 444.446 0 1 0 L
+674.644 434.85 643.308 459.085 602.094 444.446 1 0 0 T
+643.308 459.085 654.406 396.98 0 1 0 L
+654.406 396.98 643.308 459.085 0 1 0 L
+643.308 459.085 674.644 434.85 0 1 0 L
+643.308 459.085 674.644 434.85 654.406 396.98 1 0 0 T
+593.645 93.988 0 0.482353 0.231373 P
+593.645 93.988 0 0.482353 0.231373 P
+622.332 150.83 593.645 93.988 0 1 0 L
+593.645 93.988 559.947 134.491 0 1 0 L
+622.332 150.83 593.645 93.988 559.947 134.491 1 0 0 T
+559.947 134.491 593.645 93.988 0 1 0 L
+593.645 93.988 512.645 84.6123 0 1 0 L
+593.645 93.988 512.645 84.6123 559.947 134.491 1 0 0 T
+593.645 93.988 622.332 150.83 0 1 0 L
+512.645 84.6123 593.645 93.988 0 1 0 L
+448.552 92.1222 0 0.482353 0.231373 P
+382.72 87.5676 448.552 92.1222 0 1 0 L
+448.552 92.1222 382.72 87.5676 0 1 0 L
+431.645 75.2365 448.552 92.1222 0 1 0 L
+382.72 87.5676 431.645 75.2365 448.552 92.1222 1 0 0 T
+448.552 92.1222 512.645 84.6123 0 1 0 L
+448.552 92.1222 431.645 75.2365 0 1 0 L
+512.645 84.6123 448.552 92.1222 0 1 0 L
+431.645 75.2365 512.645 84.6123 448.552 92.1222 1 0 0 T
+622.332 150.83 0 0.482353 0.231373 P
+631.244 215.688 622.332 150.83 0 1 0 L
+622.332 150.83 580.145 189.109 0 1 0 L
+622.332 150.83 580.145 189.109 631.244 215.688 1 0 0 T
+622.332 150.83 631.244 215.688 0 1 0 L
+580.145 189.109 622.332 150.83 0 1 0 L
+622.332 150.83 559.947 134.491 0 1 0 L
+580.145 189.109 622.332 150.83 559.947 134.491 1 0 0 T
+559.947 134.491 622.332 150.83 0 1 0 L
+654.406 396.98 0 0.482353 0.231373 P
+654.406 396.98 674.644 351.978 0 1 0 L
+674.644 434.85 654.406 396.98 0 1 0 L
+654.406 396.98 674.644 434.85 0 1 0 L
+674.644 351.978 654.406 396.98 0 1 0 L
+674.644 434.85 674.644 351.978 654.406 396.98 1 0 0 T
+319.309 90.0956 0 0.482353 0.231373 P
+319.309 90.0956 0 0.482353 0.231373 P
+330.408 135.034 319.309 90.0956 0 1 0 L
+350.646 65.8608 319.309 90.0956 0 1 0 L
+319.309 90.0956 330.408 135.034 0 1 0 L
+350.646 65.8608 319.309 90.0956 330.408 135.034 1 0 0 T
+319.309 90.0956 382.72 87.5676 0 1 0 L
+382.72 87.5676 319.309 90.0956 0 1 0 L
+319.309 90.0956 350.646 65.8608 0 1 0 L
+319.309 90.0956 350.646 65.8608 382.72 87.5676 1 0 0 T
+359.33 454.076 0 0.482353 0.231373 P
+408.586 436.559 359.33 454.076 0 1 0 L
+359.33 454.076 349.673 436.688 0 1 0 L
+408.586 436.559 359.33 454.076 349.673 436.688 1 0 0 T
+349.673 436.688 359.33 454.076 0 1 0 L
+359.33 454.076 287.973 445.817 0 1 0 L
+359.33 454.076 287.973 445.817 349.673 436.688 1 0 0 T
+287.973 445.817 359.33 454.076 0 1 0 L
+359.33 454.076 408.586 436.559 0 1 0 L
+287.973 372.811 0 0.482353 0.231373 P
+314.087 328.937 287.973 372.811 0 1 0 L
+287.973 372.811 306.273 387.261 0 1 0 L
+314.087 328.937 287.973 372.811 306.273 387.261 1 0 0 T
+306.273 387.261 287.973 372.811 0 1 0 L
+287.973 372.811 287.973 445.817 0 1 0 L
+287.973 372.811 287.973 445.817 306.273 387.261 1 0 0 T
+287.973 445.817 287.973 372.811 0 1 0 L
+287.973 372.811 314.087 328.937 0 1 0 L
+543.586 452.185 0 0.482353 0.231373 P
+543.586 452.185 602.094 444.446 0 1 0 L
+602.094 444.446 543.586 452.185 0 1 0 L
+543.586 452.185 543.157 434.559 0 1 0 L
+602.094 444.446 543.586 452.185 543.157 434.559 1 0 0 T
+543.157 434.559 543.586 452.185 0 1 0 L
+543.586 452.185 485.039 437.448 0 1 0 L
+543.586 452.185 485.039 437.448 543.157 434.559 1 0 0 T
+485.039 437.448 543.586 452.185 0 1 0 L
+382.72 87.5676 0 0.482353 0.231373 P
+382.72 87.5676 431.645 75.2365 0 1 0 L
+350.646 65.8608 382.72 87.5676 0 1 0 L
+382.72 87.5676 350.646 65.8608 0 1 0 L
+431.645 75.2365 382.72 87.5676 0 1 0 L
+350.646 65.8608 431.645 75.2365 382.72 87.5676 1 0 0 T
+674.644 269.107 0 0.482353 0.231373 P
+674.644 269.107 0 0.482353 0.231373 P
+603.288 260.847 674.644 269.107 0 1 0 L
+674.644 269.107 631.244 215.688 0 1 0 L
+603.288 260.847 674.644 269.107 631.244 215.688 1 0 0 T
+631.244 215.688 674.644 269.107 0 1 0 L
+631.244 312.479 674.644 269.107 0 1 0 L
+674.644 269.107 603.288 260.847 0 1 0 L
+674.644 269.107 603.288 260.847 631.244 312.479 1 0 0 T
+674.644 351.978 674.644 269.107 0 1 0 L
+674.644 269.107 631.244 312.479 0 1 0 L
+674.644 351.978 674.644 269.107 631.244 312.479 1 0 0 T
+674.644 351.978 674.644 269.107 0 1 0 L
+631.244 215.688 0 0.482353 0.231373 P
+580.145 189.109 631.244 215.688 0 1 0 L
+631.244 215.688 580.145 189.109 0 1 0 L
+603.288 260.847 631.244 215.688 0 1 0 L
+580.145 189.109 603.288 260.847 631.244 215.688 1 0 0 T
+631.244 215.688 603.288 260.847 0 1 0 L
+559.947 134.491 0 0.482353 0.231373 P
+559.947 134.491 580.145 189.109 0 1 0 L
+559.947 134.491 512.645 157.618 0 1 0 L
+580.145 189.109 559.947 134.491 0 1 0 L
+512.645 157.618 580.145 189.109 559.947 134.491 1 0 0 T
+559.947 134.491 512.645 84.6123 0 1 0 L
+512.645 157.618 559.947 134.491 0 1 0 L
+512.645 84.6123 512.645 157.618 559.947 134.491 1 0 0 T
+512.645 84.6123 559.947 134.491 0 1 0 L
+314.087 190.818 0 0.482353 0.231373 P
+314.087 190.818 330.408 135.034 0 1 0 L
+330.408 135.034 314.087 190.818 0 1 0 L
+314.087 190.818 333.855 196.194 0 1 0 L
+330.408 135.034 314.087 190.818 333.855 196.194 1 0 0 T
+333.855 196.194 314.087 190.818 0 1 0 L
+314.087 190.818 323.04 252.954 0 1 0 L
+314.087 190.818 323.04 252.954 333.855 196.194 1 0 0 T
+323.04 252.954 314.087 190.818 0 1 0 L
+512.645 84.6123 0 0.482353 0.231373 P
+512.645 84.6123 0 0.482353 0.231373 P
+512.645 157.618 512.645 84.6123 0 1 0 L
+512.645 84.6123 465.343 123.54 0 1 0 L
+512.645 157.618 512.645 84.6123 465.343 123.54 1 0 0 T
+465.343 123.54 512.645 84.6123 0 1 0 L
+512.645 84.6123 431.645 75.2365 0 1 0 L
+512.645 84.6123 431.645 75.2365 465.343 123.54 1 0 0 T
+512.645 84.6123 512.645 157.618 0 1 0 L
+431.645 75.2365 512.645 84.6123 0 1 0 L
+580.145 189.109 0 0.482353 0.231373 P
+580.145 189.109 603.288 260.847 0 1 0 L
+512.645 157.618 580.145 189.109 0 1 0 L
+512.645 250.355 580.145 189.109 0 1 0 L
+580.145 189.109 512.645 157.618 0 1 0 L
+512.645 250.355 580.145 189.109 512.645 157.618 1 0 0 T
+603.288 260.847 580.145 189.109 0 1 0 L
+580.145 189.109 512.645 250.355 0 1 0 L
+580.145 189.109 512.645 250.355 603.288 260.847 1 0 0 T
+287.973 445.817 0 0.482353 0.231373 P
+287.973 445.817 0 0.482353 0.231373 P
+287.973 445.817 349.673 436.688 0 1 0 L
+349.673 436.688 287.973 445.817 0 1 0 L
+287.973 445.817 319.309 421.582 0 1 0 L
+287.973 445.817 319.309 421.582 349.673 436.688 1 0 0 T
+287.973 445.817 306.273 387.261 0 1 0 L
+306.273 387.261 287.973 445.817 0 1 0 L
+287.973 445.817 319.309 421.582 0 1 0 L
+287.973 445.817 319.309 421.582 306.273 387.261 1 0 0 T
+602.094 444.446 0 0.482353 0.231373 P
+543.157 434.559 602.094 444.446 0 1 0 L
+593.645 425.474 602.094 444.446 0 1 0 L
+602.094 444.446 543.157 434.559 0 1 0 L
+593.645 425.474 602.094 444.446 543.157 434.559 1 0 0 T
+602.094 444.446 674.644 434.85 0 1 0 L
+602.094 444.446 593.645 425.474 0 1 0 L
+674.644 434.85 602.094 444.446 0 1 0 L
+593.645 425.474 674.644 434.85 602.094 444.446 1 0 0 T
+674.644 351.978 0 0.482353 0.231373 P
+674.644 351.978 0 0.482353 0.231373 P
+622.332 375.274 674.644 351.978 0 1 0 L
+674.644 351.978 631.244 312.479 0 1 0 L
+622.332 375.274 674.644 351.978 631.244 312.479 1 0 0 T
+631.244 312.479 674.644 351.978 0 1 0 L
+674.644 434.85 674.644 351.978 0 1 0 L
+674.644 351.978 622.332 375.274 0 1 0 L
+674.644 434.85 674.644 351.978 622.332 375.274 1 0 0 T
+674.644 434.85 674.644 351.978 0 1 0 L
+603.288 260.847 0 0.482353 0.231373 P
+631.244 312.479 603.288 260.847 0 1 0 L
+603.288 260.847 580.145 327.228 0 1 0 L
+603.288 260.847 580.145 327.228 631.244 312.479 1 0 0 T
+603.288 260.847 631.244 312.479 0 1 0 L
+603.288 260.847 512.645 250.355 0 1 0 L
+580.145 327.228 603.288 260.847 0 1 0 L
+512.645 250.355 580.145 327.228 603.288 260.847 1 0 0 T
+512.645 250.355 603.288 260.847 0 1 0 L
+512.645 157.618 0 0.482353 0.231373 P
+445.145 173.483 512.645 157.618 0 1 0 L
+512.645 157.618 465.343 123.54 0 1 0 L
+445.145 173.483 512.645 157.618 465.343 123.54 1 0 0 T
+465.343 123.54 512.645 157.618 0 1 0 L
+512.645 157.618 512.645 250.355 0 1 0 L
+512.645 157.618 445.145 173.483 0 1 0 L
+512.645 250.355 512.645 157.618 0 1 0 L
+445.145 173.483 512.645 250.355 512.645 157.618 1 0 0 T
+631.244 312.479 0 0.482353 0.231373 P
+631.244 312.479 580.145 327.228 0 1 0 L
+622.332 375.274 631.244 312.479 0 1 0 L
+580.145 327.228 622.332 375.274 631.244 312.479 1 0 0 T
+580.145 327.228 631.244 312.479 0 1 0 L
+631.244 312.479 622.332 375.274 0 1 0 L
+330.408 135.034 0 0.482353 0.231373 P
+333.855 196.194 330.408 135.034 0 1 0 L
+350.646 148.732 330.408 135.034 0 1 0 L
+330.408 135.034 333.855 196.194 0 1 0 L
+350.646 148.732 330.408 135.034 333.855 196.194 1 0 0 T
+330.408 135.034 350.646 65.8608 0 1 0 L
+330.408 135.034 350.646 148.732 0 1 0 L
+350.646 65.8608 330.408 135.034 0 1 0 L
+350.646 148.732 350.646 65.8608 330.408 135.034 1 0 0 T
+431.645 75.2365 0 0.482353 0.231373 P
+431.645 75.2365 0 0.482353 0.231373 P
+465.343 123.54 431.645 75.2365 0 1 0 L
+431.645 75.2365 402.958 125.437 0 1 0 L
+431.645 75.2365 402.958 125.437 465.343 123.54 1 0 0 T
+431.645 75.2365 465.343 123.54 0 1 0 L
+402.958 125.437 431.645 75.2365 0 1 0 L
+431.645 75.2365 350.646 65.8608 0 1 0 L
+431.645 75.2365 350.646 65.8608 402.958 125.437 1 0 0 T
+350.646 65.8608 431.645 75.2365 0 1 0 L
+465.343 123.54 0 0.482353 0.231373 P
+465.343 123.54 402.958 125.437 0 1 0 L
+445.145 173.483 465.343 123.54 0 1 0 L
+402.958 125.437 445.145 173.483 465.343 123.54 1 0 0 T
+465.343 123.54 445.145 173.483 0 1 0 L
+402.958 125.437 465.343 123.54 0 1 0 L
+485.039 437.448 0 0.482353 0.231373 P
+485.039 437.448 543.157 434.559 0 1 0 L
+543.157 434.559 485.039 437.448 0 1 0 L
+485.039 437.448 512.645 416.098 0 1 0 L
+485.039 437.448 512.645 416.098 543.157 434.559 1 0 0 T
+448.552 423.608 485.039 437.448 0 1 0 L
+485.039 437.448 408.586 436.559 0 1 0 L
+485.039 437.448 408.586 436.559 448.552 423.608 1 0 0 T
+512.645 416.098 485.039 437.448 0 1 0 L
+485.039 437.448 448.552 423.608 0 1 0 L
+512.645 416.098 485.039 437.448 448.552 423.608 1 0 0 T
+408.586 436.559 485.039 437.448 0 1 0 L
+349.673 436.688 0 0.482353 0.231373 P
+349.673 436.688 382.72 419.054 0 1 0 L
+408.586 436.559 349.673 436.688 0 1 0 L
+382.72 419.054 408.586 436.559 349.673 436.688 1 0 0 T
+349.673 436.688 408.586 436.559 0 1 0 L
+349.673 436.688 319.309 421.582 0 1 0 L
+382.72 419.054 349.673 436.688 0 1 0 L
+319.309 421.582 382.72 419.054 349.673 436.688 1 0 0 T
+319.309 421.582 349.673 436.688 0 1 0 L
+408.586 436.559 0 0.482353 0.231373 P
+382.72 419.054 408.586 436.559 0 1 0 L
+448.552 423.608 408.586 436.559 0 1 0 L
+408.586 436.559 382.72 419.054 0 1 0 L
+408.586 436.559 382.72 419.054 448.552 423.608 1 0 0 T
+408.586 436.559 448.552 423.608 0 1 0 L
+306.273 387.261 0 0.482353 0.231373 P
+306.273 387.261 330.408 359.477 0 1 0 L
+314.087 328.937 306.273 387.261 0 1 0 L
+330.408 359.477 314.087 328.937 306.273 387.261 1 0 0 T
+306.273 387.261 314.087 328.937 0 1 0 L
+306.273 387.261 319.309 421.582 0 1 0 L
+330.408 359.477 306.273 387.261 0 1 0 L
+319.309 421.582 330.408 359.477 306.273 387.261 1 0 0 T
+319.309 421.582 306.273 387.261 0 1 0 L
+314.087 328.937 0 0.482353 0.231373 P
+330.408 359.477 314.087 328.937 0 1 0 L
+333.855 292.985 314.087 328.937 0 1 0 L
+314.087 328.937 330.408 359.477 0 1 0 L
+314.087 328.937 330.408 359.477 333.855 292.985 1 0 0 T
+323.04 252.954 314.087 328.937 0 1 0 L
+314.087 328.937 333.855 292.985 0 1 0 L
+323.04 252.954 314.087 328.937 333.855 292.985 1 0 0 T
+314.087 328.937 323.04 252.954 0 1 0 L
+323.04 252.954 0 0.482353 0.231373 P
+333.855 292.985 323.04 252.954 0 1 0 L
+350.646 231.604 323.04 252.954 0 1 0 L
+323.04 252.954 333.855 292.985 0 1 0 L
+350.646 231.604 323.04 252.954 333.855 292.985 1 0 0 T
+323.04 252.954 333.855 196.194 0 1 0 L
+333.855 196.194 323.04 252.954 0 1 0 L
+323.04 252.954 350.646 231.604 0 1 0 L
+323.04 252.954 350.646 231.604 333.855 196.194 1 0 0 T
+674.644 434.85 350.646 397.347 0 0 1 L
+674.644 434.85 0.698039 0.713726 0.505882 P
+674.644 434.85 0 0.482353 0.231373 P
+674.644 434.85 0 0.482353 0.231373 P
+674.644 434.85 0 0.482353 0.231373 P
+593.645 425.474 674.644 434.85 0 1 0 L
+674.644 434.85 622.332 375.274 0 1 0 L
+593.645 425.474 674.644 434.85 622.332 375.274 1 0 0 T
+622.332 375.274 674.644 434.85 0 1 0 L
+593.645 425.474 674.644 434.85 0 1 0 L
+543.157 434.559 0 0.482353 0.231373 P
+543.157 434.559 593.645 425.474 0 1 0 L
+512.645 416.098 543.157 434.559 0 1 0 L
+543.157 434.559 512.645 416.098 0 1 0 L
+593.645 425.474 543.157 434.559 0 1 0 L
+512.645 416.098 593.645 425.474 543.157 434.559 1 0 0 T
+622.332 375.274 0 0.482353 0.231373 P
+559.947 377.171 622.332 375.274 0 1 0 L
+622.332 375.274 580.145 327.228 0 1 0 L
+622.332 375.274 580.145 327.228 559.947 377.171 1 0 0 T
+593.645 425.474 622.332 375.274 0 1 0 L
+622.332 375.274 559.947 377.171 0 1 0 L
+593.645 425.474 622.332 375.274 559.947 377.171 1 0 0 T
+580.145 327.228 622.332 375.274 0 1 0 L
+622.332 375.274 593.645 425.474 0 1 0 L
+580.145 327.228 0 0.482353 0.231373 P
+580.145 327.228 559.947 377.171 0 1 0 L
+559.947 377.171 580.145 327.228 0 1 0 L
+580.145 327.228 512.645 343.093 0 1 0 L
+580.145 327.228 512.645 343.093 559.947 377.171 1 0 0 T
+512.645 343.093 580.145 327.228 0 1 0 L
+580.145 327.228 512.645 250.355 0 1 0 L
+580.145 327.228 512.645 250.355 512.645 343.093 1 0 0 T
+512.645 250.355 580.145 327.228 0 1 0 L
+512.645 250.355 0 0.482353 0.231373 P
+512.645 250.355 512.645 343.093 0 1 0 L
+512.645 343.093 512.645 250.355 0 1 0 L
+512.645 250.355 445.145 311.602 0 1 0 L
+512.645 250.355 445.145 311.602 512.645 343.093 1 0 0 T
+422.003 239.863 512.645 250.355 0 1 0 L
+512.645 250.355 445.145 173.483 0 1 0 L
+512.645 250.355 445.145 173.483 422.003 239.863 1 0 0 T
+445.145 311.602 512.645 250.355 0 1 0 L
+512.645 250.355 422.003 239.863 0 1 0 L
+445.145 311.602 512.645 250.355 422.003 239.863 1 0 0 T
+445.145 173.483 512.645 250.355 0 1 0 L
+333.855 196.194 0 0.482353 0.231373 P
+350.646 231.604 333.855 196.194 0 1 0 L
+333.855 196.194 350.646 148.732 0 1 0 L
+333.855 196.194 350.646 231.604 0 1 0 L
+350.646 148.732 333.855 196.194 0 1 0 L
+350.646 231.604 350.646 148.732 333.855 196.194 1 0 0 T
+445.145 173.483 0 0.482353 0.231373 P
+402.958 125.437 445.145 173.483 0 1 0 L
+394.046 188.232 445.145 173.483 0 1 0 L
+445.145 173.483 402.958 125.437 0 1 0 L
+445.145 173.483 402.958 125.437 394.046 188.232 1 0 0 T
+422.003 239.863 445.145 173.483 0 1 0 L
+445.145 173.483 394.046 188.232 0 1 0 L
+422.003 239.863 445.145 173.483 394.046 188.232 1 0 0 T
+445.145 173.483 422.003 239.863 0 1 0 L
+402.958 125.437 0 0.482353 0.231373 P
+402.958 125.437 394.046 188.232 0 1 0 L
+394.046 188.232 402.958 125.437 0 1 0 L
+402.958 125.437 350.646 148.732 0 1 0 L
+402.958 125.437 350.646 148.732 394.046 188.232 1 0 0 T
+402.958 125.437 350.646 65.8608 0 1 0 L
+350.646 148.732 402.958 125.437 0 1 0 L
+350.646 65.8608 350.646 148.732 402.958 125.437 1 0 0 T
+350.646 65.8608 402.958 125.437 0 1 0 L
+350.646 397.347 350.646 65.8608 0 0 1 L
+350.646 65.8608 0.698039 0.713726 0.505882 P
+350.646 65.8608 0 0.482353 0.231373 P
+350.646 65.8608 0 0.482353 0.231373 P
+350.646 65.8608 0 0.482353 0.231373 P
+350.646 65.8608 350.646 148.732 0 1 0 L
+350.646 148.732 350.646 65.8608 0 1 0 L
+559.947 377.171 0 0.482353 0.231373 P
+512.645 343.093 559.947 377.171 0 1 0 L
+559.947 377.171 593.645 425.474 0 1 0 L
+559.947 377.171 512.645 343.093 0 1 0 L
+512.645 416.098 559.947 377.171 0 1 0 L
+512.645 343.093 512.645 416.098 559.947 377.171 1 0 0 T
+559.947 377.171 512.645 416.098 0 1 0 L
+593.645 425.474 559.947 377.171 0 1 0 L
+512.645 416.098 593.645 425.474 559.947 377.171 1 0 0 T
+593.645 425.474 0 0.482353 0.231373 P
+593.645 425.474 0 0.482353 0.231373 P
+512.645 416.098 593.645 425.474 0 1 0 L
+512.645 416.098 593.645 425.474 0 1 0 L
+448.552 423.608 0 0.482353 0.231373 P
+382.72 419.054 448.552 423.608 0 1 0 L
+448.552 423.608 512.645 416.098 0 1 0 L
+448.552 423.608 382.72 419.054 0 1 0 L
+431.645 406.723 448.552 423.608 0 1 0 L
+382.72 419.054 431.645 406.723 448.552 423.608 1 0 0 T
+448.552 423.608 431.645 406.723 0 1 0 L
+512.645 416.098 448.552 423.608 0 1 0 L
+431.645 406.723 512.645 416.098 448.552 423.608 1 0 0 T
+394.046 188.232 0 0.482353 0.231373 P
+394.046 188.232 422.003 239.863 0 1 0 L
+394.046 188.232 350.646 231.604 0 1 0 L
+422.003 239.863 394.046 188.232 0 1 0 L
+350.646 231.604 422.003 239.863 394.046 188.232 1 0 0 T
+350.646 148.732 394.046 188.232 0 1 0 L
+394.046 188.232 350.646 148.732 0 1 0 L
+350.646 231.604 394.046 188.232 0 1 0 L
+350.646 148.732 350.646 231.604 394.046 188.232 1 0 0 T
+512.645 343.093 0 0.482353 0.231373 P
+512.645 343.093 512.645 416.098 0 1 0 L
+465.343 366.22 512.645 343.093 0 1 0 L
+512.645 343.093 445.145 311.602 0 1 0 L
+512.645 343.093 445.145 311.602 465.343 366.22 1 0 0 T
+512.645 416.098 512.645 343.093 0 1 0 L
+512.645 343.093 465.343 366.22 0 1 0 L
+512.645 416.098 512.645 343.093 465.343 366.22 1 0 0 T
+445.145 311.602 512.645 343.093 0 1 0 L
+422.003 239.863 0 0.482353 0.231373 P
+445.145 311.602 422.003 239.863 0 1 0 L
+422.003 239.863 394.046 285.023 0 1 0 L
+445.145 311.602 422.003 239.863 394.046 285.023 1 0 0 T
+394.046 285.023 422.003 239.863 0 1 0 L
+422.003 239.863 350.646 231.604 0 1 0 L
+422.003 239.863 350.646 231.604 394.046 285.023 1 0 0 T
+350.646 231.604 422.003 239.863 0 1 0 L
+422.003 239.863 445.145 311.602 0 1 0 L
+333.855 292.985 0 0.482353 0.231373 P
+330.408 359.477 333.855 292.985 0 1 0 L
+333.855 292.985 330.408 359.477 0 1 0 L
+350.646 314.475 333.855 292.985 0 1 0 L
+330.408 359.477 350.646 314.475 333.855 292.985 1 0 0 T
+333.855 292.985 350.646 231.604 0 1 0 L
+333.855 292.985 350.646 314.475 0 1 0 L
+350.646 231.604 333.855 292.985 0 1 0 L
+350.646 314.475 350.646 231.604 333.855 292.985 1 0 0 T
+350.646 148.732 0 0.482353 0.231373 P
+350.646 148.732 0 0.482353 0.231373 P
+350.646 148.732 350.646 231.604 0 1 0 L
+350.646 231.604 350.646 148.732 0 1 0 L
+319.309 421.582 0 0.482353 0.231373 P
+319.309 421.582 0 0.482353 0.231373 P
+319.309 421.582 382.72 419.054 0 1 0 L
+382.72 419.054 319.309 421.582 0 1 0 L
+319.309 421.582 350.646 397.347 0 1 0 L
+319.309 421.582 350.646 397.347 382.72 419.054 1 0 0 T
+319.309 421.582 330.408 359.477 0 1 0 L
+330.408 359.477 319.309 421.582 0 1 0 L
+319.309 421.582 350.646 397.347 0 1 0 L
+319.309 421.582 350.646 397.347 330.408 359.477 1 0 0 T
+382.72 419.054 0 0.482353 0.231373 P
+382.72 419.054 431.645 406.723 0 1 0 L
+350.646 397.347 382.72 419.054 0 1 0 L
+382.72 419.054 350.646 397.347 0 1 0 L
+431.645 406.723 382.72 419.054 0 1 0 L
+350.646 397.347 431.645 406.723 382.72 419.054 1 0 0 T
+330.408 359.477 0 0.482353 0.231373 P
+330.408 359.477 350.646 314.475 0 1 0 L
+350.646 397.347 330.408 359.477 0 1 0 L
+330.408 359.477 350.646 397.347 0 1 0 L
+350.646 314.475 330.408 359.477 0 1 0 L
+350.646 397.347 350.646 314.475 330.408 359.477 1 0 0 T
+445.145 311.602 0 0.482353 0.231373 P
+402.958 349.881 445.145 311.602 0 1 0 L
+445.145 311.602 394.046 285.023 0 1 0 L
+402.958 349.881 445.145 311.602 394.046 285.023 1 0 0 T
+394.046 285.023 445.145 311.602 0 1 0 L
+465.343 366.22 445.145 311.602 0 1 0 L
+445.145 311.602 402.958 349.881 0 1 0 L
+445.145 311.602 402.958 349.881 465.343 366.22 1 0 0 T
+445.145 311.602 465.343 366.22 0 1 0 L
+512.645 416.098 0 0.482353 0.231373 P
+512.645 416.098 0 0.482353 0.231373 P
+465.343 366.22 512.645 416.098 0 1 0 L
+431.645 406.723 512.645 416.098 0 1 0 L
+512.645 416.098 465.343 366.22 0 1 0 L
+431.645 406.723 512.645 416.098 465.343 366.22 1 0 0 T
+431.645 406.723 512.645 416.098 0 1 0 L
+465.343 366.22 0 0.482353 0.231373 P
+402.958 349.881 465.343 366.22 0 1 0 L
+465.343 366.22 402.958 349.881 0 1 0 L
+431.645 406.723 465.343 366.22 0 1 0 L
+402.958 349.881 431.645 406.723 465.343 366.22 1 0 0 T
+465.343 366.22 431.645 406.723 0 1 0 L
+394.046 285.023 0 0.482353 0.231373 P
+394.046 285.023 402.958 349.881 0 1 0 L
+394.046 285.023 350.646 314.475 0 1 0 L
+402.958 349.881 394.046 285.023 0 1 0 L
+350.646 314.475 402.958 349.881 394.046 285.023 1 0 0 T
+350.646 231.604 394.046 285.023 0 1 0 L
+394.046 285.023 350.646 231.604 0 1 0 L
+350.646 314.475 394.046 285.023 0 1 0 L
+350.646 231.604 350.646 314.475 394.046 285.023 1 0 0 T
+350.646 231.604 0 0.482353 0.231373 P
+350.646 231.604 0 0.482353 0.231373 P
+350.646 231.604 350.646 314.475 0 1 0 L
+350.646 314.475 350.646 231.604 0 1 0 L
+402.958 349.881 0 0.482353 0.231373 P
+350.646 314.475 402.958 349.881 0 1 0 L
+402.958 349.881 431.645 406.723 0 1 0 L
+402.958 349.881 350.646 397.347 0 1 0 L
+431.645 406.723 402.958 349.881 0 1 0 L
+350.646 397.347 431.645 406.723 402.958 349.881 1 0 0 T
+402.958 349.881 350.646 314.475 0 1 0 L
+350.646 397.347 402.958 349.881 0 1 0 L
+350.646 314.475 350.646 397.347 402.958 349.881 1 0 0 T
+431.645 406.723 0 0.482353 0.231373 P
+431.645 406.723 0 0.482353 0.231373 P
+350.646 397.347 431.645 406.723 0 1 0 L
+350.646 397.347 431.645 406.723 0 1 0 L
+350.646 314.475 0 0.482353 0.231373 P
+350.646 314.475 0 0.482353 0.231373 P
+350.646 314.475 350.646 397.347 0 1 0 L
+350.646 397.347 350.646 314.475 0 1 0 L
+350.646 397.347 0.698039 0.713726 0.505882 P
+350.646 397.347 0 0.482353 0.231373 P
+350.646 397.347 0 0.482353 0.231373 P
+350.646 397.347 0 0.482353 0.231373 P
+grestore
+showpage
+%%EndPage
+%%Pages: 1
+%%EOF
diff --git a/benchmarks/3d/bug_prot.geo b/benchmarks/3d/bug_prot.geo
new file mode 100644
index 0000000000000000000000000000000000000000..b62051e06bf89109131c7ba0ad7cbfad50f43c75
--- /dev/null
+++ b/benchmarks/3d/bug_prot.geo
@@ -0,0 +1,6 @@
+c45 = 0.5 * (2^0.5); 
+Point(1) = {0.0,0.0,0.0,1.0};  
+Point(2) = {-c45,c45,0.0,1.0};  
+Line(1) = {1,2}; 
+Extrude Line(1, {-c45,c45,0}, {1,0.0,0}, 3.14159/2); 
+Coherence; 
diff --git a/benchmarks/3d/calbute.geo b/benchmarks/3d/calbute.geo
new file mode 100644
index 0000000000000000000000000000000000000000..8206c032d51e27914bdc11a24cdc2145410b6505
--- /dev/null
+++ b/benchmarks/3d/calbute.geo
@@ -0,0 +1,26 @@
+Point(2) = {-1.96039E+00,-1.28719E+00, 2.12132E+00,lc}; 
+Point(3) = {-5.60111E-01,-1.08916E+00, 7.07107E-01,lc}; 
+Point(4) = {-2.24045E+00, 6.93103E-01, 2.12132E+00,lc}; 
+Point(5) = {-8.40168E-01, 8.91133E-01, 7.07107E-01,lc}; 
+Point(6) = { 5.60111E-01, 1.08916E+00, 7.07107E-01,lc}; 
+Point(7) = { 1.96039E+00, 1.28719E+00, 2.12132E+00,lc}; 
+Point(11) = { 2.24045E+00,-6.93103E-01, 2.12132E+00,lc}; 
+Point(15) = { 8.40168E-01,-8.91133E-01, 7.07107E-01,lc}; 
+Point(27) = {-1.40028E-01, 9.90148E-01, 1.20739E-15,lc}; 
+Point(37) = { 1.40028E-01,-9.90148E-01,-1.20739E-15,lc}; 
+Line (1) = {4,2}; 
+Line (2) = {2,3}; 
+Line (3) = {3,5}; 
+Line (4) = {5,4}; 
+Line (8) = {6,7}; 
+Line (9) = {7,11}; 
+Line (10) = {11,15}; 
+Line (11) = {15,6}; 
+Circle (13) = {5,27,6} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; 
+Circle (14) = {4,27,7} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; 
+Circle (18) = {2,37,11} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; 
+Circle (22) = {3,37,15} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00}; 
+Line Loop (1000019) = {  1, 18, -9,-14}; 
+Ruled Surface (19) = {1000019}; 
+Extrude Line(1, {-0.,1,0}, {0.0,0.0,0.0}, -3.14159/2);
+Coherence;
diff --git a/benchmarks/3d/cas_pb.geo b/benchmarks/3d/cas_pb.geo
new file mode 100644
index 0000000000000000000000000000000000000000..a1fec065a6b828da46f5021897ef9e108a68756d
--- /dev/null
+++ b/benchmarks/3d/cas_pb.geo
@@ -0,0 +1,33 @@
+
+Point(1) = {0,0,0,10};
+Point(2) = {10,10,0,1};
+Point(3) = {10,0,0,1};
+Point(4) = {0,10,0,1};
+Line(1) = {1,4};
+Line(2) = {4,2};
+Line(3) = {2,3};
+Line(4) = {3,1};
+Line Loop(5) = {4,1,2,3};
+Plane Surface(6) = {5};
+Extrude Surface (6, {0,0,1});
+Coherence;
+
+Point(111) = {5,5,-.1,.2};
+Point(15) = {4,4,-.1,.2};
+Point(16) = {4,6,-.1,.2};
+Point(17) = {6,4,-.1,.2};
+Point(18) = {6,6,-.1,.2};
+Arc(29) = {15,111,16};
+Arc(30) = {16,111,18};
+Arc(31) = {18,111,17};
+Arc(32) = {17,111,15};
+Line Loop(33) = {30,31,32,29};
+Plane Surface(34) = {33};
+Extrude Surface (34, {0,0,-1});
+Coherence;
+Surface Loop(57) = {56,43,34,47,51,55};
+Complex Volume(58) = {57};
+/*
+Surface Loop(58) = {28,15,6,19,23,27};
+Complex Volume(59) = {58};
+*/
diff --git a/benchmarks/3d/cube.geo b/benchmarks/3d/cube.geo
new file mode 100644
index 0000000000000000000000000000000000000000..12938ec43bd9df04194a2f05e521c3a9079f5e76
--- /dev/null
+++ b/benchmarks/3d/cube.geo
@@ -0,0 +1,17 @@
+/****************************  
+cube meshed uniformly  
+****************************/  
+Point(1) = {0.0,0.0,0.0,.025};         
+Point(2) = {1,0.0,0.0,.025};         
+Point(3) = {1,1,0.0,.4};         
+Point(4) = {0,1,0.0,.4};         
+Line(1) = {4,3};         
+Line(2) = {3,2};         
+Line(3) = {2,1};         
+Line(4) = {1,4};         
+Line Loop(5) = {2,3,4,1};         
+Plane Surface(6) = {5};         
+Extrude Surface (6, {0,0.0,1});         
+    
+Surface Loop(29) = {23,6,15,19,28,27};   
+Complex Volume(30) = {29};   
diff --git a/benchmarks/3d/naca12.geo b/benchmarks/3d/naca12.geo
new file mode 100644
index 0000000000000000000000000000000000000000..207fd53e7b42c3bd62dc9fc9ab432f6c7008a5da
--- /dev/null
+++ b/benchmarks/3d/naca12.geo
@@ -0,0 +1,475 @@
+lc = 0.1; 
+Point(1) = {1.000000e+00,0.000000e+00,0.000000e+00,lc}; 
+Point(2) = {9.997533e-01,0.000000e+00,-3.498543e-05,lc}; 
+Point(3) = {9.990134e-01,0.000000e+00,-1.398841e-04,1.003943e-01}; 
+Point(4) = {9.977810e-01,0.000000e+00,-3.143904e-04,1.008856e-01}; 
+Point(5) = {9.960575e-01,0.000000e+00,-5.579769e-04,1.015708e-01}; 
+Point(6) = {9.938442e-01,0.000000e+00,-8.699747e-04,1.024472e-01}; 
+Point(7) = {9.911436e-01,0.000000e+00,-1.249551e-03,1.035112e-01}; 
+Point(8) = {9.879584e-01,0.000000e+00,-1.695579e-03,1.047586e-01}; 
+Point(9) = {9.842916e-01,0.000000e+00,-2.206860e-03,1.061847e-01}; 
+Point(10) = {9.801469e-01,0.000000e+00,-2.781989e-03,1.077836e-01}; 
+Point(11) = {9.755284e-01,0.000000e+00,-3.419365e-03,1.095491e-01}; 
+Point(12) = {9.704404e-01,0.000000e+00,-4.117359e-03,1.114743e-01}; 
+Point(13) = {9.648883e-01,0.000000e+00,-4.874101e-03,1.135515e-01}; 
+Point(14) = {9.588774e-01,0.000000e+00,-5.687566e-03,1.157726e-01}; 
+Point(15) = {9.524136e-01,0.000000e+00,-6.555737e-03,1.181288e-01}; 
+Point(16) = {9.455034e-01,0.000000e+00,-7.476377e-03,1.206107e-01}; 
+Point(17) = {9.381535e-01,0.000000e+00,-8.447210e-03,1.232086e-01}; 
+Point(18) = {9.303712e-01,0.000000e+00,-9.465891e-03,1.259123e-01}; 
+Point(19) = {9.221641e-01,0.000000e+00,-1.052998e-02,1.287110e-01}; 
+Point(20) = {9.135405e-01,0.000000e+00,-1.163695e-02,1.315937e-01}; 
+Point(21) = {9.045087e-01,0.000000e+00,-1.278429e-02,1.345491e-01}; 
+Point(22) = {8.950777e-01,0.000000e+00,-1.396934e-02,1.375654e-01}; 
+Point(23) = {8.852569e-01,0.000000e+00,-1.518951e-02,1.406308e-01}; 
+Point(24) = {8.750558e-01,0.000000e+00,-1.644214e-02,1.437333e-01}; 
+Point(25) = {8.644845e-01,0.000000e+00,-1.772453e-02,1.468604e-01}; 
+Point(26) = {8.535537e-01,0.000000e+00,-1.903398e-02,1.499999e-01}; 
+Point(27) = {8.422739e-01,0.000000e+00,-2.036772e-02,1.531394e-01}; 
+Point(28) = {8.306563e-01,0.000000e+00,-2.172309e-02,1.562666e-01}; 
+Point(29) = {8.187124e-01,0.000000e+00,-2.309725e-02,1.593690e-01}; 
+Point(30) = {8.064539e-01,0.000000e+00,-2.448751e-02,1.624344e-01}; 
+Point(31) = {7.938930e-01,0.000000e+00,-2.589105e-02,1.654508e-01}; 
+Point(32) = {7.810421e-01,0.000000e+00,-2.730503e-02,1.684061e-01}; 
+Point(33) = {7.679139e-01,0.000000e+00,-2.872668e-02,1.712889e-01}; 
+Point(34) = {7.545212e-01,0.000000e+00,-3.015313e-02,1.740876e-01}; 
+Point(35) = {7.408773e-01,0.000000e+00,-3.158154e-02,1.767913e-01}; 
+Point(36) = {7.269957e-01,0.000000e+00,-3.300894e-02,1.793892e-01}; 
+Point(37) = {7.128901e-01,0.000000e+00,-3.443245e-02,1.818711e-01}; 
+Point(38) = {6.985745e-01,0.000000e+00,-3.584905e-02,1.842273e-01}; 
+Point(39) = {6.840628e-01,0.000000e+00,-3.725576e-02,1.864484e-01}; 
+Point(40) = {6.693696e-01,0.000000e+00,-3.864942e-02,1.885256e-01}; 
+Point(41) = {6.545091e-01,0.000000e+00,-4.002701e-02,1.904508e-01}; 
+Point(42) = {6.394961e-01,0.000000e+00,-4.138529e-02,1.922163e-01}; 
+Point(43) = {6.243456e-01,0.000000e+00,-4.272101e-02,1.938153e-01}; 
+Point(44) = {6.090723e-01,0.000000e+00,-4.403092e-02,1.952413e-01}; 
+Point(45) = {5.936913e-01,0.000000e+00,-4.531165e-02,1.964888e-01}; 
+Point(46) = {5.782179e-01,0.000000e+00,-4.655984e-02,1.975528e-01}; 
+Point(47) = {5.626673e-01,0.000000e+00,-4.777199e-02,1.984291e-01}; 
+Point(48) = {5.470549e-01,0.000000e+00,-4.894463e-02,1.991143e-01}; 
+Point(49) = {5.313960e-01,0.000000e+00,-5.007425e-02,lc}; 
+Point(50) = {5.157061e-01,0.000000e+00,-5.115728e-02,1.999013e-01}; 
+Point(51) = {5.000008e-01,0.000000e+00,-5.219014e-02,2.000000e-01}; 
+Point(52) = {4.842954e-01,0.000000e+00,-5.316926e-02,1.999013e-01}; 
+Point(53) = {4.686055e-01,0.000000e+00,-5.409108e-02,1.996058e-01}; 
+Point(54) = {4.529467e-01,0.000000e+00,-5.495201e-02,1.991144e-01}; 
+Point(55) = {4.373342e-01,0.000000e+00,-5.574857e-02,1.984292e-01}; 
+Point(56) = {4.217836e-01,0.000000e+00,-5.647729e-02,1.975529e-01}; 
+Point(57) = {4.063102e-01,0.000000e+00,-5.713477e-02,1.964889e-01}; 
+Point(58) = {3.909292e-01,0.000000e+00,-5.771770e-02,1.952414e-01}; 
+Point(59) = {3.756559e-01,0.000000e+00,-5.822293e-02,1.938154e-01}; 
+Point(60) = {3.605053e-01,0.000000e+00,-5.864737e-02,1.922165e-01}; 
+Point(61) = {3.454924e-01,0.000000e+00,-5.898812e-02,1.904510e-01}; 
+Point(62) = {3.306319e-01,0.000000e+00,-5.924247e-02,1.885258e-01}; 
+Point(63) = {3.159386e-01,0.000000e+00,-5.940786e-02,1.864486e-01}; 
+Point(64) = {3.014269e-01,0.000000e+00,-5.948193e-02,1.842275e-01}; 
+Point(65) = {2.871112e-01,0.000000e+00,-5.946260e-02,1.818713e-01}; 
+Point(66) = {2.730056e-01,0.000000e+00,-5.934800e-02,1.793894e-01}; 
+Point(67) = {2.591240e-01,0.000000e+00,-5.913650e-02,1.767915e-01}; 
+Point(68) = {2.454802e-01,0.000000e+00,-5.882679e-02,1.740879e-01}; 
+Point(69) = {2.320875e-01,0.000000e+00,-5.841779e-02,1.712892e-01}; 
+Point(70) = {2.189592e-01,0.000000e+00,-5.790876e-02,1.684064e-01}; 
+Point(71) = {2.061082e-01,0.000000e+00,-5.729925e-02,1.654510e-01}; 
+Point(72) = {1.935473e-01,0.000000e+00,-5.658907e-02,1.624347e-01}; 
+Point(73) = {1.812888e-01,0.000000e+00,-5.577839e-02,1.593693e-01}; 
+Point(74) = {1.693449e-01,0.000000e+00,-5.486767e-02,1.562669e-01}; 
+Point(75) = {1.577273e-01,0.000000e+00,-5.385765e-02,1.531398e-01}; 
+Point(76) = {1.464474e-01,0.000000e+00,-5.274938e-02,1.500002e-01}; 
+Point(77) = {1.355165e-01,0.000000e+00,-5.154420e-02,1.468607e-01}; 
+Point(78) = {1.249452e-01,0.000000e+00,-5.024372e-02,1.437336e-01}; 
+Point(79) = {1.147441e-01,0.000000e+00,-4.884978e-02,1.406312e-01}; 
+Point(80) = {1.049232e-01,0.000000e+00,-4.736451e-02,1.375657e-01}; 
+Point(81) = {9.549212e-02,0.000000e+00,-4.579021e-02,1.345494e-01}; 
+Point(82) = {8.646032e-02,0.000000e+00,-4.412942e-02,1.315940e-01}; 
+Point(83) = {7.783660e-02,0.000000e+00,-4.238483e-02,1.287112e-01}; 
+Point(84) = {6.962952e-02,0.000000e+00,-4.055926e-02,1.259125e-01}; 
+Point(85) = {6.184718e-02,0.000000e+00,-3.865567e-02,1.232088e-01}; 
+Point(86) = {5.449721e-02,0.000000e+00,-3.667711e-02,1.206109e-01}; 
+Point(87) = {4.758692e-02,0.000000e+00,-3.462668e-02,1.181290e-01}; 
+Point(88) = {4.112309e-02,0.000000e+00,-3.250752e-02,1.157728e-01}; 
+Point(89) = {3.511214e-02,0.000000e+00,-3.032277e-02,1.135517e-01}; 
+Point(90) = {2.955997e-02,0.000000e+00,-2.807550e-02,1.114745e-01}; 
+Point(91) = {2.447206e-02,0.000000e+00,-2.576878e-02,1.095493e-01}; 
+Point(92) = {1.985344e-02,0.000000e+00,-2.340553e-02,1.077837e-01}; 
+Point(93) = {1.570869e-02,0.000000e+00,-2.098859e-02,1.061848e-01}; 
+Point(94) = {1.204184e-02,0.000000e+00,-1.852062e-02,1.047587e-01}; 
+Point(95) = {8.856565e-03,0.000000e+00,-1.600414e-02,1.035113e-01}; 
+Point(96) = {6.155997e-03,0.000000e+00,-1.344148e-02,1.024472e-01}; 
+Point(97) = {3.942788e-03,0.000000e+00,-1.083471e-02,1.015709e-01}; 
+Point(98) = {2.219111e-03,0.000000e+00,-8.185687e-03,1.008857e-01}; 
+Point(99) = {9.866953e-04,0.000000e+00,-5.496060e-03,1.003943e-01}; 
+Point(100) = {2.467632e-04,0.000000e+00,-2.767267e-03,lc}; 
+Point(101) = {0.000000e+00,0.000000e+00,1.911503e-39,1.000000e-01}; 
+Point(102) = {2.467632e-04,0.000000e+00,2.767267e-03,1.000987e-01}; 
+Point(103) = {9.866953e-04,0.000000e+00,5.496060e-03,1.003943e-01}; 
+Point(104) = {2.219111e-03,0.000000e+00,8.185687e-03,1.008857e-01}; 
+Point(105) = {3.942788e-03,0.000000e+00,1.083471e-02,1.015709e-01}; 
+Point(106) = {6.155997e-03,0.000000e+00,1.344148e-02,1.024472e-01}; 
+Point(107) = {8.856565e-03,0.000000e+00,1.600414e-02,1.035113e-01}; 
+Point(108) = {1.204184e-02,0.000000e+00,1.852062e-02,1.047587e-01}; 
+Point(109) = {1.570869e-02,0.000000e+00,2.098859e-02,1.061848e-01}; 
+Point(110) = {1.985344e-02,0.000000e+00,2.340553e-02,1.077837e-01}; 
+Point(111) = {2.447206e-02,0.000000e+00,2.576878e-02,1.095493e-01}; 
+Point(112) = {2.955997e-02,0.000000e+00,2.807550e-02,1.114745e-01}; 
+Point(113) = {3.511214e-02,0.000000e+00,3.032277e-02,1.135517e-01}; 
+Point(114) = {4.112309e-02,0.000000e+00,3.250752e-02,1.157728e-01}; 
+Point(115) = {4.758692e-02,0.000000e+00,3.462668e-02,1.181290e-01}; 
+Point(116) = {5.449721e-02,0.000000e+00,3.667711e-02,1.206109e-01}; 
+Point(117) = {6.184718e-02,0.000000e+00,3.865567e-02,1.232088e-01}; 
+Point(118) = {6.962952e-02,0.000000e+00,4.055926e-02,1.259125e-01}; 
+Point(119) = {7.783660e-02,0.000000e+00,4.238483e-02,1.287112e-01}; 
+Point(120) = {8.646032e-02,0.000000e+00,4.412942e-02,1.315940e-01}; 
+Point(121) = {9.549212e-02,0.000000e+00,4.579021e-02,1.345494e-01}; 
+Point(122) = {1.049232e-01,0.000000e+00,4.736451e-02,1.375657e-01}; 
+Point(123) = {1.147441e-01,0.000000e+00,4.884978e-02,1.406312e-01}; 
+Point(124) = {1.249452e-01,0.000000e+00,5.024372e-02,1.437336e-01}; 
+Point(125) = {1.355165e-01,0.000000e+00,5.154420e-02,1.468607e-01}; 
+Point(126) = {1.464474e-01,0.000000e+00,5.274938e-02,1.500002e-01}; 
+Point(127) = {1.577273e-01,0.000000e+00,5.385765e-02,1.531398e-01}; 
+Point(128) = {1.693449e-01,0.000000e+00,5.486767e-02,1.562669e-01}; 
+Point(129) = {1.812888e-01,0.000000e+00,5.577839e-02,1.593693e-01}; 
+Point(130) = {1.935473e-01,0.000000e+00,5.658907e-02,1.624347e-01}; 
+Point(131) = {2.061082e-01,0.000000e+00,5.729925e-02,1.654510e-01}; 
+Point(132) = {2.189592e-01,0.000000e+00,5.790876e-02,1.684064e-01}; 
+Point(133) = {2.320875e-01,0.000000e+00,5.841779e-02,1.712892e-01}; 
+Point(134) = {2.454802e-01,0.000000e+00,5.882679e-02,1.740879e-01}; 
+Point(135) = {2.591240e-01,0.000000e+00,5.913650e-02,1.767915e-01}; 
+Point(136) = {2.730056e-01,0.000000e+00,5.934800e-02,1.793894e-01}; 
+Point(137) = {2.871112e-01,0.000000e+00,5.946260e-02,1.818713e-01}; 
+Point(138) = {3.014269e-01,0.000000e+00,5.948193e-02,1.842275e-01}; 
+Point(139) = {3.159386e-01,0.000000e+00,5.940786e-02,1.864486e-01}; 
+Point(140) = {3.306319e-01,0.000000e+00,5.924247e-02,1.885258e-01}; 
+Point(141) = {3.454924e-01,0.000000e+00,5.898812e-02,1.904510e-01}; 
+Point(142) = {3.605053e-01,0.000000e+00,5.864737e-02,1.922165e-01}; 
+Point(143) = {3.756559e-01,0.000000e+00,5.822293e-02,1.938154e-01}; 
+Point(144) = {3.909292e-01,0.000000e+00,5.771770e-02,1.952414e-01}; 
+Point(145) = {4.063102e-01,0.000000e+00,5.713477e-02,1.964889e-01}; 
+Point(146) = {4.217836e-01,0.000000e+00,5.647729e-02,1.975529e-01}; 
+Point(147) = {4.373342e-01,0.000000e+00,5.574857e-02,1.984292e-01}; 
+Point(148) = {4.529467e-01,0.000000e+00,5.495201e-02,1.991144e-01}; 
+Point(149) = {4.686055e-01,0.000000e+00,5.409108e-02,1.996058e-01}; 
+Point(150) = {4.842954e-01,0.000000e+00,5.316926e-02,lc}; 
+Point(151) = {5.000008e-01,0.000000e+00,5.219014e-02,2.000000e-01}; 
+Point(152) = {5.157061e-01,0.000000e+00,5.115728e-02,1.999013e-01}; 
+Point(153) = {5.313960e-01,0.000000e+00,5.007425e-02,1.996057e-01}; 
+Point(154) = {5.470549e-01,0.000000e+00,4.894463e-02,1.991143e-01}; 
+Point(155) = {5.626673e-01,0.000000e+00,4.777199e-02,1.984291e-01}; 
+Point(156) = {5.782179e-01,0.000000e+00,4.655984e-02,1.975528e-01}; 
+Point(157) = {5.936913e-01,0.000000e+00,4.531165e-02,1.964888e-01}; 
+Point(158) = {6.090723e-01,0.000000e+00,4.403092e-02,1.952413e-01}; 
+Point(159) = {6.243456e-01,0.000000e+00,4.272101e-02,1.938153e-01}; 
+Point(160) = {6.394961e-01,0.000000e+00,4.138529e-02,1.922163e-01}; 
+Point(161) = {6.545091e-01,0.000000e+00,4.002701e-02,1.904508e-01}; 
+Point(162) = {6.693696e-01,0.000000e+00,3.864942e-02,1.885256e-01}; 
+Point(163) = {6.840628e-01,0.000000e+00,3.725576e-02,1.864484e-01}; 
+Point(164) = {6.985745e-01,0.000000e+00,3.584905e-02,1.842273e-01}; 
+Point(165) = {7.128901e-01,0.000000e+00,3.443245e-02,1.818711e-01}; 
+Point(166) = {7.269957e-01,0.000000e+00,3.300894e-02,1.793892e-01}; 
+Point(167) = {7.408773e-01,0.000000e+00,3.158154e-02,1.767913e-01}; 
+Point(168) = {7.545212e-01,0.000000e+00,3.015313e-02,1.740876e-01}; 
+Point(169) = {7.679139e-01,0.000000e+00,2.872668e-02,1.712889e-01}; 
+Point(170) = {7.810421e-01,0.000000e+00,2.730503e-02,1.684061e-01}; 
+Point(171) = {7.938930e-01,0.000000e+00,2.589105e-02,1.654508e-01}; 
+Point(172) = {8.064539e-01,0.000000e+00,2.448751e-02,1.624344e-01}; 
+Point(173) = {8.187124e-01,0.000000e+00,2.309725e-02,1.593690e-01}; 
+Point(174) = {8.306563e-01,0.000000e+00,2.172309e-02,1.562666e-01}; 
+Point(175) = {8.422739e-01,0.000000e+00,2.036772e-02,1.531394e-01}; 
+Point(176) = {8.535537e-01,0.000000e+00,1.903398e-02,1.499999e-01}; 
+Point(177) = {8.644845e-01,0.000000e+00,1.772453e-02,1.468604e-01}; 
+Point(178) = {8.750558e-01,0.000000e+00,1.644214e-02,1.437333e-01}; 
+Point(179) = {8.852569e-01,0.000000e+00,1.518951e-02,1.406308e-01}; 
+Point(180) = {8.950777e-01,0.000000e+00,1.396934e-02,1.375654e-01}; 
+Point(181) = {9.045087e-01,0.000000e+00,1.278429e-02,1.345491e-01}; 
+Point(182) = {9.135405e-01,0.000000e+00,1.163695e-02,1.315937e-01}; 
+Point(183) = {9.221641e-01,0.000000e+00,1.052998e-02,1.287110e-01}; 
+Point(184) = {9.303712e-01,0.000000e+00,9.465891e-03,1.259123e-01}; 
+Point(185) = {9.381535e-01,0.000000e+00,8.447210e-03,1.232086e-01}; 
+Point(186) = {9.455034e-01,0.000000e+00,7.476377e-03,1.206107e-01}; 
+Point(187) = {9.524136e-01,0.000000e+00,6.555737e-03,1.181288e-01}; 
+Point(188) = {9.588774e-01,0.000000e+00,5.687566e-03,1.157726e-01}; 
+Point(189) = {9.648883e-01,0.000000e+00,4.874101e-03,1.135515e-01}; 
+Point(190) = {9.704404e-01,0.000000e+00,4.117359e-03,1.114743e-01}; 
+Point(191) = {9.755284e-01,0.000000e+00,3.419365e-03,1.095491e-01}; 
+Point(192) = {9.801469e-01,0.000000e+00,2.781989e-03,1.077836e-01}; 
+Point(193) = {9.842916e-01,0.000000e+00,2.206860e-03,1.061847e-01}; 
+Point(194) = {9.879584e-01,0.000000e+00,1.695579e-03,1.047586e-01}; 
+Point(195) = {9.911436e-01,0.000000e+00,1.249551e-03,1.035112e-01}; 
+Point(196) = {9.938442e-01,0.000000e+00,8.699747e-04,1.024472e-01}; 
+Point(197) = {9.960575e-01,0.000000e+00,5.579769e-04,1.015708e-01}; 
+Point(198) = {9.977810e-01,0.000000e+00,3.143904e-04,1.008856e-01}; 
+Point(199) = {9.990134e-01,0.000000e+00,1.398841e-04,1.003943e-01}; 
+Point(200) = {9.997533e-01,0.000000e+00,3.498543e-05,lc}; 
+Point(201) = {1.000000e+00,1.000000e+00,0.000000e+00,lc}; 
+Point(202) = {9.997533e-01,1.000000e+00,-3.498543e-05,1.000987e-01}; 
+Point(203) = {9.990134e-01,1.000000e+00,-1.398841e-04,1.003943e-01}; 
+Point(204) = {9.977810e-01,1.000000e+00,-3.143904e-04,1.008856e-01}; 
+Point(205) = {9.960575e-01,1.000000e+00,-5.579769e-04,1.015708e-01}; 
+Point(206) = {9.938442e-01,1.000000e+00,-8.699747e-04,1.024472e-01}; 
+Point(207) = {9.911436e-01,1.000000e+00,-1.249551e-03,1.035112e-01}; 
+Point(208) = {9.879584e-01,1.000000e+00,-1.695579e-03,1.047586e-01}; 
+Point(209) = {9.842916e-01,1.000000e+00,-2.206860e-03,1.061847e-01}; 
+Point(210) = {9.801469e-01,1.000000e+00,-2.781989e-03,1.077836e-01}; 
+Point(211) = {9.755284e-01,1.000000e+00,-3.419365e-03,1.095491e-01}; 
+Point(212) = {9.704404e-01,1.000000e+00,-4.117359e-03,1.114743e-01}; 
+Point(213) = {9.648883e-01,1.000000e+00,-4.874101e-03,1.135515e-01}; 
+Point(214) = {9.588774e-01,1.000000e+00,-5.687566e-03,1.157726e-01}; 
+Point(215) = {9.524136e-01,1.000000e+00,-6.555737e-03,1.181288e-01}; 
+Point(216) = {9.455034e-01,1.000000e+00,-7.476377e-03,1.206107e-01}; 
+Point(217) = {9.381535e-01,1.000000e+00,-8.447210e-03,1.232086e-01}; 
+Point(218) = {9.303712e-01,1.000000e+00,-9.465891e-03,1.259123e-01}; 
+Point(219) = {9.221641e-01,1.000000e+00,-1.052998e-02,1.287110e-01}; 
+Point(220) = {9.135405e-01,1.000000e+00,-1.163695e-02,1.315937e-01}; 
+Point(221) = {9.045087e-01,1.000000e+00,-1.278429e-02,1.345491e-01}; 
+Point(222) = {8.950777e-01,1.000000e+00,-1.396934e-02,1.375654e-01}; 
+Point(223) = {8.852569e-01,1.000000e+00,-1.518951e-02,1.406308e-01}; 
+Point(224) = {8.750558e-01,1.000000e+00,-1.644214e-02,1.437333e-01}; 
+Point(225) = {8.644845e-01,1.000000e+00,-1.772453e-02,1.468604e-01}; 
+Point(226) = {8.535537e-01,1.000000e+00,-1.903398e-02,1.499999e-01}; 
+Point(227) = {8.422739e-01,1.000000e+00,-2.036772e-02,1.531394e-01}; 
+Point(228) = {8.306563e-01,1.000000e+00,-2.172309e-02,1.562666e-01}; 
+Point(229) = {8.187124e-01,1.000000e+00,-2.309725e-02,1.593690e-01}; 
+Point(230) = {8.064539e-01,1.000000e+00,-2.448751e-02,1.624344e-01}; 
+Point(231) = {7.938930e-01,1.000000e+00,-2.589105e-02,1.654508e-01}; 
+Point(232) = {7.810421e-01,1.000000e+00,-2.730503e-02,1.684061e-01}; 
+Point(233) = {7.679139e-01,1.000000e+00,-2.872668e-02,1.712889e-01}; 
+Point(234) = {7.545212e-01,1.000000e+00,-3.015313e-02,1.740876e-01}; 
+Point(235) = {7.408773e-01,1.000000e+00,-3.158154e-02,1.767913e-01}; 
+Point(236) = {7.269957e-01,1.000000e+00,-3.300894e-02,1.793892e-01}; 
+Point(237) = {7.128901e-01,1.000000e+00,-3.443245e-02,1.818711e-01}; 
+Point(238) = {6.985745e-01,1.000000e+00,-3.584905e-02,1.842273e-01}; 
+Point(239) = {6.840628e-01,1.000000e+00,-3.725576e-02,1.864484e-01}; 
+Point(240) = {6.693696e-01,1.000000e+00,-3.864942e-02,1.885256e-01}; 
+Point(241) = {6.545091e-01,1.000000e+00,-4.002701e-02,1.904508e-01}; 
+Point(242) = {6.394961e-01,1.000000e+00,-4.138529e-02,1.922163e-01}; 
+Point(243) = {6.243456e-01,1.000000e+00,-4.272101e-02,1.938153e-01}; 
+Point(244) = {6.090723e-01,1.000000e+00,-4.403092e-02,1.952413e-01}; 
+Point(245) = {5.936913e-01,1.000000e+00,-4.531165e-02,1.964888e-01}; 
+Point(246) = {5.782179e-01,1.000000e+00,-4.655984e-02,1.975528e-01}; 
+Point(247) = {5.626673e-01,1.000000e+00,-4.777199e-02,1.984291e-01}; 
+Point(248) = {5.470549e-01,1.000000e+00,-4.894463e-02,1.991143e-01}; 
+Point(249) = {5.313960e-01,1.000000e+00,-5.007425e-02,1.996057e-01}; 
+Point(250) = {5.157061e-01,1.000000e+00,-5.115728e-02,lc}; 
+Point(251) = {5.000008e-01,1.000000e+00,-5.219014e-02,2.000000e-01}; 
+Point(252) = {4.842954e-01,1.000000e+00,-5.316926e-02,1.999013e-01}; 
+Point(253) = {4.686055e-01,1.000000e+00,-5.409108e-02,1.996058e-01}; 
+Point(254) = {4.529467e-01,1.000000e+00,-5.495201e-02,1.991144e-01}; 
+Point(255) = {4.373342e-01,1.000000e+00,-5.574857e-02,1.984292e-01}; 
+Point(256) = {4.217836e-01,1.000000e+00,-5.647729e-02,1.975529e-01}; 
+Point(257) = {4.063102e-01,1.000000e+00,-5.713477e-02,1.964889e-01}; 
+Point(258) = {3.909292e-01,1.000000e+00,-5.771770e-02,1.952414e-01}; 
+Point(259) = {3.756559e-01,1.000000e+00,-5.822293e-02,1.938154e-01}; 
+Point(260) = {3.605053e-01,1.000000e+00,-5.864737e-02,1.922165e-01}; 
+Point(261) = {3.454924e-01,1.000000e+00,-5.898812e-02,1.904510e-01}; 
+Point(262) = {3.306319e-01,1.000000e+00,-5.924247e-02,1.885258e-01}; 
+Point(263) = {3.159386e-01,1.000000e+00,-5.940786e-02,1.864486e-01}; 
+Point(264) = {3.014269e-01,1.000000e+00,-5.948193e-02,1.842275e-01}; 
+Point(265) = {2.871112e-01,1.000000e+00,-5.946260e-02,1.818713e-01}; 
+Point(266) = {2.730056e-01,1.000000e+00,-5.934800e-02,1.793894e-01}; 
+Point(267) = {2.591240e-01,1.000000e+00,-5.913650e-02,1.767915e-01}; 
+Point(268) = {2.454802e-01,1.000000e+00,-5.882679e-02,1.740879e-01}; 
+Point(269) = {2.320875e-01,1.000000e+00,-5.841779e-02,1.712892e-01}; 
+Point(270) = {2.189592e-01,1.000000e+00,-5.790876e-02,1.684064e-01}; 
+Point(271) = {2.061082e-01,1.000000e+00,-5.729925e-02,1.654510e-01}; 
+Point(272) = {1.935473e-01,1.000000e+00,-5.658907e-02,1.624347e-01}; 
+Point(273) = {1.812888e-01,1.000000e+00,-5.577839e-02,1.593693e-01}; 
+Point(274) = {1.693449e-01,1.000000e+00,-5.486767e-02,1.562669e-01}; 
+Point(275) = {1.577273e-01,1.000000e+00,-5.385765e-02,1.531398e-01}; 
+Point(276) = {1.464474e-01,1.000000e+00,-5.274938e-02,1.500002e-01}; 
+Point(277) = {1.355165e-01,1.000000e+00,-5.154420e-02,1.468607e-01}; 
+Point(278) = {1.249452e-01,1.000000e+00,-5.024372e-02,1.437336e-01}; 
+Point(279) = {1.147441e-01,1.000000e+00,-4.884978e-02,1.406312e-01}; 
+Point(280) = {1.049232e-01,1.000000e+00,-4.736451e-02,1.375657e-01}; 
+Point(281) = {9.549212e-02,1.000000e+00,-4.579021e-02,1.345494e-01}; 
+Point(282) = {8.646032e-02,1.000000e+00,-4.412942e-02,1.315940e-01}; 
+Point(283) = {7.783660e-02,1.000000e+00,-4.238483e-02,1.287112e-01}; 
+Point(284) = {6.962952e-02,1.000000e+00,-4.055926e-02,1.259125e-01}; 
+Point(285) = {6.184718e-02,1.000000e+00,-3.865567e-02,1.232088e-01}; 
+Point(286) = {5.449721e-02,1.000000e+00,-3.667711e-02,1.206109e-01}; 
+Point(287) = {4.758692e-02,1.000000e+00,-3.462668e-02,1.181290e-01}; 
+Point(288) = {4.112309e-02,1.000000e+00,-3.250752e-02,1.157728e-01}; 
+Point(289) = {3.511214e-02,1.000000e+00,-3.032277e-02,1.135517e-01}; 
+Point(290) = {2.955997e-02,1.000000e+00,-2.807550e-02,1.114745e-01}; 
+Point(291) = {2.447206e-02,1.000000e+00,-2.576878e-02,1.095493e-01}; 
+Point(292) = {1.985344e-02,1.000000e+00,-2.340553e-02,1.077837e-01}; 
+Point(293) = {1.570869e-02,1.000000e+00,-2.098859e-02,1.061848e-01}; 
+Point(294) = {1.204184e-02,1.000000e+00,-1.852062e-02,1.047587e-01}; 
+Point(295) = {8.856565e-03,1.000000e+00,-1.600414e-02,1.035113e-01}; 
+Point(296) = {6.155997e-03,1.000000e+00,-1.344148e-02,1.024472e-01}; 
+Point(297) = {3.942788e-03,1.000000e+00,-1.083471e-02,1.015709e-01}; 
+Point(298) = {2.219111e-03,1.000000e+00,-8.185687e-03,1.008857e-01}; 
+Point(299) = {9.866953e-04,1.000000e+00,-5.496060e-03,1.003943e-01}; 
+Point(300) = {2.467632e-04,1.000000e+00,-2.767267e-03,lc}; 
+Point(301) = {0.000000e+00,1.000000e+00,1.911503e-39,lc}; 
+Point(302) = {2.467632e-04,1.000000e+00,2.767267e-03,1.000987e-01}; 
+Point(303) = {9.866953e-04,1.000000e+00,5.496060e-03,1.003943e-01}; 
+Point(304) = {2.219111e-03,1.000000e+00,8.185687e-03,1.008857e-01}; 
+Point(305) = {3.942788e-03,1.000000e+00,1.083471e-02,1.015709e-01}; 
+Point(306) = {6.155997e-03,1.000000e+00,1.344148e-02,1.024472e-01}; 
+Point(307) = {8.856565e-03,1.000000e+00,1.600414e-02,1.035113e-01}; 
+Point(308) = {1.204184e-02,1.000000e+00,1.852062e-02,1.047587e-01}; 
+Point(309) = {1.570869e-02,1.000000e+00,2.098859e-02,1.061848e-01}; 
+Point(310) = {1.985344e-02,1.000000e+00,2.340553e-02,1.077837e-01}; 
+Point(311) = {2.447206e-02,1.000000e+00,2.576878e-02,1.095493e-01}; 
+Point(312) = {2.955997e-02,1.000000e+00,2.807550e-02,1.114745e-01}; 
+Point(313) = {3.511214e-02,1.000000e+00,3.032277e-02,1.135517e-01}; 
+Point(314) = {4.112309e-02,1.000000e+00,3.250752e-02,1.157728e-01}; 
+Point(315) = {4.758692e-02,1.000000e+00,3.462668e-02,1.181290e-01}; 
+Point(316) = {5.449721e-02,1.000000e+00,3.667711e-02,1.206109e-01}; 
+Point(317) = {6.184718e-02,1.000000e+00,3.865567e-02,1.232088e-01}; 
+Point(318) = {6.962952e-02,1.000000e+00,4.055926e-02,1.259125e-01}; 
+Point(319) = {7.783660e-02,1.000000e+00,4.238483e-02,1.287112e-01}; 
+Point(320) = {8.646032e-02,1.000000e+00,4.412942e-02,1.315940e-01}; 
+Point(321) = {9.549212e-02,1.000000e+00,4.579021e-02,1.345494e-01}; 
+Point(322) = {1.049232e-01,1.000000e+00,4.736451e-02,1.375657e-01}; 
+Point(323) = {1.147441e-01,1.000000e+00,4.884978e-02,1.406312e-01}; 
+Point(324) = {1.249452e-01,1.000000e+00,5.024372e-02,1.437336e-01}; 
+Point(325) = {1.355165e-01,1.000000e+00,5.154420e-02,1.468607e-01}; 
+Point(326) = {1.464474e-01,1.000000e+00,5.274938e-02,1.500002e-01}; 
+Point(327) = {1.577273e-01,1.000000e+00,5.385765e-02,1.531398e-01}; 
+Point(328) = {1.693449e-01,1.000000e+00,5.486767e-02,1.562669e-01}; 
+Point(329) = {1.812888e-01,1.000000e+00,5.577839e-02,1.593693e-01}; 
+Point(330) = {1.935473e-01,1.000000e+00,5.658907e-02,1.624347e-01}; 
+Point(331) = {2.061082e-01,1.000000e+00,5.729925e-02,1.654510e-01}; 
+Point(332) = {2.189592e-01,1.000000e+00,5.790876e-02,1.684064e-01}; 
+Point(333) = {2.320875e-01,1.000000e+00,5.841779e-02,1.712892e-01}; 
+Point(334) = {2.454802e-01,1.000000e+00,5.882679e-02,1.740879e-01}; 
+Point(335) = {2.591240e-01,1.000000e+00,5.913650e-02,1.767915e-01}; 
+Point(336) = {2.730056e-01,1.000000e+00,5.934800e-02,1.793894e-01}; 
+Point(337) = {2.871112e-01,1.000000e+00,5.946260e-02,1.818713e-01}; 
+Point(338) = {3.014269e-01,1.000000e+00,5.948193e-02,1.842275e-01}; 
+Point(339) = {3.159386e-01,1.000000e+00,5.940786e-02,1.864486e-01}; 
+Point(340) = {3.306319e-01,1.000000e+00,5.924247e-02,1.885258e-01}; 
+Point(341) = {3.454924e-01,1.000000e+00,5.898812e-02,1.904510e-01}; 
+Point(342) = {3.605053e-01,1.000000e+00,5.864737e-02,1.922165e-01}; 
+Point(343) = {3.756559e-01,1.000000e+00,5.822293e-02,1.938154e-01}; 
+Point(344) = {3.909292e-01,1.000000e+00,5.771770e-02,1.952414e-01}; 
+Point(345) = {4.063102e-01,1.000000e+00,5.713477e-02,1.964889e-01}; 
+Point(346) = {4.217836e-01,1.000000e+00,5.647729e-02,1.975529e-01}; 
+Point(347) = {4.373342e-01,1.000000e+00,5.574857e-02,1.984292e-01}; 
+Point(348) = {4.529467e-01,1.000000e+00,5.495201e-02,1.991144e-01}; 
+Point(349) = {4.686055e-01,1.000000e+00,5.409108e-02,1.996058e-01}; 
+Point(350) = {4.842954e-01,1.000000e+00,5.316926e-02,lc}; 
+Point(351) = {5.000008e-01,1.000000e+00,5.219014e-02,2.000000e-01}; 
+Point(352) = {5.157061e-01,1.000000e+00,5.115728e-02,1.999013e-01}; 
+Point(353) = {5.313960e-01,1.000000e+00,5.007425e-02,1.996057e-01}; 
+Point(354) = {5.470549e-01,1.000000e+00,4.894463e-02,1.991143e-01}; 
+Point(355) = {5.626673e-01,1.000000e+00,4.777199e-02,1.984291e-01}; 
+Point(356) = {5.782179e-01,1.000000e+00,4.655984e-02,1.975528e-01}; 
+Point(357) = {5.936913e-01,1.000000e+00,4.531165e-02,1.964888e-01}; 
+Point(358) = {6.090723e-01,1.000000e+00,4.403092e-02,1.952413e-01}; 
+Point(359) = {6.243456e-01,1.000000e+00,4.272101e-02,1.938153e-01}; 
+Point(360) = {6.394961e-01,1.000000e+00,4.138529e-02,1.922163e-01}; 
+Point(361) = {6.545091e-01,1.000000e+00,4.002701e-02,1.904508e-01}; 
+Point(362) = {6.693696e-01,1.000000e+00,3.864942e-02,1.885256e-01}; 
+Point(363) = {6.840628e-01,1.000000e+00,3.725576e-02,1.864484e-01}; 
+Point(364) = {6.985745e-01,1.000000e+00,3.584905e-02,1.842273e-01}; 
+Point(365) = {7.128901e-01,1.000000e+00,3.443245e-02,1.818711e-01}; 
+Point(366) = {7.269957e-01,1.000000e+00,3.300894e-02,1.793892e-01}; 
+Point(367) = {7.408773e-01,1.000000e+00,3.158154e-02,1.767913e-01}; 
+Point(368) = {7.545212e-01,1.000000e+00,3.015313e-02,1.740876e-01}; 
+Point(369) = {7.679139e-01,1.000000e+00,2.872668e-02,1.712889e-01}; 
+Point(370) = {7.810421e-01,1.000000e+00,2.730503e-02,1.684061e-01}; 
+Point(371) = {7.938930e-01,1.000000e+00,2.589105e-02,1.654508e-01}; 
+Point(372) = {8.064539e-01,1.000000e+00,2.448751e-02,1.624344e-01}; 
+Point(373) = {8.187124e-01,1.000000e+00,2.309725e-02,1.593690e-01}; 
+Point(374) = {8.306563e-01,1.000000e+00,2.172309e-02,1.562666e-01}; 
+Point(375) = {8.422739e-01,1.000000e+00,2.036772e-02,1.531394e-01}; 
+Point(376) = {8.535537e-01,1.000000e+00,1.903398e-02,1.499999e-01}; 
+Point(377) = {8.644845e-01,1.000000e+00,1.772453e-02,1.468604e-01}; 
+Point(378) = {8.750558e-01,1.000000e+00,1.644214e-02,1.437333e-01}; 
+Point(379) = {8.852569e-01,1.000000e+00,1.518951e-02,1.406308e-01}; 
+Point(380) = {8.950777e-01,1.000000e+00,1.396934e-02,1.375654e-01}; 
+Point(381) = {9.045087e-01,1.000000e+00,1.278429e-02,1.345491e-01}; 
+Point(382) = {9.135405e-01,1.000000e+00,1.163695e-02,1.315937e-01}; 
+Point(383) = {9.221641e-01,1.000000e+00,1.052998e-02,1.287110e-01}; 
+Point(384) = {9.303712e-01,1.000000e+00,9.465891e-03,1.259123e-01}; 
+Point(385) = {9.381535e-01,1.000000e+00,8.447210e-03,1.232086e-01}; 
+Point(386) = {9.455034e-01,1.000000e+00,7.476377e-03,1.206107e-01}; 
+Point(387) = {9.524136e-01,1.000000e+00,6.555737e-03,1.181288e-01}; 
+Point(388) = {9.588774e-01,1.000000e+00,5.687566e-03,1.157726e-01}; 
+Point(389) = {9.648883e-01,1.000000e+00,4.874101e-03,1.135515e-01}; 
+Point(390) = {9.704404e-01,1.000000e+00,4.117359e-03,1.114743e-01}; 
+Point(391) = {9.755284e-01,1.000000e+00,3.419365e-03,1.095491e-01}; 
+Point(392) = {9.801469e-01,1.000000e+00,2.781989e-03,1.077836e-01}; 
+Point(393) = {9.842916e-01,1.000000e+00,2.206860e-03,1.061847e-01}; 
+Point(394) = {9.879584e-01,1.000000e+00,1.695579e-03,1.047586e-01}; 
+Point(395) = {9.911436e-01,1.000000e+00,1.249551e-03,1.035112e-01}; 
+Point(396) = {9.938442e-01,1.000000e+00,8.699747e-04,1.024472e-01}; 
+Point(397) = {9.960575e-01,1.000000e+00,5.579769e-04,1.015708e-01}; 
+Point(398) = {9.977810e-01,1.000000e+00,3.143904e-04,1.008856e-01}; 
+Point(399) = {9.990134e-01,1.000000e+00,1.398841e-04,1.003943e-01}; 
+Point(400) = {9.997533e-01,1.000000e+00,3.498543e-05,lc}; 
+Line(1) = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 
+50}; 
+Line(2) = { 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 
+96, 97, 98, 99, 100}; 
+Line(3) = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 
+134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150}; 
+Line(4) = { 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 
+184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 1}; 
+Line(5) = { 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 
+235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250}; 
+Line(6) = { 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 
+284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300}; 
+Line(7) = { 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 
+334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350}; 
+Line(8) = { 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 
+384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 201}; 
+Line(9)  = { 1, 201}; 
+Line(10) = { 100, 300}; 
+Line Loop(13) = {5,6,7,8}; 
+Plane Surface(14) = {13}; 
+Line(15)  = { 50, 250}; 
+Line(16)  = { 150, 350}; 
+Line Loop(17) = {1,15,-5,-9}; 
+Ruled Surface(18) = {17}; 
+Line Loop(19) = {2,10,-6,-15}; 
+Ruled Surface(20) = {19}; 
+Line Loop(21) = {-3,10,7,-16}; 
+Ruled Surface(22) = {21}; 
+Line Loop(23) = {8,-9,-4,16}; 
+Ruled Surface(24) = {23}; 
+Point (1001) = {-10.,0., 10.,3.}; 
+Point (1002) = { 10.,0., 10.,3.}; 
+Point (1003) = { 10.,0., -10.,3.}; 
+Point (1004) = {-10.,0., -10.,3.}; 
+Point (1010) = { 10.,0., 0.,3.}; 
+Point (1011) = {-10.,0., 0.,3.}; 
+Point (1005) = {-10., 10., 10.,3.}; 
+Point (1006) = { 10., 10., 10.,3.}; 
+Point (1007) = { 10., 10.,-10.,3.}; 
+Point (1008) = {-10., 10.,-10.,3.}; 
+Line(1001) = {1001,1002}; 
+Line(1003) = {1004,1003}; 
+Line(1005) = {1005,1006}; 
+Line(1006) = {1006,1007}; 
+Line(1007) = {1008,1007}; 
+Line(1008) = {1005,1008}; 
+Line(1009) = {1001,1005}; 
+Line(1010) = {1002,1006}; 
+Line(1011) = {1003,1007}; 
+Line(1012) = {1004,1008}; 
+Line(1013) = {1010,1}; 
+Line(1014) = {1011,100}; 
+Line(1015) = {1002,1010}; 
+Line(1016) = {1001,1011}; 
+Line(1017) = {1011,1004}; 
+Line(1018) = {1010,1003}; 
+Line Loop(1000)= {1001,1015,1013,-4,-3,-1014,-1016}; 
+Plane Surface(1100) = {1000}; 
+Line Loop(1001)= {1014,-2,-1,-1013,1018,-1003,-1017}; 
+Plane Surface(1101) = {1001}; 
+Line Loop(1002)= {1005,1006,-1007,-1008}; 
+Plane Surface(1102 ) = {1002}; 
+Line Loop(1003)= {1009,1008,-1012,-1017,-1016}; 
+Plane Surface(1103 ) = {1003}; 
+Line Loop(1004)= {1006,-1011,-1018,-1015,1010}; 
+Plane Surface(1104 ) = {1004}; 
+Line Loop(1005)= {1009, 1005,-1010,-1001}; 
+Plane Surface(1105 ) = {1005}; 
+Line Loop(1006)= {1012,1007,-1011,-1003}; 
+Plane Surface(1106 ) = {1006}; 
+Surface Loop(1107) = {1101,1100,1105,-1103,-1102,1104,-1106,-24,14,18,20,-22}; 
+Complex Volume(1108) = {1107}; 
+ 
+Physical Volume(1110) = {1108}; 
diff --git a/benchmarks/3d/p19.geo b/benchmarks/3d/p19.geo
new file mode 100644
index 0000000000000000000000000000000000000000..07bd6fc8db790542f85f11f5983f15fa2e2f5f3a
--- /dev/null
+++ b/benchmarks/3d/p19.geo
@@ -0,0 +1,129 @@
+fact     = 0.4 ;
+rondelle = fact * 0.01;
+iris     = fact * 0.004;
+size     = fact * 0.01;
+
+larg = 86.36e-3 / 2.0 ;
+long = 45.0e-3 ;
+l    = 16.e-3 / 2.0 ;
+re   = 90.e-3 / 2.0 ;
+re2  = re + 3.e-3 ;
+ri   = 8.e-3 / 2.0 ;
+ll   = 60.0e-3 / 2.0;
+a    = larg - ll;
+c45  = 0.5^0.5  ;
+
+hg   = 21.59e-3 ;
+hcav = 42.5e-3 ;
+
+x2   = long;
+y1   = ri * c45;
+y2   = ri ;
+y3   = l ;
+ss1  = l / re ;
+xtemp = re * ( ( 1.0 - ss1 * ss1 ) ^ 0.5 ) ;
+ss2  = ( 1.0 - ( xtemp / re2 ) * ( xtemp / re2 ) ) ^ 0.5 ;
+y4   = ss2 * xtemp ;
+ss3  = ll / re2;
+xtemp2 = re2 *  ( ( 1.0 - ss3 * ss3 ) ^ 0.5 ) ;
+x1   = long - ( xtemp - xtemp2 ) ;
+x6   = x1 + xtemp ;
+x3   = x6 - re * c45 ;
+x4   = x6 - ri ;
+x5   = x6 - ri * c45 ;
+x7   = x6 + ri * c45 ;
+x8   = x6 + ri ;
+x9   = x6 + re * c45 ;
+x10  = x6 + re ;
+y5   = ll ;
+y6   = re * c45 ;
+y7   = re ;
+y8   = larg ;
+
+
+Point(1) = {0.0,0.0,0.0,size};
+Point(2) = {0.0,y8,0.0,size};
+Point(3) = {x2,y8,0.0,size};
+Point(4) = {x2,y5,0.0,size};
+Point(5) = {x1,y4,0.0,size};
+Point(6) = {x1,y3,0.0,iris};
+Point(7) = {x1,0.0,0.0,iris};
+Point(8) = {x3,y6,0.0,size};
+Point(9) = {x6,y7,0.0,size};
+Point(10) = {x9,y6,0.0,size};
+Point(11) = {x10,0.0,0.0,size};
+Point(12) = {x8,0.0,0.0,rondelle};
+Point(13) = {x6,0.0,0.0,rondelle};
+Point(14) = {x4,0.0,0.0,rondelle};
+Point(15) = {x7,y1,0.0,rondelle};
+Point(16) = {x6,y2,0.0,rondelle};
+Point(17) = {x5,y1,0.0,rondelle};
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {5,6};
+Line(5) = {1,7};
+Line(6) = {7,14};
+Line(10) = {6,7};
+Line(11) = {14,13};
+Line(12) = {13,12};
+Circle(16) = {11,13,10};
+Circle(17) = {10,13,9};
+Circle(18) = {9,13,8};
+Circle(19) = {8,13,6};
+Circle(20) = {4,13,5};
+Line(21) = {11,12};
+Circle(22) = {17,13,14};
+Circle(23) = {16,13,17};
+Circle(24) = {15,13,16};
+Circle(25) = {12,13,15};
+
+Loop(26) = {-5,1,2,3,20,4,10};
+Plane Surface(27) = {26};
+
+Loop(28) = {-6,-10,-19,-18,-17,-16,21,25,24,23,22};
+Plane Surface(29) = {28};
+
+Loop(30) = {11,12,25,24,23,22};
+Plane Surface(31) = {30};
+
+Extrude(27, {0,0,hg} );
+Coherence;
+
+Extrude(29, {0,0,hg} );
+Coherence;
+
+Extrude(31, {0,0,hg} );
+Coherence;
+
+Volume(127) = {60,-27,-43,61,46,49,52,55,58};
+Volume Complexe(128) = {127};
+
+Extrude (105, {0,0,hcav-hg} );
+Coherence;
+
+Extrude (126, {0,0,hcav-hg} );
+Coherence;
+
+Characteristic Length {58,71} = 0.01; 
+
+Volume(196) = {31,-115,-117,-96,-99,-102,-104,-173,-184,-186,-165,-168,-171,-195};
+Complex Volume(197) = {196};
+
+Volume(198) = {93,-29,-76,104,173,-144,174,-147,-60,-81,-150,-153,-84,-87,-156,-159,-90,162,165,96,99,102,171,168};
+
+Complex Volume(199) = {198};
+
+GO      = 1 ;
+CAV     = 2 ;
+DIS     = 3 ; 
+CLDSRC  = 4 ;
+CLD     = 5 ;
+
+Physical Volume (GO)     = 128;
+Physical Volume (CAV)    = 199;
+Physical Volume (DIS)    = 197;
+Physical Volume (CLDSRC) = 46;
+Physical Volume (CLD)    = {61,49,27,52,55,58,81,150,147,84,153,87,156,90,159,29,31,174,195};
+Point(85) = {0.0,0.0,0.0,1.0};
diff --git a/benchmarks/3d/p20.geo b/benchmarks/3d/p20.geo
new file mode 100644
index 0000000000000000000000000000000000000000..c58c10a2e055fb4cc98c4f4584f3d7609d2e3d98
--- /dev/null
+++ b/benchmarks/3d/p20.geo
@@ -0,0 +1,225 @@
+/*
+         c8
+         +---------------------+ c7
+         |                 c4  |
+         |   +-------------+   |
+         |   | c3          +---+
+         +---+             c5  c6   
+         c1  c2
+
+*/
+
+/* Base inferieure du fer */
+D1 = .05;
+/* Base inferieure du fer */
+D2 = .15;
+D3 = .01;
+D4 = .03;
+D5 = .05;
+D6 = .025;
+
+ax  = 3.2;
+ay  = 3.2;
+az  = 3.2;
+Dy = ax * D1;
+Dz = ay * D2;
+Dx = az * D5;
+
+e  = 2*.001;
+
+l = .008;
+lbox = 2.*ax*l;
+
+c1=newp;
+Point(c1) = {0,0,0,l};
+c2=newp;
+Point(c2) = {0,D1,0,l};
+c3=newp;
+Point(c3) = {0,D1,D2,l};
+c4=newp;
+Point(c4) = {0,D3,D2,l};
+c5=newp;
+Point(c5) = {0,D3,D2-D4,l};
+c6=newp;
+Point(c6) = {0,D1-D4,D2-D4,l};
+c7=newp;
+Point(c7) = {0,D1-D4,D4,l};
+c8=newp;
+Point(c8) = {0,0,D4,l};
+
+d1 = newreg;
+Line (d1) = Liste[c1,c2];
+d2 = newreg;
+Line (d2) = Liste[c2,c3];
+d3 = newreg;
+Line (d3) = Liste[c3,c4];
+d4 = newreg;
+Line (d4) = Liste[c4,c5];
+d5 = newreg;
+Line (d5) = Liste[c5,c6];
+d6 = newreg;
+Line (d6) = Liste[c6,c7];
+d7 = newreg;
+Line (d7) = Liste[c7,c8];
+d8 = newreg;
+Line (d8) = Liste[c8,c1];
+
+e1 = newreg;
+Boucle (newreg) = Liste[d1,d2,d3,d4,d5,d6,d7,d8];
+f1 = newreg;
+Zone (f1) = Liste[e1];
+Extrude ( f1, {D5,0.00000E+00, 0.00000E+00} );
+
+box1 = newp;
+Point(box1) = {Dx,Dy,Dz,lbox};
+box2 = newp;
+Point(box2) = {Dx,Dy,-Dz/6,lbox};
+box3 = newp;
+Point(box3) = {Dx,0,-Dz/6,lbox};
+box4 = newp;
+Point(box4) = {Dx,0,Dz,lbox};
+box5 = newp;
+Point(box5) = {0,Dy,-Dz/6,lbox};
+box6 = newp;
+Point(box6) = {0,Dy,Dz,lbox};
+box7 = newp;
+Point(box7) = {0,0,Dz,lbox};
+box8 = newp;
+Point(box8) = {0,0,-Dz/6,lbox};
+
+lbox1 = newreg;
+Line(lbox1) = Liste[box7,box6];
+lbox2 = newreg;
+Line(lbox2) = Liste[box6,box1];
+lbox3 = newreg;
+Line(lbox3) = Liste[box1,box4];
+lbox4 = newreg;
+Line(lbox4) = Liste[box4,box7];
+lbox5 = newreg;
+Line(lbox5) = Liste[box8,box5];
+lbox6 = newreg;
+Line(lbox6) = Liste[box5,box2];
+lbox7 = newreg;
+Line(lbox7) = Liste[box2,box3];
+lbox8 = newreg;
+Line(lbox8) = Liste[box3,box8];
+lbox9 = newreg;
+Line(lbox9) = Liste[box5,box6];
+lbox10 = newreg;
+Line(lbox10) = Liste[box2,box1];
+lbox11 = newreg;
+Line(lbox11) = Liste[box3,box4];
+
+
+
+s1 = newp;
+Point(s1) = {0,0,D4+e,l};
+s2 = newp;
+Point(s2) = {0,0,D2-D4-e,l};
+s3 = newp;
+Point(s3) = {0,D3-e,D2-D4-e,l};
+s4 = newp;
+Point(s4) = {0,D3-e,D4+e,l};
+
+q1 = newreg;
+Line(q1) = Liste[s1,s2];
+q2 = newreg;
+Line(q2) = Liste[s2,s3];
+q3 = newreg;
+Line(q3) = Liste[s3,s4];
+q4 = newreg;
+Line(q4) = Liste[s4,s1];
+
+v1 = newreg;
+Line(v1) = Liste[box8,c1];
+v2 = newreg;
+Line(v2) = Liste[s2,box7];
+v3 = newreg;
+Line(v3) = Liste[s1,c8];
+
+e2 = newreg;
+Boucle (newreg) = Liste[q1,q2,q3,q4];
+f2 = newreg;
+Reglee (f2) = Liste[e2];
+Extrude ( f2, {D6,0.00000E+00, 0.00000E+00} );
+
+DxInducteur = .005;
+DyInducteur = .01;
+DzInducteur = .06;
+Rinducteur  = .001;
+Xinducteur  = .028;
+Yinducteur  = .00;
+Zinducteur  = .04;
+LcInducteur = .006;
+
+r1 = newp;
+Point(r1) = {Xinducteur,Yinducteur,Zinducteur,LcInducteur};
+r2 = newp;
+Point(r2) = {Xinducteur+DxInducteur,Yinducteur,Zinducteur,LcInducteur};
+r3 = newp;
+Point(r3) = {Xinducteur+DxInducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+r4 = newp;
+Point(r4) = {Xinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+cc = newp;
+Point(cc) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+r5 = newp;
+Point(r5) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+r6 = newp;
+Point(r6) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+DxInducteur+Rinducteur,Zinducteur,LcInducteur};
+r7 = newp;
+Point(r7) = {0,Yinducteur+DxInducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+r8 = newp;
+Point(r8) = {0,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+
+ll1 = newreg;
+Line(ll1) = Liste[r2,r1];
+ll2 = newreg;
+Line(ll2) = Liste[r1,r4];
+ll3 = newreg;
+Arc Trigonometrique (ll3) = Liste[r4,cc,r5];
+ll4 = newreg;
+Line(ll4) = Liste[r5,r8];
+ll5 = newreg;
+Line(ll5) = Liste[r8,r7];
+ll6 = newreg;
+Line(ll6) = Liste[r7,r6];
+ll7 = newreg;
+Arc Trigonometrique(ll7) = Liste[r3,cc,r6];
+ll8 = newreg;
+Line(ll8) = Liste[r3,r2];
+
+BFondDeLInducteur = newreg;
+Boucle(BFondDeLInducteur) = Liste[ll1,ll2,ll3,ll4,ll5,ll6,-ll7,ll8];
+FondDeLInducteur = newreg;
+Zone(FondDeLInducteur) = Liste[BFondDeLInducteur];
+Extrude ( FondDeLInducteur, {0,0,DzInducteur} );
+
+Boucle(127) = Liste[2,3,4,5,6,7,-62,-59,-58,-57,61,45,-53,-49,60,1];
+Zone(128) = Liste[127,116];
+Boucle(129) = Liste[39,18,-20,-60,-52,55,48,-61,71,-65,-70,62];
+Zone(130) = Liste[129,104];
+Boucle(131) = Liste[50,51,52,49];
+Reglee(132) = Liste[131];
+Boucle(133) = Liste[-55,-51,54,47];
+Reglee(134) = Liste[133];
+Boucle(135) = Liste[46,47,48,45];
+Reglee(136) = Liste[135];
+Boucle(137) = Liste[54,-46,-53,50];
+Reglee(138) = Liste[137];
+Volume(139) = Liste[117,-92,105,108,111,114,126,120,-123,125];
+Volume Complexe(140) = Liste[139];
+Volume(141) = Liste[73,-64,76,79,81,82];
+Volume Complexe(142) = Liste[141];
+Volume(143) = Liste[-43,10,-23,-26,-29,-32,-35,-38,-41,-44];
+Volume Complexe(144) = Liste[143];
+Volume(145) = Liste[26,-128,29,32,35,38,41,-130,44,23,-132,138,-134,136,-76,-79,-81,-82,92,-108,-111,-114,-126,-120,123,-125];
+Volume Complexe(146) = Liste[145];
+Physical Surface (11111) = Liste [117];
+Physical Surface (22222) = Liste [92,123,120,126,114,108,125,111];
+Physical Surface (33333) = Liste [10,43,64,73,105,117,128,130,132,134,136,138];
+Physical Volume  (44444) = Liste [140];
+Physical Volume  (55555) = Liste [142,144];
+Physical Volume  (66666) = Liste [146];
+
+
+
diff --git a/benchmarks/3d/p7-ExtrMesh.geo b/benchmarks/3d/p7-ExtrMesh.geo
new file mode 100644
index 0000000000000000000000000000000000000000..8e8f13f00f2135efc18f75f4d40a04a12825705e
--- /dev/null
+++ b/benchmarks/3d/p7-ExtrMesh.geo
@@ -0,0 +1,133 @@
+lcp = 10;      
+lci = 10;      
+      
+/* Plaque */      
+      
+Point(1) = {0,0,0,lcp};      
+Point(2) = {294,0,0,lcp};      
+Point(3) = {294,294,0,lcp};      
+Point(4) = {0,294,0,lcp};      
+Point(5) = {0,294,19,lcp};      
+Point(6) = {294,294,19,lcp};      
+Point(7) = {294,0,19,lcp};      
+Point(8) = {0,0,19,lcp};      
+Point(9) = {18,18,19,lcp};      
+Point(10) = {18,18,0,lcp};      
+Point(11) = {126,18,0,lcp};      
+Point(12) = {126,18,19,lcp};      
+Point(13) = {126,126,19,lcp};      
+Point(14) = {126,126,0,lcp};      
+Point(15) = {18,126,0,lcp};      
+Point(16) = {18,126,19,lcp};      
+      
+Line(1) = {4,3};      
+Line(2) = {3,2};      
+Line(3) = {2,1};      
+Line(4) = {1,4};      
+Line(9) = {15,14};      
+Line(10) = {14,11};      
+Line(11) = {11,10};      
+Line(12) = {10,15};      
+  
+      
+Line Loop(33) = {1,2,3,4};      
+Line Loop(34) = {9,10,11,12};      
+Plane Surface(35) = {33,34};      
+      
+/* Inducteur */      
+      
+Point(17) = {94,50,49,lci};      
+Point(18) = {94,150,49,lci};      
+      
+Point(19) = {119,50,49,lci};      
+Point(20) = {119,150,49,lci};      
+      
+Point(21) = {144,0,49,lci};      
+Point(22) = {144,25,49,lci};      
+Point(23) = {144,50,49,lci};      
+Point(24) = {144,150,49,lci};      
+Point(25) = {144,175,49,lci};      
+Point(26) = {144,200,49,lci};      
+      
+Point(27) = {244,0,49,lci};      
+Point(28) = {244,25,49,lci};      
+Point(29) = {244,50,49,lci};      
+Point(30) = {244,150,49,lci};      
+Point(31) = {244,175,49,lci};      
+Point(32) = {244,200,49,lci};      
+      
+Point(33) = {269,50,49,lci};      
+Point(34) = {269,150,49,lci};      
+      
+Point(35) = {294,50,49,lci};      
+Point(36) = {294,150,49,lci};      
+      
+      
+Circle(39) = {25,24,20};      
+Circle(40) = {26,24,18};      
+Circle(41) = {19,23,22};      
+Circle(42) = {17,23,21};      
+Circle(43) = {28,29,33};      
+Circle(44) = {27,29,35};      
+Circle(45) = {34,30,31};      
+Circle(46) = {36,30,32};      
+Line(47) = {31,32};      
+Line(48) = {32,26};      
+Line(49) = {26,25};      
+Line(50) = {25,31};      
+Line(51) = {20,18};      
+Line(52) = {18,17};      
+Line(53) = {17,19};      
+Line(54) = {19,20};      
+Line(55) = {22,21};      
+Line(56) = {21,27};      
+Line(57) = {27,28};      
+Line(58) = {28,22};      
+Line(59) = {33,35};      
+Line(60) = {35,36};      
+Line(61) = {36,34};      
+Line(62) = {34,33};      
+      
+Line Loop(63) = {48,49,50,47};      
+Plane Surface(64) = {63};      
+Line Loop(65) = {-47,-45,-61,46};      
+Plane Surface(66) = {65};      
+Line Loop(67) = {61,62,59,60};      
+Plane Surface(68) = {67};      
+Line Loop(69) = {-59,-43,-57,44};      
+Plane Surface(70) = {69};      
+Line Loop(71) = {58,55,56,57};      
+Plane Surface(72) = {71};      
+Line Loop(73) = {-42,53,41,55};      
+Plane Surface(74) = {73};      
+Line Loop(75) = {52,53,54,51};      
+Plane Surface(76) = {75};      
+Line Loop(77) = {-51,-39,-49,40};      
+Plane Surface(78) = {77};      
+      
+Extrude(64, {0,0,100});      
+Coherence;      
+Extrude(78, {0,0,100});      
+Coherence;      
+Extrude(76, {0,0,100});      
+Coherence;      
+Extrude(74, {0,0,100});      
+Coherence;      
+Extrude(72, {0,0,100});      
+Coherence;      
+Extrude(70, {0,0,100});      
+Coherence;      
+Extrude(68, {0,0,100});      
+Coherence;      
+Extrude(66, {0,0,100});      
+Coherence;      
+      
+Extrude Surface (35, {0,0.0,19})  
+{  
+Layers {3,3,3}{100,200,300}{.1,.9,1.};  
+};  
+  
+Coherence;  
+
+Surface Loop(297) = {144,131,76,74,153,166,161,175,72,183,209,70,68,66,64,87,121,78,113,95,245,223,201,210,232,254,100,122,253,231,188,139};
+Complex Volume(298) = {297};
diff --git a/benchmarks/3d/p7.geo b/benchmarks/3d/p7.geo
new file mode 100644
index 0000000000000000000000000000000000000000..6eab2b0f41a4b65902bf7a310eb14800461f376a
--- /dev/null
+++ b/benchmarks/3d/p7.geo
@@ -0,0 +1,177 @@
+lcp = 10;  
+lci = 10;  
+  
+/* Plaque */  
+  
+Point(1) = {0,0,0,lcp};  
+Point(2) = {294,0,0,lcp};  
+Point(3) = {294,294,0,lcp};  
+Point(4) = {0,294,0,lcp};  
+Point(5) = {0,294,19,lcp};  
+Point(6) = {294,294,19,lcp};  
+Point(7) = {294,0,19,lcp};  
+Point(8) = {0,0,19,lcp};  
+Point(9) = {18,18,19,lcp};  
+Point(10) = {18,18,0,lcp};  
+Point(11) = {126,18,0,lcp};  
+Point(12) = {126,18,19,lcp};  
+Point(13) = {126,126,19,lcp};  
+Point(14) = {126,126,0,lcp};  
+Point(15) = {18,126,0,lcp};  
+Point(16) = {18,126,19,lcp};  
+  
+Line(1) = {4,3};  
+Line(2) = {3,2};  
+Line(3) = {2,1};  
+Line(4) = {1,4};  
+Line(5) = {5,6};  
+Line(6) = {6,7};  
+Line(7) = {7,8};  
+Line(8) = {8,5};  
+Line(9) = {15,14};  
+Line(10) = {14,11};  
+Line(11) = {11,10};  
+Line(12) = {10,15};  
+Line(13) = {16,13};  
+Line(14) = {13,12};  
+Line(15) = {12,9};  
+Line(16) = {9,16};  
+Line(17) = {4,5};  
+Line(18) = {3,6};  
+Line(19) = {2,7};  
+Line(20) = {1,8};  
+Line(21) = {10,9};  
+Line(22) = {15,16};  
+Line(23) = {14,13};  
+Line(24) = {11,12};  
+  
+Line Loop(25) = {5,-18,-1,17};  
+Plane Surface(26) = {25};  
+Line Loop(27) = {-17,-4,20,8};  
+Plane Surface(28) = {27};  
+Line Loop(29) = {20,-7,-19,3};  
+Plane Surface(30) = {29};  
+Line Loop(31) = {6,-19,-2,18};  
+Plane Surface(32) = {31};  
+Line Loop(33) = {1,2,3,4};  
+Line Loop(34) = {9,10,11,12};  
+Plane Surface(35) = {33,34};  
+Line Loop(36) = {5,6,7,8};  
+Line Loop(37) = {13,14,15,16};  
+Plane Surface(38) = {36,37};  
+  
+/* Inducteur */  
+  
+Point(17) = {94,50,49,lci};  
+Point(18) = {94,150,49,lci};  
+  
+Point(19) = {119,50,49,lci};  
+Point(20) = {119,150,49,lci};  
+  
+Point(21) = {144,0,49,lci};  
+Point(22) = {144,25,49,lci};  
+Point(23) = {144,50,49,lci};  
+Point(24) = {144,150,49,lci};  
+Point(25) = {144,175,49,lci};  
+Point(26) = {144,200,49,lci};  
+  
+Point(27) = {244,0,49,lci};  
+Point(28) = {244,25,49,lci};  
+Point(29) = {244,50,49,lci};  
+Point(30) = {244,150,49,lci};  
+Point(31) = {244,175,49,lci};  
+Point(32) = {244,200,49,lci};  
+  
+Point(33) = {269,50,49,lci};  
+Point(34) = {269,150,49,lci};  
+  
+Point(35) = {294,50,49,lci};  
+Point(36) = {294,150,49,lci};  
+  
+  
+Circle(39) = {25,24,20};  
+Circle(40) = {26,24,18};  
+Circle(41) = {19,23,22};  
+Circle(42) = {17,23,21};  
+Circle(43) = {28,29,33};  
+Circle(44) = {27,29,35};  
+Circle(45) = {34,30,31};  
+Circle(46) = {36,30,32};  
+Line(47) = {31,32};  
+Line(48) = {32,26};  
+Line(49) = {26,25};  
+Line(50) = {25,31};  
+Line(51) = {20,18};  
+Line(52) = {18,17};  
+Line(53) = {17,19};  
+Line(54) = {19,20};  
+Line(55) = {22,21};  
+Line(56) = {21,27};  
+Line(57) = {27,28};  
+Line(58) = {28,22};  
+Line(59) = {33,35};  
+Line(60) = {35,36};  
+Line(61) = {36,34};  
+Line(62) = {34,33};  
+  
+Line Loop(63) = {48,49,50,47};  
+Plane Surface(64) = {63};  
+Line Loop(65) = {-47,-45,-61,46};  
+Plane Surface(66) = {65};  
+Line Loop(67) = {61,62,59,60};  
+Plane Surface(68) = {67};  
+Line Loop(69) = {-59,-43,-57,44};  
+Plane Surface(70) = {69};  
+Line Loop(71) = {58,55,56,57};  
+Plane Surface(72) = {71};  
+Line Loop(73) = {-42,53,41,55};  
+Plane Surface(74) = {73};  
+Line Loop(75) = {52,53,54,51};  
+Plane Surface(76) = {75};  
+Line Loop(77) = {-51,-39,-49,40};  
+Plane Surface(78) = {77};  
+  
+Extrude(64, {0,0,100});  
+Coherence;  
+Extrude(78, {0,0,100});  
+Coherence;  
+Extrude(76, {0,0,100});  
+Coherence;  
+Extrude(74, {0,0,100});  
+Coherence;  
+Extrude(72, {0,0,100});  
+Coherence;  
+Extrude(70, {0,0,100});  
+Coherence;  
+Extrude(68, {0,0,100});  
+Coherence;  
+Extrude(66, {0,0,100});  
+Coherence;  
+  
+Line Loop(207) = {-13,-22,9,23};  
+Plane Surface(208) = {207};  
+Line Loop(209) = {-22,-12,21,16};  
+Plane Surface(210) = {209};  
+Line Loop(211) = {15,-21,-11,24};  
+Plane Surface(212) = {211};  
+Line Loop(213) = {24,-14,-23,10};  
+Plane Surface(214) = {213};  
+  
+Delete { 
+ Surface(117); 
+} 
+Delete { 
+ Surface(143); 
+} 
+Delete { 
+ Surface(179); 
+} 
+Delete { 
+ Surface(205); 
+} 
+Delete { 
+ Surface(227); 
+} 
+Delete { 
+ Surface(249); 
+} 
diff --git a/benchmarks/3d/piece1.geo b/benchmarks/3d/piece1.geo
new file mode 100644
index 0000000000000000000000000000000000000000..9222120b929d6ed27759d2c129b1fbbb43251543
--- /dev/null
+++ b/benchmarks/3d/piece1.geo
@@ -0,0 +1,149 @@
+
+r1 = .1;
+l1 = 1.;
+l2 = .8;
+l3 = .1;
+r2 = 1.1;
+lc = .1;
+lc2 = .04;
+rint = .2;
+rext = .3;
+Point(1) = {0.0,0.0,0.0,lc};
+Point(2) = {l1,0.0,0.0,lc2};
+Point(3) = {l1-r1,0.0,0.0,lc2};
+Point(4) = {l1,r1,0.0,lc2};
+Point(5) = {l1,-r1,0.0,lc2};
+Point(6) = {l1+l2,r1,0.0,lc};
+Point(7) = {l1+l2,-r1,0.0,lc};
+Point(8) = {l1+l2,-r1-l3,0.0,lc};
+Point(9) = {l1+l2,r1+l3,0.0,lc};
+
+Line(1) = {4,6};
+Line(2) = {6,9};
+Line(3) = {7,8};
+Line(4) = {5,7};
+Circle(5) = {4,2,3};
+Circle(6) = {3,2,5};
+r = 2*3.14159/5;
+Point(10) = { (l1 + r2) * Cos(r/2) , (l1 + r2) * Sin(r/2), 0.0, lc};
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},r) {
+  Duplicata {
+   Line(1); 
+   Line(2);
+ Line(3); 
+ Line(4); 
+ Line(5); 
+ Line(6); 
+Point(10);  
+ }
+}
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},2*r) {
+  Duplicata {
+   Line(1); 
+   Line(2);
+ Line(3); 
+ Line(4); 
+ Line(5); 
+ Line(6); 
+ Point(10);  
+ }
+}
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},3*r) {
+  Duplicata {
+   Line(1); 
+   Line(2);
+ Line(3); 
+ Line(4); 
+ Line(5); 
+ Line(6); 
+ Point(10);  
+ }
+}
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},4*r) {
+  Duplicata {
+   Line(1); 
+   Line(2);
+ Line(3); 
+ Line(4); 
+ Line(5); 
+ Line(6); 
+ Point(10);  
+ }
+}
+Coherence;
+Point(newp) = {rint,0,0,lc};
+Point(newp) = {rext,0,0,lc};
+Point(newp) = {-rint,0,0,lc};
+Point(newp) = {-rext,0,0,lc};
+Point(newp) = {0,rint,0,lc};
+Point(newp) = {0,rext,0,lc};
+Point(newp) = {0,-rint,0,lc};
+Point(newp) = {0,-rext,0,lc};
+Circle(31) = {43,64,74};
+Circle(32) = {16,37,47};
+Circle(33) = {9,10,20};
+Circle(34) = {97,118,8};
+Circle(35) = {101,91,70};
+Circle(36) = {119,1,123};
+Circle(37) = {123,1,121};
+Circle(38) = {121,1,125};
+Circle(39) = {125,1,119};
+Circle(40) = {120,1,124};
+Circle(41) = {124,1,122};
+Circle(42) = {122,1,126};
+Circle(43) = {126,1,120};
+Line Loop(44) = {-21,-22,-24,-23,19,20,-35,-27,-28,-30,-29,25,26,34,-3,-4,-6,-5,1,2,33,-9,-10,-12,-11,7,8,32,-15,-16,-18,-17,13,14,31};
+Line Loop(45) = {43,40,41,42};
+Plane Surface(46) = {44,45};
+Line Loop(47) = {38,39,36,37};
+Plane Surface(48) = {45,47};
+Extrude Surface (46, {0.0,0.0,0.2});
+Coherence;
+Extrude Surface (48, {0.0,0.0,0.2});
+Coherence;
+Extrude Surface (287, {0.0,0.0,0.2});
+Coherence;
+/*
+Delete {
+ Surface(287);
+}
+Delete {
+ Surface(266);
+}
+Delete {
+ Surface(262);
+}
+Delete {
+ Surface(270);
+}
+Delete {
+ Surface(236);
+}
+Delete {
+ Surface(258);
+}
+Delete {
+ Surface(232);
+}
+Delete {
+ Surface(244);
+}
+Delete {
+ Surface(240);
+}
+Delete {
+ Line(239);
+}
+Delete {
+ Line(230);
+}
+Delete {
+ Line(231);
+}
+Delete {
+ Line(235);
+}
+Coherence;
+*/
+Surface Loop(330) = {245,92,46,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,48,274,278,282,286,328,316,320,324,329,300,304,308,312};
+Complex Volume(331) = {330};
diff --git a/benchmarks/3d/qq b/benchmarks/3d/qq
new file mode 100644
index 0000000000000000000000000000000000000000..b57b28da0df0a9f74281c4e47ee32b89e310754a
--- /dev/null
+++ b/benchmarks/3d/qq
@@ -0,0 +1,86 @@
+%!PS-Adobe-3.0
+%%LanguageLevel: 1
+%%Title: Cube-01
+%%Creator: Gmsh
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+% RGB color command - r g b C
+/C { setrgbcolor } bind def
+% Font choose - size fontname FC
+/FC { findfont exch scalefont setfont } bind def
+% String primitive - (string) x y r g b size fontname S
+/S { FC C moveto show } bind def
+% Point primitive - x y r g b P
+/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def
+% Flat-shaded line - x2 y2 x1 y1 r g b L
+/L { C newpath moveto lineto stroke } bind def
+% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL
+/SL {
+/b1 exch def /g1 exch def /r1 exch def
+/y1 exch def /x1 exch def
+/b2 exch def /g2 exch def /r2 exch def
+/y2 exch def /x2 exch def
+b2 b1 sub abs 0.01 gt
+g2 g1 sub abs 0.005 gt
+r2 r1 sub abs 0.008 gt
+or or {
+/bm b1 b2 add 0.5 mul def
+/gm g1 g2 add 0.5 mul def
+/rm r1 r2 add 0.5 mul def
+/ym y1 y2 add 0.5 mul def
+/xm x1 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 xm ym rm gm bm SL
+xm ym rm gm bm x2 y2 r2 g2 b2 SL
+} {
+x1 y1 x2 y2 r1 g1 b1 L
+} ifelse
+} bind def
+% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T
+/T { C newpath moveto lineto lineto closepath fill } bind def
+% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST
+/ST {
+/b1 exch def /g1 exch def /r1 exch def
+/y1 exch def /x1 exch def
+/b2 exch def /g2 exch def /r2 exch def
+/y2 exch def /x2 exch def
+/b3 exch def /g3 exch def /r3 exch def
+/y3 exch def /x3 exch def
+b2 b1 sub abs 0.05 gt
+g2 g1 sub abs 0.017 gt
+r2 r1 sub abs 0.032 gt
+b3 b1 sub abs 0.05 gt
+g3 g1 sub abs 0.017 gt
+r3 r1 sub abs 0.032 gt
+b2 b3 sub abs 0.05 gt
+g2 g3 sub abs 0.017 gt
+r2 r3 sub abs 0.032 gt
+or or or or or or or or {
+/b12 b1 b2 add 0.5 mul def
+/g12 g1 g2 add 0.5 mul def
+/r12 r1 r2 add 0.5 mul def
+/y12 y1 y2 add 0.5 mul def
+/x12 x1 x2 add 0.5 mul def
+/b13 b1 b3 add 0.5 mul def
+/g13 g1 g3 add 0.5 mul def
+/r13 r1 r3 add 0.5 mul def
+/y13 y1 y3 add 0.5 mul def
+/x13 x1 x3 add 0.5 mul def
+/b32 b3 b2 add 0.5 mul def
+/g32 g3 g2 add 0.5 mul def
+/r32 r3 r2 add 0.5 mul def
+/y32 y3 y2 add 0.5 mul def
+/x32 x3 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32
+x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13
+x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+ST ST ST ST
+} {
+x1 y1 x2 y2 x3 y3 r1 g1 b1 T
+} ifelse
+} bind def
+%%EndProlog
+%%Page: 1
+%%PageBoundingBox: 0 0 800 579
+gsave
diff --git a/benchmarks/3d/runner_simple_3d.geo b/benchmarks/3d/runner_simple_3d.geo
new file mode 100644
index 0000000000000000000000000000000000000000..c3fbab83f64213d11d9a79f4b16256cece36e42f
--- /dev/null
+++ b/benchmarks/3d/runner_simple_3d.geo
@@ -0,0 +1,141 @@
+/*simple runner for 3d-studies;  07.07.1999/hm*/  
+  
+  
+/*variables*/  
+r=0.004;  
+a=0.005;  
+b=0.005;  
+m=0.010;  
+mh=0.020;  
+  
+h1=0.005;  
+h2=0.005;  
+h3=0.005;  
+h4=0.005;  
+hl = 0.012;  
+f   =0.015;  
+l   =0.040;  
+  
+lc1 = 0.004;  
+  
+/*points*/  
+  
+Point(1) = {-r,0.0,0.0,lc1};  
+  
+Point(2) = {0,0.0,0.0,lc1};  
+  
+Point(3) = {+r,0.0,0.0,lc1};  
+Point(4) = {r+a,0.0,0.0,lc1};  
+Point(5) = {r+a+b,0.0,0.0,lc1};  
+Point(6) = {r+a+b,-h4,0.0,lc1};  
+  
+Point(11) = {-r,h1,0.0,lc1};  
+  
+Point(13) = {+r,h1,0.0,lc1};  
+Point(14) = {r+a,h2,0.0,lc1};  
+Point(15) = {r+a+b,h3,0.0,lc1};  
+  
+/*flange*/  
+  
+Point(25) = {r+a+b+f,0,0.0,lc1};  
+Point(26) = {r+a+b+f,h3,0.0,lc1};  
+Point(27) = {r+a+b+f,-h4,0.0,lc1};  
+Point(28) = {r+a+b+f,-hl,0.0,lc1};  
+  
+/*laminate*/  
+  
+Point(30) = {r+a+b+f+l,0.0,0.0,lc1};  
+Point(31) = {r+a+b+f+l,h3,0.0,lc1};  
+Point(32) = {r+a+b+f+l,-h4,0.0,lc1};  
+Point(33) = {r+a+b+f+l,-hl,0.0,lc1};  
+  
+/*lines*/  
+  
+Circle(100) = {1,2,3};  
+  
+Line(101) = {1,11};  
+Line(102) = {11,13};  
+Line(103) = {13,14};  
+Line(104) = {14,15};  
+Line(105) = {3,13};  
+Line(106) = {3,4};  
+Line(107) = {4,14};  
+Line(108) = {4,5};  
+Line(109) = {5,15};  
+  
+  
+  
+Line(110) = {15,26};  
+Line(111) = {5,25};  
+Line(112) = {6,27};  
+Line(113) = {5,6};  
+Line(114) = {26,25};  
+Line(115) = {25,27};  
+Line(116) = {26,31};  
+Line(117) = {25,30};  
+Line(118) = {27,32};  
+Line(119) = {31,30};  
+Line(120) = {30,32};  
+  
+Line(121) = {27,28};  
+Line(122) = {28,33};  
+Line(123) = {32,33};  
+  
+Line Loop(300) = {-102,-101,100,105};  
+Plane Surface(301) = {300};  
+Line Loop(400) = {107,-103,-105,106};  
+Plane Surface(401) = {400};  
+Line Loop(402) = {109,-104,-107,108};  
+Plane Surface(403) = {402};  
+  
+  
+Line Loop(404) = {-114,-110,-109,111};  
+Plane Surface(405) = {404};  
+Line Loop(406) = {-112,-113,111,115};  
+Plane Surface(407) = {406};  
+Line Loop(408) = {117,-119,-116,114};  
+Plane Surface(409) = {408};  
+Line Loop(410) = {118,-120,-117,115};  
+Plane Surface(411) = {410};  
+Line Loop(412) = {118,123,-122,-121};  
+Plane Surface(413) = {412};  
+  
+/*mould*/  
+  
+Point(511) = {-m,h1,0.0,lc1};  
+Point(512) = {-m,h1-mh,0.0,lc1};  
+Point(533) = {r+a+b+f+l,h1-mh,0.0,lc1};  
+  
+Line(614) = {511,512};  
+Line(615) = {511,11};  
+Line(616) = {512,533};  
+Line(617) = {533,33};  
+/*  
+Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122,-617,-616,-614,615,-
+101,100,106,108,113,112};*/  
+  
+Line Loop(618) = {-617,-616,-614,615,-101,100,106,108,113,112,121,122};  
+Plane Surface(619) = {618};  
+  
+ex = .05;
+
+Extrude(619, {0.0,0.0,ex});  
+Coherence;  
+Extrude(301, {0.0,0.0,ex});  
+Coherence;  
+Extrude(401, {0.0,0.0,ex});  
+Coherence;  
+Extrude(403, {0.0,0.0,ex});  
+Coherence;  
+Extrude(405, {0.0,0.0,ex});  
+Coherence;  
+Extrude(407, {0.0,0.0,ex});  
+Coherence;  
+Extrude(409, {0.0,0.0,ex});  
+Coherence;  
+Extrude(411, {0.0,0.0,ex});  
+Coherence;  
+Extrude(413, {0.0,0.0,ex});  
+Coherence;  
+ 
+ 
diff --git a/benchmarks/3d/ss b/benchmarks/3d/ss
new file mode 100644
index 0000000000000000000000000000000000000000..b57b28da0df0a9f74281c4e47ee32b89e310754a
--- /dev/null
+++ b/benchmarks/3d/ss
@@ -0,0 +1,86 @@
+%!PS-Adobe-3.0
+%%LanguageLevel: 1
+%%Title: Cube-01
+%%Creator: Gmsh
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+% RGB color command - r g b C
+/C { setrgbcolor } bind def
+% Font choose - size fontname FC
+/FC { findfont exch scalefont setfont } bind def
+% String primitive - (string) x y r g b size fontname S
+/S { FC C moveto show } bind def
+% Point primitive - x y r g b P
+/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def
+% Flat-shaded line - x2 y2 x1 y1 r g b L
+/L { C newpath moveto lineto stroke } bind def
+% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL
+/SL {
+/b1 exch def /g1 exch def /r1 exch def
+/y1 exch def /x1 exch def
+/b2 exch def /g2 exch def /r2 exch def
+/y2 exch def /x2 exch def
+b2 b1 sub abs 0.01 gt
+g2 g1 sub abs 0.005 gt
+r2 r1 sub abs 0.008 gt
+or or {
+/bm b1 b2 add 0.5 mul def
+/gm g1 g2 add 0.5 mul def
+/rm r1 r2 add 0.5 mul def
+/ym y1 y2 add 0.5 mul def
+/xm x1 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 xm ym rm gm bm SL
+xm ym rm gm bm x2 y2 r2 g2 b2 SL
+} {
+x1 y1 x2 y2 r1 g1 b1 L
+} ifelse
+} bind def
+% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T
+/T { C newpath moveto lineto lineto closepath fill } bind def
+% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST
+/ST {
+/b1 exch def /g1 exch def /r1 exch def
+/y1 exch def /x1 exch def
+/b2 exch def /g2 exch def /r2 exch def
+/y2 exch def /x2 exch def
+/b3 exch def /g3 exch def /r3 exch def
+/y3 exch def /x3 exch def
+b2 b1 sub abs 0.05 gt
+g2 g1 sub abs 0.017 gt
+r2 r1 sub abs 0.032 gt
+b3 b1 sub abs 0.05 gt
+g3 g1 sub abs 0.017 gt
+r3 r1 sub abs 0.032 gt
+b2 b3 sub abs 0.05 gt
+g2 g3 sub abs 0.017 gt
+r2 r3 sub abs 0.032 gt
+or or or or or or or or {
+/b12 b1 b2 add 0.5 mul def
+/g12 g1 g2 add 0.5 mul def
+/r12 r1 r2 add 0.5 mul def
+/y12 y1 y2 add 0.5 mul def
+/x12 x1 x2 add 0.5 mul def
+/b13 b1 b3 add 0.5 mul def
+/g13 g1 g3 add 0.5 mul def
+/r13 r1 r3 add 0.5 mul def
+/y13 y1 y3 add 0.5 mul def
+/x13 x1 x3 add 0.5 mul def
+/b32 b3 b2 add 0.5 mul def
+/g32 g3 g2 add 0.5 mul def
+/r32 r3 r2 add 0.5 mul def
+/y32 y3 y2 add 0.5 mul def
+/x32 x3 x2 add 0.5 mul def
+x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32
+x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13
+x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13
+ST ST ST ST
+} {
+x1 y1 x2 y2 x3 y3 r1 g1 b1 T
+} ifelse
+} bind def
+%%EndProlog
+%%Page: 1
+%%PageBoundingBox: 0 0 800 579
+gsave
diff --git a/benchmarks/3d/surface3113.geo b/benchmarks/3d/surface3113.geo
new file mode 100644
index 0000000000000000000000000000000000000000..e57c0588d5a9c82407606530772053ee430a7476
--- /dev/null
+++ b/benchmarks/3d/surface3113.geo
@@ -0,0 +1,112 @@
+lc =  5.00000E+01;
+Point(2) = {-2.70000E-02,-2.40000E-02, 1.00000E-02, 1.00000E-02};
+Point(4) = {-2.70000E-02,-4.00000E-03, 1.00000E-02, 3.33333E-03};
+Point(10) = { 1.79430E+00,-4.00000E-02, 1.00000E-02, 2.00000E-02};
+Point(12) = { 1.79430E+00,-2.00000E-02, 1.00000E-02, 2.00000E-02};
+Point(211) = { 1.18995E-02,-1.01059E-02, 1.00000E-02, 1.00000E-02};
+Point(212) = { 1.58995E-02,-1.01059E-02, 1.00000E-02, 1.00000E-02};
+Point(213) = { 1.18995E-02,-6.10592E-03, 1.00000E-02, 1.00000E-02};
+Point(214) = { 7.89953E-03,-1.01059E-02, 1.00000E-02, 1.00000E-02};
+Point(215) = { 1.18995E-02,-1.41059E-02, 1.00000E-02, 1.00000E-02};
+Point(411) = { 4.17983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02};
+Point(412) = { 4.57983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02};
+Point(413) = { 4.17983E-02,-6.37207E-03, 1.00000E-02, 1.00000E-02};
+Point(414) = { 3.77983E-02,-1.03721E-02, 1.00000E-02, 1.00000E-02};
+Point(415) = { 4.17983E-02,-1.43721E-02, 1.00000E-02, 1.00000E-02};
+Point(611) = { 8.24967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02};
+Point(612) = { 8.74967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02};
+Point(613) = { 8.24967E-02,-6.73435E-03, 1.00000E-02, 1.00000E-02};
+Point(614) = { 7.74967E-02,-1.17343E-02, 1.00000E-02, 1.00000E-02};
+Point(615) = { 8.24967E-02,-1.67343E-02, 1.00000E-02, 1.00000E-02};
+Point(811) = { 1.38495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02};
+Point(812) = { 1.44495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02};
+Point(813) = { 1.38495E-01,-7.23281E-03, 1.00000E-02, 1.00000E-02};
+Point(814) = { 1.32495E-01,-1.32328E-02, 1.00000E-02, 1.00000E-02};
+Point(815) = { 1.38495E-01,-1.92328E-02, 1.00000E-02, 1.00000E-02};
+Point(1011) = { 2.11992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02};
+Point(1012) = { 2.17992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02};
+Point(1013) = { 2.11992E-01,-7.88705E-03, 1.00000E-02, 1.00000E-02};
+Point(1014) = { 2.05992E-01,-1.38870E-02, 1.00000E-02, 1.00000E-02};
+Point(1015) = { 2.11992E-01,-1.98870E-02, 1.00000E-02, 1.00000E-02};
+Point(1211) = { 3.12488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02};
+Point(1212) = { 3.18488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02};
+Point(1213) = { 3.12488E-01,-8.78162E-03, 1.00000E-02, 1.00000E-02};
+Point(1214) = { 3.06488E-01,-1.47816E-02, 1.00000E-02, 1.00000E-02};
+Point(1215) = { 3.12488E-01,-2.07816E-02, 1.00000E-02, 1.00000E-02};
+Point(1411) = { 4.48482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02};
+Point(1412) = { 4.54482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02};
+Point(1413) = { 4.48482E-01,-9.99218E-03, 1.00000E-02, 1.00000E-02};
+Point(1414) = { 4.42482E-01,-1.59922E-02, 1.00000E-02, 1.00000E-02};
+Point(1415) = { 4.48482E-01,-2.19922E-02, 1.00000E-02, 1.00000E-02};
+Point(1611) = { 6.32475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02};
+Point(1612) = { 6.38475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02};
+Point(1613) = { 6.32475E-01,-1.16300E-02, 1.00000E-02, 1.10000E-02};
+Point(1614) = { 6.26475E-01,-1.76300E-02, 1.00000E-02, 1.10000E-02};
+Point(1615) = { 6.32475E-01,-2.36300E-02, 1.00000E-02, 1.10000E-02};
+Point(1811) = { 8.87965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02};
+Point(1812) = { 8.93965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02};
+Point(1813) = { 8.87965E-01,-1.39042E-02, 1.00000E-02, 1.60000E-02};
+Point(1814) = { 8.81965E-01,-1.99042E-02, 1.00000E-02, 1.60000E-02};
+Point(1815) = { 8.87965E-01,-2.59042E-02, 1.00000E-02, 1.60000E-02};
+Point(2011) = { 1.24165E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02};
+Point(2012) = { 1.24765E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02};
+Point(2013) = { 1.24165E+00,-1.70526E-02, 1.00000E-02, 2.00000E-02};
+Point(2014) = { 1.23565E+00,-2.30526E-02, 1.00000E-02, 2.00000E-02};
+Point(2015) = { 1.24165E+00,-2.90526E-02, 1.00000E-02, 2.00000E-02};
+Point(2211) = { 1.73423E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02};
+Point(2212) = { 1.74023E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02};
+Point(2213) = { 1.73423E+00,-2.14373E-02, 1.00000E-02, 2.40000E-02};
+Point(2214) = { 1.72823E+00,-2.74373E-02, 1.00000E-02, 2.40000E-02};
+Point(2215) = { 1.73423E+00,-3.34373E-02, 1.00000E-02, 2.40000E-02};
+Line (26) = {4,12};
+Line (6) = {2,4};
+Line (25) = {2,10};
+Line (16) = {10,12};
+Circle (216) = {215,211,212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (213) = {212,211,213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (214) = {213,211,214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (215) = {214,211,215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (416) = {415,411,412} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (413) = {412,411,413} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (414) = {413,411,414} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (415) = {414,411,415} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (616) = {615,611,612} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (613) = {612,611,613} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (614) = {613,611,614} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (615) = {614,611,615} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (816) = {815,811,812} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (813) = {812,811,813} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (814) = {813,811,814} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (815) = {814,811,815} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1016) = {1015,1011,1012} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1013) = {1012,1011,1013} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1014) = {1013,1011,1014} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1015) = {1014,1011,1015} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1216) = {1215,1211,1212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1213) = {1212,1211,1213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1214) = {1213,1211,1214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1215) = {1214,1211,1215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1416) = {1415,1411,1412} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1413) = {1412,1411,1413} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1414) = {1413,1411,1414} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1415) = {1414,1411,1415} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1616) = {1615,1611,1612} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1613) = {1612,1611,1613} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1614) = {1613,1611,1614} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1615) = {1614,1611,1615} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1816) = {1815,1811,1812} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1813) = {1812,1811,1813} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1814) = {1813,1811,1814} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (1815) = {1814,1811,1815} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2016) = {2015,2011,2012} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2013) = {2012,2011,2013} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2014) = {2013,2011,2014} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2015) = {2014,2011,2015} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2216) = {2215,2211,2212} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2213) = {2212,2211,2213} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2214) = {2213,2211,2214} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Circle (2215) = {2214,2211,2215} Plane{ 1.00000E+00, 0.00000E+00, 0.00000E+00};
+Line Loop (1003113) = {-26, -6, 25, 16,216,213,214,215,416,413,414,415,616,613,614,615,816,813,814,815,1016,1013,1014,1015,1216,1213,1214,1215,1416,1413,1414,1415,1616,1613,1614,1615,1816,1813,1814,1815,2016,2013,2014,2015,2216,2213,2214,2215};
+Plane Surface (3113) = {1003113};
+Line Loop (1003113) = {-26, -6, 25, 16,216,213,214,215,416,413,414,415,616,613,614,615,816,813,814,815,1016,1013,1014,1015,1216,1213,1214,1215,1416,1413,1414,1415,1616,1613,1614,1615,1816,1813,1814,1815,2016,2013,2014,2015,2216,2213,2214,2215};
+Plane Surface (3113) = {1003113};
diff --git a/benchmarks/3d/vulp5.geo b/benchmarks/3d/vulp5.geo
new file mode 100644
index 0000000000000000000000000000000000000000..98564699af185a8a800799b20637f4954df256bd
--- /dev/null
+++ b/benchmarks/3d/vulp5.geo
@@ -0,0 +1,1153 @@
+/* Antenne VULP 9118-E */
+
+Frequence = 235.e6 ;
+Lambda = 2.99792458e8/Frequence ;
+LambdaDemi = Lambda/2 ;
+
+f1 = 10.e-3 ;
+
+si = 50.e-3 ;
+si1= 20.e-3 ;
+si2= 100.e-3 ;
+se = 300.e-3 ;
+
+/* 2 longerons */
+
+xmin =-27.e-3 ;
+LL   = 1821.3e-3 ; 
+ll   = 20.e-3 ; 
+hh   = 20.e-3 ;
+dc   = 8.e-3 ;
+em   = 8.e-3/2 ; 
+eM   = 40.e-3/2 ;
+t    = ArcTan(eM/2-em/2/LL) ;
+
+/* 22 barreaux */
+/* longueur           ; rayon          ; dist % barreau 1       ; dist%y=0  */                  
+ l1 =   77.e-3/2-ll/2 ;  r1 =  8.e-3/2 ;  d1 =   0              ;  e1 = em+dc+d1*Sin(t)-2.e-3 ;
+ l2 =   91.e-3/2-ll/2 ;  r2 =  8.e-3/2 ;  d2 =   11.9e-3*Cos(t) ;  e2 = em+dc+d2*Sin(t)-2.e-3 ;
+ l3 =  105.e-3/2-ll/2 ;  r3 =  8.e-3/2 ;  d3 =   25.8e-3*Cos(t) ;  e3 = em+dc+d3*Sin(t)-2.e-3 ;
+ l4 =  122.e-3/2-ll/2 ;  r4 =  8.e-3/2 ;  d4 =   41.8e-3*Cos(t) ;  e4 = em+dc+d4*Sin(t)-2.e-3 ;
+ l5 =  142.e-3/2-ll/2 ;  r5 = 10.e-3/2 ;  d5 =   60.5e-3*Cos(t) ;  e5 = em+dc+d5*Sin(t)-1.e-3 ;
+ l6 =  164.e-3/2-ll/2 ;  r6 = 10.e-3/2 ;  d6 =   82.5e-3*Cos(t) ;  e6 = em+dc+d6*Sin(t)-1.e-3 ;
+ l7 =  192.e-3/2-ll/2 ;  r7 = 12.e-3/2 ;  d7 =  107.0e-3*Cos(t) ;  e7 = em+dc+d7*Sin(t)  ;      
+ l8 =  224.e-3/2-ll/2 ;  r8 = 12.e-3/2 ;  d8 =  138.5e-3*Cos(t) ;  e8 = em+dc+d8*Sin(t)  ;      
+ l9 =  260.e-3/2-ll/2 ;  r9 = 12.e-3/2 ;  d9 =  172.0e-3*Cos(t) ;  e9 = em+dc+d9*Sin(t)  ;      
+l10 =  303.e-3/2-ll/2 ; r10 = 12.e-3/2 ; d10 =  212.0e-3*Cos(t) ; e10 = em+dc+d10*Sin(t) ;      
+l11 =  353.e-3/2-ll/2 ; r11 = 12.e-3/2 ; d11 =  258.5e-3*Cos(t) ; e11 = em+dc+d11*Sin(t) ;      
+l12 =  410.e-3/2-ll/2 ; r12 = 12.e-3/2 ; d12 =  312.5e-3*Cos(t) ; e12 = em+dc+d12*Sin(t) ;      
+l13 =  477.e-3/2-ll/2 ; r13 = 12.e-3/2 ; d13 =  375.0e-3*Cos(t) ; e13 = em+dc+d13*Sin(t) ;      
+l14 =  554.e-3/2-ll/2 ; r14 = 12.e-3/2 ; d14 =  448.5e-3*Cos(t) ; e14 = em+dc+d14*Sin(t) ;      
+l15 =  645.e-3/2-ll/2 ; r15 = 12.e-3/2 ; d15 =  533.0e-3*Cos(t) ; e15 = em+dc+d15*Sin(t) ;      
+l16 =  749.e-3/2-ll/2 ; r16 = 12.e-3/2 ; d16 =  632.5e-3*Cos(t) ; e16 = em+dc+d16*Sin(t) ;      
+l17 =  877.e-3/2-ll/2 ; r17 = 12.e-3/2 ; d17 =  750.5e-3*Cos(t) ; e17 = em+dc+d17*Sin(t) ;      
+l18 = 1023.e-3/2-ll/2 ; r18 = 12.e-3/2 ; d18 =  888.0e-3*Cos(t) ; e18 = em+dc+d18*Sin(t) ;      
+l19 = 1196.e-3/2-ll/2 ; r19 = 12.e-3/2 ; d19 = 1050.3e-3*Cos(t) ; e19 = em+dc+d19*Sin(t) ;      
+l20 = 1404.e-3/2-ll/2 ; r20 = 12.e-3/2 ; d20 = 1241.7e-3*Cos(t) ; e20 = em+dc+d20*Sin(t) ;      
+l21 = 1648.e-3/2-ll/2 ; r21 = 12.e-3/2 ; d21 = 1467.7e-3*Cos(t) ; e21 = em+dc+d21*Sin(t) ;      
+l22 = 1934.e-3/2-ll/2 ; r22 = 12.e-3/2 ; d22 = 1734.3e-3*Cos(t) ; e22 = em+dc+d22*Sin(t) ;      
+
+/* long caract */          
+ s1 = f1 ;      s1l = f1 ;       
+ s2 = f1 ;      s2l = f1 ;       
+ s3 = f1 ;      s3l = f1 ;       
+ s4 = f1 ;      s4l = f1 ;       
+ s5 = f1 ;      s5l = f1 ;       
+ s6 = f1 ;      s6l = f1 ;       
+ s7 = f1 ;      s7l = f1 ;       
+ s8 = f1 ;      s8l = f1 ;       
+ s9 = f1 ;      s9l = f1 ;       
+s10 = f1 ;     s10l = f1 ;       
+s11 = f1 ;     s11l = f1 ;       
+s12 = f1 ;     s12l = f1 ;       
+s13 = f1 ;     s13l = f1 ;       
+s14 = f1 ;     s14l = 1.3*f1 ;   
+s15 = f1 ;     s15l = 1.6*f1 ;   
+s16 = 1.1*f1 ; s16l = 2*f1 ;   
+s17 = 1.4*f1 ; s17l = 2.3*f1 ;     
+s18 = 1.6*f1 ; s18l = 2.6*f1 ; 
+s19 = 1.8*f1 ; s19l = 3*f1 ; 
+s20 = 2.0*f1 ; s20l = 3.3*f1 ;   
+s21 = 2.2*f1 ; s21l = 3.6*f1 ; 
+s22 = 2.4*f1 ; s22l = 4*f1 ;   
+
+Point(9998) = {d11, 0, -l15, 1} ;
+
+/* boite */
+
+abs = LambdaDemi ;
+bem = 2*si ;
+
+bxM =  -200.e-3 ; bxm = bxM+bem ; bxP = 2000.e-3 ; bxp = bxP-bem ;
+byM =  -150.e-3 ; bym = byM+bem ; byP =  150.e-3 ; byp = byP-bem ;
+bzM = -1200.e-3 ; bzm = bzM+bem ; bzP = 1200.e-3 ; bzp = bzP-bem ;
+
+bxM2 = bxM-abs ; bxP2 = bxP+abs ; 
+byM2 = byM-abs ; byP2 = byP+abs ; 
+bzM2 = bzM-abs ; bzP2 = bzP+abs ; 
+
+/* longerons */
+
+Point(1) = {xmin, -em-hh, -ll/2, f1} ; Point(5) = {xmin, em, -ll/2, f1/3} ; 
+Point(2) = {xmin, -em-hh,  ll/2, f1} ; Point(6) = {xmin, em,  ll/2, f1/3} ; 
+Point(3) = {xmin, -em,    -ll/2, f1/3} ; Point(7) = {xmin, em+hh, -ll/2, f1} ; 
+Point(4) = {xmin, -em,     ll/2, f1/3} ; Point(8) = {xmin, em+hh,  ll/2, f1} ; 
+
+f3 = s22/1.2 ;
+
+Point(9)  = {xmin+LL, -eM-hh, -ll/2, f3} ; Point(13) = {xmin+LL, eM, -ll/2, f3} ; 
+Point(10) = {xmin+LL, -eM-hh,  ll/2, f3} ; Point(14) = {xmin+LL, eM,  ll/2, f3} ; 
+Point(11) = {xmin+LL, -eM,    -ll/2, f3} ; Point(15) = {xmin+LL, eM+hh, -ll/2, f3} ; 
+Point(12) = {xmin+LL, -eM,     ll/2, f3} ; Point(16) = {xmin+LL, eM+hh,  ll/2, f3} ; 
+
+Line(1) = {5,6};  Line(11) = {13,14};
+Line(2) = {6,8};  Line(12) = {14,16};
+Line(3) = {8,7};  Line(13) = {16,15};
+Line(4) = {7,5};  Line(14) = {15,13};
+Line(5) = {1,2};  Line(15) = {9,10}; 
+Line(6) = {2,4};  Line(16) = {10,12};
+Line(7) = {4,3};  Line(17) = {12,11};
+Line(8) = {3,1};  Line(18) = {11,9}; 
+Line(9) = {4,6};  Line(19) = {12,14};
+Line(10) = {3,5}; Line(20) = {11,13};
+
+Line(21) = {8,16}; Line(25) = {2,10}; 
+Line(22) = {7,15}; Line(26) = {4,12}; 
+Line(23) = {6,14}; Line(27) = {3,11}; 
+Line(24) = {5,13}; Line(28) = {1,9};  
+
+/* boite */
+
+Point(51) = {bxm, bym, bzm, si1}; Point(61) = {bxM, byM, bzM, si2}; 
+Point(52) = {bxm, bym, bzp, si1}; Point(62) = {bxM, byM, bzP, si2}; 
+Point(53) = {bxm, byp, bzm, si1}; Point(63) = {bxM, byP, bzM, si2}; 
+Point(54) = {bxm, byp, bzp, si1}; Point(64) = {bxM, byP, bzP, si2}; 
+Point(55) = {bxp, bym, bzm, si}; Point(65) = {bxP, byM, bzM, si2}; 
+Point(56) = {bxp, bym, bzp, si}; Point(66) = {bxP, byM, bzP, si2}; 
+Point(57) = {bxp, byp, bzm, si}; Point(67) = {bxP, byP, bzM, si2}; 
+Point(58) = {bxp, byp, bzp, si}; Point(68) = {bxP, byP, bzP, si2}; 
+
+Line(51) = {51,52}; Line(59) = {52,54}; Line(67) = {54,53}; Line(75) = {53,51}; 
+Line(52) = {52,56}; Line(60) = {56,58}; Line(68) = {58,54}; Line(76) = {51,55}; 
+Line(53) = {55,57}; Line(61) = {57,53}; Line(69) = {55,56}; Line(77) = {58,57}; 
+Line(54) = {53,63}; Line(62) = {51,61}; Line(70) = {54,64}; Line(78) = {52,62}; 
+Line(55) = {62,61}; Line(63) = {61,63}; Line(71) = {63,64}; Line(79) = {64,62}; 
+Line(56) = {57,67}; Line(64) = {55,65}; Line(72) = {65,67}; Line(80) = {67,63}; 
+Line(57) = {61,65}; Line(65) = {58,68}; Line(73) = {56,66}; Line(81) = {66,65}; 
+Line(58) = {68,67}; Line(66) = {68,66}; Line(74) = {66,62}; Line(82) = {64,68}; 
+
+Point(70) = {bxM2, byM2, bzM2, se}; Point(71) = {bxM2, byM2, bzP2, se};
+Point(72) = {bxM2, byP2, bzM2, se}; Point(73) = {bxM2, byP2, bzP2, se};
+Point(74) = {bxP2, byM2, bzM2, se}; Point(75) = {bxP2, byM2, bzP2, se};
+Point(76) = {bxP2, byP2, bzM2, se}; Point(77) = {bxP2, byP2, bzP2, se};
+
+Line(7001) = {70,71}; Line(7002) = {71,73}; Line(7003) = {73,72}; Line(7004) = {72,70};
+Line(7005) = {71,75}; Line(7006) = {75,77}; Line(7007) = {77,73}; Line(7008) = {74,75};
+Line(7009) = {74,76}; Line(7010) = {76,77}; Line(7011) = {76,72}; Line(7012) = {74,70};
+Line(7013) = {63,72}; Line(7014) = {61,70}; Line(7015) = {62,71}; Line(7016) = {64,73};
+Line(7017) = {68,77}; Line(7018) = {66,75}; Line(7019) = {67,76}; Line(7020) = {65,74};
+
+/* barreau 1 et 1' (le + a gauche, i.e. en x==0) */
+
+Point(101) = {d1,    -e1,    -ll/2,    s1};  Point(111) = {d1,     e1,     ll/2,    s1}; 
+Point(102) = {d1+r1, -e1,    -ll/2,    s1};  Point(112) = {d1+r1,  e1,     ll/2,    s1}; 
+Point(103) = {d1,    -e1+r1, -ll/2,    s1};  Point(113) = {d1,     e1+r1,  ll/2,    s1}; 
+Point(104) = {d1-r1, -e1,    -ll/2,    s1};  Point(114) = {d1-r1,  e1,     ll/2,    s1}; 
+Point(105) = {d1,    -e1-r1, -ll/2,    s1};  Point(115) = {d1,     e1-r1,  ll/2,    s1}; 
+Point(106) = {d1,    -e1,    -ll/2-l1, s1l};  Point(116) = {d1,     e1,     ll/2+l1, s1l}; 
+Point(107) = {d1+r1, -e1,    -ll/2-l1, s1l};  Point(117) = {d1+r1,  e1,     ll/2+l1, s1l}; 
+Point(108) = {d1,    -e1+r1, -ll/2-l1, s1l};  Point(118) = {d1,     e1+r1,  ll/2+l1, s1l}; 
+Point(109) = {d1-r1, -e1,    -ll/2-l1, s1l};  Point(119) = {d1-r1,  e1,     ll/2+l1, s1l}; 
+Point(110) = {d1,    -e1-r1, -ll/2-l1, s1l};  Point(120) = {d1,     e1-r1,  ll/2+l1, s1l}; 
+
+Circle(101) = {102,101,103}; Circle(105) = {107,106,108}; Line(109) = {102,107};
+Circle(102) = {103,101,104}; Circle(106) = {108,106,109}; Line(110) = {103,108};
+Circle(103) = {104,101,105}; Circle(107) = {109,106,110}; Line(111) = {104,109};
+Circle(104) = {105,101,102}; Circle(108) = {110,106,107}; Line(112) = {105,110};
+
+Circle(113) = {112,111,113}; Circle(117) = {117,116,118}; Line(121) = {112,117};
+Circle(114) = {113,111,114}; Circle(118) = {118,116,119}; Line(122) = {113,118};
+Circle(115) = {114,111,115}; Circle(119) = {119,116,120}; Line(123) = {114,119};
+Circle(116) = {115,111,112}; Circle(120) = {120,116,117}; Line(124) = {115,120};
+
+Line Loop(101) = {102,103,104,101};   Plane Surface(121) = {101};
+Line Loop(102) = {107,108,105,106};   Plane Surface(122) = {102};
+Line Loop(103) = {116,113,114,115};   Plane Surface(123) = {103};
+Line Loop(104) = {120,117,118,119};   Plane Surface(124) = {104};
+Line Loop(105) = {108,-109,-104,112}; Ruled Surface(125) = {105};
+Line Loop(106) = {112,-107,-111,103}; Ruled Surface(126) = {106};
+Line Loop(107) = {-111,-102,110,106}; Ruled Surface(127) = {107};
+Line Loop(108) = {-110,-101,109,105}; Ruled Surface(128) = {108};
+Line Loop(109) = {121,-120,-124,116}; Ruled Surface(129) = {109};
+Line Loop(110) = {-124,-115,123,119}; Ruled Surface(130) = {110};
+Line Loop(111) = {123,-118,-122,114}; Ruled Surface(131) = {111};
+Line Loop(112) = {122,-117,-121,113}; Ruled Surface(132) = {112};
+
+/* barreau 2 et 2' */
+
+Point(201) = {d2,    e2,    -ll/2,    s2};  Point(211) = {d2,     -e2,     ll/2,    s2}; 
+Point(202) = {d2+r2, e2,    -ll/2,    s2};  Point(212) = {d2+r2,  -e2,     ll/2,    s2}; 
+Point(203) = {d2,    e2+r2, -ll/2,    s2};  Point(213) = {d2,     -e2+r2,  ll/2,    s2}; 
+Point(204) = {d2-r2, e2,    -ll/2,    s2};  Point(214) = {d2-r2,  -e2,     ll/2,    s2}; 
+Point(205) = {d2,    e2-r2, -ll/2,    s2};  Point(215) = {d2,     -e2-r2,  ll/2,    s2}; 
+Point(206) = {d2,    e2,    -ll/2-l2, s2l};  Point(216) = {d2,     -e2,     ll/2+l2, s2l}; 
+Point(207) = {d2+r2, e2,    -ll/2-l2, s2l};  Point(217) = {d2+r2,  -e2,     ll/2+l2, s2l}; 
+Point(208) = {d2,    e2+r2, -ll/2-l2, s2l};  Point(218) = {d2,     -e2+r2,  ll/2+l2, s2l}; 
+Point(209) = {d2-r2, e2,    -ll/2-l2, s2l};  Point(219) = {d2-r2,  -e2,     ll/2+l2, s2l}; 
+Point(210) = {d2,    e2-r2, -ll/2-l2, s2l};  Point(220) = {d2,     -e2-r2,  ll/2+l2, s2l}; 
+
+Circle(201) = {202,201,203}; Circle(205) = {207,206,208}; Line(209) = {202,207};
+Circle(202) = {203,201,204}; Circle(206) = {208,206,209}; Line(210) = {203,208};
+Circle(203) = {204,201,205}; Circle(207) = {209,206,210}; Line(211) = {204,209};
+Circle(204) = {205,201,202}; Circle(208) = {210,206,207}; Line(212) = {205,210};
+
+Circle(213) = {212,211,213}; Circle(217) = {217,216,218}; Line(221) = {212,217};
+Circle(214) = {213,211,214}; Circle(218) = {218,216,219}; Line(222) = {213,218};
+Circle(215) = {214,211,215}; Circle(219) = {219,216,220}; Line(223) = {214,219};
+Circle(216) = {215,211,212}; Circle(220) = {220,216,217}; Line(224) = {215,220};
+
+Line Loop(201) = {202,203,204,201};   Plane Surface(221) = {201};
+Line Loop(202) = {207,208,205,206};   Plane Surface(222) = {202};
+Line Loop(203) = {216,213,214,215};   Plane Surface(223) = {203};
+Line Loop(204) = {220,217,218,219};   Plane Surface(224) = {204};
+Line Loop(205) = {208,-209,-204,212}; Ruled Surface(225) = {205};
+Line Loop(206) = {212,-207,-211,203}; Ruled Surface(226) = {206};
+Line Loop(207) = {-211,-202,210,206}; Ruled Surface(227) = {207};
+Line Loop(208) = {-210,-201,209,205}; Ruled Surface(228) = {208};
+Line Loop(209) = {221,-220,-224,216}; Ruled Surface(229) = {209};
+Line Loop(210) = {-224,-215,223,219}; Ruled Surface(230) = {210};
+Line Loop(211) = {223,-218,-222,214}; Ruled Surface(231) = {211};
+Line Loop(212) = {222,-217,-221,213}; Ruled Surface(232) = {212};
+
+/* barreau 3 et 3' */
+
+Point(301) = {d3,    -e3,    -ll/2,    s3};  Point(311) = {d3,     e3,     ll/2,    s3}; 
+Point(302) = {d3+r3, -e3,    -ll/2,    s3};  Point(312) = {d3+r3,  e3,     ll/2,    s3}; 
+Point(303) = {d3,    -e3+r3, -ll/2,    s3};  Point(313) = {d3,     e3+r3,  ll/2,    s3}; 
+Point(304) = {d3-r3, -e3,    -ll/2,    s3};  Point(314) = {d3-r3,  e3,     ll/2,    s3}; 
+Point(305) = {d3,    -e3-r3, -ll/2,    s3};  Point(315) = {d3,     e3-r3,  ll/2,    s3}; 
+Point(306) = {d3,    -e3,    -ll/2-l3, s3l};  Point(316) = {d3,     e3,     ll/2+l3, s3l}; 
+Point(307) = {d3+r3, -e3,    -ll/2-l3, s3l};  Point(317) = {d3+r3,  e3,     ll/2+l3, s3l}; 
+Point(308) = {d3,    -e3+r3, -ll/2-l3, s3l};  Point(318) = {d3,     e3+r3,  ll/2+l3, s3l}; 
+Point(309) = {d3-r3, -e3,    -ll/2-l3, s3l};  Point(319) = {d3-r3,  e3,     ll/2+l3, s3l}; 
+Point(310) = {d3,    -e3-r3, -ll/2-l3, s3l};  Point(320) = {d3,     e3-r3,  ll/2+l3, s3l}; 
+
+Circle(301) = {302,301,303}; Circle(305) = {307,306,308}; Line(309) = {302,307};
+Circle(302) = {303,301,304}; Circle(306) = {308,306,309}; Line(310) = {303,308};
+Circle(303) = {304,301,305}; Circle(307) = {309,306,310}; Line(311) = {304,309};
+Circle(304) = {305,301,302}; Circle(308) = {310,306,307}; Line(312) = {305,310};
+
+Circle(313) = {312,311,313}; Circle(317) = {317,316,318}; Line(321) = {312,317};
+Circle(314) = {313,311,314}; Circle(318) = {318,316,319}; Line(322) = {313,318};
+Circle(315) = {314,311,315}; Circle(319) = {319,316,320}; Line(323) = {314,319};
+Circle(316) = {315,311,312}; Circle(320) = {320,316,317}; Line(324) = {315,320};
+
+Line Loop(301) = {302,303,304,301};   Plane Surface(321) = {301};
+Line Loop(302) = {307,308,305,306};   Plane Surface(322) = {302};
+Line Loop(303) = {316,313,314,315};   Plane Surface(323) = {303};
+Line Loop(304) = {320,317,318,319};   Plane Surface(324) = {304};
+Line Loop(305) = {308,-309,-304,312}; Ruled Surface(325) = {305};
+Line Loop(306) = {312,-307,-311,303}; Ruled Surface(326) = {306};
+Line Loop(307) = {-311,-302,310,306}; Ruled Surface(327) = {307};
+Line Loop(308) = {-310,-301,309,305}; Ruled Surface(328) = {308};
+Line Loop(309) = {321,-320,-324,316}; Ruled Surface(329) = {309};
+Line Loop(310) = {-324,-315,323,319}; Ruled Surface(330) = {310};
+Line Loop(311) = {323,-318,-322,314}; Ruled Surface(331) = {311};
+Line Loop(312) = {322,-317,-321,313}; Ruled Surface(332) = {312};
+
+/* barreau 4 et 4' */
+
+Point(401) = {d4,    e4,    -ll/2,    s4};  Point(411) = {d4,     -e4,     ll/2,    s4}; 
+Point(402) = {d4+r4, e4,    -ll/2,    s4};  Point(412) = {d4+r4,  -e4,     ll/2,    s4}; 
+Point(403) = {d4,    e4+r4, -ll/2,    s4};  Point(413) = {d4,     -e4+r4,  ll/2,    s4}; 
+Point(404) = {d4-r4, e4,    -ll/2,    s4};  Point(414) = {d4-r4,  -e4,     ll/2,    s4}; 
+Point(405) = {d4,    e4-r4, -ll/2,    s4};  Point(415) = {d4,     -e4-r4,  ll/2,    s4}; 
+Point(406) = {d4,    e4,    -ll/2-l4, s4l};  Point(416) = {d4,     -e4,     ll/2+l4, s4l}; 
+Point(407) = {d4+r4, e4,    -ll/2-l4, s4l};  Point(417) = {d4+r4,  -e4,     ll/2+l4, s4l}; 
+Point(408) = {d4,    e4+r4, -ll/2-l4, s4l};  Point(418) = {d4,     -e4+r4,  ll/2+l4, s4l}; 
+Point(409) = {d4-r4, e4,    -ll/2-l4, s4l};  Point(419) = {d4-r4,  -e4,     ll/2+l4, s4l}; 
+Point(410) = {d4,    e4-r4, -ll/2-l4, s4l};  Point(420) = {d4,     -e4-r4,  ll/2+l4, s4l}; 
+
+Circle(401) = {402,401,403}; Circle(405) = {407,406,408}; Line(409) = {402,407};
+Circle(402) = {403,401,404}; Circle(406) = {408,406,409}; Line(410) = {403,408};
+Circle(403) = {404,401,405}; Circle(407) = {409,406,410}; Line(411) = {404,409};
+Circle(404) = {405,401,402}; Circle(408) = {410,406,407}; Line(412) = {405,410};
+
+Circle(413) = {412,411,413}; Circle(417) = {417,416,418}; Line(421) = {412,417};
+Circle(414) = {413,411,414}; Circle(418) = {418,416,419}; Line(422) = {413,418};
+Circle(415) = {414,411,415}; Circle(419) = {419,416,420}; Line(423) = {414,419};
+Circle(416) = {415,411,412}; Circle(420) = {420,416,417}; Line(424) = {415,420};
+
+Line Loop(401) = {402,403,404,401};   Plane Surface(421) = {401};
+Line Loop(402) = {407,408,405,406};   Plane Surface(422) = {402};
+Line Loop(403) = {416,413,414,415};   Plane Surface(423) = {403};
+Line Loop(404) = {420,417,418,419};   Plane Surface(424) = {404};
+Line Loop(405) = {408,-409,-404,412}; Ruled Surface(425) = {405};
+Line Loop(406) = {412,-407,-411,403}; Ruled Surface(426) = {406};
+Line Loop(407) = {-411,-402,410,406}; Ruled Surface(427) = {407};
+Line Loop(408) = {-410,-401,409,405}; Ruled Surface(428) = {408};
+Line Loop(409) = {421,-420,-424,416}; Ruled Surface(429) = {409};
+Line Loop(410) = {-424,-415,423,419}; Ruled Surface(430) = {410};
+Line Loop(411) = {423,-418,-422,414}; Ruled Surface(431) = {411};
+Line Loop(412) = {422,-417,-421,413}; Ruled Surface(432) = {412};
+
+/* barreau 5 et 5' */
+
+Point(501) = {d5,    -e5,    -ll/2,    s5};  Point(511) = {d5,     e5,     ll/2,    s5}; 
+Point(502) = {d5+r5, -e5,    -ll/2,    s5};  Point(512) = {d5+r5,  e5,     ll/2,    s5}; 
+Point(503) = {d5,    -e5+r5, -ll/2,    s5};  Point(513) = {d5,     e5+r5,  ll/2,    s5}; 
+Point(504) = {d5-r5, -e5,    -ll/2,    s5};  Point(514) = {d5-r5,  e5,     ll/2,    s5}; 
+Point(505) = {d5,    -e5-r5, -ll/2,    s5};  Point(515) = {d5,     e5-r5,  ll/2,    s5}; 
+Point(506) = {d5,    -e5,    -ll/2-l5, s5l};  Point(516) = {d5,     e5,     ll/2+l5, s5l}; 
+Point(507) = {d5+r5, -e5,    -ll/2-l5, s5l};  Point(517) = {d5+r5,  e5,     ll/2+l5, s5l}; 
+Point(508) = {d5,    -e5+r5, -ll/2-l5, s5l};  Point(518) = {d5,     e5+r5,  ll/2+l5, s5l}; 
+Point(509) = {d5-r5, -e5,    -ll/2-l5, s5l};  Point(519) = {d5-r5,  e5,     ll/2+l5, s5l}; 
+Point(510) = {d5,    -e5-r5, -ll/2-l5, s5l};  Point(520) = {d5,     e5-r5,  ll/2+l5, s5l}; 
+
+Circle(501) = {502,501,503}; Circle(505) = {507,506,508}; Line(509) = {502,507};
+Circle(502) = {503,501,504}; Circle(506) = {508,506,509}; Line(510) = {503,508};
+Circle(503) = {504,501,505}; Circle(507) = {509,506,510}; Line(511) = {504,509};
+Circle(504) = {505,501,502}; Circle(508) = {510,506,507}; Line(512) = {505,510};
+
+Circle(513) = {512,511,513}; Circle(517) = {517,516,518}; Line(521) = {512,517};
+Circle(514) = {513,511,514}; Circle(518) = {518,516,519}; Line(522) = {513,518};
+Circle(515) = {514,511,515}; Circle(519) = {519,516,520}; Line(523) = {514,519};
+Circle(516) = {515,511,512}; Circle(520) = {520,516,517}; Line(524) = {515,520};
+
+Line Loop(501) = {502,503,504,501};   Plane Surface(521) = {501};
+Line Loop(502) = {507,508,505,506};   Plane Surface(522) = {502};
+Line Loop(503) = {516,513,514,515};   Plane Surface(523) = {503};
+Line Loop(504) = {520,517,518,519};   Plane Surface(524) = {504};
+Line Loop(505) = {508,-509,-504,512}; Ruled Surface(525) = {505};
+Line Loop(506) = {512,-507,-511,503}; Ruled Surface(526) = {506};
+Line Loop(507) = {-511,-502,510,506}; Ruled Surface(527) = {507};
+Line Loop(508) = {-510,-501,509,505}; Ruled Surface(528) = {508};
+Line Loop(509) = {521,-520,-524,516}; Ruled Surface(529) = {509};
+Line Loop(510) = {-524,-515,523,519}; Ruled Surface(530) = {510};
+Line Loop(511) = {523,-518,-522,514}; Ruled Surface(531) = {511};
+Line Loop(512) = {522,-517,-521,513}; Ruled Surface(532) = {512};
+
+/* barreau 6 et 6' */
+
+Point(601) = {d6,    e6,    -ll/2,    s6};  Point(611) = {d6,     -e6,     ll/2,    s6}; 
+Point(602) = {d6+r6, e6,    -ll/2,    s6};  Point(612) = {d6+r6,  -e6,     ll/2,    s6}; 
+Point(603) = {d6,    e6+r6, -ll/2,    s6};  Point(613) = {d6,     -e6+r6,  ll/2,    s6}; 
+Point(604) = {d6-r6, e6,    -ll/2,    s6};  Point(614) = {d6-r6,  -e6,     ll/2,    s6}; 
+Point(605) = {d6,    e6-r6, -ll/2,    s6};  Point(615) = {d6,     -e6-r6,  ll/2,    s6}; 
+Point(606) = {d6,    e6,    -ll/2-l6, s6l};  Point(616) = {d6,     -e6,     ll/2+l6, s6l}; 
+Point(607) = {d6+r6, e6,    -ll/2-l6, s6l};  Point(617) = {d6+r6,  -e6,     ll/2+l6, s6l}; 
+Point(608) = {d6,    e6+r6, -ll/2-l6, s6l};  Point(618) = {d6,     -e6+r6,  ll/2+l6, s6l}; 
+Point(609) = {d6-r6, e6,    -ll/2-l6, s6l};  Point(619) = {d6-r6,  -e6,     ll/2+l6, s6l}; 
+Point(610) = {d6,    e6-r6, -ll/2-l6, s6l};  Point(620) = {d6,     -e6-r6,  ll/2+l6, s6l}; 
+
+Circle(601) = {602,601,603}; Circle(605) = {607,606,608}; Line(609) = {602,607};
+Circle(602) = {603,601,604}; Circle(606) = {608,606,609}; Line(610) = {603,608};
+Circle(603) = {604,601,605}; Circle(607) = {609,606,610}; Line(611) = {604,609};
+Circle(604) = {605,601,602}; Circle(608) = {610,606,607}; Line(612) = {605,610};
+
+Circle(613) = {612,611,613}; Circle(617) = {617,616,618}; Line(621) = {612,617};
+Circle(614) = {613,611,614}; Circle(618) = {618,616,619}; Line(622) = {613,618};
+Circle(615) = {614,611,615}; Circle(619) = {619,616,620}; Line(623) = {614,619};
+Circle(616) = {615,611,612}; Circle(620) = {620,616,617}; Line(624) = {615,620};
+
+Line Loop(601) = {602,603,604,601};   Plane Surface(621) = {601};
+Line Loop(602) = {607,608,605,606};   Plane Surface(622) = {602};
+Line Loop(603) = {616,613,614,615};   Plane Surface(623) = {603};
+Line Loop(604) = {620,617,618,619};   Plane Surface(624) = {604};
+Line Loop(605) = {608,-609,-604,612}; Ruled Surface(625) = {605};
+Line Loop(606) = {612,-607,-611,603}; Ruled Surface(626) = {606};
+Line Loop(607) = {-611,-602,610,606}; Ruled Surface(627) = {607};
+Line Loop(608) = {-610,-601,609,605}; Ruled Surface(628) = {608};
+Line Loop(609) = {621,-620,-624,616}; Ruled Surface(629) = {609};
+Line Loop(610) = {-624,-615,623,619}; Ruled Surface(630) = {610};
+Line Loop(611) = {623,-618,-622,614}; Ruled Surface(631) = {611};
+Line Loop(612) = {622,-617,-621,613}; Ruled Surface(632) = {612};
+
+/* barreau 7 et 7' */
+
+Point(701) = {d7,    -e7,    -ll/2,    s7};  Point(711) = {d7,     e7,     ll/2,    s7}; 
+Point(702) = {d7+r7, -e7,    -ll/2,    s7};  Point(712) = {d7+r7,  e7,     ll/2,    s7}; 
+Point(703) = {d7,    -e7+r7, -ll/2,    s7};  Point(713) = {d7,     e7+r7,  ll/2,    s7}; 
+Point(704) = {d7-r7, -e7,    -ll/2,    s7};  Point(714) = {d7-r7,  e7,     ll/2,    s7}; 
+Point(705) = {d7,    -e7-r7, -ll/2,    s7};  Point(715) = {d7,     e7-r7,  ll/2,    s7}; 
+Point(706) = {d7,    -e7,    -ll/2-l7, s7l};  Point(716) = {d7,     e7,     ll/2+l7, s7l}; 
+Point(707) = {d7+r7, -e7,    -ll/2-l7, s7l};  Point(717) = {d7+r7,  e7,     ll/2+l7, s7l}; 
+Point(708) = {d7,    -e7+r7, -ll/2-l7, s7l};  Point(718) = {d7,     e7+r7,  ll/2+l7, s7l}; 
+Point(709) = {d7-r7, -e7,    -ll/2-l7, s7l};  Point(719) = {d7-r7,  e7,     ll/2+l7, s7l}; 
+Point(710) = {d7,    -e7-r7, -ll/2-l7, s7l};  Point(720) = {d7,     e7-r7,  ll/2+l7, s7l}; 
+
+Circle(701) = {702,701,703}; Circle(705) = {707,706,708}; Line(709) = {702,707};
+Circle(702) = {703,701,704}; Circle(706) = {708,706,709}; Line(710) = {703,708};
+Circle(703) = {704,701,705}; Circle(707) = {709,706,710}; Line(711) = {704,709};
+Circle(704) = {705,701,702}; Circle(708) = {710,706,707}; Line(712) = {705,710};
+
+Circle(713) = {712,711,713}; Circle(717) = {717,716,718}; Line(721) = {712,717};
+Circle(714) = {713,711,714}; Circle(718) = {718,716,719}; Line(722) = {713,718};
+Circle(715) = {714,711,715}; Circle(719) = {719,716,720}; Line(723) = {714,719};
+Circle(716) = {715,711,712}; Circle(720) = {720,716,717}; Line(724) = {715,720};
+
+Line Loop(701) = {702,703,704,701};   Plane Surface(721) = {701};
+Line Loop(702) = {707,708,705,706};   Plane Surface(722) = {702};
+Line Loop(703) = {716,713,714,715};   Plane Surface(723) = {703};
+Line Loop(704) = {720,717,718,719};   Plane Surface(724) = {704};
+Line Loop(705) = {708,-709,-704,712}; Ruled Surface(725) = {705};
+Line Loop(706) = {712,-707,-711,703}; Ruled Surface(726) = {706};
+Line Loop(707) = {-711,-702,710,706}; Ruled Surface(727) = {707};
+Line Loop(708) = {-710,-701,709,705}; Ruled Surface(728) = {708};
+Line Loop(709) = {721,-720,-724,716}; Ruled Surface(729) = {709};
+Line Loop(710) = {-724,-715,723,719}; Ruled Surface(730) = {710};
+Line Loop(711) = {723,-718,-722,714}; Ruled Surface(731) = {711};
+Line Loop(712) = {722,-717,-721,713}; Ruled Surface(732) = {712};
+
+/* barreau 8 et 8' */
+
+Point(801) = {d8,    e8,    -ll/2,    s8};  Point(811) = {d8,     -e8,     ll/2,    s8}; 
+Point(802) = {d8+r8, e8,    -ll/2,    s8};  Point(812) = {d8+r8,  -e8,     ll/2,    s8}; 
+Point(803) = {d8,    e8+r8, -ll/2,    s8};  Point(813) = {d8,     -e8+r8,  ll/2,    s8}; 
+Point(804) = {d8-r8, e8,    -ll/2,    s8};  Point(814) = {d8-r8,  -e8,     ll/2,    s8}; 
+Point(805) = {d8,    e8-r8, -ll/2,    s8};  Point(815) = {d8,     -e8-r8,  ll/2,    s8}; 
+Point(806) = {d8,    e8,    -ll/2-l8, s8l};  Point(816) = {d8,     -e8,     ll/2+l8, s8l}; 
+Point(807) = {d8+r8, e8,    -ll/2-l8, s8l};  Point(817) = {d8+r8,  -e8,     ll/2+l8, s8l}; 
+Point(808) = {d8,    e8+r8, -ll/2-l8, s8l};  Point(818) = {d8,     -e8+r8,  ll/2+l8, s8l}; 
+Point(809) = {d8-r8, e8,    -ll/2-l8, s8l};  Point(819) = {d8-r8,  -e8,     ll/2+l8, s8l}; 
+Point(810) = {d8,    e8-r8, -ll/2-l8, s8l};  Point(820) = {d8,     -e8-r8,  ll/2+l8, s8l}; 
+
+Circle(801) = {802,801,803}; Circle(805) = {807,806,808}; Line(809) = {802,807};
+Circle(802) = {803,801,804}; Circle(806) = {808,806,809}; Line(810) = {803,808};
+Circle(803) = {804,801,805}; Circle(807) = {809,806,810}; Line(811) = {804,809};
+Circle(804) = {805,801,802}; Circle(808) = {810,806,807}; Line(812) = {805,810};
+
+Circle(813) = {812,811,813}; Circle(817) = {817,816,818}; Line(821) = {812,817};
+Circle(814) = {813,811,814}; Circle(818) = {818,816,819}; Line(822) = {813,818};
+Circle(815) = {814,811,815}; Circle(819) = {819,816,820}; Line(823) = {814,819};
+Circle(816) = {815,811,812}; Circle(820) = {820,816,817}; Line(824) = {815,820};
+
+Line Loop(801) = {802,803,804,801};   Plane Surface(821) = {801};
+Line Loop(802) = {807,808,805,806};   Plane Surface(822) = {802};
+Line Loop(803) = {816,813,814,815};   Plane Surface(823) = {803};
+Line Loop(804) = {820,817,818,819};   Plane Surface(824) = {804};
+Line Loop(805) = {808,-809,-804,812}; Ruled Surface(825) = {805};
+Line Loop(806) = {812,-807,-811,803}; Ruled Surface(826) = {806};
+Line Loop(807) = {-811,-802,810,806}; Ruled Surface(827) = {807};
+Line Loop(808) = {-810,-801,809,805}; Ruled Surface(828) = {808};
+Line Loop(809) = {821,-820,-824,816}; Ruled Surface(829) = {809};
+Line Loop(810) = {-824,-815,823,819}; Ruled Surface(830) = {810};
+Line Loop(811) = {823,-818,-822,814}; Ruled Surface(831) = {811};
+Line Loop(812) = {822,-817,-821,813}; Ruled Surface(832) = {812};
+
+/* barreau 9 et 9' */
+
+Point(901) = {d9,    -e9,    -ll/2,    s9};  Point(911) = {d9,     e9,     ll/2,    s9}; 
+Point(902) = {d9+r9, -e9,    -ll/2,    s9};  Point(912) = {d9+r9,  e9,     ll/2,    s9}; 
+Point(903) = {d9,    -e9+r9, -ll/2,    s9};  Point(913) = {d9,     e9+r9,  ll/2,    s9}; 
+Point(904) = {d9-r9, -e9,    -ll/2,    s9};  Point(914) = {d9-r9,  e9,     ll/2,    s9}; 
+Point(905) = {d9,    -e9-r9, -ll/2,    s9};  Point(915) = {d9,     e9-r9,  ll/2,    s9}; 
+Point(906) = {d9,    -e9,    -ll/2-l9, s9l};  Point(916) = {d9,     e9,     ll/2+l9, s9l}; 
+Point(907) = {d9+r9, -e9,    -ll/2-l9, s9l};  Point(917) = {d9+r9,  e9,     ll/2+l9, s9l}; 
+Point(908) = {d9,    -e9+r9, -ll/2-l9, s9l};  Point(918) = {d9,     e9+r9,  ll/2+l9, s9l}; 
+Point(909) = {d9-r9, -e9,    -ll/2-l9, s9l};  Point(919) = {d9-r9,  e9,     ll/2+l9, s9l}; 
+Point(910) = {d9,    -e9-r9, -ll/2-l9, s9l};  Point(920) = {d9,     e9-r9,  ll/2+l9, s9l}; 
+
+Circle(901) = {902,901,903}; Circle(905) = {907,906,908}; Line(909) = {902,907};
+Circle(902) = {903,901,904}; Circle(906) = {908,906,909}; Line(910) = {903,908};
+Circle(903) = {904,901,905}; Circle(907) = {909,906,910}; Line(911) = {904,909};
+Circle(904) = {905,901,902}; Circle(908) = {910,906,907}; Line(912) = {905,910};
+
+Circle(913) = {912,911,913}; Circle(917) = {917,916,918}; Line(921) = {912,917};
+Circle(914) = {913,911,914}; Circle(918) = {918,916,919}; Line(922) = {913,918};
+Circle(915) = {914,911,915}; Circle(919) = {919,916,920}; Line(923) = {914,919};
+Circle(916) = {915,911,912}; Circle(920) = {920,916,917}; Line(924) = {915,920};
+
+Line Loop(901) = {902,903,904,901};   Plane Surface(921) = {901};
+Line Loop(902) = {907,908,905,906};   Plane Surface(922) = {902};
+Line Loop(903) = {916,913,914,915};   Plane Surface(923) = {903};
+Line Loop(904) = {920,917,918,919};   Plane Surface(924) = {904};
+Line Loop(905) = {908,-909,-904,912}; Ruled Surface(925) = {905};
+Line Loop(906) = {912,-907,-911,903}; Ruled Surface(926) = {906};
+Line Loop(907) = {-911,-902,910,906}; Ruled Surface(927) = {907};
+Line Loop(908) = {-910,-901,909,905}; Ruled Surface(928) = {908};
+Line Loop(909) = {921,-920,-924,916}; Ruled Surface(929) = {909};
+Line Loop(910) = {-924,-915,923,919}; Ruled Surface(930) = {910};
+Line Loop(911) = {923,-918,-922,914}; Ruled Surface(931) = {911};
+Line Loop(912) = {922,-917,-921,913}; Ruled Surface(932) = {912};
+
+/* barreau 10 et 10' */
+
+Point(1001) = {d10,    e10,    -ll/2,    s10};  Point(1011) = {d10,     -e10,     ll/2,    s10}; 
+Point(1002) = {d10+r10, e10,    -ll/2,    s10};  Point(1012) = {d10+r10,  -e10,     ll/2,    s10}; 
+Point(1003) = {d10,    e10+r10, -ll/2,    s10};  Point(1013) = {d10,     -e10+r10,  ll/2,    s10}; 
+Point(1004) = {d10-r10, e10,    -ll/2,    s10};  Point(1014) = {d10-r10,  -e10,     ll/2,    s10}; 
+Point(1005) = {d10,    e10-r10, -ll/2,    s10};  Point(1015) = {d10,     -e10-r10,  ll/2,    s10}; 
+Point(1006) = {d10,    e10,    -ll/2-l10, s10l};  Point(1016) = {d10,     -e10,     ll/2+l10, s10l}; 
+Point(1007) = {d10+r10, e10,    -ll/2-l10, s10l};  Point(1017) = {d10+r10,  -e10,     ll/2+l10, s10l}; 
+Point(1008) = {d10,    e10+r10, -ll/2-l10, s10l};  Point(1018) = {d10,     -e10+r10,  ll/2+l10, s10l}; 
+Point(1009) = {d10-r10, e10,    -ll/2-l10, s10l};  Point(1019) = {d10-r10,  -e10,     ll/2+l10, s10l}; 
+Point(1010) = {d10,    e10-r10, -ll/2-l10, s10l};  Point(1020) = {d10,     -e10-r10,  ll/2+l10, s10l}; 
+
+Circle(1001) = {1002,1001,1003}; Circle(1005) = {1007,1006,1008}; Line(1009) = {1002,1007};
+Circle(1002) = {1003,1001,1004}; Circle(1006) = {1008,1006,1009}; Line(1010) = {1003,1008};
+Circle(1003) = {1004,1001,1005}; Circle(1007) = {1009,1006,1010}; Line(1011) = {1004,1009};
+Circle(1004) = {1005,1001,1002}; Circle(1008) = {1010,1006,1007}; Line(1012) = {1005,1010};
+
+Circle(1013) = {1012,1011,1013}; Circle(1017) = {1017,1016,1018}; Line(1021) = {1012,1017};
+Circle(1014) = {1013,1011,1014}; Circle(1018) = {1018,1016,1019}; Line(1022) = {1013,1018};
+Circle(1015) = {1014,1011,1015}; Circle(1019) = {1019,1016,1020}; Line(1023) = {1014,1019};
+Circle(1016) = {1015,1011,1012}; Circle(1020) = {1020,1016,1017}; Line(1024) = {1015,1020};
+
+Line Loop(1001) = {1002,1003,1004,1001};   Plane Surface(1021) = {1001};
+Line Loop(1002) = {1007,1008,1005,1006};   Plane Surface(1022) = {1002};
+Line Loop(1003) = {1016,1013,1014,1015};   Plane Surface(1023) = {1003};
+Line Loop(1004) = {1020,1017,1018,1019};   Plane Surface(1024) = {1004};
+Line Loop(1005) = {1008,-1009,-1004,1012}; Ruled Surface(1025) = {1005};
+Line Loop(1006) = {1012,-1007,-1011,1003}; Ruled Surface(1026) = {1006};
+Line Loop(1007) = {-1011,-1002,1010,1006}; Ruled Surface(1027) = {1007};
+Line Loop(1008) = {-1010,-1001,1009,1005}; Ruled Surface(1028) = {1008};
+Line Loop(1009) = {1021,-1020,-1024,1016}; Ruled Surface(1029) = {1009};
+Line Loop(1010) = {-1024,-1015,1023,1019}; Ruled Surface(1030) = {1010};
+Line Loop(1011) = {1023,-1018,-1022,1014}; Ruled Surface(1031) = {1011};
+Line Loop(1012) = {1022,-1017,-1021,1013}; Ruled Surface(1032) = {1012};
+
+/* barreau 11 et 11' */
+
+Point(1101) = {d11,    -e11,    -ll/2,    s11};  Point(1111) = {d11,     e11,     ll/2,    s11}; 
+Point(1102) = {d11+r11, -e11,    -ll/2,    s11};  Point(1112) = {d11+r11,  e11,     ll/2,    s11}; 
+Point(1103) = {d11,    -e11+r11, -ll/2,    s11};  Point(1113) = {d11,     e11+r11,  ll/2,    s11}; 
+Point(1104) = {d11-r11, -e11,    -ll/2,    s11};  Point(1114) = {d11-r11,  e11,     ll/2,    s11}; 
+Point(1105) = {d11,    -e11-r11, -ll/2,    s11};  Point(1115) = {d11,     e11-r11,  ll/2,    s11}; 
+Point(1106) = {d11,    -e11,    -ll/2-l11, s11l};  Point(1116) = {d11,     e11,     ll/2+l11, s11l}; 
+Point(1107) = {d11+r11, -e11,    -ll/2-l11, s11l};  Point(1117) = {d11+r11,  e11,     ll/2+l11, s11l}; 
+Point(1108) = {d11,    -e11+r11, -ll/2-l11, s11l};  Point(1118) = {d11,     e11+r11,  ll/2+l11, s11l}; 
+Point(1109) = {d11-r11, -e11,    -ll/2-l11, s11l};  Point(1119) = {d11-r11,  e11,     ll/2+l11, s11l}; 
+Point(1110) = {d11,    -e11-r11, -ll/2-l11, s11l};  Point(1120) = {d11,     e11-r11,  ll/2+l11, s11l}; 
+
+Circle(1101) = {1102,1101,1103}; Circle(1105) = {1107,1106,1108}; Line(1109) = {1102,1107};
+Circle(1102) = {1103,1101,1104}; Circle(1106) = {1108,1106,1109}; Line(1110) = {1103,1108};
+Circle(1103) = {1104,1101,1105}; Circle(1107) = {1109,1106,1110}; Line(1111) = {1104,1109};
+Circle(1104) = {1105,1101,1102}; Circle(1108) = {1110,1106,1107}; Line(1112) = {1105,1110};
+
+Circle(1113) = {1112,1111,1113}; Circle(1117) = {1117,1116,1118}; Line(1121) = {1112,1117};
+Circle(1114) = {1113,1111,1114}; Circle(1118) = {1118,1116,1119}; Line(1122) = {1113,1118};
+Circle(1115) = {1114,1111,1115}; Circle(1119) = {1119,1116,1120}; Line(1123) = {1114,1119};
+Circle(1116) = {1115,1111,1112}; Circle(1120) = {1120,1116,1117}; Line(1124) = {1115,1120};
+
+Line Loop(1101) = {1102,1103,1104,1101};   Plane Surface(1121) = {1101};
+Line Loop(1102) = {1107,1108,1105,1106};   Plane Surface(1122) = {1102};
+Line Loop(1103) = {1116,1113,1114,1115};   Plane Surface(1123) = {1103};
+Line Loop(1104) = {1120,1117,1118,1119};   Plane Surface(1124) = {1104};
+Line Loop(1105) = {1108,-1109,-1104,1112}; Ruled Surface(1125) = {1105};
+Line Loop(1106) = {1112,-1107,-1111,1103}; Ruled Surface(1126) = {1106};
+Line Loop(1107) = {-1111,-1102,1110,1106}; Ruled Surface(1127) = {1107};
+Line Loop(1108) = {-1110,-1101,1109,1105}; Ruled Surface(1128) = {1108};
+Line Loop(1109) = {1121,-1120,-1124,1116}; Ruled Surface(1129) = {1109};
+Line Loop(1110) = {-1124,-1115,1123,1119}; Ruled Surface(1130) = {1110};
+Line Loop(1111) = {1123,-1118,-1122,1114}; Ruled Surface(1131) = {1111};
+Line Loop(1112) = {1122,-1117,-1121,1113}; Ruled Surface(1132) = {1112};
+
+/* barreau 12 et 12' */
+
+Point(1201) = {d12,    e12,    -ll/2,    s12};  Point(1211) = {d12,     -e12,     ll/2,    s12}; 
+Point(1202) = {d12+r12, e12,    -ll/2,    s12};  Point(1212) = {d12+r12,  -e12,     ll/2,    s12}; 
+Point(1203) = {d12,    e12+r12, -ll/2,    s12};  Point(1213) = {d12,     -e12+r12,  ll/2,    s12}; 
+Point(1204) = {d12-r12, e12,    -ll/2,    s12};  Point(1214) = {d12-r12,  -e12,     ll/2,    s12}; 
+Point(1205) = {d12,    e12-r12, -ll/2,    s12};  Point(1215) = {d12,     -e12-r12,  ll/2,    s12}; 
+Point(1206) = {d12,    e12,    -ll/2-l12, s12l};  Point(1216) = {d12,     -e12,     ll/2+l12, s12l}; 
+Point(1207) = {d12+r12, e12,    -ll/2-l12, s12l};  Point(1217) = {d12+r12,  -e12,     ll/2+l12, s12l}; 
+Point(1208) = {d12,    e12+r12, -ll/2-l12, s12l};  Point(1218) = {d12,     -e12+r12,  ll/2+l12, s12l}; 
+Point(1209) = {d12-r12, e12,    -ll/2-l12, s12l};  Point(1219) = {d12-r12,  -e12,     ll/2+l12, s12l}; 
+Point(1210) = {d12,    e12-r12, -ll/2-l12, s12l};  Point(1220) = {d12,     -e12-r12,  ll/2+l12, s12l}; 
+
+Circle(1201) = {1202,1201,1203}; Circle(1205) = {1207,1206,1208}; Line(1209) = {1202,1207};
+Circle(1202) = {1203,1201,1204}; Circle(1206) = {1208,1206,1209}; Line(1210) = {1203,1208};
+Circle(1203) = {1204,1201,1205}; Circle(1207) = {1209,1206,1210}; Line(1211) = {1204,1209};
+Circle(1204) = {1205,1201,1202}; Circle(1208) = {1210,1206,1207}; Line(1212) = {1205,1210};
+       	       	     		    	    	    	       	       	   
+Circle(1213) = {1212,1211,1213}; Circle(1217) = {1217,1216,1218}; Line(1221) = {1212,1217};
+Circle(1214) = {1213,1211,1214}; Circle(1218) = {1218,1216,1219}; Line(1222) = {1213,1218};
+Circle(1215) = {1214,1211,1215}; Circle(1219) = {1219,1216,1220}; Line(1223) = {1214,1219};
+Circle(1216) = {1215,1211,1212}; Circle(1220) = {1220,1216,1217}; Line(1224) = {1215,1220};
+
+Line Loop(1201) = {1202,1203,1204,1201};   Plane Surface(1221) = {1201};
+Line Loop(1202) = {1207,1208,1205,1206};   Plane Surface(1222) = {1202};
+Line Loop(1203) = {1216,1213,1214,1215};   Plane Surface(1223) = {1203};
+Line Loop(1204) = {1220,1217,1218,1219};   Plane Surface(1224) = {1204};
+Line Loop(1205) = {1208,-1209,-1204,1212}; Ruled Surface(1225) = {1205};
+Line Loop(1206) = {1212,-1207,-1211,1203}; Ruled Surface(1226) = {1206};
+Line Loop(1207) = {-1211,-1202,1210,1206}; Ruled Surface(1227) = {1207};
+Line Loop(1208) = {-1210,-1201,1209,1205}; Ruled Surface(1228) = {1208};
+Line Loop(1209) = {1221,-1220,-1224,1216}; Ruled Surface(1229) = {1209};
+Line Loop(1210) = {-1224,-1215,1223,1219}; Ruled Surface(1230) = {1210};
+Line Loop(1211) = {1223,-1218,-1222,1214}; Ruled Surface(1231) = {1211};
+Line Loop(1212) = {1222,-1217,-1221,1213}; Ruled Surface(1232) = {1212};
+
+/* barreau 13 et 13' */
+
+Point(1301) = {d13,    -e13,    -ll/2,    s13};  Point(1311) = {d13,     e13,     ll/2,    s13}; 
+Point(1302) = {d13+r13, -e13,    -ll/2,    s13};  Point(1312) = {d13+r13,  e13,     ll/2,    s13}; 
+Point(1303) = {d13,    -e13+r13, -ll/2,    s13};  Point(1313) = {d13,     e13+r13,  ll/2,    s13}; 
+Point(1304) = {d13-r13, -e13,    -ll/2,    s13};  Point(1314) = {d13-r13,  e13,     ll/2,    s13}; 
+Point(1305) = {d13,    -e13-r13, -ll/2,    s13};  Point(1315) = {d13,     e13-r13,  ll/2,    s13}; 
+Point(1306) = {d13,    -e13,    -ll/2-l13, s13l};  Point(1316) = {d13,     e13,     ll/2+l13, s13l}; 
+Point(1307) = {d13+r13, -e13,    -ll/2-l13, s13l};  Point(1317) = {d13+r13,  e13,     ll/2+l13, s13l}; 
+Point(1308) = {d13,    -e13+r13, -ll/2-l13, s13l};  Point(1318) = {d13,     e13+r13,  ll/2+l13, s13l}; 
+Point(1309) = {d13-r13, -e13,    -ll/2-l13, s13l};  Point(1319) = {d13-r13,  e13,     ll/2+l13, s13l}; 
+Point(1310) = {d13,    -e13-r13, -ll/2-l13, s13l};  Point(1320) = {d13,     e13-r13,  ll/2+l13, s13l}; 
+
+Circle(1301) = {1302,1301,1303}; Circle(1305) = {1307,1306,1308}; Line(1309) = {1302,1307};
+Circle(1302) = {1303,1301,1304}; Circle(1306) = {1308,1306,1309}; Line(1310) = {1303,1308};
+Circle(1303) = {1304,1301,1305}; Circle(1307) = {1309,1306,1310}; Line(1311) = {1304,1309};
+Circle(1304) = {1305,1301,1302}; Circle(1308) = {1310,1306,1307}; Line(1312) = {1305,1310};
+       	       	     		    	    	    	       	       	   
+Circle(1313) = {1312,1311,1313}; Circle(1317) = {1317,1316,1318}; Line(1321) = {1312,1317};
+Circle(1314) = {1313,1311,1314}; Circle(1318) = {1318,1316,1319}; Line(1322) = {1313,1318};
+Circle(1315) = {1314,1311,1315}; Circle(1319) = {1319,1316,1320}; Line(1323) = {1314,1319};
+Circle(1316) = {1315,1311,1312}; Circle(1320) = {1320,1316,1317}; Line(1324) = {1315,1320};
+
+Line Loop(1301) = {1302,1303,1304,1301};   Plane Surface(1321) = {1301};
+Line Loop(1302) = {1307,1308,1305,1306};   Plane Surface(1322) = {1302};
+Line Loop(1303) = {1316,1313,1314,1315};   Plane Surface(1323) = {1303};
+Line Loop(1304) = {1320,1317,1318,1319};   Plane Surface(1324) = {1304};
+Line Loop(1305) = {1308,-1309,-1304,1312}; Ruled Surface(1325) = {1305};
+Line Loop(1306) = {1312,-1307,-1311,1303}; Ruled Surface(1326) = {1306};
+Line Loop(1307) = {-1311,-1302,1310,1306}; Ruled Surface(1327) = {1307};
+Line Loop(1308) = {-1310,-1301,1309,1305}; Ruled Surface(1328) = {1308};
+Line Loop(1309) = {1321,-1320,-1324,1316}; Ruled Surface(1329) = {1309};
+Line Loop(1310) = {-1324,-1315,1323,1319}; Ruled Surface(1330) = {1310};
+Line Loop(1311) = {1323,-1318,-1322,1314}; Ruled Surface(1331) = {1311};
+Line Loop(1312) = {1322,-1317,-1321,1313}; Ruled Surface(1332) = {1312};
+
+/* barreau 14 et 14' */
+
+Point(1401) = {d14,    e14,    -ll/2,    s14};  Point(1411) = {d14,     -e14,     ll/2,    s14}; 
+Point(1402) = {d14+r14, e14,    -ll/2,    s14};  Point(1412) = {d14+r14,  -e14,     ll/2,    s14}; 
+Point(1403) = {d14,    e14+r14, -ll/2,    s14};  Point(1413) = {d14,     -e14+r14,  ll/2,    s14}; 
+Point(1404) = {d14-r14, e14,    -ll/2,    s14};  Point(1414) = {d14-r14,  -e14,     ll/2,    s14}; 
+Point(1405) = {d14,    e14-r14, -ll/2,    s14};  Point(1415) = {d14,     -e14-r14,  ll/2,    s14}; 
+Point(1406) = {d14,    e14,    -ll/2-l14, s14l};  Point(1416) = {d14,     -e14,     ll/2+l14, s14l}; 
+Point(1407) = {d14+r14, e14,    -ll/2-l14, s14l};  Point(1417) = {d14+r14,  -e14,     ll/2+l14, s14l}; 
+Point(1408) = {d14,    e14+r14, -ll/2-l14, s14l};  Point(1418) = {d14,     -e14+r14,  ll/2+l14, s14l}; 
+Point(1409) = {d14-r14, e14,    -ll/2-l14, s14l};  Point(1419) = {d14-r14,  -e14,     ll/2+l14, s14l}; 
+Point(1410) = {d14,    e14-r14, -ll/2-l14, s14l};  Point(1420) = {d14,     -e14-r14,  ll/2+l14, s14l}; 
+
+Circle(1401) = {1402,1401,1403}; Circle(1405) = {1407,1406,1408}; Line(1409) = {1402,1407};
+Circle(1402) = {1403,1401,1404}; Circle(1406) = {1408,1406,1409}; Line(1410) = {1403,1408};
+Circle(1403) = {1404,1401,1405}; Circle(1407) = {1409,1406,1410}; Line(1411) = {1404,1409};
+Circle(1404) = {1405,1401,1402}; Circle(1408) = {1410,1406,1407}; Line(1412) = {1405,1410};
+       	       	     		    	    	    	       	       	   
+Circle(1413) = {1412,1411,1413}; Circle(1417) = {1417,1416,1418}; Line(1421) = {1412,1417};
+Circle(1414) = {1413,1411,1414}; Circle(1418) = {1418,1416,1419}; Line(1422) = {1413,1418};
+Circle(1415) = {1414,1411,1415}; Circle(1419) = {1419,1416,1420}; Line(1423) = {1414,1419};
+Circle(1416) = {1415,1411,1412}; Circle(1420) = {1420,1416,1417}; Line(1424) = {1415,1420};
+
+Line Loop(1401) = {1402,1403,1404,1401};   Plane Surface(1421) = {1401};
+Line Loop(1402) = {1407,1408,1405,1406};   Plane Surface(1422) = {1402};
+Line Loop(1403) = {1416,1413,1414,1415};   Plane Surface(1423) = {1403};
+Line Loop(1404) = {1420,1417,1418,1419};   Plane Surface(1424) = {1404};
+Line Loop(1405) = {1408,-1409,-1404,1412}; Ruled Surface(1425) = {1405};
+Line Loop(1406) = {1412,-1407,-1411,1403}; Ruled Surface(1426) = {1406};
+Line Loop(1407) = {-1411,-1402,1410,1406}; Ruled Surface(1427) = {1407};
+Line Loop(1408) = {-1410,-1401,1409,1405}; Ruled Surface(1428) = {1408};
+Line Loop(1409) = {1421,-1420,-1424,1416}; Ruled Surface(1429) = {1409};
+Line Loop(1410) = {-1424,-1415,1423,1419}; Ruled Surface(1430) = {1410};
+Line Loop(1411) = {1423,-1418,-1422,1414}; Ruled Surface(1431) = {1411};
+Line Loop(1412) = {1422,-1417,-1421,1413}; Ruled Surface(1432) = {1412};
+
+/* barreau 15 et 15' */
+
+Point(1501) = {d15,    -e15,    -ll/2,    s15};  Point(1511) = {d15,     e15,     ll/2,    s15}; 
+Point(1502) = {d15+r15, -e15,    -ll/2,    s15};  Point(1512) = {d15+r15,  e15,     ll/2,    s15}; 
+Point(1503) = {d15,    -e15+r15, -ll/2,    s15};  Point(1513) = {d15,     e15+r15,  ll/2,    s15}; 
+Point(1504) = {d15-r15, -e15,    -ll/2,    s15};  Point(1514) = {d15-r15,  e15,     ll/2,    s15}; 
+Point(1505) = {d15,    -e15-r15, -ll/2,    s15};  Point(1515) = {d15,     e15-r15,  ll/2,    s15}; 
+Point(1506) = {d15,    -e15,    -ll/2-l15, s15l};  Point(1516) = {d15,     e15,     ll/2+l15, s15l}; 
+Point(1507) = {d15+r15, -e15,    -ll/2-l15, s15l};  Point(1517) = {d15+r15,  e15,     ll/2+l15, s15l}; 
+Point(1508) = {d15,    -e15+r15, -ll/2-l15, s15l};  Point(1518) = {d15,     e15+r15,  ll/2+l15, s15l}; 
+Point(1509) = {d15-r15, -e15,    -ll/2-l15, s15l};  Point(1519) = {d15-r15,  e15,     ll/2+l15, s15l}; 
+Point(1510) = {d15,    -e15-r15, -ll/2-l15, s15l};  Point(1520) = {d15,     e15-r15,  ll/2+l15, s15l}; 
+
+Circle(1501) = {1502,1501,1503}; Circle(1505) = {1507,1506,1508}; Line(1509) = {1502,1507};
+Circle(1502) = {1503,1501,1504}; Circle(1506) = {1508,1506,1509}; Line(1510) = {1503,1508};
+Circle(1503) = {1504,1501,1505}; Circle(1507) = {1509,1506,1510}; Line(1511) = {1504,1509};
+Circle(1504) = {1505,1501,1502}; Circle(1508) = {1510,1506,1507}; Line(1512) = {1505,1510};
+       	       	     		    	    	    	       	       	   
+Circle(1513) = {1512,1511,1513}; Circle(1517) = {1517,1516,1518}; Line(1521) = {1512,1517};
+Circle(1514) = {1513,1511,1514}; Circle(1518) = {1518,1516,1519}; Line(1522) = {1513,1518};
+Circle(1515) = {1514,1511,1515}; Circle(1519) = {1519,1516,1520}; Line(1523) = {1514,1519};
+Circle(1516) = {1515,1511,1512}; Circle(1520) = {1520,1516,1517}; Line(1524) = {1515,1520};
+
+Line Loop(1501) = {1502,1503,1504,1501};   Plane Surface(1521) = {1501};
+Line Loop(1502) = {1507,1508,1505,1506};   Plane Surface(1522) = {1502};
+Line Loop(1503) = {1516,1513,1514,1515};   Plane Surface(1523) = {1503};
+Line Loop(1504) = {1520,1517,1518,1519};   Plane Surface(1524) = {1504};
+Line Loop(1505) = {1508,-1509,-1504,1512}; Ruled Surface(1525) = {1505};
+Line Loop(1506) = {1512,-1507,-1511,1503}; Ruled Surface(1526) = {1506};
+Line Loop(1507) = {-1511,-1502,1510,1506}; Ruled Surface(1527) = {1507};
+Line Loop(1508) = {-1510,-1501,1509,1505}; Ruled Surface(1528) = {1508};
+Line Loop(1509) = {1521,-1520,-1524,1516}; Ruled Surface(1529) = {1509};
+Line Loop(1510) = {-1524,-1515,1523,1519}; Ruled Surface(1530) = {1510};
+Line Loop(1511) = {1523,-1518,-1522,1514}; Ruled Surface(1531) = {1511};
+Line Loop(1512) = {1522,-1517,-1521,1513}; Ruled Surface(1532) = {1512};
+
+/* barreau 16 et 16' */
+
+Point(1601) = {d16,    e16,    -ll/2,    s16};  Point(1611) = {d16,     -e16,     ll/2,    s16}; 
+Point(1602) = {d16+r16, e16,    -ll/2,    s16};  Point(1612) = {d16+r16,  -e16,     ll/2,    s16}; 
+Point(1603) = {d16,    e16+r16, -ll/2,    s16};  Point(1613) = {d16,     -e16+r16,  ll/2,    s16}; 
+Point(1604) = {d16-r16, e16,    -ll/2,    s16};  Point(1614) = {d16-r16,  -e16,     ll/2,    s16}; 
+Point(1605) = {d16,    e16-r16, -ll/2,    s16};  Point(1615) = {d16,     -e16-r16,  ll/2,    s16}; 
+Point(1606) = {d16,    e16,    -ll/2-l16, s16l};  Point(1616) = {d16,     -e16,     ll/2+l16, s16l}; 
+Point(1607) = {d16+r16, e16,    -ll/2-l16, s16l};  Point(1617) = {d16+r16,  -e16,     ll/2+l16, s16l}; 
+Point(1608) = {d16,    e16+r16, -ll/2-l16, s16l};  Point(1618) = {d16,     -e16+r16,  ll/2+l16, s16l}; 
+Point(1609) = {d16-r16, e16,    -ll/2-l16, s16l};  Point(1619) = {d16-r16,  -e16,     ll/2+l16, s16l}; 
+Point(1610) = {d16,    e16-r16, -ll/2-l16, s16l};  Point(1620) = {d16,     -e16-r16,  ll/2+l16, s16l}; 
+
+Circle(1601) = {1602,1601,1603}; Circle(1605) = {1607,1606,1608}; Line(1609) = {1602,1607};
+Circle(1602) = {1603,1601,1604}; Circle(1606) = {1608,1606,1609}; Line(1610) = {1603,1608};
+Circle(1603) = {1604,1601,1605}; Circle(1607) = {1609,1606,1610}; Line(1611) = {1604,1609};
+Circle(1604) = {1605,1601,1602}; Circle(1608) = {1610,1606,1607}; Line(1612) = {1605,1610};
+       	       	     		    	    	    	       	       	   
+Circle(1613) = {1612,1611,1613}; Circle(1617) = {1617,1616,1618}; Line(1621) = {1612,1617};
+Circle(1614) = {1613,1611,1614}; Circle(1618) = {1618,1616,1619}; Line(1622) = {1613,1618};
+Circle(1615) = {1614,1611,1615}; Circle(1619) = {1619,1616,1620}; Line(1623) = {1614,1619};
+Circle(1616) = {1615,1611,1612}; Circle(1620) = {1620,1616,1617}; Line(1624) = {1615,1620};
+
+Line Loop(1601) = {1602,1603,1604,1601};   Plane Surface(1621) = {1601};
+Line Loop(1602) = {1607,1608,1605,1606};   Plane Surface(1622) = {1602};
+Line Loop(1603) = {1616,1613,1614,1615};   Plane Surface(1623) = {1603};
+Line Loop(1604) = {1620,1617,1618,1619};   Plane Surface(1624) = {1604};
+Line Loop(1605) = {1608,-1609,-1604,1612}; Ruled Surface(1625) = {1605};
+Line Loop(1606) = {1612,-1607,-1611,1603}; Ruled Surface(1626) = {1606};
+Line Loop(1607) = {-1611,-1602,1610,1606}; Ruled Surface(1627) = {1607};
+Line Loop(1608) = {-1610,-1601,1609,1605}; Ruled Surface(1628) = {1608};
+Line Loop(1609) = {1621,-1620,-1624,1616}; Ruled Surface(1629) = {1609};
+Line Loop(1610) = {-1624,-1615,1623,1619}; Ruled Surface(1630) = {1610};
+Line Loop(1611) = {1623,-1618,-1622,1614}; Ruled Surface(1631) = {1611};
+Line Loop(1612) = {1622,-1617,-1621,1613}; Ruled Surface(1632) = {1612};
+
+/* barreau 17 et 17' */
+
+Point(1701) = {d17,    -e17,    -ll/2,    s17};  Point(1711) = {d17,     e17,     ll/2,    s17}; 
+Point(1702) = {d17+r17, -e17,    -ll/2,    s17};  Point(1712) = {d17+r17,  e17,     ll/2,    s17}; 
+Point(1703) = {d17,    -e17+r17, -ll/2,    s17};  Point(1713) = {d17,     e17+r17,  ll/2,    s17}; 
+Point(1704) = {d17-r17, -e17,    -ll/2,    s17};  Point(1714) = {d17-r17,  e17,     ll/2,    s17}; 
+Point(1705) = {d17,    -e17-r17, -ll/2,    s17};  Point(1715) = {d17,     e17-r17,  ll/2,    s17}; 
+Point(1706) = {d17,    -e17,    -ll/2-l17, s17l};  Point(1716) = {d17,     e17,     ll/2+l17, s17l}; 
+Point(1707) = {d17+r17, -e17,    -ll/2-l17, s17l};  Point(1717) = {d17+r17,  e17,     ll/2+l17, s17l}; 
+Point(1708) = {d17,    -e17+r17, -ll/2-l17, s17l};  Point(1718) = {d17,     e17+r17,  ll/2+l17, s17l}; 
+Point(1709) = {d17-r17, -e17,    -ll/2-l17, s17l};  Point(1719) = {d17-r17,  e17,     ll/2+l17, s17l}; 
+Point(1710) = {d17,    -e17-r17, -ll/2-l17, s17l};  Point(1720) = {d17,     e17-r17,  ll/2+l17, s17l}; 
+
+Circle(1701) = {1702,1701,1703}; Circle(1705) = {1707,1706,1708}; Line(1709) = {1702,1707};
+Circle(1702) = {1703,1701,1704}; Circle(1706) = {1708,1706,1709}; Line(1710) = {1703,1708};
+Circle(1703) = {1704,1701,1705}; Circle(1707) = {1709,1706,1710}; Line(1711) = {1704,1709};
+Circle(1704) = {1705,1701,1702}; Circle(1708) = {1710,1706,1707}; Line(1712) = {1705,1710};
+       	       	     		    	    	    	       	       	   
+Circle(1713) = {1712,1711,1713}; Circle(1717) = {1717,1716,1718}; Line(1721) = {1712,1717};
+Circle(1714) = {1713,1711,1714}; Circle(1718) = {1718,1716,1719}; Line(1722) = {1713,1718};
+Circle(1715) = {1714,1711,1715}; Circle(1719) = {1719,1716,1720}; Line(1723) = {1714,1719};
+Circle(1716) = {1715,1711,1712}; Circle(1720) = {1720,1716,1717}; Line(1724) = {1715,1720};
+
+Line Loop(1701) = {1702,1703,1704,1701};   Plane Surface(1721) = {1701};
+Line Loop(1702) = {1707,1708,1705,1706};   Plane Surface(1722) = {1702};
+Line Loop(1703) = {1716,1713,1714,1715};   Plane Surface(1723) = {1703};
+Line Loop(1704) = {1720,1717,1718,1719};   Plane Surface(1724) = {1704};
+Line Loop(1705) = {1708,-1709,-1704,1712}; Ruled Surface(1725) = {1705};
+Line Loop(1706) = {1712,-1707,-1711,1703}; Ruled Surface(1726) = {1706};
+Line Loop(1707) = {-1711,-1702,1710,1706}; Ruled Surface(1727) = {1707};
+Line Loop(1708) = {-1710,-1701,1709,1705}; Ruled Surface(1728) = {1708};
+Line Loop(1709) = {1721,-1720,-1724,1716}; Ruled Surface(1729) = {1709};
+Line Loop(1710) = {-1724,-1715,1723,1719}; Ruled Surface(1730) = {1710};
+Line Loop(1711) = {1723,-1718,-1722,1714}; Ruled Surface(1731) = {1711};
+Line Loop(1712) = {1722,-1717,-1721,1713}; Ruled Surface(1732) = {1712};
+
+/* barreau 18 et 18' */
+
+Point(1801) = {d18,    e18,    -ll/2,    s18};  Point(1811) = {d18,     -e18,     ll/2,    s18}; 
+Point(1802) = {d18+r18, e18,    -ll/2,    s18};  Point(1812) = {d18+r18,  -e18,     ll/2,    s18}; 
+Point(1803) = {d18,    e18+r18, -ll/2,    s18};  Point(1813) = {d18,     -e18+r18,  ll/2,    s18}; 
+Point(1804) = {d18-r18, e18,    -ll/2,    s18};  Point(1814) = {d18-r18,  -e18,     ll/2,    s18}; 
+Point(1805) = {d18,    e18-r18, -ll/2,    s18};  Point(1815) = {d18,     -e18-r18,  ll/2,    s18}; 
+Point(1806) = {d18,    e18,    -ll/2-l18, s18l};  Point(1816) = {d18,     -e18,     ll/2+l18, s18l}; 
+Point(1807) = {d18+r18, e18,    -ll/2-l18, s18l};  Point(1817) = {d18+r18,  -e18,     ll/2+l18, s18l}; 
+Point(1808) = {d18,    e18+r18, -ll/2-l18, s18l};  Point(1818) = {d18,     -e18+r18,  ll/2+l18, s18l}; 
+Point(1809) = {d18-r18, e18,    -ll/2-l18, s18l};  Point(1819) = {d18-r18,  -e18,     ll/2+l18, s18l}; 
+Point(1810) = {d18,    e18-r18, -ll/2-l18, s18l};  Point(1820) = {d18,     -e18-r18,  ll/2+l18, s18l}; 
+
+Circle(1801) = {1802,1801,1803}; Circle(1805) = {1807,1806,1808}; Line(1809) = {1802,1807};
+Circle(1802) = {1803,1801,1804}; Circle(1806) = {1808,1806,1809}; Line(1810) = {1803,1808};
+Circle(1803) = {1804,1801,1805}; Circle(1807) = {1809,1806,1810}; Line(1811) = {1804,1809};
+Circle(1804) = {1805,1801,1802}; Circle(1808) = {1810,1806,1807}; Line(1812) = {1805,1810};
+       	       	     		    	    	    	       	       	   
+Circle(1813) = {1812,1811,1813}; Circle(1817) = {1817,1816,1818}; Line(1821) = {1812,1817};
+Circle(1814) = {1813,1811,1814}; Circle(1818) = {1818,1816,1819}; Line(1822) = {1813,1818};
+Circle(1815) = {1814,1811,1815}; Circle(1819) = {1819,1816,1820}; Line(1823) = {1814,1819};
+Circle(1816) = {1815,1811,1812}; Circle(1820) = {1820,1816,1817}; Line(1824) = {1815,1820};
+
+Line Loop(1801) = {1802,1803,1804,1801};   Plane Surface(1821) = {1801};
+Line Loop(1802) = {1807,1808,1805,1806};   Plane Surface(1822) = {1802};
+Line Loop(1803) = {1816,1813,1814,1815};   Plane Surface(1823) = {1803};
+Line Loop(1804) = {1820,1817,1818,1819};   Plane Surface(1824) = {1804};
+Line Loop(1805) = {1808,-1809,-1804,1812}; Ruled Surface(1825) = {1805};
+Line Loop(1806) = {1812,-1807,-1811,1803}; Ruled Surface(1826) = {1806};
+Line Loop(1807) = {-1811,-1802,1810,1806}; Ruled Surface(1827) = {1807};
+Line Loop(1808) = {-1810,-1801,1809,1805}; Ruled Surface(1828) = {1808};
+Line Loop(1809) = {1821,-1820,-1824,1816}; Ruled Surface(1829) = {1809};
+Line Loop(1810) = {-1824,-1815,1823,1819}; Ruled Surface(1830) = {1810};
+Line Loop(1811) = {1823,-1818,-1822,1814}; Ruled Surface(1831) = {1811};
+Line Loop(1812) = {1822,-1817,-1821,1813}; Ruled Surface(1832) = {1812};
+
+/* barreau 19 et 19' */
+
+Point(1901) = {d19,    -e19,    -ll/2,    s19};  Point(1911) = {d19,     e19,     ll/2,    s19}; 
+Point(1902) = {d19+r19, -e19,    -ll/2,    s19};  Point(1912) = {d19+r19,  e19,     ll/2,    s19}; 
+Point(1903) = {d19,    -e19+r19, -ll/2,    s19};  Point(1913) = {d19,     e19+r19,  ll/2,    s19}; 
+Point(1904) = {d19-r19, -e19,    -ll/2,    s19};  Point(1914) = {d19-r19,  e19,     ll/2,    s19}; 
+Point(1905) = {d19,    -e19-r19, -ll/2,    s19};  Point(1915) = {d19,     e19-r19,  ll/2,    s19}; 
+Point(1906) = {d19,    -e19,    -ll/2-l19, s19l};  Point(1916) = {d19,     e19,     ll/2+l19, s19l}; 
+Point(1907) = {d19+r19, -e19,    -ll/2-l19, s19l};  Point(1917) = {d19+r19,  e19,     ll/2+l19, s19l}; 
+Point(1908) = {d19,    -e19+r19, -ll/2-l19, s19l};  Point(1918) = {d19,     e19+r19,  ll/2+l19, s19l}; 
+Point(1909) = {d19-r19, -e19,    -ll/2-l19, s19l};  Point(1919) = {d19-r19,  e19,     ll/2+l19, s19l}; 
+Point(1910) = {d19,    -e19-r19, -ll/2-l19, s19l};  Point(1920) = {d19,     e19-r19,  ll/2+l19, s19l}; 
+
+Circle(1901) = {1902,1901,1903}; Circle(1905) = {1907,1906,1908}; Line(1909) = {1902,1907};
+Circle(1902) = {1903,1901,1904}; Circle(1906) = {1908,1906,1909}; Line(1910) = {1903,1908};
+Circle(1903) = {1904,1901,1905}; Circle(1907) = {1909,1906,1910}; Line(1911) = {1904,1909};
+Circle(1904) = {1905,1901,1902}; Circle(1908) = {1910,1906,1907}; Line(1912) = {1905,1910};
+       	       	     		    	    	    	       	       	   
+Circle(1913) = {1912,1911,1913}; Circle(1917) = {1917,1916,1918}; Line(1921) = {1912,1917};
+Circle(1914) = {1913,1911,1914}; Circle(1918) = {1918,1916,1919}; Line(1922) = {1913,1918};
+Circle(1915) = {1914,1911,1915}; Circle(1919) = {1919,1916,1920}; Line(1923) = {1914,1919};
+Circle(1916) = {1915,1911,1912}; Circle(1920) = {1920,1916,1917}; Line(1924) = {1915,1920};
+
+Line Loop(1901) = {1902,1903,1904,1901};   Plane Surface(1921) = {1901};
+Line Loop(1902) = {1907,1908,1905,1906};   Plane Surface(1922) = {1902};
+Line Loop(1903) = {1916,1913,1914,1915};   Plane Surface(1923) = {1903};
+Line Loop(1904) = {1920,1917,1918,1919};   Plane Surface(1924) = {1904};
+Line Loop(1905) = {1908,-1909,-1904,1912}; Ruled Surface(1925) = {1905};
+Line Loop(1906) = {1912,-1907,-1911,1903}; Ruled Surface(1926) = {1906};
+Line Loop(1907) = {-1911,-1902,1910,1906}; Ruled Surface(1927) = {1907};
+Line Loop(1908) = {-1910,-1901,1909,1905}; Ruled Surface(1928) = {1908};
+Line Loop(1909) = {1921,-1920,-1924,1916}; Ruled Surface(1929) = {1909};
+Line Loop(1910) = {-1924,-1915,1923,1919}; Ruled Surface(1930) = {1910};
+Line Loop(1911) = {1923,-1918,-1922,1914}; Ruled Surface(1931) = {1911};
+Line Loop(1912) = {1922,-1917,-1921,1913}; Ruled Surface(1932) = {1912};
+
+/* barreau 20 et 20' */
+
+Point(2001) = {d20,    e20,    -ll/2,    s20};  Point(2011) = {d20,     -e20,     ll/2,    s20}; 
+Point(2002) = {d20+r20, e20,    -ll/2,    s20};  Point(2012) = {d20+r20,  -e20,     ll/2,    s20}; 
+Point(2003) = {d20,    e20+r20, -ll/2,    s20};  Point(2013) = {d20,     -e20+r20,  ll/2,    s20}; 
+Point(2004) = {d20-r20, e20,    -ll/2,    s20};  Point(2014) = {d20-r20,  -e20,     ll/2,    s20}; 
+Point(2005) = {d20,    e20-r20, -ll/2,    s20};  Point(2015) = {d20,     -e20-r20,  ll/2,    s20}; 
+Point(2006) = {d20,    e20,    -ll/2-l20, s20l};  Point(2016) = {d20,     -e20,     ll/2+l20, s20l}; 
+Point(2007) = {d20+r20, e20,    -ll/2-l20, s20l};  Point(2017) = {d20+r20,  -e20,     ll/2+l20, s20l}; 
+Point(2008) = {d20,    e20+r20, -ll/2-l20, s20l};  Point(2018) = {d20,     -e20+r20,  ll/2+l20, s20l}; 
+Point(2009) = {d20-r20, e20,    -ll/2-l20, s20l};  Point(2019) = {d20-r20,  -e20,     ll/2+l20, s20l}; 
+Point(2010) = {d20,    e20-r20, -ll/2-l20, s20l};  Point(2020) = {d20,     -e20-r20,  ll/2+l20, s20l}; 
+
+Circle(2001) = {2002,2001,2003}; Circle(2005) = {2007,2006,2008}; Line(2009) = {2002,2007};
+Circle(2002) = {2003,2001,2004}; Circle(2006) = {2008,2006,2009}; Line(2010) = {2003,2008};
+Circle(2003) = {2004,2001,2005}; Circle(2007) = {2009,2006,2010}; Line(2011) = {2004,2009};
+Circle(2004) = {2005,2001,2002}; Circle(2008) = {2010,2006,2007}; Line(2012) = {2005,2010};
+       	       	     		    	    	    	       	       	   
+Circle(2013) = {2012,2011,2013}; Circle(2017) = {2017,2016,2018}; Line(2021) = {2012,2017};
+Circle(2014) = {2013,2011,2014}; Circle(2018) = {2018,2016,2019}; Line(2022) = {2013,2018};
+Circle(2015) = {2014,2011,2015}; Circle(2019) = {2019,2016,2020}; Line(2023) = {2014,2019};
+Circle(2016) = {2015,2011,2012}; Circle(2020) = {2020,2016,2017}; Line(2024) = {2015,2020};
+
+Line Loop(2001) = {2002,2003,2004,2001};   Plane Surface(2021) = {2001};
+Line Loop(2002) = {2007,2008,2005,2006};   Plane Surface(2022) = {2002};
+Line Loop(2003) = {2016,2013,2014,2015};   Plane Surface(2023) = {2003};
+Line Loop(2004) = {2020,2017,2018,2019};   Plane Surface(2024) = {2004};
+Line Loop(2005) = {2008,-2009,-2004,2012}; Ruled Surface(2025) = {2005};
+Line Loop(2006) = {2012,-2007,-2011,2003}; Ruled Surface(2026) = {2006};
+Line Loop(2007) = {-2011,-2002,2010,2006}; Ruled Surface(2027) = {2007};
+Line Loop(2008) = {-2010,-2001,2009,2005}; Ruled Surface(2028) = {2008};
+Line Loop(2009) = {2021,-2020,-2024,2016}; Ruled Surface(2029) = {2009};
+Line Loop(2010) = {-2024,-2015,2023,2019}; Ruled Surface(2030) = {2010};
+Line Loop(2011) = {2023,-2018,-2022,2014}; Ruled Surface(2031) = {2011};
+Line Loop(2012) = {2022,-2017,-2021,2013}; Ruled Surface(2032) = {2012};
+
+/* barreau 21 et 21' */
+
+Point(2101) = {d21,    -e21,    -ll/2,    s21};  Point(2111) = {d21,     e21,     ll/2,    s21}; 
+Point(2102) = {d21+r21, -e21,    -ll/2,    s21};  Point(2112) = {d21+r21,  e21,     ll/2,    s21}; 
+Point(2103) = {d21,    -e21+r21, -ll/2,    s21};  Point(2113) = {d21,     e21+r21,  ll/2,    s21}; 
+Point(2104) = {d21-r21, -e21,    -ll/2,    s21};  Point(2114) = {d21-r21,  e21,     ll/2,    s21}; 
+Point(2105) = {d21,    -e21-r21, -ll/2,    s21};  Point(2115) = {d21,     e21-r21,  ll/2,    s21}; 
+Point(2106) = {d21,    -e21,    -ll/2-l21, s21l};  Point(2116) = {d21,     e21,     ll/2+l21, s21l}; 
+Point(2107) = {d21+r21, -e21,    -ll/2-l21, s21l};  Point(2117) = {d21+r21,  e21,     ll/2+l21, s21l}; 
+Point(2108) = {d21,    -e21+r21, -ll/2-l21, s21l};  Point(2118) = {d21,     e21+r21,  ll/2+l21, s21l}; 
+Point(2109) = {d21-r21, -e21,    -ll/2-l21, s21l};  Point(2119) = {d21-r21,  e21,     ll/2+l21, s21l}; 
+Point(2110) = {d21,    -e21-r21, -ll/2-l21, s21l};  Point(2120) = {d21,     e21-r21,  ll/2+l21, s21l}; 
+
+Circle(2101) = {2102,2101,2103}; Circle(2105) = {2107,2106,2108}; Line(2109) = {2102,2107};
+Circle(2102) = {2103,2101,2104}; Circle(2106) = {2108,2106,2109}; Line(2110) = {2103,2108};
+Circle(2103) = {2104,2101,2105}; Circle(2107) = {2109,2106,2110}; Line(2111) = {2104,2109};
+Circle(2104) = {2105,2101,2102}; Circle(2108) = {2110,2106,2107}; Line(2112) = {2105,2110};
+       	       	     		    	    	    	       	       	   
+Circle(2113) = {2112,2111,2113}; Circle(2117) = {2117,2116,2118}; Line(2121) = {2112,2117};
+Circle(2114) = {2113,2111,2114}; Circle(2118) = {2118,2116,2119}; Line(2122) = {2113,2118};
+Circle(2115) = {2114,2111,2115}; Circle(2119) = {2119,2116,2120}; Line(2123) = {2114,2119};
+Circle(2116) = {2115,2111,2112}; Circle(2120) = {2120,2116,2117}; Line(2124) = {2115,2120};
+
+Line Loop(2101) = {2102,2103,2104,2101};   Plane Surface(2121) = {2101};
+Line Loop(2102) = {2107,2108,2105,2106};   Plane Surface(2122) = {2102};
+Line Loop(2103) = {2116,2113,2114,2115};   Plane Surface(2123) = {2103};
+Line Loop(2104) = {2120,2117,2118,2119};   Plane Surface(2124) = {2104};
+Line Loop(2105) = {2108,-2109,-2104,2112}; Ruled Surface(2125) = {2105};
+Line Loop(2106) = {2112,-2107,-2111,2103}; Ruled Surface(2126) = {2106};
+Line Loop(2107) = {-2111,-2102,2110,2106}; Ruled Surface(2127) = {2107};
+Line Loop(2108) = {-2110,-2101,2109,2105}; Ruled Surface(2128) = {2108};
+Line Loop(2109) = {2121,-2120,-2124,2116}; Ruled Surface(2129) = {2109};
+Line Loop(2110) = {-2124,-2115,2123,2119}; Ruled Surface(2130) = {2110};
+Line Loop(2111) = {2123,-2118,-2122,2114}; Ruled Surface(2131) = {2111};
+Line Loop(2112) = {2122,-2117,-2121,2113}; Ruled Surface(2132) = {2112};
+
+/* barreau 22 et 22' */
+
+Point(2201) = {d22,    e22,    -ll/2,    s22};  Point(2211) = {d22,     -e22,     ll/2,    s22}; 
+Point(2202) = {d22+r22, e22,    -ll/2,    s22};  Point(2212) = {d22+r22,  -e22,     ll/2,    s22}; 
+Point(2203) = {d22,    e22+r22, -ll/2,    s22};  Point(2213) = {d22,     -e22+r22,  ll/2,    s22}; 
+Point(2204) = {d22-r22, e22,    -ll/2,    s22};  Point(2214) = {d22-r22,  -e22,     ll/2,    s22}; 
+Point(2205) = {d22,    e22-r22, -ll/2,    s22};  Point(2215) = {d22,     -e22-r22,  ll/2,    s22}; 
+Point(2206) = {d22,    e22,    -ll/2-l22, s22l};  Point(2216) = {d22,     -e22,     ll/2+l22, s22l}; 
+Point(2207) = {d22+r22, e22,    -ll/2-l22, s22l};  Point(2217) = {d22+r22,  -e22,     ll/2+l22, s22l}; 
+Point(2208) = {d22,    e22+r22, -ll/2-l22, s22l};  Point(2218) = {d22,     -e22+r22,  ll/2+l22, s22l}; 
+Point(2209) = {d22-r22, e22,    -ll/2-l22, s22l};  Point(2219) = {d22-r22,  -e22,     ll/2+l22, s22l}; 
+Point(2210) = {d22,    e22-r22, -ll/2-l22, s22l};  Point(2220) = {d22,     -e22-r22,  ll/2+l22, s22l}; 
+
+Circle(2201) = {2202,2201,2203}; Circle(2205) = {2207,2206,2208}; Line(2209) = {2202,2207};
+Circle(2202) = {2203,2201,2204}; Circle(2206) = {2208,2206,2209}; Line(2210) = {2203,2208};
+Circle(2203) = {2204,2201,2205}; Circle(2207) = {2209,2206,2210}; Line(2211) = {2204,2209};
+Circle(2204) = {2205,2201,2202}; Circle(2208) = {2210,2206,2207}; Line(2212) = {2205,2210};
+       	       	     		    	    	    	       	       	   
+Circle(2213) = {2212,2211,2213}; Circle(2217) = {2217,2216,2218}; Line(2221) = {2212,2217};
+Circle(2214) = {2213,2211,2214}; Circle(2218) = {2218,2216,2219}; Line(2222) = {2213,2218};
+Circle(2215) = {2214,2211,2215}; Circle(2219) = {2219,2216,2220}; Line(2223) = {2214,2219};
+Circle(2216) = {2215,2211,2212}; Circle(2220) = {2220,2216,2217}; Line(2224) = {2215,2220};
+
+Line Loop(2201) = {2202,2203,2204,2201};   Plane Surface(2221) = {2201};
+Line Loop(2202) = {2207,2208,2205,2206};   Plane Surface(2222) = {2202};
+Line Loop(2203) = {2216,2213,2214,2215};   Plane Surface(2223) = {2203};
+Line Loop(2204) = {2220,2217,2218,2219};   Plane Surface(2224) = {2204};
+Line Loop(2205) = {2208,-2209,-2204,2212}; Ruled Surface(2225) = {2205};
+Line Loop(2206) = {2212,-2207,-2211,2203}; Ruled Surface(2226) = {2206};
+Line Loop(2207) = {-2211,-2202,2210,2206}; Ruled Surface(2227) = {2207};
+Line Loop(2208) = {-2210,-2201,2209,2205}; Ruled Surface(2228) = {2208};
+Line Loop(2209) = {2221,-2220,-2224,2216}; Ruled Surface(2229) = {2209};
+Line Loop(2210) = {-2224,-2215,2223,2219}; Ruled Surface(2230) = {2210};
+Line Loop(2211) = {2223,-2218,-2222,2214}; Ruled Surface(2231) = {2211};
+Line Loop(2212) = {2222,-2217,-2221,2213}; Ruled Surface(2232) = {2212};
+
+/* barreau x et x' */
+/*
+Point(x01) = {dx,    -e,    -ll/2,    sx};  Point(x11) = {dx,     e,     ll/2,    sx}; 
+Point(x02) = {dx+rx, -e,    -ll/2,    sx};  Point(x12) = {dx+rx,  e,     ll/2,    sx}; 
+Point(x03) = {dx,    -e+rx, -ll/2,    sx};  Point(x13) = {dx,     e+rx,  ll/2,    sx}; 
+Point(x04) = {dx-rx, -e,    -ll/2,    sx};  Point(x14) = {dx-rx,  e,     ll/2,    sx}; 
+Point(x05) = {dx,    -e-rx, -ll/2,    sx};  Point(x15) = {dx,     e-rx,  ll/2,    sx}; 
+Point(x06) = {dx,    -e,    -ll/2-lx, sx};  Point(x16) = {dx,     e,     ll/2+lx, sx}; 
+Point(x07) = {dx+rx, -e,    -ll/2-lx, sx};  Point(x17) = {dx+rx,  e,     ll/2+lx, sx}; 
+Point(x08) = {dx,    -e+rx, -ll/2-lx, sx};  Point(x18) = {dx,     e+rx,  ll/2+lx, sx}; 
+Point(x09) = {dx-rx, -e,    -ll/2-lx, sx};  Point(x19) = {dx-rx,  e,     ll/2+lx, sx}; 
+Point(x10) = {dx,    -e-rx, -ll/2-lx, sx};  Point(x20) = {dx,     e-rx,  ll/2+lx, sx}; 
+
+Circle(x01) = {x02,x01,x03}; Circle(x05) = {x07,x06,x08}; Line(x09) = {x02,x07};
+Circle(x02) = {x03,x01,x04}; Circle(x06) = {x08,x06,x09}; Line(x10) = {x03,x08};
+Circle(x03) = {x04,x01,x05}; Circle(x07) = {x09,x06,x10}; Line(x11) = {x04,x09};
+Circle(x04) = {x05,x01,x02}; Circle(x08) = {x10,x06,x07}; Line(x12) = {x05,x10};
+       	       	     		    	    	    	       	       	   
+Circle(x13) = {x12,x11,x13}; Circle(x17) = {x17,x16,x18}; Line(x21) = {x12,x17};
+Circle(x14) = {x13,x11,x14}; Circle(x18) = {x18,x16,x19}; Line(x22) = {x13,x18};
+Circle(x15) = {x14,x11,x15}; Circle(x19) = {x19,x16,x20}; Line(x23) = {x14,x19};
+Circle(x16) = {x15,x11,x12}; Circle(x20) = {x20,x16,x17}; Line(x24) = {x15,x20};
+
+Line Loop(x01) = {x02,x03,x04,x01};   Plane Surface(x21) = {x01};
+Line Loop(x02) = {x07,x08,x05,x06};   Plane Surface(x22) = {x02};
+Line Loop(x03) = {x16,x13,x14,x15};   Plane Surface(x23) = {x03};
+Line Loop(x04) = {x20,x17,x18,x19};   Plane Surface(x24) = {x04};
+Line Loop(x05) = {x08,-x09,-x04,x12}; Ruled Surface(x25) = {x05};
+Line Loop(x06) = {x12,-x07,-x11,x03}; Ruled Surface(x26) = {x06};
+Line Loop(x07) = {-x11,-x02,x10,x06}; Ruled Surface(x27) = {x07};
+Line Loop(x08) = {-x10,-x01,x09,x05}; Ruled Surface(x28) = {x08};
+Line Loop(x09) = {x21,-x20,-x24,x16}; Ruled Surface(x29) = {x09};
+Line Loop(x10) = {-x24,-x15,x23,x19}; Ruled Surface(x30) = {x10};
+Line Loop(x11) = {x23,-x18,-x22,x14}; Ruled Surface(x31) = {x11};
+Line Loop(x12) = {x22,-x17,-x21,x13}; Ruled Surface(x32) = {x12};
+*/
+
+/* surface longerons */
+Line Loop(3001) = {-13,-21,3,22};  Plane Surface(3101) = {3001}; /* ymax */
+Line Loop(3002) = {23,-11,-24,1};  Plane Surface(3102) = {3002}; /* ymax - eps */
+Line Loop(3003) = {-27,-7,26,17};  Plane Surface(3103) = {3003}; /* ymin + eps*/
+Line Loop(3004) = {25,-15,-28,5};  Plane Surface(3104) = {3004}; /* ymin */
+Line Loop(3005) = {3,4,1,2};       Plane Surface(3105) = {3005}; /* gauche haut */
+Line Loop(3006) = {7,8,5,6};       Plane Surface(3106) = {3006}; /* gauche bas */
+Line Loop(3007) = {11,12,13,14};   Plane Surface(3107) = {3007}; /* droite haut */
+Line Loop(3008) = {18,15,16,17};   Plane Surface(3108) = {3008}; /* droite bas */
+	   					  	
+Line Loop(3009) = {-23,-9,26,19};  Plane Surface(3109) = {3009}; /* bouchon proche */
+Line Loop(3010) = {24,-20,-27,10}; Plane Surface(3110) = {3010}; /* bouchon loin */
+	   					  	
+Line Loop(3011) = {-9,7,10,1};     Plane Surface(3111) = {3011}; /* input */
+Line Loop(3012) = {-11,-20,-17,19};Plane Surface(3112) = {3012}; /* output */
+
+Line Loop(3013) = {-26,-6,25,16};
+Line Loop(3014) = {-28,-8,27,18};
+Line Loop(3015) = {-21,-2,23,12};
+Line Loop(3016) = {-24,-4,22,14};
+Plane Surface(3113) = {3013,203,403,603,803,1003,1203,1403,1603,1803,2003,2203} ;
+Plane Surface(3114) = {3014,101,301,501,701,901,1101,1301,1501,1701,1901,2101};
+Plane Surface(3115) = {3015,103,303,503,703,903,1103,1303,1503,1703,1903,2103};
+Plane Surface(3116) = {3016,201,401,601,801,1001,1201,1401,1601,1801,2001,2201};
+
+/* surface boite interne */
+Line Loop(4001) = {61,75,76,53};   Plane Surface(4101) = {4001};
+Line Loop(4002) = {-54,-61,56,80}; Plane Surface(4102) = {4002};
+Line Loop(4003) = {62,63,-54,75};  Plane Surface(4103) = {4003};
+Line Loop(4004) = {-57,-62,76,64}; Plane Surface(4104) = {4004};
+Line Loop(4005) = {-72,-64,53,56}; Plane Surface(4105) = {4005};
+Line Loop(4006) = {80,-63,57,72};  Plane Surface(4106) = {4006};
+Line Loop(4007) = {-52,-51,76,69}; Plane Surface(4107) = {4007};
+Line Loop(4008) = {55,-62,51,78};  Plane Surface(4108) = {4008};
+Line Loop(4009) = {74,-78,52,73};  Plane Surface(4109) = {4009};
+Line Loop(4010) = {-81,-73,-69,64};Plane Surface(4110) = {4010};
+Line Loop(4011) = {-57,-55,-74,81};Plane Surface(4111) = {4011};
+Line Loop(4012) = {67,75,51,59};   Plane Surface(4112) = {4012};
+Line Loop(4013) = {-71,-54,-67,70};Plane Surface(4113) = {4013};
+Line Loop(4014) = {70,79,-78,59};  Plane Surface(4114) = {4014};
+Line Loop(4015) = {55,63,71,79};   Plane Surface(4115) = {4015};
+Line Loop(4016) = {61,-67,-68,77}; Plane Surface(4116) = {4016};
+Line Loop(4017) = {70,82,-65,68};  Plane Surface(4117) = {4017};
+Line Loop(4018) = {-58,-65,77,56}; Plane Surface(4118) = {4018};
+Line Loop(4019) = {80,71,82,58};   Plane Surface(4119) = {4019};
+Line Loop(4020) = {68,-59,52,60};  Plane Surface(4120) = {4020};
+Line Loop(4021) = {66,-73,60,65};  Plane Surface(4121) = {4021};
+Line Loop(4022) = {74,-79,82,66};  Plane Surface(4122) = {4022};
+Line Loop(4023) = {-77,-60,-69,53};Plane Surface(4123) = {4023};
+Line Loop(4024) = {-72,-81,-66,58};Plane Surface(4124) = {4024};
+
+/* volume bouchon */
+
+Surface Loop(4125) = {3103,-3110,-3102,-3109,3111,3112};
+Complex Volume(4126) = {4125}; 
+
+/* volume air */
+
+Surface Loop(4127) = {4123,4116,-4101,4112,4107,4120};
+Surface Loop(4128) = {2229,2232,2231,-2230,-3113,-3109,-3115,3101,3107,3112,-3110,-3116,-3105,3111,-3106,-3114,3104,3108,-127,126,-125,122,-128,-327,326,-325,322,-328,-527,526,-525,522,-528,-727,726,-725,722,-728,-927,926,-925,922,-928,-1127,1126,-1125,1122,-1128,-1327,1326,-1325,1322,-1328,-1527,1526,-1525,1522,-1528,-1727,1726,-1725,1722,-1728,-1927,1926,-1925,1922,-1928,-2127,2126,-2125,2122,-2128,-227,226,-225,222,-228,-427,426,-425,422,-428,-627,626,-625,622,-628,-827,826,-825,822,-828,-1027,1026,-1025,1022,-1028,-1227,1226,-1225,1222,-1228,-1427,1426,-1425,1422,-1428,-1627,1626,-1625,1622,-1628,-1827,1826,-1825,1822,-1828,-2027,2026,-2025,2022,-2028,-2227,2226,-2225,2222,-2228,129,132,131,-130,124,329,332,331,-330,324,529,532,531,-530,524,729,732,731,-730,724,929,932,931,-930,924,1129,1132,1131,-1130,1124,1329,1332,1331,-1330,1324,1529,1532,1531,-1530,1524,1729,1732,1731,-1730,1724,1929,1932,1931,-1930,1924,2129,2132,2131,-2130,2124,229,232,231,-230,224,429,432,431,-430,424,629,632,631,-630,624,829,832,831,-830,824,1029,1032,1031,-1030,1024,1229,1232,1231,-1230,1224,1429,1432,1431,-1430,1424,1629,1632,1631,-1630,1624,1829,1832,1831,-1830,1824,2029,2032,2031,-2030,2024,2224};
+Complex Volume(4129) = {4127,4128};
+
+/* volumes boite */
+
+Surface Loop(4130) = {4101,4102,-4103,-4104,-4106,-4105}; Complex Volume(4131) = {4130}; /* Zm */
+Surface Loop(4132) = {4113,4115,-4108,-4103,4112,-4114}; Complex Volume(4133) = {4132}; /* Xm */
+Surface Loop(4134) = {4110,4111,-4104,4108,4107,4109}; Complex Volume(4135) = {4134}; /* Ym */
+Surface Loop(4136) = {4118,4119,-4102,4113,-4116,-4117}; Complex Volume(4137) = {4136}; /* Yp */
+Surface Loop(4138) = {4105,-4124,4110,-4121,-4123,-4118}; Complex Volume(4139) = {4138}; /* Xp */
+Surface Loop(4140) = {4121,-4122,4109,-4114,4117,-4120}; Complex Volume(4141) = {4140}; /* Zp */
+
+/* Surface et volume boite externe */
+
+Line Loop(7021) = {-7013,-80,7019,7011};Plane Surface(7022) = {7021};
+Line Loop(7023) = {-7014,63,7013,7004};Plane Surface(7024) = {7023};
+Line Loop(7025) = {7020,7012,-7014,57};Plane Surface(7026) = {7025};
+Line Loop(7027) = {-7009,-7020,72,7019};Plane Surface(7028) = {7027};
+Line Loop(7029) = {-7012,7009,7011,7004};Plane Surface(7030) = {7029};
+Line Loop(7031) = {-7015,55,7014,7001};Plane Surface(7032) = {7031};
+Line Loop(7033) = {-7016,79,7015,7002};Plane Surface(7034) = {7033};
+Line Loop(7035) = {-7013,71,7016,7003};Plane Surface(7036) = {7035};
+Line Loop(7037) = {7003,7004,7001,7002};Plane Surface(7038) = {7037};
+Line Loop(7039) = {-7018,81,7020,7008};Plane Surface(7040) = {7039};
+Line Loop(7041) = {-7017,66,7018,7006};Plane Surface(7042) = {7041};
+Line Loop(7043) = {-7017,58,7019,7010};Plane Surface(7044) = {7043};
+Line Loop(7045) = {-7010,-7009,7008,7006};Plane Surface(7046) = {7045};
+Line Loop(7047) = {7007,-7016,82,7017};Plane Surface(7048) = {7047};
+Line Loop(7049) = {-7011,7010,7007,7003};Plane Surface(7050) = {7049};
+Line Loop(7051) = {7015,7005,-7018,74};Plane Surface(7052) = {7051};
+Line Loop(7053) = {7005,-7008,7012,7001};Plane Surface(7054) = {7053};
+Line Loop(7055) = {7007,-7002,7005,7006};Plane Surface(7056) = {7055};
+
+Surface Loop(7057) = {7036,7024,7032,7034,-4115,-7038}; Complex Volume(7058) = {7057}; /* XM */
+Surface Loop(7059) = {7046,7044,-7042,-4124,-7028,-7040}; Complex Volume(7060) = {7059}; /* XP */
+Surface Loop(7061) = {7054,-7052,-7032,-4111,-7026,7040}; Complex Volume(7062) = {7061}; /* YM */
+Surface Loop(7063) = {7036,-7022,-4119,7048,-7050,7044}; Complex Volume(7064) = {7063}; /* YP */
+Surface Loop(7065) = {4106,7022,7024,-7026,-7028,-7030}; Complex Volume(7066) = {7065}; /* ZM */
+Surface Loop(7067) = {4122,-7052,7034,-7048,7056,-7042}; Complex Volume(7068) = {7067}; /* ZP */
+
+/* physical entities */
+
+AIR       = 8001 ;
+XM        = 8002 ;
+XP        = 8003 ;
+YM        = 8004 ;
+YP        = 8005 ;
+ZM        = 8006 ;
+ZP        = 8007 ;
+
+CLINPUT   = 9001 ;
+CLBOX     = 9002 ;
+CLLONG    = 9003 ;
+CLBARREAU = 9004 ;
+CLBEM     = 9005 ;
+
+Physical Volume (AIR) = {4126,4129,   4131,4133,4135,4137,4139,4141};
+Physical Volume (XM) = {7058};
+Physical Volume (XP) = {7060};
+Physical Volume (YM) = {7062};
+Physical Volume (YP) = {7064};
+Physical Volume (ZM) = {7066};
+Physical Volume (ZP) = {7068};
+
+Physical Surface(CLINPUT) = {3111};
+Physical Surface(CLBEM) = {4119,4106,4115,4111,4122,4124};
+Physical Surface(CLBOX) = {7050,7030,7038,7054,7056,7046};
+Physical Surface(CLLONG) = {3102,3115,3101,3116,3105,3107,3103,3114,3104,3113,3108,3106};
+Physical Surface(CLBARREAU) = 
+{ 
+  122,125,126,127,128,
+  124,129,130,131,132,
+  222,225,226,227,228,
+  224,229,230,231,232,
+  322,325,326,327,328,
+  324,329,330,331,332,
+  422,425,426,427,428,
+  424,429,430,431,432,
+  522,525,526,527,528,
+  524,529,530,531,532,
+  622,625,626,627,628,
+  624,629,630,631,632,
+  722,725,726,727,728,
+  724,729,730,731,732,
+  822,825,826,827,828,
+  824,829,830,831,832,
+  922,925,926,927,928,
+  924,929,930,931,932,
+  1022,1025,1026,1027,1028,
+  1024,1029,1030,1031,1032,
+  1122,1125,1126,1127,1128,
+  1124,1129,1130,1131,1132,
+  1222,1225,1226,1227,1228,
+  1224,1229,1230,1231,1232,
+  1322,1325,1326,1327,1328,
+  1324,1329,1330,1331,1332,
+  1422,1425,1426,1427,1428,
+  1424,1429,1430,1431,1432,
+  1522,1525,1526,1527,1528,
+  1524,1529,1530,1531,1532,
+  1622,1625,1626,1627,1628,
+  1624,1629,1630,1631,1632,
+  1722,1725,1726,1727,1728,
+  1724,1729,1730,1731,1732,
+  1822,1825,1826,1827,1828,
+  1824,1829,1830,1831,1832,
+  1922,1925,1926,1927,1928,
+  1924,1929,1930,1931,1932,
+  2022,2025,2026,2027,2028,
+  2024,2029,2030,2031,2032,
+  2122,2125,2126,2127,2128,
+  2124,2129,2130,2131,2132,
+  2222,2225,2226,2227,2228,
+  2224,2229,2230,2231,2232 
+ };
+
diff --git a/benchmarks/bugs/p4a.geo b/benchmarks/bugs/p4a.geo
new file mode 100644
index 0000000000000000000000000000000000000000..4a2367a39702954582960f4f8f596b15f045fe16
--- /dev/null
+++ b/benchmarks/bugs/p4a.geo
@@ -0,0 +1,166 @@
+epecr  = 4.e-3 ;
+
+c      = 0.0 ; 
+lspire = 0.135 ;
+pspire = 0.4 ;
+lecr   = 0.3 ;
+pecr   = 0.5 ;
+hecr   = 0.2 - epecr/2. ;
+
+far   = 2. ;
+infty = 2.5 ;
+
+lc1 = 0.1; 
+lc2 = 0.1; 
+lc4 = 0.8;
+
+lc1 = 0.01; 
+lc2 = 0.05; 
+lc3 = 0.1; 
+lc4 = 0.5;
+
+
+
+Point(1) = {c,        c,        c, lc2};
+Point(2) = {c+lspire, c,        c, lc2};
+Point(3) = {c,        c+pspire, c, lc2};
+Point(4) = {c+lspire, c+pspire, c, lc2};
+
+Point(5) = {c+lecr,   c,        c, lc2};
+Point(6) = {c,        c+pecr,   c, lc2};
+Point(7) = {c+lecr,   c+pecr,   c, lc2};
+
+Point(8) = {c,        c,        c+hecr, lc2};
+Point(9) = {c+lecr,   c,        c+hecr, lc1};
+Point(10)= {c,        c+pecr,   c+hecr, lc1};
+Point(11)= {c+lecr,   c+pecr,   c+hecr, lc1};
+
+Point(12)= {c+far,    c,        c,     lc4};
+Point(13)= {c,        c+far,    c,     lc4};
+Point(14)= {c,        c,        c+far, lc3};
+Point(15)= {c,        c,        c-far, lc4};
+
+Point(16)= {c+infty,  c,        c,       lc4};
+Point(17)= {c,        c+infty,  c,       lc4};
+Point(18)= {c,        c,        c+infty, lc4};
+Point(19)= {c,        c,        c-infty, lc4};
+
+Line(1) = {2,4};
+Line(2) = {4,3};
+Line(3) = {1,2};
+Line(4) = {1,3};
+Line(5) = {2,5};
+Line(6) = {5,7};
+Line(7) = {7,6};
+Line(8) = {6,13};
+Line(9) = {5,12};
+Line(10) = {6,10};
+Line(11) = {10,11};
+Line(12) = {11,7};
+Line(13) = {10,8};
+Line(14) = {8,9};
+Line(15) = {9,11};
+Line(16) = {9,5};
+Line(17) = {1,8};
+Line(18) = {8,14};
+Line(19) = {14,18};
+Line(20) = {13,17};
+Line(21) = {12,16};
+Circle(22) = {12,1,13};
+Circle(23) = {16,1,17};
+Circle(24) = {12,1,14};
+Circle(25) = {16,1,18};
+Circle(26) = {13,1,14};
+Circle(27) = {17,1,18};
+Circle(28) = {15,1,13};
+Circle(29) = {19,1,17};
+Circle(30) = {12,1,15};
+Circle(31) = {16,1,19};
+Line(32) = {1,15};
+Line(33) = {15,19};
+Line(34) = {3,6};
+
+Line Loop(35) = {-2,-1,-3,4};
+Plane Surface(36) = {35};
+Line Loop(37) = {-7,-6,-5,1,2,34};
+Plane Surface(38) = {37};
+Line Loop(39) = {7,10,11,12};
+Plane Surface(40) = {39};
+Line Loop(41) = {12,-6,-16,15};
+Plane Surface(42) = {41};
+Line Loop(43) = {14,15,-11,13};
+Plane Surface(44) = {43};
+Line Loop(45) = {5,-16,-14,-17,3};
+Plane Surface(46) = {45};
+Line Loop(47) = {-17,4,34,10,13};
+Plane Surface(48) = {47};
+Line Loop(49) = {7,8,-22,-9,6};
+Plane Surface(50) = {49};
+Line Loop(51) = {20,-23,-21,22};
+Plane Surface(52) = {51};
+Line Loop(53) = {-8,-34,-4,32,28};
+Plane Surface(54) = {53};
+Line Loop(55) = {-20,-28,33,29};
+Plane Surface(56) = {55};
+Line Loop(57) = {5,9,30,-32,3};
+Plane Surface(58) = {57};
+Line Loop(59) = {19,-25,-21,24};
+Plane Surface(60) = {59};
+Line Loop(61) = {9,24,-18,14,16};
+Plane Surface(62) = {61};
+Line Loop(63) = {-18,-13,-10,8,26};
+Plane Surface(64) = {63};
+Line Loop(65) = {19,-27,-20,26};
+Plane Surface(66) = {65};
+Line Loop(67) = {33,-31,-21,30};
+Plane Surface(68) = {67};
+Line Loop(69) = {-28,-30,22};
+Ruled Surface(70) = {69};
+Line Loop(71) = {-29,-31,23};
+Ruled Surface(72) = {71};
+Line Loop(73) = {-24,22,26};
+Ruled Surface(74) = {73};
+Line Loop(75) = {-25,23,27};
+Ruled Surface(76) = {75};
+
+Surface Loop(77) = {48,-46,-38,-40,-44,42,-36};
+Complex Volume(78) = {77};
+Surface Loop(79) = {64,-62,-50,40,44,-42,-74};
+Complex Volume(80) = {79};
+Surface Loop(81) = {36,38,50,54,58,70};
+Complex Volume(82) = {81};
+Surface Loop(83) = {70,-56,-52,-72,68};
+Complex Volume(84) = {83};
+Surface Loop(85) = {52,66,-60,76,-74};
+Complex Volume(86) = {85};
+
+
+
+AirInterieur = 1111 ; 
+AirBas       = 1112 ; 
+AirHaut      = 1113 ; 
+AirInfini    = 1114 ;
+
+Spire  = 2222 ; 
+Ecran  = 3333 ; 
+dEcran = 3334 ;
+
+CLInf = 1100 ;
+
+
+
+Physical Line(dEcran) = {11,12,6, 14,16,13} ;
+
+Physical Surface(Spire) = 36 ;
+Physical Surface(Ecran) = {42,44} ;
+
+Physical Surface(CLInf) = {76,72} ;
+
+Physical Volume(AirInterieur) = 78;
+Physical Volume(AirBas) = 80;
+Physical Volume(AirHaut) = 82;
+
+Physical Volume(AirInfini) = {84,86};
+
+
+
diff --git a/bin/dbx_gmsh b/bin/dbx_gmsh
new file mode 100644
index 0000000000000000000000000000000000000000..e8918b33bccb4b0ee2f02da36419e1763ae20ebb
--- /dev/null
+++ b/bin/dbx_gmsh
@@ -0,0 +1,8 @@
+dbx /usr/users53/geuzaine/SOURCES/gmsh-nl/bin/gmsh \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshUnix \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshMesh \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGeo \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshDataStr \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshAdapt \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshParser \
+  -I/usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGL
diff --git a/bin/dxf2geo b/bin/dxf2geo
new file mode 100644
index 0000000000000000000000000000000000000000..575800852f2c8f325d694e49aa1f7627f21a5a58
Binary files /dev/null and b/bin/dxf2geo differ
diff --git a/bin/gdb_gmsh b/bin/gdb_gmsh
new file mode 100644
index 0000000000000000000000000000000000000000..bd665ca2273b089aad6c9977e62fd24cd09e8b35
--- /dev/null
+++ b/bin/gdb_gmsh
@@ -0,0 +1,8 @@
+gdb /usr/users53/geuzaine/SOURCES/gmsh-nl/bin/gmsh \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshUnix \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshMesh \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGeo \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshDataStr \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshAdapt \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshParser \
+  -d /usr/users53/geuzaine/SOURCES/gmsh-nl/GmshGL
diff --git a/bin/gdb_gmshm b/bin/gdb_gmshm
new file mode 100644
index 0000000000000000000000000000000000000000..f971c6781f778f244f8df9eb5711dd3065b631ac
--- /dev/null
+++ b/bin/gdb_gmshm
@@ -0,0 +1,9 @@
+
+gdb /home/geuzaine/SOURCES/gmsh-nl/bin/gmshm \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshUnix \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshMesh \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshGeo \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshDataStr \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshAdapt \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshParser \
+  --directory /home/geuzaine/SOURCES/gmsh-nl/GmshGL
diff --git a/demos/ex01.geo b/demos/ex01.geo
new file mode 100644
index 0000000000000000000000000000000000000000..4b69763ac7fac0fd7f4b34eece902bcfe597df78
--- /dev/null
+++ b/demos/ex01.geo
@@ -0,0 +1,141 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Trivial 2D example
+
+   All important comments are marked with "README"
+*/
+
+
+/* README: This defines a variable called lc. Note that you can use C
+   or C++ style comments in all Gmsh files. */
+
+lc = 0.007;
+
+/* README: This defines the point '1', located at x=0, y=0, z=0, with
+   an associated characteristic length 'lc'. The characteristic length
+   sets the target mesh size at the point. */
+
+Point(1) = {0,  0,  0, lc};
+
+// Other points
+
+Point(2) = {.1, 0,  0, lc};
+Point(3) = {.1, .3, 0, lc};
+Point(4) = {0,  .3, 0, lc};
+
+/* README: To define lines, simply give a pair of point numbers */
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {4,1};
+
+/* README: A line loop is defined as a list of lines (with signs) */
+
+Line Loop(5) = {4,1,2,3};
+
+/* README: A plane surface is defined as a list of line loops (only
+   one here) */
+
+Plane Surface(6) = {5};
+
+/* README: Now that all elementary entities are defined, we define the
+   physical entities, i.e. the composed entities whose meshes will be
+   saved in the output file */
+
+Physical Line(1111) = {1};
+Physical Line(2222) = {3};
+Physical Line(3333) = {2,4};
+Physical Surface(9999) = {6};
+
+/* README: You can also specify options in the file. For example, this
+   redefines the color of geometry points. See ex03.geo for a more
+   complete example. */
+
+Color{
+  Geometry{
+    Points = Orange;
+  }
+}
+
+/* README: You can merge files with File->Merge. This is most useful
+   for post-processing purposes. Try for example to merge view1.pos
+   together with this file.  Post-processing options are available by
+   right-clicking on the view button. You can also directly launch
+   Gmsh with several files as arguments on the command line. The first
+   will be 'opened', the others will be 'merged'. 
+
+   For example, try 'gmsh ex01.geo view01.pos view02.pos'. Two view
+   buttons will appear in the post-processing menu, respectively
+   labeled "a scalar map" and "a vector map". A left mouse click will
+   toggle the visibility of the particular view. A right mouse click
+   will give you access to the view's options:
+
+   - Remove: removes the view
+   - Duplicate: makes a formal copy of the view
+   - Lighting: activates/deactivates lighting for the view
+   - Scale: gives access to the scale menu (range definition, iso-value
+     choice, ...)
+   - Color: defines the colormap for the view
+   - Offset: permits to move the view around, and to make elevation 
+     maps
+   - Vector display: change vector attributes
+   - Time step: select the displayed time step
+   - Export as background mesh: exports the map, considered as an
+     error map, as a background mesh, i.e. as a characteristic length map
+   - Apply as current bg mesh: applies the view as the current background 
+     mesh.  
+
+   If you want modifications made to one view to affect also all 
+   other views, select the appropriate option in Options->Post-Processing
+*/
+
+
+/* README: The 'msh' file format is the native output file format for
+   Gmsh. The file is divided in several sections (enclosed in $KEY and
+   $ENDKEY pairs). Two fields are important: $NOD/$ENDNOD defines the
+   nodes and $ELM/$ENDELM defines the elements.
+
+   The syntax is as follows:
+
+   $NOD
+   number-of-nodes
+   node-number x-coord y-coord z-coord 
+   ...
+   $ENDNOD
+
+   $ELM
+   number-of-elements
+   elm-number elm-type elm-region unused number-of-nodes node-numbers
+   ...
+   $ENDELM
+
+   All the syntactic variables stand for integers except x-coord,
+   y-coord and z-coord which stand for floating point values.  The
+   elm-type value defines the geometrical type for the element:
+   
+   elm-type: 
+   
+   1 Line (2 nodes, 1 edge). 
+   2 Triangle (3 nodes, 3 edges). 
+   3 Quadrangle (4 nodes, 4 edges). 
+   4 Tetrahedron (4 nodes, 6 edges, 4 facets). 
+   5 Hexahedron (8 nodes, 12 edges, 6 facets). 
+   6 Prism (6 nodes, 9 edges, 5 facets). 
+   7 Pyramid (5 nodes, 8 edges, 5 facets). 
+   15 Point (1 node). 
+
+   The elm-region value is the number of the physical entity to which
+   the element belongs. 
+
+   The 'unv' is the universal file format standard. 
+*/
+
+/* README: The format of post-processing views is detailled in 'view01.pos' */
+
+
+
+
+
+
diff --git a/demos/ex02.geo b/demos/ex02.geo
new file mode 100644
index 0000000000000000000000000000000000000000..bf88a91f98aee0ea9b84a418e16fee0ff28f669b
--- /dev/null
+++ b/demos/ex02.geo
@@ -0,0 +1,77 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Trivial 3D example
+
+   All important comments are marked with "README"
+*/
+
+lcar1 = .1;
+lcar2 = .0005;
+
+Point(1) = {0.5,0.5,0.5,lcar2}; 
+Point(2) = {0.5,0.5,0,lcar1};
+Point(3) = {0,0.5,0.5,lcar1};
+Point(4) = {0,0,0.5,lcar1}; 
+Point(5) = {0.5,0,0.5,lcar1};
+Point(6) = {0.5,0,0,lcar1};
+Point(7) = {0,0.5,0,lcar1};
+Point(8) = {0,1,0,lcar1};
+Point(9) = {1,1,0,lcar1};
+Point(10) = {0,0,1,lcar1};
+Point(11) = {0,1,1,lcar1};
+Point(12) = {1,1,1,lcar1};
+Point(13) = {1,0,1,lcar1}; 
+Point(14) = {1,0,0,lcar1};
+
+Line(1) = {8,9};
+Line(2) = {9,12};
+Line(3) = {12,11};
+Line(4) = {11,8};
+Line(5) = {9,14};
+Line(6) = {14,13};
+Line(7) = {13,12};
+Line(8) = {11,10};
+Line(9) = {10,13};
+Line(10) = {10,4};
+Line(11) = {4,5};
+Line(12) = {5,6};
+Line(13) = {6,2};
+Line(14) = {2,1};
+Line(15) = {1,3};
+Line(16) = {3,7};
+Line(17) = {7,2};
+Line(18) = {3,4};
+Line(19) = {5,1};
+Line(20) = {7,8};
+Line(21) = {6,14};
+
+Line Loop(22) = {11,19,15,18};       Plane Surface(23) = {22};
+Line Loop(24) = {16,17,14,15};       Plane Surface(25) = {24};
+Line Loop(26) = {-17,20,1,5,-21,13}; Plane Surface(27) = {26};
+Line Loop(28) = {4,1,2,3};           Plane Surface(29) = {28};
+Line Loop(30) = {7,-2,5,6};          Plane Surface(31) = {30};
+Line Loop(32) = {6,-9,10,11,12,21};  Plane Surface(33) = {32};
+Line Loop(34) = {7,3,8,9};           Plane Surface(35) = {34};
+Line Loop(36) = {10,-18,16,20,-4,8}; Plane Surface(37) = {36};
+Line Loop(38) = {-14,-13,-12,19};    Plane Surface(39) = {38};
+
+/* README: In the same way one defines line loops to build surfaces,
+   one must define surface loops to build volumes. The following
+   volume is very simple, without holes (only one surface loop) */
+
+Surface Loop(40) = {35,31,29,37,33,23,39,25,27};
+Complex Volume(41) = {40};
+
+// Save volumic elements in region 1000
+
+Physical Volume (1000) = {41} ;
+
+// Save parts of the surface mesh in regions 2000 and 2001, e.g. to 
+// impose boundary conditions
+
+Physical Surface (2000) = {23,25,39} ;
+Physical Surface (2001) = {29,31,35} ;
+
+
+
diff --git a/demos/ex03.geo b/demos/ex03.geo
new file mode 100644
index 0000000000000000000000000000000000000000..29fb8d8e3cafdf5cf75974a5dfa1dd5d3cf69e67
--- /dev/null
+++ b/demos/ex03.geo
@@ -0,0 +1,224 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Simple 3D example
+
+   All important comments are marked with "README"
+*/
+
+// Definition of some variables
+
+dxCore  =  50.e-3 ;
+dyCore  =  50.e-3 ;
+dzCore  = 100.e-3 ;
+dxGap   =  25.e-3 ;
+
+xInd    =  75.e-3 ;
+dxInd   =  25.e-3 ;
+dzInd   =  50.e-3 ;
+
+xBox    = 200.e-3 ;
+
+s       = 2. ;
+p0      = 12.e-3 *s;
+pCorex  =  6.e-3 *s;
+pCorez0 =  10.e-3 *s;
+pCorez  =  6.e-3 *s;
+pInd0   = 6.e-3 *s;
+pInd1   = 5.e-3 *s;
+pBox    = xBox/6. *s;
+
+sqr2    = 2.^0.5 ;
+
+// Definition of points
+
+Point(1) = { 0, 0, 0, p0} ;
+Point(2) = { dxCore, 0, 0, pCorex} ;
+Point(3) = { xInd, 0, 0, pInd0} ;
+Point(4) = { xInd+dxInd, 0, 0, pInd0} ;
+Point(5) = { xBox, 0, 0, pBox} ;
+
+Point(6) = { dxCore, dyCore, 0, pCorex} ;
+Point(7) = { dxCore+dxGap/sqr2, dxCore+dxGap/sqr2, 0, pInd0} ;
+Point(8) = { dxCore+(dxGap+dxInd)/sqr2, dxCore+(dxGap+dxInd)/sqr2, 0, pInd0} ;
+Point(9) = { xBox, xBox, 0, pBox} ;
+
+Point(10) = { xInd, dyCore, 0, pInd0} ;
+Point(11) = { xInd+dxInd, dyCore, 0, pInd0} ;
+
+
+Point(101) = { 0, 0, dzCore, pCorez0} ;
+Point(102) = { dxCore, 0, dzCore, pCorez} ;
+Point(106) = { dxCore, dyCore, dzCore, pCorez} ;
+
+Point(103) = { xInd, 0, dzInd, pInd1} ;
+Point(104) = { xInd+dxInd, 0, dzInd, pInd1} ;
+Point(107) = { dxCore+dxGap/sqr2, dxCore+dxGap/sqr2, dzInd, pInd1} ;
+Point(108) = { dxCore+(dxGap+dxInd)/sqr2, dxCore+(dxGap+dxInd)/sqr2, dzInd, pInd1} ;
+Point(110) = { xInd, dyCore, dzInd, pInd1} ;
+Point(111) = { xInd+dxInd, dyCore, dzInd, pInd1} ;
+
+Point(116) = { dxCore, dyCore, dzInd, p0} ;
+
+Point(201) = { 0, 0, xBox, pBox} ;
+Point(205) = { xBox, 0, xBox, pBox} ;
+Point(209) = { xBox, xBox, xBox, pBox} ;
+
+// Definition of lines
+
+Line(1) = {1,2};  Line(2) = {2,3};   Line(3) = {3,4};
+Line(4) = {4,5};  Line(5) = {5,9};   Line(6) = {1,6};
+Line(7) = {6,7};  Line(8) = {7,8};   Line(9) = {8,9};
+Line(10) = {2,6}; Line(11) = {3,10}; Line(12) = {4,11};
+
+/* README: A circle is always defined counter-clockwise (i.e.
+   trigonometric), and specified by 3 points: starting,
+   center and end point. Note that these 3 points can not be
+   aligned and that the interior angle should be less than 180
+   degrees. */
+
+Circle(13) = {10,6,7}; Circle(14) = {11,6,8};
+
+// Some more lines and circles
+
+Line(15) = {101,102}; Line(16) = {102,106};  Line(17) = {101,106};
+Line(18) = {1,101};   Line(19) = {101,201};  Line(20) = {201,205};
+Line(21) = {201,209}; Line(22) = {205,209};  Line(23) = {103,104};
+Line(24) = {103,110}; Line(25) = {104,111};  Line(26) = {107,108};
+
+Circle(27) = {110,116,107};
+Circle(28) = {111,116,108};
+
+Line(29) = {2,102};   Line(30) = {6,106};    Line(31) = {3,103};
+Line(32) = {4,104};   Line(33) = {10,110};   Line(34) = {11,111};
+Line(35) = {7,107};   Line(36) = {8,108};    Line(37) = {5,205};
+Line(38) = {9,209};
+
+/* README: Definition of lines loops and plane surfaces. Note that
+   there are no internal loops in these surfaces (only one line loop
+   per surface) */
+
+Line Loop(39) = {-22,-37,5,38};         Plane Surface(40) = {39};
+Line Loop(41) = {-22,-20,21};           Plane Surface(42) = {41};
+Line Loop(43) = {-10,-1,6};             Plane Surface(44) = {43};
+Line Loop(45) = {7,-13,-11,-2,10};      Plane Surface(46) = {45};
+Line Loop(47) = {23,-32,-3,31};         Plane Surface(48) = {47};
+Line Loop(49) = {13,8,-14,-12,-3,11};   Plane Surface(50) = {49};
+Line Loop(51) = {14,9,-5,-4,12};        Plane Surface(52) = {51};
+Line Loop(53) = {-29,-1,18,15};         Plane Surface(54) = {53};
+Line Loop(55) = {17,-30,-6,18};         Plane Surface(56) = {55};
+Line Loop(57) = {-16,-29,10,30};        Plane Surface(58) = {57};
+Line Loop(59) = {-16,-15,17};           Plane Surface(60) = {59};
+Line Loop(61) = {-24,-31,11,33};        Plane Surface(62) = {61};
+Line Loop(63) = {-25,-32,12,34};        Plane Surface(64) = {63};
+Line Loop(65) = {26,-36,-8,35};         Plane Surface(66) = {65};
+Line Loop(67) = {27,26,-28,-25,-23,24}; Plane Surface(68) = {67};
+Line Loop(69) = {-23,-31,-2,29,-15,19,20,-37,-4,32};
+                                        Plane Surface(70) = {69};
+Line Loop(71) = {-26,-35,-7,30,-17,19,21,-38,-9,36};
+                                        Plane Surface(72) = {71};
+
+/* README: Definition of ruled surfaces. Ruled surfaces must have 3 or
+   4 borders (not more, not less). */
+
+Line Loop(73) = {-27,-33,13,35};
+Ruled Surface(74) = {73};
+
+Line Loop(75) = {-28,-34,14,36};
+Ruled Surface(76) = {75};
+
+// Definition of volumes
+
+Surface Loop(77) = {60,-58,54,-44,-56};
+Complex Volume(78) = {77};
+
+Surface Loop(79) = {64,-68,-74,-62,-48,50,66,76};
+Complex Volume(80) = {79};
+
+Surface Loop(81) = {64,-68,-74,-62,70,-46,-72,58,-60,42,-40,-52,76};
+Complex Volume(82) = {81};
+
+// Some definitions for saving the mesh
+
+Physical Volume (500) = {82} ;
+Physical Volume (501) = {78} ;
+Physical Volume (502) = {80} ;
+
+Physical Surface (1000) = {40,42} ;
+Physical Surface (1001) = {44,46,50,52} ;
+Physical Surface (1002) = {70,72,54,56,48,66} ;
+
+Physical Surface (602) = {68,74,62,76,64} ;
+Physical Surface (700) = {44,46} ;
+
+Physical Surface (710) = {48} ;
+Physical Surface (711) = {66} ;
+
+/* README: most visual parameters can be redefined. Post-processing
+   color definitions are made interactively (or loaded at startup in
+   an appropriate file, see the interactive help of the color
+   widget). GUI colors and fonts can be changed in a standard X
+   resource file (.gmshrc in your home directory). */
+
+Color{
+  General{
+    Background = {39, 64, 139} ;
+    Axes =  OrangeRed1; // Color names are the classical X11 names
+    SmallAxes = LightGray;
+    Text = Gray88 ;
+  }
+  Geometry{
+    Points = Yellow;
+    Lines = {255, 255, 255, 128} ; // semi-transparent white
+    Surfaces = {Orange, 60} ; // almost transparent orange
+    Volumes = Green ;
+    PointsSelect = White ;
+    LinesSelect = White ;
+    SurfacesSelect = White ;
+  }
+  Mesh{
+    Points = Black;
+    PointsSupp = Orchid;
+    Lines = Black;
+    // Color cycle for volume mesh
+    One = Gray10 ;
+    Two = Gray20 ;
+    Three = Gray30 ;
+    Four = Gray40 ;
+    Five = Gray50 ;
+    Six = Gray60 ;
+    Seven = Gray70 ;
+    Eight = Gray80 ;
+    Nine = Gray90 ;
+    Ten = Black ;
+  }
+
+}
+
+/* README: X resources can be specified in a '.gmshrc' in your home
+   directory or app-defaults directory, or in your .Xdefaults file.
+   Here are some default values for the 2 main windows:
+
+   ! Graphic window
+   gmshGW*geometry: 700x525+20+30
+   gmshGW*fontList: fixed
+   gmshGW*background: Grey65
+   gmshGW*borderColor: Grey65
+   gmshGW*foreground: Black
+   gmshGW*highlightColor: Grey66
+   
+   ! Menu window
+   gmshMW*geometry: x525+800+30
+   gmshMW*fontList: fixed
+   gmshMW*background: Grey65
+   gmshMW*borderColor: Grey65
+   gmshMW*foreground: Black
+   gmshMW*XmText*background: Grey75
+   gmshMW*XmText*foreground: Black
+   gmshMW*XmTextField*background: Grey75
+   gmshMW*XmList*background: Grey75
+   gmshMW*selectColor: Yellow
+   gmshMW*highlightColor: DarkOrchid 
+
+   Use 'editres' to get the full widget tree and associated resources.
+*/
diff --git a/demos/ex04.geo b/demos/ex04.geo
new file mode 100644
index 0000000000000000000000000000000000000000..fba0659be30a44a57ab6a28c6de9b6bef8318c2f
--- /dev/null
+++ b/demos/ex04.geo
@@ -0,0 +1,116 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   2D example with hole
+   
+   All important comments are marked with "README"
+*/
+
+unit = 1.0e-02 ;
+
+e1 =  4.5 * unit ;
+e2 =  6.0 * unit / 2.0 ;
+e3 =  5.0 * unit / 2.0 ;
+h1 =  5.0 * unit ;
+h2 = 10.0 * unit ;
+h3 =  5.0 * unit ;
+h4 =  2.0 * unit ;
+h5 =  4.5 * unit ;
+R1 =  1.0 * unit ;
+R2 =  1.5 * unit ;
+r  =  1.0 * unit ;
+ccos = (-h5*R1+e2* (h5*h5+e2*e2-R1*R1)^0.5) / (h5*h5+e2*e2) ;
+ssin = ( 1.0 - ccos*ccos )^0.5 ;
+
+Lc1 = 0.01 ;
+Lc2 = 0.003 ;
+
+Point(1) = { -e1-e2, 0.0  , 0.0 , Lc1};
+Point(2) = { -e1-e2, h1   , 0.0 , Lc1};
+Point(3) = { -e3-r , h1   , 0.0 , Lc2};
+Point(4) = { -e3-r , h1+r , 0.0 , Lc2};
+Point(5) = { -e3   , h1+r , 0.0 , Lc2};
+Point(6) = { -e3   , h1+h2, 0.0 , Lc1};
+Point(7) = {  e3   , h1+h2, 0.0 , Lc1};
+Point(8) = {  e3   , h1+r , 0.0 , Lc2};
+Point(9) = {  e3+r , h1+r , 0.0 , Lc2};
+Point(10)= {  e3+r , h1   , 0.0 , Lc2};
+Point(11)= {  e1+e2, h1   , 0.0 , Lc1};
+Point(12)= {  e1+e2, 0.0  , 0.0 , Lc1};
+Point(13)= {  e2   , 0.0  , 0.0 , Lc1};
+
+Point(14)= {  R1 / ssin , h5+R1*ccos, 0.0 , Lc2};
+Point(15)= {  0.0       , h5        , 0.0 , Lc2};
+Point(16)= { -R1 / ssin , h5+R1*ccos, 0.0 , Lc2};
+Point(17)= { -e2        , 0.0       , 0.0 , Lc1};
+
+Point(18)= { -R2  , h1+h3   , 0.0 , Lc2};
+Point(19)= { -R2  , h1+h3+h4, 0.0 , Lc2};
+Point(20)= {  0.0 , h1+h3+h4, 0.0 , Lc2};
+Point(21)= {  R2  , h1+h3+h4, 0.0 , Lc2};
+Point(22)= {  R2  , h1+h3   , 0.0 , Lc2};
+Point(23)= {  0.0 , h1+h3   , 0.0 , Lc2};
+
+Point(24)= {  0 , h1+h3+h4+R2, 0.0 , Lc2};
+Point(25)= {  0 , h1+h3-R2,    0.0 , Lc2};
+
+Line(1)  = {1 ,17};    /* ux=uy=0 */
+Line(2)  = {17,16};
+Circle(3) = {14,15,16};
+Line(4)  = {14,13};
+Line(5)  = {13,12};    /* ux=uy=0 */
+Line(6)  = {12,11};
+Line(7)  = {11,10};
+Circle(8) = { 8, 9,10};
+Line(9)  = { 8, 7};
+Line(10) = { 7, 6};    /* T=10000 N */
+Line(11) = { 6, 5};
+Circle(12) = { 3, 4, 5};
+Line(13) = { 3, 2};
+Line(14) = { 2, 1};
+
+Line(15) = {18,19};
+Circle(16) = {21,20,24};
+Circle(17) = {24,20,19};
+Circle(18) = {18,23,25};
+Circle(19) = {25,23,22};
+Line(20) = {21,22};
+
+Line Loop(21) = {17,-15,18,19,-20,16};
+Plane Surface(22) = {21};
+
+/* README: This surface is made of two line loops, i.e. has one hole */
+
+Line Loop(23) = {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10};
+Plane Surface(24) = {23,21};
+
+/* README: As a basic rule in Gmsh, everything that is defined is
+   meshed. So, if you don't want surface 22 to be meshed, just remove
+   its definition from this file. Note that the line loop 21 must be
+   left intact, since the surface 24 uses it.
+
+   Now, much more flexibility can be achieved using the "Physical
+   entities", which specify which parts of the mesh will be saved, and
+   which numbers will be associated with the corresponding groups of
+   elements. For example, if you want only the elements in surface 22
+   to be output in the mesh file, you only define a physical surface
+   that contains surface 22 : "Physical Surface (1000) = {22}". In
+   this case, even if both surfaces 22 and 24 are meshed, only
+   elements belonging to surface 22 will be saved in the mesh file.
+
+   Note that physical entities can do much more. They permit to
+   combine different elementary entities in one region : to affect the
+   same region number, let's say 2000, to all elements in surfaces 22
+   and 24, you could define "Physical Surface{2000} = {22,24}". They
+   also enable the definition of element orientations: to reverse the
+   orientation of the elements in 22 and 24, just define "Physical
+   Surface{2000} = {-22,-24}".
+*/
+
+/* README: To define physical surfaces interactively, you have to
+   select elementary surfaces by clicking on the dashed cross
+   representing them (the surfaces must be visible: select this option
+   in the Opt->Geometry->Visibility->Surfaces dialog box). You can of
+   course also define the physical surfaces directly in the 'geo'
+   file, which is often more efficient in 2D cases.
+*/
diff --git a/demos/ex05.geo b/demos/ex05.geo
new file mode 100644
index 0000000000000000000000000000000000000000..4e70ea3c6f2651a698e058e2f4e6848fddbe9960
--- /dev/null
+++ b/demos/ex05.geo
@@ -0,0 +1,198 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   More complex 2D example
+
+   All important comments are marked with "README"
+*/
+
+// All dimensions in meters and rads
+
+Lc = 0.0004 ;           // Base char length
+Z  = 0.0 ;              // Z-coord
+
+// Stator data
+
+nbs = 36 ;		// Num. of poles
+dths = 2 * Pi / nbs ;   // Ang. shift between 2 poles.
+
+// README: Pi is the only constant predefined in Gmsh
+
+th0s = dths / 2 ;       // Angular pos.
+des = 0.1529 ;          // Ext. diam.
+res = des / 2 ;		  
+dis = 0.09208 ;         // Int. diam.
+ris = dis / 2 ;		  
+			  
+hs = 0.0153 ;           // Pole height
+h1s = 0.000762 ;        // Dist. intersection rec.-int. circle
+d1s = 0.00636 ;         // Diam. sup. circle
+r1s = d1s / 2 ;		  
+rc1s = 0.00084 ;        // Radius convex rec.
+rc2s = 0.000508 ;       // Radius concave rec.
+e1s = 0.0025 ;          // Dist. between 2 sides at int diam
+e2s = 0.00424 ;         // Dist. between 2 sides at 1st rec.
+
+// Rotor data
+
+nbr = 32 ;		// Num. of poles
+dthr = 2 * Pi / nbr ;   // Angular shift betw. 2 poles
+			  
+th0r = dths / 2 ;       // Ang. pos. rotor
+gap = 0.00080 ;         // Air gap width
+espa = 0.0015 ;         // Dist. stator-pole top
+der = 0.09208 ;         // Ext. diam rotor
+rer = der / 2 ;		  
+dir = 0.03175 ;         // Diam. int. 
+rir = dir / 2 ;		  
+			  
+hr = 0.01425 ;          // Pole height
+d1r = 0.00426 ;         // Diam. sup circle
+r1r = d1r / 2 ;		  
+d2r = 0.00213 ;         // Diam. inf. circle
+r2r = d2r / 2 ;		  
+			  
+dist = rer - espa ;	// Radial dist. of intersect. point
+
+/* README: 'newp' is a meta variable defining a new point number for
+   you.  This is mostly useful with included files. There is also
+   'newreg' which defines a new region number (that is, everything
+   that is not a point). */
+
+pAxe = newp ; Point(pAxe) = { 0. , 0. , 0., 15*Lc} ;
+
+// axis
+
+p1 = newp ; Point(p1) = { rir, 0. , 0., 15*Lc} ;
+p2 = newp ; Point(p2) = { 0. , rir, 0., 15*Lc} ;
+
+lin1 = newreg ;	Line(lin1)   = {pAxe,p1} ;
+arc1 = newreg ;	Circle(arc1) = {p1,pAxe,p2} ;
+lin2 = newreg ;	Line(lin2)   = {p2, pAxe} ;
+
+reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,lin2} ;
+reg2 = newreg ; Plane Surface(reg2) = {reg1} ;
+
+// Rotor lateral sides
+
+p3 = newp ; Point(p3) = { rer-gap, 0.     , 0., Lc} ;
+p4 = newp ; Point(p4) = { 0.     , rer-gap, 0., Lc} ;
+
+lin3 = newreg ; Line(lin3)   = {p1, p3} ;
+arc2 = newreg ; Circle(arc2) = {p3,pAxe,p4} ;
+lin4 = newreg ;	Line(lin4)   = {p4, p2} ;
+
+// Air gap
+
+p5 = newp ; Point(p5) = { ris, 0. , 0., Lc} ;
+p6 = newp ; Point(p6) = { 0. , ris, 0., Lc} ;
+
+lin5 = newreg ; Line(lin5) = {p3, p5} ;
+lin6 = newreg ; Line(lin6) = {p6, p4} ;
+
+// Stator exterior
+
+p7 = newp ; Point(p7) = { res, 0. , 0. , 15*Lc } ;
+p8 = newp ; Point(p8) = { 0. , res, 0. , 15*Lc } ;
+
+lin7 = newreg ;	Line(lin7)   = {p5, p7} ;
+arc4 = newreg ;	Circle(arc4) = {p7,pAxe,p8} ;
+lin8 = newreg ;	Line(lin8)   = {p8, p6} ;
+
+PP1 = p5 ; PPB = p6 ; 
+
+// 8 rotor poles
+
+D1 = dist ; 
+H  = hr ; 
+R1 = r1r ; 
+R2 = r2r ; 
+
+/* README: You can include files with the 'Include' command. Note that
+   *ALL* variables in Gmsh are global. Including a file is similar to
+   paste its content where the include command is located. */
+
+i = 1 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ; 
+i  = 2 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i  = 3 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i  = 4 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i  = 5 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i = 6 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i = 7 ; th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+i = 8 ;	th = th0r + (i - 1) * dthr ;
+Include "ex05.i1" ;
+
+// 9 stator poles
+
+dth = dths ;
+D2  = ris ;
+H   = hs ;
+R1 = r1s ;
+R2 = rc1s ;
+R3 = rc2s ;
+E1 = e1s ;
+E2 = e2s ;
+H1 = h1s ;
+
+i = 1 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP2 = p1 ; PP3 = p9 ;
+i = 2 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP4 = p1 ; PP5 = p9 ;
+i = 3 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP6 = p1 ; PP7 = p9 ;
+i = 4 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP8 = p1 ; PP9 = p9 ;
+i = 5 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP10 = p1 ; PP11 = p9 ;
+i = 6 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ;
+PP12 = p1 ; PP13 = p9 ;
+i = 7 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP14 = p1 ; PP15 = p9 ;
+i = 8 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP16 = p1 ; PP17 = p9 ;
+i = 9 ; th = th0s + (i - 1) * dths ;
+Include "ex05.i2" ; 
+PP18 = p1 ; PP19 = p9 ;
+
+lin1 = newreg ; Line(lin1) = {PP1 , PP2 } ;
+lin1 = newreg ; Line(lin1) = {PP3 , PP4 } ;
+lin1 = newreg ; Line(lin1) = {PP5 , PP6 } ;
+lin1 = newreg ; Line(lin1) = {PP7 , PP8 } ;
+lin1 = newreg ; Line(lin1) = {PP9 , PP10} ;
+lin1 = newreg ; Line(lin1) = {PP11, PP12} ;
+lin1 = newreg ; Line(lin1) = {PP13, PP14} ;
+lin1 = newreg ; Line(lin1) = {PP15, PP16} ;
+lin1 = newreg ; Line(lin1) = {PP17, PP18} ;
+lin1 = newreg ; Line(lin1) = {PP19, PPB } ;
+
+
+Line Loop(145) = {8,-2,6,7};
+Plane Surface(146) = {145,68,61,54,47,40,33,26,19};
+
+Line Loop(147) = {-7,9,133,-74,134,-81,135,-88,136,-95,137,-102,138,-109,139,-116,140,-123,141,-130,142,10};
+Plane Surface(148) = {147};
+
+Line Loop(149) = {70,71,72,73,134,77,78,79,80,135,84,85,86,87,136,91,92,93,94,137,98,99,100,101,138,105,106,107,108,139,112,113,114,115,140,119,120,121,122,141,126,127,128,129,142,-13,-12,-11,133};
+Plane Surface(150) = {149};
+
+/* README: One should define physical regions to specify what to
+   save. Otherwise, only mesh points will be output in the mesh
+   file. */
+
+/*  Physical Surface(1000) = {.......} */
+
diff --git a/demos/ex05.i1 b/demos/ex05.i1
new file mode 100644
index 0000000000000000000000000000000000000000..8b872ec5d67ecd336482d57e19484f67f2a8e58c
--- /dev/null
+++ b/demos/ex05.i1
@@ -0,0 +1,60 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Rotor pole definition. Included by ex05.geo.
+
+   All important comments are marked with "README"
+*/
+
+/* README: Variables that must be defined when including this file:
+   th,D1,H,R1,R2,Lc */
+
+/* README: Besides the classical '-', '+', '*', '/' and '^' (power)
+   operators, Gmsh provides the following math functions: 'Sqrt',
+   'Sin', 'Cos','Tan', 'ArcSin', 'ArcCos', 'ArcTan', 'Log' */
+
+
+XC1 = (D1 - R1) * Cos(th) ;             // Sup. circle center
+YC1 = (D1 - R1) * Sin(th) ;
+XC2 = (D1 - H + R2) * Cos(th) ;		// Inf. circle center
+YC2 = (D1 - H + R2) * Sin(th) ;
+
+XS1 = (D1) * Cos(th) ;		        // Sup. circle top
+YS1 = (D1) * Sin(th) ;
+
+dth = Pi - ArcCos((R1 - R2) / (H - R1 - R2)) ;
+
+XA1 = XC1 + R1 * Cos(th - dth) ;	// Sup. right tangency point
+YA1 = YC1 + R1 * Sin(th - dth) ;
+XA2 = XC2 + R2 * Cos(th - dth) ;	// Inf. right tangency point
+YA2 = YC2 + R2 * Sin(th - dth) ;
+XB1 = XC1 + R1 * Cos(th + dth) ; 	// Sup. left tangency point
+YB1 = YC1 + R1 * Sin(th + dth) ;
+XB2 = XC2 + R2 * Cos(th + dth) ;	// Inf. left tangency point
+YB2 = YC2 + R2 * Sin(th + dth) ;
+
+// Pole
+
+/* README: 'newp' is a meta variable defining a new point number for
+   you.  This is mostly useful with included files. There is also
+   'newreg' which defines a new region number (that is, everything
+   that is not a point). */
+
+p1 = newp ; Point(p1) = { XA2 , YA2, 0., 3*Lc} ;
+p2 = newp ; Point(p2) = { XA1 , YA1, 0., Lc} ;
+p3 = newp ; Point(p3) = { XC1 , YC1, 0., Lc} ;
+p4 = newp ; Point(p4) = { XB1 , YB1, 0., Lc} ;
+p5 = newp ; Point(p5) = { XB2 , YB2, 0., 3*Lc} ;
+p6 = newp ; Point(p6) = { XC2 , YC2, 0., 3*Lc} ;
+
+p7 = newp ; Point(p7) = { XS1 , YS1, 0., Lc} ;
+
+lin1 = newreg ; Line(lin1)    = {p1,p2} ;
+arc1 = newreg ; Circle (arc1) = {p2,p3,p7} ;
+arc2 = newreg ; Circle (arc2) = {p7,p3,p4} ;
+lin2 = newreg ; Line(lin2)    = {p4,p5} ;
+arc3 = newreg ; Circle(arc3)  = {p5,p6,p1} ;
+
+reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,arc2,lin2,arc3};
+reg2 = newreg ; Plane Surface(reg2) = {reg1};
+
diff --git a/demos/ex05.i2 b/demos/ex05.i2
new file mode 100644
index 0000000000000000000000000000000000000000..9d2f68fc2f82829da4631d94b71ae2bdbf688a68
--- /dev/null
+++ b/demos/ex05.i2
@@ -0,0 +1,46 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Stator pole definition. Included by ex05.geo.
+
+   All important comments are marked with "README"
+*/
+
+/* README: Variables that must be defined when including this file:
+   th,D2,H,R1,E1 */
+
+dtH = ArcSin(E1/2./D2) ;
+XH6 = D2 * Cos(th + dtH ) ;            // Slab opening
+YH6 = D2 * Sin(th + dtH ) ;
+XH7 = D2 * Cos(th - dtH ) ;
+YH7 = D2 * Sin(th - dtH ) ;
+
+D1  = D2 + H ;
+XH2 = (D1 - R1) * Cos(th) ;	       // Circle center
+YH2 = (D1 - R1) * Sin(th) ;
+
+XS1 = (D1) * Cos(th) ;		       // Circle top
+YS1 = (D1) * Sin(th) ;
+
+XT1 = XH2 + R1 * Cos(th + Pi / 2.) ;
+YT1 = YH2 + R1 * Sin(th + Pi / 2.) ;
+XT2 = XH2 + R1 * Cos(th - Pi / 2.) ;
+YT2 = YH2 + R1 * Sin(th - Pi / 2.) ;
+
+p1 = newp ; Point(p1) = { XH7 , YH7, 0., Lc} ;
+p4 = newp ; Point(p4) = { XT2 , YT2, 0., 3*Lc} ;
+p5 = newp ; Point(p5) = { XH2 , YH2, 0., 3*Lc} ;
+p6 = newp ; Point(p6) = { XT1 , YT1, 0., 3*Lc} ;
+p9 = newp ; Point(p9) = { XH6 , YH6, 0., Lc} ;
+
+p10 = newp ; Point(p10) = { XS1 , YS1, 0., 3*Lc} ;
+
+lin1 = newreg ; Line(lin1) = {p1, p4} ;
+arc1 = newreg ; Circle(arc1) = {p4, p5, p10} ;
+arc2 = newreg ; Circle(arc2) = {p10, p5, p6} ;
+lin6 = newreg ; Line(lin6) = {p6, p9} ;
+
+lin7 = newreg ; Line(lin7) = {p9, p1} ;
+
+reg1 = newreg ; Line Loop(reg1) = {lin1,arc1,arc2,lin6,lin7} ;
+reg2 = newreg ; Plane Surface(reg2) = {reg1} ; 
diff --git a/demos/ex06.geo b/demos/ex06.geo
new file mode 100644
index 0000000000000000000000000000000000000000..49a8feac3c4663f5884b85c8b3de327c8ed847a0
--- /dev/null
+++ b/demos/ex06.geo
@@ -0,0 +1,235 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   2D and 3D transfinite meshes
+
+   All important comments are marked with "README"
+*/
+
+r_int  = 0.05 ;
+r_ext  = 0.051 ;
+r_far  = 0.125 ;
+r_inf  = 0.4 ;
+phi1   = 30. * (Pi/180.) ;
+angl   = 45. * (Pi/180.) ;
+
+
+nbpt_phi   = 5 ; nbpt_int   = 20 ;
+nbpt_arc1  = 10 ; nbpt_arc2  = 10 ;
+nbpt_shell = 10 ; nbpt_far   = 25 ; nbpt_inf = 15 ;
+
+lc0 = 0.1 ; lc1 = 0.1 ; lc2 = 0.3 ;
+
+Point(1) = {0,     0, 0, lc0} ;
+Point(2) = {r_int, 0, 0, lc0} ;
+Point(3) = {r_ext, 0, 0, lc1} ;
+Point(4) = {r_far, 0, 0, lc2} ;
+Point(5) = {r_inf, 0, 0, lc2} ;
+Point(6) = {0, 0,  r_int, lc0} ;
+Point(7) = {0, 0,  r_ext, lc1} ;
+Point(8) = {0, 0,  r_far, lc2} ;
+Point(9) = {0, 0,  r_inf, lc2} ;
+
+Point(10) = {r_int*Cos(phi1), r_int*Sin(phi1), 0, lc0} ;
+Point(11) = {r_ext*Cos(phi1), r_ext*Sin(phi1), 0, lc1} ;
+Point(12) = {r_far*Cos(phi1), r_far*Sin(phi1), 0, lc2} ;
+Point(13) = {r_inf*Cos(phi1), r_inf*Sin(phi1), 0, lc2} ;
+
+Point(14) = {r_int/2,           0,   0,               lc2} ;
+Point(15) = {r_int/2*Cos(phi1), r_int/2*Sin(phi1), 0, lc2} ;
+Point(16) = {r_int/2,           0,                 r_int/2, lc2} ;
+Point(17) = {r_int/2*Cos(phi1), r_int/2*Sin(phi1), r_int/2, lc2} ;
+Point(18) = {0, 0,  r_int/2, lc2} ;
+Point(19) = {r_int*Cos(angl),           0,                          r_int*Sin(angl), lc2} ;
+Point(20) = {r_int*Cos(angl)*Cos(phi1), r_int*Cos(angl)*Sin(phi1),  r_int*Sin(angl), lc2} ;
+Point(21) = {r_ext*Cos(angl),           0,                          r_ext*Sin(angl), lc2} ;
+Point(22) = {r_ext*Cos(angl)*Cos(phi1), r_ext*Cos(angl)*Sin(phi1),  r_ext*Sin(angl), lc2} ;
+Point(23) = {r_far*Cos(angl),           0,                          r_far*Sin(angl), lc2} ;
+Point(24) = {r_far*Cos(angl)*Cos(phi1), r_far*Cos(angl)*Sin(phi1),  r_far*Sin(angl), lc2} ;
+Point(25) = {r_inf,           0,                r_inf, lc2} ;
+Point(26) = {r_inf*Cos(phi1), r_inf*Sin(phi1),  r_inf, lc2} ;
+
+Circle(1) = {2,1,19};   Circle(2) = {19,1,6};   Circle(3) = {3,1,21};   Circle(4) = {21,1,7};
+Circle(5) = {4,1,23};   Circle(6) = {23,1,8};   Line(7) = {5,25};   Line(8) = {25,9};
+Circle(9) = {10,1,20};  Circle(10) = {20,1,6};  Circle(11) = {11,1,22}; Circle(12) = {22,1,7};
+Circle(13) = {12,1,24}; Circle(14) = {24,1,8};  Line(15) = {13,26}; Line(16) = {26,9};
+Circle(17) = {19,1,20}; Circle(18) = {21,1,22}; Circle(19) = {23,1,24}; Circle(20) = {25,1,26};
+Circle(21) = {2,1,10};  Circle(22) = {3,1,11};  Circle(23) = {4,1,12};  Circle(24) = {5,1,13};
+
+Line(25) = {1,14};  Line(26) = {14,2};  Line(27) = {2,3};   Line(28) = {3,4};
+Line(29) = {4,5};   Line(30) = {1,15};  Line(31) = {15,10}; Line(32) = {10,11};
+Line(33) = {11,12}; Line(34) = {12,13}; Line(35) = {14,15}; Line(36) = {14,16};
+Line(37) = {15,17}; Line(38) = {16,17}; Line(39) = {18,16}; Line(40) = {18,17};
+Line(41) = {1,18};  Line(42) = {18,6};  Line(43) = {6,7};   Line(44) = {16,19};
+Line(45) = {19,21}; Line(46) = {21,23}; Line(47) = {23,25}; Line(48) = {17,20};
+Line(49) = {20,22}; Line(50) = {22,24}; Line(51) = {24,26}; Line(52) = {7,8};
+Line(53) = {8,9};
+
+Line Loop(54) = {39,-36,-25,41}; Ruled Surface(55) = {54};
+Line Loop(56) = {44,-1,-26,36};  Ruled Surface(57) = {56};
+Line Loop(58) = {3,-45,-1,27};   Ruled Surface(59) = {58};
+Line Loop(60) = {5,-46,-3,28};   Ruled Surface(61) = {60};
+Line Loop(62) = {7,-47,-5,29};   Ruled Surface(63) = {62};
+Line Loop(64) = {-2,-44,-39,42}; Ruled Surface(65) = {64};
+Line Loop(66) = {-4,-45,2,43};   Ruled Surface(67) = {66};
+Line Loop(68) = {-6,-46,4,52};   Ruled Surface(69) = {68};
+Line Loop(70) = {-8,-47,6,53};   Ruled Surface(71) = {70};
+Line Loop(72) = {-40,-41,30,37}; Ruled Surface(73) = {72};
+Line Loop(74) = {48,-9,-31,37};  Ruled Surface(75) = {74};
+Line Loop(76) = {49,-11,-32,9};  Ruled Surface(77) = {76};
+Line Loop(78) = {-50,-11,33,13}; Ruled Surface(79) = {78};
+Line Loop(80) = {-51,-13,34,15}; Ruled Surface(81) = {80};
+Line Loop(82) = {10,-42,40,48};  Ruled Surface(83) = {82};
+Line Loop(84) = {12,-43,-10,49}; Ruled Surface(85) = {84};
+Line Loop(86) = {14,-52,-12,50}; Ruled Surface(87) = {86};
+Line Loop(88) = {16,-53,-14,51}; Ruled Surface(89) = {88};
+Line Loop(90) = {-30,25,35};     Ruled Surface(91) = {90};
+Line Loop(92) = {-40,39,38};     Ruled Surface(93) = {92};
+Line Loop(94) = {37,-38,-36,35}; Ruled Surface(95) = {94};
+Line Loop(96) = {-48,-38,44,17}; Ruled Surface(97) = {96};
+Line Loop(98) = {18,-49,-17,45}; Ruled Surface(99) = {98};
+Line Loop(100) = {19,-50,-18,46};Ruled Surface(101) = {100};
+Line Loop(102) = {20,-51,-19,47};Ruled Surface(103) = {102};
+Line Loop(104) = {-2,17,10};     Ruled Surface(105) = {104};
+Line Loop(106) = {-9,-21,1,17};  Ruled Surface(107) = {106};
+Line Loop(108) = {-4,18,12};     Ruled Surface(109) = {108};
+Line Loop(110) = {-11,-22,3,18}; Ruled Surface(111) = {110};
+Line Loop(112) = {-13,-23,5,19}; Ruled Surface(113) = {112};
+Line Loop(114) = {-6,19,14};     Ruled Surface(115) = {114};
+Line Loop(116) = {-15,-24,7,20}; Ruled Surface(117) = {116};
+Line Loop(118) = {-8,20,16};     Ruled Surface(119) = {118};
+Line Loop(120) = {-31,-35,26,21};Ruled Surface(121) = {120};
+Line Loop(122) = {32,-22,-27,21};Ruled Surface(123) = {122};
+Line Loop(124) = {33,-23,-28,22};Ruled Surface(125) = {124};
+Line Loop(126) = {34,-24,-29,23};Ruled Surface(127) = {126};
+
+Surface Loop(128) = {93,-73,-55,95,-91};        Complex Volume(129) = {128}; /* int */
+Surface Loop(130) = {107,-75,-97,95,57,121};    Complex Volume(131) = {130}; /* int b */
+Surface Loop(132) = {105,-65,-97,-83,-93};      Complex Volume(133) = {132}; /* int h */
+Surface Loop(134) = {99,-111,77,123,59,107};    Complex Volume(135) = {134}; /* shell b */
+Surface Loop(136) = {99,-109,67,105,85};        Complex Volume(137) = {136}; /* shell h */
+Surface Loop(138) = {113,79,-101,-111,-125,-61};Complex Volume(139) = {138}; /* ext b */
+Surface Loop(140) = {115,-69,-101,-87,-109};    Complex Volume(141) = {140}; /* ext h */
+Surface Loop(142) = {103,-117,-81,113,127,63};  Complex Volume(143) = {142}; /* inf b */
+Surface Loop(144) = {89,-119,71,103,115};       Complex Volume(145) = {144}; /* inf h */
+
+/* README: Tranfinite line commands explicitly specify the number of
+   points and their repartition. A minus sign in the argument list of
+   the transfinite command will produce the reversed mesh. */
+
+Transfinite Line{35,21,22,23,24,38,17,18,19,20}   = nbpt_phi Using Power 1.0;
+Transfinite Line{31,26,48,44,42}                  = nbpt_int Using Progression 0.95;
+Transfinite Line{41,37,36,9,11,1,3,13,5,15,7}     = nbpt_arc1 Using Power 1.0;
+Transfinite Line{30,25,40,39,10,2,12,4,14,6,16,8} = nbpt_arc2 Using Power 1.0;
+Transfinite Line{32,27,49,45,43}                  = nbpt_shell Using Power 1.0;
+Transfinite Line{33,28,46,50,52}                  = nbpt_far Using Progression 1.05 ;
+Transfinite Line{34,29,51,47,53}                  = nbpt_inf Using Progression 1.2;
+
+/* README: *All* 2D and 3D transfinite entities are defined in respect
+   to points. The ordering of the points defines the ordering of the
+   mesh elements. */
+
+Transfinite Surface{55} = {1,14,16,18};
+Transfinite Surface{57} = {14,2,19,16};
+Transfinite Surface{59} = {2,3,21,19};
+Transfinite Surface{61} = {3,4,23,21};
+Transfinite Surface{63} = {4,5,25,23};
+Transfinite Surface{73} = {1,15,17,18};
+Transfinite Surface{75} = {15,10,20,17};
+Transfinite Surface{77} = {10,11,22,20};
+Transfinite Surface{79} = {11,12,24,22};
+Transfinite Surface{81} = {12,13,26,24};
+Transfinite Surface{65} = {18,16,19,6};
+Transfinite Surface{67} = {6,19,21,7};
+Transfinite Surface{69} = {7,21,23,8};
+Transfinite Surface{71} = {8,23,25,9};
+Transfinite Surface{83} = {17,18,6,20};
+Transfinite Surface{85} = {20,6,7,22};
+Transfinite Surface{87} = {22,7,8,24};
+Transfinite Surface{89} = {24,8,9,26};
+Transfinite Surface{91} = {1,14,15};
+Transfinite Surface{95} = {15,14,16,17};
+Transfinite Surface{93} = {18,16,17};
+Transfinite Surface{121} = {15,14,2,10};
+Transfinite Surface{97} = {17,16,19,20};
+Transfinite Surface{123} = {10,2,3,11};
+Transfinite Surface{99} = {20,19,21,22};
+Transfinite Surface{107} = {10,2,19,20};
+Transfinite Surface{105} = {6,20,19};
+Transfinite Surface{109} = {7,22,21};
+Transfinite Surface{111} = {11,3,21,22};
+Transfinite Surface{101} = {22,21,23,24};
+Transfinite Surface{125} = {11,3,4,12};
+Transfinite Surface{115} = {8,24,23};
+Transfinite Surface{113} = {24,12,4,23};
+Transfinite Surface{127} = {12,13,5,4};
+Transfinite Surface{103} = {24,23,25,26};
+Transfinite Surface{119} = {9,26,25};
+Transfinite Surface{117} = {13,5,25,26};
+
+/* README: Recombine simplexes into quadrangles when possible */
+
+Recombine Surface {55 ... 127};
+
+/* README: *All* 2D and 3D transfinite entities are defined in respect
+   to points. The ordering of the points defines the ordering of the
+   mesh elements. */
+
+Transfinite Volume{129} = {1,14,15,18,16,17};
+Transfinite Volume{131} = {17,16,14,15,20,19,2,10};
+Transfinite Volume{133} = {18,17,16,6,20,19};
+Transfinite Volume{135} = {10,2,19,20,11,3,21,22};
+Transfinite Volume{137} = {6,20,19,7,22,21};
+Transfinite Volume{139} = {11,3,4,12,22,21,23,24};
+Transfinite Volume{141} = {7,22,21,8,24,23};
+Transfinite Volume{143} = {12,4,5,13,24,23,25,26};
+Transfinite Volume{145} = {8,24,23,9,26,25};
+
+VolInt           = 1000 ;
+SurfIntPhi0      = 1001 ;
+SurfIntPhi1      = 1002 ;
+SurfIntZ0        = 1003 ;
+
+VolShell         = 2000 ;
+SurfShellInt     = 2001 ;
+SurfShellExt     = 2002 ;
+SurfShellPhi0    = 2003 ;
+SurfShellPhi1    = 2004 ;
+SurfShellZ0      = 2005 ;
+LineShellIntPhi0 = 2006 ;
+LineShellIntPhi1 = 2007 ;
+LineShellIntZ0   = 2008 ;
+PointShellInt    = 2009 ;
+
+VolExt           = 3000 ;
+VolInf           = 3001 ;
+SurfInf          = 3002 ;
+SurfExtInfPhi0   = 3003 ;
+SurfExtInfPhi1   = 3004 ;
+SurfExtInfZ0     = 3005 ;
+SurfInfRight     = 3006 ;
+SurfInfTop       = 3007 ;
+
+Physical Volume  (VolInt)           = {129,131,133} ;
+Physical Surface (SurfIntPhi0)      = {55,57,65} ;
+Physical Surface (SurfIntPhi1)      = {73,75,83} ;
+Physical Surface (SurfIntZ0)        = {91,121} ;
+
+Physical Volume  (VolShell)         = {135,137} ;
+Physical Surface (SurfShellInt)     = {105,107} ;
+Physical Surface (SurfShellExt)     = {109,111} ;
+Physical Surface (SurfShellPhi0)    = {59,67} ;
+Physical Surface (SurfShellPhi1)    = {77,85} ;
+Physical Surface (SurfShellZ0)      = {123} ;
+Physical Line    (LineShellIntPhi0) = {1,2} ;
+Physical Line    (LineShellIntPhi1) = {9,10} ;
+Physical Line    (LineShellIntZ0)   = 21 ;
+Physical Point   (PointShellInt)    = 6 ;
+
+Physical Volume  (VolExt)           = {139,141} ;
+Physical Volume  (VolInf)           = {143,145} ;
+Physical Surface (SurfExtInfPhi0)   = {61,63,69,71} ;
+Physical Surface (SurfExtInfPhi1)   = {79,87,81,89} ;
+Physical Surface (SurfExtInfZ0)     = {125,127} ;
+Physical Surface (SurfInfRight)     = {117} ;
+Physical Surface (SurfInfTop)       = {119} ;
diff --git a/demos/ex07.geo b/demos/ex07.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0c06b0c7fdd30deab644db80d5cd5576a69339aa
--- /dev/null
+++ b/demos/ex07.geo
@@ -0,0 +1,485 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   3D example with (too) large characteristic lengths
+
+   All important comments are marked with "README"
+*/
+
+ech = 0.001 ;
+a = 8.0 ;
+b = 20.45 ;
+c = 45.55 ;
+d = 58.0 ;
+e = 66.0 ;
+f = 23.0 ;
+g = 20.0 ;
+h = 2.8 ;
+i = 8.0 ;
+k = 5.0 ;
+in = 1.0 ;
+did = 4.0 ;
+ded = 11.7 ;
+dame = 1.25 ;
+dtef = 4.0 ;
+
+sizereson = 1.5 ;
+sizeresoni = 1. ;
+sizebig = 4.0 ;
+sizeame = 1.0 ;
+sizetef = 1.0 ;
+
+a = a* ech ;
+b = b* ech ;
+c = c* ech ;
+d = d* ech ;
+e = e* ech ;
+f = f* ech ;
+g = g* ech ;
+h = h* ech ;
+i = i* ech ;
+k = k* ech ;
+j = f/2 ;
+in = in * ech ;
+did = did* ech ;
+ded = ded* ech ;
+dame = dame* ech ;
+dtef = dtef* ech ;
+
+rid = did/2.0 ;
+red = ded/2.0 ;
+rame=dame/2 ;
+rtef=dtef/2 ;
+
+
+sizereson = sizereson * ech ;
+sizeresoni = sizeresoni * ech ;
+sizebig = sizebig * ech ;
+sizeame = sizeame * ech ;
+sizetef = sizetef * ech ;
+
+/* box */
+
+Point(1) = {0,0,0,sizebig} ;
+Point(2) = {e,0,0,sizebig} ;
+Point(3) = {e,f,0,sizebig} ;
+Point(4) = {0,f,0,sizebig} ;
+Point(5) = {0,0,i,sizebig} ;
+Point(6) = {e,0,i,sizebig} ;
+Point(7) = {e,f,i,sizebig} ;
+Point(8) = {0,f,i,sizebig} ;
+Point(81) = {e/2,0,0,sizebig};
+
+/* left reson */
+
+Point(9) = {b,j,0,sizeresoni} ;
+Point(10) = {b+rid,j,0,sizeresoni} ;
+Point(11) = {b,j+rid,0,sizeresoni} ;
+Point(12) = {b-rid,j,0,sizeresoni} ;
+Point(13) = {b,j-rid,0,sizeresoni} ;
+Point(14) = {b+red,j,0,sizereson} ;
+Point(15) = {b,j+red,0,sizereson} ;
+Point(16) = {b-red,j,0,sizereson} ;
+Point(17) = {b,j-red,0,sizereson} ;
+
+Point(18) = {b,j,h,sizeresoni} ;
+Point(19) = {b+rid,j,h,sizeresoni} ;
+Point(20) = {b,j+rid,h,sizeresoni} ;
+Point(21) = {b-rid,j,h,sizeresoni} ;
+Point(22) = {b,j-rid,h,sizeresoni} ;
+Point(23) = {b+red,j,h,sizereson} ;
+Point(24) = {b,j+red,h,sizereson} ;
+Point(25) = {b-red,j,h,sizereson} ;
+Point(26) = {b,j-red,h,sizereson} ;
+
+/* right reson */
+
+Point(27) = {c,j,0,sizeresoni} ;
+Point(28) = {c+rid,j,0,sizeresoni} ;
+Point(29) = {c,j+rid,0,sizeresoni} ;
+Point(30) = {c-rid,j,0,sizeresoni} ;
+Point(31) = {c,j-rid,0,sizeresoni} ;
+Point(32) = {c+red,j,0,sizereson} ;
+Point(33) = {c,j+red,0,sizereson} ;
+Point(34) = {c-red,j,0,sizereson} ;
+Point(35) = {c,j-red,0,sizereson} ;
+
+Point(36) = {c,j,h,sizeresoni} ;
+Point(37) = {c+rid,j,h,sizeresoni} ;
+Point(38) = {c,j+rid,h,sizeresoni} ;
+Point(39) = {c-rid,j,h,sizeresoni} ;
+Point(40) = {c,j-rid,h,sizeresoni} ;
+Point(41) = {c+red,j,h,sizereson} ;
+Point(42) = {c,j+red,h,sizereson} ;
+Point(43) = {c-red,j,h,sizereson} ;
+Point(44) = {c,j-red,h,sizereson} ;
+
+/* left cab */
+
+Point(45) = {a,0,0,sizeame} ;
+Point(46) = {a,0,rame,sizeame} ;
+Point(47) = {a-rame,0,0,sizeame} ;
+Point(48) = {a+rame,0,0,sizeame} ;
+
+Point(49) = {a,-k,0,sizeame} ;
+Point(50) = {a,-k,rame,sizeame} ;
+Point(51) = {a-rame,-k,0,sizeame} ;
+Point(52) = {a+rame,-k,0,sizeame} ;
+
+Point(53) = {a,g,0,sizeame} ;
+Point(54) = {a,g,rame,sizeame} ;
+Point(55) = {a-rame,g,0,sizeame} ;
+Point(56) = {a+rame,g,0,sizeame} ;
+
+/* right cab */
+
+Point(57) = {d,0,0,sizeame} ;
+Point(58) = {d,0,rame,sizeame} ;
+Point(59) = {d-rame,0,0,sizeame} ;
+Point(60) = {d+rame,0,0,sizeame} ;
+
+Point(61) = {d,-k,0,sizeame} ;
+Point(62) = {d,-k,rame,sizeame} ;
+Point(63) = {d-rame,-k,0,sizeame} ;
+Point(64) = {d+rame,-k,0,sizeame} ;
+
+Point(65) = {d,g,0,sizeame} ;
+Point(66) = {d,g,rame,sizeame} ;
+Point(67) = {d-rame,g,0,sizeame} ;
+Point(68) = {d+rame,g,0,sizeame} ;
+
+/* left teflon */
+
+Point(69) = {a,0,rtef,sizetef} ;
+Point(70) = {a-rtef,0,0,sizetef} ;
+Point(71) = {a+rtef,0,0,sizetef} ;
+
+Point(72) = {a,-k,rtef,sizetef} ;
+Point(73) = {a-rtef,-k,0,sizetef} ;
+Point(74) = {a+rtef,-k,0,sizetef} ;
+
+
+/* right teflon */
+
+Point(75) = {d,0,rtef,sizetef} ;
+Point(76) = {d-rtef,0,0,sizetef} ;
+Point(77) = {d+rtef,0,0,sizetef} ;
+
+Point(78) = {d,-k,rtef,sizetef} ;
+Point(79) = {d-rtef,-k,0,sizetef} ;
+Point(80) = {d+rtef,-k,0,sizetef} ;
+
+/* in */
+
+
+Point(82) = {d,-k-in,rtef,sizetef} ;
+Point(83) = {d-rtef,-k-in,0,sizetef} ;
+Point(84) = {d+rtef,-k-in,0,sizetef} ;
+
+
+Point(85) = {d,-k-in,0,sizeame} ;
+Point(86) = {d,-k-in,rame,sizeame} ;
+Point(87) = {d-rame,-k-in,0,sizeame} ;
+Point(88) = {d+rame,-k-in,0,sizeame} ;
+
+
+/* eps teflon = 2.03
+   eps res = 38 */
+
+Circle(1) = {20,18,21};
+Circle(2) = {21,18,22};
+Circle(3) = {22,18,19};
+Circle(4) = {19,18,20};
+Circle(5) = {11,9,12};
+Circle(6) = {12,9,13};
+Circle(7) = {13,9,10};
+Circle(8) = {10,9,11};
+Circle(9) = {24,18,25};
+Circle(10) = {25,18,26};
+Circle(11) = {26,18,23};
+Circle(12) = {23,18,24};
+Circle(13) = {15,9,16};
+Circle(14) = {16,9,17};
+Circle(15) = {17,9,14};
+Circle(16) = {14,9,15};
+Circle(17) = {38,36,39};
+Circle(18) = {39,36,40};
+Circle(19) = {40,36,37};
+Circle(20) = {37,36,38};
+Circle(21) = {42,36,43};
+Circle(22) = {43,36,44};
+Circle(23) = {44,36,41};
+Circle(24) = {41,36,42};
+Circle(25) = {29,27,30};
+Circle(26) = {30,27,31};
+Circle(27) = {31,27,28};
+Circle(28) = {28,27,29};
+Circle(29) = {33,27,34};
+Circle(30) = {34,27,35};
+Circle(31) = {35,27,32};
+Circle(32) = {32,27,33};
+Line(33) = {8,7};
+Line(34) = {7,3};
+Line(35) = {8,4};
+Line(36) = {5,1};
+Line(37) = {6,2};
+Line(38) = {6,7};
+Line(39) = {5,8};
+Line(40) = {2,3};
+Line(41) = {1,4};
+Line(42) = {3,4};
+Line(43) = {6,5};
+Circle(44) = {66,65,67};
+Circle(45) = {68,65,66};
+Circle(46) = {54,53,55};
+Circle(47) = {56,53,54};
+Circle(48) = {50,49,51};
+Circle(49) = {52,49,50};
+Circle(50) = {72,49,73};
+Circle(51) = {74,49,72};
+Circle(52) = {48,45,46};
+Circle(53) = {46,45,47};
+Circle(54) = {69,45,70};
+Circle(55) = {71,45,69};
+Circle(56) = {62,61,63};
+Circle(57) = {64,61,62};
+Circle(58) = {80,61,78};
+Circle(59) = {78,61,79};
+Circle(60) = {60,57,58};
+Circle(61) = {58,57,59};
+Circle(62) = {77,57,75};
+Circle(63) = {75,57,76};
+Line(64) = {2,77};
+Line(65) = {77,60};
+Line(66) = {60,57};
+Line(67) = {57,59};
+Line(68) = {59,76};
+Line(70) = {71,48};
+Line(71) = {48,45};
+Line(72) = {45,47};
+Line(73) = {47,70};
+Line(74) = {70,1};
+Line(75) = {70,73};
+Line(76) = {47,51};
+Line(77) = {48,52};
+Line(78) = {71,74};
+Line(79) = {74,52};
+Line(80) = {52,49};
+Line(81) = {49,51};
+Line(82) = {51,73};
+Line(83) = {76,79};
+Line(84) = {59,63};
+Line(85) = {60,64};
+Line(86) = {77,80};
+Line(87) = {79,63};
+Line(88) = {63,61};
+Line(89) = {61,64};
+Line(90) = {64,80};
+Line(91) = {59,67};
+Line(92) = {60,68};
+Line(93) = {67,65};
+Line(94) = {65,68};
+Line(95) = {48,56};
+Line(96) = {47,55};
+Line(97) = {55,53};
+Line(98) = {53,56};
+Line Loop(99) = {11,12,9,10};
+Line Loop(100) = {4,1,2,3};
+Plane Surface(101) = {99,100};
+Line Loop(102) = {15,16,13,14};
+Line Loop(103) = {7,8,5,6};
+Plane Surface(104) = {102,103};
+Plane Surface(105) = {103};
+Plane Surface(106) = {100};
+Line Loop(107) = {31,32,29,30};
+Line Loop(108) = {27,28,25,26};
+Plane Surface(109) = {107,108};
+Line Loop(110) = {23,24,21,22};
+Line Loop(111) = {19,20,17,18};
+Plane Surface(112) = {110,111};
+Plane Surface(113) = {111};
+Plane Surface(114) = {108};
+Line(115) = {16,25};
+Line(116) = {15,24};
+Line(117) = {14,23};
+Line(118) = {17,26};
+Line(119) = {12,21};
+Line(120) = {11,20};
+Line(121) = {19,10};
+Line(122) = {22,13};
+Line(123) = {44,35};
+Line(124) = {41,32};
+Line(125) = {43,34};
+Line(126) = {42,33};
+Line(127) = {40,31};
+Line(128) = {37,28};
+Line(129) = {38,29};
+Line(130) = {39,30};
+
+Line Loop(131) = {31,-124,-23,123};
+Ruled Surface(132) = {131};
+Line Loop(133) = {30,-123,-22,125};
+Ruled Surface(134) = {133};
+Line Loop(135) = {29,-125,-21,126};
+Ruled Surface(136) = {135};
+Line Loop(137) = {32,-126,-24,124};
+Ruled Surface(138) = {137};
+Line Loop(139) = {11,-117,-15,118};
+Ruled Surface(140) = {139};
+Line Loop(141) = {10,-118,-14,115};
+Ruled Surface(142) = {141};
+Line Loop(143) = {9,-115,-13,116};
+Ruled Surface(144) = {143};
+Line Loop(145) = {-116,-16,117,12};
+Ruled Surface(146) = {145};
+Line Loop(147) = {-1,-120,5,119};
+Ruled Surface(148) = {147};
+Line Loop(149) = {-6,119,2,122};
+Ruled Surface(150) = {149};
+Line Loop(151) = {-7,-122,3,121};
+Ruled Surface(152) = {151};
+Line Loop(153) = {120,-4,121,8};
+Ruled Surface(154) = {153};
+Line Loop(155) = {27,-128,-19,127};
+Ruled Surface(156) = {155};
+Line Loop(157) = {-127,-18,130,26};
+Ruled Surface(158) = {157};
+Line Loop(159) = {130,-25,-129,17};
+Ruled Surface(160) = {159};
+Line Loop(161) = {28,-129,-20,128};
+Ruled Surface(162) = {161};
+Line(167) = {78,75};
+Line(168) = {62,58};
+Line(169) = {75,66};
+Line(170) = {58,66};
+Line Loop(171) = {-167,-58,-86,62};
+Ruled Surface(172) = {171};
+Line Loop(173) = {63,83,-59,167};
+Ruled Surface(174) = {173};
+Line Loop(175) = {84,-56,168,61};
+Ruled Surface(176) = {175};
+Line Loop(177) = {-168,-57,-85,60};
+Ruled Surface(178) = {177};
+Line Loop(179) = {-91,-61,170,44};
+Ruled Surface(180) = {179};
+Line Loop(181) = {170,-45,-92,60};
+Ruled Surface(182) = {181};
+Line Loop(183) = {-87,-59,-58,-90,57,56};
+Plane Surface(184) = {183};
+Line Loop(185) = {68,-63,-62,65,60,61};
+Plane Surface(186) = {185};
+Line Loop(187) = {93,94,45,44};
+Plane Surface(188) = {187};
+Line Loop(189) = {-87,-83,-68,84};
+Plane Surface(190) = {189};
+Line Loop(191) = {-90,-85,-65,86};
+Plane Surface(192) = {191};
+Line(195) = {72,69};
+Line(196) = {50,46};
+Line(197) = {46,54};
+Line Loop(198) = {96,-46,-197,53};
+Ruled Surface(199) = {198};
+Line Loop(200) = {197,-47,-95,52};
+Ruled Surface(201) = {200};
+Line Loop(202) = {75,-50,195,54};
+Ruled Surface(203) = {202};
+Line Loop(204) = {-195,-51,-78,55};
+Ruled Surface(205) = {204};
+Line Loop(206) = {49,196,-52,77};
+Ruled Surface(207) = {206};
+Line Loop(208) = {76,-48,196,53};
+Ruled Surface(209) = {208};
+Line Loop(210) = {48,82,-50,-51,79,49};
+Plane Surface(211) = {210};
+Line Loop(212) = {73,-54,-55,70,52,53};
+Plane Surface(213) = {212};
+Line Loop(214) = {-79,-78,70,77};
+Plane Surface(215) = {214};
+Line Loop(216) = {82,-75,-73,76};
+Plane Surface(217) = {216};
+Line Loop(218) = {97,98,47,46};
+Plane Surface(219) = {218};
+Line Loop(226) = {39,33,-38,43};
+Plane Surface(227) = {226};
+Line Loop(228) = {-35,33,34,42};
+Plane Surface(229) = {228};
+Line Loop(230) = {41,-35,-39,36};
+Plane Surface(231) = {230};
+Line Loop(232) = {-34,-38,37,40};
+Plane Surface(233) = {232};
+Line(234) = {76,81};
+Line(235) = {81,71};
+Line Loop(236) = {234,235,55,54,74,-36,-43,37,64,62,63};
+Plane Surface(237) = {236};
+Line Loop(238) = {92,-94,-93,-91,68,234,235,70,95,-98,-97,-96,73,74,41,-42,-40,64,65};
+Plane Surface(239) = {238,107,102};
+
+
+
+Surface Loop(601) = {152,104,140,-101,146,144,142,-154,-148,150};
+Complex Volume(602) = {601};
+Surface Loop(603) = {160,-158,-156,109,-132,-138,-136,-134,-112,-162};
+Complex Volume(604) = {603};
+Surface Loop(605) = {213,217,-211,-209,207,-215,205,203};
+Complex Volume(606) = {605};
+Surface Loop(607) = {186,190,-184,174,172,192,-178,-176};
+Complex Volume(608) = {607};
+
+
+Surface Loop(6001) = {213,-239,-182,180,186,237,231,-229,227,-233,-188,-201,-199,-219,132,138,136,134,112,156,-114,162,-160,158,-140,101,-146,-144,-142,154,148,-105,-152,-150};
+Complex Volume(6002) = {6001};
+
+Delete { Line(169); }
+
+Line(6003) = {83,87};
+Line(6004) = {87,85};
+Line(6005) = {85,88};
+Line(6006) = {88,84};
+Circle(6007) = {84,85,82};
+Circle(6008) = {82,85,83};
+Circle(6009) = {88,85,86};
+Circle(6010) = {86,85,87};
+Line(6011) = {83,79};
+Line(6012) = {87,63};
+Line(6013) = {88,64};
+Line(6014) = {84,80};
+Line(6015) = {82,78};
+Line(6016) = {86,62};
+Line Loop(6017) = {90,-6014,-6006,6013};
+Plane Surface(6018) = {6017};
+Line Loop(6019) = {87,-6012,-6003,6011};
+Plane Surface(6020) = {6019};
+Line Loop(6021) = {6010,-6003,-6008,-6007,-6006,6009};
+Plane Surface(6022) = {6021};
+Line Loop(6023) = {-58,-6014,6007,6015};
+Ruled Surface(6024) = {6023};
+Line Loop(6025) = {6011,-59,-6015,6008};
+Ruled Surface(6026) = {6025};
+Line Loop(6027) = {-57,-6013,6009,6016};
+Ruled Surface(6028) = {6027};
+Line Loop(6029) = {-56,-6016,6010,6012};
+Ruled Surface(6030) = {6029};
+Surface Loop(6031) = {184,6020,6030,6028,6018,-6024,-6022,-6026};
+Complex Volume(6032) = {6031};
+
+
+AIR = 10000 ;
+R1 = 20000 ;
+R2 = 30000 ;
+T1 = 40000 ;
+T2 = 50000 ;
+CLD0 = 60000 ;
+SOU  = 70000 ;
+CLTEM  = 80000 ;
+
+Physical Volume  (AIR)     = 6002;
+
+Physical Volume  (T1)      = 606;
+Physical Volume  (T2)      = 608;
+Physical Volume  (R1)      = 602;
+Physical Volume  (R2)      = 604;
+Physical Volume  (SOU)     = 6032;
+
+Physical Surface (CLD0) = {231,229,223,237,227,  199,201,219,209,207,203,205,  180,182,188,176,178,174,172  ,  6026,6024,6028,6030};
+Physical Surface (CLTEM) = {211,6022};
+
diff --git a/demos/ex08.geo b/demos/ex08.geo
new file mode 100644
index 0000000000000000000000000000000000000000..3d9bfe8e550a9839ccbaed33e1cef5f665215980
--- /dev/null
+++ b/demos/ex08.geo
@@ -0,0 +1,95 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   3D with extrusion
+
+   All important comments are marked with "README"
+*/
+
+lcp = 10;
+lci = 10;
+
+/* Plate */
+
+Point(1) = {0,0,0,lcp};
+Point(2) = {294,0,0,lcp};
+Point(3) = {294,294,0,lcp};
+Point(4) = {0,294,0,lcp};
+Point(5) = {18,18,0,lcp};
+Point(6) = {126,18,0,lcp};
+Point(7) = {126,126,0,lcp};
+Point(8) = {18,126,0,lcp};
+
+/* Inductor */
+
+Point(10) = {94,50,49,lci};
+Point(11) = {94,150,49,lci};
+Point(12) = {119,50,49,lci};
+Point(13) = {119,150,49,lci};
+Point(14) = {144,0,49,lci};
+Point(15) = {144,25,49,lci};
+Point(16) = {144,50,49,lci};
+Point(17) = {144,150,49,lci};
+Point(18) = {144,175,49,lci};
+Point(19) = {144,200,49,lci};
+Point(20) = {244,0,49,lci};
+Point(21) = {244,25,49,lci};
+Point(22) = {244,50,49,lci};
+Point(23) = {244,150,49,lci};
+Point(24) = {244,175,49,lci};
+Point(25) = {244,200,49,lci};
+Point(26) = {269,50,49,lci};
+Point(27) = {269,150,49,lci};
+Point(28) = {294,50,49,lci};
+Point(29) = {294,150,49,lci};
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {4,1};
+Line(5) = {5,6};
+Line(6) = {6,7};
+Line(7) = {7,8};
+Line(8) = {8,5};
+Line(9) = {14,20};
+Line(10) = {28,29};
+Line(11) = {25,19};
+Line(12) = {11,10};
+Line(13) = {15,21};
+Line(14) = {26,27};
+Line(15) = {24,18};
+Line(16) = {13,12};
+
+Circle(17) = {21,22,26} ;
+Circle(18) = {27,23,24} ;
+Circle(19) = {18,17,13} ;
+Circle(20) = {12,16,15} ;
+Circle(21) = {20,22,28} ;
+Circle(22) = {29,23,25} ;
+Circle(23) = {19,17,11} ;
+Circle(24) = {10,16,14} ;
+
+Line Loop(25) = {4,1,2,3};
+Line Loop(26) = {8,5,6,7};
+Plane Surface(27) = {25,26};
+Line Loop(28) = {23,12,24,9,21,10,22,11};
+Line Loop(29) = {19,16,20,13,17,14,18,15};
+Plane Surface(30) = {28,29};
+
+Extrude(27, {0,0,10});
+Coherence;
+Extrude(30, {0,0,100});
+Coherence;
+
+Surface Loop(133) = {65,39,-27,42,45,47,56,59,62,64};
+Complex Volume(134) = {133};
+Surface Loop(135) = {132,78,-30,81,84,87,90,93,96,98,111,114,117,120,123,126,129,131};
+Complex Volume(136) = {135};
+
+
+
+
+
+
+
+
diff --git a/demos/ex09.geo b/demos/ex09.geo
new file mode 100644
index 0000000000000000000000000000000000000000..fd16e9f8e275297e7b4191fd74afa94441fd9cfb
--- /dev/null
+++ b/demos/ex09.geo
@@ -0,0 +1,130 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   More complex 3D  with geometric transformations and extrusion
+
+   All important comments are marked with "README"
+*/
+
+r1 = .1;
+l1 = 1.;
+l2 = .8;
+l3 = .1;
+r2 = 1.1;
+lc = .08;
+lc2 = .05;
+rint = .2;
+rext = .3;
+Point(1) = {0.0,0.0,0.0,lc};
+Point(2) = {l1,0.0,0.0,lc2};
+Point(3) = {l1-r1,0.0,0.0,lc2};
+Point(4) = {l1,r1,0.0,lc2};
+Point(5) = {l1,-r1,0.0,lc2};
+Point(6) = {l1+l2,r1,0.0,lc};
+Point(7) = {l1+l2,-r1,0.0,lc};
+Point(8) = {l1+l2,-r1-l3,0.0,lc};
+Point(9) = {l1+l2,r1+l3,0.0,lc};
+
+Line(1) = {4,6};
+Line(2) = {6,9};
+Line(3) = {7,8};
+Line(4) = {5,7};
+Circle(5) = {4,2,3};
+Circle(6) = {3,2,5};
+
+r = 2*3.14159/5;
+Point(10) = { (l1 + r2) * Cos(r/2) , (l1 + r2) * Sin(r/2), 0.0, lc};
+
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},r) {
+  Duplicata {
+    Line(1); 
+    Line(2);
+    Line(3); 
+    Line(4); 
+    Line(5); 
+    Line(6); 
+    Point(10);  
+  }
+}
+
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},2*r) {
+  Duplicata {
+    Line(1); 
+    Line(2);
+    Line(3); 
+    Line(4); 
+    Line(5); 
+    Line(6); 
+    Point(10);  
+  }
+}
+
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},3*r) {
+  Duplicata {
+    Line(1); 
+    Line(2);
+    Line(3); 
+    Line(4); 
+    Line(5); 
+    Line(6); 
+    Point(10);  
+  }
+}
+
+
+Rotate({0.0,0.0,1.0},{0.0,0.0,0.0},4*r) {
+  Duplicata {
+    Line(1); 
+    Line(2);
+    Line(3); 
+    Line(4); 
+    Line(5); 
+    Line(6); 
+    Point(10);  
+  }
+}
+
+Coherence;
+
+Circle(31) = {16,10,9};
+Circle(32) = {31,25,14};
+Circle(33) = {46,40,29};
+Circle(34) = {61,55,44};
+Circle(35) = {8,70,59};
+Point(newp) = {rint,0,0,lc};
+Point(newp) = {rext,0,0,lc};
+Point(newp) = {-rint,0,0,lc};
+Point(newp) = {-rext,0,0,lc};
+Point(newp) = {0,rint,0,lc};
+Point(newp) = {0,rext,0,lc};
+Point(newp) = {0,-rint,0,lc};
+Point(newp) = {0,-rext,0,lc};
+Circle(36) = {75,1,73};
+Circle(37) = {73,1,77};
+Circle(38) = {77,1,71};
+Circle(39) = {71,1,75};
+Circle(40) = {76,1,74};
+Circle(41) = {74,1,78};
+Circle(42) = {78,1,72};
+Circle(43) = {72,1,76};
+
+Line Loop(44) = {-8,-7,11,12,10,9,31,-2,-1,5,6,4,3,35,-26,-25,29,30,28,27,34,-20,-19,23,24,22,21,33,-14,-13,17,18,16,15,32};
+Line Loop(45) = {40,41,42,43};
+Plane Surface(46) = {44,45};
+Line Loop(47) = {36,37,38,39};
+Plane Surface(48) = {45,47};
+
+Extrude(46, {0,0,.2});
+Coherence;
+Extrude(48, {0,0,.2});
+Coherence;
+Extrude(238, {0,0,.2});
+Coherence;
+
+Surface Loop(274) = {235,-48,46,88,-189,-207,91,-94,-97,-100,-103,-106,109,112,-115,-118,-121,-124,-127,130,133,-136,-139,-142,-145,-148,151,154,-157,-160,-163,-166,-169,172,175,-178,-181,-184,-187,247,250,253,255,273,264,229,232,267,270,272,237};
+Complex Volume(275) = {274};
+
+Physical Volume(1000) = 275;
+
+
+
diff --git a/demos/ex10.geo b/demos/ex10.geo
new file mode 100644
index 0000000000000000000000000000000000000000..fd65390d5df3d3abc22e6df16bd400ed26f21eba
--- /dev/null
+++ b/demos/ex10.geo
@@ -0,0 +1,139 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   3D with extrusion
+
+   All important comments are marked with "README"
+*/
+
+fact     = 0.4 ;
+rondelle = fact * 0.01;
+iris     = fact * 0.004;
+size     = fact * 0.01;
+
+larg = 86.36e-3 / 2.0 ;
+long = 45.0e-3 ;
+l    = 16.e-3 / 2.0 ;
+re   = 90.e-3 / 2.0 ;
+re2  = re + 3.e-3 ;
+ri   = 8.e-3 / 2.0 ;
+ll   = 60.0e-3 / 2.0;
+a    = larg - ll;
+c45  = 0.5^0.5  ;
+
+hg   = 21.59e-3 ;
+hcav = 42.5e-3 ;
+
+x2   = long;
+y1   = ri * c45;
+y2   = ri ;
+y3   = l ;
+ss1  = l / re ;
+xtemp = re * ( ( 1.0 - ss1 * ss1 ) ^ 0.5 ) ;
+ss2  = ( 1.0 - ( xtemp / re2 ) * ( xtemp / re2 ) ) ^ 0.5 ;
+y4   = ss2 * xtemp ;
+ss3  = ll / re2;
+xtemp2 = re2 *  ( ( 1.0 - ss3 * ss3 ) ^ 0.5 ) ;
+x1   = long - ( xtemp - xtemp2 ) ;
+x6   = x1 + xtemp ;
+x3   = x6 - re * c45 ;
+x4   = x6 - ri ;
+x5   = x6 - ri * c45 ;
+x7   = x6 + ri * c45 ;
+x8   = x6 + ri ;
+x9   = x6 + re * c45 ;
+x10  = x6 + re ;
+y5   = ll ;
+y6   = re * c45 ;
+y7   = re ;
+y8   = larg ;
+
+
+Point(1) = {0.0,0.0,0.0,size};
+Point(2) = {0.0,y8,0.0,size};
+Point(3) = {x2,y8,0.0,size};
+Point(4) = {x2,y5,0.0,size};
+Point(5) = {x1,y4,0.0,size};
+Point(6) = {x1,y3,0.0,iris};
+Point(7) = {x1,0.0,0.0,iris};
+Point(8) = {x3,y6,0.0,size};
+Point(9) = {x6,y7,0.0,size};
+Point(10) = {x9,y6,0.0,size};
+Point(11) = {x10,0.0,0.0,size};
+Point(12) = {x8,0.0,0.0,rondelle};
+Point(13) = {x6,0.0,0.0,rondelle};
+Point(14) = {x4,0.0,0.0,rondelle};
+Point(15) = {x7,y1,0.0,rondelle};
+Point(16) = {x6,y2,0.0,rondelle};
+Point(17) = {x5,y1,0.0,rondelle};
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {5,6};
+Line(5) = {1,7};
+Line(6) = {7,14};
+Line(10) = {6,7};
+Line(11) = {14,13};
+Line(12) = {13,12};
+Circle(16) = {11,13,10};
+Circle(17) = {10,13,9};
+Circle(18) = {9,13,8};
+Circle(19) = {8,13,6};
+Circle(20) = {4,13,5};
+Line(21) = {11,12};
+Circle(22) = {17,13,14};
+Circle(23) = {16,13,17};
+Circle(24) = {15,13,16};
+Circle(25) = {12,13,15};
+
+Line Loop(26) = {-5,1,2,3,20,4,10};
+Plane Surface(27) = {26};
+
+Line Loop(28) = {-6,-10,-19,-18,-17,-16,21,25,24,23,22};
+Plane Surface(29) = {28};
+
+Line Loop(30) = {11,12,25,24,23,22};
+Plane Surface(31) = {30};
+
+Extrude(27, {0,0,hg} );
+Coherence;
+
+Extrude(29, {0,0,hg} );
+Coherence;
+
+Extrude(31, {0,0,hg} );
+Coherence;
+
+Surface Loop(127) = {60,-27,-43,61,46,49,52,55,58};
+Complex Volume(128) = {127};
+
+Extrude (105, {0,0,hcav-hg} );
+Coherence;
+
+Extrude (126, {0,0,hcav-hg} );
+Coherence;
+
+Characteristic Length {58,71} = 0.01; 
+
+Surface Loop(196) = {31,-115,-117,-96,-99,-102,-104,-173,-184,-186,-165,-168,-171,-195};
+Complex Volume(197) = {196};
+
+Surface Loop(198) = {93,-29,-76,104,173,-144,174,-147,-60,-81,-150,-153,-84,-87,-156,-159,-90,162,165,96,99,102,171,168};
+
+Complex Volume(199) = {198};
+
+GO      = 1 ;
+CAV     = 2 ;
+DIS     = 3 ; 
+CLDSRC  = 4 ;
+CLD     = 5 ;
+
+Physical Volume (GO)     = 128;
+Physical Volume (CAV)    = 199;
+Physical Volume (DIS)    = 197;
+Physical Volume (CLDSRC) = 46;
+Physical Volume (CLD)    = {61,49,27,52,55,58,81,150,147,84,153,87,156,90,159,29,31,174,195};
+
+
+Point(85) = {0.0,0.0,0.0,1.0};
diff --git a/demos/ex11.geo b/demos/ex11.geo
new file mode 100644
index 0000000000000000000000000000000000000000..a8a4829524989ea806d7082983728dec68ec8d95
--- /dev/null
+++ b/demos/ex11.geo
@@ -0,0 +1,257 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   3D with extrusion
+
+   All important comments are marked with "README"
+*/
+
+/*
+         c8
+         +---------------------+ c7
+         |                 c4  |
+         |   +-------------+   |
+         |   | c3          +---+
+         +---+             c5  c6   
+         c1  c2
+
+*/
+
+D1 = .05;
+D2 = .15;
+D3 = .01;
+D4 = .03;
+D5 = .05;
+D6 = .025;
+
+ax  = 3.2;
+ay  = 3.2;
+az  = 3.2;
+Dy = ax * D1;
+Dz = ay * D2;
+Dx = az * D5;
+
+e  = 2*.001;
+
+l = .008;
+lbox = 2.*ax*l;
+
+c1=newp;
+Point(c1) = {0,0,0,l};
+c2=newp;
+Point(c2) = {0,D1,0,l};
+c3=newp;
+Point(c3) = {0,D1,D2,l};
+c4=newp;
+Point(c4) = {0,D3,D2,l};
+c5=newp;
+Point(c5) = {0,D3,D2-D4,l};
+c6=newp;
+Point(c6) = {0,D1-D4,D2-D4,l};
+c7=newp;
+Point(c7) = {0,D1-D4,D4,l};
+c8=newp;
+Point(c8) = {0,0,D4,l};
+
+d1 = newreg;
+Line (d1) = {c1,c2};
+d2 = newreg;
+Line (d2) = {c2,c3};
+d3 = newreg;
+Line (d3) = {c3,c4};
+d4 = newreg;
+Line (d4) = {c4,c5};
+d5 = newreg;
+Line (d5) = {c5,c6};
+d6 = newreg;
+Line (d6) = {c6,c7};
+d7 = newreg;
+Line (d7) = {c7,c8};
+d8 = newreg;
+Line (d8) = {c8,c1};
+
+e1 = newreg;
+Line Loop (newreg) = {d1,d2,d3,d4,d5,d6,d7,d8};
+f1 = newreg;
+Plane Surface (f1) = {e1};
+Extrude ( f1, {D5,0.00000E+00, 0.00000E+00} );
+
+box1 = newp;
+Point(box1) = {Dx,Dy,Dz,lbox};
+box2 = newp;
+Point(box2) = {Dx,Dy,-Dz/6,lbox};
+box3 = newp;
+Point(box3) = {Dx,0,-Dz/6,lbox};
+box4 = newp;
+Point(box4) = {Dx,0,Dz,lbox};
+box5 = newp;
+Point(box5) = {0,Dy,-Dz/6,lbox};
+box6 = newp;
+Point(box6) = {0,Dy,Dz,lbox};
+box7 = newp;
+Point(box7) = {0,0,Dz,lbox};
+box8 = newp;
+Point(box8) = {0,0,-Dz/6,lbox};
+
+lbox1 = newreg;
+Line(lbox1) = {box7,box6};
+lbox2 = newreg;
+Line(lbox2) = {box6,box1};
+lbox3 = newreg;
+Line(lbox3) = {box1,box4};
+lbox4 = newreg;
+Line(lbox4) = {box4,box7};
+lbox5 = newreg;
+Line(lbox5) = {box8,box5};
+lbox6 = newreg;
+Line(lbox6) = {box5,box2};
+lbox7 = newreg;
+Line(lbox7) = {box2,box3};
+lbox8 = newreg;
+Line(lbox8) = {box3,box8};
+lbox9 = newreg;
+Line(lbox9) = {box5,box6};
+lbox10 = newreg;
+Line(lbox10) = {box2,box1};
+lbox11 = newreg;
+Line(lbox11) = {box3,box4};
+
+
+
+s1 = newp;
+Point(s1) = {0,0,D4+e,l};
+s2 = newp;
+Point(s2) = {0,0,D2-D4-e,l};
+s3 = newp;
+Point(s3) = {0,D3-e,D2-D4-e,l};
+s4 = newp;
+Point(s4) = {0,D3-e,D4+e,l};
+
+q1 = newreg;
+Line(q1) = {s1,s2};
+q2 = newreg;
+Line(q2) = {s2,s3};
+q3 = newreg;
+Line(q3) = {s3,s4};
+q4 = newreg;
+Line(q4) = {s4,s1};
+
+v1 = newreg;
+Line(v1) = {box8,c1};
+v2 = newreg;
+Line(v2) = {s2,box7};
+v3 = newreg;
+Line(v3) = {s1,c8};
+
+e2 = newreg;
+Line Loop (newreg) = {q1,q2,q3,q4};
+f2 = newreg;
+Ruled Surface (f2) = {e2};
+Extrude ( f2, {D6,0.00000E+00, 0.00000E+00} );
+
+DxInducteur = .005;
+DyInducteur = .01;
+DzInducteur = .06;
+Rinducteur  = .001;
+Xinducteur  = .028;
+Yinducteur  = .00;
+Zinducteur  = .04;
+LcInducteur = .006;
+
+r1 = newp;
+Point(r1) = {Xinducteur,Yinducteur,Zinducteur,LcInducteur};
+r2 = newp;
+Point(r2) = {Xinducteur+DxInducteur,Yinducteur,Zinducteur,LcInducteur};
+r3 = newp;
+Point(r3) = {Xinducteur+DxInducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+r4 = newp;
+Point(r4) = {Xinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+cc = newp;
+Point(cc) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur,Zinducteur,LcInducteur};
+r5 = newp;
+Point(r5) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+r6 = newp;
+Point(r6) = {Xinducteur-Rinducteur,Yinducteur+DyInducteur+DxInducteur+Rinducteur,Zinducteur,LcInducteur};
+r7 = newp;
+Point(r7) = {0,Yinducteur+DxInducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+r8 = newp;
+Point(r8) = {0,Yinducteur+DyInducteur+Rinducteur,Zinducteur,LcInducteur};
+
+ll1 = newreg;
+Line(ll1) = {r2,r1};
+ll2 = newreg;
+Line(ll2) = {r1,r4};
+ll3 = newreg;
+Circle (ll3) = {r4,cc,r5};
+ll4 = newreg;
+Line(ll4) = {r5,r8};
+ll5 = newreg;
+Line(ll5) = {r8,r7};
+ll6 = newreg;
+Line(ll6) = {r7,r6};
+ll7 = newreg;
+Circle(ll7) = {r3,cc,r6};
+ll8 = newreg;
+Line(ll8) = {r3,r2};
+
+BFondDeLInducteur = newreg;
+Line Loop(BFondDeLInducteur) = {ll1,ll2,ll3,ll4,ll5,ll6,-ll7,ll8};
+FondDeLInducteur = newreg;
+Plane Surface(FondDeLInducteur) = {BFondDeLInducteur};
+Extrude ( FondDeLInducteur, {0,0,DzInducteur} );
+
+
+/*  ---------- */
+
+
+Line Loop(127) = {2,3,4,5,6,7,-62,-59,-58,-57,61,45,-53,-49,60,1};
+Plane Surface(128) = {127,116};
+Line Loop(129) = {39,18,-20,-60,-52,55,48,-61,71,-65,-70,62};
+Plane Surface(130) = {129,104};
+Line Loop(131) = {50,51,52,49};
+Ruled Surface(132) = {131};
+Line Loop(133) = {-55,-51,54,47};
+Ruled Surface(134) = {133};
+Line Loop(135) = {46,47,48,45};
+Ruled Surface(136) = {135};
+Line Loop(137) = {54,-46,-53,50};
+Ruled Surface(138) = {137};
+
+Surface Loop(139) = {117,-92,105,108,111,114,126,120,-123,125};
+Complex Volume(140) = {139};
+Surface Loop(141) = {73,-64,76,79,81,82};
+Complex Volume(142) = {141};
+Surface Loop(143) = {-43,10,-23,-26,-29,-32,-35,-38,-41,-44};
+Complex Volume(144) = {143};
+Surface Loop(145) = {26,-128,29,32,35,38,41,-130,44,23,-132,138,-134,136,-76,-79,-81,-82,92,-108,-111,-114,-126,-120,123,-125};
+Complex Volume(146) = {145};
+
+Physical Surface (11111) =  {117};
+Physical Surface (22222) =  {92,123,120,126,114,108,125,111};
+Physical Surface (33333) =  {10,43,64,73,105,117,128,130,132,134,136,138};
+Physical Volume  (44444) =  {140};
+Physical Volume  (55555) =  {142,144};
+Physical Volume  (66666) =  {146};
+
+Color{
+  General{
+    Background = White ;
+    Axes =  OrangeRed1; 
+    SmallAxes = LightGray;
+    Text = Gray50 ;
+  }
+  Geometry{
+    Points = Yellow;
+    Lines = {210, 210, 210} ;
+    Surfaces = {Orange, 60} ; // almost transparent orange
+    PointsSelect = Orange ;
+    LinesSelect = {180,180,180} ;
+    SurfacesSelect = Orange ;
+  }
+  Mesh{
+    Points = Black;
+    PointsSupp = Orchid;
+    Lines = Gray;
+  }
+
+}
diff --git a/demos/ex12.b b/demos/ex12.b
new file mode 100644
index 0000000000000000000000000000000000000000..fb3c4ae5da0ad18b5a8b80c9a0223ecc5f3e29e2
--- /dev/null
+++ b/demos/ex12.b
@@ -0,0 +1,175 @@
+/*
+ * Sample Gmsh demo file
+ * 
+ * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle
+ *
+ */
+
+h = 19.6 ; hSol = 1. ;
+L = 150. ;
+
+xg  =  0.    ;  yg  = 30.023 + h ;
+x1a = -6.782 ;  y1a = 19.355 + h ;
+x1b = -9.83  ;  y1b =  8.839 + h ;
+x1c = -8.001 ;  y1c =  0.    + h ;
+
+x2a =  6.782 ;  y2a = 19.355 + h ;
+x2b =  9.83  ;  y2b =  8.839 + h ;
+x2c =  8.001 ;  y2c =  0.    + h ;
+
+
+/* ------------ */
+/*  T o w e r   */
+/* ------------ */
+
+ho = -0.288 ;
+
+
+c0 = 9.144 /2. ;  h0 = 0.10 ;
+c1 = 7.422 /2. ;  h1 =  6.139     + ho ;
+c2 = 5.639 /2. ;  h2 = 12.497     + ho ;
+c3 = 3.657 /2. ;  h3 = 25.527     + ho ;   b3 = 8.001 ;
+c4 = 3.457 /2. ;  h4 = h3 + 1.900 ;
+c5 = 2.743 /2. ;  h5 = h3 + 8.839 ;        b5 = 9.830 ;
+c6 = 2.631 /2. ;  h6 = h5 + 2.320 ;
+c7 = 2.118 /2. ;  h7 = h5 + 10.516 ;       b7 = 6.782 ;
+c8 = 2.100 /2. ;  h8 = h7 + 1.680 ;
+c9 = 1.050 /2. ;  h9 = h7 + 5.029 ;
+
+
+pt0 = 1. ;  pt1 = 1. ;  pt2 = 1. ;  pt3 = 1. ;  pt4 = 1. ;  pt5 = 1. ;
+pt6 = 1. ;  pt7 = 1. ;  pt8 = 1. ;  pt9 = 1. ;
+
+ci = c0 ; hi = h0 ;   pti = pt0 ;   i_p = 0 ;
+Include "ex12.d" ;
+
+ci = c1 ; hi = h1 ;   pti = pt1 ;   i_p = 10 ;
+Include "ex12.d" ;
+Include "ex12.e" ;
+
+ci = c2 ; hi = h2 ;   pti = pt2 ;   i_p = 20 ;
+Include "ex12.d" ;
+Include "ex12.e" ;
+
+ci = c3 ; hi = h3 ;   pti = pt3 ;   i_p = 30 ;
+Include "ex12.d" ;
+
+ci = c4 ; hi = h4 ;   pti = pt4 ;   i_p = 40 ;
+Include "ex12.d" ;
+
+ci = c5 ; hi = h5 ;   pti = pt5 ;   i_p = 50 ;
+Include "ex12.d" ;
+
+ci = c6 ; hi = h6 ;   pti = pt6 ;   i_p = 60 ;
+Include "ex12.d" ;
+
+ci = c7 ; hi = h7 ;   pti = pt7 ;   i_p = 70 ;
+Include "ex12.d" ;
+
+ci = c8 ; hi = h8 ;   pti = pt8 ;   i_p = 80 ;
+Include "ex12.d" ;
+
+ci = c9 ; hi = h9 ;   pti = pt9 ;   i_p = 90 ;
+Point(91) = {  ci , hi , 0. , pti } ;
+Point(92) = { -ci , hi , 0. , pti } ;
+
+
+Point(38) = {  b3 , h3 , 0. , pt3 } ;
+Point(39) = { -b3 , h3 , 0. , pt3 } ;
+
+Point(58) = {  b5 , h5 , 0. , pt5 } ;
+Point(59) = { -b5 , h5 , 0. , pt5 } ;
+
+Point(78) = {  b7 , h7 , 0. , pt7 } ;
+Point(79) = { -b7 , h7 , 0. , pt7 } ;
+
+
+
+Line(201) = { 1 , 11 } ;  Line(202) = { 2 , 12 } ;
+Line(203) = { 3 , 13 } ;  Line(204) = { 4 , 14 } ;
+
+Line(211) = { 11 , 21 } ;  Line(212) = { 12 , 22 } ;
+Line(213) = { 13 , 23 } ;  Line(214) = { 14 , 24 } ;
+
+Line(221) = { 21 , 31 } ;  Line(222) = { 22 , 32 } ;
+Line(223) = { 23 , 33 } ;  Line(224) = { 24 , 34 } ;
+
+Line(231) = { 31 , 41 } ;  Line(232) = { 32 , 42 } ;
+Line(233) = { 33 , 43 } ;  Line(234) = { 34 , 44 } ;
+
+Line(241) = { 41 , 51 } ;  Line(242) = { 42 , 52 } ;
+Line(243) = { 43 , 53 } ;  Line(244) = { 44 , 54 } ;
+
+Line(251) = { 51 , 61 } ;  Line(252) = { 52 , 62 } ;
+Line(253) = { 53 , 63 } ;  Line(254) = { 54 , 64 } ;
+
+Line(261) = { 61 , 71 } ;  Line(262) = { 62 , 72 } ;
+Line(263) = { 63 , 73 } ;  Line(264) = { 64 , 74 } ;
+
+Line(271) = { 71 , 81 } ;  Line(272) = { 72 , 82 } ;
+Line(273) = { 73 , 83 } ;  Line(274) = { 74 , 84 } ;
+
+Line(281) = { 81 , 92 } ;  Line(282) = { 82 , 91 } ;
+Line(283) = { 83 , 91 } ;  Line(284) = { 84 , 92 } ;
+
+
+
+
+Line(301) = { 1 , 17 } ;  Line(302) = { 2 , 17 } ;
+Line(303) = { 2 , 16 } ;  Line(304) = { 3 , 16 } ;
+Line(305) = { 3 , 15 } ;  Line(306) = { 4 , 15 } ;
+Line(307) = { 4 , 18 } ;  Line(308) = { 1 , 18 } ;
+
+Line(311) = { 11 , 27 } ;  Line(312) = { 12 , 27 } ;
+Line(313) = { 12 , 26 } ;  Line(314) = { 13 , 26 } ;
+Line(315) = { 13 , 25 } ;  Line(316) = { 14 , 25 } ;
+Line(317) = { 14 , 28 } ;  Line(318) = { 11 , 28 } ;
+
+Line(321) = { 11 , 17 } ;  Line(322) = { 12 , 17 } ;
+Line(323) = { 12 , 16 } ;  Line(324) = { 13 , 16 } ;
+Line(325) = { 13 , 15 } ;  Line(326) = { 14 , 15 } ;
+Line(327) = { 14 , 18 } ;  Line(328) = { 11 , 18 } ;
+
+Line(331) = { 21 , 27 } ;  Line(332) = { 22 , 27 } ;
+Line(333) = { 22 , 26 } ;  Line(334) = { 23 , 26 } ;
+Line(335) = { 23 , 25 } ;  Line(336) = { 24 , 25 } ;
+Line(337) = { 24 , 28 } ;  Line(338) = { 21 , 28 } ;
+
+
+
+Line(401) = { 31 , 32 } ;  Line(402) = { 32 , 33 } ;
+Line(403) = { 33 , 34 } ;  Line(404) = { 34 , 31 } ;
+
+Line(411) = { 41 , 42 } ;  Line(412) = { 42 , 43 } ;
+Line(413) = { 43 , 44 } ;  Line(414) = { 44 , 41 } ;
+
+Line(421) = { 51 , 52 } ;  Line(422) = { 52 , 53 } ;
+Line(423) = { 53 , 54 } ;  Line(424) = { 54 , 51 } ;
+
+Line(431) = { 61 , 62 } ;  Line(432) = { 62 , 63 } ;
+Line(433) = { 63 , 64 } ;  Line(434) = { 64 , 61 } ;
+
+Line(441) = { 71 , 72 } ;  Line(442) = { 72 , 73 } ;
+Line(443) = { 73 , 74 } ;  Line(444) = { 74 , 71 } ;
+
+Line(451) = { 81 , 82 } ;  Line(452) = { 82 , 83 } ;
+Line(453) = { 83 , 84 } ;  Line(454) = { 84 , 81 } ;
+
+
+
+
+Line(501) = { 31 , 39 } ;  Line(502) = { 41 , 39 } ;
+Line(503) = { 34 , 39 } ;  Line(504) = { 44 , 39 } ;
+Line(511) = { 32 , 38 } ;  Line(512) = { 42 , 38 } ;
+Line(513) = { 33 , 38 } ;  Line(514) = { 43 , 38 } ;
+
+Line(521) = { 51 , 59 } ;  Line(522) = { 61 , 59 } ;
+Line(523) = { 54 , 59 } ;  Line(524) = { 64 , 59 } ;
+Line(531) = { 52 , 58 } ;  Line(532) = { 62 , 58 } ;
+Line(533) = { 53 , 58 } ;  Line(534) = { 63 , 58 } ;
+
+Line(541) = { 71 , 79 } ;  Line(542) = { 81 , 79 } ;
+Line(543) = { 74 , 79 } ;  Line(544) = { 84 , 79 } ;
+Line(551) = { 72 , 78 } ;  Line(552) = { 82 , 78 } ;
+Line(553) = { 73 , 78 } ;  Line(554) = { 83 , 78 } ;
+
diff --git a/demos/ex12.c b/demos/ex12.c
new file mode 100644
index 0000000000000000000000000000000000000000..d82461b66c2c310d3a32fd0f3934228b8aac45d7
--- /dev/null
+++ b/demos/ex12.c
@@ -0,0 +1,47 @@
+/*
+ * Sample Gmsh demo file
+ * 
+ * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle
+ *
+ */
+
+/* INPUT :
+   i_p
+   i_l
+*/
+
+Point(i_p + 0) = { x, y-dy0, z8+z0, p0} ;
+Point(i_p + 1) = { x, y-dy1, z8+z1, p0} ;
+Point(i_p + 2) = { x, y-dy2, z8+z2, p0} ;
+Point(i_p + 3) = { x, y-dy3, z8+z3, p0} ;
+Point(i_p + 4) = { x, y-dy4, z8+z4, p0} ;
+Point(i_p + 5) = { x, y-dy5, z8+z5, p0} ;
+Point(i_p + 6) = { x, y-dy6, z8+z6, p0} ;
+Point(i_p + 7) = { x, y-dy7, z8+z7, p0} ;
+Point(i_p + 8) = { x, y-dy8, z8+z8, p1} ;
+
+Point(i_p + 11) = { x, y-dy1,z8-z1, p0} ;
+Point(i_p + 12) = { x, y-dy2,z8-z2, p0} ;
+Point(i_p + 13) = { x, y-dy3,z8-z3, p0} ;
+Point(i_p + 14) = { x, y-dy4,z8-z4, p0} ;
+Point(i_p + 15) = { x, y-dy5,z8-z5, p0} ;
+Point(i_p + 16) = { x, y-dy6,z8-z6, p0} ;
+Point(i_p + 17) = { x, y-dy7,z8-z7, p0} ;
+Point(i_p + 18) = { x, y-dy8,z8-z8, p1} ;
+
+
+Point(i_p + 20) = { x, y-dy0, -z8+z0, p0} ;
+Point(i_p + 21) = { x, y-dy1, -z8+z1, p0} ;
+Point(i_p + 22) = { x, y-dy2, -z8+z2, p0} ;
+Point(i_p + 23) = { x, y-dy3, -z8+z3, p0} ;
+Point(i_p + 24) = { x, y-dy4, -z8+z4, p0} ;
+Point(i_p + 25) = { x, y-dy5, -z8+z5, p0} ;
+Point(i_p + 26) = { x, y-dy6, -z8+z6, p0} ;
+Point(i_p + 27) = { x, y-dy7, -z8+z7, p0} ;
+
+
+Spline(i_l  +  0) = {i_p  + 0,i_p + 1,i_p + 2,i_p + 3,i_p + 4,i_p + 5,i_p + 6,i_p + 7,i_p + 8};
+Spline(i_l  +  1) = {i_p  + 0,i_p + 11,i_p + 12,i_p + 13,i_p + 14,i_p + 15,i_p + 16,i_p + 17,i_p + 18};
+
+Spline(i_l  +  2) = {i_p + 20,i_p + 21,i_p + 22,i_p + 23,i_p + 24,i_p + 25,i_p + 26,i_p + 27,i_p + 18};
+
diff --git a/demos/ex12.d b/demos/ex12.d
new file mode 100644
index 0000000000000000000000000000000000000000..f4964b4f955b19bab7b6ef6a27ea00e2171a8ded
--- /dev/null
+++ b/demos/ex12.d
@@ -0,0 +1,11 @@
+/*
+ * Sample Gmsh demo file
+ * 
+ * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle
+ *
+ */
+
+Point((i_p) + 1) = { -ci , hi , -ci ,  pti } ;
+Point((i_p) + 2) = {  ci , hi , -ci ,  pti } ;
+Point((i_p) + 3) = {  ci , hi ,  ci ,  pti } ;
+Point((i_p) + 4) = { -ci , hi ,  ci ,  pti } ;
diff --git a/demos/ex12.e b/demos/ex12.e
new file mode 100644
index 0000000000000000000000000000000000000000..59bf0ee1a258ee3d3ad6b4bce9a9ee12cccfed7f
--- /dev/null
+++ b/demos/ex12.e
@@ -0,0 +1,11 @@
+/*
+ * Sample Gmsh demo file
+ * 
+ * Copyright (C) 2000 C. Geuzaine, J.-F. Remacle
+ *
+ */
+
+Point(i_p + 5) = {  0. , hi ,  ci ,  pti } ;
+Point(i_p + 6) = {  ci , hi ,  0. ,  pti } ;
+Point(i_p + 7) = {  0. , hi , -ci ,  pti } ;
+Point(i_p + 8) = { -ci , hi ,  0. ,  pti } ;
diff --git a/demos/ex12.geo b/demos/ex12.geo
new file mode 100644
index 0000000000000000000000000000000000000000..8eb3aef8fa26940eac8545583353b4e2f657c24e
--- /dev/null
+++ b/demos/ex12.geo
@@ -0,0 +1,59 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   3D with splines and includes
+
+   All important comments are marked with "README"
+*/
+
+Include "ex12.a" ;
+
+/* Post-Processing meshes */
+
+xBox = 30. ;  
+yBox = y1a * 1.5 ;
+pBox = 20. ;  
+
+Point(1002) = { xBox, yBox, 0, pBox} ;
+Point(1003) = {-xBox, yBox, 0, pBox} ;
+Point(1004) = {-xBox, 0,    0, pBox} ;
+Point(1005) = { xBox, 0,    0, pBox} ;
+
+Line(2301) = {1004,1005};
+Line(2302) = {1005,1002};
+Line(2303) = {1002,1003};
+Line(2305) = {1003,1004};
+
+Line Loop(2307) = {2303,2305,2301,2302};
+Plane Surface(2308) = {2307};
+
+Transfinite Line {2301,2303}  = 61  ;
+Transfinite Line {2302,-2305} = 61 ;
+Transfinite Surface {2308} = {1003,1002,1005,1004} ;
+Recombine Surface {2308} ;
+
+Physical Surface (1201) = {2308} ;
+
+xBox = 30. ;  
+zBox = 150. ;
+pBox = 20. ;  
+
+Point(1006) = { xBox, 1, zBox, pBox} ;
+Point(1007) = {-xBox, 1, zBox, pBox} ;
+Point(1008) = {-xBox, 1,    0, pBox} ;
+Point(1009) = { xBox, 1,    0, pBox} ;
+
+Line(2306) = {1008,1009};
+Line(2307) = {1009,1006};
+Line(2308) = {1006,1007};
+Line(2309) = {1007,1008};
+
+Line Loop(2310) = {2307,2308,2309,2306};
+Plane Surface(2311) = {2310};
+
+Transfinite Line {2306,2308}  = 61  ;
+Transfinite Line {2307,-2309} = 61 ;
+Transfinite Surface {2311} = {1007,1006,1009,1008} ;
+Recombine Surface {2311} ;
+
+Physical Surface (1202) = {2311} ;
diff --git a/demos/ex13.bar b/demos/ex13.bar
new file mode 100644
index 0000000000000000000000000000000000000000..cc9af8183845465f89c5a44b1c427479df02de5d
--- /dev/null
+++ b/demos/ex13.bar
@@ -0,0 +1,42 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Included by ex13.geo
+
+   All important comments are marked with "README"
+*/
+
+Point(x+01) = {dx,    -e,    -ll/2,    sx};  Point(x+11) = {dx,     e,     ll/2,    sx}; 
+Point(x+02) = {dx+rx, -e,    -ll/2,    sx};  Point(x+12) = {dx+rx,  e,     ll/2,    sx}; 
+Point(x+03) = {dx,    -e+rx, -ll/2,    sx};  Point(x+13) = {dx,     e+rx,  ll/2,    sx}; 
+Point(x+04) = {dx-rx, -e,    -ll/2,    sx};  Point(x+14) = {dx-rx,  e,     ll/2,    sx}; 
+Point(x+05) = {dx,    -e-rx, -ll/2,    sx};  Point(x+15) = {dx,     e-rx,  ll/2,    sx}; 
+Point(x+06) = {dx,    -e,    -ll/2-lx, sx};  Point(x+16) = {dx,     e,     ll/2+lx, sx}; 
+Point(x+07) = {dx+rx, -e,    -ll/2-lx, sx};  Point(x+17) = {dx+rx,  e,     ll/2+lx, sx}; 
+Point(x+08) = {dx,    -e+rx, -ll/2-lx, sx};  Point(x+18) = {dx,     e+rx,  ll/2+lx, sx}; 
+Point(x+09) = {dx-rx, -e,    -ll/2-lx, sx};  Point(x+19) = {dx-rx,  e,     ll/2+lx, sx}; 
+Point(x+10) = {dx,    -e-rx, -ll/2-lx, sx};  Point(x+20) = {dx,     e-rx,  ll/2+lx, sx}; 
+
+Circle(x+01) = {x+02,x+01,x+03}; Circle(x+05) = {x+07,x+06,x+08}; Line(x+09) = {x+02,x+07};
+Circle(x+02) = {x+03,x+01,x+04}; Circle(x+06) = {x+08,x+06,x+09}; Line(x+10) = {x+03,x+08};
+Circle(x+03) = {x+04,x+01,x+05}; Circle(x+07) = {x+09,x+06,x+10}; Line(x+11) = {x+04,x+09};
+Circle(x+04) = {x+05,x+01,x+02}; Circle(x+08) = {x+10,x+06,x+07}; Line(x+12) = {x+05,x+10};
+       	       	     		    	    	    	       	       	   
+Circle(x+13) = {x+12,x+11,x+13}; Circle(x+17) = {x+17,x+16,x+18}; Line(x+21) = {x+12,x+17};
+Circle(x+14) = {x+13,x+11,x+14}; Circle(x+18) = {x+18,x+16,x+19}; Line(x+22) = {x+13,x+18};
+Circle(x+15) = {x+14,x+11,x+15}; Circle(x+19) = {x+19,x+16,x+20}; Line(x+23) = {x+14,x+19};
+Circle(x+16) = {x+15,x+11,x+12}; Circle(x+20) = {x+20,x+16,x+17}; Line(x+24) = {x+15,x+20};
+
+Line Loop(x+01) = {x+02,x+03,x+04,x+01};       Plane Surface(x+21) = {x+01};
+Line Loop(x+02) = {x+07,x+08,x+05,x+06};       Plane Surface(x+22) = {x+02};
+Line Loop(x+03) = {x+16,x+13,x+14,x+15};       Plane Surface(x+23) = {x+03};
+Line Loop(x+04) = {x+20,x+17,x+18,x+19};       Plane Surface(x+24) = {x+04};
+Line Loop(x+05) = {x+08,-(x+09),-(x+04),x+12}; Ruled Surface(x+25) = {x+05};
+Line Loop(x+06) = {x+12,-(x+07),-(x+11),x+03}; Ruled Surface(x+26) = {x+06};
+Line Loop(x+07) = {-(x+11),-(x+02),x+10,x+06}; Ruled Surface(x+27) = {x+07};
+Line Loop(x+08) = {-(x+10),-(x+01),x+09,x+05}; Ruled Surface(x+28) = {x+08};
+Line Loop(x+09) = {x+21,-(x+20),-(x+24),x+16}; Ruled Surface(x+29) = {x+09};
+Line Loop(x+10) = {-(x+24),-(x+15),x+23,x+19}; Ruled Surface(x+30) = {x+10};
+Line Loop(x+11) = {x+23,-(x+18),-(x+22),x+14}; Ruled Surface(x+31) = {x+11};
+Line Loop(x+12) = {x+22,-(x+17),-(x+21),x+13}; Ruled Surface(x+32) = {x+12};
+
diff --git a/demos/ex13.geo b/demos/ex13.geo
new file mode 100644
index 0000000000000000000000000000000000000000..142a51cbe28beec810c19c4f5521cb9899b7bb41
--- /dev/null
+++ b/demos/ex13.geo
@@ -0,0 +1,198 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   More complex 3D example. Test for 2nd order elts.
+
+   All important comments are marked with "README"
+*/
+
+/*
+  The two longitudinal bars
+*/
+
+f4 = 0.6 ; 
+f5 = 1.33 ; 
+
+xmin =-27.e-3 ;
+LL   = 1821.3e-3 ; 
+ll   = 20.e-3 ; 
+hh   = 20.e-3 ;
+dc   = 8.e-3 ;
+em   = 8.e-3/2 ; 
+eM   = 40.e-3/2 ;
+t    = ArcTan(eM/2-em/2/LL) ;
+
+Point(1) = {xmin, -em-hh, -ll/2, f4*ll/2} ; Point(5) = {xmin, em, -ll/2, f4*ll/2} ; 
+Point(2) = {xmin, -em-hh,  ll/2, f4*ll/2} ; Point(6) = {xmin, em,  ll/2, f4*ll/2} ; 
+Point(3) = {xmin, -em,    -ll/2, f4*ll/2} ; Point(7) = {xmin, em+hh, -ll/2, f4*ll/2} ; 
+Point(4) = {xmin, -em,     ll/2, f4*ll/2} ; Point(8) = {xmin, em+hh,  ll/2, f4*ll/2} ; 
+
+Point(9)  = {xmin+LL, -eM-hh, -ll/2, f5*ll/2} ; Point(13) = {xmin+LL, eM, -ll/2, f5*ll/2} ; 
+Point(10) = {xmin+LL, -eM-hh,  ll/2, f5*ll/2} ; Point(14) = {xmin+LL, eM,  ll/2, f5*ll/2} ; 
+Point(11) = {xmin+LL, -eM,    -ll/2, f5*ll/2} ; Point(15) = {xmin+LL, eM+hh, -ll/2, f5*ll/2} ; 
+Point(12) = {xmin+LL, -eM,     ll/2, f5*ll/2} ; Point(16) = {xmin+LL, eM+hh,  ll/2, f5*ll/2} ; 
+
+Line(1) = {5,6};  Line(11) = {13,14};
+Line(2) = {6,8};  Line(12) = {14,16};
+Line(3) = {8,7};  Line(13) = {16,15};
+Line(4) = {7,5};  Line(14) = {15,13};
+Line(5) = {1,2};  Line(15) = {9,10}; 
+Line(6) = {2,4};  Line(16) = {10,12};
+Line(7) = {4,3};  Line(17) = {12,11};
+Line(8) = {3,1};  Line(18) = {11,9}; 
+Line(9) = {4,6};  Line(19) = {12,14};
+Line(10) = {3,5}; Line(20) = {11,13};
+
+Line(21) = {8,16}; Line(25) = {2,10}; 
+Line(22) = {7,15}; Line(26) = {4,12}; 
+Line(23) = {6,14}; Line(27) = {3,11}; 
+Line(24) = {5,13}; Line(28) = {1,9};  
+
+/* 
+   The 22 resonators
+*/
+
+f1 = 2 ; f2 = 3.5 ; f3 = 5 ;
+
+// length             ;  radius        ; dist % 1st bar  ; dist % y=0                   ; charact. length
+ l1 =   77.e-3/2-ll/2 ;  r1 =  8.e-3/2 ;  d1 =         0 ;  e1 = em+dc+d1*Sin(t)-2.e-3  ;  s1 = f1*r1 ;
+ l2 =   91.e-3/2-ll/2 ;  r2 =  8.e-3/2 ;  d2 =   11.9e-3 ;  e2 = em+dc+d2*Sin(t)-2.e-3  ;  s2 = f1*r2 ;
+ l3 =  105.e-3/2-ll/2 ;  r3 =  8.e-3/2 ;  d3 =   25.8e-3 ;  e3 = em+dc+d3*Sin(t)-2.e-3  ;  s3 = f1*r3 ;
+ l4 =  122.e-3/2-ll/2 ;  r4 =  8.e-3/2 ;  d4 =   41.8e-3 ;  e4 = em+dc+d4*Sin(t)-2.e-3  ;  s4 = f1*r4 ;
+ l5 =  142.e-3/2-ll/2 ;  r5 = 10.e-3/2 ;  d5 =   60.5e-3 ;  e5 = em+dc+d5*Sin(t)-1.e-3  ;  s5 = f1*r5 ;
+ l6 =  164.e-3/2-ll/2 ;  r6 = 10.e-3/2 ;  d6 =   82.5e-3 ;  e6 = em+dc+d6*Sin(t)-1.e-3  ;  s6 = f1*r6 ;
+ l7 =  192.e-3/2-ll/2 ;  r7 = 12.e-3/2 ;  d7 =  107.0e-3 ;  e7 = em+dc+d7*Sin(t)        ;  s7 = f1*r7 ;
+ l8 =  224.e-3/2-ll/2 ;  r8 = 12.e-3/2 ;  d8 =  138.5e-3 ;  e8 = em+dc+d8*Sin(t)        ;  s8 = f1*r8 ;
+ l9 =  260.e-3/2-ll/2 ;  r9 = 12.e-3/2 ;  d9 =  172.0e-3 ;  e9 = em+dc+d9*Sin(t)        ;  s9 = f1*r9 ;
+l10 =  303.e-3/2-ll/2 ; r10 = 12.e-3/2 ; d10 =  212.0e-3 ; e10 = em+dc+d10*Sin(t)       ; s10 = f1*r10 ;
+l11 =  353.e-3/2-ll/2 ; r11 = 12.e-3/2 ; d11 =  258.5e-3 ; e11 = em+dc+d11*Sin(t)       ; s11 = f1*r11 ;
+l12 =  410.e-3/2-ll/2 ; r12 = 12.e-3/2 ; d12 =  312.5e-3 ; e12 = em+dc+d12*Sin(t)       ; s12 = f1*r12 ;
+l13 =  477.e-3/2-ll/2 ; r13 = 12.e-3/2 ; d13 =  375.0e-3 ; e13 = em+dc+d13*Sin(t)       ; s13 = f1*r13 ;
+l14 =  554.e-3/2-ll/2 ; r14 = 12.e-3/2 ; d14 =  448.5e-3 ; e14 = em+dc+d14*Sin(t)       ; s14 = f1*r14 ;
+l15 =  645.e-3/2-ll/2 ; r15 = 12.e-3/2 ; d15 =  533.0e-3 ; e15 = em+dc+d15*Sin(t)       ; s15 = f1*r15 ;
+l16 =  749.e-3/2-ll/2 ; r16 = 12.e-3/2 ; d16 =  632.5e-3 ; e16 = em+dc+d16*Sin(t)       ; s16 = f1*r16 ;
+l17 =  877.e-3/2-ll/2 ; r17 = 12.e-3/2 ; d17 =  750.5e-3 ; e17 = em+dc+d17*Sin(t)       ; s17 = f2*r17 ;
+l18 = 1023.e-3/2-ll/2 ; r18 = 12.e-3/2 ; d18 =  888.0e-3 ; e18 = em+dc+d18*Sin(t)       ; s18 = f2*r18 ;
+l19 = 1196.e-3/2-ll/2 ; r19 = 12.e-3/2 ; d19 = 1050.3e-3 ; e19 = em+dc+d19*Sin(t)       ; s19 = f3*r19 ;
+l20 = 1404.e-3/2-ll/2 ; r20 = 12.e-3/2 ; d20 = 1241.7e-3 ; e20 = em+dc+d20*Sin(t)       ; s20 = f3*r20 ;
+l21 = 1648.e-3/2-ll/2 ; r21 = 12.e-3/2 ; d21 = 1467.7e-3 ; e21 = em+dc+d21*Sin(t)       ; s21 = f3*r21 ;
+l22 = 1934.e-3/2-ll/2 ; r22 = 12.e-3/2 ; d22 = 1734.3e-3 ; e22 = em+dc+d22*Sin(t)       ; s22 = f3*r22 ;
+
+dx = d1 ; rx = r1 ; sx = s1 ; lx = l1 ; e = e1 ; x = 100; Include "ex13.bar" ;
+dx = d2 ; rx = r2 ; sx = s2 ; lx = l2 ; e =-e2 ; x = 200; Include "ex13.bar" ;
+dx = d3 ; rx = r3 ; sx = s3 ; lx = l3 ; e = e3 ; x = 300; Include "ex13.bar" ;
+dx = d4 ; rx = r4 ; sx = s4 ; lx = l4 ; e =-e4 ; x = 400; Include "ex13.bar" ;
+dx = d5 ; rx = r5 ; sx = s5 ; lx = l5 ; e = e5 ; x = 500; Include "ex13.bar" ;
+dx = d6 ; rx = r6 ; sx = s6 ; lx = l6 ; e =-e6 ; x = 600; Include "ex13.bar" ;
+dx = d7 ; rx = r7 ; sx = s7 ; lx = l7 ; e = e7 ; x = 700; Include "ex13.bar" ;
+dx = d8 ; rx = r8 ; sx = s8 ; lx = l8 ; e =-e8 ; x = 800; Include "ex13.bar" ;
+dx = d9 ; rx = r9 ; sx = s9 ; lx = l9 ; e = e9 ; x = 900; Include "ex13.bar" ;
+dx = d10; rx = r10; sx = s10; lx = l10; e =-e10; x =1000; Include "ex13.bar" ;
+dx = d11; rx = r11; sx = s11; lx = l11; e = e11; x =1100; Include "ex13.bar" ;
+dx = d12; rx = r12; sx = s12; lx = l12; e =-e12; x =1200; Include "ex13.bar" ;
+dx = d13; rx = r13; sx = s13; lx = l13; e = e13; x =1300; Include "ex13.bar" ;
+dx = d14; rx = r14; sx = s14; lx = l14; e =-e14; x =1400; Include "ex13.bar" ;
+dx = d15; rx = r15; sx = s15; lx = l15; e = e15; x =1500; Include "ex13.bar" ;
+dx = d16; rx = r16; sx = s16; lx = l16; e =-e16; x =1600; Include "ex13.bar" ;
+dx = d17; rx = r17; sx = s17; lx = l17; e = e17; x =1700; Include "ex13.bar" ;
+dx = d18; rx = r18; sx = s18; lx = l18; e =-e18; x =1800; Include "ex13.bar" ;
+dx = d19; rx = r19; sx = s19; lx = l19; e = e19; x =1900; Include "ex13.bar" ;
+dx = d20; rx = r20; sx = s20; lx = l20; e =-e20; x =2000; Include "ex13.bar" ;
+dx = d21; rx = r21; sx = s21; lx = l21; e = e21; x =2100; Include "ex13.bar" ;
+dx = d22; rx = r22; sx = s22; lx = l22; e =-e22; x =2200; Include "ex13.bar" ;
+
+
+/* 
+   Surfaces for longitudinal bars  
+*/
+
+Line Loop(3001) = {-13,-21,3,22};  Plane Surface(3101) = {3001}; // ymax 
+Line Loop(3002) = {23,-11,-24,1};  Plane Surface(3102) = {3002}; // ymax - eps 
+Line Loop(3003) = {-27,-7,26,17};  Plane Surface(3103) = {3003}; // ymin + eps
+Line Loop(3004) = {25,-15,-28,5};  Plane Surface(3104) = {3004}; // ymin 
+Line Loop(3005) = {3,4,1,2};       Plane Surface(3105) = {3005}; // left top
+Line Loop(3006) = {7,8,5,6};       Plane Surface(3106) = {3006}; // left bottom
+Line Loop(3007) = {11,12,13,14};   Plane Surface(3107) = {3007}; // right top
+Line Loop(3008) = {18,15,16,17};   Plane Surface(3108) = {3008}; // right bottom
+	   					  	
+Line Loop(3011) = {-9,7,10,1};     Plane Surface(3111) = {3011}; // input
+Line Loop(3012) = {-11,-20,-17,19};Plane Surface(3112) = {3012}; // output
+
+Line Loop(3013) = {-26,-6,25,16};
+Line Loop(3014) = {-28,-8,27,18};
+Line Loop(3015) = {-21,-2,23,12};
+Line Loop(3016) = {-24,-4,22,14};
+Plane Surface(3113) = {3013,203,403,603,803,1003,1203,1403,1603,1803,2003,2203} ;
+Plane Surface(3114) = {3014,101,301,501,701,901,1101,1301,1501,1701,1901,2101};
+Plane Surface(3115) = {3015,103,303,503,703,903,1103,1303,1503,1703,1903,2103};
+Plane Surface(3116) = {3016,201,401,601,801,1001,1201,1401,1601,1801,2001,2201};
+
+/* 
+   The physical entities 
+*/
+
+AIR       = 8001 ;
+XM        = 8002 ;
+XP        = 8003 ;
+YM        = 8004 ;
+YP        = 8005 ;
+ZM        = 8006 ;
+ZP        = 8007 ;
+
+CLINPUT   = 9001 ;
+CLBOX     = 9002 ;
+CLLONG    = 9003 ;
+CLBAR     = 9004 ;
+CLBEM     = 9005 ;
+
+Physical Surface(CLINPUT) = {3111};
+Physical Surface(CLBEM) = {4119,4106,4115,4111,4122,4124};
+Physical Surface(CLLONG) = {3102,3115,3101,3116,3105,3107,3103,3114,3104,3113,3108,3106};
+Physical Surface(CLBAR) = 
+{ 
+  122,125,126,127,128,
+  124,129,130,131,132,
+  222,225,226,227,228,
+  224,229,230,231,232,
+  322,325,326,327,328,
+  324,329,330,331,332,
+  422,425,426,427,428,
+  424,429,430,431,432,
+  522,525,526,527,528,
+  524,529,530,531,532,
+  622,625,626,627,628,
+  624,629,630,631,632,
+  722,725,726,727,728,
+  724,729,730,731,732,
+  822,825,826,827,828,
+  824,829,830,831,832,
+  922,925,926,927,928,
+  924,929,930,931,932,
+  1022,1025,1026,1027,1028,
+  1024,1029,1030,1031,1032,
+  1122,1125,1126,1127,1128,
+  1124,1129,1130,1131,1132,
+  1222,1225,1226,1227,1228,
+  1224,1229,1230,1231,1232,
+  1322,1325,1326,1327,1328,
+  1324,1329,1330,1331,1332,
+  1422,1425,1426,1427,1428,
+  1424,1429,1430,1431,1432,
+  1522,1525,1526,1527,1528,
+  1524,1529,1530,1531,1532,
+  1622,1625,1626,1627,1628,
+  1624,1629,1630,1631,1632,
+  1722,1725,1726,1727,1728,
+  1724,1729,1730,1731,1732,
+  1822,1825,1826,1827,1828,
+  1824,1829,1830,1831,1832,
+  1922,1925,1926,1927,1928,
+  1924,1929,1930,1931,1932,
+  2022,2025,2026,2027,2028,
+  2024,2029,2030,2031,2032,
+  2122,2125,2126,2127,2128,
+  2124,2129,2130,2131,2132,
+  2222,2225,2226,2227,2228,
+  2224,2229,2230,2231,2232 
+ };
+
diff --git a/demos/view01.pos b/demos/view01.pos
new file mode 100644
index 0000000000000000000000000000000000000000..8181fcc14ecbff73b4d52d26eb51238cb4a6ac79
--- /dev/null
+++ b/demos/view01.pos
@@ -0,0 +1,1327 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   2D Scalar map
+
+   All important comments are marked with "README"
+*/
+
+/* README: A post-processing file contains one or more 'Views', whose
+   syntax is
+
+   View "name" {
+     type of element (list of coordinates) {list of values} ;
+     ...
+   }	
+
+   12 base objects can be displayed:
+
+                       type of element   list of coordinates    list of values
+   --------------------------------------------------------------------------------
+   scalar point        SP                3                      1  * nb time steps
+   vector point        VP                3                      3  * nb time steps
+   tensor point        TP                3                      9  * nb time steps
+   scalar line         SL                6                      2  * nb time steps
+   vector line         VL                6                      6  * nb time steps
+   tensor line         TL                6                      18 * nb time steps
+   scalar triangle     ST                9                      3  * nb time steps
+   vector triangle     VT                9                      9  * nb time steps
+   tensor triangle     TT                9                      27 * nb time steps
+   scalar tetrahedron  SS                12                     4  * nb time steps
+   vector tetrahedron  VS                12                     12 * nb time steps
+   tensor tetrahedron  TS                12                     36 * nb time steps
+
+
+   The coordinates are given "by node", that is (x,y,z) for a point, (x1,y1,z1,x2,y2,z2)
+   for a line, (x1,y1,z1,x2,y2,z2,x3,y3,z3) for a triangle, ...
+ 
+   The values are given by timestep, by node and by component. That is, for a vector line,
+   {valxnode1time1,valynode1time1,valznode1time1, valxnode2time1,valynode2time1,valznode2time1,
+    valxnode1time2,valynode1time2,valznode1time2, valxnode2time2,valynode2time2,valznode2time2, ...}
+
+   A post-processing view is loaded in Gmsh with File->Merge. Up to 20 views can be loaded
+   simultaneously. All post-processing options are accessed by clicking on the right mouse
+   button on the view button (in post-processing mode: Mod->Post-Processing).
+
+*/
+
+
+// In this view, there are only scalar triangles.
+// There are 5 time steps -> 3*5 = 15 values for each triangle.
+
+View "a scalar map" {
+ST(0.079090117,0.19794942,0,0.06966854,0.20076802,0,0.071449289,0.19423207,0){1206859.6,1570520.4,1594804.6,-2368529.7,-3162888.4,-3019964.8,1073015.3,1636334.6,1103926.4,1335740.9,1503948.1,2033518.7,-2359414.1,-3161601.9,-2921575.1};
+ST(0.056317057,0.058022103,0,0.045416206,0.061541227,0,0.048663579,0.053435419,0){3630316.8,3642820.9,3726394.8,2330872.5,2181474.8,2589713.3,197001.66,-155055.51,663071.82,-2007682.1,-2429600.5,-1465861.1,-3494460.7,-3730025.8,-3147918.6};
+ST(0.052494391,0.065958781,0,0.045416206,0.061541227,0,0.056317057,0.058022103,0){3640248,3642820.9,3630316.8,1971511.2,2181474.8,2330872.5,-601016.65,-155055.51,197001.66,-2898090,-2429600.5,-2007682.1,-3866942,-3730025.8,-3494460.7};
+ST(0.089437553,0.21298247,0,0.093706234,0.20596864,0,0.1,0.21428571,0){556322.48,360320.46,0,-1238115.4,-758974.46,0,961021.23,479351.87,0,60411.18,228803.73,0,-1035404.3,-732939.79,0};
+ST(0,0.021428571,0,0.0084994266,0.025462386,0,0,0.028571429,0){0,1014895.2,0,0,943121.65,0,0,804669.5,0,0,609367.99,0,0,370926.59,0};
+ST(0,0.27142857,0,0.0087746229,0.27470702,0,0,0.27857143,0){0,139476.7,0,0,-408686.72,0,0,649356.33,0,0,-844695.79,0,0,980930.37,0};
+ST(0.064352171,0.083117586,0,0.058212185,0.089881183,0,0.054828578,0.081464579,0){3167194.8,3344291.6,3492382.6,915483.69,593905.21,1101278.5,-1987167.2,-2645013.4,-2043909.2,-3477240.4,-3708817.1,-3789901.6,-2495770,-1722713.3,-2941538.5};
+ST(0.043491003,0.26677795,0,0.04563604,0.25694979,0,0.0528723,0.26429657,0){657627.62,859240.08,718299.05,-1894105.9,-2406042.8,-2055661.9,2903724.9,3472131.8,3109067.1,-3565612.1,-3844488.4,-3733060,3800401.2,3448330.3,3841282.5};
+ST(0.0528723,0.26429657,0,0.04563604,0.25694979,0,0.054010827,0.25507988,0){718299.05,859240.08,897184.36,-2055661.9,-2406042.8,-2496661.6,3109067.1,3472131.8,3553831.7,-3733060,-3844488.4,-3839088.9,3841282.5,3448330.3,3290330.5};
+ST(0.052748817,0.036292023,0,0.046341114,0.044942776,0,0.043838979,0.034579424,0){3796611.1,3748809.1,3745913.7,3254886.9,2933624.2,3260141.4,2248728.5,1480431.3,2351583.2,921690.78,-294933.53,1138042.7,-537197.11,-2006921.6,-223347.31};
+ST(0.054794838,0.043915046,0,0.046341114,0.044942776,0,0.052748817,0.036292023,0){3735662.6,3748809.1,3796611.1,2959425,2933624.2,3254886.9,1568238.5,1480431.3,2248728.5,-148813.91,-294933.53,921690.78,-1835117.4,-2006921.6,-537197.11};
+ST(0.064795861,0.023107998,0,0.057612168,0.01845715,0,0.064075209,0.013493001,0){3443592.1,3752599.8,3498581.2,3242943.8,3612875.5,3428890.3,2853338,3338613.5,3290906.4,2297494.4,2940029.2,3087427.7,1607540.9,2431782.4,2822154};
+ST(0.08812606,0.087328167,0,0.091953893,0.078440357,0,0.1,0.085714286,0){1269155.7,889726.23,0,279658.57,322434.75,0,-927894.68,-450550.32,0,-1412053.3,-936443.15,0,-795447.99,-825354.72,0};
+ST(0.1,0.21428571,0,0.091864029,0.22106993,0,0.089437553,0.21298247,0){0,394005.54,556322.48,0,-927852.61,-1238115.4,0,863120.02,961021.23,0,-241435.16,60411.18,0,-536498.87,-1035404.3};
+ST(0.091758141,0.11296708,0,0.08466046,0.11619385,0,0.082583958,0.10907049,0){824791.32,1475783,1698614.9,-201020.76,-452604.25,-286603.09,-976886.6,-1789662.1,-1936849,-537824.26,-788262.21,-1323464.6,570097.26,1243195.1,836522.31};
+ST(0.046341114,0.044942776,0,0.053426379,0.049768916,0,0.048663579,0.053435419,0){3748809.1,3727873.1,3726394.8,2933624.2,2738031.5,2589713.3,1480431.3,1021148,663071.82,-294933.53,-966926.63,-1465861.1,-2006921.6,-2698501,-3147918.6};
+ST(0.08596482,0.28314521,0,0.082516133,0.27647665,0,0.089232651,0.27618677,0){145967.81,248899.48,160151.6,-433371.98,-731674.12,-470555.02,707326.96,1170289.2,751874.95,-959333.22,-1538273.3,-986723.61,1181452.3,1813237.5,1160401.4};
+ST(0.089183466,0.023798504,0,0.082332164,0.023444943,0,0.085905658,0.016824409,0){1283383.3,2029600,1656238,1204105.7,1907886.4,1604967.9,1050439.6,1671751.1,1504009.2,831874.08,1335359.8,1356492.3,561630.79,918760.81,1166855};
+ST(0.051013063,0.11801667,0,0.052058531,0.12554764,0,0.045375723,0.12284566,0){3161388.4,3065498.6,3072436,-1083065.4,-1512626.5,-1348503.3,-3873486.3,-3831818,-3829159.4,-1463412.7,-428428.64,-800055.99,2911579,3614977.4,3380414.3};
+ST(0.076938259,0.060604721,0,0.080938662,0.054906318,0,0.08415119,0.061061125,0){2443533.2,2097661.4,1759442.9,1491930.8,1423084,1064240.3,-40674.57,290856.94,-51487.645,-1557435.8,-934922.56,-1146904.2,-2468002.6,-1860365.1,-1789550.6};
+ST(0.027903545,0.087518505,0,0.025411973,0.082310594,0,0.032911969,0.081185013,0){2674848,2525130.6,3037931.3,580994.77,762374.09,971274.35,-1967676.8,-1532614.6,-1756226.8,-2976106,-2757779.1,-3289165.4,-1655065.1,-2058136.4,-2584916.3};
+ST(0.045116599,0.21481108,0,0.053910411,0.21448753,0,0.049797208,0.2214244,0){1654487.5,1667429.4,1551864.2,-3731787.4,-3752161.8,-3662861.4,3030991.5,3023771,3430735.4,-73694.316,-28239.212,-1003918.8,-2938909.4,-2988983.1,-2065424.5};
+ST(0.064795861,0.023107998,0,0.057707972,0.025075094,0,0.057612168,0.01845715,0){3443592.1,3734947.8,3752599.8,3242943.8,3478918.2,3612875.5,2853338,2984396.6,3338613.5,2297494.4,2285289.9,2940029.2,1607540.9,1429238.8,2431782.4};
+ST(0.0093450955,0.28843768,0,0.0045473776,0.2936365,0,0,0.28571429,0){67949.514,18406.211,0,-202850.84,-55138.333,0,334776.34,91630.552,0,-461793.67,-127724.83,0,581935.08,162961.08,0};
+ST(0.1,0.13571429,0,0.093938974,0.13899,0,0.0910478,0.13167545,0){0,548364.78,831136.87,0,-422206.84,-514132.23,0,-645591.08,-1027305.8,0,273728.87,122313.64,0,708600.91,1073956.7};
+ST(0,0.014285714,0,0.0045481906,0.0063920675,0,0.0093389246,0.011691623,0){0,552257.15,1120186.5,0,549810.55,1103410.3,0,544927.47,1070108.3,0,537633.65,1020788.4,0,527798.54,956114.18};
+ST(0.085905658,0.016824409,0,0.093571257,0.018380777,0,0.089183466,0.023798504,0){1656238,774815.13,1283383.3,1604967.9,746204.54,1204105.7,1504009.2,690036.86,1050439.6,1356492.3,608388.09,831874.08,1166855,504051.02,561630.79};
+ST(0.089232651,0.27618677,0,0.093593186,0.28160993,0,0.08596482,0.28314521,0){160151.6,74588.283,145967.81,-470555.02,-221009.65,-433371.98,751874.95,359269.18,707326.96,-986723.61,-484261.41,-959333.22,1160401.4,591230.88,1181452.3};
+ST(0.015416139,0.018002698,0,0.006650898,0.018174199,0,0.0093389246,0.011691623,0){1798828.3,801243.34,1120186.5,1735136,772347.91,1103410.3,1609995.5,715593.27,1070108.3,1427830.3,633022.27,1020788.4,1194733.1,527557,956114.18};
+ST(0.0093450955,0.28843768,0,0.0067236406,0.28198319,0,0.015498485,0.28248556,0){67949.514,76627.274,166274.63,-202850.84,-227172.13,-493262.57,334776.34,369685.4,803759.61,-461793.67,-499127.77,-1087394.1,581935.08,610772.43,1334475.8};
+ST(0.048076401,0.17082416,0,0.048811039,0.17808485,0,0.041643161,0.17482395,0){2424680.5,2310715.6,2284160.6,-3473815.1,-3650410,-3458410.7,-921629.25,-194330.82,-506290.81,3872759.5,3763231.4,3718851.8,-754316.94,-1987755.8,-1405815.9};
+ST(0.041643161,0.17482395,0,0.048811039,0.17808485,0,0.043573225,0.18196099,0){2284160.6,2310715.6,2202933.2,-3458410.7,-3650410,-3650165.7,-506290.81,-194330.82,195066.32,3718851.8,3763231.4,3522129.2,-1405815.9,-1987755.8,-2509350};
+ST(0.020973714,0.16688371,0,0.021502186,0.15931359,0,0.029380008,0.16405835,0){1525118.3,1630158.4,2021292.5,-2061659.5,-1947614.2,-2614335.2,-799875.51,-1250943.8,-1254306.4,2343184.8,2191316.6,2982541.3,-24581.749,824223.66,378860.61};
+ST(0.075422073,0.20645372,0,0.06966854,0.20076802,0,0.079090117,0.19794942,0){1273700.5,1570520.4,1206859.6,-2693470,-3162888.4,-2368529.7,1728669,1636334.6,1073015.3,766631.5,1503948.1,1335740.9,-2583646.6,-3161601.9,-2359414.1};
+ST(0.077619244,0.18028791,0,0.077140734,0.17217741,0,0.085369203,0.17624497,0){1471797.4,1584233.7,1039089.6,-2389894.4,-2313491.7,-1603144.1,18944.546,-519338.58,-168940.91,2378251.6,2552719.3,1695116.9,-1502642.9,-655929.75,-751642.95};
+ST(0.0084994266,0.025462386,0,0.006650898,0.018174199,0,0.015416139,0.018002698,0){1014895.2,801243.34,1798828.3,943121.65,772347.91,1735136,804669.5,715593.27,1609995.5,609367.99,633022.27,1427830.3,370926.59,527557,1194733.1};
+ST(0.015498485,0.28248556,0,0.0067236406,0.28198319,0,0.0087746229,0.27470702,0){166274.63,76627.274,139476.7,-493262.57,-227172.13,-408686.72,803759.61,369685.4,649356.33,-1087394.1,-499127.77,-844695.79,1334475.8,610772.43,980930.37};
+ST(0.029380008,0.16405835,0,0.021502186,0.15931359,0,0.027609688,0.15620978,0){2021292.5,1630158.4,2023546.1,-2614335.2,-1947614.2,-2286520.9,-1254306.4,-1250943.8,-1726415,2982541.3,2191316.6,2510934.9,378860.61,824223.66,1400022.9};
+ST(0.0087746229,0.27470702,0,0.018422519,0.27450763,0,0.015498485,0.28248556,0){139476.7,282501.19,166274.63,-408686.72,-827496.14,-493262.57,649356.33,1313896,803759.61,-844695.79,-1707268.8,-1087394.1,980930.37,1979556.1,1334475.8};
+ST(0.014305262,0.26641769,0,0.018422519,0.27450763,0,0.0087746229,0.27470702,0){294901.31,282501.19,139476.7,-848621.76,-827496.14,-408686.72,1298521.9,1313896,649356.33,-1589572.3,-1707268.8,-844695.79,1686004.5,1979556.1,980930.37};
+ST(0.0084994266,0.025462386,0,0.016759526,0.025876157,0,0.014137494,0.034012185,0){1014895.2,1932221.9,1641076.4,943121.65,1791225.7,1435142,804669.5,1519509.7,1049094.4,609367.99,1136895.1,531342.12,370926.59,671081.1,-53364.585};
+ST(0.015416139,0.018002698,0,0.016759526,0.025876157,0,0.0084994266,0.025462386,0){1798828.3,1932221.9,1014895.2,1735136,1791225.7,943121.65,1609995.5,1519509.7,804669.5,1427830.3,1136895.1,609367.99,1194733.1,671081.1,370926.59};
+ST(0.025770754,0.10718168,0,0.032036001,0.10024616,0,0.034786476,0.1076516,0){2378738.7,2837469.6,2912738.3,-316264.13,-12660.65,-413135.58,-2653040.8,-2850146.6,-3267374.9,-1984140.6,-2824890.6,-2390915.6,932667.69,37524.098,1215377.6};
+ST(0.024938414,0.098415267,0,0.032036001,0.10024616,0,0.025770754,0.10718168,0){2383058.5,2837469.6,2378738.7,68195.72,-12660.65,-316264.13,-2312962.3,-2850146.6,-2653040.8,-2447461.4,-2824890.6,-1984140.6,-204726.33,37524.098,932667.69};
+ST(0.049797208,0.2214244,0,0.053910411,0.21448753,0,0.05718895,0.22161738,0){1551864.2,1667429.4,1508977,-3662861.4,-3752161.8,-3566099.1,3430735.4,3023771,3352547.9,-1003918.8,-28239.212,-1004251.2,-2065424.5,-2988983.1,-1983866.6};
+ST(0.1,0.21428571,0,0.093706234,0.20596864,0,0.1,0.20714286,0){0,360320.46,0,0,-758974.46,0,0,479351.87,0,0,228803.73,0,0,-732939.79,0};
+ST(0.066012722,0.055502179,0,0.064832361,0.062804408,0,0.056317057,0.058022103,0){3257272.9,3281120.4,3630316.8,2187557.2,1912310.8,2330872.5,399401.17,-254314.65,197001.66,-1519988.7,-2314932.7,-2007682.1,-2940625.1,-3410309.6,-3494460.7};
+ST(0.063265205,0.21633109,0,0.066992124,0.20847551,0,0.073708403,0.21517194,0){1505335.5,1540360.8,1225969.3,-3432481.9,-3311175.4,-2772471.1,2888962.8,2266191.6,2271379.1,-265885.87,706070.36,-92677.622,-2549234.8,-3078419.5,-2155133.8};
+ST(0.073708403,0.21517194,0,0.066992124,0.20847551,0,0.075422073,0.20645372,0){1225969.3,1540360.8,1273700.5,-2772471.1,-3311175.4,-2693470,2271379.1,2266191.6,1728669,-92677.622,706070.36,766631.5,-2155133.8,-3078419.5,-2583646.6};
+ST(0.015498485,0.28248556,0,0.017990672,0.29207379,0,0.0093450955,0.28843768,0){166274.63,86228.122,67949.514,-493262.57,-258100.45,-202850.84,803759.61,428229.3,334776.34,-1087394.1,-595472.42,-461793.67,1334475.8,758576.15,581935.08};
+ST(0.0093389246,0.011691623,0,0.01808004,0.0081573173,0,0.015416139,0.018002698,0){1120186.5,2085729.2,1798828.3,1103410.3,2070583.9,1735136,1070108.3,2040406.9,1609995.5,1020788.4,1995444.2,1427830.3,956114.18,1935913.6,1194733.1};
+ST(0.089949388,0.2453858,0,0.092168655,0.23668616,0,0.1,0.24285714,0){339950.36,307607.26,0,-911669.73,-792496.69,0,1193275.4,941630.33,0,-1095139.7,-691810.02,0,648419.14,148523.72,0};
+ST(0.077013163,0.11736903,0,0.074105201,0.11070107,0,0.082583958,0.10907049,0){2095773.2,2359475.3,1698614.9,-691227.47,-471755.94,-286603.09,-2559181.5,-2736894.8,-1936849,-1023961.4,-1717960.7,-1323464.6,1873161.8,1362139.4,836522.31};
+ST(0.1,0.13571429,0,0.0910478,0.13167545,0,0.1,0.12857143,0){0,831136.87,0,0,-514132.23,0,0,-1027305.8,0,0,122313.64,0,0,1073956.7,0};
+ST(0.087331535,0.0958472,0,0.081743274,0.092625466,0,0.08812606,0.087328167,0){1318484.3,1862860,1269155.7,98077.228,243386.47,279658.57,-1213131.9,-1587731,-927894.68,-1401481.2,-2038652.4,-1412053.3,-292629.72,-717394.49,-795447.99};
+ST(0.091053567,0.10618538,0,0.091758141,0.11296708,0,0.082583958,0.10907049,0){914271.31,824791.32,1698614.9,-104388.15,-201020.76,-286603.09,-1006721.9,-976886.6,-1936849,-787386.88,-537824.26,-1323464.6,309052.61,570097.26,836522.31};
+ST(0.092857143,0.3,0,0.091323117,0.29067423,0,0.1,0.29285714,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0};
+ST(0.1,0.0071428571,0,0.091308694,0.0093164623,0,0.092857143,0,0){0,1045151,863626.15,0,1035216.9,863662.39,0,1015442.8,863732,0,986027.05,863838.35,0,947106.05,863813.95};
+ST(0.011573719,0.041901165,0,0.0063343033,0.038958017,0,0.014137494,0.034012185,0){1347025.1,751213.74,1641076.4,1091815.8,627892.11,1435142,629744.45,401490.67,1049094.4,48353.226,109174.99,531342.12,-542301.86,-201236.23,-53364.585};
+ST(0.019499739,0.079597209,0,0.01882241,0.070374011,0,0.026270926,0.075674812,0){2040354.6,2018056.9,2630439.6,702945.71,970762.8,1063205.3,-1095289.5,-580354.6,-1137545.6,-2175701.2,-1830388.5,-2660659.2,-1830384.7,-2130853.3,-2599027.8};
+ST(0.011268327,0.1984065,0,0.015977634,0.20443356,0,0.007303543,0.20469543,0){682302.12,895779.15,422375.13,-1344805.9,-1862602.8,-880191.16,623458.07,1114548.4,531663.92,739532.85,659707.69,303952.91,-1341727.7,-1827076.9,-861341.37};
+ST(0.057323957,0.1204315,0,0.052058531,0.12554764,0,0.051013063,0.11801667,0){3051716.5,3065498.6,3161388.4,-1191883,-1512626.5,-1083065.4,-3778168.4,-3831818,-3873486.3,-1110713.1,-428428.64,-1463412.7,3101303,3614977.4,2911579};
+ST(0.089858368,0.18421461,0,0.091593501,0.1915477,0,0.084368038,0.19048099,0){692603.24,544831.72,992852.93,-1178349.1,-1004107.1,-1809621.2,133849.22,301623.68,495817.1,1084450.2,749822.54,1401810.9,-894447.98,-933881.71,-1649308.4};
+ST(0.015758122,0.23699049,0,0.0069516057,0.23320895,0,0.011838853,0.2301677,0){597291.98,288078.49,504229.49,-1541119.1,-728952.19,-1254859.2,1837947.1,827497.2,1363834.1,-1363109.4,-537397.4,-775392.51,315646.37,-5267.3055,-209768.04};
+ST(0.054794838,0.043915046,0,0.053426379,0.049768916,0,0.046341114,0.044942776,0){3735662.6,3727873.1,3748809.1,2959425,2738031.5,2933624.2,1568238.5,1021148,1480431.3,-148813.91,-966926.63,-294933.53,-1835117.4,-2698501,-2006921.6};
+ST(0,0.28571429,0,0.0067236406,0.28198319,0,0.0093450955,0.28843768,0){0,76627.274,67949.514,0,-227172.13,-202850.84,0,369685.4,334776.34,0,-499127.77,-461793.67,0,610772.43,581935.08};
+ST(0.0093389246,0.011691623,0,0.006650898,0.018174199,0,0,0.014285714,0){1120186.5,801243.34,0,1103410.3,772347.91,0,1070108.3,715593.27,0,1020788.4,633022.27,0,956114.18,527557,0};
+ST(0,0.078571429,0,0.0064539684,0.081629255,0,0,0.085714286,0){0,711139.06,0,0,222377.16,0,0,-419239.47,0,0,-772749.89,0,0,-595288.06,0};
+ST(0.085714286,0.3,0,0.081165886,0.29137431,0,0.091323117,0.29067423,0){0,97729.953,51002.156,0,-292395.17,-152526.43,0,484687.71,252617.29,0,-673055.06,-350336.87,0,855744.16,444691.33};
+ST(0.054876921,0.07294965,0,0.060416267,0.076932239,0,0.054828578,0.081464579,0){3558755.8,3380545.3,3492382.6,1580988.4,1302521.2,1101278.5,-1275447.3,-1576156.6,-2043909.2,-3423192.1,-3485992.8,-3789901.6,-3669097.1,-3253298.6,-2941538.5};
+ST(0.091308694,0.0093164623,0,0.081119523,0.0085521597,0,0.085714286,0,0){1045151,2167108.8,1683752,1035216.9,2149779.2,1683802.7,1015442.8,2115263.6,1683911.1,986027.05,2063869.7,1684108.7,947106.05,1995657.9,1684003.7};
+ST(0.044666369,0.11545829,0,0.042557423,0.10832344,0,0.050721192,0.10961634,0){3148096.1,3183930.6,3257974.6,-920013.3,-492142.06,-583831.78,-3799301.5,-3600076,-3737290.3,-1769018.1,-2551523.2,-2483878.9,2547335.8,1442840.6,1698581.7};
+ST(0.076498673,0.26519709,0,0.083190767,0.25723975,0,0.085115353,0.26563346,0){473307.48,434158.6,313056.52,-1357765.2,-1216864.4,-899063.8,2063933,1759626.8,1369900.4,-2499100.3,-1955417.3,-1665255.4,2605934.6,1765235.2,1747205.8};
+ST(0.084917502,0.034253561,0,0.082493405,0.042375289,0,0.075978544,0.034466341,0){1742331.8,1978611.8,2615244.9,1520580.8,1595319.9,2278283.7,1105294,902966.17,1647758.2,549324.68,35643.43,804880.96,-76880.401,-838916.97,-142067.87};
+ST(0.061244461,0.14481879,0,0.068478919,0.13862632,0,0.069467767,0.146519,0){2643484.5,2426951.1,2287173.5,-2356788.3,-1850187.5,-2120501.9,-2899198.4,-2866745.3,-2441744.6,2042509.4,1169007.7,1942651.5,3121060.9,3144665.9,2583122};
+ST(0.030075176,0.23324008,0,0.022740693,0.23189018,0,0.026971271,0.22659033,0){1077047.3,887604.04,1090633.5,-2725827,-2230116.3,-2658504.1,3095770.8,2485475.6,2731189,-2013325.9,-1529145.6,-1267784.1,-13872.597,-172982.46,-909068.56};
+ST(0.071449289,0.19423207,0,0.076430303,0.18837043,0,0.079090117,0.19794942,0){1594804.6,1444535.6,1206859.6,-3019964.8,-2574453.4,-2368529.7,1103926.4,569102.25,1073015.3,2033518.7,2129625.3,1335740.9,-2921575.1,-2235391.7,-2359414.1};
+ST(0.01062282,0.18656765,0,0.0066871595,0.19241823,0,0,0.18571429,0){711483.53,432113.5,0,-1243147.4,-803518.34,0,217509.34,258472.73,0,1080570.1,581490.34,0,-1025407.6,-758588.26,0};
+ST(0.028699663,0.054481756,0,0.032659307,0.059686042,0,0.025221599,0.062165695,0){2920693,3158137.1,2618029.3,1995520.8,1964024.3,1547191.2,438210.61,27282.242,-156575.4,-1257984.1,-1919818.3,-1796512.5,-2556170.3,-3141270.1,-2702051.5};
+ST(0.032911969,0.081185013,0,0.033761495,0.088496681,0,0.027903545,0.087518505,0){3037931.3,3029395.9,2674848,971274.35,608605.12,580994.77,-1756226.8,-2298547.5,-1967676.8,-3289165.4,-3368980,-2976106,-2584916.3,-1747439.7,-1655065.1};
+ST(0.0084994266,0.025462386,0,0.0058133292,0.032528446,0,0,0.028571429,0){1014895.2,694559.72,0,943121.65,614750.96,0,804669.5,464300.7,0,609367.99,260495.38,0,370926.59,26512.55,0};
+ST(0,0.27142857,0,0.0060732531,0.2674669,0,0.0087746229,0.27470702,0){0,124750.88,139476.7,0,-359918.85,-408686.72,0,553735.12,649356.33,0,-683931.42,-844695.79,0,735399.5,980930.37};
+ST(0.007303543,0.20469543,0,0.015977634,0.20443356,0,0.013229009,0.21171696,0){422375.13,895779.15,698716.07,-880191.16,-1862602.8,-1540332.8,531663.92,1114548.4,1156621.3,303952.91,659707.69,147278.69,-861341.37,-1827076.9,-1334554.8};
+ST(0.036912897,0.21765752,0,0.045116599,0.21481108,0,0.042541479,0.22296234,0){1486590.9,1654487.5,1481591,-3421295.1,-3731787.4,-3531706.6,2965983.4,3030991.5,3405357.4,-438566.7,-73694.316,-1180392.3,-2395869.1,-2938909.4,-1772446.7};
+ST(0.038009007,0.015147577,0,0.029163144,0.015558324,0,0.031710863,0.0075461758,0){3597209.6,3068207,3254919.5,3506943.3,2986953.6,3234618.2,3328697.3,2826596.5,3194153.7,3067010.9,2591406.1,3133832.1,2728518.9,2287504.7,3053845.3};
+ST(0.077069107,0.15686929,0,0.070175425,0.16144206,0,0.070477538,0.15360968,0){1743907.9,2074683.8,2153625.7,-1994600,-2570674.4,-2316413.6,-1457243.4,-1460177,-1978592.7,2204191.1,2919916.2,2466066.8,1140253.2,762077.82,1792310.4};
+ST(0.077393474,0.16425214,0,0.070175425,0.16144206,0,0.077069107,0.15686929,0){1650679.7,2074683.8,1743907.9,-2141613.9,-2570674.4,-1994600,-1013799.5,-1460177,-1457243.4,2443278.1,2919916.2,2204191.1,287063.28,762077.82,1140253.2};
+ST(0.060825265,0.17090728,0,0.054395265,0.16699477,0,0.061476805,0.16269562,0){2288734.2,2465605.5,2391378.9,-3282960.5,-3338618.7,-3025373.1,-862639.89,-1283530.8,-1589341.3,3657845.3,3793219.5,3446908.2,-726586.11,-59660.123,675366.83};
+ST(0.08415119,0.061061125,0,0.079822506,0.065677674,0,0.076938259,0.060604721,0){1759442.9,2163855.5,2443533.2,1064240.3,1180001.4,1491930.8,-51487.645,-340376.77,-40674.57,-1146904.2,-1706002.2,-1557435.8,-1789550.6,-2296197.5,-2468002.6};
+ST(0.038843793,0.21103197,0,0.045116599,0.21481108,0,0.036912897,0.21765752,0){1637090.1,1654487.5,1486590.9,-3590120.4,-3731787.4,-3421295.1,2645890.8,3030991.5,2965983.4,433646.44,-73694.316,-438566.7,-3163532.2,-2938909.4,-2395869.1};
+ST(0.049165273,0.076760106,0,0.054876921,0.07294965,0,0.054828578,0.081464579,0){3570137.5,3558755.8,3492382.6,1384898,1580988.4,1101278.5,-1648055.9,-1275447.3,-2043909.2,-3672308.6,-3423192.1,-3789901.6,-3449021.3,-3669097.1,-2941538.5};
+ST(0.016927821,0.11108648,0,0.017861336,0.10270337,0,0.025770754,0.10718168,0){1644246.3,1773538.4,2378738.7,-340994.5,-87655.931,-316264.13,-1914445.6,-1856823.6,-2653040.8,-1176430.8,-1677437.3,-1984140.6,981584.41,261812.45,932667.69};
+ST(0.028699663,0.054481756,0,0.025221599,0.062165695,0,0.021658338,0.054940441,0){2920693,2618029.3,2341024.9,1995520.8,1547191.2,1587273.2,438210.61,-156575.4,322446.89,-1257984.1,-1796512.5,-1046241,-2556170.3,-2702051.5,-2078353.5};
+ST(0.050721192,0.10961634,0,0.054240748,0.10280037,0,0.059543685,0.10776494,0){3257974.6,3302360.6,3132791.5,-583831.78,-169115.68,-451048.14,-3737290.3,-3462856.5,-3519016.9,-2483878.9,-3116478.2,-2561357.9,1698581.7,505791.56,1326599.2};
+ST(0.059543685,0.10776494,0,0.054240748,0.10280037,0,0.061027247,0.098743066,0){3132791.5,3302360.6,3173016.6,-451048.14,-169115.68,72008.811,-3519016.9,-3462856.5,-3099474,-2561357.9,-3116478.2,-3241975.4,1326599.2,505791.56,-216202.29};
+ST(0.026971271,0.22659033,0,0.034969012,0.22634925,0,0.030075176,0.23324008,0){1090633.5,1299939.6,1077047.3,-2658504.1,-3164156.1,-2725827,2731189,3237729.2,3095770.8,-1267784.1,-1478956,-2013325.9,-909068.56,-1117524.9,-13872.597};
+ST(0.060432552,0.20227914,0,0.066992124,0.20847551,0,0.059551151,0.20970619,0){1798951.1,1540360.8,1688112.8,-3671781.8,-3311175.4,-3664209.4,2023610.8,2266191.6,2601193.1,1565241.8,706070.36,619333.89,-3653837,-3078419.5,-3326584.6};
+ST(0.066799394,0.09162077,0,0.058212185,0.089881183,0,0.064352171,0.083117586,0){2974160.1,3344291.6,3167194.8,440022.16,593905.21,915483.69,-2469083.6,-2645013.4,-1987167.2,-3274492.4,-3708817.1,-3477240.4,-1290097.2,-1722713.3,-2495770};
+ST(0.082942949,0.21818591,0,0.081656406,0.2108727,0,0.089437553,0.21298247,0){823054.75,951384.03,556322.48,-1901094.8,-2083808.1,-1238115.4,1667014.3,1528962.6,961021.23,-282341.7,263916.4,60411.18,-1297502.9,-1843401,-1035404.3};
+ST(0.072126291,0.10515927,0,0.069968451,0.098831219,0,0.079063451,0.10043005,0){2539730.3,2730411,2051820.1,-241283.81,57648.531,-16056.497,-2758172.2,-2671597.7,-2067914.3,-2254933.2,-2785714.6,-2035845.1,717337.89,-173126.8,48244.512};
+ST(0.1,0.014285714,0,0.093571257,0.018380777,0,0.091308694,0.0093164623,0){0,774815.13,1045151,0,746204.54,1035216.9,0,690036.86,1015442.8,0,608388.09,986027.05,0,504051.02,947106.05};
+ST(0.091323117,0.29067423,0,0.093593186,0.28160993,0,0.1,0.28571429,0){51002.156,74588.283,0,-152526.43,-221009.65,0,252617.29,359269.18,0,-350336.87,-484261.41,0,444691.33,591230.88,0};
+ST(0.027746664,0.13122119,0,0.030046638,0.13690443,0,0.021167753,0.13548502,0){2296333.1,2369378.2,1816935.7,-1399007.9,-1721516.8,-1266652.3,-2843055.5,-2840145.3,-2200669.4,288094.78,944948.24,600161.11,2955532.6,3098367.4,2382629.9};
+ST(0.044666369,0.11545829,0,0.051013063,0.11801667,0,0.045375723,0.12284566,0){3148096.1,3161388.4,3072436,-920013.3,-1083065.4,-1348503.3,-3799301.5,-3873486.3,-3829159.4,-1769018.1,-1463412.7,-800055.99,2547335.8,2911579,3380414.3};
+ST(0.1,0.085714286,0,0.093922759,0.092262381,0,0.08812606,0.087328167,0){0,652083.63,1269155.7,0,89312.894,279658.57,0,-550573,-927894.68,0,-715327.2,-1412053.3,0,-262838.8,-795447.99};
+ST(0.056766116,0.23329497,0,0.053624899,0.22742186,0,0.059957308,0.22757204,0){1298096.4,1430137,1366903.5,-3286228.7,-3503302.1,-3351367.9,3735031.6,3648370.9,3498598.8,-2434254.7,-1785483,-1727811.3,-7070.0355,-1060301.4,-990620.01};
+ST(0.032911969,0.081185013,0,0.025411973,0.082310594,0,0.026270926,0.075674812,0){3037931.3,2525130.6,2630439.6,971274.35,762374.09,1063205.3,-1756226.8,-1532614.6,-1137545.6,-3289165.4,-2757779.1,-2660659.2,-2584916.3,-2058136.4,-2599027.8};
+ST(0.1,0.057142857,0,0.09230899,0.063522919,0,0.08944657,0.05485846,0){0,877619.52,1211526.2,0,503392.8,822600.19,0,-85524.836,169573.91,0,-638068.15,-537958.1,0,-918939.46,-1073022.7};
+ST(0.034969012,0.22634925,0,0.037546984,0.23452457,0,0.030075176,0.23324008,0){1299939.6,1205921.7,1077047.3,-3164156.1,-3072707.6,-2725827,3237729.2,3550700.1,3095770.8,-1478956,-2423829.8,-2013325.9,-1117524.9,201013.93,-13872.597};
+ST(0.073708403,0.21517194,0,0.081656406,0.2108727,0,0.082942949,0.21818591,0){1225969.3,951384.03,823054.75,-2772471.1,-2083808.1,-1901094.8,2271379.1,1528962.6,1667014.3,-92677.622,263916.4,-282341.7,-2155133.8,-1843401,-1297502.9};
+ST(0.038464606,0.12667013,0,0.033010101,0.13109378,0,0.030575169,0.1246812,0){2859316.3,2584208,2526238.7,-1476046.2,-1567613,-1202245.8,-3573486.5,-3200932.4,-3156412.2,-252868.56,308418.11,-451924.48,3451249.3,3322264.5,2919641.1};
+ST(0.031264826,0.29263185,0,0.028198926,0.28535727,0,0.036602132,0.28491153,0){124484.17,230200.16,279518.56,-372709.78,-685197.76,-831596.18,618717.86,1124120.6,1362985.6,-861054.65,-1536674.3,-1860498.2,1098239.8,1912913.1,2311728.5};
+ST(0.030575169,0.1246812,0,0.033010101,0.13109378,0,0.027746664,0.13122119,0){2526238.7,2584208,2296333.1,-1202245.8,-1567613,-1399007.9,-3156412.2,-3200932.4,-2843055.5,-451924.48,308418.11,288094.78,2919641.1,3322264.5,2955532.6};
+ST(0.077013163,0.11736903,0,0.070840483,0.12204614,0,0.069025318,0.11622387,0){2095773.2,2470738.2,2631986.5,-691227.47,-1044803.2,-808686.45,-2559181.5,-3073782.1,-3192250.9,-1023961.4,-729197.53,-1402768.4,1873161.8,2652961,2220554.1};
+ST(0.037705658,0.25939989,0,0.034582704,0.26623209,0,0.030217898,0.25971254,0){758443.36,604041.77,660621.26,-2140288.6,-1737386.1,-1866014.4,3141072.6,2655775,2744196,-3582615.2,-3245580.1,-3141188.1,3385872.9,3433603.3,2987009.7};
+ST(0.084604507,0.15255901,0,0.08264437,0.14444108,0,0.09156348,0.14589395,0){1258841.2,1463951.5,734092.88,-1326319,-1293607.4,-670961.7,-1187789.9,-1614532.1,-791796.8,1390056.3,1105781,602866.55,1113216.6,1743195.6,843431.47};
+ST(0.09156348,0.14589395,0,0.08264437,0.14444108,0,0.087083587,0.13880919,0){734092.88,1463951.5,1144744.3,-670961.7,-1293607.4,-877072.07,-791796.8,-1614532.1,-1349889.8,602866.55,1105781,561444.4,843431.47,1743195.6,1481228.8};
+ST(0.034582704,0.26623209,0,0.027951851,0.26533243,0,0.030217898,0.25971254,0){604041.77,539100.43,660621.26,-1737386.1,-1547025.6,-1866014.4,2655775,2353298.6,2744196,-3245580.1,-2852826.8,-3141188.1,3433603.3,2980285,2987009.7};
+ST(0.043573225,0.18196099,0,0.038433858,0.18005903,0,0.041643161,0.17482395,0){2202933.2,2131117.1,2284160.6,-3650165.7,-3450732.6,-3458410.7,195066.32,5612.0128,-506290.81,3522129.2,3447337.8,3718851.8,-2509350,-2140463.9,-1405815.9};
+ST(0.019247887,0.048569646,0,0.014691551,0.054118398,0,0.013132659,0.04767246,0){2135187.8,1659245.8,1507774.2,1594654.5,1140472.1,1139737.5,650408.09,265092.56,493500.09,-458538.7,-693242.8,-273193.01,-1451674.1,-1435183.5,-973395.4};
+ST(0.021167753,0.13548502,0,0.023379755,0.12686903,0,0.027746664,0.13122119,0){1816935.7,2047772.9,2296333.1,-1266652.3,-1065433.1,-1399007.9,-2200669.4,-2558991,-2843055.5,600161.11,-162203.53,288094.78,2382629.9,2481221.5,2955532.6};
+ST(0.044666369,0.11545829,0,0.038084092,0.1145524,0,0.042557423,0.10832344,0){3148096.1,2981407.2,3183930.6,-920013.3,-818508.93,-492142.06,-3799301.5,-3575257.7,-3600076,-1769018.1,-1775238,-2551523.2,2547335.8,2287308.3,1442840.6};
+ST(0.021658338,0.054940441,0,0.014691551,0.054118398,0,0.019247887,0.048569646,0){2341024.9,1659245.8,2135187.8,1587273.2,1140472.1,1594654.5,322446.89,265092.56,650408.09,-1046241,-693242.8,-458538.7,-2078353.5,-1435183.5,-1451674.1};
+ST(0.061027247,0.098743066,0,0.065931692,0.10408722,0,0.059543685,0.10776494,0){3173016.6,2911358.9,3132791.5,72008.811,-218409.17,-451048.14,-3099474,-3113407,-3519016.9,-3241975.4,-2661455,-2561357.9,-216202.29,651464.78,1326599.2};
+ST(0,0.22142857,0,0.0051799073,0.21317882,0,0.010546892,0.2198034,0){0,276031.48,514716.79,0,-615227.88,-1201974.2,0,479976.29,1090194.6,0,25450.705,-253690.09,0,-511551.59,-751659.26};
+ST(0,0.12857143,0,0.0072553778,0.13224921,0,0,0.13571429,0){0,674958.82,0,0,-425463.67,0,0,-832230.25,0,0,117822.57,0,0,875622.71,0};
+ST(0.059543685,0.10776494,0,0.05615957,0.1141762,0,0.050721192,0.10961634,0){3132791.5,3147681.4,3257974.6,-451048.14,-840990.83,-583831.78,-3519016.9,-3764018.8,-3737290.3,-2561357.9,-1917372.9,-2483878.9,1326599.2,2358868.4,1698581.7};
+ST(0.043491003,0.26677795,0,0.045592054,0.27439642,0,0.037999827,0.27482627,0){657627.62,513714.39,474219.19,-1894105.9,-1504437.2,-1389905,2903724.9,2387679.2,2209621.2,-3565612.1,-3100344.3,-2876809.4,3800401.2,3591305.7,3345267.4};
+ST(0.075422073,0.20645372,0,0.081656406,0.2108727,0,0.073708403,0.21517194,0){1273700.5,951384.03,1225969.3,-2693470,-2083808.1,-2772471.1,1728669,1528962.6,2271379.1,766631.5,263916.4,-92677.622,-2583646.6,-1843401,-2155133.8};
+ST(0.048663579,0.053435419,0,0.042113175,0.053290167,0,0.046341114,0.044942776,0){3726394.8,3616583.4,3748809.1,2589713.3,2519252.9,2933624.2,663071.82,657513.67,1480431.3,-1465861.1,-1403801.4,-294933.53,-3147918.6,-3039615.4,-2006921.6};
+ST(0.074105201,0.11070107,0,0.076969725,0.10634022,0,0.082583958,0.10907049,0){2359475.3,2181001.1,1698614.9,-471755.94,-255488.75,-286603.09,-2736894.8,-2406546.5,-1936849,-1717960.7,-1869163.7,-1323464.6,1362139.4,756176.24,836522.31};
+ST(0.08812606,0.087328167,0,0.081743274,0.092625466,0,0.079265602,0.086677581,0){1269155.7,1862860,2114636.1,279658.57,243386.47,488789.06,-927894.68,-1587731,-1512904.7,-1412053.3,-2038652.4,-2351470.6,-795447.99,-717394.49,-1382326.1};
+ST(0.079090117,0.19794942,0,0.076430303,0.18837043,0,0.084368038,0.19048099,0){1206859.6,1444535.6,992852.93,-2368529.7,-2574453.4,-1809621.2,1073015.3,569102.25,495817.1,1335740.9,2129625.3,1401810.9,-2359414.1,-2235391.7,-1649308.4};
+ST(0.0071147476,0.24137211,0,0.0069516057,0.23320895,0,0.015758122,0.23699049,0){259907.57,288078.49,597291.98,-684802.64,-728952.19,-1541119.1,859611.54,827497.2,1837947.1,-720499.62,-537397.4,-1363109.4,317972.39,-5267.3055,315646.37};
+ST(0.075872285,0.081656016,0,0.074756101,0.075901522,0,0.082390534,0.079333541,0){2427639,2549479.1,1865676.5,758134.07,1021825.1,650380.91,-1432759.9,-1118145.3,-988603.29,-2638364.3,-2588166.7,-1983689.6,-2029677.1,-2507455.8,-1686881.4};
+ST(0,0.078571429,0,0.0060853536,0.074713803,0,0.0064539684,0.081629255,0){0,681675.12,711139.06,0,285253.65,222377.16,0,-277070.48,-419239.47,0,-678306.76,-772749.89,0,-685312.86,-595288.06};
+ST(0.050960377,0.23252058,0,0.053624899,0.22742186,0,0.056766116,0.23329497,0){1342135.9,1430137,1298096.4,-3383651.2,-3503302.1,-3286228.7,3804738.6,3648370.9,3735031.6,-2403721.7,-1785483,-2434254.7,-148681.88,-1060301.4,-7070.0355};
+ST(0.085714286,0.3,0,0.091323117,0.29067423,0,0.092857143,0.3,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0};
+ST(0.1,0.014285714,0,0.091308694,0.0093164623,0,0.1,0.0071428571,0){0,1045151,0,0,1035216.9,0,0,1015442.8,0,0,986027.05,0,0,947106.05,0};
+ST(0.056317057,0.058022103,0,0.061015306,0.048529238,0,0.066012722,0.055502179,0){3630316.8,3533367.8,3257272.9,2330872.5,2640342.3,2187557.2,197001.66,1080012.2,399401.17,-2007682.1,-753291.7,-1519988.7,-3494460.7,-2396723.8,-2940625.1};
+ST(0.092857143,0,0,0.091308694,0.0093164623,0,0.085714286,0,0){863626.15,1045151,1683752,863662.39,1035216.9,1683802.7,863732,1015442.8,1683911.1,863838.35,986027.05,1684108.7,863813.95,947106.05,1684003.7};
+ST(0.1,0.29285714,0,0.091323117,0.29067423,0,0.1,0.28571429,0){0,51002.156,0,0,-152526.43,0,0,252617.29,0,0,-350336.87,0,0,444691.33,0};
+ST(0.03928574,0.29335694,0,0.031264826,0.29263185,0,0.036602132,0.28491153,0){127378.94,124484.17,279518.56,-381522.06,-372709.78,-831596.18,633829.06,618717.86,1362985.6,-883092.25,-861054.65,-1860498.2,1127859.7,1098239.8,2311728.5};
+ST(0.038009007,0.015147577,0,0.031710863,0.0075461758,0,0.039686874,0.0066116125,0){3597209.6,3254919.5,3676489.9,3506943.3,3234618.2,3658909.3,3328697.3,3194153.7,3623831.1,3067010.9,3133832.1,3571457.2,2728518.9,3053845.3,3501797.4};
+ST(0.066803853,0.25459223,0,0.071915087,0.24816524,0,0.074279052,0.25633166,0){789541.66,803363.84,635900.39,-2193455.3,-2179152.4,-1777029.4,3110738.9,2928525.2,2553015.8,-3337877,-2836050.6,-2804423.5,2824240.3,1927975,2479429.3};
+ST(0.0071908097,0.26035264,0,0.013885016,0.25805955,0,0.014305262,0.26641769,0){179155.76,357160.64,294901.31,-507033.49,-1003688.5,-848621.76,748779.14,1459712.7,1298521.9,-863311.12,-1638678.7,-1589572.3,830950.48,1506406.6,1686004.5};
+ST(0,0.28571429,0,0.0045473776,0.2936365,0,0,0.29285714,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0};
+ST(0,0.0071428571,0,0.0045481906,0.0063920675,0,0,0.014285714,0){0,552257.15,0,0,549810.55,0,0,544927.47,0,0,537633.65,0,0,527798.54,0};
+ST(0.084604507,0.15255901,0,0.076625322,0.14929356,0,0.08264437,0.14444108,0){1258841.2,1845555.4,1463951.5,-1326319,-1818255.1,-1293607.4,-1187789.9,-1872475.3,-1614532.1,1390056.3,1790618.2,1105781,1113216.6,1898765.5,1743195.6};
+ST(0.041803352,0.076750149,0,0.047307891,0.081963043,0,0.041002292,0.08644635,0){3453761.9,3516083,3351345,1340279.2,1080946.4,787437.3,-1593440.1,-2102837.3,-2379027.1,-3552303.7,-3830300,-3725698.5,-3337911.6,-2905310.5,-2222336.9};
+ST(0,0.21428571,0,0.0051799073,0.21317882,0,0,0.22142857,0){0,276031.48,0,0,-615227.88,0,0,479976.29,0,0,25450.705,0,0,-511551.59,0};
+ST(0.082390534,0.079333541,0,0.074756101,0.075901522,0,0.080160084,0.071577727,0){1865676.5,2549479.1,2107851.9,650380.91,1021825.1,977984.82,-988603.29,-1118145.3,-676141.96,-1983689.6,-2588166.7,-1967920.1,-1686881.4,-2507455.8,-2205119.3};
+ST(0.065478411,0.24860928,0,0.071915087,0.24816524,0,0.066803853,0.25459223,0){912058.17,803363.84,789541.66,-2478342.9,-2179152.4,-2193455.3,3344041.2,2928525.2,3110738.9,-3264436.9,-2836050.6,-3337877,2261773.6,1927975,2824240.3};
+ST(0.08812606,0.087328167,0,0.079265602,0.086677581,0,0.082390534,0.079333541,0){1269155.7,2114636.1,1865676.5,279658.57,488789.06,650380.91,-927894.68,-1512904.7,-988603.29,-1412053.3,-2351470.6,-1983689.6,-795447.99,-1382326.1,-1686881.4};
+ST(0.064832361,0.062804408,0,0.059054943,0.066788508,0,0.056317057,0.058022103,0){3281120.4,3499189.3,3630316.8,1912310.8,1856149.2,2330872.5,-254314.65,-658492.2,197001.66,-2314932.7,-2864039.1,-2007682.1,-3410309.6,-3725081.1,-3494460.7};
+ST(0.045416206,0.061541227,0,0.047469022,0.070467195,0,0.041057987,0.068843254,0){3642820.9,3608010.8,3488848.8,2181474.8,1730907.5,1752771.3,-155055.51,-1046792,-855539,-2429600.5,-3280034.9,-3038218.5,-3730025.8,-3807136.9,-3709409.4};
+ST(0.081119523,0.0085521597,0,0.078020383,0.017034313,0,0.073684623,0.0112317,0){2167108.8,2461848.1,2850123.3,2149779.2,2383750.6,2810738.2,2115263.6,2230032.5,2732509.2,2063869.7,2005590.6,2616540.6,1995657.9,1717239.5,2464223.2};
+ST(0.073754091,0.28851618,0,0.078222118,0.28277283,0,0.081165886,0.29137431,0){171229.59,220930.92,97729.953,-511212.67,-655625.13,-292395.17,843808.82,1069057.6,484687.71,-1164215.8,-1447830.3,-673055.06,1467609.3,1779434.3,855744.16};
+ST(0.029124573,0.24658198,0,0.025641665,0.25311603,0,0.02133326,0.24577003,0){849052.23,680173.91,675269.21,-2288340.2,-1879847.5,-1813848.4,3030093.5,2635470.4,2383092.9,-2848204.4,-2768550.2,-2204305.3,1797881.3,2247361.6,1333319.6};
+ST(0.02133326,0.24577003,0,0.025641665,0.25311603,0,0.018179834,0.25267212,0){675269.21,680173.91,514543.14,-1813848.4,-1879847.5,-1419813.2,2383092.9,2635470.4,1983439.5,-2204305.3,-2768550.2,-2069793.3,1333319.6,2247361.6,1657747.8};
+ST(0.036912897,0.21765752,0,0.030490983,0.2108424,0,0.038843793,0.21103197,0){1486590.9,1428644.1,1637090.1,-3421295.1,-3128471,-3590120.4,2965983.4,2293671,2645890.8,-438566.7,399562.24,433646.44,-2395869.1,-2769801.9,-3163532.2};
+ST(0.089437553,0.21298247,0,0.091864029,0.22106993,0,0.082942949,0.21818591,0){556322.48,394005.54,823054.75,-1238115.4,-927852.61,-1901094.8,961021.23,863120.02,1667014.3,60411.18,-241435.16,-282341.7,-1035404.3,-536498.87,-1297502.9};
+ST(0.0060732531,0.2674669,0,0.0071908097,0.26035264,0,0.014305262,0.26641769,0){124750.88,179155.76,294901.31,-359918.85,-507033.49,-848621.76,553735.12,748779.14,1298521.9,-683931.42,-863311.12,-1589572.3,735399.5,830950.48,1686004.5};
+ST(0.082583958,0.10907049,0,0.08466046,0.11619385,0,0.077013163,0.11736903,0){1698614.9,1475783,2095773.2,-286603.09,-452604.25,-691227.47,-1936849,-1789662.1,-2559181.5,-1323464.6,-788262.21,-1023961.4,836522.31,1243195.1,1873161.8};
+ST(0.060672554,0.13561545,0,0.068478919,0.13862632,0,0.061244461,0.14481879,0){2778852.8,2426951.1,2643484.5,-1944873,-1850187.5,-2356788.3,-3362653.4,-2866745.3,-2899198.4,935707.85,1169007.7,2042509.4,3643681.7,3144665.9,3121060.9};
+ST(0.037999827,0.27482627,0,0.045044357,0.28188841,0,0.036602132,0.28491153,0){474219.19,362990.51,279518.56,-1389905,-1075960.6,-831596.18,2209621.2,1750378.7,1362985.6,-2876809.4,-2362097.1,-1860498.2,3345267.4,2889034,2311728.5};
+ST(0.014137494,0.034012185,0,0.0063343033,0.038958017,0,0.0058133292,0.032528446,0){1641076.4,751213.74,694559.72,1435142,627892.11,614750.96,1049094.4,401490.67,464300.7,531342.12,109174.99,260495.38,-53364.585,-201236.23,26512.55};
+ST(0.070865224,0.080352924,0,0.072044079,0.08604506,0,0.064352171,0.083117586,0){2808030.6,2688599.4,3167194.8,934415.1,649473.83,915483.69,-1562677.5,-1882262.6,-1987167.2,-3017110.1,-2986497.2,-3477240.4,-2458745.5,-1825996.4,-2495770};
+ST(0.061476805,0.16269562,0,0.067098511,0.16826118,0,0.060825265,0.17090728,0){2391378.9,2121688.2,2288734.2,-3025373.1,-2928224.5,-3282960.5,-1589341.3,-1008555.7,-862639.89,3446908.2,3311710.7,3657845.3,675366.83,-250662.47,-726586.11};
+ST(0.052494391,0.065958781,0,0.047469022,0.070467195,0,0.045416206,0.061541227,0){3640248,3608010.8,3642820.9,1971511.2,1730907.5,2181474.8,-601016.65,-1046792,-155055.51,-2898090,-3280034.9,-2429600.5,-3866942,-3807136.9,-3730025.8};
+ST(0.034786476,0.1076516,0,0.030466665,0.11568191,0,0.025770754,0.10718168,0){2912738.3,2608170,2378738.7,-413135.58,-773675.45,-316264.13,-3267374.9,-3152461.4,-2653040.8,-2390915.6,-1443702.3,-1984140.6,1215377.6,2136967.4,932667.69};
+ST(0.054828578,0.081464579,0,0.058212185,0.089881183,0,0.049739958,0.088394034,0){3492382.6,3344291.6,3472240.4,1101278.5,593905.21,703521.31,-2043909.2,-2645013.4,-2626240.1,-3789901.6,-3708817.1,-3862017.3,-2941538.5,-1722713.3,-2018648.2};
+ST(0.079063451,0.10043005,0,0.069968451,0.098831219,0,0.07492972,0.092844339,0){2051820.1,2730411,2431427.6,-16056.497,57648.531,308451.38,-2067914.3,-2671597.7,-2083891.4,-2035845.1,-2785714.6,-2656803.1,48244.512,-173126.8,-910298.79};
+ST(0.013878694,0.17880836,0,0.020636298,0.17424253,0,0.021251228,0.18136297,0){971566.52,1433869.3,1398279.8,-1548960.4,-2154082.5,-2300353.4,-51095.574,-351921.61,85724.805,1579530,2330929.4,2245163.6,-887966.26,-819073.82,-1534338.6};
+ST(0.085905658,0.016824409,0,0.078020383,0.017034313,0,0.081119523,0.0085521597,0){1656238,2461848.1,2167108.8,1604967.9,2383750.6,2149779.2,1504009.2,2230032.5,2115263.6,1356492.3,2005590.6,2063869.7,1166855,1717239.5,1995657.9};
+ST(0.081165886,0.29137431,0,0.078222118,0.28277283,0,0.08596482,0.28314521,0){97729.953,220930.92,145967.81,-292395.17,-655625.13,-433371.98,484687.71,1069057.6,707326.96,-673055.06,-1447830.3,-959333.22,855744.16,1779434.3,1181452.3};
+ST(0.021167753,0.13548502,0,0.017312959,0.14496605,0,0.012304267,0.13852123,0){1816935.7,1456929,1094693.2,-1266652.3,-1303417.8,-832176.34,-2200669.4,-1594293.7,-1294374.3,600161.11,1135517.7,521821.54,2382629.9,1713822.2,1419655.5};
+ST(0.026018946,0.14387862,0,0.017312959,0.14496605,0,0.021167753,0.13548502,0){2064539,1456929,1816935.7,-1800072.3,-1303417.8,-1266652.3,-2295230.1,-1594293.7,-2200669.4,1506177.8,1135517.7,600161.11,2488196.2,1713822.2,2382629.9};
+ST(0.014137494,0.034012185,0,0.0058133292,0.032528446,0,0.0084994266,0.025462386,0){1641076.4,694559.72,1014895.2,1435142,614750.96,943121.65,1049094.4,464300.7,804669.5,531342.12,260495.38,609367.99,-53364.585,26512.55,370926.59};
+ST(0.0087746229,0.27470702,0,0.0060732531,0.2674669,0,0.014305262,0.26641769,0){139476.7,124750.88,294901.31,-408686.72,-359918.85,-848621.76,649356.33,553735.12,1298521.9,-844695.79,-683931.42,-1589572.3,980930.37,735399.5,1686004.5};
+ST(0.045375723,0.12284566,0,0.040442009,0.11996282,0,0.044666369,0.11545829,0){3072436,2999410,3148096.1,-1348503.3,-1143461.2,-920013.3,-3829159.4,-3706983.7,-3799301.5,-800055.99,-1150363.3,-1769018.1,3380414.3,2995190.5,2547335.8};
+ST(0,0.18571429,0,0.0066871595,0.19241823,0,0,0.19285714,0){0,432113.5,0,0,-803518.34,0,0,258472.73,0,0,581490.34,0,0,-758588.26,0};
+ST(0.038464606,0.12667013,0,0.030575169,0.1246812,0,0.035619257,0.12028764,0){2859316.3,2526238.7,2821397.9,-1476046.2,-1202245.8,-1093830.4,-3573486.5,-3156412.2,-3491178.8,-252868.56,-451924.48,-1043884.2,3451249.3,2919641.1,2851838.9};
+ST(0.025770754,0.10718168,0,0.017861336,0.10270337,0,0.024938414,0.098415267,0){2378738.7,1773538.4,2383058.5,-316264.13,-87655.931,68195.72,-2653040.8,-1856823.6,-2312962.3,-1984140.6,-1677437.3,-2447461.4,932667.69,261812.45,-204726.33};
+ST(0.022740693,0.23189018,0,0.025350652,0.23917347,0,0.015758122,0.23699049,0){887604.04,868665.73,597291.98,-2230116.3,-2265304,-1541119.1,2485475.6,2773502.3,1837947.1,-1529145.6,-2193941.8,-1363109.4,-172982.46,753574.67,315646.37};
+ST(0.032911969,0.081185013,0,0.041803352,0.076750149,0,0.041002292,0.08644635,0){3037931.3,3453761.9,3351345,971274.35,1340279.2,787437.3,-1756226.8,-1593440.1,-2379027.1,-3289165.4,-3552303.7,-3725698.5,-2584916.3,-3337911.6,-2222336.9};
+ST(0.0087746229,0.27470702,0,0.0067236406,0.28198319,0,0,0.27857143,0){139476.7,76627.274,0,-408686.72,-227172.13,0,649356.33,369685.4,0,-844695.79,-499127.77,0,980930.37,610772.43,0};
+ST(0,0.021428571,0,0.006650898,0.018174199,0,0.0084994266,0.025462386,0){0,801243.34,1014895.2,0,772347.91,943121.65,0,715593.27,804669.5,0,633022.27,609367.99,0,527557,370926.59};
+ST(0.013229009,0.21171696,0,0.018343869,0.21720619,0,0.010546892,0.2198034,0){698716.07,888277.19,514716.79,-1540332.8,-2037897.4,-1201974.2,1156621.3,1749211,1090194.6,147278.69,-225952.88,-253690.09,-1334554.8,-1457259.1,-751659.26};
+ST(0.010546892,0.2198034,0,0.018343869,0.21720619,0,0.017207343,0.22323305,0){514716.79,888277.19,781289.63,-1201974.2,-2037897.4,-1865590.4,1090194.6,1749211,1807835.2,-253690.09,-225952.88,-643322.1,-751659.26,-1457259.1,-915362.92};
+ST(0.060432552,0.20227914,0,0.06966854,0.20076802,0,0.066992124,0.20847551,0){1798951.1,1570520.4,1540360.8,-3671781.8,-3162888.4,-3311175.4,2023610.8,1636334.6,2266191.6,1565241.8,1503948.1,706070.36,-3653837,-3161601.9,-3078419.5};
+ST(0.066012722,0.055502179,0,0.073604017,0.054819307,0,0.070754378,0.060222618,0){3257272.9,2744584.6,2932444.5,2187557.2,1864679.8,1804303.3,399401.17,386939.94,-17984.254,-1519988.7,-1214908.7,-1833384.6,-2940625.1,-2427603.9,-2943704.7};
+ST(0.025770754,0.10718168,0,0.023213665,0.1150537,0,0.016927821,0.11108648,0){2378738.7,2130593.3,1644246.3,-316264.13,-605772.32,-340994.5,-2653040.8,-2564157.8,-1914445.6,-1984140.6,-1229375.9,-1176430.8,932667.69,1684092.7,981584.41};
+ST(0.024008584,0.022367291,0,0.016759526,0.025876157,0,0.015416139,0.018002698,0){2639060.6,1932221.9,1798828.3,2494948.4,1791225.7,1735136,2214593.6,1519509.7,1609995.5,1813324.4,1136895.1,1427830.3,1312931.3,671081.1,1194733.1};
+ST(0.076938259,0.060604721,0,0.079822506,0.065677674,0,0.072323403,0.067507008,0){2443533.2,2163855.5,2781512.1,1491930.8,1180001.4,1448400.9,-40674.57,-340376.77,-578922.09,-1557435.8,-1706002.2,-2328912.3,-2468002.6,-2296197.5,-2963263.7};
+ST(0.015498485,0.28248556,0,0.018422519,0.27450763,0,0.023483408,0.28013687,0){166274.63,282501.19,270985.88,-493262.57,-827496.14,-801278.39,803759.61,1313896,1297043.7,-1087394.1,-1707268.8,-1736920.8,1334475.8,1979556.1,2101746.5};
+ST(0.047556344,0.24377674,0,0.043027686,0.24899973,0,0.040431855,0.24188745,0){1122639.4,999522.33,1110505,-2989881.7,-2720190.5,-2932804,3850350.4,3683283.3,3702149.5,-3414324.1,-3620573.8,-3142324.5,1828478.4,2549278.8,1453973.2};
+ST(0.092295863,0.26000779,0,0.083190767,0.25723975,0,0.090077759,0.25268961,0){193329.27,434158.6,291813.61,-546576.12,-1216864.4,-805257.31,805368.84,1759626.8,1125037.4,-924990.4,-1955417.3,-1174248.1,884724.5,1765235.2,940920.06};
+ST(0.085115353,0.26563346,0,0.083190767,0.25723975,0,0.092295863,0.26000779,0){313056.52,434158.6,193329.27,-899063.8,-1216864.4,-546576.12,1369900.4,1759626.8,805368.84,-1665255.4,-1955417.3,-924990.4,1747205.8,1765235.2,884724.5};
+ST(0.08974924,0.047235181,0,0.082493405,0.042375289,0,0.092141527,0.03991184,0){1190814.4,1978611.8,927649.93,905328.07,1595319.9,767955.56,402804.56,902966.17,476054.53,-196265.4,35643.43,102192.68,-748421.11,-838916.97,-289378.9};
+ST(0.092141527,0.03991184,0,0.082493405,0.042375289,0,0.084917502,0.034253561,0){927649.93,1978611.8,1742331.8,767955.56,1595319.9,1520580.8,476054.53,902966.17,1105294,102192.68,35643.43,549324.68,-289378.9,-838916.97,-76880.401};
+ST(0.04704595,0.16277363,0,0.042155309,0.15589067,0,0.050010485,0.1548865,0){2543508.6,2577776.2,2672912.2,-3221973.5,-2895603.6,-2946373.7,-1684138.2,-2220826.4,-2371553.9,3671419.3,3169529.7,3189127.5,704902.67,1830012,2045305.7};
+ST(0.04704595,0.16277363,0,0.054395265,0.16699477,0,0.048076401,0.17082416,0){2543508.6,2465605.5,2424680.5,-3221973.5,-3338618.7,-3473815.1,-1684138.2,-1283530.8,-921629.25,3671419.3,3793219.5,3872759.5,704902.67,-59660.123,-754316.94};
+ST(0.046341114,0.044942776,0,0.03663522,0.040674234,0,0.043838979,0.034579424,0){3748809.1,3463485.9,3745913.7,2933624.2,2844620.6,3260141.4,1480431.3,1717431.6,2351583.2,-294933.53,283267.24,1138042.7,-2006921.6,-1201989.6,-223347.31};
+ST(0.038515413,0.047952704,0,0.03663522,0.040674234,0,0.046341114,0.044942776,0){3516906.1,3463485.9,3748809.1,2648581.9,2844620.6,2933624.2,1126309.3,1717431.6,1480431.3,-674068.75,283267.24,-294933.53,-2308227.3,-1201989.6,-2006921.6};
+ST(0.043491003,0.26677795,0,0.037705658,0.25939989,0,0.04563604,0.25694979,0){657627.62,758443.36,859240.08,-1894105.9,-2140288.6,-2406042.8,2903724.9,3141072.6,3472131.8,-3565612.1,-3582615.2,-3844488.4,3800401.2,3385872.9,3448330.3};
+ST(0.04563604,0.25694979,0,0.037705658,0.25939989,0,0.039157325,0.25334591,0){859240.08,758443.36,884627.38,-2406042.8,-2140288.6,-2446896,3472131.8,3141072.6,3436661.2,-3844488.4,-3582615.2,-3622356.9,3448330.3,3385872.9,2960330.2};
+ST(0.077069107,0.15686929,0,0.076625322,0.14929356,0,0.084604507,0.15255901,0){1743907.9,1845555.4,1258841.2,-1994600,-1818255.1,-1326319,-1457243.4,-1872475.3,-1187789.9,2204191.1,1790618.2,1390056.3,1140253.2,1898765.5,1113216.6};
+ST(0.07180958,0.22984275,0,0.076796159,0.2234596,0,0.078984823,0.22953004,0){1079159.6,1008421.8,858343.29,-2680718.2,-2411357.4,-2128428.8,2899261.6,2346331.8,2291087.1,-1622013.4,-852928.84,-1261656.1,-492395.98,-1160000.7,-424553.92};
+ST(0.048076401,0.17082416,0,0.042242048,0.16806859,0,0.04704595,0.16277363,0){2424680.5,2399442.3,2543508.6,-3473815.1,-3302042.1,-3221973.5,-921629.25,-1157324.9,-1684138.2,3872759.5,3737475.6,3671419.3,-754316.94,-248746.29,704902.67};
+ST(0.043027686,0.24899973,0,0.036308441,0.24745658,0,0.040431855,0.24188745,0){999522.33,958174.94,1110505,-2720190.5,-2591684.5,-2932804,3683283.3,3460190.4,3702149.5,-3620573.8,-3307339.6,-3142324.5,2549278.8,2177878.8,1453973.2};
+ST(0.026270926,0.075674812,0,0.025411973,0.082310594,0,0.019499739,0.079597209,0){2630439.6,2525130.6,2040354.6,1063205.3,762374.09,702945.71,-1137545.6,-1532614.6,-1095289.5,-2660659.2,-2757779.1,-2175701.2,-2599027.8,-2058136.4,-1830384.7};
+ST(0.073708403,0.21517194,0,0.069002793,0.22246209,0,0.063265205,0.21633109,0){1225969.3,1267491.2,1505335.5,-2772471.1,-3011719.2,-3432481.9,2271379.1,2877058.6,2888962.8,-92677.622,-947533.34,-265885.87,-2155133.8,-1573376.1,-2549234.8};
+ST(0.082390534,0.079333541,0,0.091953893,0.078440357,0,0.08812606,0.087328167,0){1865676.5,889726.23,1269155.7,650380.91,322434.75,279658.57,-988603.29,-450550.32,-927894.68,-1983689.6,-936443.15,-1412053.3,-1686881.4,-825354.72,-795447.99};
+ST(0.1,0.085714286,0,0.091953893,0.078440357,0,0.1,0.078571429,0){0,889726.23,0,0,322434.75,0,0,-450550.32,0,0,-936443.15,0,0,-825354.72,0};
+ST(0.061631884,0.26868773,0,0.06660802,0.27624666,0,0.059078636,0.27701937,0){591535.29,417349.44,447007.97,-1711593.4,-1226359.7,-1315269.1,2649353.2,1959900.4,2107766.2,-3304968.8,-2572844.1,-2778864.5,3608394.3,3027289.2,3289755.3};
+ST(0.014137494,0.034012185,0,0.017433092,0.042090914,0,0.011573719,0.041901165,0){1641076.4,1971771.3,1347025.1,1435142,1594855,1091815.8,1049094.4,913057.13,629744.45,531342.12,56690.05,48353.226,-53364.585,-810753.02,-542301.86};
+ST(0.1,0.24285714,0,0.092168655,0.23668616,0,0.1,0.23571429,0){0,307607.26,0,0,-792496.69,0,0,941630.33,0,0,-691810.02,0,0,148523.72,0};
+ST(0.0072553778,0.13224921,0,0.0054758376,0.13911323,0,0,0.13571429,0){674958.82,495708.7,0,-425463.67,-382921.42,0,-832230.25,-582869.54,0,117822.57,250325.59,0,875622.71,639819.51,0};
+ST(0.015758122,0.23699049,0,0.025350652,0.23917347,0,0.02133326,0.24577003,0){597291.98,868665.73,675269.21,-1541119.1,-2265304,-1813848.4,1837947.1,2773502.3,2383092.9,-1363109.4,-2193941.8,-2204305.3,315646.37,753574.67,1333319.6};
+ST(0.039157325,0.25334591,0,0.036308441,0.24745658,0,0.043027686,0.24899973,0){884627.38,958174.94,999522.33,-2446896,-2591684.5,-2720190.5,3436661.2,3460190.4,3683283.3,-3622356.9,-3307339.6,-3620573.8,2960330.2,2177878.8,2549278.8};
+ST(0.076158908,0.12549637,0,0.070840483,0.12204614,0,0.077013163,0.11736903,0){2092101.1,2470738.2,2095773.2,-1030118.9,-1044803.2,-691227.47,-2615047.7,-3073782.1,-2559181.5,-297340.89,-729197.53,-1023961.4,2464056,2652961,1873161.8};
+ST(0.041402067,0.22952626,0,0.037546984,0.23452457,0,0.034969012,0.22634925,0){1348916.4,1205921.7,1299939.6,-3344816,-3072707.6,-3164156.1,3600200.4,3550700.1,3237729.2,-1982154,-2423829.8,-1478956,-667743.82,201013.93,-1117524.9};
+ST(0.017207343,0.22323305,0,0.012706169,0.22573828,0,0.010546892,0.2198034,0){781289.63,571782.3,514716.79,-1865590.4,-1386624.6,-1201974.2,1807835.2,1404300.2,1090194.6,-643322.1,-614658.98,-253690.09,-915362.92,-528535.98,-751659.26};
+ST(0.01788586,0.12850833,0,0.023379755,0.12686903,0,0.021167753,0.13548502,0){1616906.9,2047772.9,1816935.7,-895214.81,-1065433.1,-1266652.3,-2016472.2,-2558991,-2200669.4,-4802.2192,-162203.53,600161.11,2014144.7,2481221.5,2382629.9};
+ST(0.042433189,0.024814669,0,0.048866761,0.029559705,0,0.043838979,0.034579424,0){3739739.8,3831772.8,3745913.7,3488658.7,3467532.3,3260141.4,3003356.3,2773676.3,2351583.2,2316430.4,1816186,1138042.7,1473602,685852.4,-223347.31};
+ST(0.051167355,0.022914381,0,0.048866761,0.029559705,0,0.042433189,0.024814669,0){3850137.8,3831772.8,3739739.8,3629520.4,3467532.3,3488658.7,3200919.1,2773676.3,3003356.3,2588908.3,1816186,2316430.4,1828396.4,685852.4,1473602};
+ST(0.092195724,0.16853594,0,0.093710586,0.16080643,0,0.1,0.16428571,0){598378.34,507346.27,0,-829189.07,-621948.04,0,-278570.16,-366919.85,0,936666.51,704920.6,0,-82641.6,207593.47,0};
+ST(0.040431855,0.24188745,0,0.045331711,0.23557633,0,0.047556344,0.24377674,0){1110505,1270563.3,1122639.4,-2932804,-3255008.9,-2989881.7,3702149.5,3813331,3850350.4,-3142324.5,-2700862,-3414324.1,1453973.2,404484.48,1828478.4};
+ST(0.01180171,0.25230222,0,0.013821768,0.24617185,0,0.018179834,0.25267212,0){347512.04,454053.45,514543.14,-957611.77,-1221678.8,-1419813.2,1333704.3,1611329.8,1983439.5,-1383899.6,-1502439.1,-2069793.3,1095718.6,928515.88,1657747.8};
+ST(0.073234584,0.04253025,0,0.067616069,0.037109229,0,0.075978544,0.034466341,0){2820532.7,3239242.7,2615244.9,2270240.9,2756202.5,2278283.7,1277003.9,1862139.4,1647758.2,34586.382,690369.93,804880.96,-1214797.7,-584563.48,-142067.87};
+ST(0.076498673,0.26519709,0,0.068237016,0.26229006,0,0.074279052,0.25633166,0){473307.48,639705.29,635900.39,-1357765.2,-1820649,-1777029.4,2063933,2721368.6,2553015.8,-2499100.3,-3203243.1,-2804423.5,2605934.6,3191912.1,2479429.3};
+ST(0.072323403,0.067507008,0,0.070754378,0.060222618,0,0.076938259,0.060604721,0){2781512.1,2932444.5,2443533.2,1448400.9,1804303.3,1491930.8,-578922.09,-17984.254,-40674.57,-2328912.3,-1833384.6,-1557435.8,-2963263.7,-2943704.7,-2468002.6};
+ST(0.021167753,0.13548502,0,0.030046638,0.13690443,0,0.026018946,0.14387862,0){1816935.7,2369378.2,2064539,-1266652.3,-1721516.8,-1800072.3,-2200669.4,-2840145.3,-2295230.1,600161.11,944948.24,1506177.8,2382629.9,3098367.4,2488196.2};
+ST(0.049721881,0.27094787,0,0.045592054,0.27439642,0,0.043491003,0.26677795,0){588018.61,513714.39,657627.62,-1710042.9,-1504437.2,-1894105.9,2675009.8,2387679.2,2903724.9,-3394309,-3100344.3,-3565612.1,3801713.7,3591305.7,3800401.2};
+ST(0.076271482,0.13373081,0,0.076158908,0.12549637,0,0.082709707,0.12855445,0){2012844.4,2092101.1,1568327.1,-1330317.6,-1030118.9,-869760.99,-2463975.8,-2615047.7,-1955764.1,494859.01,-297340.89,-1353.9511,2631758.9,2464056,1955094.7};
+ST(0.090077759,0.25268961,0,0.085145188,0.25032735,0,0.089949388,0.2453858,0){291813.61,448997.25,339950.36,-805257.31,-1228228.7,-911669.73,1125037.4,1682589.8,1193275.4,-1174248.1,-1691886.1,-1095139.7,940920.06,1253443,648419.14};
+ST(0.08944657,0.05485846,0,0.083998423,0.049627851,0,0.08974924,0.047235181,0){1211526.2,1806853.8,1190814.4,822600.19,1329741.5,905328.07,169573.91,501474.01,402804.56,-537958.1,-459273.5,-196265.4,-1073022.7,-1299103.8,-748421.11};
+ST(0.041643161,0.17482395,0,0.042242048,0.16806859,0,0.048076401,0.17082416,0){2284160.6,2399442.3,2424680.5,-3458410.7,-3302042.1,-3473815.1,-506290.81,-1157324.9,-921629.25,3718851.8,3737475.6,3872759.5,-1405815.9,-248746.29,-754316.94};
+ST(0.038009007,0.015147577,0,0.046063037,0.016810165,0,0.042433189,0.024814669,0){3597209.6,3836060.2,3739739.8,3506943.3,3717529.2,3488658.7,3328697.3,3484126.2,3003356.3,3067010.9,3143090.2,2316430.4,2728518.9,2704667.4,1473602};
+ST(0.037999827,0.27482627,0,0.030312881,0.27848596,0,0.029991713,0.27132489,0){474219.19,355416.48,469504.82,-1389905,-1048284.8,-1366503,2209621.2,1688178.9,2141236.7,-2876809.4,-2242771,-2724385.3,3345267.4,2683885.3,3063642.3};
+ST(0.074931673,0.27468874,0,0.069536278,0.26943087,0,0.076498673,0.26519709,0){363389.18,505602.11,473307.48,-1064791.9,-1465439,-1357765.2,1691857.9,2276404,2063933,-2200836.4,-2856108.7,-2499100.3,2556129.1,3145421.5,2605934.6};
+ST(0.075978544,0.034466341,0,0.068707287,0.030314019,0,0.074388951,0.025102472,0){2615244.9,3188897.7,2772012.4,2278283.7,2870259.7,2581574.2,1647758.2,2264806.3,2213781,804880.96,1433032.7,1693914.7,-142067.87,457746.25,1057277.9};
+ST(0.021251228,0.18136297,0,0.016878531,0.18478654,0,0.013878694,0.17880836,0){1398279.8,1113458.1,971566.52,-2300353.4,-1906862.4,-1548960.4,85724.805,245299.96,-51095.574,2245163.6,1732097.5,1579530,-1534338.6,-1479759.2,-887966.26};
+ST(0.076498673,0.26519709,0,0.081004963,0.27070547,0,0.074931673,0.27468874,0){473307.48,333174.81,363389.18,-1357765.2,-968418.7,-1064791.9,2063933,1513258.3,1691857.9,-2499100.3,-1916833.2,-2200836.4,2605934.6,2141327.9,2556129.1};
+ST(0.085115353,0.26563346,0,0.081004963,0.27070547,0,0.076498673,0.26519709,0){313056.52,333174.81,473307.48,-899063.8,-968418.7,-1357765.2,1369900.4,1513258.3,2063933,-1665255.4,-1916833.2,-2499100.3,1747205.8,2141327.9,2605934.6};
+ST(0.075978544,0.034466341,0,0.080699945,0.029142305,0,0.084917502,0.034253561,0){2615244.9,2185639.9,1742331.8,2278283.7,1983669.2,1520580.8,1647758.2,1598386.1,1105294,804880.96,1065401.8,549324.68,-142067.87,433818.71,-76880.401};
+ST(0.074388951,0.025102472,0,0.080699945,0.029142305,0,0.075978544,0.034466341,0){2772012.4,2185639.9,2615244.9,2581574.2,1983669.2,2278283.7,2213781,1598386.1,1647758.2,1693914.7,1065401.8,804880.96,1057277.9,433818.71,-142067.87};
+ST(0.058552205,0.15400025,0,0.05288218,0.14757716,0,0.061244461,0.14481879,0){2589572.8,2767228.4,2643484.5,-2806487.5,-2626819.9,-2356788.3,-2354581.2,-2900596.1,-2899198.4,3003966,2479722.6,2042509.4,2103059.1,3026446,3121060.9};
+ST(0.050010485,0.1548865,0,0.05288218,0.14757716,0,0.058552205,0.15400025,0){2672912.2,2767228.4,2589572.8,-2946373.7,-2626819.9,-2806487.5,-2371553.9,-2900596.1,-2354581.2,3189127.5,2479722.6,3003966,2045305.7,3026446,2103059.1};
+ST(0.089230742,0.11966768,0,0.08466046,0.11619385,0,0.091758141,0.11296708,0){1043332.5,1475783,824791.32,-391602.7,-452604.25,-201020.76,-1287980.7,-1789662.1,-976886.6,-412950.99,-788262.21,-537824.26,1030099.2,1243195.1,570097.26};
+ST(0.0078195435,0.14622426,0,0.017312959,0.14496605,0,0.013794295,0.15422926,0){680366.1,1456929,1126466.2,-626541.18,-1303417.8,-1226232.2,-729870.69,-1594293.7,-1017954.8,568744.13,1135517.7,1316565.7,774663.29,1713822.2,901352.54};
+ST(0.012304267,0.13852123,0,0.017312959,0.14496605,0,0.0078195435,0.14622426,0){1094693.2,1456929,680366.1,-832176.34,-1303417.8,-626541.18,-1294374.3,-1594293.7,-729870.69,521821.54,1135517.7,568744.13,1419655.5,1713822.2,774663.29};
+ST(0.066401409,0.0434645,0,0.067616069,0.037109229,0,0.073234584,0.04253025,0){3289675.8,3239242.7,2820532.7,2619840.6,2756202.5,2270240.9,1416557.6,1862139.4,1277003.9,-75156.319,690369.93,34586.382,-1551772,-584563.48,-1214797.7};
+ST(0.074279052,0.25633166,0,0.068237016,0.26229006,0,0.066803853,0.25459223,0){635900.39,639705.29,789541.66,-1777029.4,-1820649,-2193455.3,2553015.8,2721368.6,3110738.9,-2804423.5,-3203243.1,-3337877,2479429.3,3191912.1,2824240.3};
+ST(0.064352171,0.083117586,0,0.066925078,0.074981916,0,0.070865224,0.080352924,0){3167194.8,3090390.8,2808030.6,915483.69,1280900.5,934415.1,-1987167.2,-1278621.5,-1562677.5,-3477240.4,-3089611.2,-3017110.1,-2495770,-3091904.4,-2458745.5};
+ST(0.069536278,0.26943087,0,0.06660802,0.27624666,0,0.061631884,0.26868773,0){505602.11,417349.44,591535.29,-1465439,-1226359.7,-1711593.4,2276404,1959900.4,2649353.2,-2856108.7,-2572844.1,-3304968.8,3145421.5,3027289.2,3608394.3};
+ST(0.056317057,0.058022103,0,0.053426379,0.049768916,0,0.061015306,0.048529238,0){3630316.8,3727873.1,3533367.8,2330872.5,2738031.5,2640342.3,197001.66,1021148,1080012.2,-2007682.1,-966926.63,-753291.7,-3494460.7,-2698501,-2396723.8};
+ST(0.064276416,0.12183086,0,0.059246105,0.12763558,0,0.057323957,0.1204315,0){2809128.6,2918223.5,3051716.5,-1175750.5,-1563762.3,-1191883,-3492840.6,-3644117.3,-3778168.4,-855220.15,-127593.52,-1110713.1,2995580.4,3585046,3101303};
+ST(0.011838853,0.2301677,0,0.016939848,0.22904958,0,0.015758122,0.23699049,0){504229.49,714788.59,597291.98,-1254859.2,-1767596.2,-1541119.1,1363834.1,1888698.3,1837947.1,-775392.51,-1014237.8,-1363109.4,-209768.04,-395054.79,315646.37};
+ST(0.046341114,0.044942776,0,0.042113175,0.053290167,0,0.038515413,0.047952704,0){3748809.1,3616583.4,3516906.1,2933624.2,2519252.9,2648581.9,1480431.3,657513.67,1126309.3,-294933.53,-1403801.4,-674068.75,-2006921.6,-3039615.4,-2308227.3};
+ST(0.042433189,0.024814669,0,0.033039341,0.023173825,0,0.038009007,0.015147577,0){3739739.8,3318087.9,3597209.6,3488658.7,3123656.1,3506943.3,3003356.3,2746181,3328697.3,2316430.4,2207795.9,3067010.9,1473602,1539940.3,2728518.9};
+ST(0.050010485,0.1548865,0,0.054296142,0.16027015,0,0.04704595,0.16277363,0){2672912.2,2568973.7,2543508.6,-2946373.7,-3120486,-3221973.5,-2371553.9,-1899085.7,-1684138.2,3189127.5,3528266.9,3671419.3,2045305.7,1141594.9,704902.67};
+ST(0.089949388,0.2453858,0,0.085145188,0.25032735,0,0.083292987,0.24598228,0){339950.36,448997.25,542685.82,-911669.73,-1228228.7,-1458992.1,1193275.4,1682589.8,1920780.7,-1095139.7,-1691886.1,-1784182,648419.14,1253443,1091638.2};
+ST(0.080938662,0.054906318,0,0.083998423,0.049627851,0,0.08944657,0.05485846,0){2097661.4,1806853.8,1211526.2,1423084,1329741.5,822600.19,290856.94,501474.01,169573.91,-934922.56,-459273.5,-537958.1,-1860365.1,-1299103.8,-1073022.7};
+ST(0.021957304,0.26060316,0,0.025641665,0.25311603,0,0.030217898,0.25971254,0){505833.44,680173.91,660621.26,-1432636.8,-1879847.5,-1866014.4,2119105.6,2635470.4,2744196,-2450095.8,-2768550.2,-3141188.1,2369995.8,2247361.6,2987009.7};
+ST(0.018179834,0.25267212,0,0.025641665,0.25311603,0,0.021957304,0.26060316,0){514543.14,680173.91,505833.44,-1419813.2,-1879847.5,-1432636.8,1983439.5,2635470.4,2119105.6,-2069793.3,-2768550.2,-2450095.8,1657747.8,2247361.6,2369995.8};
+ST(0.080160084,0.071577727,0,0.086276325,0.073599227,0,0.082390534,0.079333541,0){2107851.9,1502743.3,1865676.5,977984.82,653401.45,650380.91,-676141.96,-565297.67,-988603.29,-1967920.1,-1464602.7,-1983689.6,-2205119.3,-1536324.4,-1686881.4};
+ST(0.059246105,0.12763558,0,0.052058531,0.12554764,0,0.057323957,0.1204315,0){2918223.5,3065498.6,3051716.5,-1563762.3,-1512626.5,-1191883,-3644117.3,-3831818,-3778168.4,-127593.52,-428428.64,-1110713.1,3585046,3614977.4,3101303};
+ST(0.0910478,0.13167545,0,0.093938974,0.13899,0,0.087083587,0.13880919,0){831136.87,548364.78,1144744.3,-514132.23,-422206.84,-877072.07,-1027305.8,-645591.08,-1349889.8,122313.64,273728.87,561444.4,1073956.7,708600.91,1481228.8};
+ST(0.026270926,0.075674812,0,0.033874053,0.071548869,0,0.032911969,0.081185013,0){2630439.6,3157862.8,3037931.3,1063205.3,1466537.3,971274.35,-1137545.6,-1010259.7,-1756226.8,-2660659.2,-2946084.6,-3289165.4,-2599027.8,-3304540.6,-2584916.3};
+ST(0.033874053,0.071548869,0,0.027058874,0.069011929,0,0.031105381,0.06529626,0){3157862.8,2727323.5,3030579.1,1466537.3,1363815.9,1667989.8,-1010259.7,-681543.48,-444570.51,-2946084.6,-2386220.5,-2357289.6,-3304540.6,-2898415.6,-3210321.2};
+ST(0.1,0.17142857,0,0.092195724,0.16853594,0,0.1,0.16428571,0){0,598378.34,0,0,-829189.07,0,0,-278570.16,0,0,936666.51,0,0,-82641.6,0};
+ST(0.016927821,0.11108648,0,0.023213665,0.1150537,0,0.017763535,0.12074209,0){1644246.3,2130593.3,1657769.5,-340994.5,-605772.32,-657738.05,-1914445.6,-2564157.8,-2054600.3,-1176430.8,-1229375.9,-581651.26,981584.41,1684092.7,1703675.4};
+ST(0.085369203,0.17624497,0,0.082729031,0.18391978,0,0.077619244,0.18028791,0){1039089.6,1144258.1,1471797.4,-1603144.1,-1940160.8,-2389894.4,-168940.91,205244.05,18944.546,1695116.9,1797438.3,2378251.6,-751642.95,-1455642.1,-1502642.9};
+ST(0.060825265,0.17090728,0,0.054692531,0.17439284,0,0.054395265,0.16699477,0){2288734.2,2346407.8,2465605.5,-3282960.5,-3532168.6,-3338618.7,-862639.89,-561454.61,-1283530.8,3657845.3,3816051.1,3793219.5,-726586.11,-1367177.6,-59660.123};
+ST(0.047385855,0.10193045,0,0.054240748,0.10280037,0,0.050721192,0.10961634,0){3329666.7,3302360.6,3257974.6,-117239.93,-169115.68,-583831.78,-3442848.4,-3462856.5,-3737290.3,-3204510.9,-3116478.2,-2483878.9,350991.89,505791.56,1698581.7};
+ST(0.018179834,0.25267212,0,0.013821768,0.24617185,0,0.02133326,0.24577003,0){514543.14,454053.45,675269.21,-1419813.2,-1221678.8,-1813848.4,1983439.5,1611329.8,2383092.9,-2069793.3,-1502439.1,-2204305.3,1657747.8,928515.88,1333319.6};
+ST(0.1,0.22142857,0,0.091864029,0.22106993,0,0.1,0.21428571,0){0,394005.54,0,0,-927852.61,0,0,863120.02,0,0,-241435.16,0,0,-536498.87,0};
+ST(0.038427921,0.16264679,0,0.042155309,0.15589067,0,0.04704595,0.16277363,0){2389351.9,2577776.2,2543508.6,-3020403.6,-2895603.6,-3221973.5,-1591681.4,-2220826.4,-1684138.2,3440909.6,3169529.7,3671419.3,682723.32,1830012,704902.67};
+ST(0.091323117,0.29067423,0,0.081165886,0.29137431,0,0.08596482,0.28314521,0){51002.156,97729.953,145967.81,-152526.43,-292395.17,-433371.98,252617.29,484687.71,707326.96,-350336.87,-673055.06,-959333.22,444691.33,855744.16,1181452.3};
+ST(0.085905658,0.016824409,0,0.081119523,0.0085521597,0,0.091308694,0.0093164623,0){1656238,2167108.8,1045151,1604967.9,2149779.2,1035216.9,1504009.2,2115263.6,1015442.8,1356492.3,2063869.7,986027.05,1166855,1995657.9,947106.05};
+ST(0.069025318,0.11622387,0,0.074105201,0.11070107,0,0.077013163,0.11736903,0){2631986.5,2359475.3,2095773.2,-808686.45,-471755.94,-691227.47,-3192250.9,-2736894.8,-2559181.5,-1402768.4,-1717960.7,-1023961.4,2220554.1,1362139.4,1873161.8};
+ST(0.043569257,0.19619451,0,0.036160627,0.1953007,0,0.039366597,0.19088868,0){1966078.6,1834250.2,1982365.2,-3794921.6,-3509998.2,-3628592.6,1563901,1372423.7,1030950.1,2340412.7,2256297.6,2772526.5,-3741435.4,-3434247.7,-3333638.5};
+ST(0.048791783,0.28884593,0,0.051519181,0.28417908,0,0.055764419,0.28986395,0){226341.07,320732.11,202473.1,-675936.71,-953415.16,-605163.67,1116322.7,1560004.1,1001119.7,-1541505,-2123899.5,-1385941.2,1945474.1,2629434.9,1755276.4};
+ST(0.1,0.092857143,0,0.093922759,0.092262381,0,0.1,0.085714286,0){0,652083.63,0,0,89312.894,0,0,-550573,0,0,-715327.2,0,0,-262838.8,0};
+ST(0.049232245,0.21047418,0,0.053910411,0.21448753,0,0.045116599,0.21481108,0){1752658.6,1667429.4,1654487.5,-3827070.5,-3752161.8,-3731787.4,2777012.8,3023771,3030991.5,540242.46,-28239.212,-73694.316,-3416565.4,-2988983.1,-2938909.4};
+ST(0.082493405,0.042375289,0,0.073234584,0.04253025,0,0.075978544,0.034466341,0){1978611.8,2820532.7,2615244.9,1595319.9,2270240.9,2278283.7,902966.17,1277003.9,1647758.2,35643.43,34586.382,804880.96,-838916.97,-1214797.7,-142067.87};
+ST(0.076498673,0.26519709,0,0.074279052,0.25633166,0,0.083190767,0.25723975,0){473307.48,635900.39,434158.6,-1357765.2,-1777029.4,-1216864.4,2063933,2553015.8,1759626.8,-2499100.3,-2804423.5,-1955417.3,2605934.6,2479429.3,1765235.2};
+ST(0.056199026,0.010061392,0,0.06203594,0.0060944193,0,0.064075209,0.013493001,0){3801979,3604620.2,3498581.2,3759859.9,3589956.2,3428890.3,3676084,3560685.5,3290906.4,3551608.2,3516960.1,3087427.7,3387596.5,3458793.9,2822154};
+ST(0.061476805,0.16269562,0,0.054296142,0.16027015,0,0.058552205,0.15400025,0){2391378.9,2568973.7,2589572.8,-3025373.1,-3120486,-2806487.5,-1589341.3,-1899085.7,-2354581.2,3446908.2,3528266.9,3003966,675366.83,1141594.9,2103059.1};
+ST(0.063469548,0.28521738,0,0.061805884,0.29356168,0,0.055764419,0.28986395,0){273598.49,121923.05,202473.1,-814255.31,-365207.83,-605163.67,1335465.2,606815.62,1001119.7,-1824812,-845641.09,-1385941.2,2270429.1,1080583.1,1755276.4};
+ST(0.08812606,0.087328167,0,0.093922759,0.092262381,0,0.087331535,0.0958472,0){1269155.7,652083.63,1318484.3,279658.57,89312.894,98077.228,-927894.68,-550573,-1213131.9,-1412053.3,-715327.2,-1401481.2,-795447.99,-262838.8,-292629.72};
+ST(0.06961584,0.048915995,0,0.073604017,0.054819307,0,0.066012722,0.055502179,0){3063466,2744584.6,3257272.9,2277085.6,1864679.8,2187557.2,906160.93,386939.94,399401.17,-697426.19,-1214908.7,-1519988.7,-2122325.6,-2427603.9,-2940625.1};
+ST(0.082942949,0.21818591,0,0.076796159,0.2234596,0,0.073708403,0.21517194,0){823054.75,1008421.8,1225969.3,-1901094.8,-2411357.4,-2772471.1,1667014.3,2346331.8,2271379.1,-282341.7,-852928.84,-92677.622,-1297502.9,-1160000.7,-2155133.8};
+ST(0.1,0.064285714,0,0.09230899,0.063522919,0,0.1,0.057142857,0){0,877619.52,0,0,503392.8,0,0,-85524.836,0,0,-638068.15,0,0,-918939.46,0};
+ST(0.067728608,0.12931058,0,0.076158908,0.12549637,0,0.076271482,0.13373081,0){2567539,2092101.1,2012844.4,-1463631.5,-1030118.9,-1330317.6,-3196956.5,-2615047.7,-2463975.8,89062.443,-297340.89,494859.01,3235608.2,2464056,2631758.9};
+ST(0.037999827,0.27482627,0,0.034582704,0.26623209,0,0.043491003,0.26677795,0){474219.19,604041.77,657627.62,-1389905,-1737386.1,-1894105.9,2209621.2,2655775,2903724.9,-2876809.4,-3245580.1,-3565612.1,3345267.4,3433603.3,3800401.2};
+ST(0.029991713,0.27132489,0,0.034582704,0.26623209,0,0.037999827,0.27482627,0){469504.82,604041.77,474219.19,-1366503,-1737386.1,-1389905,2141236.7,2655775,2209621.2,-2724385.3,-3245580.1,-2876809.4,3063642.3,3433603.3,3345267.4};
+ST(0.082516133,0.27647665,0,0.078222118,0.28277283,0,0.074931673,0.27468874,0){248899.48,220930.92,363389.18,-731674.12,-655625.13,-1064791.9,1170289.2,1069057.6,1691857.9,-1538273.3,-1447830.3,-2200836.4,1813237.5,1779434.3,2556129.1};
+ST(0.074388951,0.025102472,0,0.078020383,0.017034313,0,0.082332164,0.023444943,0){2772012.4,2461848.1,2029600,2581574.2,2383750.6,1907886.4,2213781,2230032.5,1671751.1,1693914.7,2005590.6,1335359.8,1057277.9,1717239.5,918760.81};
+ST(0.050721192,0.10961634,0,0.042557423,0.10832344,0,0.047385855,0.10193045,0){3257974.6,3183930.6,3329666.7,-583831.78,-492142.06,-117239.93,-3737290.3,-3600076,-3442848.4,-2483878.9,-2551523.2,-3204510.9,1698581.7,1442840.6,350991.89};
+ST(0.015416139,0.018002698,0,0.022427218,0.014872357,0,0.024008584,0.022367291,0){1798828.3,2505875.7,2639060.6,1735136,2445229.8,2494948.4,1609995.5,2325397.7,2214593.6,1427830.3,2149288.4,1813324.4,1194733.1,1920956.8,1312931.3};
+ST(0.023483408,0.28013687,0,0.0220603,0.28602893,0,0.015498485,0.28248556,0){270985.88,181204.07,166274.63,-801278.39,-539738.59,-493262.57,1297043.7,886739.53,803759.61,-1736920.8,-1214791.9,-1087394.1,2101746.5,1516611.7,1334475.8};
+ST(0.059957308,0.22757204,0,0.053624899,0.22742186,0,0.05718895,0.22161738,0){1366903.5,1430137,1508977,-3351367.9,-3503302.1,-3566099.1,3498598.8,3648370.9,3352547.9,-1727811.3,-1785483,-1004251.2,-990620.01,-1060301.4,-1983866.6};
+ST(0.042433189,0.024814669,0,0.046063037,0.016810165,0,0.051167355,0.022914381,0){3739739.8,3836060.2,3850137.8,3488658.7,3717529.2,3629520.4,3003356.3,3484126.2,3200919.1,2316430.4,3143090.2,2588908.3,1473602,2704667.4,1828396.4};
+ST(0.077619244,0.18028791,0,0.071841704,0.17726974,0,0.077140734,0.17217741,0){1471797.4,1799263.7,1584233.7,-2389894.4,-2812994.5,-2313491.7,18944.546,-214389.53,-519338.58,2378251.6,2933842.6,2552719.3,-1502642.9,-1438939.3,-655929.75};
+ST(0.1,0.29285714,0,0.1,0.3,0,0.092857143,0.3,0){0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ST(0.043838979,0.034579424,0,0.035858843,0.031497608,0,0.042433189,0.024814669,0){3745913.7,3456371.8,3739739.8,3260141.4,3083741.5,3488658.7,2351583.2,2378649.5,3003356.3,1138042.7,1417116.3,2316430.4,-223347.31,302618.73,1473602};
+ST(0.074931673,0.27468874,0,0.078222118,0.28277283,0,0.071000103,0.28243589,0){363389.18,220930.92,281581.81,-1064791.9,-655625.13,-835250.62,1691857.9,1069057.6,1360764.9,-2200836.4,-1447830.3,-1840418.5,2556129.1,1779434.3,2257916.8};
+ST(0.1,0,0,0.1,0.0071428571,0,0.092857143,0,0){0,0,863626.15,0,0,863662.39,0,0,863732,0,0,863838.35,0,0,863813.95};
+ST(0.070691378,0.017050195,0,0.078020383,0.017034313,0,0.074388951,0.025102472,0){3076870.7,2461848.1,2772012.4,2979073.3,2383750.6,2581574.2,2786592,2230032.5,2213781,2505581.5,2005590.6,1693914.7,2144710.8,1717239.5,1057277.9};
+ST(0.038597539,0.20095921,0,0.036160627,0.1953007,0,0.043569257,0.19619451,0){1801301.7,1834250.2,1966078.6,-3633864.6,-3509998.2,-3794921.6,1895634,1372423.7,1563901,1705394,2256297.6,2340412.7,-3630918.1,-3434247.7,-3741435.4};
+ST(0.059078636,0.27701937,0,0.06660802,0.27624666,0,0.063469548,0.28521738,0){447007.97,417349.44,273598.49,-1315269.1,-1226359.7,-814255.31,2107766.2,1959900.4,1335465.2,-2778864.5,-2572844.1,-1824812,3289755.3,3027289.2,2270429.1};
+ST(0.036602132,0.28491153,0,0.030312881,0.27848596,0,0.037999827,0.27482627,0){279518.56,355416.48,474219.19,-831596.18,-1048284.8,-1389905,1362985.6,1688178.9,2209621.2,-1860498.2,-2242771,-2876809.4,2311728.5,2683885.3,3345267.4};
+ST(0.091053567,0.10618538,0,0.09416017,0.099511923,0,0.1,0.10714286,0){914271.31,613994.66,0,-104388.15,5422.3845,0,-1006721.9,-608645.22,0,-787386.88,-619557.01,0,309052.61,-16415.987,0};
+ST(0.076938259,0.060604721,0,0.073604017,0.054819307,0,0.080938662,0.054906318,0){2443533.2,2744584.6,2097661.4,1491930.8,1864679.8,1423084,-40674.57,386939.94,290856.94,-1557435.8,-1214908.7,-934922.56,-2468002.6,-2427603.9,-1860365.1};
+ST(0.0064539684,0.081629255,0,0.0067127961,0.088875219,0,0,0.085714286,0){711139.06,725937.81,0,222377.16,141227.93,0,-419239.47,-557260.38,0,-772749.89,-806944.34,0,-595288.06,-406936.37,0};
+ST(0.070865224,0.080352924,0,0.074756101,0.075901522,0,0.075872285,0.081656016,0){2808030.6,2549479.1,2427639,934415.1,1021825.1,758134.07,-1562677.5,-1118145.3,-1432759.9,-3017110.1,-2588166.7,-2638364.3,-2458745.5,-2507455.8,-2029677.1};
+ST(0.024044461,0.20382537,0,0.03163445,0.20120488,0,0.030490983,0.2108424,0){1283805.9,1608414.7,1428644.1,-2655634.7,-3251875.6,-3128471,1553893.8,1714266.6,2293671,995311.88,1500504,399562.24,-2617892.2,-3248047,-2769801.9};
+ST(0.071915087,0.24816524,0,0.078142774,0.24370973,0,0.07921504,0.25033934,0){803363.84,714639.7,606155.6,-2179152.4,-1902709.3,-1658203,2928525.2,2448578.4,2271843.6,-2836050.6,-2167997.3,-2284831,1927975,1155455.3,1693484.6};
+ST(0.091308694,0.0093164623,0,0.093571257,0.018380777,0,0.085905658,0.016824409,0){1045151,774815.13,1656238,1035216.9,746204.54,1604967.9,1015442.8,690036.86,1504009.2,986027.05,608388.09,1356492.3,947106.05,504051.02,1166855};
+ST(0.08596482,0.28314521,0,0.093593186,0.28160993,0,0.091323117,0.29067423,0){145967.81,74588.283,51002.156,-433371.98,-221009.65,-152526.43,707326.96,359269.18,252617.29,-959333.22,-484261.41,-350336.87,1181452.3,591230.88,444691.33};
+ST(0.069002793,0.22246209,0,0.076796159,0.2234596,0,0.07180958,0.22984275,0){1267491.2,1008421.8,1079159.6,-3011719.2,-2411357.4,-2680718.2,2877058.6,2346331.8,2899261.6,-947533.34,-852928.84,-1622013.4,-1573376.1,-1160000.7,-492395.98};
+ST(0.04704595,0.16277363,0,0.042242048,0.16806859,0,0.038427921,0.16264679,0){2543508.6,2399442.3,2389351.9,-3221973.5,-3302042.1,-3020403.6,-1684138.2,-1157324.9,-1591681.4,3671419.3,3737475.6,3440909.6,704902.67,-248746.29,682723.32};
+ST(0.030466665,0.11568191,0,0.030575169,0.1246812,0,0.025139549,0.12057635,0){2608170,2526238.7,2224740.3,-773675.45,-1202245.8,-875333.98,-3152461.4,-3156412.2,-2755721.9,-1443702.3,-451924.48,-796179.51,2136967.4,2919641.1,2272644.8};
+ST(0.035619257,0.12028764,0,0.030575169,0.1246812,0,0.030466665,0.11568191,0){2821397.9,2526238.7,2608170,-1093830.4,-1202245.8,-773675.45,-3491178.8,-3156412.2,-3152461.4,-1043884.2,-451924.48,-1443702.3,2851838.9,2919641.1,2136967.4};
+ST(0.016927821,0.11108648,0,0.013465065,0.10662372,0,0.017861336,0.10270337,0){1644246.3,1351132.7,1773538.4,-340994.5,-165451.82,-87655.931,-1914445.6,-1496410,-1856823.6,-1176430.8,-1147793.4,-1677437.3,981584.41,489093.12,261812.45};
+ST(0.055764419,0.28986395,0,0.051519181,0.28417908,0,0.056292141,0.2827555,0){202473.1,320732.11,343081.75,-605163.67,-953415.16,-1018093.3,1001119.7,1560004.1,1660020.8,-1385941.2,-2123899.5,-2248005.1,1755276.4,2629434.9,2762903.8};
+ST(0.0068768393,0.16098373,0,0.0046637588,0.16745308,0,0,0.16428571,0){553409.29,362371.83,0,-680450.71,-494096.85,0,-397156.36,-182769.85,0,771605.48,560561.48,0,219690.78,-21256.565,0};
+ST(0.042541479,0.22296234,0,0.045116599,0.21481108,0,0.049797208,0.2214244,0){1481591,1654487.5,1551864.2,-3531706.6,-3731787.4,-3662861.4,3405357.4,3030991.5,3430735.4,-1180392.3,-73694.316,-1003918.8,-1772446.7,-2938909.4,-2065424.5};
+ST(0.07921504,0.25033934,0,0.078142774,0.24370973,0,0.083292987,0.24598228,0){606155.6,714639.7,542685.82,-1658203,-1902709.3,-1458992.1,2271843.6,2448578.4,1920780.7,-2284831,-2167997.3,-1784182,1693484.6,1155455.3,1091638.2};
+ST(0.042557423,0.10832344,0,0.038084092,0.1145524,0,0.034786476,0.1076516,0){3183930.6,2981407.2,2912738.3,-492142.06,-818508.93,-413135.58,-3600076,-3575257.7,-3267374.9,-2551523.2,-1775238,-2390915.6,1442840.6,2287308.3,1215377.6};
+ST(0.026270926,0.075674812,0,0.027058874,0.069011929,0,0.033874053,0.071548869,0){2630439.6,2727323.5,3157862.8,1063205.3,1363815.9,1466537.3,-1137545.6,-681543.48,-1010259.7,-2660659.2,-2386220.5,-2946084.6,-2599027.8,-2898415.6,-3304540.6};
+ST(0.070754378,0.060222618,0,0.073604017,0.054819307,0,0.076938259,0.060604721,0){2932444.5,2744584.6,2443533.2,1804303.3,1864679.8,1491930.8,-17984.254,386939.94,-40674.57,-1833384.6,-1214908.7,-1557435.8,-2943704.7,-2427603.9,-2468002.6};
+ST(0.061098586,0.072147464,0,0.060416267,0.076932239,0,0.054876921,0.07294965,0){3389933,3380545.3,3558755.8,1545196.6,1302521.2,1580988.4,-1140417.3,-1576156.6,-1275447.3,-3205469.9,-3485992.8,-3423192.1,-3526423.9,-3253298.6,-3669097.1};
+ST(0.061027247,0.098743066,0,0.058212185,0.089881183,0,0.066799394,0.09162077,0){3173016.6,3344291.6,2974160.1,72008.811,593905.21,440022.16,-3099474,-2645013.4,-2469083.6,-3241975.4,-3708817.1,-3274492.4,-216202.29,-1722713.3,-1290097.2};
+ST(0.05718895,0.22161738,0,0.053910411,0.21448753,0,0.063265205,0.21633109,0){1508977,1667429.4,1505335.5,-3566099.1,-3752161.8,-3432481.9,3352547.9,3023771,2888962.8,-1004251.2,-28239.212,-265885.87,-1983866.6,-2988983.1,-2549234.8};
+ST(0.076158908,0.12549637,0,0.082946441,0.12207685,0,0.082709707,0.12855445,0){2092101.1,1589878.9,1568327.1,-1030118.9,-673263.29,-869760.99,-2615047.7,-1978038.1,-1955764.1,-297340.89,-467139.5,-1353.9511,2464056,1708498.9,1955094.7};
+ST(0.052748817,0.036292023,0,0.060555575,0.040182349,0,0.054794838,0.043915046,0){3796611.1,3588260.7,3735662.6,3254886.9,2962222.2,2959425,2248728.5,1819353,1568238.5,921690.78,359025.67,-148813.91,-537197.11,-1164330.1,-1835117.4};
+ST(0.060819012,0.031697917,0,0.060555575,0.040182349,0,0.052748817,0.036292023,0){3608360,3588260.7,3796611.1,3214477.8,2962222.2,3254886.9,2469695.4,1819353,2248728.5,1455299.1,359025.67,921690.78,281702.17,-1164330.1,-537197.11};
+ST(0.054010827,0.25507988,0,0.060672356,0.25950081,0,0.0528723,0.26429657,0){897184.36,771273.27,718299.05,-2496661.6,-2177172.3,-2055661.9,3553831.7,3197356.1,3109067.1,-3839088.9,-3651078,-3733060,3290330.5,3457676.3,3841282.5};
+ST(0.0528723,0.26429657,0,0.060672356,0.25950081,0,0.061631884,0.26868773,0){718299.05,771273.27,591535.29,-2055661.9,-2177172.3,-1711593.4,3109067.1,3197356.1,2649353.2,-3733060,-3651078,-3304968.8,3841282.5,3457676.3,3608394.3};
+ST(0.064075209,0.013493001,0,0.06203594,0.0060944193,0,0.068476894,0.0069177029,0){3498581.2,3604620.2,3242851.4,3428890.3,3589956.2,3225849.8,3290906.4,3560685.5,3191931.3,3087427.7,3516960.1,3141298.2,2822154,3458793.9,3073847.6};
+ST(0.068366879,0.29272708,0,0.061805884,0.29356168,0,0.063469548,0.28521738,0){123803.43,121923.05,273598.49,-370697.46,-365207.83,-814255.31,615462.12,606815.62,1335465.2,-856697.17,-845641.09,-1824812,1092834.3,1080583.1,2270429.1};
+ST(0.036912897,0.21765752,0,0.029518097,0.21985532,0,0.030490983,0.2108424,0){1486590.9,1264894.2,1428644.1,-3421295.1,-2954793.2,-3128471,2965983.4,2682751.8,2293671,-438566.7,-629411.95,399562.24,-2395869.1,-1842177.8,-2769801.9};
+ST(0.012304267,0.13852123,0,0.0054758376,0.13911323,0,0.0072553778,0.13224921,0){1094693.2,495708.7,674958.82,-832176.34,-382921.42,-425463.67,-1294374.3,-582869.54,-832230.25,521821.54,250325.59,117822.57,1419655.5,639819.51,875622.71};
+ST(0.07492972,0.092844339,0,0.072044079,0.08604506,0,0.079265602,0.086677581,0){2431427.6,2688599.4,2114636.1,308451.38,649473.83,488789.06,-2083891.4,-1882262.6,-1512904.7,-2656803.1,-2986497.2,-2351470.6,-910298.79,-1825996.4,-1382326.1};
+ST(0.017373248,0.19021363,0,0.012931293,0.19295437,0,0.01062282,0.18656765,0){1095255.9,815194.79,711483.53,-1990705.9,-1524077.7,-1243147.4,532263.7,510133.92,217509.34,1555631.8,1080471.8,1080570.1,-1804413.6,-1450076.4,-1025407.6};
+ST(0.074388951,0.025102472,0,0.068707287,0.030314019,0,0.064795861,0.023107998,0){2772012.4,3188897.7,3443592.1,2581574.2,2870259.7,3242943.8,2213781,2264806.3,2853338,1693914.7,1433032.7,2297494.4,1057277.9,457746.25,1607540.9};
+ST(0.064795861,0.023107998,0,0.068707287,0.030314019,0,0.060819012,0.031697917,0){3443592.1,3188897.7,3608360,3242943.8,2870259.7,3214477.8,2853338,2264806.3,2469695.4,2297494.4,1433032.7,1455299.1,1607540.9,457746.25,281702.17};
+ST(0.084206466,0.24009781,0,0.092168655,0.23668616,0,0.089949388,0.2453858,0){569988.38,307607.26,339950.36,-1492933.9,-792496.69,-911669.73,1847439,941630.33,1193275.4,-1498530.8,-691810.02,-1095139.7,578923.58,148523.72,648419.14};
+ST(0.056199026,0.010061392,0,0.052049192,0.01582547,0,0.049204373,0.010884263,0){3801979,3859264.8,3873084,3759859.9,3753529.9,3822842.7,3676084,3544947.6,3723003.5,3551608.2,3239251.6,3574883.8,3387596.5,2844641.6,3380124.5};
+ST(0.025221599,0.062165695,0,0.032659307,0.059686042,0,0.031105381,0.06529626,0){2618029.3,3158137.1,3030579.1,1547191.2,1964024.3,1667989.8,-156575.4,27282.242,-444570.51,-1796512.5,-1919818.3,-2357289.6,-2702051.5,-3141270.1,-3210321.2};
+ST(0.031105381,0.06529626,0,0.037071258,0.0642048,0,0.033874053,0.071548869,0){3030579.1,3365311.2,3157862.8,1667989.8,1900443.5,1466537.3,-444570.51,-391679.98,-1010259.7,-2357289.6,-2513388.8,-2946084.6,-3210321.2,-3541461.8,-3304540.6};
+ST(0.064795861,0.023107998,0,0.070691378,0.017050195,0,0.074388951,0.025102472,0){3443592.1,3076870.7,2772012.4,3242943.8,2979073.3,2581574.2,2853338,2786592,2213781,2297494.4,2505581.5,1693914.7,1607540.9,2144710.8,1057277.9};
+ST(0.064075209,0.013493001,0,0.070691378,0.017050195,0,0.064795861,0.023107998,0){3498581.2,3076870.7,3443592.1,3428890.3,2979073.3,3242943.8,3290906.4,2786592,2853338,3087427.7,2505581.5,2297494.4,2822154,2144710.8,1607540.9};
+ST(0.024008584,0.022367291,0,0.033039341,0.023173825,0,0.028359285,0.029784535,0){2639060.6,3318087.9,2981166.2,2494948.4,3123656.1,2693525.9,2214593.6,2746181,2145980.7,1813324.4,2207795.9,1391347.7,1312931.3,1539940.3,502245.34};
+ST(0.075488644,0.14176328,0,0.068478919,0.13862632,0,0.076271482,0.13373081,0){1990888.2,2426951.1,2012844.4,-1647841.2,-1850187.5,-1330317.6,-2274843.7,-2866745.3,-2463975.8,1255935.2,1169007.7,494859.01,2491166.6,3144665.9,2631758.9};
+ST(0.076271482,0.13373081,0,0.068478919,0.13862632,0,0.067728608,0.12931058,0){2012844.4,2426951.1,2567539,-1330317.6,-1850187.5,-1463631.5,-2463975.8,-2866745.3,-3196956.5,494859.01,1169007.7,89062.443,2631758.9,3144665.9,3235608.2};
+ST(0.060432552,0.20227914,0,0.053221516,0.20704838,0,0.051624576,0.1997036,0){1798951.1,1805672.4,1943020.7,-3671781.8,-3837129.3,-3875569.2,2023610.8,2511247.5,1911651.5,1565241.8,1011998.4,1974364.4,-3653837,-3650194.7,-3875892.9};
+ST(0.079063451,0.10043005,0,0.076969725,0.10634022,0,0.072126291,0.10515927,0){2051820.1,2181001.1,2539730.3,-16056.497,-255488.75,-241283.81,-2067914.3,-2406546.5,-2758172.2,-2035845.1,-1869163.7,-2254933.2,48244.512,756176.24,717337.89};
+ST(0.063265205,0.21633109,0,0.053910411,0.21448753,0,0.059551151,0.20970619,0){1505335.5,1667429.4,1688112.8,-3432481.9,-3752161.8,-3664209.4,2888962.8,3023771,2601193.1,-265885.87,-28239.212,619333.89,-2549234.8,-2988983.1,-3326584.6};
+ST(0.059551151,0.20970619,0,0.066992124,0.20847551,0,0.063265205,0.21633109,0){1688112.8,1540360.8,1505335.5,-3664209.4,-3311175.4,-3432481.9,2601193.1,2266191.6,2888962.8,619333.89,706070.36,-265885.87,-3326584.6,-3078419.5,-2549234.8};
+ST(0.1,0.10714286,0,0.09416017,0.099511923,0,0.1,0.1,0){0,613994.66,0,0,5422.3845,0,0,-608645.22,0,0,-619557.01,0,0,-16415.987,0};
+ST(0,0.15714286,0,0.0068768393,0.16098373,0,0,0.16428571,0){0,553409.29,0,0,-680450.71,0,0,-397156.36,0,0,771605.48,0,0,219690.78,0};
+ST(0.031710863,0.0075461758,0,0.029163144,0.015558324,0,0.025468185,0.010276157,0){3254919.5,3068207,2780034,3234618.2,2986953.6,2747892,3194153.7,2826596.5,2683968.5,3133832.1,2591406.1,2589008.8,3053845.3,2287504.7,2463902.9};
+ST(0.072323403,0.067507008,0,0.079822506,0.065677674,0,0.080160084,0.071577727,0){2781512.1,2163855.5,2107851.9,1448400.9,1180001.4,977984.82,-578922.09,-340376.77,-676141.96,-2328912.3,-1706002.2,-1967920.1,-2963263.7,-2296197.5,-2205119.3};
+ST(0.085369203,0.17624497,0,0.093873231,0.17693503,0,0.089858368,0.18421461,0){1039089.6,445896.9,692603.24,-1603144.1,-694096.79,-1178349.1,-168940.91,-59504.029,133849.22,1695116.9,727141.13,1084450.2,-751642.95,-345394.37,-894447.98};
+ST(0.064352171,0.083117586,0,0.072044079,0.08604506,0,0.066799394,0.09162077,0){3167194.8,2688599.4,2974160.1,915483.69,649473.83,440022.16,-1987167.2,-1882262.6,-2469083.6,-3477240.4,-2986497.2,-3274492.4,-2495770,-1825996.4,-1290097.2};
+ST(0.0098751756,0.25600949,0,0.013885016,0.25805955,0,0.0071908097,0.26035264,0){270470.11,357160.64,179155.76,-755004.71,-1003688.5,-507033.49,1082095.4,1459712.7,748779.14,-1183544.7,-1638678.7,-863311.12,1038261.4,1506406.6,830950.48};
+ST(0.016759526,0.025876157,0,0.021348697,0.029751655,0,0.014137494,0.034012185,0){1932221.9,2382657.5,1641076.4,1791225.7,2153252.9,1435142,1519509.7,1716520.5,1049094.4,1136895.1,1114508.8,531342.12,671081.1,404958.41,-53364.585};
+ST(0.019499739,0.079597209,0,0.012549176,0.077039569,0,0.01882241,0.070374011,0){2040354.6,1370920.5,2018056.9,702945.71,525978.15,970762.8,-1095289.5,-643140.23,-580354.6,-2175701.2,-1415881.7,-1830388.5,-1830384.7,-1316306.1,-2130853.3};
+ST(0.0910478,0.13167545,0,0.083559522,0.13424014,0,0.082709707,0.12855445,0){831136.87,1462145.4,1568327.1,-514132.23,-981746.52,-869760.99,-1027305.8,-1784737.2,-1955764.1,122313.64,395362.65,-1353.9511,1073956.7,1914407.3,1955094.7};
+ST(0.087083587,0.13880919,0,0.083559522,0.13424014,0,0.0910478,0.13167545,0){1144744.3,1462145.4,831136.87,-877072.07,-981746.52,-514132.23,-1349889.8,-1784737.2,-1027305.8,561444.4,395362.65,122313.64,1481228.8,1914407.3,1073956.7};
+ST(0.018704911,0.19716585,0,0.015977634,0.20443356,0,0.011268327,0.1984065,0){1103230.1,895779.15,682302.12,-2149261.2,-1862602.8,-1344805.9,934589.13,1114548.4,623458.07,1263201.6,659707.69,739532.85,-2132672.2,-1827076.9,-1341727.7};
+ST(0.01882241,0.070374011,0,0.012549176,0.077039569,0,0.011197941,0.071439681,0){2018056.9,1370920.5,1244724.5,970762.8,525978.15,579995.21,-580354.6,-643140.23,-394493.66,-1830388.5,-1415881.7,-1158343.6,-2130853.3,-1316306.1,-1303869.8};
+ST(0.077013163,0.11736903,0,0.082946441,0.12207685,0,0.076158908,0.12549637,0){2095773.2,1589878.9,2092101.1,-691227.47,-673263.29,-1030118.9,-2559181.5,-1978038.1,-2615047.7,-1023961.4,-467139.5,-297340.89,1873161.8,1708498.9,2464056};
+ST(0.061244461,0.14481879,0,0.064971856,0.15110456,0,0.058552205,0.15400025,0){2643484.5,2431817,2589572.8,-2356788.3,-2488096.1,-2806487.5,-2899198.4,-2374265.3,-2354581.2,2042509.4,2543085,3003966,3121060.9,2315361.9,2103059.1};
+ST(0.0094805882,0.16707285,0,0.014405512,0.17061143,0,0.0069613667,0.17349451,0){730151.01,1063653,517779.21,-989834.58,-1519257.6,-769992.03,-378084.11,-412907.51,-142713.64,1124284.7,1696192.6,839532.94,-22095.939,-313907.63,-266340.1};
+ST(0.017763535,0.12074209,0,0.01198914,0.11616091,0,0.016927821,0.11108648,0){1657769.5,1171325.2,1644246.3,-657738.05,-358450.6,-340994.5,-2054600.3,-1420119.3,-1914445.6,-581651.26,-627101.02,-1176430.8,1703675.4,984768,981584.41};
+ST(0.051624576,0.1997036,0,0.043569257,0.19619451,0,0.050398693,0.1921099,0){1943020.7,1966078.6,2077292.2,-3875569.2,-3794921.6,-3850553.1,1911651.5,1563901,1209682,1974364.4,2340412.7,2818064.5,-3875892.9,-3741435.4,-3615771.1};
+ST(0.051624576,0.1997036,0,0.057391395,0.19462543,0,0.060432552,0.20227914,0){1943020.7,1979510.6,1798951.1,-3875569.2,-3763012.6,-3671781.8,1911651.5,1410875.8,2023610.8,1974364.4,2491970.2,1565241.8,-3875892.9,-3656419.8,-3653837};
+ST(0.03663522,0.040674234,0,0.032229878,0.047894836,0,0.028678488,0.042143634,0){3463485.9,3188476.9,2968313.4,2844620.6,2403076.1,2399521.8,1717431.6,1025710.6,1370917.4,283267.24,-604377.64,79587.615,-1201989.6,-2086050.7,-1227272.3};
+ST(0.038515413,0.047952704,0,0.032229878,0.047894836,0,0.03663522,0.040674234,0){3516906.1,3188476.9,3463485.9,2648581.9,2403076.1,2844620.6,1126309.3,1025710.6,1717431.6,-674068.75,-604377.64,283267.24,-2308227.3,-2086050.7,-1201989.6};
+ST(0.014137494,0.034012185,0,0.021348697,0.029751655,0,0.023478597,0.036718106,0){1641076.4,2382657.5,2561783.8,1435142,2153252.9,2187675.4,1049094.4,1716520.5,1494080.3,531342.12,1114508.8,582277.59,-53364.585,404958.41,-414804.14};
+ST(0.058552205,0.15400025,0,0.065117308,0.15657509,0,0.061476805,0.16269562,0){2589572.8,2354870.2,2391378.9,-2806487.5,-2678881.2,-3025373.1,-2354581.2,-1986291.9,-1589341.3,3003966,2952219.2,3446908.2,2103059.1,1580034,675366.83};
+ST(0.021957304,0.26060316,0,0.013885016,0.25805955,0,0.018179834,0.25267212,0){505833.44,357160.64,514543.14,-1432636.8,-1003688.5,-1419813.2,2119105.6,1459712.7,1983439.5,-2450095.8,-1638678.7,-2069793.3,2369995.8,1506406.6,1657747.8};
+ST(0.018179834,0.25267212,0,0.013885016,0.25805955,0,0.01180171,0.25230222,0){514543.14,357160.64,347512.04,-1419813.2,-1003688.5,-957611.77,1983439.5,1459712.7,1333704.3,-2069793.3,-1638678.7,-1383899.6,1657747.8,1506406.6,1095718.6};
+ST(0.078984823,0.22953004,0,0.077318805,0.23627719,0,0.07180958,0.22984275,0){858343.29,830868.27,1079159.6,-2128428.8,-2136157.9,-2680718.2,2291087.1,2525048.7,2899261.6,-1261656.1,-1830714.2,-1622013.4,-424553.92,350702.19,-492395.98};
+ST(0.1,0.15,0,0.09308158,0.15403623,0,0.09156348,0.14589395,0){0,579061.91,734092.88,0,-628036.95,-670961.7,0,-525997.02,-791796.8,0,672596.25,602866.55,0,469080.04,843431.47};
+ST(0.063469548,0.28521738,0,0.06660802,0.27624666,0,0.071000103,0.28243589,0){273598.49,417349.44,281581.81,-814255.31,-1226359.7,-835250.62,1335465.2,1959900.4,1360764.9,-1824812,-2572844.1,-1840418.5,2270429.1,3027289.2,2257916.8};
+ST(0.056317057,0.058022103,0,0.059054943,0.066788508,0,0.052494391,0.065958781,0){3630316.8,3499189.3,3640248,2330872.5,1856149.2,1971511.2,197001.66,-658492.2,-601016.65,-2007682.1,-2864039.1,-2898090,-3494460.7,-3725081.1,-3866942};
+ST(0.028359285,0.029784535,0,0.021348697,0.029751655,0,0.024008584,0.022367291,0){2981166.2,2382657.5,2639060.6,2693525.9,2153252.9,2494948.4,2145980.7,1716520.5,2214593.6,1391347.7,1114508.8,1813324.4,502245.34,404958.41,1312931.3};
+ST(0.054395265,0.16699477,0,0.054692531,0.17439284,0,0.048076401,0.17082416,0){2465605.5,2346407.8,2424680.5,-3338618.7,-3532168.6,-3473815.1,-1283530.8,-561454.61,-921629.25,3793219.5,3816051.1,3872759.5,-59660.123,-1367177.6,-754316.94};
+ST(0.088381846,0.16289419,0,0.093710586,0.16080643,0,0.092195724,0.16853594,0){911153.68,507346.27,598378.34,-1156470.7,-621948.04,-829189.07,-599768.12,-366919.85,-278570.16,1317920.1,704920.6,936666.51,244888.24,207593.47,-82641.6};
+ST(0.08944657,0.05485846,0,0.09230899,0.063522919,0,0.08415119,0.061061125,0){1211526.2,877619.52,1759442.9,822600.19,503392.8,1064240.3,169573.91,-85524.836,-51487.645,-537958.1,-638068.15,-1146904.2,-1073022.7,-918939.46,-1789550.6};
+ST(0.1,0.19285714,0,0.093164956,0.1980516,0,0.091593501,0.1915477,0){0,420734.09,544831.72,0,-826537.04,-1004107.1,0,376428.12,301623.68,0,463603.83,749822.54,0,-823893.15,-933881.71};
+ST(0,0.042857143,0,0.0063343033,0.038958017,0,0.0064812773,0.046734878,0){0,751213.74,761350.4,0,627892.11,582610.88,0,401490.67,267082.8,0,109174.99,-111174.21,0,-201236.23,-463416.67};
+ST(0.014285714,0.3,0,0.017990672,0.29207379,0,0.021428571,0.3,0){0,86228.122,0,0,-258100.45,0,0,428229.3,0,0,-595472.42,0,0,758576.15,0};
+ST(0.021428571,0,0,0.01808004,0.0081573173,0,0.014285714,0,0){2419501.9,2085729.2,1683701.5,2419561.9,2070583.9,1683671.3,2419679.8,2040406.9,1683611.9,2419876.4,1995444.2,1683542.6,2419989.4,1935913.6,1683226};
+ST(0.080160084,0.071577727,0,0.074756101,0.075901522,0,0.072323403,0.067507008,0){2107851.9,2549479.1,2781512.1,977984.82,1021825.1,1448400.9,-676141.96,-1118145.3,-578922.09,-1967920.1,-2588166.7,-2328912.3,-2205119.3,-2507455.8,-2963263.7};
+ST(0.050398693,0.1921099,0,0.057391395,0.19462543,0,0.051624576,0.1997036,0){2077292.2,1979510.6,1943020.7,-3850553.1,-3763012.6,-3875569.2,1209682,1410875.8,1911651.5,2818064.5,2491970.2,1974364.4,-3615771.1,-3656419.8,-3875892.9};
+ST(0.0062494098,0.068021592,0,0.0060853536,0.074713803,0,0,0.071428571,0){709501.16,681675.12,0,364477.97,285253.65,0,-157824.6,-277070.48,0,-603457.47,-678306.76,0,-756039.79,-685312.86,0};
+ST(0.045331711,0.23557633,0,0.052478219,0.23860916,0,0.047556344,0.24377674,0){1270563.3,1222305.6,1122639.4,-3255008.9,-3178913.4,-2989881.7,3813331,3866354.4,3850350.4,-2700862,-3010118,-3414324.1,404484.48,951644.63,1828478.4};
+ST(0.050960377,0.23252058,0,0.052478219,0.23860916,0,0.045331711,0.23557633,0){1342135.9,1222305.6,1270563.3,-3383651.2,-3178913.4,-3255008.9,3804738.6,3866354.4,3813331,-2403721.7,-3010118,-2700862,-148681.88,951644.63,404484.48};
+ST(0.089949388,0.2453858,0,0.083292987,0.24598228,0,0.084206466,0.24009781,0){339950.36,542685.82,569988.38,-911669.73,-1458992.1,-1492933.9,1193275.4,1920780.7,1847439,-1095139.7,-1784182,-1498530.8,648419.14,1091638.2,578923.58};
+ST(0.08415119,0.061061125,0,0.080938662,0.054906318,0,0.08944657,0.05485846,0){1759442.9,2097661.4,1211526.2,1064240.3,1423084,822600.19,-51487.645,290856.94,169573.91,-1146904.2,-934922.56,-537958.1,-1789550.6,-1860365.1,-1073022.7};
+ST(0.014285714,0.3,0,0.010662343,0.29482959,0,0.017990672,0.29207379,0){0,34537.041,86228.122,0,-103506.64,-258100.45,0,172164.12,428229.3,0,-240303.04,-595472.42,0,307518.14,758576.15};
+ST(0.08944657,0.05485846,0,0.094913401,0.051076335,0,0.1,0.057142857,0){1211526.2,595503.05,0,822600.19,429138.45,0,169573.91,142901.48,0,-537958.1,-183223.65,0,-1073022.7,-458373.75,0};
+ST(0.1,0.24285714,0,0.095090425,0.2489538,0,0.089949388,0.2453858,0){0,157454.16,339950.36,0,-428416.46,-911669.73,0,579817.55,1193275.4,0,-569427.53,-1095139.7,0,400020.01,648419.14};
+ST(0.01808004,0.0081573173,0,0.010679145,0.0052482016,0,0.014285714,0,0){2085729.2,1277155.8,1683701.5,2070583.9,1273289.3,1683671.3,2040406.9,1265566.3,1683611.9,1995444.2,1254019.7,1683542.6,1935913.6,1238493.9,1683226};
+ST(0.045375723,0.12284566,0,0.052058531,0.12554764,0,0.045894811,0.13135905,0){3072436,3065498.6,2973475.7,-1348503.3,-1512626.5,-1819976.4,-3829159.4,-3831818,-3679581.9,-800055.99,-428428.64,392676.16,3380414.3,3614977.4,3832095.1};
+ST(0.045894811,0.13135905,0,0.052058531,0.12554764,0,0.053497526,0.1329974,0){2973475.7,3065498.6,2959143.9,-1819976.4,-1512626.5,-1911000.9,-3679581.9,-3831818,-3636096,392676.16,-428428.64,623103.97,3832095.1,3614977.4,3857035.6};
+ST(0.03163445,0.20120488,0,0.036840853,0.20596239,0,0.030490983,0.2108424,0){1608414.7,1679916.9,1428644.1,-3251875.6,-3538121.9,-3128471,1714266.6,2233718.4,2293671,1500504,1067350,399562.24,-3248047,-3414669.4,-2769801.9};
+ST(0.089858368,0.18421461,0,0.082729031,0.18391978,0,0.085369203,0.17624497,0){692603.24,1144258.1,1039089.6,-1178349.1,-1940160.8,-1603144.1,133849.22,205244.05,-168940.91,1084450.2,1797438.3,1695116.9,-894447.98,-1455642.1,-751642.95};
+ST(0.02463475,0.21609565,0,0.021120118,0.21068669,0,0.030490983,0.2108424,0){1153636.1,1077357.5,1428644.1,-2626116.1,-2356401.7,-3128471,2198315,1720167.1,2293671,-179791.92,314292.11,399562.24,-1969098.8,-2093742.8,-2769801.9};
+ST(0.030490983,0.2108424,0,0.021120118,0.21068669,0,0.024044461,0.20382537,0){1428644.1,1077357.5,1283805.9,-3128471,-2356401.7,-2655634.7,2293671,1720167.1,1553893.8,399562.24,314292.11,995311.88,-2769801.9,-2093742.8,-2617892.2};
+ST(0.047385855,0.10193045,0,0.039702853,0.10111678,0,0.044548934,0.094607351,0){3329666.7,3175586.8,3364209.6,-117239.93,-64516.934,323528.56,-3442848.4,-3238866.3,-3009655.6,-3204510.9,-3108635.2,-3622750.1,350991.89,193445.51,-961698.97};
+ST(0.050721192,0.10961634,0,0.051013063,0.11801667,0,0.044666369,0.11545829,0){3257974.6,3161388.4,3148096.1,-583831.78,-1083065.4,-920013.3,-3737290.3,-3873486.3,-3799301.5,-2483878.9,-1463412.7,-1769018.1,1698581.7,2911579,2547335.8};
+ST(0.055764419,0.28986395,0,0.056292141,0.2827555,0,0.063469548,0.28521738,0){202473.1,343081.75,273598.49,-605163.67,-1018093.3,-814255.31,1001119.7,1660020.8,1335465.2,-1385941.2,-2248005.1,-1824812,1755276.4,2762903.8,2270429.1};
+ST(0.058552205,0.15400025,0,0.054296142,0.16027015,0,0.050010485,0.1548865,0){2589572.8,2568973.7,2672912.2,-2806487.5,-3120486,-2946373.7,-2354581.2,-1899085.7,-2371553.9,3003966,3528266.9,3189127.5,2103059.1,1141594.9,2045305.7};
+ST(0.01062282,0.18656765,0,0.0062925762,0.18063125,0,0.013878694,0.17880836,0){711483.53,445914.92,971566.52,-1243147.4,-727143.63,-1548960.4,217509.34,12632.594,-51095.574,1080570.1,719304.1,1579530,-1025407.6,-466469.22,-887966.26};
+ST(0.030490983,0.2108424,0,0.029518097,0.21985532,0,0.02463475,0.21609565,0){1428644.1,1264894.2,1153636.1,-3128471,-2954793.2,-2626116.1,2293671,2682751.8,2198315,399562.24,-629411.95,-179791.92,-2769801.9,-1842177.8,-1969098.8};
+ST(0.030312881,0.27848596,0,0.025044032,0.27464897,0,0.029991713,0.27132489,0){355416.48,363665.57,469504.82,-1048284.8,-1065519.5,-1366503,1688178.9,1692735.8,2141236.7,-2242771,-2201379.5,-2724385.3,2683885.3,2555652.6,3063642.3};
+ST(0.1,0.15,0,0.09156348,0.14589395,0,0.1,0.14285714,0){0,734092.88,0,0,-670961.7,0,0,-791796.8,0,0,602866.55,0,0,843431.47,0};
+ST(0.054957014,0.24657048,0,0.052478219,0.23860916,0,0.059437672,0.2400817,0){1058545,1222305.6,1145348.7,-2852831,-3178913.4,-2999714,3777171.8,3866354.4,3711340.5,-3549694.2,-3010118,-3009146,2239441.1,951644.63,1160252.2};
+ST(0.047556344,0.24377674,0,0.052478219,0.23860916,0,0.054957014,0.24657048,0){1122639.4,1222305.6,1058545,-2989881.7,-3178913.4,-2852831,3850350.4,3866354.4,3777171.8,-3414324.1,-3010118,-3549694.2,1828478.4,951644.63,2239441.1};
+ST(0.016702178,0.061420197,0,0.025221599,0.062165695,0,0.01882241,0.070374011,0){1844408.3,2618029.3,2018056.9,1107331.1,1547191.2,970762.8,-72241.295,-156575.4,-580354.6,-1222910.6,-1796512.5,-1830388.5,-1885264.1,-2702051.5,-2130853.3};
+ST(0.029380008,0.16405835,0,0.034314476,0.15645926,0,0.038427921,0.16264679,0){2021292.5,2334400.9,2389351.9,-2614335.2,-2649968.2,-3020403.6,-1254306.4,-1976247.7,-1591681.4,2982541.3,2917237.1,3440909.6,378860.61,1581967.4,682723.32};
+ST(0.027609688,0.15620978,0,0.034314476,0.15645926,0,0.029380008,0.16405835,0){2023546.1,2334400.9,2021292.5,-2286520.9,-2649968.2,-2614335.2,-1726415,-1976247.7,-1254306.4,2510934.9,2917237.1,2982541.3,1400022.9,1581967.4,378860.61};
+ST(0.041057987,0.068843254,0,0.037071258,0.0642048,0,0.045416206,0.061541227,0){3488848.8,3365311.2,3642820.9,1752771.3,1900443.5,2181474.8,-855539,-391679.98,-155055.51,-3038218.5,-2513388.8,-2429600.5,-3709409.4,-3541461.8,-3730025.8};
+ST(0.084368038,0.19048099,0,0.082729031,0.18391978,0,0.089858368,0.18421461,0){992852.93,1144258.1,692603.24,-1809621.2,-1940160.8,-1178349.1,495817.1,205244.05,133849.22,1401810.9,1797438.3,1084450.2,-1649308.4,-1455642.1,-894447.98};
+ST(0.020973714,0.16688371,0,0.014405512,0.17061143,0,0.014502412,0.16316663,0){1525118.3,1063653,1121335,-2061659.5,-1519257.6,-1429592.9,-799875.51,-412907.51,-728363.13,2343184.8,1696192.6,1629901.1,-24581.749,-313907.63,280110.31};
+ST(0.03663522,0.040674234,0,0.035858843,0.031497608,0,0.043838979,0.034579424,0){3463485.9,3456371.8,3745913.7,2844620.6,3083741.5,3260141.4,1717431.6,2378649.5,2351583.2,283267.24,1417116.3,1138042.7,-1201989.6,302618.73,-223347.31};
+ST(0.064075209,0.013493001,0,0.057612168,0.01845715,0,0.056199026,0.010061392,0){3498581.2,3752599.8,3801979,3428890.3,3612875.5,3759859.9,3290906.4,3338613.5,3676084,3087427.7,2940029.2,3551608.2,2822154,2431782.4,3387596.5};
+ST(0.025130011,0.29009115,0,0.028198926,0.28535727,0,0.031264826,0.29263185,0){142877.47,230200.16,124484.17,-427099.39,-685197.76,-372709.78,706741.94,1124120.6,618717.86,-978805.55,-1536674.3,-861054.65,1240164.3,1912913.1,1098239.8};
+ST(0.066799394,0.09162077,0,0.069968451,0.098831219,0,0.061027247,0.098743066,0){2974160.1,2730411,3173016.6,440022.16,57648.531,72008.811,-2469083.6,-2671597.7,-3099474,-3274492.4,-2785714.6,-3241975.4,-1290097.2,-173126.8,-216202.29};
+ST(0.063469548,0.28521738,0,0.056292141,0.2827555,0,0.059078636,0.27701937,0){273598.49,343081.75,447007.97,-814255.31,-1018093.3,-1315269.1,1335465.2,1660020.8,2107766.2,-1824812,-2248005.1,-2778864.5,2270429.1,2762903.8,3289755.3};
+ST(0.05718895,0.22161738,0,0.062992669,0.22303634,0,0.059957308,0.22757204,0){1508977,1396775.9,1366903.5,-3566099.1,-3331109.7,-3351367.9,3352547.9,3216330,3498598.8,-1004251.2,-1122974.8,-1727811.3,-1983866.6,-1661551.4,-990620.01};
+ST(0.063265205,0.21633109,0,0.062992669,0.22303634,0,0.05718895,0.22161738,0){1505335.5,1396775.9,1508977,-3432481.9,-3331109.7,-3566099.1,2888962.8,3216330,3352547.9,-265885.87,-1122974.8,-1004251.2,-2549234.8,-1661551.4,-1983866.6};
+ST(0.044637502,0.20577347,0,0.045116599,0.21481108,0,0.038843793,0.21103197,0){1811821.2,1654487.5,1637090.1,-3810004,-3731787.4,-3590120.4,2390091.8,3030991.5,2645890.8,1174216.7,-73694.316,433646.44,-3685779.4,-2938909.4,-3163532.2};
+ST(0.061631884,0.26868773,0,0.055001581,0.27169863,0,0.0528723,0.26429657,0){591535.29,565900.8,718299.05,-1711593.4,-1648356.5,-2055661.9,2649353.2,2587095.5,3109067.1,-3304968.8,-3300283.2,-3733060,3608394.3,3725567.5,3841282.5};
+ST(0.049232245,0.21047418,0,0.045116599,0.21481108,0,0.044637502,0.20577347,0){1752658.6,1654487.5,1811821.2,-3827070.5,-3731787.4,-3810004,2777012.8,3030991.5,2390091.8,540242.46,-73694.316,1174216.7,-3416565.4,-2938909.4,-3685779.4};
+ST(0.1,0.17142857,0,0.093873231,0.17693503,0,0.092195724,0.16853594,0){0,445896.9,598378.34,0,-694096.79,-829189.07,0,-59504.029,-278570.16,0,727141.13,936666.51,0,-345394.37,-82641.6};
+ST(0.0060491453,0.25298129,0,0.0071908097,0.26035264,0,0,0.25714286,0){178654.23,179155.76,0,-493529.07,-507033.49,0,691183.17,748779.14,0,-724662.05,-863311.12,0,585970.08,830950.48,0};
+ST(0.0072553778,0.13224921,0,0.014210915,0.13228117,0,0.012304267,0.13852123,0){674958.82,1289449.4,1094693.2,-425463.67,-813665.75,-832176.34,-832230.25,-1589638.3,-1294374.3,117822.57,227067.92,521821.54,875622.71,1673024.3,1419655.5};
+ST(0.028359285,0.029784535,0,0.030602087,0.036163623,0,0.023478597,0.036718106,0){2981166.2,3125169.1,2561783.8,2693525.9,2682310.4,2187675.4,2145980.7,1859340.6,1494080.3,1391347.7,772883.67,582277.59,502245.34,-423255.99,-414804.14};
+ST(0.023478597,0.036718106,0,0.030602087,0.036163623,0,0.028678488,0.042143634,0){2561783.8,3125169.1,2968313.4,2187675.4,2682310.4,2399521.8,1494080.3,1859340.6,1370917.4,582277.59,772883.67,79587.615,-414804.14,-423255.99,-1227272.3};
+ST(0.0069613667,0.17349451,0,0.014405512,0.17061143,0,0.013878694,0.17880836,0){517779.21,1063653,971566.52,-769992.03,-1519257.6,-1548960.4,-142713.64,-412907.51,-51095.574,839532.94,1696192.6,1579530,-266340.1,-313907.63,-887966.26};
+ST(0.069467767,0.146519,0,0.068478919,0.13862632,0,0.075488644,0.14176328,0){2287173.5,2426951.1,1990888.2,-2120501.9,-1850187.5,-1647841.2,-2441744.6,-2866745.3,-2274843.7,1942651.5,1169007.7,1255935.2,2583122,3144665.9,2491166.6};
+ST(0.043838979,0.034579424,0,0.048866761,0.029559705,0,0.052748817,0.036292023,0){3745913.7,3831772.8,3796611.1,3260141.4,3467532.3,3254886.9,2351583.2,2773676.3,2248728.5,1138042.7,1816186,921690.78,-223347.31,685852.4,-537197.11};
+ST(0.0528723,0.26429657,0,0.049721881,0.27094787,0,0.043491003,0.26677795,0){718299.05,588018.61,657627.62,-2055661.9,-1710042.9,-1894105.9,3109067.1,2675009.8,2903724.9,-3733060,-3394309,-3565612.1,3841282.5,3801713.7,3800401.2};
+ST(0.044548934,0.094607351,0,0.039702853,0.10111678,0,0.03690243,0.09394169,0){3364209.6,3175586.8,3135041.5,323528.56,-64516.934,337961.95,-3009655.6,-3238866.3,-2760700,-3622750.1,-3108635.2,-3396384.7,-961698.97,193445.51,-1002139.6};
+ST(0.089858368,0.18421461,0,0.095453592,0.18738967,0,0.091593501,0.1915477,0){692603.24,307137.29,544831.72,-1178349.1,-541566.85,-1004107.1,133849.22,106216.39,301623.68,1084450.2,460538.95,749822.54,-894447.98,-458087.35,-933881.71};
+ST(0,0.12857143,0,0.0061411468,0.1246533,0,0.0072553778,0.13224921,0){0,591118.91,674958.82,0,-280990.71,-425463.67,0,-738586.84,-832230.25,0,-106527.54,117822.57,0,682629.18,875622.71};
+ST(0.057612168,0.01845715,0,0.052049192,0.01582547,0,0.056199026,0.010061392,0){3752599.8,3859264.8,3801979,3612875.5,3753529.9,3759859.9,3338613.5,3544947.6,3676084,2940029.2,3239251.6,3551608.2,2431782.4,2844641.6,3387596.5};
+ST(0.015977634,0.20443356,0,0.021120118,0.21068669,0,0.013229009,0.21171696,0){895779.15,1077357.5,698716.07,-1862602.8,-2356401.7,-1540332.8,1114548.4,1720167.1,1156621.3,659707.69,314292.11,147278.69,-1827076.9,-2093742.8,-1334554.8};
+ST(0.0064812773,0.046734878,0,0.0063343033,0.038958017,0,0.011573719,0.041901165,0){761350.4,751213.74,1347025.1,582610.88,627892.11,1091815.8,267082.8,401490.67,629744.45,-111174.21,109174.99,48353.226,-463416.67,-201236.23,-542301.86};
+ST(0.054395265,0.16699477,0,0.054296142,0.16027015,0,0.061476805,0.16269562,0){2465605.5,2568973.7,2391378.9,-3338618.7,-3120486,-3025373.1,-1283530.8,-1899085.7,-1589341.3,3793219.5,3528266.9,3446908.2,-59660.123,1141594.9,675366.83};
+ST(0.0094805882,0.16707285,0,0.0046637588,0.16745308,0,0.0068768393,0.16098373,0){730151.01,362371.83,553409.29,-989834.58,-494096.85,-680450.71,-378084.11,-182769.85,-397156.36,1124284.7,560561.48,771605.48,-22095.939,-21256.565,219690.78};
+ST(0.017763535,0.12074209,0,0.023213665,0.1150537,0,0.025139549,0.12057635,0){1657769.5,2130593.3,2224740.3,-657738.05,-605772.32,-875333.98,-2054600.3,-2564157.8,-2755721.9,-581651.26,-1229375.9,-796179.51,1703675.4,1684092.7,2272644.8};
+ST(0,0.14285714,0,0.0078195435,0.14622426,0,0,0.15,0){0,680366.1,0,0,-626541.18,0,0,-729870.69,0,0,568744.13,0,0,774663.29,0};
+ST(0,0.10714286,0,0.0081152275,0.10988635,0,0,0.11428571,0){0,821145.89,0,0,-151361.79,0,0,-944689.8,0,0,-619246.83,0,0,439508.43,0};
+ST(0.023483408,0.28013687,0,0.025044032,0.27464897,0,0.030312881,0.27848596,0){270985.88,363665.57,355416.48,-801278.39,-1065519.5,-1048284.8,1297043.7,1692735.8,1688178.9,-1736920.8,-2201379.5,-2242771,2101746.5,2555652.6,2683885.3};
+ST(0.085369203,0.17624497,0,0.083969261,0.16737329,0,0.092195724,0.16853594,0){1039089.6,1198489.7,598378.34,-1603144.1,-1632158.2,-829189.07,-168940.91,-607916.58,-278570.16,1695116.9,1852187.2,936666.51,-751642.95,-62490.334,-82641.6};
+ST(0.0910478,0.13167545,0,0.093823791,0.12410599,0,0.1,0.12857143,0){831136.87,595735.92,0,-514132.23,-276601.23,0,-1027305.8,-743959.63,0,122313.64,-121937.8,0,1073956.7,678759.2,0};
+ST(0.1,0.10714286,0,0.091758141,0.11296708,0,0.091053567,0.10618538,0){0,824791.32,914271.31,0,-201020.76,-104388.15,0,-976886.6,-1006721.9,0,-537824.26,-787386.88,0,570097.26,309052.61};
+ST(0.01808004,0.0081573173,0,0.022427218,0.014872357,0,0.015416139,0.018002698,0){2085729.2,2505875.7,1798828.3,2070583.9,2445229.8,1735136,2040406.9,2325397.7,1609995.5,1995444.2,2149288.4,1427830.3,1935913.6,1920956.8,1194733.1};
+ST(0.015498485,0.28248556,0,0.0220603,0.28602893,0,0.017990672,0.29207379,0){166274.63,181204.07,86228.122,-493262.57,-539738.59,-258100.45,803759.61,886739.53,428229.3,-1087394.1,-1214791.9,-595472.42,1334475.8,1516611.7,758576.15};
+ST(0.013229009,0.21171696,0,0.021120118,0.21068669,0,0.018343869,0.21720619,0){698716.07,1077357.5,888277.19,-1540332.8,-2356401.7,-2037897.4,1156621.3,1720167.1,1749211,147278.69,314292.11,-225952.88,-1334554.8,-2093742.8,-1457259.1};
+ST(0.061015306,0.048529238,0,0.060555575,0.040182349,0,0.066401409,0.0434645,0){3533367.8,3588260.7,3289675.8,2640342.3,2962222.2,2619840.6,1080012.2,1819353,1416557.6,-753291.7,359025.67,-75156.319,-2396723.8,-1164330.1,-1551772};
+ST(0.054794838,0.043915046,0,0.060555575,0.040182349,0,0.061015306,0.048529238,0){3735662.6,3588260.7,3533367.8,2959425,2962222.2,2640342.3,1568238.5,1819353,1080012.2,-148813.91,359025.67,-753291.7,-1835117.4,-1164330.1,-2396723.8};
+ST(0.01062282,0.18656765,0,0.012931293,0.19295437,0,0.0066871595,0.19241823,0){711483.53,815194.79,432113.5,-1243147.4,-1524077.7,-803518.34,217509.34,510133.92,258472.73,1080570.1,1080471.8,581490.34,-1025407.6,-1450076.4,-758588.26};
+ST(0.010546892,0.2198034,0,0.0069979116,0.22643766,0,0,0.22142857,0){514716.79,317964.48,0,-1201974.2,-774386.26,0,1090194.6,793599.18,0,-253690.09,-364658.79,0,-751659.26,-270536.88,0};
+ST(0.04704595,0.16277363,0,0.054296142,0.16027015,0,0.054395265,0.16699477,0){2543508.6,2568973.7,2465605.5,-3221973.5,-3120486,-3338618.7,-1684138.2,-1899085.7,-1283530.8,3671419.3,3528266.9,3793219.5,704902.67,1141594.9,-59660.123};
+ST(0.015758122,0.23699049,0,0.016939848,0.22904958,0,0.022740693,0.23189018,0){597291.98,714788.59,887604.04,-1541119.1,-1767596.2,-2230116.3,1837947.1,1888698.3,2485475.6,-1363109.4,-1014237.8,-1529145.6,315646.37,-395054.79,-172982.46};
+ST(0.076430303,0.18837043,0,0.082729031,0.18391978,0,0.084368038,0.19048099,0){1444535.6,1144258.1,992852.93,-2574453.4,-1940160.8,-1809621.2,569102.25,205244.05,495817.1,2129625.3,1797438.3,1401810.9,-2235391.7,-1455642.1,-1649308.4};
+ST(0.077619244,0.18028791,0,0.082729031,0.18391978,0,0.076430303,0.18837043,0){1471797.4,1144258.1,1444535.6,-2389894.4,-1940160.8,-2574453.4,18944.546,205244.05,569102.25,2378251.6,1797438.3,2129625.3,-1502642.9,-1455642.1,-2235391.7};
+ST(0.059078636,0.27701937,0,0.056292141,0.2827555,0,0.051703203,0.27754162,0){447007.97,343081.75,454636.43,-1315269.1,-1018093.3,-1338881.7,2107766.2,1660020.8,2149437.1,-2778864.5,-2248005.1,-2841702,3289755.3,2762903.8,3377384.9};
+ST(0.010546892,0.2198034,0,0.0051799073,0.21317882,0,0.013229009,0.21171696,0){514716.79,276031.48,698716.07,-1201974.2,-615227.88,-1540332.8,1090194.6,479976.29,1156621.3,-253690.09,25450.705,147278.69,-751659.26,-511551.59,-1334554.8};
+ST(0.061027247,0.098743066,0,0.052532368,0.096036702,0,0.058212185,0.089881183,0){3173016.6,3389506.1,3344291.6,72008.811,240670.51,593905.21,-3099474,-3131818.5,-2645013.4,-3241975.4,-3594959.1,-3708817.1,-216202.29,-718569.73,-1722713.3};
+ST(0.09156348,0.14589395,0,0.09308158,0.15403623,0,0.084604507,0.15255901,0){734092.88,579061.91,1258841.2,-670961.7,-628036.95,-1326319,-791796.8,-525997.02,-1187789.9,602866.55,672596.25,1390056.3,843431.47,469080.04,1113216.6};
+ST(0,0.2,0,0.007303543,0.20469543,0,0,0.20714286,0){0,422375.13,0,0,-880191.16,0,0,531663.92,0,0,303952.91,0,0,-861341.37,0};
+ST(0.052478219,0.23860916,0,0.056766116,0.23329497,0,0.059437672,0.2400817,0){1222305.6,1298096.4,1145348.7,-3178913.4,-3286228.7,-2999714,3866354.4,3735031.6,3711340.5,-3010118,-2434254.7,-3009146,951644.63,-7070.0355,1160252.2};
+ST(0.045331711,0.23557633,0,0.04727629,0.22823863,0,0.050960377,0.23252058,0){1270563.3,1418822.2,1342135.9,-3255008.9,-3492237.2,-3383651.2,3813331,3684627.2,3804738.6,-2700862,-1892328,-2403721.7,404484.48,-919608.01,-148681.88};
+ST(0.072044079,0.08604506,0,0.075872285,0.081656016,0,0.079265602,0.086677581,0){2688599.4,2427639,2114636.1,649473.83,758134.07,488789.06,-1882262.6,-1432759.9,-1512904.7,-2986497.2,-2638364.3,-2351470.6,-1825996.4,-2029677.1,-1382326.1};
+ST(0.084917502,0.034253561,0,0.092450683,0.030760689,0,0.092141527,0.03991184,0){1742331.8,900007.85,927649.93,1520580.8,807431.66,767955.56,1105294,631804.95,476054.53,549324.68,391202.83,102192.68,-76880.401,110124.82,-289378.9};
+ST(0.092295863,0.26000779,0,0.092520768,0.26920591,0,0.085115353,0.26563346,0){193329.27,145042.72,313056.52,-546576.12,-420173.4,-899063.8,805368.84,651988.34,1369900.4,-924990.4,-816598.86,-1665255.4,884724.5,896908.09,1747205.8};
+ST(0.059437672,0.2400817,0,0.056766116,0.23329497,0,0.064373335,0.2338171,0){1145348.7,1298096.4,1185902.3,-2999714,-3286228.7,-3010536.1,3711340.5,3735031.6,3446119.8,-3009146,-2434254.7,-2291596.2,1160252.2,-7070.0355,79206.699};
+ST(0.075978544,0.034466341,0,0.067616069,0.037109229,0,0.068707287,0.030314019,0){2615244.9,3239242.7,3188897.7,2278283.7,2756202.5,2870259.7,1647758.2,1862139.4,2264806.3,804880.96,690369.93,1433032.7,-142067.87,-584563.48,457746.25};
+ST(0.01062282,0.18656765,0,0.016878531,0.18478654,0,0.017373248,0.19021363,0){711483.53,1113458.1,1095255.9,-1243147.4,-1906862.4,-1990705.9,217509.34,245299.96,532263.7,1080570.1,1732097.5,1555631.8,-1025407.6,-1479759.2,-1804413.6};
+ST(0.013878694,0.17880836,0,0.016878531,0.18478654,0,0.01062282,0.18656765,0){971566.52,1113458.1,711483.53,-1548960.4,-1906862.4,-1243147.4,-51095.574,245299.96,217509.34,1579530,1732097.5,1080570.1,-887966.26,-1479759.2,-1025407.6};
+ST(0.069536278,0.26943087,0,0.068237016,0.26229006,0,0.076498673,0.26519709,0){505602.11,639705.29,473307.48,-1465439,-1820649,-1357765.2,2276404,2721368.6,2063933,-2856108.7,-3203243.1,-2499100.3,3145421.5,3191912.1,2605934.6};
+ST(0.059551151,0.20970619,0,0.053221516,0.20704838,0,0.060432552,0.20227914,0){1688112.8,1805672.4,1798951.1,-3664209.4,-3837129.3,-3671781.8,2601193.1,2511247.5,2023610.8,619333.89,1011998.4,1565241.8,-3326584.6,-3650194.7,-3653837};
+ST(0.066799394,0.09162077,0,0.072044079,0.08604506,0,0.07492972,0.092844339,0){2974160.1,2688599.4,2431427.6,440022.16,649473.83,308451.38,-2469083.6,-1882262.6,-2083891.4,-3274492.4,-2986497.2,-2656803.1,-1290097.2,-1825996.4,-910298.79};
+ST(0.0098751756,0.25600949,0,0.0071908097,0.26035264,0,0.0060491453,0.25298129,0){270470.11,179155.76,178654.23,-755004.71,-507033.49,-493529.07,1082095.4,748779.14,691183.17,-1183544.7,-863311.12,-724662.05,1038261.4,830950.48,585970.08};
+ST(0.077140734,0.17217741,0,0.083969261,0.16737329,0,0.085369203,0.17624497,0){1584233.7,1198489.7,1039089.6,-2313491.7,-1632158.2,-1603144.1,-519338.58,-607916.58,-168940.91,2552719.3,1852187.2,1695116.9,-655929.75,-62490.334,-751642.95};
+ST(0.041402067,0.22952626,0,0.04727629,0.22823863,0,0.045331711,0.23557633,0){1348916.4,1418822.2,1270563.3,-3344816,-3492237.2,-3255008.9,3600200.4,3684627.2,3813331,-1982154,-1892328,-2700862,-667743.82,-919608.01,404484.48};
+ST(0.0071147476,0.24137211,0,0.013821768,0.24617185,0,0.0087429334,0.24792416,0){259907.57,454053.45,283453.34,-684802.64,-1221678.8,-768118.62,859611.54,1611329.8,1029935.2,-720499.62,-1502439.1,-992967.39,317972.39,928515.88,667809.3};
+ST(0.007303543,0.20469543,0,0.0051799073,0.21317882,0,0,0.20714286,0){422375.13,276031.48,0,-880191.16,-615227.88,0,531663.92,479976.29,0,303952.91,25450.705,0,-861341.37,-511551.59,0};
+ST(0.052748817,0.036292023,0,0.054261983,0.029107824,0,0.060819012,0.031697917,0){3796611.1,3801269,3608360,3254886.9,3450822.2,3214477.8,2248728.5,2782228.4,2469695.4,921690.78,1857139.4,1455299.1,-537197.11,760852.59,281702.17};
+ST(0.064832361,0.062804408,0,0.070754378,0.060222618,0,0.072323403,0.067507008,0){3281120.4,2932444.5,2781512.1,1912310.8,1804303.3,1448400.9,-254314.65,-17984.254,-578922.09,-2314932.7,-1833384.6,-2328912.3,-3410309.6,-2943704.7,-2963263.7};
+ST(0.011197941,0.071439681,0,0.0060853536,0.074713803,0,0.0062494098,0.068021592,0){1244724.5,681675.12,709501.16,579995.21,285253.65,364477.97,-394493.66,-277070.48,-157824.6,-1158343.6,-678306.76,-603457.47,-1303869.8,-685312.86,-756039.79};
+ST(0.05288218,0.14757716,0,0.045364072,0.14896511,0,0.047918899,0.14257657,0){2767228.4,2729630.7,2842478.3,-2626819.9,-2670475.8,-2400971.6,-2900596.1,-2787568.3,-3215455,2479722.6,2610132.2,1901551.7,3026446,2844182.1,3510918.5};
+ST(0,0.18571429,0,0.0062925762,0.18063125,0,0.01062282,0.18656765,0){0,445914.92,711483.53,0,-727143.63,-1243147.4,0,12632.594,217509.34,0,719304.1,1080570.1,0,-466469.22,-1025407.6};
+ST(0.077140734,0.17217741,0,0.071841704,0.17726974,0,0.071059851,0.17209017,0){1584233.7,1799263.7,1900690.4,-2313491.7,-2812994.5,-2772233.4,-519338.58,-214389.53,-629520.98,2552719.3,2933842.6,3060958.1,-655929.75,-1438939.3,-774142.34};
+ST(0.066992124,0.20847551,0,0.06966854,0.20076802,0,0.075422073,0.20645372,0){1540360.8,1570520.4,1273700.5,-3311175.4,-3162888.4,-2693470,2266191.6,1636334.6,1728669,706070.36,1503948.1,766631.5,-3078419.5,-3161601.9,-2583646.6};
+ST(0.039157325,0.25334591,0,0.043027686,0.24899973,0,0.04563604,0.25694979,0){884627.38,999522.33,859240.08,-2446896,-2720190.5,-2406042.8,3436661.2,3683283.3,3472131.8,-3622356.9,-3620573.8,-3844488.4,2960330.2,2549278.8,3448330.3};
+ST(0.070175425,0.16144206,0,0.072573599,0.16764459,0,0.067098511,0.16826118,0){2074683.8,1881427.5,2121688.2,-2570674.4,-2572760.4,-2928224.5,-1460177,-936075.04,-1008555.7,2919916.2,2916777.1,3311710.7,762077.82,-135849.37,-250662.47};
+ST(0.014502412,0.16316663,0,0.014405512,0.17061143,0,0.0094805882,0.16707285,0){1121335,1063653,730151.01,-1429592.9,-1519257.6,-989834.58,-728363.13,-412907.51,-378084.11,1629901.1,1696192.6,1124284.7,280110.31,-313907.63,-22095.939};
+ST(0.060819012,0.031697917,0,0.057707972,0.025075094,0,0.064795861,0.023107998,0){3608360,3734947.8,3443592.1,3214477.8,3478918.2,3242943.8,2469695.4,2984396.6,2853338,1455299.1,2285289.9,2297494.4,281702.17,1429238.8,1607540.9};
+ST(0.01882241,0.070374011,0,0.012193394,0.066188359,0,0.016702178,0.061420197,0){2018056.9,1364188,1844408.3,970762.8,734639.92,1107331.1,-580354.6,-233939.49,-72241.295,-1830388.5,-1094586.7,-1222910.6,-2130853.3,-1450385,-1885264.1};
+ST(0.011197941,0.071439681,0,0.012193394,0.066188359,0,0.01882241,0.070374011,0){1244724.5,1364188,2018056.9,579995.21,734639.92,970762.8,-394493.66,-233939.49,-580354.6,-1158343.6,-1094586.7,-1830388.5,-1303869.8,-1450385,-2130853.3};
+ST(0.013132659,0.04767246,0,0.014691551,0.054118398,0,0.0094132111,0.052421332,0){1507774.2,1659245.8,1088603.4,1139737.5,1140472.1,768702.62,493500.09,265092.56,222919.17,-273193.01,-693242.8,-388347.22,-973395.4,-1435183.5,-885762.83};
+ST(0,0.14285714,0,0.0054758376,0.13911323,0,0.0078195435,0.14622426,0){0,495708.7,680366.1,0,-382921.42,-626541.18,0,-582869.54,-729870.69,0,250325.59,568744.13,0,639819.51,774663.29};
+ST(0.09071018,0.22887426,0,0.084319616,0.22565969,0,0.091864029,0.22106993,0){406264.77,696453.76,394005.54,-1003622.2,-1688204.7,-927852.61,1069446.3,1707540.6,863120.02,-568907.82,-743250.94,-241435.16,-233040.27,-649719.93,-536498.87};
+ST(0.033874053,0.071548869,0,0.037071258,0.0642048,0,0.041057987,0.068843254,0){3157862.8,3365311.2,3488848.8,1466537.3,1900443.5,1752771.3,-1010259.7,-391679.98,-855539,-2946084.6,-2513388.8,-3038218.5,-3304540.6,-3541461.8,-3709409.4};
+ST(0.07492972,0.092844339,0,0.069968451,0.098831219,0,0.066799394,0.09162077,0){2431427.6,2730411,2974160.1,308451.38,57648.531,440022.16,-2083891.4,-2671597.7,-2469083.6,-2656803.1,-2785714.6,-3274492.4,-910298.79,-173126.8,-1290097.2};
+ST(0,0.2,0,0.005051806,0.19767546,0,0.007303543,0.20469543,0){0,313084.45,422375.13,0,-612892.85,-880191.16,0,273796.53,531663.92,0,350786.74,303952.91,0,-609909.8,-861341.37};
+ST(0.04563604,0.25694979,0,0.049037582,0.25027532,0,0.054010827,0.25507988,0){859240.08,998508.07,897184.36,-2406042.8,-2730849.8,-2496661.6,3472131.8,3739350.2,3553831.7,-3844488.4,-3756698.7,-3839088.9,3448330.3,2778087.3,3290330.5};
+ST(0.084604507,0.15255901,0,0.083337094,0.16031526,0,0.077069107,0.15686929,0){1258841.2,1295652.6,1743907.9,-1326319,-1575018.8,-1994600,-1187789.9,-956036.82,-1457243.4,1390056.3,1781183.7,2204191.1,1113216.6,571788.58,1140253.2};
+ST(0.082709707,0.12855445,0,0.083559522,0.13424014,0,0.076271482,0.13373081,0){1568327.1,1462145.4,2012844.4,-869760.99,-981746.52,-1330317.6,-1955764.1,-1784737.2,-2463975.8,-1353.9511,395362.65,494859.01,1955094.7,1914407.3,2631758.9};
+ST(0.025468185,0.010276157,0,0.022427218,0.014872357,0,0.01808004,0.0081573173,0){2780034,2505875.7,2085729.2,2747892,2445229.8,2070583.9,2683968.5,2325397.7,2040406.9,2589008.8,2149288.4,1995444.2,2463902.9,1920956.8,1935913.6};
+ST(0.017990672,0.29207379,0,0.0220603,0.28602893,0,0.025130011,0.29009115,0){86228.122,181204.07,142877.47,-258100.45,-539738.59,-427099.39,428229.3,886739.53,706741.94,-595472.42,-1214791.9,-978805.55,758576.15,1516611.7,1240164.3};
+ST(0.076271482,0.13373081,0,0.081009521,0.1385969,0,0.075488644,0.14176328,0){2012844.4,1630909.4,1990888.2,-1330317.6,-1242340.3,-1647841.2,-2463975.8,-1926924,-2274843.7,494859.01,783271.16,1255935.2,2631758.9,2113542.9,2491166.6};
+ST(0.024008584,0.022367291,0,0.021348697,0.029751655,0,0.016759526,0.025876157,0){2639060.6,2382657.5,1932221.9,2494948.4,2153252.9,1791225.7,2214593.6,1716520.5,1519509.7,1813324.4,1114508.8,1136895.1,1312931.3,404958.41,671081.1};
+ST(0.020473685,0.087577432,0,0.025411973,0.082310594,0,0.027903545,0.087518505,0){2087024.2,2525130.6,2674848,451292.51,762374.09,580994.77,-1538224.3,-1532614.6,-1967676.8,-2322280.1,-2757779.1,-2976106,-1286407.6,-2058136.4,-1655065.1};
+ST(0.019499739,0.079597209,0,0.025411973,0.082310594,0,0.020473685,0.087577432,0){2040354.6,2525130.6,2087024.2,702945.71,762374.09,451292.51,-1095289.5,-1532614.6,-1538224.3,-2175701.2,-2757779.1,-2322280.1,-1830384.7,-2058136.4,-1286407.6};
+ST(0.039366597,0.19088868,0,0.044234359,0.18859393,0,0.043569257,0.19619451,0){1982365.2,2102462.5,1966078.6,-3628592.6,-3756018.8,-3794921.6,1030950.1,851571.98,1563901,2772526.5,3086402.5,2340412.7,-3333638.5,-3279385.1,-3741435.4};
+ST(0.042857143,0,0,0.039686874,0.0066116125,0,0.035714286,0,0){3783299.5,3676489.9,3496308.9,3783327.5,3658909.3,3496337.7,3783379.6,3623831.1,3496399.5,3783486.4,3571457.2,3496538.6,3783576.5,3501797.4,3496562.8};
+ST(0.035714286,0.3,0,0.03928574,0.29335694,0,0.042857143,0.3,0){0,127378.94,0,0,-381522.06,0,0,633829.06,0,0,-883092.25,0,0,1127859.7,0};
+ST(0.049165273,0.076760106,0,0.047307891,0.081963043,0,0.041803352,0.076750149,0){3570137.5,3516083,3453761.9,1384898,1080946.4,1340279.2,-1648055.9,-2102837.3,-1593440.1,-3672308.6,-3830300,-3552303.7,-3449021.3,-2905310.5,-3337911.6};
+ST(0.1,0.057142857,0,0.094913401,0.051076335,0,0.1,0.05,0){0,595503.05,0,0,429138.45,0,0,142901.48,0,0,-183223.65,0,0,-458373.75,0};
+ST(0.1,0.25,0,0.095090425,0.2489538,0,0.1,0.24285714,0){0,157454.16,0,0,-428416.46,0,0,579817.55,0,0,-569427.53,0,0,400020.01,0};
+ST(0.071428571,0,0,0.068476894,0.0069177029,0,0.064285714,0,0){3033974.4,3242851.4,3496327.6,3033978.9,3225849.8,3496358.5,3033982.8,3191931.3,3496415,3034008.5,3141298.2,3496523.2,3033714,3073847.6,3496472.9};
+ST(0.064285714,0.3,0,0.068366879,0.29272708,0,0.071428571,0.3,0){0,123803.43,0,0,-370697.46,0,0,615462.12,0,0,-856697.17,0,0,1092834.3,0};
+ST(0.057612168,0.01845715,0,0.057707972,0.025075094,0,0.051167355,0.022914381,0){3752599.8,3734947.8,3850137.8,3612875.5,3478918.2,3629520.4,3338613.5,2984396.6,3200919.1,2940029.2,2285289.9,2588908.3,2431782.4,1429238.8,1828396.4};
+ST(0.021658338,0.054940441,0,0.025221599,0.062165695,0,0.016702178,0.061420197,0){2341024.9,2618029.3,1844408.3,1587273.2,1547191.2,1107331.1,322446.89,-156575.4,-72241.295,-1046241,-1796512.5,-1222910.6,-2078353.5,-2702051.5,-1885264.1};
+ST(0.03663522,0.040674234,0,0.030602087,0.036163623,0,0.035858843,0.031497608,0){3463485.9,3125169.1,3456371.8,2844620.6,2682310.4,3083741.5,1717431.6,1859340.6,2378649.5,283267.24,772883.67,1417116.3,-1201989.6,-423255.99,302618.73};
+ST(0.054240748,0.10280037,0,0.052532368,0.096036702,0,0.061027247,0.098743066,0){3302360.6,3389506.1,3173016.6,-169115.68,240670.51,72008.811,-3462856.5,-3131818.5,-3099474,-3116478.2,-3594959.1,-3241975.4,505791.56,-718569.73,-216202.29};
+ST(0.030046638,0.13690443,0,0.033990129,0.14330646,0,0.026018946,0.14387862,0){2369378.2,2486957.5,2064539,-1721516.8,-2138608.5,-1800072.3,-2840145.3,-2786553.8,-2295230.1,944948.24,1748365.6,1506177.8,3098367.4,3031412.6,2488196.2};
+ST(0.054957014,0.24657048,0,0.060567191,0.25172758,0,0.054010827,0.25507988,0){1058545,917440.34,897184.36,-2852831,-2522838.3,-2496661.6,3777171.8,3497206.6,3553831.7,-3549694.2,-3596815.5,-3839088.9,2239441.1,2796536,3290330.5};
+ST(0.014305262,0.26641769,0,0.023009638,0.26878949,0,0.018422519,0.27450763,0){294901.31,417665.14,282501.19,-848621.76,-1208783.5,-827496.14,1298521.9,1871958.7,1313896,-1589572.3,-2337004.8,-1707268.8,1686004.5,2554445.3,1979556.1};
+ST(0.1,0.2,0,0.093164956,0.1980516,0,0.1,0.19285714,0){0,420734.09,0,0,-826537.04,0,0,376428.12,0,0,463603.83,0,0,-823893.15,0};
+ST(0.049204373,0.010884263,0,0.051745598,0.0053231545,0,0.056199026,0.010061392,0){3873084,3873250.9,3801979,3822842.7,3861228.9,3759859.9,3723003.5,3837214.6,3676084,3574883.8,3801308.2,3551608.2,3380124.5,3753417.7,3387596.5};
+ST(0.050010485,0.1548865,0,0.045364072,0.14896511,0,0.05288218,0.14757716,0){2672912.2,2729630.7,2767228.4,-2946373.7,-2670475.8,-2626819.9,-2371553.9,-2787568.3,-2900596.1,3189127.5,2610132.2,2479722.6,2045305.7,2844182.1,3026446};
+ST(0.055764419,0.28986395,0,0.051526128,0.29458598,0,0.048791783,0.28884593,0){202473.1,109871.78,226341.07,-605163.67,-329256.34,-675936.71,1001119.7,547568.39,1116322.7,-1385941.2,-764098.34,-1541505,1755276.4,977975.34,1945474.1};
+ST(0.083190767,0.25723975,0,0.074279052,0.25633166,0,0.07921504,0.25033934,0){434158.6,635900.39,606155.6,-1216864.4,-1777029.4,-1658203,1759626.8,2553015.8,2271843.6,-1955417.3,-2804423.5,-2284831,1765235.2,2479429.3,1693484.6};
+ST(0.077364239,0.048764008,0,0.073234584,0.04253025,0,0.082493405,0.042375289,0){2450679,2820532.7,1978611.8,1825420.5,2270240.9,1595319.9,734405.59,1277003.9,902966.17,-544039.45,34586.382,35643.43,-1683943.8,-1214797.7,-838916.97};
+ST(0.091953893,0.078440357,0,0.086276325,0.073599227,0,0.09123018,0.070922096,0){889726.23,1502743.3,983713.53,322434.75,653401.45,465586.72,-450550.32,-565297.67,-297764.17,-936443.15,-1464602.7,-904277.98,-825354.72,-1536324.4,-1034644.8};
+ST(0.041002292,0.08644635,0,0.033761495,0.088496681,0,0.032911969,0.081185013,0){3351345,3029395.9,3037931.3,787437.3,608605.12,971274.35,-2379027.1,-2298547.5,-1756226.8,-3725698.5,-3368980,-3289165.4,-2222336.9,-1747439.7,-2584916.3};
+ST(0.038843793,0.21103197,0,0.036840853,0.20596239,0,0.044637502,0.20577347,0){1637090.1,1679916.9,1811821.2,-3590120.4,-3538121.9,-3810004,2645890.8,2233718.4,2390091.8,433646.44,1067350,1174216.7,-3163532.2,-3414669.4,-3685779.4};
+ST(0.013794295,0.15422926,0,0.014502412,0.16316663,0,0.0068768393,0.16098373,0){1126466.2,1121335,553409.29,-1226232.2,-1429592.9,-680450.71,-1017954.8,-728363.13,-397156.36,1316565.7,1629901.1,771605.48,901352.54,280110.31,219690.78};
+ST(0.044637502,0.20577347,0,0.036840853,0.20596239,0,0.038597539,0.20095921,0){1811821.2,1679916.9,1801301.7,-3810004,-3538121.9,-3633864.6,2390091.8,2233718.4,1895634,1174216.7,1067350,1705394,-3685779.4,-3414669.4,-3630918.1};
+ST(0.056199026,0.010061392,0,0.051745598,0.0053231545,0,0.057142857,0,0){3801979,3873250.9,3783317.5,3759859.9,3861228.9,3783357,3676084,3837214.6,3783457.6,3551608.2,3801308.2,3783701.2,3387596.5,3753417.7,3783873.9};
+ST(0.057142857,0,0,0.06203594,0.0060944193,0,0.056199026,0.010061392,0){3783317.5,3604620.2,3801979,3783357,3589956.2,3759859.9,3783457.6,3560685.5,3676084,3783701.2,3516960.1,3551608.2,3783873.9,3458793.9,3387596.5};
+ST(0.049739958,0.088394034,0,0.047307891,0.081963043,0,0.054828578,0.081464579,0){3472240.4,3516083,3492382.6,703521.31,1080946.4,1101278.5,-2626240.1,-2102837.3,-2043909.2,-3862017.3,-3830300,-3789901.6,-2018648.2,-2905310.5,-2941538.5};
+ST(0.054828578,0.081464579,0,0.047307891,0.081963043,0,0.049165273,0.076760106,0){3492382.6,3516083,3570137.5,1101278.5,1080946.4,1384898,-2043909.2,-2102837.3,-1648055.9,-3789901.6,-3830300,-3672308.6,-2941538.5,-2905310.5,-3449021.3};
+ST(0.057142857,0.3,0,0.051526128,0.29458598,0,0.055764419,0.28986395,0){0,109871.78,202473.1,0,-329256.34,-605163.67,0,547568.39,1001119.7,0,-764098.34,-1385941.2,0,977975.34,1755276.4};
+ST(0.055764419,0.28986395,0,0.061805884,0.29356168,0,0.057142857,0.3,0){202473.1,121923.05,0,-605163.67,-365207.83,0,1001119.7,606815.62,0,-1385941.2,-845641.09,0,1755276.4,1080583.1,0};
+ST(0.089949388,0.2453858,0,0.095090425,0.2489538,0,0.090077759,0.25268961,0){339950.36,157454.16,291813.61,-911669.73,-428416.46,-805257.31,1193275.4,579817.55,1125037.4,-1095139.7,-569427.53,-1174248.1,648419.14,400020.01,940920.06};
+ST(0.08974924,0.047235181,0,0.094913401,0.051076335,0,0.08944657,0.05485846,0){1190814.4,595503.05,1211526.2,905328.07,429138.45,822600.19,402804.56,142901.48,169573.91,-196265.4,-183223.65,-537958.1,-748421.11,-458373.75,-1073022.7};
+ST(0.012304267,0.13852123,0,0.014210915,0.13228117,0,0.021167753,0.13548502,0){1094693.2,1289449.4,1816935.7,-832176.34,-813665.75,-1266652.3,-1294374.3,-1589638.3,-2200669.4,521821.54,227067.92,600161.11,1419655.5,1673024.3,2382629.9};
+ST(0.021167753,0.13548502,0,0.014210915,0.13228117,0,0.01788586,0.12850833,0){1816935.7,1289449.4,1616906.9,-1266652.3,-813665.75,-895214.81,-2200669.4,-1589638.3,-2016472.2,600161.11,227067.92,-4802.2192,2382629.9,1673024.3,2014144.7};
+ST(0.045375723,0.12284566,0,0.045894811,0.13135905,0,0.038464606,0.12667013,0){3072436,2973475.7,2859316.3,-1348503.3,-1819976.4,-1476046.2,-3829159.4,-3679581.9,-3573486.5,-800055.99,392676.16,-252868.56,3380414.3,3832095.1,3451249.3};
+ST(0.038464606,0.12667013,0,0.045894811,0.13135905,0,0.038217426,0.13599196,0){2859316.3,2973475.7,2738753.8,-1476046.2,-1819976.4,-1938161,-3573486.5,-3679581.9,-3305386.1,-252868.56,392676.16,972060.89,3451249.3,3832095.1,3589652.3};
+ST(0.0087429334,0.24792416,0,0.013821768,0.24617185,0,0.01180171,0.25230222,0){283453.34,454053.45,347512.04,-768118.62,-1221678.8,-957611.77,1029935.2,1611329.8,1333704.3,-992967.39,-1502439.1,-1383899.6,667809.3,928515.88,1095718.6};
+ST(0.025139549,0.12057635,0,0.023379755,0.12686903,0,0.017763535,0.12074209,0){2224740.3,2047772.9,1657769.5,-875333.98,-1065433.1,-657738.05,-2755721.9,-2558991,-2054600.3,-796179.51,-162203.53,-581651.26,2272644.8,2481221.5,1703675.4};
+ST(0.1,0.1,0,0.09416017,0.099511923,0,0.1,0.092857143,0){0,613994.66,0,0,5422.3845,0,0,-608645.22,0,0,-619557.01,0,0,-16415.987,0};
+ST(0.061015306,0.048529238,0,0.06961584,0.048915995,0,0.066012722,0.055502179,0){3533367.8,3063466,3257272.9,2640342.3,2277085.6,2187557.2,1080012.2,906160.93,399401.17,-753291.7,-697426.19,-1519988.7,-2396723.8,-2122325.6,-2940625.1};
+ST(0.066401409,0.0434645,0,0.06961584,0.048915995,0,0.061015306,0.048529238,0){3289675.8,3063466,3533367.8,2619840.6,2277085.6,2640342.3,1416557.6,906160.93,1080012.2,-75156.319,-697426.19,-753291.7,-1551772,-2122325.6,-2396723.8};
+ST(0.051703203,0.27754162,0,0.055001581,0.27169863,0,0.059078636,0.27701937,0){454636.43,565900.8,447007.97,-1338881.7,-1648356.5,-1315269.1,2149437.1,2587095.5,2107766.2,-2841702,-3300283.2,-2778864.5,3377384.9,3725567.5,3289755.3};
+ST(0.036308441,0.24745658,0,0.033025927,0.25326882,0,0.029124573,0.24658198,0){958174.94,809560.38,849052.23,-2591684.5,-2238649.8,-2288340.2,3460190.4,3142273.3,3030093.5,-3307339.6,-3308331.9,-2848204.4,2177878.8,2697705.3,1797881.3};
+ST(0.020636298,0.17424253,0,0.025851591,0.17077962,0,0.027644767,0.17736901,0){1433869.3,1763476.8,1774040.3,-2154082.5,-2524912.6,-2777088.7,-351921.61,-673288.62,-203929.31,2330929.4,2815714.9,2892544.7,-819073.82,-542697.73,-1431643.3};
+ST(0.1,0.092857143,0,0.09416017,0.099511923,0,0.093922759,0.092262381,0){0,613994.66,652083.63,0,5422.3845,89312.894,0,-608645.22,-550573,0,-619557.01,-715327.2,0,-16415.987,-262838.8};
+ST(0.084604507,0.15255901,0,0.088623123,0.15812222,0,0.083337094,0.16031526,0){1258841.2,918302.92,1295652.6,-1326319,-1074338,-1575018.8,-1187789.9,-735787.48,-956036.82,1390056.3,1199414.9,1781183.7,1113216.6,531983.03,571788.58};
+ST(0.017312959,0.14496605,0,0.022775714,0.15147437,0,0.013794295,0.15422926,0){1456929,1786181.8,1126466.2,-1303417.8,-1841345.2,-1226232.2,-1594293.7,-1729359.8,-1017954.8,1135517.7,1894858,1316565.7,1713822.2,1670732.8,901352.54};
+ST(0.057391395,0.19462543,0,0.064671223,0.19505087,0,0.060432552,0.20227914,0){1979510.6,1815232.4,1798951.1,-3763012.6,-3465163,-3671781.8,1410875.8,1334352.3,2023610.8,2491970.2,2252470.6,1565241.8,-3656419.8,-3382100.5,-3653837};
+ST(0,0.057142857,0,0.0079950318,0.059686314,0,0,0.064285714,0){0,917766.47,0,0,570756.35,0,0,7912.4367,0,0,-557994.72,0,0,-913265.38,0};
+ST(0.1,0.20714286,0,0.093706234,0.20596864,0,0.1,0.2,0){0,360320.46,0,0,-758974.46,0,0,479351.87,0,0,228803.73,0,0,-732939.79,0};
+ST(0.1,0.021428571,0,0.093571257,0.018380777,0,0.1,0.014285714,0){0,774815.13,0,0,746204.54,0,0,690036.86,0,0,608388.09,0,0,504051.02,0};
+ST(0.1,0.28571429,0,0.093593186,0.28160993,0,0.1,0.27857143,0){0,74588.283,0,0,-221009.65,0,0,359269.18,0,0,-484261.41,0,0,591230.88,0};
+ST(0.042155309,0.15589067,0,0.045364072,0.14896511,0,0.050010485,0.1548865,0){2577776.2,2729630.7,2672912.2,-2895603.6,-2670475.8,-2946373.7,-2220826.4,-2787568.3,-2371553.9,3169529.7,2610132.2,3189127.5,1830012,2844182.1,2045305.7};
+ST(0.059078636,0.27701937,0,0.055001581,0.27169863,0,0.061631884,0.26868773,0){447007.97,565900.8,591535.29,-1315269.1,-1648356.5,-1711593.4,2107766.2,2587095.5,2649353.2,-2778864.5,-3300283.2,-3304968.8,3289755.3,3725567.5,3608394.3};
+ST(0.024044461,0.20382537,0,0.015977634,0.20443356,0,0.018704911,0.19716585,0){1283805.9,895779.15,1103230.1,-2655634.7,-1862602.8,-2149261.2,1553893.8,1114548.4,934589.13,995311.88,659707.69,1263201.6,-2617892.2,-1827076.9,-2132672.2};
+ST(0.045416206,0.061541227,0,0.037071258,0.0642048,0,0.038435934,0.058364632,0){3642820.9,3365311.2,3459248.5,2181474.8,1900443.5,2206750.4,-155055.51,-391679.98,155241.86,-2429600.5,-2513388.8,-1952496,-3730025.8,-3541461.8,-3353689.4};
+ST(0.092195724,0.16853594,0,0.083969261,0.16737329,0,0.088381846,0.16289419,0){598378.34,1198489.7,911153.68,-829189.07,-1632158.2,-1156470.7,-278570.16,-607916.58,-599768.12,936666.51,1852187.2,1317920.1,-82641.6,-62490.334,244888.24};
+ST(0.067098511,0.16826118,0,0.072573599,0.16764459,0,0.071059851,0.17209017,0){2121688.2,1881427.5,1900690.4,-2928224.5,-2572760.4,-2772233.4,-1008555.7,-936075.04,-629520.98,3311710.7,2916777.1,3060958.1,-250662.47,-135849.37,-774142.34};
+ST(0.05718895,0.22161738,0,0.053624899,0.22742186,0,0.049797208,0.2214244,0){1508977,1430137,1551864.2,-3566099.1,-3503302.1,-3662861.4,3352547.9,3648370.9,3430735.4,-1004251.2,-1785483,-1003918.8,-1983866.6,-1060301.4,-2065424.5};
+ST(0.085714286,0,0,0.081119523,0.0085521597,0,0.078571429,0,0){1683752,2167108.8,2419478.6,1683802.7,2149779.2,2419535.2,1683911.1,2115263.6,2419645.1,1684108.7,2063869.7,2419827.2,1684003.7,1995657.9,2420024.4};
+ST(0.078571429,0.3,0,0.081165886,0.29137431,0,0.085714286,0.3,0){0,97729.953,0,0,-292395.17,0,0,484687.71,0,0,-673055.06,0,0,855744.16,0};
+ST(0.082709707,0.12855445,0,0.087905667,0.12517971,0,0.0910478,0.13167545,0){1568327.1,1140990.9,831136.87,-869760.99,-554517.87,-514132.23,-1955764.1,-1425990.8,-1027305.8,-1353.9511,-178453.87,122313.64,1955094.7,1334087.8,1073956.7};
+ST(0,0.20714286,0,0.0051799073,0.21317882,0,0,0.21428571,0){0,276031.48,0,0,-615227.88,0,0,479976.29,0,0,25450.705,0,0,-511551.59,0};
+ST(0.018704911,0.19716585,0,0.012931293,0.19295437,0,0.017373248,0.19021363,0){1103230.1,815194.79,1095255.9,-2149261.2,-1524077.7,-1990705.9,934589.13,510133.92,532263.7,1263201.6,1080471.8,1555631.8,-2132672.2,-1450076.4,-1804413.6};
+ST(0.011268327,0.1984065,0,0.012931293,0.19295437,0,0.018704911,0.19716585,0){682302.12,815194.79,1103230.1,-1344805.9,-1524077.7,-2149261.2,623458.07,510133.92,934589.13,739532.85,1080471.8,1263201.6,-1341727.7,-1450076.4,-2132672.2};
+ST(0.1,0.26428571,0,0.092295863,0.26000779,0,0.1,0.25714286,0){0,193329.27,0,0,-546576.12,0,0,805368.84,0,0,-924990.4,0,0,884724.5,0};
+ST(0.1,0.042857143,0,0.092141527,0.03991184,0,0.1,0.035714286,0){0,927649.93,0,0,767955.56,0,0,476054.53,0,0,102192.68,0,0,-289378.9,0};
+ST(0.1,0.17857143,0,0.093873231,0.17693503,0,0.1,0.17142857,0){0,445896.9,0,0,-694096.79,0,0,-59504.029,0,0,727141.13,0,0,-345394.37,0};
+ST(0.069002793,0.22246209,0,0.065627137,0.22734606,0,0.062992669,0.22303634,0){1267491.2,1270705.1,1396775.9,-3011719.2,-3111357.1,-3331109.7,2877058.6,3236198.8,3216330,-947533.34,-1576358.2,-1122974.8,-1573376.1,-953054.66,-1661551.4};
+ST(0.03690243,0.09394169,0,0.033761495,0.088496681,0,0.041002292,0.08644635,0){3135041.5,3029395.9,3351345,337961.95,608605.12,787437.3,-2760700,-2298547.5,-2379027.1,-3396384.7,-3368980,-3725698.5,-1002139.6,-1747439.7,-2222336.9};
+ST(0.021957304,0.26060316,0,0.023009638,0.26878949,0,0.014305262,0.26641769,0){505833.44,417665.14,294901.31,-1432636.8,-1208783.5,-848621.76,2119105.6,1871958.7,1298521.9,-2450095.8,-2337004.8,-1589572.3,2369995.8,2554445.3,1686004.5};
+ST(0.071428571,0,0,0.074656208,0.0053403125,0,0.068476894,0.0069177029,0){3033974.4,2772385.5,3242851.4,3033978.9,2763721.5,3225849.8,3033982.8,2746414.1,3191931.3,3034008.5,2720533.7,3141298.2,3033714,2685936.9,3073847.6};
+ST(0.042433189,0.024814669,0,0.035858843,0.031497608,0,0.033039341,0.023173825,0){3739739.8,3456371.8,3318087.9,3488658.7,3083741.5,3123656.1,3003356.3,2378649.5,2746181,2316430.4,1417116.3,2207795.9,1473602,302618.73,1539940.3};
+ST(0.033039341,0.023173825,0,0.035858843,0.031497608,0,0.028359285,0.029784535,0){3318087.9,3456371.8,2981166.2,3123656.1,3083741.5,2693525.9,2746181,2378649.5,2145980.7,2207795.9,1417116.3,1391347.7,1539940.3,302618.73,502245.34};
+ST(0.069002793,0.22246209,0,0.062992669,0.22303634,0,0.063265205,0.21633109,0){1267491.2,1396775.9,1505335.5,-3011719.2,-3331109.7,-3432481.9,2877058.6,3216330,2888962.8,-947533.34,-1122974.8,-265885.87,-1573376.1,-1661551.4,-2549234.8};
+ST(0.068366879,0.29272708,0,0.074657371,0.29452352,0,0.071428571,0.3,0){123803.43,79525.554,0,-370697.46,-238312.39,0,615462.12,396309.36,0,-856697.17,-552992.95,0,1092834.3,707611.71,0};
+ST(0.029124573,0.24658198,0,0.033025927,0.25326882,0,0.025641665,0.25311603,0){849052.23,809560.38,680173.91,-2288340.2,-2238649.8,-1879847.5,3030093.5,3142273.3,2635470.4,-2848204.4,-3308331.9,-2768550.2,1797881.3,2697705.3,2247361.6};
+ST(0.091593501,0.1915477,0,0.095453592,0.18738967,0,0.1,0.19285714,0){544831.72,307137.29,0,-1004107.1,-541566.85,0,301623.68,106216.39,0,749822.54,460538.95,0,-933881.71,-458087.35,0};
+ST(0.091593501,0.1915477,0,0.087008075,0.19596841,0,0.084368038,0.19048099,0){544831.72,798107.94,992852.93,-1004107.1,-1537171.7,-1809621.2,301623.68,625323.3,495817.1,749822.54,958187.81,1401810.9,-933881.71,-1512909.8,-1649308.4};
+ST(0.021251228,0.18136297,0,0.027644767,0.17736901,0,0.027249449,0.18607819,0){1398279.8,1774040.3,1646413.8,-2300353.4,-2777088.7,-2861109.6,85724.805,-203929.31,464444.42,2245163.6,2892544.7,2518610.9,-1534338.6,-1431643.3,-2323177.4};
+ST(0.027249449,0.18607819,0,0.027644767,0.17736901,0,0.03345202,0.18222482,0){1646413.8,1774040.3,1947746.5,-2861109.6,-2777088.7,-3237509.5,464444.42,-203929.31,196057.01,2518610.9,2892544.7,3107788.7,-2323177.4,-1431643.3,-2254322.8};
+ST(0.030466665,0.11568191,0,0.023213665,0.1150537,0,0.025770754,0.10718168,0){2608170,2130593.3,2378738.7,-773675.45,-605772.32,-316264.13,-3152461.4,-2564157.8,-2653040.8,-1443702.3,-1229375.9,-1984140.6,2136967.4,1684092.7,932667.69};
+ST(0.028678488,0.042143634,0,0.025565101,0.048609543,0,0.022876349,0.043626948,0){2968313.4,2702312,2488553.5,2399521.8,2017092.5,1978130.3,1370917.4,820389.33,1061959.9,79587.615,-584372.75,-72059.632,-1227272.3,-1841258.2,-1191549.5};
+ST(0.032229878,0.047894836,0,0.025565101,0.048609543,0,0.028678488,0.042143634,0){3188476.9,2702312,2968313.4,2403076.1,2017092.5,2399521.8,1025710.6,820389.33,1370917.4,-604377.64,-584372.75,79587.615,-2086050.7,-1841258.2,-1227272.3};
+ST(0.091864029,0.22106993,0,0.084319616,0.22565969,0,0.082942949,0.21818591,0){394005.54,696453.76,823054.75,-927852.61,-1688204.7,-1901094.8,863120.02,1707540.6,1667014.3,-241435.16,-743250.94,-282341.7,-536498.87,-649719.93,-1297502.9};
+ST(0.023478597,0.036718106,0,0.017433092,0.042090914,0,0.014137494,0.034012185,0){2561783.8,1971771.3,1641076.4,2187675.4,1594855,1435142,1494080.3,913057.13,1049094.4,582277.59,56690.05,531342.12,-414804.14,-810753.02,-53364.585};
+ST(0.013794295,0.15422926,0,0.022775714,0.15147437,0,0.021502186,0.15931359,0){1126466.2,1786181.8,1630158.4,-1226232.2,-1841345.2,-1947614.2,-1017954.8,-1729359.8,-1250943.8,1316565.7,1894858,2191316.6,901352.54,1670732.8,824223.66};
+ST(0.020473685,0.087577432,0,0.019165757,0.095107709,0,0.013428016,0.091778472,0){2087024.2,1930971.9,1408980.1,451292.51,168744.63,204626.15,-1538224.3,-1747493.7,-1174648.8,-2322280.1,-2069009.1,-1549888.7,-1286407.6,-502664.26,-600683.83};
+ST(0.06137482,0.19024807,0,0.064671223,0.19505087,0,0.057391395,0.19462543,0){1976038.9,1815232.4,1979510.6,-3592882,-3465163,-3763012.6,963745.22,1334352.3,1410875.8,2804392.5,2252470.6,2491970.2,-3258719.1,-3382100.5,-3656419.8};
+ST(0.038217426,0.13599196,0,0.033990129,0.14330646,0,0.030046638,0.13690443,0){2738753.8,2486957.5,2369378.2,-1938161,-2138608.5,-1721516.8,-3305386.1,-2786553.8,-2840145.3,972060.89,1748365.6,944948.24,3589652.3,3031412.6,3098367.4};
+ST(0,0.12142857,0,0.0062042788,0.11791514,0,0.0061411468,0.1246533,0){0,612847.32,591118.91,0,-208741.13,-280990.71,0,-750565.55,-738586.84,0,-286207.66,-106527.54,0,561848.67,682629.18};
+ST(0.0078195435,0.14622426,0,0.0054758376,0.13911323,0,0.012304267,0.13852123,0){680366.1,495708.7,1094693.2,-626541.18,-382921.42,-832176.34,-729870.69,-582869.54,-1294374.3,568744.13,250325.59,521821.54,774663.29,639819.51,1419655.5};
+ST(0.082390534,0.079333541,0,0.086276325,0.073599227,0,0.091953893,0.078440357,0){1865676.5,1502743.3,889726.23,650380.91,653401.45,322434.75,-988603.29,-565297.67,-450550.32,-1983689.6,-1464602.7,-936443.15,-1686881.4,-1536324.4,-825354.72};
+ST(0.038084092,0.1145524,0,0.040442009,0.11996282,0,0.035619257,0.12028764,0){2981407.2,2999410,2821397.9,-818508.93,-1143461.2,-1093830.4,-3575257.7,-3706983.7,-3491178.8,-1775238,-1150363.3,-1043884.2,2287308.3,2995190.5,2851838.9};
+ST(0.027644767,0.17736901,0,0.025851591,0.17077962,0,0.030623168,0.1713445,0){1774040.3,1763476.8,1985985.4,-2777088.7,-2524912.6,-2866418.8,-203929.31,-673288.62,-715248.18,2892544.7,2815714.9,3183566.3,-1431643.3,-542697.73,-696442.05};
+ST(0.025139549,0.12057635,0,0.023213665,0.1150537,0,0.030466665,0.11568191,0){2224740.3,2130593.3,2608170,-875333.98,-605772.32,-773675.45,-2755721.9,-2564157.8,-3152461.4,-796179.51,-1229375.9,-1443702.3,2272644.8,1684092.7,2136967.4};
+ST(0.08682376,0.20181233,0,0.087008075,0.19596841,0,0.093164956,0.1980516,0){767576.83,798107.94,420734.09,-1560255.4,-1537171.7,-826537.04,843726.65,625323.3,376428.12,688912.23,958187.81,463603.83,-1555436.8,-1512909.8,-823893.15};
+ST(0.093164956,0.1980516,0,0.087008075,0.19596841,0,0.091593501,0.1915477,0){420734.09,798107.94,544831.72,-826537.04,-1537171.7,-1004107.1,376428.12,625323.3,301623.68,463603.83,958187.81,749822.54,-823893.15,-1512909.8,-933881.71};
+ST(0.1,0.26428571,0,0.092520768,0.26920591,0,0.092295863,0.26000779,0){0,145042.72,193329.27,0,-420173.4,-546576.12,0,651988.34,805368.84,0,-816598.86,-924990.4,0,896908.09,884724.5};
+ST(0.092141527,0.03991184,0,0.092450683,0.030760689,0,0.1,0.035714286,0){927649.93,900007.85,0,767955.56,807431.66,0,476054.53,631804.95,0,102192.68,391202.83,0,-289378.9,110124.82,0};
+ST(0.015758122,0.23699049,0,0.013821768,0.24617185,0,0.0071147476,0.24137211,0){597291.98,454053.45,259907.57,-1541119.1,-1221678.8,-684802.64,1837947.1,1611329.8,859611.54,-1363109.4,-1502439.1,-720499.62,315646.37,928515.88,317972.39};
+ST(0.08264437,0.14444108,0,0.076625322,0.14929356,0,0.075488644,0.14176328,0){1463951.5,1845555.4,1990888.2,-1293607.4,-1818255.1,-1647841.2,-1614532.1,-1872475.3,-2274843.7,1105781,1790618.2,1255935.2,1743195.6,1898765.5,2491166.6};
+ST(0.093706234,0.20596864,0,0.093164956,0.1980516,0,0.1,0.2,0){360320.46,420734.09,0,-758974.46,-826537.04,0,479351.87,376428.12,0,228803.73,463603.83,0,-732939.79,-823893.15,0};
+ST(0.048663579,0.053435419,0,0.053426379,0.049768916,0,0.056317057,0.058022103,0){3726394.8,3727873.1,3630316.8,2589713.3,2738031.5,2330872.5,663071.82,1021148,197001.66,-1465861.1,-966926.63,-2007682.1,-3147918.6,-2698501,-3494460.7};
+ST(0.052532368,0.096036702,0,0.044548934,0.094607351,0,0.049739958,0.088394034,0){3389506.1,3364209.6,3472240.4,240670.51,323528.56,703521.31,-3131818.5,-3009655.6,-2626240.1,-3594959.1,-3622750.1,-3862017.3,-718569.73,-961698.97,-2018648.2};
+ST(0.070175425,0.16144206,0,0.067098511,0.16826118,0,0.061476805,0.16269562,0){2074683.8,2121688.2,2391378.9,-2570674.4,-2928224.5,-3025373.1,-1460177,-1008555.7,-1589341.3,2919916.2,3311710.7,3446908.2,762077.82,-250662.47,675366.83};
+ST(0.0087429334,0.24792416,0,0.0043813653,0.24702694,0,0.0071147476,0.24137211,0){283453.34,145794.38,259907.57,-768118.62,-393661.32,-684802.64,1029935.2,523477.05,859611.54,-992967.39,-496310.62,-720499.62,667809.3,320224.07,317972.39};
+ST(0.092195724,0.16853594,0,0.093873231,0.17693503,0,0.085369203,0.17624497,0){598378.34,445896.9,1039089.6,-829189.07,-694096.79,-1603144.1,-278570.16,-59504.029,-168940.91,936666.51,727141.13,1695116.9,-82641.6,-345394.37,-751642.95};
+ST(0.082583958,0.10907049,0,0.086838536,0.10220901,0,0.091053567,0.10618538,0){1698614.9,1341203.8,914271.31,-286603.09,-54099.381,-104388.15,-1936849,-1393108.8,-1006721.9,-1323464.6,-1282822.5,-787386.88,836522.31,161880.97,309052.61};
+ST(0.044637502,0.20577347,0,0.053221516,0.20704838,0,0.049232245,0.21047418,0){1811821.2,1805672.4,1752658.6,-3810004,-3837129.3,-3827070.5,2390091.8,2511247.5,2777012.8,1174216.7,1011998.4,540242.46,-3685779.4,-3650194.7,-3416565.4};
+ST(0.051624576,0.1997036,0,0.053221516,0.20704838,0,0.044637502,0.20577347,0){1943020.7,1805672.4,1811821.2,-3875569.2,-3837129.3,-3810004,1911651.5,2511247.5,2390091.8,1974364.4,1011998.4,1174216.7,-3875892.9,-3650194.7,-3685779.4};
+ST(0.013794295,0.15422926,0,0.0056981356,0.15371602,0,0.0078195435,0.14622426,0){1126466.2,478995.44,680366.1,-1226232.2,-516269.88,-626541.18,-1017954.8,-438816.38,-729870.69,1316565.7,550400.04,568744.13,901352.54,395913.98,774663.29};
+ST(0.013878694,0.17880836,0,0.0062925762,0.18063125,0,0.0069613667,0.17349451,0){971566.52,445914.92,517779.21,-1548960.4,-727143.63,-769992.03,-51095.574,12632.594,-142713.64,1579530,719304.1,839532.94,-887966.26,-466469.22,-266340.1};
+ST(0,0.23571429,0,0.0071147476,0.24137211,0,0,0.24285714,0){0,259907.57,0,0,-684802.64,0,0,859611.54,0,0,-720499.62,0,0,317972.39,0};
+ST(0.021502186,0.15931359,0,0.014502412,0.16316663,0,0.013794295,0.15422926,0){1630158.4,1121335,1126466.2,-1947614.2,-1429592.9,-1226232.2,-1250943.8,-728363.13,-1017954.8,2191316.6,1629901.1,1316565.7,824223.66,280110.31,901352.54};
+ST(0.01882241,0.070374011,0,0.027058874,0.069011929,0,0.026270926,0.075674812,0){2018056.9,2727323.5,2630439.6,970762.8,1363815.9,1063205.3,-580354.6,-681543.48,-1137545.6,-1830388.5,-2386220.5,-2660659.2,-2130853.3,-2898415.6,-2599027.8};
+ST(0.072323403,0.067507008,0,0.074756101,0.075901522,0,0.066925078,0.074981916,0){2781512.1,2549479.1,3090390.8,1448400.9,1021825.1,1280900.5,-578922.09,-1118145.3,-1278621.5,-2328912.3,-2588166.7,-3089611.2,-2963263.7,-2507455.8,-3091904.4};
+ST(0.010955873,0.10281868,0,0.013465065,0.10662372,0,0.0081152275,0.10988635,0){1124212.8,1351132.7,821145.89,-57954.543,-165451.82,-151361.79,-1179275.3,-1496410,-944689.8,-1060620.9,-1147793.4,-619246.83,173274.75,489093.12,439508.43};
+ST(0.069968451,0.098831219,0,0.065931692,0.10408722,0,0.061027247,0.098743066,0){2730411,2911358.9,3173016.6,57648.531,-218409.17,72008.811,-2671597.7,-3113407,-3099474,-2785714.6,-2661455,-3241975.4,-173126.8,651464.78,-216202.29};
+ST(0.018704911,0.19716585,0,0.025476801,0.19755762,0,0.024044461,0.20382537,0){1103230.1,1423125.8,1283805.9,-2149261.2,-2782737.9,-2655634.7,934589.13,1235431.1,1553893.8,1263201.6,1602470.1,995311.88,-2132672.2,-2766638.2,-2617892.2};
+ST(0,0.27857143,0,0.0067236406,0.28198319,0,0,0.28571429,0){0,76627.274,0,0,-227172.13,0,0,369685.4,0,0,-499127.77,0,0,610772.43,0};
+ST(0.026018946,0.14387862,0,0.033990129,0.14330646,0,0.030440206,0.150204,0){2064539,2486957.5,2239650.6,-1800072.3,-2138608.5,-2249230.7,-2295230.1,-2786553.8,-2230054.7,1506177.8,1748365.6,2258843.4,2488196.2,3031412.6,2220211.9};
+ST(0,0.014285714,0,0.006650898,0.018174199,0,0,0.021428571,0){0,801243.34,0,0,772347.91,0,0,715593.27,0,0,633022.27,0,0,527557,0};
+ST(0.022740693,0.23189018,0,0.021374843,0.22646669,0,0.026971271,0.22659033,0){887604.04,906782.43,1090633.5,-2230116.3,-2208721,-2658504.1,2485475.6,2264460.9,2731189,-1529145.6,-1042528.4,-1267784.1,-172982.46,-767856.24,-909068.56};
+ST(0.030075176,0.23324008,0,0.025350652,0.23917347,0,0.022740693,0.23189018,0){1077047.3,868665.73,887604.04,-2725827,-2265304,-2230116.3,3095770.8,2773502.3,2485475.6,-2013325.9,-2193941.8,-1529145.6,-13872.597,753574.67,-172982.46};
+ST(0.054957014,0.24657048,0,0.061408089,0.24582042,0,0.060567191,0.25172758,0){1058545,1017142.7,917440.34,-2852831,-2732695.2,-2522838.3,3777171.8,3591948.1,3497206.6,-3549694.2,-3325647.6,-3596815.5,2239441.1,2017029.8,2796536};
+ST(0.047385855,0.10193045,0,0.044548934,0.094607351,0,0.052532368,0.096036702,0){3329666.7,3364209.6,3389506.1,-117239.93,323528.56,240670.51,-3442848.4,-3009655.6,-3131818.5,-3204510.9,-3622750.1,-3594959.1,350991.89,-961698.97,-718569.73};
+ST(0.069467767,0.146519,0,0.064971856,0.15110456,0,0.061244461,0.14481879,0){2287173.5,2431817,2643484.5,-2120501.9,-2488096.1,-2356788.3,-2441744.6,-2374265.3,-2899198.4,1942651.5,2543085,2042509.4,2583122,2315361.9,3121060.9};
+ST(0.0081152275,0.10988635,0,0.0052460498,0.10332732,0,0.010955873,0.10281868,0){821145.89,545715.18,1124212.8,-151361.79,-33256.292,-57954.543,-944689.8,-576983.54,-1179275.3,-619246.83,-508602.25,-1060620.9,439508.43,99155.047,173274.75};
+ST(0.030466665,0.11568191,0,0.038084092,0.1145524,0,0.035619257,0.12028764,0){2608170,2981407.2,2821397.9,-773675.45,-818508.93,-1093830.4,-3152461.4,-3575257.7,-3491178.8,-1443702.3,-1775238,-1043884.2,2136967.4,2287308.3,2851838.9};
+ST(0.0094132111,0.052421332,0,0.014691551,0.054118398,0,0.0079950318,0.059686314,0){1088603.4,1659245.8,917766.47,768702.62,1140472.1,570756.35,222919.17,265092.56,7912.4367,-388347.22,-693242.8,-557994.72,-885762.83,-1435183.5,-913265.38};
+ST(0.020636298,0.17424253,0,0.027644767,0.17736901,0,0.021251228,0.18136297,0){1433869.3,1774040.3,1398279.8,-2154082.5,-2777088.7,-2300353.4,-351921.61,-203929.31,85724.805,2330929.4,2892544.7,2245163.6,-819073.82,-1431643.3,-1534338.6};
+ST(0.0081152275,0.10988635,0,0.013465065,0.10662372,0,0.016927821,0.11108648,0){821145.89,1351132.7,1644246.3,-151361.79,-165451.82,-340994.5,-944689.8,-1496410,-1914445.6,-619246.83,-1147793.4,-1176430.8,439508.43,489093.12,981584.41};
+ST(0.054828578,0.081464579,0,0.060416267,0.076932239,0,0.064352171,0.083117586,0){3492382.6,3380545.3,3167194.8,1101278.5,1302521.2,915483.69,-2043909.2,-1576156.6,-1987167.2,-3789901.6,-3485992.8,-3477240.4,-2941538.5,-3253298.6,-2495770};
+ST(0.0069979116,0.22643766,0,0.0069516057,0.23320895,0,0,0.22857143,0){317964.48,288078.49,0,-774386.26,-728952.19,0,793599.18,827497.2,0,-364658.79,-537397.4,0,-270536.88,-5267.3055,0};
+ST(0.0068768393,0.16098373,0,0.0056981356,0.15371602,0,0.013794295,0.15422926,0){553409.29,478995.44,1126466.2,-680450.71,-516269.88,-1226232.2,-397156.36,-438816.38,-1017954.8,771605.48,550400.04,1316565.7,219690.78,395913.98,901352.54};
+ST(0.08264437,0.14444108,0,0.081009521,0.1385969,0,0.087083587,0.13880919,0){1463951.5,1630909.4,1144744.3,-1293607.4,-1242340.3,-877072.07,-1614532.1,-1926924,-1349889.8,1105781,783271.16,561444.4,1743195.6,2113542.9,1481228.8};
+ST(0.064373335,0.2338171,0,0.066600159,0.24211306,0,0.059437672,0.2400817,0){1185902.3,1004296.2,1145348.7,-3010536.1,-2655015,-2999714,3446119.8,3359675.2,3711340.5,-2291596.2,-2867211.3,-3009146,79206.699,1352854.8,1160252.2};
+ST(0.061015306,0.048529238,0,0.053426379,0.049768916,0,0.054794838,0.043915046,0){3533367.8,3727873.1,3735662.6,2640342.3,2738031.5,2959425,1080012.2,1021148,1568238.5,-753291.7,-966926.63,-148813.91,-2396723.8,-2698501,-1835117.4};
+ST(0.074931673,0.27468874,0,0.081004963,0.27070547,0,0.082516133,0.27647665,0){363389.18,333174.81,248899.48,-1064791.9,-968418.7,-731674.12,1691857.9,1513258.3,1170289.2,-2200836.4,-1916833.2,-1538273.3,2556129.1,2141327.9,1813237.5};
+ST(0.082332164,0.023444943,0,0.080699945,0.029142305,0,0.074388951,0.025102472,0){2029600,2185639.9,2772012.4,1907886.4,1983669.2,2581574.2,1671751.1,1598386.1,2213781,1335359.8,1065401.8,1693914.7,918760.81,433818.71,1057277.9};
+ST(0,0.10714286,0,0.0052460498,0.10332732,0,0.0081152275,0.10988635,0){0,545715.18,821145.89,0,-33256.292,-151361.79,0,-576983.54,-944689.8,0,-508602.25,-619246.83,0,99155.047,439508.43};
+ST(0.019499739,0.079597209,0,0.01318623,0.084416193,0,0.012549176,0.077039569,0){2040354.6,1411871.7,1370920.5,702945.71,378554.62,525978.15,-1095289.5,-931831.12,-643140.23,-2175701.2,-1560266,-1415881.7,-1830384.7,-1046999.7,-1316306.1};
+ST(0.084917502,0.034253561,0,0.085916752,0.02828,0,0.092450683,0.030760689,0){1742331.8,1643257.2,900007.85,1520580.8,1500211.7,807431.66,1105294,1226559.7,631804.95,549324.68,846114.35,391202.83,-76880.401,391827.49,110124.82};
+ST(0.092520768,0.26920591,0,0.086077973,0.27164165,0,0.085115353,0.26563346,0){145042.72,243157.03,313056.52,-420173.4,-708191.99,-899063.8,651988.34,1111255.9,1369900.4,-816598.86,-1417072.6,-1665255.4,896908.09,1598582.9,1747205.8};
+ST(0.037999827,0.27482627,0,0.045592054,0.27439642,0,0.045044357,0.28188841,0){474219.19,513714.39,362990.51,-1389905,-1504437.2,-1075960.6,2209621.2,2387679.2,1750378.7,-2876809.4,-3100344.3,-2362097.1,3345267.4,3591305.7,2889034};
+ST(0.077393474,0.16425214,0,0.083969261,0.16737329,0,0.077140734,0.17217741,0){1650679.7,1198489.7,1584233.7,-2141613.9,-1632158.2,-2313491.7,-1013799.5,-607916.58,-519338.58,2443278.1,1852187.2,2552719.3,287063.28,-62490.334,-655929.75};
+ST(0.066925078,0.074981916,0,0.074756101,0.075901522,0,0.070865224,0.080352924,0){3090390.8,2549479.1,2808030.6,1280900.5,1021825.1,934415.1,-1278621.5,-1118145.3,-1562677.5,-3089611.2,-2588166.7,-3017110.1,-3091904.4,-2507455.8,-2458745.5};
+ST(0.017373248,0.19021363,0,0.023309936,0.19197185,0,0.018704911,0.19716585,0){1095255.9,1390526.6,1103230.1,-1990705.9,-2573914.4,-2149261.2,532263.7,799964.88,934589.13,1555631.8,1893175.4,1263201.6,-1804413.6,-2411477.9,-2132672.2};
+ST(0.079090117,0.19794942,0,0.081922129,0.20489902,0,0.075422073,0.20645372,0){1206859.6,996952.98,1273700.5,-2368529.7,-2081157.6,-2693470,1073015.3,1266338.6,1728669,1335740.9,704044.3,766631.5,-2359414.1,-2032271.3,-2583646.6};
+ST(0.08682376,0.20181233,0,0.081922129,0.20489902,0,0.079090117,0.19794942,0){767576.83,996952.98,1206859.6,-1560255.4,-2081157.6,-2368529.7,843726.65,1266338.6,1073015.3,688912.23,704044.3,1335740.9,-1555436.8,-2032271.3,-2359414.1};
+ST(0.039686874,0.0066116125,0,0.031710863,0.0075461758,0,0.035714286,0,0){3676489.9,3254919.5,3496308.9,3658909.3,3234618.2,3496337.7,3623831.1,3194153.7,3496399.5,3571457.2,3133832.1,3496538.6,3501797.4,3053845.3,3496562.8};
+ST(0.035714286,0.3,0,0.031264826,0.29263185,0,0.03928574,0.29335694,0){0,124484.17,127378.94,0,-372709.78,-381522.06,0,618717.86,633829.06,0,-861054.65,-883092.25,0,1098239.8,1127859.7};
+ST(0.022775714,0.15147437,0,0.030440206,0.150204,0,0.027609688,0.15620978,0){1786181.8,2239650.6,2023546.1,-1841345.2,-2249230.7,-2286520.9,-1729359.8,-2230054.7,-1726415,1894858,2258843.4,2510934.9,1670732.8,2220211.9,1400022.9};
+ST(0.0079950318,0.059686314,0,0.014691551,0.054118398,0,0.016702178,0.061420197,0){917766.47,1659245.8,1844408.3,570756.35,1140472.1,1107331.1,7912.4367,265092.56,-72241.295,-557994.72,-693242.8,-1222910.6,-913265.38,-1435183.5,-1885264.1};
+ST(0,0.028571429,0,0.0058133292,0.032528446,0,0,0.035714286,0){0,694559.72,0,0,614750.96,0,0,464300.7,0,0,260495.38,0,0,26512.55,0};
+ST(0.067728608,0.12931058,0,0.068478919,0.13862632,0,0.060672554,0.13561545,0){2567539,2426951.1,2778852.8,-1463631.5,-1850187.5,-1944873,-3196956.5,-2866745.3,-3362653.4,89062.443,1169007.7,935707.85,3235608.2,3144665.9,3643681.7};
+ST(0,0.26428571,0,0.0060732531,0.2674669,0,0,0.27142857,0){0,124750.88,0,0,-359918.85,0,0,553735.12,0,0,-683931.42,0,0,735399.5,0};
+ST(0.072323403,0.067507008,0,0.064846874,0.068845861,0,0.064832361,0.062804408,0){2781512.1,3243292.3,3281120.4,1448400.9,1629296.1,1912310.8,-578922.09,-795531.06,-254314.65,-2328912.3,-2824516.6,-2314932.7,-2963263.7,-3448034.5,-3410309.6};
+ST(0.1,0.15714286,0,0.09308158,0.15403623,0,0.1,0.15,0){0,579061.91,0,0,-628036.95,0,0,-525997.02,0,0,672596.25,0,0,469080.04,0};
+ST(0.040431855,0.24188745,0,0.037546984,0.23452457,0,0.045331711,0.23557633,0){1110505,1205921.7,1270563.3,-2932804,-3072707.6,-3255008.9,3702149.5,3550700.1,3813331,-3142324.5,-2423829.8,-2700862,1453973.2,201013.93,404484.48};
+ST(0.067728608,0.12931058,0,0.070840483,0.12204614,0,0.076158908,0.12549637,0){2567539,2470738.2,2092101.1,-1463631.5,-1044803.2,-1030118.9,-3196956.5,-3073782.1,-2615047.7,89062.443,-729197.53,-297340.89,3235608.2,2652961,2464056};
+ST(0.046181733,0.0056701177,0,0.043829005,0.011024747,0,0.039686874,0.0066116125,0){3851009.3,3801549.1,3676489.9,3837454.5,3750937.1,3658909.3,3810385,3650381.9,3623831.1,3769920.5,3501249.8,3571457.2,3715901.2,3305260.3,3501797.4};
+ST(0.066803853,0.25459223,0,0.060567191,0.25172758,0,0.065478411,0.24860928,0){789541.66,917440.34,912058.17,-2193455.3,-2522838.3,-2478342.9,3110738.9,3497206.6,3344041.2,-3337877,-3596815.5,-3264436.9,2824240.3,2796536,2261773.6};
+ST(0.03928574,0.29335694,0,0.043131118,0.28864457,0,0.045931579,0.29422002,0){127378.94,225252.57,116468.36,-381522.06,-672574.82,-348980.73,633829.06,1110400.5,580225.36,-883092.25,-1532552.2,-809364.6,1127859.7,1932837.8,1035478};
+ST(0.038597539,0.20095921,0,0.043569257,0.19619451,0,0.044637502,0.20577347,0){1801301.7,1966078.6,1811821.2,-3633864.6,-3794921.6,-3810004,1895634,1563901,2390091.8,1705394,2340412.7,1174216.7,-3630918.1,-3741435.4,-3685779.4};
+ST(0.044637502,0.20577347,0,0.043569257,0.19619451,0,0.051624576,0.1997036,0){1811821.2,1966078.6,1943020.7,-3810004,-3794921.6,-3875569.2,2390091.8,1563901,1911651.5,1174216.7,2340412.7,1974364.4,-3685779.4,-3741435.4,-3875892.9};
+ST(0,0.092857143,0,0.0071591483,0.096788703,0,0,0.1,0){0,756711.76,0,0,43634.951,0,0,-710572.63,0,0,-795194.2,0,0,-130859.45,0};
+ST(0.017990672,0.29207379,0,0.010662343,0.29482959,0,0.0093450955,0.28843768,0){86228.122,34537.041,67949.514,-258100.45,-103506.64,-202850.84,428229.3,172164.12,334776.34,-595472.42,-240303.04,-461793.67,758576.15,307518.14,581935.08};
+ST(0.0093389246,0.011691623,0,0.010679145,0.0052482016,0,0.01808004,0.0081573173,0){1120186.5,1277155.8,2085729.2,1103410.3,1273289.3,2070583.9,1070108.3,1265566.3,2040406.9,1020788.4,1254019.7,1995444.2,956114.18,1238493.9,1935913.6};
+ST(0.060672554,0.13561545,0,0.054237851,0.14012792,0,0.053497526,0.1329974,0){2778852.8,2856617.8,2959143.9,-1944873,-2267029,-1911000.9,-3362653.4,-3324577.4,-3636096,935707.85,1580891.3,623103.97,3643681.7,3650971.5,3857035.6};
+ST(0.074279052,0.25633166,0,0.071915087,0.24816524,0,0.07921504,0.25033934,0){635900.39,803363.84,606155.6,-1777029.4,-2179152.4,-1658203,2553015.8,2928525.2,2271843.6,-2804423.5,-2836050.6,-2284831,2479429.3,1927975,1693484.6};
+ST(0.091864029,0.22106993,0,0.095652827,0.22622146,0,0.09071018,0.22887426,0){394005.54,199039.37,406264.77,-927852.61,-484109.58,-1003622.2,863120.02,494313.66,1069446.3,-241435.16,-223837.82,-568907.82,-536498.87,-173819.74,-233040.27};
+ST(0.021658338,0.054940441,0,0.025565101,0.048609543,0,0.028699663,0.054481756,0){2341024.9,2702312,2920693,1587273.2,2017092.5,1995520.8,322446.89,820389.33,438210.61,-1046241,-584372.75,-1257984.1,-2078353.5,-1841258.2,-2556170.3};
+ST(0.019247887,0.048569646,0,0.025565101,0.048609543,0,0.021658338,0.054940441,0){2135187.8,2702312,2341024.9,1594654.5,2017092.5,1587273.2,650408.09,820389.33,322446.89,-458538.7,-584372.75,-1046241,-1451674.1,-1841258.2,-2078353.5};
+ST(0.084368038,0.19048099,0,0.087008075,0.19596841,0,0.079090117,0.19794942,0){992852.93,798107.94,1206859.6,-1809621.2,-1537171.7,-2368529.7,495817.1,625323.3,1073015.3,1401810.9,958187.81,1335740.9,-1649308.4,-1512909.8,-2359414.1};
+ST(0.029991713,0.27132489,0,0.027951851,0.26533243,0,0.034582704,0.26623209,0){469504.82,539100.43,604041.77,-1366503,-1547025.6,-1737386.1,2141236.7,2353298.6,2655775,-2724385.3,-2852826.8,-3245580.1,3063642.3,2980285,3433603.3};
+ST(0.043569257,0.19619451,0,0.044234359,0.18859393,0,0.050398693,0.1921099,0){1966078.6,2102462.5,2077292.2,-3794921.6,-3756018.8,-3850553.1,1563901,851571.98,1209682,2340412.7,3086402.5,2818064.5,-3741435.4,-3279385.1,-3615771.1};
+ST(0.0069613667,0.17349451,0,0.0046637588,0.16745308,0,0.0094805882,0.16707285,0){517779.21,362371.83,730151.01,-769992.03,-494096.85,-989834.58,-142713.64,-182769.85,-378084.11,839532.94,560561.48,1124284.7,-266340.1,-21256.565,-22095.939};
+ST(0.074931673,0.27468874,0,0.06660802,0.27624666,0,0.069536278,0.26943087,0){363389.18,417349.44,505602.11,-1064791.9,-1226359.7,-1465439,1691857.9,1959900.4,2276404,-2200836.4,-2572844.1,-2856108.7,2556129.1,3027289.2,3145421.5};
+ST(0.068476894,0.0069177029,0,0.074656208,0.0053403125,0,0.073684623,0.0112317,0){3242851.4,2772385.5,2850123.3,3225849.8,2763721.5,2810738.2,3191931.3,2746414.1,2732509.2,3141298.2,2720533.7,2616540.6,3073847.6,2685936.9,2464223.2};
+ST(0.073754091,0.28851618,0,0.074657371,0.29452352,0,0.068366879,0.29272708,0){171229.59,79525.554,123803.43,-511212.67,-238312.39,-370697.46,843808.82,396309.36,615462.12,-1164215.8,-552992.95,-856697.17,1467609.3,707611.71,1092834.3};
+ST(0.025130011,0.29009115,0,0.024877102,0.29495936,0,0.017990672,0.29207379,0){142877.47,72135.52,86228.122,-427099.39,-216205.93,-258100.45,706741.94,359676.71,428229.3,-978805.55,-502149.61,-595472.42,1240164.3,642973.44,758576.15};
+ST(0.017990672,0.29207379,0,0.024877102,0.29495936,0,0.021428571,0.3,0){86228.122,72135.52,0,-258100.45,-216205.93,0,428229.3,359676.71,0,-595472.42,-502149.61,0,758576.15,642973.44,0};
+ST(0.021428571,0,0,0.025051818,0.0051959301,0,0.01808004,0.0081573173,0){2419501.9,2747435.6,2085729.2,2419561.9,2739316.7,2070583.9,2419679.8,2723095.2,2040406.9,2419876.4,2698832.3,1995444.2,2419989.4,2666496.7,1935913.6};
+ST(0.01808004,0.0081573173,0,0.025051818,0.0051959301,0,0.025468185,0.010276157,0){2085729.2,2747435.6,2780034,2070583.9,2739316.7,2747892,2040406.9,2723095.2,2683968.5,1995444.2,2698832.3,2589008.8,1935913.6,2666496.7,2463902.9};
+ST(0.061244461,0.14481879,0,0.054237851,0.14012792,0,0.060672554,0.13561545,0){2643484.5,2856617.8,2778852.8,-2356788.3,-2267029,-1944873,-2899198.4,-3324577.4,-3362653.4,2042509.4,1580891.3,935707.85,3121060.9,3650971.5,3643681.7};
+ST(0.079090117,0.19794942,0,0.087008075,0.19596841,0,0.08682376,0.20181233,0){1206859.6,798107.94,767576.83,-2368529.7,-1537171.7,-1560255.4,1073015.3,625323.3,843726.65,1335740.9,958187.81,688912.23,-2359414.1,-1512909.8,-1555436.8};
+ST(0.093710586,0.16080643,0,0.088623123,0.15812222,0,0.09308158,0.15403623,0){507346.27,918302.92,579061.91,-621948.04,-1074338,-628036.95,-366919.85,-735787.48,-525997.02,704920.6,1199414.9,672596.25,207593.47,531983.03,469080.04};
+ST(0.088381846,0.16289419,0,0.088623123,0.15812222,0,0.093710586,0.16080643,0){911153.68,918302.92,507346.27,-1156470.7,-1074338,-621948.04,-599768.12,-735787.48,-366919.85,1317920.1,1199414.9,704920.6,244888.24,531983.03,207593.47};
+ST(0.060672554,0.13561545,0,0.059246105,0.12763558,0,0.067728608,0.12931058,0){2778852.8,2918223.5,2567539,-1944873,-1563762.3,-1463631.5,-3362653.4,-3644117.3,-3196956.5,935707.85,-127593.52,89062.443,3643681.7,3585046,3235608.2};
+ST(0.02133326,0.24577003,0,0.025350652,0.23917347,0,0.029124573,0.24658198,0){675269.21,868665.73,849052.23,-1813848.4,-2265304,-2288340.2,2383092.9,2773502.3,3030093.5,-2204305.3,-2193941.8,-2848204.4,1333319.6,753574.67,1797881.3};
+ST(0.037897724,0.149701,0,0.045364072,0.14896511,0,0.042155309,0.15589067,0){2552043.8,2729630.7,2577776.2,-2536068.8,-2670475.8,-2895603.6,-2567975.2,-2787568.3,-2220826.4,2520076,2610132.2,3169529.7,2583694.6,2844182.1,1830012};
+ST(0.071449289,0.19423207,0,0.06771074,0.1881525,0,0.076430303,0.18837043,0){1594804.6,1821405.7,1444535.6,-3019964.8,-3238423,-2574453.4,1103926.4,698008.36,569102.25,2033518.7,2695511.5,2129625.3,-2921575.1,-2795478.4,-2235391.7};
+ST(0.078984823,0.22953004,0,0.084619556,0.23283838,0,0.077318805,0.23627719,0){858343.29,621044.17,830868.27,-2128428.8,-1568398.7,-2136157.9,2291087.1,1771426.2,2525048.7,-1261656.1,-1133733.9,-1830714.2,-424553.92,-42283.716,350702.19};
+ST(0.077318805,0.23627719,0,0.084619556,0.23283838,0,0.084206466,0.24009781,0){830868.27,621044.17,569988.38,-2136157.9,-1568398.7,-1492933.9,2525048.7,1771426.2,1847439,-1830714.2,-1133733.9,-1498530.8,350702.19,-42283.716,578923.58};
+ST(0.026018946,0.14387862,0,0.030440206,0.150204,0,0.022775714,0.15147437,0){2064539,2239650.6,1786181.8,-1800072.3,-2249230.7,-1841345.2,-2295230.1,-2230054.7,-1729359.8,1506177.8,2258843.4,1894858,2488196.2,2220211.9,1670732.8};
+ST(0.07492972,0.092844339,0,0.081743274,0.092625466,0,0.079063451,0.10043005,0){2431427.6,1862860,2051820.1,308451.38,243386.47,-16056.497,-2083891.4,-1587731,-2067914.3,-2656803.1,-2038652.4,-2035845.1,-910298.79,-717394.49,48244.512};
+ST(0.079063451,0.10043005,0,0.081743274,0.092625466,0,0.087331535,0.0958472,0){2051820.1,1862860,1318484.3,-16056.497,243386.47,98077.228,-2067914.3,-1587731,-1213131.9,-2035845.1,-2038652.4,-1401481.2,48244.512,-717394.49,-292629.72};
+ST(0.066012722,0.055502179,0,0.070754378,0.060222618,0,0.064832361,0.062804408,0){3257272.9,2932444.5,3281120.4,2187557.2,1804303.3,1912310.8,399401.17,-17984.254,-254314.65,-1519988.7,-1833384.6,-2314932.7,-2940625.1,-2943704.7,-3410309.6};
+ST(0.069467767,0.146519,0,0.076625322,0.14929356,0,0.070477538,0.15360968,0){2287173.5,1845555.4,2153625.7,-2120501.9,-1818255.1,-2316413.6,-2441744.6,-1872475.3,-1978592.7,1942651.5,1790618.2,2466066.8,2583122,1898765.5,1792310.4};
+ST(0.075488644,0.14176328,0,0.076625322,0.14929356,0,0.069467767,0.146519,0){1990888.2,1845555.4,2287173.5,-1647841.2,-1818255.1,-2120501.9,-2274843.7,-1872475.3,-2441744.6,1255935.2,1790618.2,1942651.5,2491166.6,1898765.5,2583122};
+ST(0.070607657,0.23670872,0,0.066600159,0.24211306,0,0.064373335,0.2338171,0){1007105.3,1004296.2,1185902.3,-2594870.8,-2655015,-3010536.1,3083897.2,3359675.2,3446119.8,-2267120.1,-2867211.3,-2291596.2,490193.02,1352854.8,79206.699};
+ST(0.1,0.11428571,0,0.091758141,0.11296708,0,0.1,0.10714286,0){0,824791.32,0,0,-201020.76,0,0,-976886.6,0,0,-537824.26,0,0,570097.26,0};
+ST(0.017763535,0.12074209,0,0.023379755,0.12686903,0,0.01788586,0.12850833,0){1657769.5,2047772.9,1616906.9,-657738.05,-1065433.1,-895214.81,-2054600.3,-2558991,-2016472.2,-581651.26,-162203.53,-4802.2192,1703675.4,2481221.5,2014144.7};
+ST(0.016927821,0.11108648,0,0.01198914,0.11616091,0,0.0081152275,0.10988635,0){1644246.3,1171325.2,821145.89,-340994.5,-358450.6,-151361.79,-1914445.6,-1420119.3,-944689.8,-1176430.8,-627101.02,-619246.83,981584.41,984768,439508.43};
+ST(0.1,0.021428571,0,0.095041081,0.024587994,0,0.093571257,0.018380777,0){0,597113.29,774815.13,0,557751.32,746204.54,0,481620.22,690036.86,0,373740.48,608388.09,0,241099.33,504051.02};
+ST(0.093593186,0.28160993,0,0.095069321,0.27540052,0,0.1,0.27857143,0){74588.283,76899.446,0,-221009.65,-225624.71,0,359269.18,359465.9,0,-484261.41,-469594.27,0,591230.88,548580.83,0};
+ST(0.0071591483,0.096788703,0,0.0052460498,0.10332732,0,0,0.1,0){756711.76,545715.18,0,43634.951,-33256.292,0,-710572.63,-576983.54,0,-795194.2,-508602.25,0,-130859.45,99155.047,0};
+ST(0.09416017,0.099511923,0,0.086838536,0.10220901,0,0.087331535,0.0958472,0){613994.66,1341203.8,1318484.3,5422.3845,-54099.381,98077.228,-608645.22,-1393108.8,-1213131.9,-619557.01,-1282822.5,-1401481.2,-16415.987,161880.97,-292629.72};
+ST(0.049204373,0.010884263,0,0.043829005,0.011024747,0,0.046181733,0.0056701177,0){3873084,3801549.1,3851009.3,3822842.7,3750937.1,3837454.5,3723003.5,3650381.9,3810385,3574883.8,3501249.8,3769920.5,3380124.5,3305260.3,3715901.2};
+ST(0.045931579,0.29422002,0,0.043131118,0.28864457,0,0.048791783,0.28884593,0){116468.36,225252.57,226341.07,-348980.73,-672574.82,-675936.71,580225.36,1110400.5,1116322.7,-809364.6,-1532552.2,-1541505,1035478,1932837.8,1945474.1};
+ST(0.020473685,0.087577432,0,0.024499807,0.092422798,0,0.019165757,0.095107709,0){2087024.2,2390452.1,1930971.9,451292.51,320672.29,168744.63,-1538224.3,-2026771.7,-1747493.7,-2322280.1,-2619357.9,-2069009.1,-1286407.6,-944222.72,-502664.26};
+ST(0.041002292,0.08644635,0,0.044548934,0.094607351,0,0.03690243,0.09394169,0){3351345,3364209.6,3135041.5,787437.3,323528.56,337961.95,-2379027.1,-3009655.6,-2760700,-3725698.5,-3622750.1,-3396384.7,-2222336.9,-961698.97,-1002139.6};
+ST(0.049739958,0.088394034,0,0.044548934,0.094607351,0,0.041002292,0.08644635,0){3472240.4,3364209.6,3351345,703521.31,323528.56,787437.3,-2626240.1,-3009655.6,-2379027.1,-3862017.3,-3622750.1,-3725698.5,-2018648.2,-961698.97,-2222336.9};
+ST(0.041319833,0.14315875,0,0.033990129,0.14330646,0,0.038217426,0.13599196,0){2735557.7,2486957.5,2738753.8,-2343944,-2138608.5,-1938161,-3071175.4,-2786553.8,-3305386.1,1904337.3,1748365.6,972060.89,3343927.4,3031412.6,3589652.3};
+ST(0.042857143,0,0,0.046181733,0.0056701177,0,0.039686874,0.0066116125,0){3783299.5,3851009.3,3676489.9,3783327.5,3837454.5,3658909.3,3783379.6,3810385,3623831.1,3783486.4,3769920.5,3571457.2,3783576.5,3715901.2,3501797.4};
+ST(0.03928574,0.29335694,0,0.045931579,0.29422002,0,0.042857143,0.3,0){127378.94,116468.36,0,-381522.06,-348980.73,0,633829.06,580225.36,0,-883092.25,-809364.6,0,1127859.7,1035478,0};
+ST(0.030217898,0.25971254,0,0.027951851,0.26533243,0,0.021957304,0.26060316,0){660621.26,539100.43,505833.44,-1866014.4,-1547025.6,-1432636.8,2744196,2353298.6,2119105.6,-3141188.1,-2852826.8,-2450095.8,2987009.7,2980285,2369995.8};
+ST(0.091053567,0.10618538,0,0.086838536,0.10220901,0,0.09416017,0.099511923,0){914271.31,1341203.8,613994.66,-104388.15,-54099.381,5422.3845,-1006721.9,-1393108.8,-608645.22,-787386.88,-1282822.5,-619557.01,309052.61,161880.97,-16415.987};
+ST(0.0045473776,0.2936365,0,0.010662343,0.29482959,0,0.0071428571,0.3,0){18406.211,34537.041,0,-55138.333,-103506.64,0,91630.552,172164.12,0,-127724.83,-240303.04,0,162961.08,307518.14,0};
+ST(0.01093484,0.12117452,0,0.01198914,0.11616091,0,0.017763535,0.12074209,0){1052666.9,1171325.2,1657769.5,-426753.37,-358450.6,-657738.05,-1306415.4,-1420119.3,-2054600.3,-350052.21,-627101.02,-581651.26,1098212.1,984768,1703675.4};
+ST(0.043491003,0.26677795,0,0.034582704,0.26623209,0,0.037705658,0.25939989,0){657627.62,604041.77,758443.36,-1894105.9,-1737386.1,-2140288.6,2903724.9,2655775,3141072.6,-3565612.1,-3245580.1,-3582615.2,3800401.2,3433603.3,3385872.9};
+ST(0.0071428571,0,0,0.010679145,0.0052482016,0,0.0045481906,0.0063920675,0){863498.79,1277155.8,552257.15,863505.11,1273289.3,549810.55,863516.31,1265566.3,544927.47,863538.53,1254019.7,537633.65,863596.62,1238493.9,527798.54};
+ST(0.020636298,0.17424253,0,0.014405512,0.17061143,0,0.020973714,0.16688371,0){1433869.3,1063653,1525118.3,-2154082.5,-1519257.6,-2061659.5,-351921.61,-412907.51,-799875.51,2330929.4,1696192.6,2343184.8,-819073.82,-313907.63,-24581.749};
+ST(0.018422519,0.27450763,0,0.025044032,0.27464897,0,0.023483408,0.28013687,0){282501.19,363665.57,270985.88,-827496.14,-1065519.5,-801278.39,1313896,1692735.8,1297043.7,-1707268.8,-2201379.5,-1736920.8,1979556.1,2555652.6,2101746.5};
+ST(0.0061411468,0.1246533,0,0.0062042788,0.11791514,0,0.01093484,0.12117452,0){591118.91,612847.32,1052666.9,-280990.71,-208741.13,-426753.37,-738586.84,-750565.55,-1306415.4,-106527.54,-286207.66,-350052.21,682629.18,561848.67,1098212.1};
+ST(0.042557423,0.10832344,0,0.039702853,0.10111678,0,0.047385855,0.10193045,0){3183930.6,3175586.8,3329666.7,-492142.06,-64516.934,-117239.93,-3600076,-3238866.3,-3442848.4,-2551523.2,-3108635.2,-3204510.9,1442840.6,193445.51,350991.89};
+ST(0.0081152275,0.10988635,0,0.0062042788,0.11791514,0,0,0.11428571,0){821145.89,612847.32,0,-151361.79,-208741.13,0,-944689.8,-750565.55,0,-619246.83,-286207.66,0,439508.43,561848.67,0};
+ST(0.067728608,0.12931058,0,0.059246105,0.12763558,0,0.064276416,0.12183086,0){2567539,2918223.5,2809128.6,-1463631.5,-1563762.3,-1175750.5,-3196956.5,-3644117.3,-3492840.6,89062.443,-127593.52,-855220.15,3235608.2,3585046,2995580.4};
+ST(0.0079950318,0.059686314,0,0.004777904,0.053197076,0,0.0094132111,0.052421332,0){917766.47,557925.04,1088603.4,570756.35,389224.92,768702.62,7912.4367,102822.82,222919.17,-557994.72,-214698.3,-388347.22,-913265.38,-467537.22,-885762.83};
+ST(0.064276416,0.12183086,0,0.062195955,0.11505156,0,0.069025318,0.11622387,0){2809128.6,2965673.8,2631986.5,-1175750.5,-843057.19,-808686.45,-3492840.6,-3569130.8,-3192250.9,-855220.15,-1711501.2,-1402768.4,2995580.4,2344130.4,2220554.1};
+ST(0.057323957,0.1204315,0,0.062195955,0.11505156,0,0.064276416,0.12183086,0){3051716.5,2965673.8,2809128.6,-1191883,-843057.19,-1175750.5,-3778168.4,-3569130.8,-3492840.6,-1110713.1,-1711501.2,-855220.15,3101303,2344130.4,2995580.4};
+ST(0.073684623,0.0112317,0,0.074656208,0.0053403125,0,0.081119523,0.0085521597,0){2850123.3,2772385.5,2167108.8,2810738.2,2763721.5,2149779.2,2732509.2,2746414.1,2115263.6,2616540.6,2720533.7,2063869.7,2464223.2,2685936.9,1995657.9};
+ST(0.081165886,0.29137431,0,0.074657371,0.29452352,0,0.073754091,0.28851618,0){97729.953,79525.554,171229.59,-292395.17,-238312.39,-511212.67,484687.71,396309.36,843808.82,-673055.06,-552992.95,-1164215.8,855744.16,707611.71,1467609.3};
+ST(0.064276416,0.12183086,0,0.070840483,0.12204614,0,0.067728608,0.12931058,0){2809128.6,2470738.2,2567539,-1175750.5,-1044803.2,-1463631.5,-3492840.6,-3073782.1,-3196956.5,-855220.15,-729197.53,89062.443,2995580.4,2652961,3235608.2};
+ST(0.058212185,0.089881183,0,0.052532368,0.096036702,0,0.049739958,0.088394034,0){3344291.6,3389506.1,3472240.4,593905.21,240670.51,703521.31,-2645013.4,-3131818.5,-2626240.1,-3708817.1,-3594959.1,-3862017.3,-1722713.3,-718569.73,-2018648.2};
+ST(0.017433092,0.042090914,0,0.013132659,0.04767246,0,0.011573719,0.041901165,0){1971771.3,1507774.2,1347025.1,1594855,1139737.5,1091815.8,913057.13,493500.09,629744.45,56690.05,-273193.01,48353.226,-810753.02,-973395.4,-542301.86};
+ST(0.042155309,0.15589067,0,0.034314476,0.15645926,0,0.037897724,0.149701,0){2577776.2,2334400.9,2552043.8,-2895603.6,-2649968.2,-2536068.8,-2220826.4,-1976247.7,-2567975.2,3169529.7,2917237.1,2520076,1830012,1581967.4,2583694.6};
+ST(0.038427921,0.16264679,0,0.034314476,0.15645926,0,0.042155309,0.15589067,0){2389351.9,2334400.9,2577776.2,-3020403.6,-2649968.2,-2895603.6,-1591681.4,-1976247.7,-2220826.4,3440909.6,2917237.1,3169529.7,682723.32,1581967.4,1830012};
+ST(0.044666369,0.11545829,0,0.040442009,0.11996282,0,0.038084092,0.1145524,0){3148096.1,2999410,2981407.2,-920013.3,-1143461.2,-818508.93,-3799301.5,-3706983.7,-3575257.7,-1769018.1,-1150363.3,-1775238,2547335.8,2995190.5,2287308.3};
+ST(0.041002292,0.08644635,0,0.047307891,0.081963043,0,0.049739958,0.088394034,0){3351345,3516083,3472240.4,787437.3,1080946.4,703521.31,-2379027.1,-2102837.3,-2626240.1,-3725698.5,-3830300,-3862017.3,-2222336.9,-2905310.5,-2018648.2};
+ST(0.09156348,0.14589395,0,0.093938974,0.13899,0,0.1,0.14285714,0){734092.88,548364.78,0,-670961.7,-422206.84,0,-791796.8,-645591.08,0,602866.55,273728.87,0,843431.47,708600.91,0};
+ST(0.1,0.12857143,0,0.093823791,0.12410599,0,0.1,0.12142857,0){0,595735.92,0,0,-276601.23,0,0,-743959.63,0,0,-121937.8,0,0,678759.2,0};
+ST(0.080938662,0.054906318,0,0.073604017,0.054819307,0,0.077364239,0.048764008,0){2097661.4,2744584.6,2450679,1423084,1864679.8,1825420.5,290856.94,386939.94,734405.59,-934922.56,-1214908.7,-544039.45,-1860365.1,-2427603.9,-1683943.8};
+ST(0.082942949,0.21818591,0,0.084319616,0.22565969,0,0.076796159,0.2234596,0){823054.75,696453.76,1008421.8,-1901094.8,-1688204.7,-2411357.4,1667014.3,1707540.6,2346331.8,-282341.7,-743250.94,-852928.84,-1297502.9,-649719.93,-1160000.7};
+ST(0.1,0.27142857,0,0.092520768,0.26920591,0,0.1,0.26428571,0){0,145042.72,0,0,-420173.4,0,0,651988.34,0,0,-816598.86,0,0,896908.09,0};
+ST(0.1,0.035714286,0,0.092450683,0.030760689,0,0.1,0.028571429,0){0,900007.85,0,0,807431.66,0,0,631804.95,0,0,391202.83,0,0,110124.82,0};
+ST(0.045416206,0.061541227,0,0.042113175,0.053290167,0,0.048663579,0.053435419,0){3642820.9,3616583.4,3726394.8,2181474.8,2519252.9,2589713.3,-155055.51,657513.67,663071.82,-2429600.5,-1403801.4,-1465861.1,-3730025.8,-3039615.4,-3147918.6};
+ST(0.038435934,0.058364632,0,0.042113175,0.053290167,0,0.045416206,0.061541227,0){3459248.5,3616583.4,3642820.9,2206750.4,2519252.9,2181474.8,155241.86,657513.67,-155055.51,-1952496,-1403801.4,-2429600.5,-3353689.4,-3039615.4,-3730025.8};
+ST(0.0528723,0.26429657,0,0.055001581,0.27169863,0,0.049721881,0.27094787,0){718299.05,565900.8,588018.61,-2055661.9,-1648356.5,-1710042.9,3109067.1,2587095.5,2675009.8,-3733060,-3300283.2,-3394309,3841282.5,3725567.5,3801713.7};
+ST(0.082516133,0.27647665,0,0.086077973,0.27164165,0,0.089232651,0.27618677,0){248899.48,243157.03,160151.6,-731674.12,-708191.99,-470555.02,1170289.2,1111255.9,751874.95,-1538273.3,-1417072.6,-986723.61,1813237.5,1598582.9,1160401.4};
+ST(0.089183466,0.023798504,0,0.085916752,0.02828,0,0.082332164,0.023444943,0){1283383.3,1643257.2,2029600,1204105.7,1500211.7,1907886.4,1050439.6,1226559.7,1671751.1,831874.08,846114.35,1335359.8,561630.79,391827.49,918760.81};
+ST(0.079063451,0.10043005,0,0.086838536,0.10220901,0,0.082583958,0.10907049,0){2051820.1,1341203.8,1698614.9,-16056.497,-54099.381,-286603.09,-2067914.3,-1393108.8,-1936849,-2035845.1,-1282822.5,-1323464.6,48244.512,161880.97,836522.31};
+ST(0.059543685,0.10776494,0,0.06715469,0.10983132,0,0.062195955,0.11505156,0){3132791.5,2794834,2965673.8,-451048.14,-512277.78,-843057.19,-3519016.9,-3213264.7,-3569130.8,-2561357.9,-2112070.8,-1711501.2,1326599.2,1488257.3,2344130.4};
+ST(0.011838853,0.2301677,0,0.0069516057,0.23320895,0,0.0069979116,0.22643766,0){504229.49,288078.49,317964.48,-1254859.2,-728952.19,-774386.26,1363834.1,827497.2,793599.18,-775392.51,-537397.4,-364658.79,-209768.04,-5267.3055,-270536.88};
+ST(0.070477538,0.15360968,0,0.076625322,0.14929356,0,0.077069107,0.15686929,0){2153625.7,1845555.4,1743907.9,-2316413.6,-1818255.1,-1994600,-1978592.7,-1872475.3,-1457243.4,2466066.8,1790618.2,2204191.1,1792310.4,1898765.5,1140253.2};
+ST(0.09123018,0.070922096,0,0.095795895,0.073622969,0,0.091953893,0.078440357,0){983713.53,473503.74,889726.23,465586.72,205720.2,322434.75,-297764.17,-178405.32,-450550.32,-904277.98,-461642.03,-936443.15,-1034644.8,-483922.03,-825354.72};
+ST(0.041057987,0.068843254,0,0.041803352,0.076750149,0,0.033874053,0.071548869,0){3488848.8,3453761.9,3157862.8,1752771.3,1340279.2,1466537.3,-855539,-1593440.1,-1010259.7,-3038218.5,-3552303.7,-2946084.6,-3709409.4,-3337911.6,-3304540.6};
+ST(0.075422073,0.20645372,0,0.081922129,0.20489902,0,0.081656406,0.2108727,0){1273700.5,996952.98,951384.03,-2693470,-2081157.6,-2083808.1,1728669,1266338.6,1528962.6,766631.5,704044.3,263916.4,-2583646.6,-2032271.3,-1843401};
+ST(0.084206466,0.24009781,0,0.084619556,0.23283838,0,0.092168655,0.23668616,0){569988.38,621044.17,307607.26,-1492933.9,-1568398.7,-792496.69,1847439,1771426.2,941630.33,-1498530.8,-1133733.9,-691810.02,578923.58,-42283.716,148523.72};
+ST(0.092168655,0.23668616,0,0.084619556,0.23283838,0,0.09071018,0.22887426,0){307607.26,621044.17,406264.77,-792496.69,-1568398.7,-1003622.2,941630.33,1771426.2,1069446.3,-691810.02,-1133733.9,-568907.82,148523.72,-42283.716,-233040.27};
+ST(0.071000103,0.28243589,0,0.078222118,0.28277283,0,0.073754091,0.28851618,0){281581.81,220930.92,171229.59,-835250.62,-655625.13,-511212.67,1360764.9,1069057.6,843808.82,-1840418.5,-1447830.3,-1164215.8,2257916.8,1779434.3,1467609.3};
+ST(0.073684623,0.0112317,0,0.078020383,0.017034313,0,0.070691378,0.017050195,0){2850123.3,2461848.1,3076870.7,2810738.2,2383750.6,2979073.3,2732509.2,2230032.5,2786592,2616540.6,2005590.6,2505581.5,2464223.2,1717239.5,2144710.8};
+ST(0.028678488,0.042143634,0,0.022876349,0.043626948,0,0.023478597,0.036718106,0){2968313.4,2488553.5,2561783.8,2399521.8,1978130.3,2187675.4,1370917.4,1061959.9,1494080.3,79587.615,-72059.632,582277.59,-1227272.3,-1191549.5,-414804.14};
+ST(0.053497526,0.1329974,0,0.059246105,0.12763558,0,0.060672554,0.13561545,0){2959143.9,2918223.5,2778852.8,-1911000.9,-1563762.3,-1944873,-3636096,-3644117.3,-3362653.4,623103.97,-127593.52,935707.85,3857035.6,3585046,3643681.7};
+ST(0.087083587,0.13880919,0,0.093938974,0.13899,0,0.09156348,0.14589395,0){1144744.3,548364.78,734092.88,-877072.07,-422206.84,-670961.7,-1349889.8,-645591.08,-791796.8,561444.4,273728.87,602866.55,1481228.8,708600.91,843431.47};
+ST(0.054957014,0.24657048,0,0.049037582,0.25027532,0,0.047556344,0.24377674,0){1058545,998508.07,1122639.4,-2852831,-2730849.8,-2989881.7,3777171.8,3739350.2,3850350.4,-3549694.2,-3756698.7,-3414324.1,2239441.1,2778087.3,1828478.4};
+ST(0.06771074,0.1881525,0,0.07206248,0.1830344,0,0.076430303,0.18837043,0){1821405.7,1716055.3,1444535.6,-3238423,-2879815.5,-2574453.4,698008.36,236909.5,569102.25,2695511.5,2719220.1,2129625.3,-2795478.4,-2081132.3,-2235391.7};
+ST(0.093571257,0.018380777,0,0.095041081,0.024587994,0,0.089183466,0.023798504,0){774815.13,597113.29,1283383.3,746204.54,557751.32,1204105.7,690036.86,481620.22,1050439.6,608388.09,373740.48,831874.08,504051.02,241099.33,561630.79};
+ST(0.089232651,0.27618677,0,0.095069321,0.27540052,0,0.093593186,0.28160993,0){160151.6,76899.446,74588.283,-470555.02,-225624.71,-221009.65,751874.95,359465.9,359269.18,-986723.61,-469594.27,-484261.41,1160401.4,548580.83,591230.88};
+ST(0.017861336,0.10270337,0,0.019165757,0.095107709,0,0.024938414,0.098415267,0){1773538.4,1930971.9,2383058.5,-87655.931,168744.63,68195.72,-1856823.6,-1747493.7,-2312962.3,-1677437.3,-2069009.1,-2447461.4,261812.45,-502664.26,-204726.33};
+ST(0.082583958,0.10907049,0,0.076969725,0.10634022,0,0.079063451,0.10043005,0){1698614.9,2181001.1,2051820.1,-286603.09,-255488.75,-16056.497,-1936849,-2406546.5,-2067914.3,-1323464.6,-1869163.7,-2035845.1,836522.31,756176.24,48244.512};
+ST(0.020473685,0.087577432,0,0.01318623,0.084416193,0,0.019499739,0.079597209,0){2087024.2,1411871.7,2040354.6,451292.51,378554.62,702945.71,-1538224.3,-931831.12,-1095289.5,-2322280.1,-1560266,-2175701.2,-1286407.6,-1046999.7,-1830384.7};
+ST(0.087331535,0.0958472,0,0.086838536,0.10220901,0,0.079063451,0.10043005,0){1318484.3,1341203.8,2051820.1,98077.228,-54099.381,-16056.497,-1213131.9,-1393108.8,-2067914.3,-1401481.2,-1282822.5,-2035845.1,-292629.72,161880.97,48244.512};
+ST(0.019247887,0.048569646,0,0.013132659,0.04767246,0,0.017433092,0.042090914,0){2135187.8,1507774.2,1971771.3,1594654.5,1139737.5,1594855,650408.09,493500.09,913057.13,-458538.7,-273193.01,56690.05,-1451674.1,-973395.4,-810753.02};
+ST(0.071000103,0.28243589,0,0.06660802,0.27624666,0,0.074931673,0.27468874,0){281581.81,417349.44,363389.18,-835250.62,-1226359.7,-1064791.9,1360764.9,1959900.4,1691857.9,-1840418.5,-2572844.1,-2200836.4,2257916.8,3027289.2,2556129.1};
+ST(0.076796159,0.2234596,0,0.084319616,0.22565969,0,0.078984823,0.22953004,0){1008421.8,696453.76,858343.29,-2411357.4,-1688204.7,-2128428.8,2346331.8,1707540.6,2291087.1,-852928.84,-743250.94,-1261656.1,-1160000.7,-649719.93,-424553.92};
+ST(0.087083587,0.13880919,0,0.081009521,0.1385969,0,0.083559522,0.13424014,0){1144744.3,1630909.4,1462145.4,-877072.07,-1242340.3,-981746.52,-1349889.8,-1926924,-1784737.2,561444.4,783271.16,395362.65,1481228.8,2113542.9,1914407.3};
+ST(0,0.057142857,0,0.004777904,0.053197076,0,0.0079950318,0.059686314,0){0,557925.04,917766.47,0,389224.92,570756.35,0,102822.82,7912.4367,0,-214698.3,-557994.72,0,-467537.22,-913265.38};
+ST(0.0079950318,0.059686314,0,0.0062494098,0.068021592,0,0,0.064285714,0){917766.47,709501.16,0,570756.35,364477.97,0,7912.4367,-157824.6,0,-557994.72,-603457.47,0,-913265.38,-756039.79,0};
+ST(0.041057987,0.068843254,0,0.047469022,0.070467195,0,0.041803352,0.076750149,0){3488848.8,3608010.8,3453761.9,1752771.3,1730907.5,1340279.2,-855539,-1046792,-1593440.1,-3038218.5,-3280034.9,-3552303.7,-3709409.4,-3807136.9,-3337911.6};
+ST(0.0071591483,0.096788703,0,0.0067127961,0.088875219,0,0.013428016,0.091778472,0){756711.76,725937.81,1408980.1,43634.951,141227.93,204626.15,-710572.63,-557260.38,-1174648.8,-795194.2,-806944.34,-1549888.7,-130859.45,-406936.37,-600683.83};
+ST(0.081119523,0.0085521597,0,0.074656208,0.0053403125,0,0.078571429,0,0){2167108.8,2772385.5,2419478.6,2149779.2,2763721.5,2419535.2,2115263.6,2746414.1,2419645.1,2063869.7,2720533.7,2419827.2,1995657.9,2685936.9,2420024.4};
+ST(0.078571429,0.3,0,0.074657371,0.29452352,0,0.081165886,0.29137431,0){0,79525.554,97729.953,0,-238312.39,-292395.17,0,396309.36,484687.71,0,-552992.95,-673055.06,0,707611.71,855744.16};
+ST(0.082332164,0.023444943,0,0.078020383,0.017034313,0,0.085905658,0.016824409,0){2029600,2461848.1,1656238,1907886.4,2383750.6,1604967.9,1671751.1,2230032.5,1504009.2,1335359.8,2005590.6,1356492.3,918760.81,1717239.5,1166855};
+ST(0.08596482,0.28314521,0,0.078222118,0.28277283,0,0.082516133,0.27647665,0){145967.81,220930.92,248899.48,-433371.98,-655625.13,-731674.12,707326.96,1069057.6,1170289.2,-959333.22,-1447830.3,-1538273.3,1181452.3,1779434.3,1813237.5};
+ST(0.072908259,0.24139656,0,0.078142774,0.24370973,0,0.071915087,0.24816524,0){881474.92,714639.7,803363.84,-2322734,-1902709.3,-2179152.4,2916335.3,2448578.4,2928525.2,-2445637.4,-2167997.3,-2836050.6,1082242,1155455.3,1927975};
+ST(0.010955873,0.10281868,0,0.013714026,0.097839388,0,0.017861336,0.10270337,0){1124212.8,1412613.2,1773538.4,-57954.543,55008.627,-87655.931,-1179275.3,-1355500.2,-1856823.6,-1060620.9,-1463354,-1677437.3,173274.75,-165174.7,261812.45};
+ST(0,0.092857143,0,0.0067127961,0.088875219,0,0.0071591483,0.096788703,0){0,725937.81,756711.76,0,141227.93,43634.951,0,-557260.38,-710572.63,0,-806944.34,-795194.2,0,-406936.37,-130859.45};
+ST(0.081656406,0.2108727,0,0.086709216,0.20730703,0,0.089437553,0.21298247,0){951384.03,734117.03,556322.48,-2083808.1,-1563285.8,-1238115.4,1528962.6,1031586.7,961021.23,263916.4,398134,60411.18,-1843401,-1481512.9,-1035404.3};
+ST(0.033761495,0.088496681,0,0.030017634,0.093495078,0,0.027903545,0.087518505,0){3029395.9,2771844.6,2674848,608605.12,320378.42,580994.77,-2298547.5,-2414486.4,-1967676.8,-3368980,-3014031.4,-2976106,-1747439.7,-948223.96,-1655065.1};
+ST(0.073708403,0.21517194,0,0.076796159,0.2234596,0,0.069002793,0.22246209,0){1225969.3,1008421.8,1267491.2,-2772471.1,-2411357.4,-3011719.2,2271379.1,2346331.8,2877058.6,-92677.622,-852928.84,-947533.34,-2155133.8,-1160000.7,-1573376.1};
+ST(0.072126291,0.10515927,0,0.065931692,0.10408722,0,0.069968451,0.098831219,0){2539730.3,2911358.9,2730411,-241283.81,-218409.17,57648.531,-2758172.2,-3113407,-2671597.7,-2254933.2,-2661455,-2785714.6,717337.89,651464.78,-173126.8};
+ST(0.066401409,0.0434645,0,0.073234584,0.04253025,0,0.06961584,0.048915995,0){3289675.8,2820532.7,3063466,2619840.6,2270240.9,2277085.6,1416557.6,1277003.9,906160.93,-75156.319,34586.382,-697426.19,-1551772,-1214797.7,-2122325.6};
+ST(0.06961584,0.048915995,0,0.073234584,0.04253025,0,0.077364239,0.048764008,0){3063466,2820532.7,2450679,2277085.6,2270240.9,1825420.5,906160.93,1277003.9,734405.59,-697426.19,34586.382,-544039.45,-2122325.6,-1214797.7,-1683943.8};
+ST(0.030017634,0.093495078,0,0.024499807,0.092422798,0,0.027903545,0.087518505,0){2771844.6,2390452.1,2674848,320378.42,320672.29,580994.77,-2414486.4,-2026771.7,-1967676.8,-3014031.4,-2619357.9,-2976106,-948223.96,-944222.72,-1655065.1};
+ST(0.079265602,0.086677581,0,0.081743274,0.092625466,0,0.07492972,0.092844339,0){2114636.1,1862860,2431427.6,488789.06,243386.47,308451.38,-1512904.7,-1587731,-2083891.4,-2351470.6,-2038652.4,-2656803.1,-1382326.1,-717394.49,-910298.79};
+ST(0.083969261,0.16737329,0,0.083337094,0.16031526,0,0.088381846,0.16289419,0){1198489.7,1295652.6,911153.68,-1632158.2,-1575018.8,-1156470.7,-607916.58,-956036.82,-599768.12,1852187.2,1781183.7,1317920.1,-62490.334,571788.58,244888.24};
+ST(0,0.071428571,0,0.0060853536,0.074713803,0,0,0.078571429,0){0,681675.12,0,0,285253.65,0,0,-277070.48,0,0,-678306.76,0,0,-685312.86,0};
+ST(0.0068768393,0.16098373,0,0.014502412,0.16316663,0,0.0094805882,0.16707285,0){553409.29,1121335,730151.01,-680450.71,-1429592.9,-989834.58,-397156.36,-728363.13,-378084.11,771605.48,1629901.1,1124284.7,219690.78,280110.31,-22095.939};
+ST(0.09123018,0.070922096,0,0.085646934,0.067722415,0,0.09230899,0.063522919,0){983713.53,1585902.9,877619.52,465586.72,821166.94,503392.8,-297764.17,-339583.13,-85524.836,-904277.98,-1336670.3,-638068.15,-1034644.8,-1689538.4,-918939.46};
+ST(0.09230899,0.063522919,0,0.085646934,0.067722415,0,0.08415119,0.061061125,0){877619.52,1585902.9,1759442.9,503392.8,821166.94,1064240.3,-85524.836,-339583.13,-51487.645,-638068.15,-1336670.3,-1146904.2,-918939.46,-1689538.4,-1789550.6};
+ST(0.035619257,0.12028764,0,0.040442009,0.11996282,0,0.038464606,0.12667013,0){2821397.9,2999410,2859316.3,-1093830.4,-1143461.2,-1476046.2,-3491178.8,-3706983.7,-3573486.5,-1043884.2,-1150363.3,-252868.56,2851838.9,2995190.5,3451249.3};
+ST(0.038464606,0.12667013,0,0.040442009,0.11996282,0,0.045375723,0.12284566,0){2859316.3,2999410,3072436,-1476046.2,-1143461.2,-1348503.3,-3573486.5,-3706983.7,-3829159.4,-252868.56,-1150363.3,-800055.99,3451249.3,2995190.5,3380414.3};
+ST(0.051167355,0.022914381,0,0.054261983,0.029107824,0,0.048866761,0.029559705,0){3850137.8,3801269,3831772.8,3629520.4,3450822.2,3467532.3,3200919.1,2782228.4,2773676.3,2588908.3,1857139.4,1816186,1828396.4,760852.59,685852.4};
+ST(0,0.15714286,0,0.0056981356,0.15371602,0,0.0068768393,0.16098373,0){0,478995.44,553409.29,0,-516269.88,-680450.71,0,-438816.38,-397156.36,0,550400.04,771605.48,0,395913.98,219690.78};
+ST(0.029380008,0.16405835,0,0.036146522,0.16944297,0,0.030623168,0.1713445,0){2021292.5,2222447.1,1985985.4,-2614335.2,-3121229.8,-2866418.8,-1254306.4,-960241.74,-715248.18,2982541.3,3509731.4,3183566.3,378860.61,-459324.98,-696442.05};
+ST(0.038427921,0.16264679,0,0.036146522,0.16944297,0,0.029380008,0.16405835,0){2389351.9,2222447.1,2021292.5,-3020403.6,-3121229.8,-2614335.2,-1591681.4,-960241.74,-1254306.4,3440909.6,3509731.4,2982541.3,682723.32,-459324.98,378860.61};
+ST(0.057707972,0.025075094,0,0.054261983,0.029107824,0,0.051167355,0.022914381,0){3734947.8,3801269,3850137.8,3478918.2,3450822.2,3629520.4,2984396.6,2782228.4,3200919.1,2285289.9,1857139.4,2588908.3,1429238.8,760852.59,1828396.4};
+ST(0.033039341,0.023173825,0,0.029163144,0.015558324,0,0.038009007,0.015147577,0){3318087.9,3068207,3597209.6,3123656.1,2986953.6,3506943.3,2746181,2826596.5,3328697.3,2207795.9,2591406.1,3067010.9,1539940.3,2287504.7,2728518.9};
+ST(0.0071428571,0.3,0,0.010662343,0.29482959,0,0.014285714,0.3,0){0,34537.041,0,0,-103506.64,0,0,172164.12,0,0,-240303.04,0,0,307518.14,0};
+ST(0.014285714,0,0,0.010679145,0.0052482016,0,0.0071428571,0,0){1683701.5,1277155.8,863498.79,1683671.3,1273289.3,863505.11,1683611.9,1265566.3,863516.31,1683542.6,1254019.7,863538.53,1683226,1238493.9,863596.62};
+ST(0.0078195435,0.14622426,0,0.0056981356,0.15371602,0,0,0.15,0){680366.1,478995.44,0,-626541.18,-516269.88,0,-729870.69,-438816.38,0,568744.13,550400.04,0,774663.29,395913.98,0};
+ST(0.062195955,0.11505156,0,0.06715469,0.10983132,0,0.069025318,0.11622387,0){2965673.8,2794834,2631986.5,-843057.19,-512277.78,-808686.45,-3569130.8,-3213264.7,-3192250.9,-1711501.2,-2112070.8,-1402768.4,2344130.4,1488257.3,2220554.1};
+ST(0.010955873,0.10281868,0,0.0052460498,0.10332732,0,0.0071591483,0.096788703,0){1124212.8,545715.18,756711.76,-57954.543,-33256.292,43634.951,-1179275.3,-576983.54,-710572.63,-1060620.9,-508602.25,-795194.2,173274.75,99155.047,-130859.45};
+ST(0.059054943,0.066788508,0,0.064846874,0.068845861,0,0.061098586,0.072147464,0){3499189.3,3243292.3,3389933,1856149.2,1629296.1,1545196.6,-658492.2,-795531.06,-1140417.3,-2864039.1,-2824516.6,-3205469.9,-3725081.1,-3448034.5,-3526423.9};
+ST(0.064832361,0.062804408,0,0.064846874,0.068845861,0,0.059054943,0.066788508,0){3281120.4,3243292.3,3499189.3,1912310.8,1629296.1,1856149.2,-254314.65,-795531.06,-658492.2,-2314932.7,-2824516.6,-2864039.1,-3410309.6,-3448034.5,-3725081.1};
+ST(0.016702178,0.061420197,0,0.012193394,0.066188359,0,0.0079950318,0.059686314,0){1844408.3,1364188,917766.47,1107331.1,734639.92,570756.35,-72241.295,-233939.49,7912.4367,-1222910.6,-1094586.7,-557994.72,-1885264.1,-1450385,-913265.38};
+ST(0.029380008,0.16405835,0,0.025851591,0.17077962,0,0.020973714,0.16688371,0){2021292.5,1763476.8,1525118.3,-2614335.2,-2524912.6,-2061659.5,-1254306.4,-673288.62,-799875.51,2982541.3,2815714.9,2343184.8,378860.61,-542697.73,-24581.749};
+ST(0.045331711,0.23557633,0,0.037546984,0.23452457,0,0.041402067,0.22952626,0){1270563.3,1205921.7,1348916.4,-3255008.9,-3072707.6,-3344816,3813331,3550700.1,3600200.4,-2700862,-2423829.8,-1982154,404484.48,201013.93,-667743.82};
+ST(0.018343869,0.21720619,0,0.02301506,0.22157032,0,0.017207343,0.22323305,0){888277.19,1025043.6,781289.63,-2037897.4,-2421684.9,-1865590.4,1749211,2274566.1,1807835.2,-225952.88,-677461.35,-643322.1,-1457259.1,-1351813.7,-915362.92};
+ST(0.02463475,0.21609565,0,0.02301506,0.22157032,0,0.018343869,0.21720619,0){1153636.1,1025043.6,888277.19,-2626116.1,-2421684.9,-2037897.4,2198315,2274566.1,1749211,-179791.92,-677461.35,-225952.88,-1969098.8,-1351813.7,-1457259.1};
+ST(0.077318805,0.23627719,0,0.070607657,0.23670872,0,0.07180958,0.22984275,0){830868.27,1007105.3,1079159.6,-2136157.9,-2594870.8,-2680718.2,2525048.7,3083897.2,2899261.6,-1830714.2,-2267120.1,-1622013.4,350702.19,490193.02,-492395.98};
+ST(0.0071147476,0.24137211,0,0.0043813653,0.24702694,0,0,0.24285714,0){259907.57,145794.38,0,-684802.64,-393661.32,0,859611.54,523477.05,0,-720499.62,-496310.62,0,317972.39,320224.07,0};
+ST(0.079265602,0.086677581,0,0.075872285,0.081656016,0,0.082390534,0.079333541,0){2114636.1,2427639,1865676.5,488789.06,758134.07,650380.91,-1512904.7,-1432759.9,-988603.29,-2351470.6,-2638364.3,-1983689.6,-1382326.1,-2029677.1,-1686881.4};
+ST(0,0.17142857,0,0.0069613667,0.17349451,0,0,0.17857143,0){0,517779.21,0,0,-769992.03,0,0,-142713.64,0,0,839532.94,0,0,-266340.1,0};
+ST(0.038009007,0.015147577,0,0.043829005,0.011024747,0,0.046063037,0.016810165,0){3597209.6,3801549.1,3836060.2,3506943.3,3750937.1,3717529.2,3328697.3,3650381.9,3484126.2,3067010.9,3501249.8,3143090.2,2728518.9,3305260.3,2704667.4};
+ST(0.025221599,0.062165695,0,0.027058874,0.069011929,0,0.01882241,0.070374011,0){2618029.3,2727323.5,2018056.9,1547191.2,1363815.9,970762.8,-156575.4,-681543.48,-580354.6,-1796512.5,-2386220.5,-1830388.5,-2702051.5,-2898415.6,-2130853.3};
+ST(0.077393474,0.16425214,0,0.083337094,0.16031526,0,0.083969261,0.16737329,0){1650679.7,1295652.6,1198489.7,-2141613.9,-1575018.8,-1632158.2,-1013799.5,-956036.82,-607916.58,2443278.1,1781183.7,1852187.2,287063.28,571788.58,-62490.334};
+ST(0.05288218,0.14757716,0,0.054237851,0.14012792,0,0.061244461,0.14481879,0){2767228.4,2856617.8,2643484.5,-2626819.9,-2267029,-2356788.3,-2900596.1,-3324577.4,-2899198.4,2479722.6,1580891.3,2042509.4,3026446,3650971.5,3121060.9};
+ST(0.047918899,0.14257657,0,0.054237851,0.14012792,0,0.05288218,0.14757716,0){2842478.3,2856617.8,2767228.4,-2400971.6,-2267029,-2626819.9,-3215455,-3324577.4,-2900596.1,1901551.7,1580891.3,2479722.6,3510918.5,3650971.5,3026446};
+ST(0.026018946,0.14387862,0,0.022775714,0.15147437,0,0.017312959,0.14496605,0){2064539,1786181.8,1456929,-1800072.3,-1841345.2,-1303417.8,-2295230.1,-1729359.8,-1594293.7,1506177.8,1894858,1135517.7,2488196.2,1670732.8,1713822.2};
+ST(0,0.042857143,0,0.0064812773,0.046734878,0,0,0.05,0){0,761350.4,0,0,582610.88,0,0,267082.8,0,0,-111174.21,0,0,-463416.67,0};
+ST(0.024008584,0.022367291,0,0.029163144,0.015558324,0,0.033039341,0.023173825,0){2639060.6,3068207,3318087.9,2494948.4,2986953.6,3123656.1,2214593.6,2826596.5,2746181,1813324.4,2591406.1,2207795.9,1312931.3,2287504.7,1539940.3};
+ST(0.053497526,0.1329974,0,0.052058531,0.12554764,0,0.059246105,0.12763558,0){2959143.9,3065498.6,2918223.5,-1911000.9,-1512626.5,-1563762.3,-3636096,-3831818,-3644117.3,623103.97,-428428.64,-127593.52,3857035.6,3614977.4,3585046};
+ST(0.020973714,0.16688371,0,0.014502412,0.16316663,0,0.021502186,0.15931359,0){1525118.3,1121335,1630158.4,-2061659.5,-1429592.9,-1947614.2,-799875.51,-728363.13,-1250943.8,2343184.8,1629901.1,2191316.6,-24581.749,280110.31,824223.66};
+ST(0.083292987,0.24598228,0,0.078142774,0.24370973,0,0.084206466,0.24009781,0){542685.82,714639.7,569988.38,-1458992.1,-1902709.3,-1492933.9,1920780.7,2448578.4,1847439,-1784182,-2167997.3,-1498530.8,1091638.2,1155455.3,578923.58};
+ST(0.039686874,0.0066116125,0,0.043829005,0.011024747,0,0.038009007,0.015147577,0){3676489.9,3801549.1,3597209.6,3658909.3,3750937.1,3506943.3,3623831.1,3650381.9,3328697.3,3571457.2,3501249.8,3067010.9,3501797.4,3305260.3,2728518.9};
+ST(0,0.085714286,0,0.0067127961,0.088875219,0,0,0.092857143,0){0,725937.81,0,0,141227.93,0,0,-557260.38,0,0,-806944.34,0,0,-406936.37,0};
+ST(0.036602132,0.28491153,0,0.043131118,0.28864457,0,0.03928574,0.29335694,0){279518.56,225252.57,127378.94,-831596.18,-672574.82,-381522.06,1362985.6,1110400.5,633829.06,-1860498.2,-1532552.2,-883092.25,2311728.5,1932837.8,1127859.7};
+ST(0.023478597,0.036718106,0,0.021348697,0.029751655,0,0.028359285,0.029784535,0){2561783.8,2382657.5,2981166.2,2187675.4,2153252.9,2693525.9,1494080.3,1716520.5,2145980.7,582277.59,1114508.8,1391347.7,-414804.14,404958.41,502245.34};
+ST(0.014305262,0.26641769,0,0.013885016,0.25805955,0,0.021957304,0.26060316,0){294901.31,357160.64,505833.44,-848621.76,-1003688.5,-1432636.8,1298521.9,1459712.7,2119105.6,-1589572.3,-1638678.7,-2450095.8,1686004.5,1506406.6,2369995.8};
+ST(0.050960377,0.23252058,0,0.056766116,0.23329497,0,0.052478219,0.23860916,0){1342135.9,1298096.4,1222305.6,-3383651.2,-3286228.7,-3178913.4,3804738.6,3735031.6,3866354.4,-2403721.7,-2434254.7,-3010118,-148681.88,-7070.0355,951644.63};
+ST(0.027746664,0.13122119,0,0.033010101,0.13109378,0,0.030046638,0.13690443,0){2296333.1,2584208,2369378.2,-1399007.9,-1567613,-1721516.8,-2843055.5,-3200932.4,-2840145.3,288094.78,308418.11,944948.24,2955532.6,3322264.5,3098367.4};
+ST(0.030046638,0.13690443,0,0.033010101,0.13109378,0,0.038217426,0.13599196,0){2369378.2,2584208,2738753.8,-1721516.8,-1567613,-1938161,-2840145.3,-3200932.4,-3305386.1,944948.24,308418.11,972060.89,3098367.4,3322264.5,3589652.3};
+ST(0.077140734,0.17217741,0,0.072573599,0.16764459,0,0.077393474,0.16425214,0){1584233.7,1881427.5,1650679.7,-2313491.7,-2572760.4,-2141613.9,-519338.58,-936075.04,-1013799.5,2552719.3,2916777.1,2443278.1,-655929.75,-135849.37,287063.28};
+ST(0.071059851,0.17209017,0,0.072573599,0.16764459,0,0.077140734,0.17217741,0){1900690.4,1881427.5,1584233.7,-2772233.4,-2572760.4,-2313491.7,-629520.98,-936075.04,-519338.58,3060958.1,2916777.1,2552719.3,-774142.34,-135849.37,-655929.75};
+ST(0.1,0.22142857,0,0.095652827,0.22622146,0,0.091864029,0.22106993,0){0,199039.37,394005.54,0,-484109.58,-927852.61,0,494313.66,863120.02,0,-223837.82,-241435.16,0,-173819.74,-536498.87};
+ST(0.0067127961,0.088875219,0,0.01318623,0.084416193,0,0.013428016,0.091778472,0){725937.81,1411871.7,1408980.1,141227.93,378554.62,204626.15,-557260.38,-931831.12,-1174648.8,-806944.34,-1560266,-1549888.7,-406936.37,-1046999.7,-600683.83};
+ST(0.034786476,0.1076516,0,0.038084092,0.1145524,0,0.030466665,0.11568191,0){2912738.3,2981407.2,2608170,-413135.58,-818508.93,-773675.45,-3267374.9,-3575257.7,-3152461.4,-2390915.6,-1775238,-1443702.3,1215377.6,2287308.3,2136967.4};
+ST(0.1,0.15714286,0,0.093710586,0.16080643,0,0.09308158,0.15403623,0){0,507346.27,579061.91,0,-621948.04,-628036.95,0,-366919.85,-525997.02,0,704920.6,672596.25,0,207593.47,469080.04};
+ST(0.0071428571,0,0,0.0045481906,0.0063920675,0,0,0,0){863498.79,552257.15,0,863505.11,549810.55,0,863516.31,544927.47,0,863538.53,537633.65,0,863596.62,527798.54,0};
+ST(0,0,0,0.0045481906,0.0063920675,0,0,0.0071428571,0){0,552257.15,0,0,549810.55,0,0,544927.47,0,0,537633.65,0,0,527798.54,0};
+ST(0,0.29285714,0,0.0045473776,0.2936365,0,0,0.3,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0};
+ST(0,0.3,0,0.0045473776,0.2936365,0,0.0071428571,0.3,0){0,18406.211,0,0,-55138.333,0,0,91630.552,0,0,-127724.83,0,0,162961.08,0};
+ST(0.092295863,0.26000779,0,0.095492809,0.25375881,0,0.1,0.25714286,0){193329.27,131307.15,0,-546576.12,-363726.6,0,805368.84,512510.07,0,-924990.4,-543451.99,0,884724.5,449348.78,0};
+ST(0.1,0.042857143,0,0.095360834,0.0462161,0,0.092141527,0.03991184,0){0,547145.45,927649.93,0,421466.87,767955.56,0,198977.54,476054.53,0,-69217.008,102192.68,0,-321602.09,-289378.9};
+ST(0.017861336,0.10270337,0,0.013465065,0.10662372,0,0.010955873,0.10281868,0){1773538.4,1351132.7,1124212.8,-87655.931,-165451.82,-57954.543,-1856823.6,-1496410,-1179275.3,-1677437.3,-1147793.4,-1060620.9,261812.45,489093.12,173274.75};
+ST(0.029690249,0.19362013,0,0.034128539,0.18892309,0,0.036160627,0.1953007,0){1647856.1,1872288.6,1834250.2,-3101495.4,-3356683.8,-3509998.2,1088093.1,788949.65,1372423.7,2141745.7,2731311.2,2256297.6,-2977851,-2954777.5,-3434247.7};
+ST(0.070175425,0.16144206,0,0.065117308,0.15657509,0,0.070477538,0.15360968,0){2074683.8,2354870.2,2153625.7,-2570674.4,-2678881.2,-2316413.6,-1460177,-1986291.9,-1978592.7,2919916.2,2952219.2,2466066.8,762077.82,1580034,1792310.4};
+ST(0.061476805,0.16269562,0,0.065117308,0.15657509,0,0.070175425,0.16144206,0){2391378.9,2354870.2,2074683.8,-3025373.1,-2678881.2,-2570674.4,-1589341.3,-1986291.9,-1460177,3446908.2,2952219.2,2919916.2,675366.83,1580034,762077.82};
+ST(0.016702178,0.061420197,0,0.014691551,0.054118398,0,0.021658338,0.054940441,0){1844408.3,1659245.8,2341024.9,1107331.1,1140472.1,1587273.2,-72241.295,265092.56,322446.89,-1222910.6,-693242.8,-1046241,-1885264.1,-1435183.5,-2078353.5};
+ST(0.029690249,0.19362013,0,0.023309936,0.19197185,0,0.027249449,0.18607819,0){1647856.1,1390526.6,1646413.8,-3101495.4,-2573914.4,-2861109.6,1088093.1,799964.88,464444.42,2141745.7,1893175.4,2518610.9,-2977851,-2411477.9,-2323177.4};
+ST(0.030217898,0.25971254,0,0.033025927,0.25326882,0,0.037705658,0.25939989,0){660621.26,809560.38,758443.36,-1866014.4,-2238649.8,-2140288.6,2744196,3142273.3,3141072.6,-3141188.1,-3308331.9,-3582615.2,2987009.7,2697705.3,3385872.9};
+ST(0.037705658,0.25939989,0,0.033025927,0.25326882,0,0.039157325,0.25334591,0){758443.36,809560.38,884627.38,-2140288.6,-2238649.8,-2446896,3141072.6,3142273.3,3436661.2,-3582615.2,-3308331.9,-3622356.9,3385872.9,2697705.3,2960330.2};
+ST(0.072908259,0.24139656,0,0.070607657,0.23670872,0,0.077318805,0.23627719,0){881474.92,1007105.3,830868.27,-2322734,-2594870.8,-2136157.9,2916335.3,3083897.2,2525048.7,-2445637.4,-2267120.1,-1830714.2,1082242,490193.02,350702.19};
+ST(0.013229009,0.21171696,0,0.0051799073,0.21317882,0,0.007303543,0.20469543,0){698716.07,276031.48,422375.13,-1540332.8,-615227.88,-880191.16,1156621.3,479976.29,531663.92,147278.69,25450.705,303952.91,-1334554.8,-511551.59,-861341.37};
+ST(0.047918899,0.14257657,0,0.045364072,0.14896511,0,0.041319833,0.14315875,0){2842478.3,2729630.7,2735557.7,-2400971.6,-2670475.8,-2343944,-3215455,-2787568.3,-3071175.4,1901551.7,2610132.2,1904337.3,3510918.5,2844182.1,3343927.4};
+ST(0.035714286,0,0,0.031710863,0.0075461758,0,0.028571429,0,0){3496308.9,3254919.5,3033980.1,3496337.7,3234618.2,3033983.4,3496399.5,3194153.7,3033988.7,3496538.6,3133832.1,3034024.4,3496562.8,3053845.3,3033982.5};
+ST(0.028571429,0.3,0,0.031264826,0.29263185,0,0.035714286,0.3,0){0,124484.17,0,0,-372709.78,0,0,618717.86,0,0,-861054.65,0,0,1098239.8,0};
+ST(0.077069107,0.15686929,0,0.083337094,0.16031526,0,0.077393474,0.16425214,0){1743907.9,1295652.6,1650679.7,-1994600,-1575018.8,-2141613.9,-1457243.4,-956036.82,-1013799.5,2204191.1,1781183.7,2443278.1,1140253.2,571788.58,287063.28};
+ST(0.032036001,0.10024616,0,0.030017634,0.093495078,0,0.03690243,0.09394169,0){2837469.6,2771844.6,3135041.5,-12660.65,320378.42,337961.95,-2850146.6,-2414486.4,-2760700,-2824890.6,-3014031.4,-3396384.7,37524.098,-948223.96,-1002139.6};
+ST(0.091953893,0.078440357,0,0.095795895,0.073622969,0,0.1,0.078571429,0){889726.23,473503.74,0,322434.75,205720.2,0,-450550.32,-178405.32,0,-936443.15,-461642.03,0,-825354.72,-483922.03,0};
+ST(0.084206466,0.24009781,0,0.078142774,0.24370973,0,0.077318805,0.23627719,0){569988.38,714639.7,830868.27,-1492933.9,-1902709.3,-2136157.9,1847439,2448578.4,2525048.7,-1498530.8,-2167997.3,-1830714.2,578923.58,1155455.3,350702.19};
+ST(0.021502186,0.15931359,0,0.022775714,0.15147437,0,0.027609688,0.15620978,0){1630158.4,1786181.8,2023546.1,-1947614.2,-1841345.2,-2286520.9,-1250943.8,-1729359.8,-1726415,2191316.6,1894858,2510934.9,824223.66,1670732.8,1400022.9};
+ST(0.0066871595,0.19241823,0,0.005051806,0.19767546,0,0,0.19285714,0){432113.5,313084.45,0,-803518.34,-612892.85,0,258472.73,273796.53,0,581490.34,350786.74,0,-758588.26,-609909.8,0};
+ST(0.013878694,0.17880836,0,0.014405512,0.17061143,0,0.020636298,0.17424253,0){971566.52,1063653,1433869.3,-1548960.4,-1519257.6,-2154082.5,-51095.574,-412907.51,-351921.61,1579530,1696192.6,2330929.4,-887966.26,-313907.63,-819073.82};
+ST(0.02133326,0.24577003,0,0.013821768,0.24617185,0,0.015758122,0.23699049,0){675269.21,454053.45,597291.98,-1813848.4,-1221678.8,-1541119.1,2383092.9,1611329.8,1837947.1,-2204305.3,-1502439.1,-1363109.4,1333319.6,928515.88,315646.37};
+ST(0.049721881,0.27094787,0,0.055001581,0.27169863,0,0.051703203,0.27754162,0){588018.61,565900.8,454636.43,-1710042.9,-1648356.5,-1338881.7,2675009.8,2587095.5,2149437.1,-3394309,-3300283.2,-2841702,3801713.7,3725567.5,3377384.9};
+ST(0.030490983,0.2108424,0,0.036840853,0.20596239,0,0.038843793,0.21103197,0){1428644.1,1679916.9,1637090.1,-3128471,-3538121.9,-3590120.4,2293671,2233718.4,2645890.8,399562.24,1067350,433646.44,-2769801.9,-3414669.4,-3163532.2};
+ST(0.028678488,0.042143634,0,0.030602087,0.036163623,0,0.03663522,0.040674234,0){2968313.4,3125169.1,3463485.9,2399521.8,2682310.4,2844620.6,1370917.4,1859340.6,1717431.6,79587.615,772883.67,283267.24,-1227272.3,-423255.99,-1201989.6};
+ST(0,0.25,0,0.0060491453,0.25298129,0,0,0.25714286,0){0,178654.23,0,0,-493529.07,0,0,691183.17,0,0,-724662.05,0,0,585970.08,0};
+ST(0.024044461,0.20382537,0,0.025476801,0.19755762,0,0.03163445,0.20120488,0){1283805.9,1423125.8,1608414.7,-2655634.7,-2782737.9,-3251875.6,1553893.8,1235431.1,1714266.6,995311.88,1602470.1,1500504,-2617892.2,-2766638.2,-3248047};
+ST(0.065478411,0.24860928,0,0.066600159,0.24211306,0,0.071915087,0.24816524,0){912058.17,1004296.2,803363.84,-2478342.9,-2655015,-2179152.4,3344041.2,3359675.2,2928525.2,-3264436.9,-2867211.3,-2836050.6,2261773.6,1352854.8,1927975};
+ST(0.071915087,0.24816524,0,0.066600159,0.24211306,0,0.072908259,0.24139656,0){803363.84,1004296.2,881474.92,-2179152.4,-2655015,-2322734,2928525.2,3359675.2,2916335.3,-2836050.6,-2867211.3,-2445637.4,1927975,1352854.8,1082242};
+ST(0.032036001,0.10024616,0,0.039702853,0.10111678,0,0.034786476,0.1076516,0){2837469.6,3175586.8,2912738.3,-12660.65,-64516.934,-413135.58,-2850146.6,-3238866.3,-3267374.9,-2824890.6,-3108635.2,-2390915.6,37524.098,193445.51,1215377.6};
+ST(0.047556344,0.24377674,0,0.049037582,0.25027532,0,0.043027686,0.24899973,0){1122639.4,998508.07,999522.33,-2989881.7,-2730849.8,-2720190.5,3850350.4,3739350.2,3683283.3,-3414324.1,-3756698.7,-3620573.8,1828478.4,2778087.3,2549278.8};
+ST(0.070865224,0.080352924,0,0.075872285,0.081656016,0,0.072044079,0.08604506,0){2808030.6,2427639,2688599.4,934415.1,758134.07,649473.83,-1562677.5,-1432759.9,-1882262.6,-3017110.1,-2638364.3,-2986497.2,-2458745.5,-2029677.1,-1825996.4};
+ST(0.021957304,0.26060316,0,0.027951851,0.26533243,0,0.023009638,0.26878949,0){505833.44,539100.43,417665.14,-1432636.8,-1547025.6,-1208783.5,2119105.6,2353298.6,1871958.7,-2450095.8,-2852826.8,-2337004.8,2369995.8,2980285,2554445.3};
+ST(0.081004963,0.27070547,0,0.086077973,0.27164165,0,0.082516133,0.27647665,0){333174.81,243157.03,248899.48,-968418.7,-708191.99,-731674.12,1513258.3,1111255.9,1170289.2,-1916833.2,-1417072.6,-1538273.3,2141327.9,1598582.9,1813237.5};
+ST(0.082332164,0.023444943,0,0.085916752,0.02828,0,0.080699945,0.029142305,0){2029600,1643257.2,2185639.9,1907886.4,1500211.7,1983669.2,1671751.1,1226559.7,1598386.1,1335359.8,846114.35,1065401.8,918760.81,391827.49,433818.71};
+ST(0.047385855,0.10193045,0,0.052532368,0.096036702,0,0.054240748,0.10280037,0){3329666.7,3389506.1,3302360.6,-117239.93,240670.51,-169115.68,-3442848.4,-3131818.5,-3462856.5,-3204510.9,-3594959.1,-3116478.2,350991.89,-718569.73,505791.56};
+ST(0.012549176,0.077039569,0,0.01318623,0.084416193,0,0.0064539684,0.081629255,0){1370920.5,1411871.7,711139.06,525978.15,378554.62,222377.16,-643140.23,-931831.12,-419239.47,-1415881.7,-1560266,-772749.89,-1316306.1,-1046999.7,-595288.06};
+ST(0.054010827,0.25507988,0,0.060567191,0.25172758,0,0.060672356,0.25950081,0){897184.36,917440.34,771273.27,-2496661.6,-2522838.3,-2177172.3,3553831.7,3497206.6,3197356.1,-3839088.9,-3596815.5,-3651078,3290330.5,2796536,3457676.3};
+ST(0.060672356,0.25950081,0,0.060567191,0.25172758,0,0.066803853,0.25459223,0){771273.27,917440.34,789541.66,-2177172.3,-2522838.3,-2193455.3,3197356.1,3497206.6,3110738.9,-3651078,-3596815.5,-3337877,3457676.3,2796536,2824240.3};
+ST(0.092450683,0.030760689,0,0.085916752,0.02828,0,0.089183466,0.023798504,0){900007.85,1643257.2,1283383.3,807431.66,1500211.7,1204105.7,631804.95,1226559.7,1050439.6,391202.83,846114.35,831874.08,110124.82,391827.49,561630.79};
+ST(0.089232651,0.27618677,0,0.086077973,0.27164165,0,0.092520768,0.26920591,0){160151.6,243157.03,145042.72,-470555.02,-708191.99,-420173.4,751874.95,1111255.9,651988.34,-986723.61,-1417072.6,-816598.86,1160401.4,1598582.9,896908.09};
+ST(0.064373335,0.2338171,0,0.065627137,0.22734606,0,0.07180958,0.22984275,0){1185902.3,1270705.1,1079159.6,-3010536.1,-3111357.1,-2680718.2,3446119.8,3236198.8,2899261.6,-2291596.2,-1576358.2,-1622013.4,79206.699,-953054.66,-492395.98};
+ST(0.059957308,0.22757204,0,0.065627137,0.22734606,0,0.064373335,0.2338171,0){1366903.5,1270705.1,1185902.3,-3351367.9,-3111357.1,-3010536.1,3498598.8,3236198.8,3446119.8,-1727811.3,-1576358.2,-2291596.2,-990620.01,-953054.66,79206.699};
+ST(0.027609688,0.15620978,0,0.030440206,0.150204,0,0.034314476,0.15645926,0){2023546.1,2239650.6,2334400.9,-2286520.9,-2249230.7,-2649968.2,-1726415,-2230054.7,-1976247.7,2510934.9,2258843.4,2917237.1,1400022.9,2220211.9,1581967.4};
+ST(0.03690243,0.09394169,0,0.030017634,0.093495078,0,0.033761495,0.088496681,0){3135041.5,2771844.6,3029395.9,337961.95,320378.42,608605.12,-2760700,-2414486.4,-2298547.5,-3396384.7,-3014031.4,-3368980,-1002139.6,-948223.96,-1747439.7};
+ST(0.023478597,0.036718106,0,0.022876349,0.043626948,0,0.017433092,0.042090914,0){2561783.8,2488553.5,1971771.3,2187675.4,1978130.3,1594855,1494080.3,1061959.9,913057.13,582277.59,-72059.632,56690.05,-414804.14,-1191549.5,-810753.02};
+ST(0,0.064285714,0,0.0062494098,0.068021592,0,0,0.071428571,0){0,709501.16,0,0,364477.97,0,0,-157824.6,0,0,-603457.47,0,0,-756039.79,0};
+ST(0.020973714,0.16688371,0,0.025851591,0.17077962,0,0.020636298,0.17424253,0){1525118.3,1763476.8,1433869.3,-2061659.5,-2524912.6,-2154082.5,-799875.51,-673288.62,-351921.61,2343184.8,2815714.9,2330929.4,-24581.749,-542697.73,-819073.82};
+ST(0.075488644,0.14176328,0,0.081009521,0.1385969,0,0.08264437,0.14444108,0){1990888.2,1630909.4,1463951.5,-1647841.2,-1242340.3,-1293607.4,-2274843.7,-1926924,-1614532.1,1255935.2,783271.16,1105781,2491166.6,2113542.9,1743195.6};
+ST(0.01180171,0.25230222,0,0.013885016,0.25805955,0,0.0098751756,0.25600949,0){347512.04,357160.64,270470.11,-957611.77,-1003688.5,-755004.71,1333704.3,1459712.7,1082095.4,-1383899.6,-1638678.7,-1183544.7,1095718.6,1506406.6,1038261.4};
+ST(0.0064539684,0.081629255,0,0.01318623,0.084416193,0,0.0067127961,0.088875219,0){711139.06,1411871.7,725937.81,222377.16,378554.62,141227.93,-419239.47,-931831.12,-557260.38,-772749.89,-1560266,-806944.34,-595288.06,-1046999.7,-406936.37};
+ST(0.034786476,0.1076516,0,0.039702853,0.10111678,0,0.042557423,0.10832344,0){2912738.3,3175586.8,3183930.6,-413135.58,-64516.934,-492142.06,-3267374.9,-3238866.3,-3600076,-2390915.6,-3108635.2,-2551523.2,1215377.6,193445.51,1442840.6};
+ST(0.064373335,0.2338171,0,0.056766116,0.23329497,0,0.059957308,0.22757204,0){1185902.3,1298096.4,1366903.5,-3010536.1,-3286228.7,-3351367.9,3446119.8,3735031.6,3498598.8,-2291596.2,-2434254.7,-1727811.3,79206.699,-7070.0355,-990620.01};
+ST(0.071000103,0.28243589,0,0.069147655,0.28722413,0,0.063469548,0.28521738,0){281581.81,213884.16,273598.49,-835250.62,-637821.62,-814255.31,1360764.9,1050341,1335465.2,-1840418.5,-1444059.1,-1824812,2257916.8,1811586.6,2270429.1};
+ST(0.073754091,0.28851618,0,0.069147655,0.28722413,0,0.071000103,0.28243589,0){171229.59,213884.16,281581.81,-511212.67,-637821.62,-835250.62,843808.82,1050341,1360764.9,-1164215.8,-1444059.1,-1840418.5,1467609.3,1811586.6,2257916.8};
+ST(0.064075209,0.013493001,0,0.069232026,0.01217315,0,0.070691378,0.017050195,0){3498581.2,3187096.8,3076870.7,3428890.3,3135369.8,2979073.3,3290906.4,3032749.5,2786592,3087427.7,2880922.9,2505581.5,2822154,2682056.5,2144710.8};
+ST(0.070691378,0.017050195,0,0.069232026,0.01217315,0,0.073684623,0.0112317,0){3076870.7,3187096.8,2850123.3,2979073.3,3135369.8,2810738.2,2786592,3032749.5,2732509.2,2505581.5,2880922.9,2616540.6,2144710.8,2682056.5,2464223.2};
+ST(0.062992669,0.22303634,0,0.065627137,0.22734606,0,0.059957308,0.22757204,0){1396775.9,1270705.1,1366903.5,-3331109.7,-3111357.1,-3351367.9,3216330,3236198.8,3498598.8,-1122974.8,-1576358.2,-1727811.3,-1661551.4,-953054.66,-990620.01};
+ST(0.007303543,0.20469543,0,0.005051806,0.19767546,0,0.011268327,0.1984065,0){422375.13,313084.45,682302.12,-880191.16,-612892.85,-1344805.9,531663.92,273796.53,623458.07,303952.91,350786.74,739532.85,-861341.37,-609909.8,-1341727.7};
+ST(0.054876921,0.07294965,0,0.047469022,0.070467195,0,0.052494391,0.065958781,0){3558755.8,3608010.8,3640248,1580988.4,1730907.5,1971511.2,-1275447.3,-1046792,-601016.65,-3423192.1,-3280034.9,-2898090,-3669097.1,-3807136.9,-3866942};
+ST(0.041803352,0.076750149,0,0.047469022,0.070467195,0,0.049165273,0.076760106,0){3453761.9,3608010.8,3570137.5,1340279.2,1730907.5,1384898,-1593440.1,-1046792,-1648055.9,-3552303.7,-3280034.9,-3672308.6,-3337911.6,-3807136.9,-3449021.3};
+ST(0,0.23571429,0,0.0069516057,0.23320895,0,0.0071147476,0.24137211,0){0,288078.49,259907.57,0,-728952.19,-684802.64,0,827497.2,859611.54,0,-537397.4,-720499.62,0,-5267.3055,317972.39};
+ST(0.038597539,0.20095921,0,0.036840853,0.20596239,0,0.03163445,0.20120488,0){1801301.7,1679916.9,1608414.7,-3633864.6,-3538121.9,-3251875.6,1895634,2233718.4,1714266.6,1705394,1067350,1500504,-3630918.1,-3414669.4,-3248047};
+ST(0.033874053,0.071548869,0,0.041803352,0.076750149,0,0.032911969,0.081185013,0){3157862.8,3453761.9,3037931.3,1466537.3,1340279.2,971274.35,-1010259.7,-1593440.1,-1756226.8,-2946084.6,-3552303.7,-3289165.4,-3304540.6,-3337911.6,-2584916.3};
+ST(0.1,0.05,0,0.095360834,0.0462161,0,0.1,0.042857143,0){0,547145.45,0,0,421466.87,0,0,198977.54,0,0,-69217.008,0,0,-321602.09,0};
+ST(0.069025318,0.11622387,0,0.070840483,0.12204614,0,0.064276416,0.12183086,0){2631986.5,2470738.2,2809128.6,-808686.45,-1044803.2,-1175750.5,-3192250.9,-3073782.1,-3492840.6,-1402768.4,-729197.53,-855220.15,2220554.1,2652961,2995580.4};
+ST(0.1,0.25714286,0,0.095492809,0.25375881,0,0.1,0.25,0){0,131307.15,0,0,-363726.6,0,0,512510.07,0,0,-543451.99,0,0,449348.78,0};
+ST(0,0.11428571,0,0.0062042788,0.11791514,0,0,0.12142857,0){0,612847.32,0,0,-208741.13,0,0,-750565.55,0,0,-286207.66,0,0,561848.67,0};
+ST(0.092141527,0.03991184,0,0.095360834,0.0462161,0,0.08974924,0.047235181,0){927649.93,547145.45,1190814.4,767955.56,421466.87,905328.07,476054.53,198977.54,402804.56,102192.68,-69217.008,-196265.4,-289378.9,-321602.09,-748421.11};
+ST(0.090077759,0.25268961,0,0.095492809,0.25375881,0,0.092295863,0.26000779,0){291813.61,131307.15,193329.27,-805257.31,-363726.6,-546576.12,1125037.4,512510.07,805368.84,-1174248.1,-543451.99,-924990.4,940920.06,449348.78,884724.5};
+ST(0.054010827,0.25507988,0,0.049037582,0.25027532,0,0.054957014,0.24657048,0){897184.36,998508.07,1058545,-2496661.6,-2730849.8,-2852831,3553831.7,3739350.2,3777171.8,-3839088.9,-3756698.7,-3549694.2,3290330.5,2778087.3,2239441.1};
+ST(0,0.19285714,0,0.005051806,0.19767546,0,0,0.2,0){0,313084.45,0,0,-612892.85,0,0,273796.53,0,0,350786.74,0,0,-609909.8,0};
+ST(0.024938414,0.098415267,0,0.030017634,0.093495078,0,0.032036001,0.10024616,0){2383058.5,2771844.6,2837469.6,68195.72,320378.42,-12660.65,-2312962.3,-2414486.4,-2850146.6,-2447461.4,-3014031.4,-2824890.6,-204726.33,-948223.96,37524.098};
+ST(0.06966854,0.20076802,0,0.064671223,0.19505087,0,0.071449289,0.19423207,0){1570520.4,1815232.4,1594804.6,-3162888.4,-3465163,-3019964.8,1636334.6,1334352.3,1103926.4,1503948.1,2252470.6,2033518.7,-3161601.9,-3382100.5,-2921575.1};
+ST(0.060432552,0.20227914,0,0.064671223,0.19505087,0,0.06966854,0.20076802,0){1798951.1,1815232.4,1570520.4,-3671781.8,-3465163,-3162888.4,2023610.8,1334352.3,1636334.6,1565241.8,2252470.6,1503948.1,-3653837,-3382100.5,-3161601.9};
+ST(0.014210915,0.13228117,0,0.012365279,0.12660144,0,0.01788586,0.12850833,0){1289449.4,1158576.2,1616906.9,-813665.75,-596487.84,-895214.81,-1589638.3,-1447959.2,-2016472.2,227067.92,-105993.81,-4802.2192,1673024.3,1396357.8,2014144.7};
+ST(0.0072553778,0.13224921,0,0.012365279,0.12660144,0,0.014210915,0.13228117,0){674958.82,1158576.2,1289449.4,-425463.67,-596487.84,-813665.75,-832230.25,-1447959.2,-1589638.3,117822.57,-105993.81,227067.92,875622.71,1396357.8,1673024.3};
+ST(0.030575169,0.1246812,0,0.023379755,0.12686903,0,0.025139549,0.12057635,0){2526238.7,2047772.9,2224740.3,-1202245.8,-1065433.1,-875333.98,-3156412.2,-2558991,-2755721.9,-451924.48,-162203.53,-796179.51,2919641.1,2481221.5,2272644.8};
+ST(0.036160627,0.1953007,0,0.034128539,0.18892309,0,0.039366597,0.19088868,0){1834250.2,1872288.6,1982365.2,-3509998.2,-3356683.8,-3628592.6,1372423.7,788949.65,1030950.1,2256297.6,2731311.2,2772526.5,-3434247.7,-2954777.5,-3333638.5};
+ST(0.041319833,0.14315875,0,0.045364072,0.14896511,0,0.037897724,0.149701,0){2735557.7,2729630.7,2552043.8,-2343944,-2670475.8,-2536068.8,-3071175.4,-2787568.3,-2567975.2,1904337.3,2610132.2,2520076,3343927.4,2844182.1,2583694.6};
+ST(0.0058133292,0.032528446,0,0.0063343033,0.038958017,0,0,0.035714286,0){694559.72,751213.74,0,614750.96,627892.11,0,464300.7,401490.67,0,260495.38,109174.99,0,26512.55,-201236.23,0};
+ST(0.045044357,0.28188841,0,0.045592054,0.27439642,0,0.051703203,0.27754162,0){362990.51,513714.39,454636.43,-1075960.6,-1504437.2,-1338881.7,1750378.7,2387679.2,2149437.1,-2362097.1,-3100344.3,-2841702,2889034,3591305.7,3377384.9};
+ST(0.068476894,0.0069177029,0,0.06203594,0.0060944193,0,0.064285714,0,0){3242851.4,3604620.2,3496327.6,3225849.8,3589956.2,3496358.5,3191931.3,3560685.5,3496415,3141298.2,3516960.1,3496523.2,3073847.6,3458793.9,3496472.9};
+ST(0.064285714,0.3,0,0.061805884,0.29356168,0,0.068366879,0.29272708,0){0,121923.05,123803.43,0,-365207.83,-370697.46,0,606815.62,615462.12,0,-845641.09,-856697.17,0,1080583.1,1092834.3};
+ST(0.07180958,0.22984275,0,0.065627137,0.22734606,0,0.069002793,0.22246209,0){1079159.6,1270705.1,1267491.2,-2680718.2,-3111357.1,-3011719.2,2899261.6,3236198.8,2877058.6,-1622013.4,-1576358.2,-947533.34,-492395.98,-953054.66,-1573376.1};
+ST(0.066925078,0.074981916,0,0.060416267,0.076932239,0,0.061098586,0.072147464,0){3090390.8,3380545.3,3389933,1280900.5,1302521.2,1545196.6,-1278621.5,-1576156.6,-1140417.3,-3089611.2,-3485992.8,-3205469.9,-3091904.4,-3253298.6,-3526423.9};
+ST(0.064352171,0.083117586,0,0.060416267,0.076932239,0,0.066925078,0.074981916,0){3167194.8,3380545.3,3090390.8,915483.69,1302521.2,1280900.5,-1987167.2,-1576156.6,-1278621.5,-3477240.4,-3485992.8,-3089611.2,-2495770,-3253298.6,-3091904.4};
+ST(0.0060491453,0.25298129,0,0.01180171,0.25230222,0,0.0098751756,0.25600949,0){178654.23,347512.04,270470.11,-493529.07,-957611.77,-755004.71,691183.17,1333704.3,1082095.4,-724662.05,-1383899.6,-1183544.7,585970.08,1095718.6,1038261.4};
+ST(0.0087429334,0.24792416,0,0.01180171,0.25230222,0,0.0060491453,0.25298129,0){283453.34,347512.04,178654.23,-768118.62,-957611.77,-493529.07,1029935.2,1333704.3,691183.17,-992967.39,-1383899.6,-724662.05,667809.3,1095718.6,585970.08};
+ST(0.055202425,0.1814475,0,0.061291474,0.18447479,0,0.055890502,0.18802963,0){2227021.2,2069396,2110328.4,-3667462.5,-3531333.7,-3747121.1,145084.74,425331.11,795966.68,3573754.5,3230965.1,3129878.5,-2457046.3,-2708277.6,-3224012.4};
+ST(0.025350652,0.23917347,0,0.033139613,0.24047735,0,0.029124573,0.24658198,0){868665.73,1026889.2,849052.23,-2265304,-2694450.7,-2288340.2,2773502.3,3348643.4,3030093.5,-2193941.8,-2743423.6,-2848204.4,753574.67,1106136.5,1797881.3};
+ST(0,0.12142857,0,0.0061411468,0.1246533,0,0,0.12857143,0){0,591118.91,0,0,-280990.71,0,0,-738586.84,0,0,-106527.54,0,0,682629.18,0};
+ST(0.03163445,0.20120488,0,0.036160627,0.1953007,0,0.038597539,0.20095921,0){1608414.7,1834250.2,1801301.7,-3251875.6,-3509998.2,-3633864.6,1714266.6,1372423.7,1895634,1500504,2256297.6,1705394,-3248047,-3434247.7,-3630918.1};
+ST(0.029690249,0.19362013,0,0.036160627,0.1953007,0,0.03163445,0.20120488,0){1647856.1,1834250.2,1608414.7,-3101495.4,-3509998.2,-3251875.6,1088093.1,1372423.7,1714266.6,2141745.7,2256297.6,1500504,-2977851,-3434247.7,-3248047};
+ST(0,0.17142857,0,0.0046637588,0.16745308,0,0.0069613667,0.17349451,0){0,362371.83,517779.21,0,-494096.85,-769992.03,0,-182769.85,-142713.64,0,560561.48,839532.94,0,-21256.565,-266340.1};
+ST(0.034314476,0.15645926,0,0.030440206,0.150204,0,0.037897724,0.149701,0){2334400.9,2239650.6,2552043.8,-2649968.2,-2249230.7,-2536068.8,-1976247.7,-2230054.7,-2567975.2,2917237.1,2258843.4,2520076,1581967.4,2220211.9,2583694.6};
+ST(0.077393474,0.16425214,0,0.072573599,0.16764459,0,0.070175425,0.16144206,0){1650679.7,1881427.5,2074683.8,-2141613.9,-2572760.4,-2570674.4,-1013799.5,-936075.04,-1460177,2443278.1,2916777.1,2919916.2,287063.28,-135849.37,762077.82};
+ST(0.050398693,0.1921099,0,0.055890502,0.18802963,0,0.057391395,0.19462543,0){2077292.2,2110328.4,1979510.6,-3850553.1,-3747121.1,-3763012.6,1209682,795966.68,1410875.8,2818064.5,3129878.5,2491970.2,-3615771.1,-3224012.4,-3656419.8};
+ST(0.057391395,0.19462543,0,0.055890502,0.18802963,0,0.06137482,0.19024807,0){1979510.6,2110328.4,1976038.9,-3763012.6,-3747121.1,-3592882,1410875.8,795966.68,963745.22,2491970.2,3129878.5,2804392.5,-3656419.8,-3224012.4,-3258719.1};
+ST(0,0.13571429,0,0.0054758376,0.13911323,0,0,0.14285714,0){0,495708.7,0,0,-382921.42,0,0,-582869.54,0,0,250325.59,0,0,639819.51,0};
+ST(0.063469548,0.28521738,0,0.069147655,0.28722413,0,0.068366879,0.29272708,0){273598.49,213884.16,123803.43,-814255.31,-637821.62,-370697.46,1335465.2,1050341,615462.12,-1824812,-1444059.1,-856697.17,2270429.1,1811586.6,1092834.3};
+ST(0.068366879,0.29272708,0,0.069147655,0.28722413,0,0.073754091,0.28851618,0){123803.43,213884.16,171229.59,-370697.46,-637821.62,-511212.67,615462.12,1050341,843808.82,-856697.17,-1444059.1,-1164215.8,1092834.3,1811586.6,1467609.3};
+ST(0.068476894,0.0069177029,0,0.069232026,0.01217315,0,0.064075209,0.013493001,0){3242851.4,3187096.8,3498581.2,3225849.8,3135369.8,3428890.3,3191931.3,3032749.5,3290906.4,3141298.2,2880922.9,3087427.7,3073847.6,2682056.5,2822154};
+ST(0.073684623,0.0112317,0,0.069232026,0.01217315,0,0.068476894,0.0069177029,0){2850123.3,3187096.8,3242851.4,2810738.2,3135369.8,3225849.8,2732509.2,3032749.5,3191931.3,2616540.6,2880922.9,3141298.2,2464223.2,2682056.5,3073847.6};
+ST(0,0.26428571,0,0.0071908097,0.26035264,0,0.0060732531,0.2674669,0){0,179155.76,124750.88,0,-507033.49,-359918.85,0,748779.14,553735.12,0,-863311.12,-683931.42,0,830950.48,735399.5};
+ST(0.093873231,0.17693503,0,0.095837038,0.182565,0,0.089858368,0.18421461,0){445896.9,291932.87,692603.24,-694096.79,-487211.17,-1178349.1,-59504.029,33971.767,133849.22,727141.13,464480.32,1084450.2,-345394.37,-344762.9,-894447.98};
+ST(0.023309936,0.19197185,0,0.021212478,0.18688263,0,0.027249449,0.18607819,0){1390526.6,1339179.6,1646413.8,-2573914.4,-2348119.2,-2861109.6,799964.88,429909.33,464444.42,1893175.4,2024227.8,2518610.9,-2411477.9,-1955356.8,-2323177.4};
+ST(0,0.035714286,0,0.0063343033,0.038958017,0,0,0.042857143,0){0,751213.74,0,0,627892.11,0,0,401490.67,0,0,109174.99,0,0,-201236.23,0};
+ST(0,0.22857143,0,0.0069516057,0.23320895,0,0,0.23571429,0){0,288078.49,0,0,-728952.19,0,0,827497.2,0,0,-537397.4,0,0,-5267.3055,0};
+ST(0.031710863,0.0075461758,0,0.025051818,0.0051959301,0,0.028571429,0,0){3254919.5,2747435.6,3033980.1,3234618.2,2739316.7,3033983.4,3194153.7,2723095.2,3033988.7,3133832.1,2698832.3,3034024.4,3053845.3,2666496.7,3033982.5};
+ST(0.028571429,0.3,0,0.024877102,0.29495936,0,0.031264826,0.29263185,0){0,72135.52,124484.17,0,-216205.93,-372709.78,0,359676.71,618717.86,0,-502149.61,-861054.65,0,642973.44,1098239.8};
+ST(0.025468185,0.010276157,0,0.025051818,0.0051959301,0,0.031710863,0.0075461758,0){2780034,2747435.6,3254919.5,2747892,2739316.7,3234618.2,2683968.5,2723095.2,3194153.7,2589008.8,2698832.3,3133832.1,2463902.9,2666496.7,3053845.3};
+ST(0.031264826,0.29263185,0,0.024877102,0.29495936,0,0.025130011,0.29009115,0){124484.17,72135.52,142877.47,-372709.78,-216205.93,-427099.39,618717.86,359676.71,706741.94,-861054.65,-502149.61,-978805.55,1098239.8,642973.44,1240164.3};
+ST(0.024938414,0.098415267,0,0.024499807,0.092422798,0,0.030017634,0.093495078,0){2383058.5,2390452.1,2771844.6,68195.72,320672.29,320378.42,-2312962.3,-2026771.7,-2414486.4,-2447461.4,-2619357.9,-3014031.4,-204726.33,-944222.72,-948223.96};
+ST(0.083292987,0.24598228,0,0.085145188,0.25032735,0,0.07921504,0.25033934,0){542685.82,448997.25,606155.6,-1458992.1,-1228228.7,-1658203,1920780.7,1682589.8,2271843.6,-1784182,-1691886.1,-2284831,1091638.2,1253443,1693484.6};
+ST(0.077364239,0.048764008,0,0.083998423,0.049627851,0,0.080938662,0.054906318,0){2450679,1806853.8,2097661.4,1825420.5,1329741.5,1423084,734405.59,501474.01,290856.94,-544039.45,-459273.5,-934922.56,-1683943.8,-1299103.8,-1860365.1};
+ST(0,0.25714286,0,0.0071908097,0.26035264,0,0,0.26428571,0){0,179155.76,0,0,-507033.49,0,0,748779.14,0,0,-863311.12,0,0,830950.48,0};
+ST(0.059437672,0.2400817,0,0.061408089,0.24582042,0,0.054957014,0.24657048,0){1145348.7,1017142.7,1058545,-2999714,-2732695.2,-2852831,3711340.5,3591948.1,3777171.8,-3009146,-3325647.6,-3549694.2,1160252.2,2017029.8,2239441.1};
+ST(0.052494391,0.065958781,0,0.059054943,0.066788508,0,0.054876921,0.07294965,0){3640248,3499189.3,3558755.8,1971511.2,1856149.2,1580988.4,-601016.65,-658492.2,-1275447.3,-2898090,-2864039.1,-3423192.1,-3866942,-3725081.1,-3669097.1};
+ST(0.054876921,0.07294965,0,0.059054943,0.066788508,0,0.061098586,0.072147464,0){3558755.8,3499189.3,3389933,1580988.4,1856149.2,1545196.6,-1275447.3,-658492.2,-1140417.3,-3423192.1,-2864039.1,-3205469.9,-3669097.1,-3725081.1,-3526423.9};
+ST(0.1,0.14285714,0,0.093938974,0.13899,0,0.1,0.13571429,0){0,548364.78,0,0,-422206.84,0,0,-645591.08,0,0,273728.87,0,0,708600.91,0};
+ST(0.030623168,0.1713445,0,0.025851591,0.17077962,0,0.029380008,0.16405835,0){1985985.4,1763476.8,2021292.5,-2866418.8,-2524912.6,-2614335.2,-715248.18,-673288.62,-1254306.4,3183566.3,2815714.9,2982541.3,-696442.05,-542697.73,378860.61};
+ST(0.0064812773,0.046734878,0,0.013132659,0.04767246,0,0.0094132111,0.052421332,0){761350.4,1507774.2,1088603.4,582610.88,1139737.5,768702.62,267082.8,493500.09,222919.17,-111174.21,-273193.01,-388347.22,-463416.67,-973395.4,-885762.83};
+ST(0.011573719,0.041901165,0,0.013132659,0.04767246,0,0.0064812773,0.046734878,0){1347025.1,1507774.2,761350.4,1091815.8,1139737.5,582610.88,629744.45,493500.09,267082.8,48353.226,-273193.01,-111174.21,-542301.86,-973395.4,-463416.67};
+ST(0.092168655,0.23668616,0,0.095706332,0.23121352,0,0.1,0.23571429,0){307607.26,183910.78,0,-792496.69,-460364.34,0,941630.33,508106.39,0,-691810.02,-303408.65,0,148523.72,-52245.513,0};
+ST(0.048791783,0.28884593,0,0.043131118,0.28864457,0,0.045044357,0.28188841,0){226341.07,225252.57,362990.51,-675936.71,-672574.82,-1075960.6,1116322.7,1110400.5,1750378.7,-1541505,-1532552.2,-2362097.1,1945474.1,1932837.8,2889034};
+ST(0.045044357,0.28188841,0,0.043131118,0.28864457,0,0.036602132,0.28491153,0){362990.51,225252.57,279518.56,-1075960.6,-672574.82,-831596.18,1750378.7,1110400.5,1362985.6,-2362097.1,-1532552.2,-1860498.2,2889034,1932837.8,2311728.5};
+ST(0.071449289,0.19423207,0,0.064671223,0.19505087,0,0.06771074,0.1881525,0){1594804.6,1815232.4,1821405.7,-3019964.8,-3465163,-3238423,1103926.4,1334352.3,698008.36,2033518.7,2252470.6,2695511.5,-2921575.1,-3382100.5,-2795478.4};
+ST(0.06771074,0.1881525,0,0.064671223,0.19505087,0,0.06137482,0.19024807,0){1821405.7,1815232.4,1976038.9,-3238423,-3465163,-3592882,698008.36,1334352.3,963745.22,2695511.5,2252470.6,2804392.5,-2795478.4,-3382100.5,-3258719.1};
+ST(0.051703203,0.27754162,0,0.051519181,0.28417908,0,0.045044357,0.28188841,0){454636.43,320732.11,362990.51,-1338881.7,-953415.16,-1075960.6,2149437.1,1560004.1,1750378.7,-2841702,-2123899.5,-2362097.1,3377384.9,2629434.9,2889034};
+ST(0.045044357,0.28188841,0,0.051519181,0.28417908,0,0.048791783,0.28884593,0){362990.51,320732.11,226341.07,-1075960.6,-953415.16,-675936.71,1750378.7,1560004.1,1116322.7,-2362097.1,-2123899.5,-1541505,2889034,2629434.9,1945474.1};
+ST(0.066925078,0.074981916,0,0.064846874,0.068845861,0,0.072323403,0.067507008,0){3090390.8,3243292.3,2781512.1,1280900.5,1629296.1,1448400.9,-1278621.5,-795531.06,-578922.09,-3089611.2,-2824516.6,-2328912.3,-3091904.4,-3448034.5,-2963263.7};
+ST(0.017861336,0.10270337,0,0.013714026,0.097839388,0,0.019165757,0.095107709,0){1773538.4,1412613.2,1930971.9,-87655.931,55008.627,168744.63,-1856823.6,-1355500.2,-1747493.7,-1677437.3,-1463354,-2069009.1,261812.45,-165174.7,-502664.26};
+ST(0.072126291,0.10515927,0,0.076969725,0.10634022,0,0.074105201,0.11070107,0){2539730.3,2181001.1,2359475.3,-241283.81,-255488.75,-471755.94,-2758172.2,-2406546.5,-2736894.8,-2254933.2,-1869163.7,-1717960.7,717337.89,756176.24,1362139.4};
+ST(0.077318805,0.23627719,0,0.078142774,0.24370973,0,0.072908259,0.24139656,0){830868.27,714639.7,881474.92,-2136157.9,-1902709.3,-2322734,2525048.7,2448578.4,2916335.3,-1830714.2,-2167997.3,-2445637.4,350702.19,1155455.3,1082242};
+ST(0,0.17857143,0,0.0062925762,0.18063125,0,0,0.18571429,0){0,445914.92,0,0,-727143.63,0,0,12632.594,0,0,719304.1,0,0,-466469.22,0};
+ST(0.045894811,0.13135905,0,0.044512931,0.13802764,0,0.038217426,0.13599196,0){2973475.7,2867370.6,2738753.8,-1819976.4,-2150242,-1938161,-3679581.9,-3405187.4,-3305386.1,392676.16,1298632.3,972060.89,3832095.1,3729885,3589652.3};
+ST(0.028198926,0.28535727,0,0.0220603,0.28602893,0,0.023483408,0.28013687,0){230200.16,181204.07,270985.88,-685197.76,-539738.59,-801278.39,1124120.6,886739.53,1297043.7,-1536674.3,-1214791.9,-1736920.8,1912913.1,1516611.7,2101746.5};
+ST(0.053497526,0.1329974,0,0.049213686,0.13705186,0,0.045894811,0.13135905,0){2959143.9,2922689.8,2973475.7,-1911000.9,-2132523.3,-1819976.4,-3636096,-3499251.9,-3679581.9,623103.97,1186505.2,392676.16,3857035.6,3819996.4,3832095.1};
+ST(0.060819012,0.031697917,0,0.054261983,0.029107824,0,0.057707972,0.025075094,0){3608360,3801269,3734947.8,3214477.8,3450822.2,3478918.2,2469695.4,2782228.4,2984396.6,1455299.1,1857139.4,2285289.9,281702.17,760852.59,1429238.8};
+ST(0.038217426,0.13599196,0,0.033010101,0.13109378,0,0.038464606,0.12667013,0){2738753.8,2584208,2859316.3,-1938161,-1567613,-1476046.2,-3305386.1,-3200932.4,-3573486.5,972060.89,308418.11,-252868.56,3589652.3,3322264.5,3451249.3};
+ST(0.07180958,0.22984275,0,0.070607657,0.23670872,0,0.064373335,0.2338171,0){1079159.6,1007105.3,1185902.3,-2680718.2,-2594870.8,-3010536.1,2899261.6,3083897.2,3446119.8,-1622013.4,-2267120.1,-2291596.2,-492395.98,490193.02,79206.699};
+ST(0.09308158,0.15403623,0,0.088623123,0.15812222,0,0.084604507,0.15255901,0){579061.91,918302.92,1258841.2,-628036.95,-1074338,-1326319,-525997.02,-735787.48,-1187789.9,672596.25,1199414.9,1390056.3,469080.04,531983.03,1113216.6};
+ST(0.031105381,0.06529626,0,0.027058874,0.069011929,0,0.025221599,0.062165695,0){3030579.1,2727323.5,2618029.3,1667989.8,1363815.9,1547191.2,-444570.51,-681543.48,-156575.4,-2357289.6,-2386220.5,-1796512.5,-3210321.2,-2898415.6,-2702051.5};
+ST(0,0.15,0,0.0056981356,0.15371602,0,0,0.15714286,0){0,478995.44,0,0,-516269.88,0,0,-438816.38,0,0,550400.04,0,0,395913.98,0};
+ST(0.040431855,0.24188745,0,0.033139613,0.24047735,0,0.037546984,0.23452457,0){1110505,1026889.2,1205921.7,-2932804,-2694450.7,-3072707.6,3702149.5,3348643.4,3550700.1,-3142324.5,-2743423.6,-2423829.8,1453973.2,1106136.5,201013.93};
+ST(0.077364239,0.048764008,0,0.073604017,0.054819307,0,0.06961584,0.048915995,0){2450679,2744584.6,3063466,1825420.5,1864679.8,2277085.6,734405.59,386939.94,906160.93,-544039.45,-1214908.7,-697426.19,-1683943.8,-2427603.9,-2122325.6};
+ST(0.037546984,0.23452457,0,0.033139613,0.24047735,0,0.030075176,0.23324008,0){1205921.7,1026889.2,1077047.3,-3072707.6,-2694450.7,-2725827,3550700.1,3348643.4,3095770.8,-2423829.8,-2743423.6,-2013325.9,201013.93,1106136.5,-13872.597};
+ST(0.03690243,0.09394169,0,0.039702853,0.10111678,0,0.032036001,0.10024616,0){3135041.5,3175586.8,2837469.6,337961.95,-64516.934,-12660.65,-2760700,-3238866.3,-2850146.6,-3396384.7,-3108635.2,-2824890.6,-1002139.6,193445.51,37524.098};
+ST(0.054692531,0.17439284,0,0.060859952,0.17787963,0,0.055202425,0.1814475,0){2346407.8,2182203,2227021.2,-3532168.6,-3438395.7,-3667462.5,-561454.61,-202892.1,145084.74,3816051.1,3555311.4,3573754.5,-1367177.6,-1844119.8,-2457046.3};
+ST(0.060825265,0.17090728,0,0.060859952,0.17787963,0,0.054692531,0.17439284,0){2288734.2,2182203,2346407.8,-3282960.5,-3438395.7,-3532168.6,-862639.89,-202892.1,-561454.61,3657845.3,3555311.4,3816051.1,-726586.11,-1844119.8,-1367177.6};
+ST(0.092520768,0.26920591,0,0.095069321,0.27540052,0,0.089232651,0.27618677,0){145042.72,76899.446,160151.6,-420173.4,-225624.71,-470555.02,651988.34,359465.9,751874.95,-816598.86,-469594.27,-986723.61,896908.09,548580.83,1160401.4};
+ST(0.1,0.27142857,0,0.095069321,0.27540052,0,0.092520768,0.26920591,0){0,76899.446,145042.72,0,-225624.71,-420173.4,0,359465.9,651988.34,0,-469594.27,-816598.86,0,548580.83,896908.09};
+ST(0.092450683,0.030760689,0,0.095041081,0.024587994,0,0.1,0.028571429,0){900007.85,597113.29,0,807431.66,557751.32,0,631804.95,481620.22,0,391202.83,373740.48,0,110124.82,241099.33,0};
+ST(0.089183466,0.023798504,0,0.095041081,0.024587994,0,0.092450683,0.030760689,0){1283383.3,597113.29,900007.85,1204105.7,557751.32,807431.66,1050439.6,481620.22,631804.95,831874.08,373740.48,391202.83,561630.79,241099.33,110124.82};
+ST(0.041643161,0.17482395,0,0.034648589,0.17585937,0,0.036146522,0.16944297,0){2284160.6,2080615.7,2222447.1,-3458410.7,-3193762.3,-3121229.8,-506290.81,-371953.81,-960241.74,3718851.8,3392886,3509731.4,-1405815.9,-1443588.4,-459324.98};
+ST(0.1,0.25,0,0.095492809,0.25375881,0,0.095090425,0.2489538,0){0,131307.15,157454.16,0,-363726.6,-428416.46,0,512510.07,579817.55,0,-543451.99,-569427.53,0,449348.78,400020.01};
+ST(0.094913401,0.051076335,0,0.095360834,0.0462161,0,0.1,0.05,0){595503.05,547145.45,0,429138.45,421466.87,0,142901.48,198977.54,0,-183223.65,-69217.008,0,-458373.75,-321602.09,0};
+ST(0.068707287,0.030314019,0,0.067616069,0.037109229,0,0.060819012,0.031697917,0){3188897.7,3239242.7,3608360,2870259.7,2756202.5,3214477.8,2264806.3,1862139.4,2469695.4,1433032.7,690369.93,1455299.1,457746.25,-584563.48,281702.17};
+ST(0.061631884,0.26868773,0,0.068237016,0.26229006,0,0.069536278,0.26943087,0){591535.29,639705.29,505602.11,-1711593.4,-1820649,-1465439,2649353.2,2721368.6,2276404,-3304968.8,-3203243.1,-2856108.7,3608394.3,3191912.1,3145421.5};
+ST(0.057142857,0,0,0.051745598,0.0053231545,0,0.05,0,0){3783317.5,3873250.9,3880596.9,3783357,3861228.9,3880622.4,3783457.6,3837214.6,3880662.8,3783701.2,3801308.2,3880737.9,3783873.9,3753417.7,3880625.6};
+ST(0.05,0.3,0,0.051526128,0.29458598,0,0.057142857,0.3,0){0,109871.78,0,0,-329256.34,0,0,547568.39,0,0,-764098.34,0,0,977975.34,0};
+ST(0.1,0.064285714,0,0.095867013,0.068756454,0,0.09230899,0.063522919,0){0,470210.65,877619.52,0,236792.42,503392.8,0,-114175.46,-85524.836,0,-408471.99,-638068.15,0,-500215.61,-918939.46};
+ST(0.039157325,0.25334591,0,0.033025927,0.25326882,0,0.036308441,0.24745658,0){884627.38,809560.38,958174.94,-2446896,-2238649.8,-2591684.5,3436661.2,3142273.3,3460190.4,-3622356.9,-3308331.9,-3307339.6,2960330.2,2697705.3,2177878.8};
+ST(0.030440206,0.150204,0,0.033990129,0.14330646,0,0.037897724,0.149701,0){2239650.6,2486957.5,2552043.8,-2249230.7,-2138608.5,-2536068.8,-2230054.7,-2786553.8,-2567975.2,2258843.4,1748365.6,2520076,2220211.9,3031412.6,2583694.6};
+ST(0.025130011,0.29009115,0,0.0220603,0.28602893,0,0.028198926,0.28535727,0){142877.47,181204.07,230200.16,-427099.39,-539738.59,-685197.76,706741.94,886739.53,1124120.6,-978805.55,-1214791.9,-1536674.3,1240164.3,1516611.7,1912913.1};
+ST(0.013428016,0.091778472,0,0.013714026,0.097839388,0,0.0071591483,0.096788703,0){1408980.1,1412613.2,756711.76,204626.15,55008.627,43634.951,-1174648.8,-1355500.2,-710572.63,-1549888.7,-1463354,-795194.2,-600683.83,-165174.7,-130859.45};
+ST(0.0071591483,0.096788703,0,0.013714026,0.097839388,0,0.010955873,0.10281868,0){756711.76,1412613.2,1124212.8,43634.951,55008.627,-57954.543,-710572.63,-1355500.2,-1179275.3,-795194.2,-1463354,-1060620.9,-130859.45,-165174.7,173274.75};
+ST(0.037897724,0.149701,0,0.033990129,0.14330646,0,0.041319833,0.14315875,0){2552043.8,2486957.5,2735557.7,-2536068.8,-2138608.5,-2343944,-2567975.2,-2786553.8,-3071175.4,2520076,1748365.6,1904337.3,2583694.6,3031412.6,3343927.4};
+ST(0.035858843,0.031497608,0,0.030602087,0.036163623,0,0.028359285,0.029784535,0){3456371.8,3125169.1,2981166.2,3083741.5,2682310.4,2693525.9,2378649.5,1859340.6,2145980.7,1417116.3,772883.67,1391347.7,302618.73,-423255.99,502245.34};
+ST(0.026971271,0.22659033,0,0.029518097,0.21985532,0,0.034969012,0.22634925,0){1090633.5,1264894.2,1299939.6,-2658504.1,-2954793.2,-3164156.1,2731189,2682751.8,3237729.2,-1267784.1,-629411.95,-1478956,-909068.56,-1842177.8,-1117524.9};
+ST(0.034969012,0.22634925,0,0.029518097,0.21985532,0,0.036912897,0.21765752,0){1299939.6,1264894.2,1486590.9,-3164156.1,-2954793.2,-3421295.1,3237729.2,2682751.8,2965983.4,-1478956,-629411.95,-438566.7,-1117524.9,-1842177.8,-2395869.1};
+ST(0.051167355,0.022914381,0,0.052049192,0.01582547,0,0.057612168,0.01845715,0){3850137.8,3859264.8,3752599.8,3629520.4,3753529.9,3612875.5,3200919.1,3544947.6,3338613.5,2588908.3,3239251.6,2940029.2,1828396.4,2844641.6,2431782.4};
+ST(0.09071018,0.22887426,0,0.095706332,0.23121352,0,0.092168655,0.23668616,0){406264.77,183910.78,307607.26,-1003622.2,-460364.34,-792496.69,1069446.3,508106.39,941630.33,-568907.82,-303408.65,-691810.02,-233040.27,-52245.513,148523.72};
+ST(0.027903545,0.087518505,0,0.024499807,0.092422798,0,0.020473685,0.087577432,0){2674848,2390452.1,2087024.2,580994.77,320672.29,451292.51,-1967676.8,-2026771.7,-1538224.3,-2976106,-2619357.9,-2322280.1,-1655065.1,-944222.72,-1286407.6};
+ST(0.036146522,0.16944297,0,0.034648589,0.17585937,0,0.030623168,0.1713445,0){2222447.1,2080615.7,1985985.4,-3121229.8,-3193762.3,-2866418.8,-960241.74,-371953.81,-715248.18,3509731.4,3392886,3183566.3,-459324.98,-1443588.4,-696442.05};
+ST(0.027249449,0.18607819,0,0.034128539,0.18892309,0,0.029690249,0.19362013,0){1646413.8,1872288.6,1647856.1,-2861109.6,-3356683.8,-3101495.4,464444.42,788949.65,1088093.1,2518610.9,2731311.2,2141745.7,-2323177.4,-2954777.5,-2977851};
+ST(0,0.22142857,0,0.0069979116,0.22643766,0,0,0.22857143,0){0,317964.48,0,0,-774386.26,0,0,793599.18,0,0,-364658.79,0,0,-270536.88,0};
+ST(0.059551151,0.20970619,0,0.053910411,0.21448753,0,0.053221516,0.20704838,0){1688112.8,1667429.4,1805672.4,-3664209.4,-3752161.8,-3837129.3,2601193.1,3023771,2511247.5,619333.89,-28239.212,1011998.4,-3326584.6,-2988983.1,-3650194.7};
+ST(0.053221516,0.20704838,0,0.053910411,0.21448753,0,0.049232245,0.21047418,0){1805672.4,1667429.4,1752658.6,-3837129.3,-3752161.8,-3827070.5,2511247.5,3023771,2777012.8,1011998.4,-28239.212,540242.46,-3650194.7,-2988983.1,-3416565.4};
+ST(0.024008584,0.022367291,0,0.022427218,0.014872357,0,0.029163144,0.015558324,0){2639060.6,2505875.7,3068207,2494948.4,2445229.8,2986953.6,2214593.6,2325397.7,2826596.5,1813324.4,2149288.4,2591406.1,1312931.3,1920956.8,2287504.7};
+ST(0.029163144,0.015558324,0,0.022427218,0.014872357,0,0.025468185,0.010276157,0){3068207,2505875.7,2780034,2986953.6,2445229.8,2747892,2826596.5,2325397.7,2683968.5,2591406.1,2149288.4,2589008.8,2287504.7,1920956.8,2463902.9};
+ST(0.01788586,0.12850833,0,0.012365279,0.12660144,0,0.017763535,0.12074209,0){1616906.9,1158576.2,1657769.5,-895214.81,-596487.84,-657738.05,-2016472.2,-1447959.2,-2054600.3,-4802.2192,-105993.81,-581651.26,2014144.7,1396357.8,1703675.4};
+ST(0.017763535,0.12074209,0,0.012365279,0.12660144,0,0.01093484,0.12117452,0){1657769.5,1158576.2,1052666.9,-657738.05,-596487.84,-426753.37,-2054600.3,-1447959.2,-1306415.4,-581651.26,-105993.81,-350052.21,1703675.4,1396357.8,1098212.1};
+ST(0.03163445,0.20120488,0,0.025476801,0.19755762,0,0.029690249,0.19362013,0){1608414.7,1423125.8,1647856.1,-3251875.6,-2782737.9,-3101495.4,1714266.6,1235431.1,1088093.1,1500504,1602470.1,2141745.7,-3248047,-2766638.2,-2977851};
+ST(0.09230899,0.063522919,0,0.095867013,0.068756454,0,0.09123018,0.070922096,0){877619.52,470210.65,983713.53,503392.8,236792.42,465586.72,-85524.836,-114175.46,-297764.17,-638068.15,-408471.99,-904277.98,-918939.46,-500215.61,-1034644.8};
+ST(0.0079950318,0.059686314,0,0.012193394,0.066188359,0,0.0062494098,0.068021592,0){917766.47,1364188,709501.16,570756.35,734639.92,364477.97,7912.4367,-233939.49,-157824.6,-557994.72,-1094586.7,-603457.47,-913265.38,-1450385,-756039.79};
+ST(0.050721192,0.10961634,0,0.05615957,0.1141762,0,0.051013063,0.11801667,0){3257974.6,3147681.4,3161388.4,-583831.78,-840990.83,-1083065.4,-3737290.3,-3764018.8,-3873486.3,-2483878.9,-1917372.9,-1463412.7,1698581.7,2358868.4,2911579};
+ST(0.051703203,0.27754162,0,0.045592054,0.27439642,0,0.049721881,0.27094787,0){454636.43,513714.39,588018.61,-1338881.7,-1504437.2,-1710042.9,2149437.1,2387679.2,2675009.8,-2841702,-3100344.3,-3394309,3377384.9,3591305.7,3801713.7};
+ST(0.024044461,0.20382537,0,0.021120118,0.21068669,0,0.015977634,0.20443356,0){1283805.9,1077357.5,895779.15,-2655634.7,-2356401.7,-1862602.8,1553893.8,1720167.1,1114548.4,995311.88,314292.11,659707.69,-2617892.2,-2093742.8,-1827076.9};
+ST(0.08682376,0.20181233,0,0.093164956,0.1980516,0,0.093706234,0.20596864,0){767576.83,420734.09,360320.46,-1560255.4,-826537.04,-758974.46,843726.65,376428.12,479351.87,688912.23,463603.83,228803.73,-1555436.8,-823893.15,-732939.79};
+ST(0.030075176,0.23324008,0,0.033139613,0.24047735,0,0.025350652,0.23917347,0){1077047.3,1026889.2,868665.73,-2725827,-2694450.7,-2265304,3095770.8,3348643.4,2773502.3,-2013325.9,-2743423.6,-2193941.8,-13872.597,1106136.5,753574.67};
+ST(0.032229878,0.047894836,0,0.035422008,0.053603109,0,0.028699663,0.054481756,0){3188476.9,3344502.1,2920693,2403076.1,2318078.8,1995520.8,1025710.6,580213.58,438210.61,-604377.64,-1335777.4,-1257984.1,-2086050.7,-2842327.2,-2556170.3};
+ST(0.038515413,0.047952704,0,0.035422008,0.053603109,0,0.032229878,0.047894836,0){3516906.1,3344502.1,3188476.9,2648581.9,2318078.8,2403076.1,1126309.3,580213.58,1025710.6,-674068.75,-1335777.4,-604377.64,-2308227.3,-2842327.2,-2086050.7};
+ST(0.0093450955,0.28843768,0,0.010662343,0.29482959,0,0.0045473776,0.2936365,0){67949.514,34537.041,18406.211,-202850.84,-103506.64,-55138.333,334776.34,172164.12,91630.552,-461793.67,-240303.04,-127724.83,581935.08,307518.14,162961.08};
+ST(0.0045481906,0.0063920675,0,0.010679145,0.0052482016,0,0.0093389246,0.011691623,0){552257.15,1277155.8,1120186.5,549810.55,1273289.3,1103410.3,544927.47,1265566.3,1070108.3,537633.65,1254019.7,1020788.4,527798.54,1238493.9,956114.18};
+ST(0.064285714,0,0,0.06203594,0.0060944193,0,0.057142857,0,0){3496327.6,3604620.2,3783317.5,3496358.5,3589956.2,3783357,3496415,3560685.5,3783457.6,3496523.2,3516960.1,3783701.2,3496472.9,3458793.9,3783873.9};
+ST(0.057142857,0.3,0,0.061805884,0.29356168,0,0.064285714,0.3,0){0,121923.05,0,0,-365207.83,0,0,606815.62,0,0,-845641.09,0,0,1080583.1,0};
+ST(0.070477538,0.15360968,0,0.064971856,0.15110456,0,0.069467767,0.146519,0){2153625.7,2431817,2287173.5,-2316413.6,-2488096.1,-2120501.9,-1978592.7,-2374265.3,-2441744.6,2466066.8,2543085,1942651.5,1792310.4,2315361.9,2583122};
+ST(0.048791783,0.28884593,0,0.051526128,0.29458598,0,0.045931579,0.29422002,0){226341.07,109871.78,116468.36,-675936.71,-329256.34,-348980.73,1116322.7,547568.39,580225.36,-1541505,-764098.34,-809364.6,1945474.1,977975.34,1035478};
+ST(0.046181733,0.0056701177,0,0.051745598,0.0053231545,0,0.049204373,0.010884263,0){3851009.3,3873250.9,3873084,3837454.5,3861228.9,3822842.7,3810385,3837214.6,3723003.5,3769920.5,3801308.2,3574883.8,3715901.2,3753417.7,3380124.5};
+ST(0.089230742,0.11966768,0,0.082946441,0.12207685,0,0.08466046,0.11619385,0){1043332.5,1589878.9,1475783,-391602.7,-673263.29,-452604.25,-1287980.7,-1978038.1,-1789662.1,-412950.99,-467139.5,-788262.21,1030099.2,1708498.9,1243195.1};
+ST(0.1,0.078571429,0,0.095795895,0.073622969,0,0.1,0.071428571,0){0,473503.74,0,0,205720.2,0,0,-178405.32,0,0,-461642.03,0,0,-483922.03,0};
+ST(0.017433092,0.042090914,0,0.022876349,0.043626948,0,0.019247887,0.048569646,0){1971771.3,2488553.5,2135187.8,1594855,1978130.3,1594654.5,913057.13,1061959.9,650408.09,56690.05,-72059.632,-458538.7,-810753.02,-1191549.5,-1451674.1};
+ST(0.060819012,0.031697917,0,0.067616069,0.037109229,0,0.060555575,0.040182349,0){3608360,3239242.7,3588260.7,3214477.8,2756202.5,2962222.2,2469695.4,1862139.4,1819353,1455299.1,690369.93,359025.67,281702.17,-584563.48,-1164330.1};
+ST(0.060672356,0.25950081,0,0.068237016,0.26229006,0,0.061631884,0.26868773,0){771273.27,639705.29,591535.29,-2177172.3,-1820649,-1711593.4,3197356.1,2721368.6,2649353.2,-3651078,-3203243.1,-3304968.8,3457676.3,3191912.1,3608394.3};
+ST(0.043027686,0.24899973,0,0.049037582,0.25027532,0,0.04563604,0.25694979,0){999522.33,998508.07,859240.08,-2720190.5,-2730849.8,-2406042.8,3683283.3,3739350.2,3472131.8,-3620573.8,-3756698.7,-3844488.4,2549278.8,2778087.3,3448330.3};
+ST(0.061098586,0.072147464,0,0.064846874,0.068845861,0,0.066925078,0.074981916,0){3389933,3243292.3,3090390.8,1545196.6,1629296.1,1280900.5,-1140417.3,-795531.06,-1278621.5,-3205469.9,-2824516.6,-3089611.2,-3526423.9,-3448034.5,-3091904.4};
+ST(0.051013063,0.11801667,0,0.05615957,0.1141762,0,0.057323957,0.1204315,0){3161388.4,3147681.4,3051716.5,-1083065.4,-840990.83,-1191883,-3873486.3,-3764018.8,-3778168.4,-1463412.7,-1917372.9,-1110713.1,2911579,2358868.4,3101303};
+ST(0.1,0.22857143,0,0.095652827,0.22622146,0,0.1,0.22142857,0){0,199039.37,0,0,-484109.58,0,0,494313.66,0,0,-223837.82,0,0,-173819.74,0};
+ST(0.1,0.19285714,0,0.095453592,0.18738967,0,0.1,0.18571429,0){0,307137.29,0,0,-541566.85,0,0,106216.39,0,0,460538.95,0,0,-458087.35,0};
+ST(0.049678492,0.18505966,0,0.048811039,0.17808485,0,0.055202425,0.1814475,0){2196886.7,2310715.6,2227021.2,-3774046.6,-3650410,-3667462.5,512508.07,-194330.82,145084.74,3406255.6,3763231.4,3573754.5,-2958276.7,-1987755.8,-2457046.3};
+ST(0.089437553,0.21298247,0,0.086709216,0.20730703,0,0.093706234,0.20596864,0){556322.48,734117.03,360320.46,-1238115.4,-1563285.8,-758974.46,961021.23,1031586.7,479351.87,60411.18,398134,228803.73,-1035404.3,-1481512.9,-732939.79};
+ST(0.093706234,0.20596864,0,0.086709216,0.20730703,0,0.08682376,0.20181233,0){360320.46,734117.03,767576.83,-758974.46,-1563285.8,-1560255.4,479351.87,1031586.7,843726.65,228803.73,398134,688912.23,-732939.79,-1481512.9,-1555436.8};
+ST(0.074105201,0.11070107,0,0.06715469,0.10983132,0,0.072126291,0.10515927,0){2359475.3,2794834,2539730.3,-471755.94,-512277.78,-241283.81,-2736894.8,-3213264.7,-2758172.2,-1717960.7,-2112070.8,-2254933.2,1362139.4,1488257.3,717337.89};
+ST(0.056292141,0.2827555,0,0.051519181,0.28417908,0,0.051703203,0.27754162,0){343081.75,320732.11,454636.43,-1018093.3,-953415.16,-1338881.7,1660020.8,1560004.1,2149437.1,-2248005.1,-2123899.5,-2841702,2762903.8,2629434.9,3377384.9};
+ST(0.055202425,0.1814475,0,0.048811039,0.17808485,0,0.054692531,0.17439284,0){2227021.2,2310715.6,2346407.8,-3667462.5,-3650410,-3532168.6,145084.74,-194330.82,-561454.61,3573754.5,3763231.4,3816051.1,-2457046.3,-1987755.8,-1367177.6};
+ST(0.046063037,0.016810165,0,0.043829005,0.011024747,0,0.049204373,0.010884263,0){3836060.2,3801549.1,3873084,3717529.2,3750937.1,3822842.7,3484126.2,3650381.9,3723003.5,3143090.2,3501249.8,3574883.8,2704667.4,3305260.3,3380124.5};
+ST(0.037071258,0.0642048,0,0.032659307,0.059686042,0,0.038435934,0.058364632,0){3365311.2,3158137.1,3459248.5,1900443.5,1964024.3,2206750.4,-391679.98,27282.242,155241.86,-2513388.8,-1919818.3,-1952496,-3541461.8,-3141270.1,-3353689.4};
+ST(0.011268327,0.1984065,0,0.005051806,0.19767546,0,0.0066871595,0.19241823,0){682302.12,313084.45,432113.5,-1344805.9,-612892.85,-803518.34,623458.07,273796.53,258472.73,739532.85,350786.74,581490.34,-1341727.7,-609909.8,-758588.26};
+ST(0.011197941,0.071439681,0,0.012549176,0.077039569,0,0.0060853536,0.074713803,0){1244724.5,1370920.5,681675.12,579995.21,525978.15,285253.65,-394493.66,-643140.23,-277070.48,-1158343.6,-1415881.7,-678306.76,-1303869.8,-1316306.1,-685312.86};
+ST(0.0060853536,0.074713803,0,0.012549176,0.077039569,0,0.0064539684,0.081629255,0){681675.12,1370920.5,711139.06,285253.65,525978.15,222377.16,-277070.48,-643140.23,-419239.47,-678306.76,-1415881.7,-772749.89,-685312.86,-1316306.1,-595288.06};
+ST(0.0910478,0.13167545,0,0.087905667,0.12517971,0,0.093823791,0.12410599,0){831136.87,1140990.9,595735.92,-514132.23,-554517.87,-276601.23,-1027305.8,-1425990.8,-743959.63,122313.64,-178453.87,-121937.8,1073956.7,1334087.8,678759.2};
+ST(0.087905667,0.12517971,0,0.082946441,0.12207685,0,0.089230742,0.11966768,0){1140990.9,1589878.9,1043332.5,-554517.87,-673263.29,-391602.7,-1425990.8,-1978038.1,-1287980.7,-178453.87,-467139.5,-412950.99,1334087.8,1708498.9,1030099.2};
+ST(0.0066871595,0.19241823,0,0.012931293,0.19295437,0,0.011268327,0.1984065,0){432113.5,815194.79,682302.12,-803518.34,-1524077.7,-1344805.9,258472.73,510133.92,623458.07,581490.34,1080471.8,739532.85,-758588.26,-1450076.4,-1341727.7};
+ST(0.05,0,0,0.046181733,0.0056701177,0,0.042857143,0,0){3880596.9,3851009.3,3783299.5,3880622.4,3837454.5,3783327.5,3880662.8,3810385,3783379.6,3880737.9,3769920.5,3783486.4,3880625.6,3715901.2,3783576.5};
+ST(0.042857143,0.3,0,0.045931579,0.29422002,0,0.05,0.3,0){0,116468.36,0,0,-348980.73,0,0,580225.36,0,0,-809364.6,0,0,1035478,0};
+ST(0.057323957,0.1204315,0,0.05615957,0.1141762,0,0.062195955,0.11505156,0){3051716.5,3147681.4,2965673.8,-1191883,-840990.83,-843057.19,-3778168.4,-3764018.8,-3569130.8,-1110713.1,-1917372.9,-1711501.2,3101303,2358868.4,2344130.4};
+ST(0.013428016,0.091778472,0,0.01318623,0.084416193,0,0.020473685,0.087577432,0){1408980.1,1411871.7,2087024.2,204626.15,378554.62,451292.51,-1174648.8,-931831.12,-1538224.3,-1549888.7,-1560266,-2322280.1,-600683.83,-1046999.7,-1286407.6};
+ST(0.030312881,0.27848596,0,0.028198926,0.28535727,0,0.023483408,0.28013687,0){355416.48,230200.16,270985.88,-1048284.8,-685197.76,-801278.39,1688178.9,1124120.6,1297043.7,-2242771,-1536674.3,-1736920.8,2683885.3,1912913.1,2101746.5};
+ST(0.0069613667,0.17349451,0,0.0062925762,0.18063125,0,0,0.17857143,0){517779.21,445914.92,0,-769992.03,-727143.63,0,-142713.64,12632.594,0,839532.94,719304.1,0,-266340.1,-466469.22,0};
+ST(0.046063037,0.016810165,0,0.052049192,0.01582547,0,0.051167355,0.022914381,0){3836060.2,3859264.8,3850137.8,3717529.2,3753529.9,3629520.4,3484126.2,3544947.6,3200919.1,3143090.2,3239251.6,2588908.3,2704667.4,2844641.6,1828396.4};
+ST(0.065931692,0.10408722,0,0.06715469,0.10983132,0,0.059543685,0.10776494,0){2911358.9,2794834,3132791.5,-218409.17,-512277.78,-451048.14,-3113407,-3213264.7,-3519016.9,-2661455,-2112070.8,-2561357.9,651464.78,1488257.3,1326599.2};
+ST(0.083190767,0.25723975,0,0.085145188,0.25032735,0,0.090077759,0.25268961,0){434158.6,448997.25,291813.61,-1216864.4,-1228228.7,-805257.31,1759626.8,1682589.8,1125037.4,-1955417.3,-1691886.1,-1174248.1,1765235.2,1253443,940920.06};
+ST(0.07921504,0.25033934,0,0.085145188,0.25032735,0,0.083190767,0.25723975,0){606155.6,448997.25,434158.6,-1658203,-1228228.7,-1216864.4,2271843.6,1682589.8,1759626.8,-2284831,-1691886.1,-1955417.3,1693484.6,1253443,1765235.2};
+ST(0.08974924,0.047235181,0,0.083998423,0.049627851,0,0.082493405,0.042375289,0){1190814.4,1806853.8,1978611.8,905328.07,1329741.5,1595319.9,402804.56,501474.01,902966.17,-196265.4,-459273.5,35643.43,-748421.11,-1299103.8,-838916.97};
+ST(0.082493405,0.042375289,0,0.083998423,0.049627851,0,0.077364239,0.048764008,0){1978611.8,1806853.8,2450679,1595319.9,1329741.5,1825420.5,902966.17,501474.01,734405.59,35643.43,-459273.5,-544039.45,-838916.97,-1299103.8,-1683943.8};
+ST(0.1,0.23571429,0,0.095706332,0.23121352,0,0.1,0.22857143,0){0,183910.78,0,0,-460364.34,0,0,508106.39,0,0,-303408.65,0,0,-52245.513,0};
+ST(0.055890502,0.18802963,0,0.061291474,0.18447479,0,0.06137482,0.19024807,0){2110328.4,2069396,1976038.9,-3747121.1,-3531333.7,-3592882,795966.68,425331.11,963745.22,3129878.5,3230965.1,2804392.5,-3224012.4,-2708277.6,-3258719.1};
+ST(0.049204373,0.010884263,0,0.052049192,0.01582547,0,0.046063037,0.016810165,0){3873084,3859264.8,3836060.2,3822842.7,3753529.9,3717529.2,3723003.5,3544947.6,3484126.2,3574883.8,3239251.6,3143090.2,3380124.5,2844641.6,2704667.4};
+ST(0.021428571,0.3,0,0.024877102,0.29495936,0,0.028571429,0.3,0){0,72135.52,0,0,-216205.93,0,0,359676.71,0,0,-502149.61,0,0,642973.44,0};
+ST(0.028571429,0,0,0.025051818,0.0051959301,0,0.021428571,0,0){3033980.1,2747435.6,2419501.9,3033983.4,2739316.7,2419561.9,3033988.7,2723095.2,2419679.8,3034024.4,2698832.3,2419876.4,3033982.5,2666496.7,2419989.4};
+ST(0.093922759,0.092262381,0,0.09416017,0.099511923,0,0.087331535,0.0958472,0){652083.63,613994.66,1318484.3,89312.894,5422.3845,98077.228,-550573,-608645.22,-1213131.9,-715327.2,-619557.01,-1401481.2,-262838.8,-16415.987,-292629.72};
+ST(0.01093484,0.12117452,0,0.012365279,0.12660144,0,0.0061411468,0.1246533,0){1052666.9,1158576.2,591118.91,-426753.37,-596487.84,-280990.71,-1306415.4,-1447959.2,-738586.84,-350052.21,-105993.81,-106527.54,1098212.1,1396357.8,682629.18};
+ST(0.0061411468,0.1246533,0,0.012365279,0.12660144,0,0.0072553778,0.13224921,0){591118.91,1158576.2,674958.82,-280990.71,-596487.84,-425463.67,-738586.84,-1447959.2,-832230.25,-106527.54,-105993.81,117822.57,682629.18,1396357.8,875622.71};
+ST(0.066803853,0.25459223,0,0.068237016,0.26229006,0,0.060672356,0.25950081,0){789541.66,639705.29,771273.27,-2193455.3,-1820649,-2177172.3,3110738.9,2721368.6,3197356.1,-3337877,-3203243.1,-3651078,2824240.3,3191912.1,3457676.3};
+ST(0.060555575,0.040182349,0,0.067616069,0.037109229,0,0.066401409,0.0434645,0){3588260.7,3239242.7,3289675.8,2962222.2,2756202.5,2619840.6,1819353,1862139.4,1416557.6,359025.67,690369.93,-75156.319,-1164330.1,-584563.48,-1551772};
+ST(0.016878531,0.18478654,0,0.021212478,0.18688263,0,0.017373248,0.19021363,0){1113458.1,1339179.6,1095255.9,-1906862.4,-2348119.2,-1990705.9,245299.96,429909.33,532263.7,1732097.5,2024227.8,1555631.8,-1479759.2,-1955356.8,-1804413.6};
+ST(0.021251228,0.18136297,0,0.021212478,0.18688263,0,0.016878531,0.18478654,0){1398279.8,1339179.6,1113458.1,-2300353.4,-2348119.2,-1906862.4,85724.805,429909.33,245299.96,2245163.6,2024227.8,1732097.5,-1534338.6,-1955356.8,-1479759.2};
+ST(0.029991713,0.27132489,0,0.025044032,0.27464897,0,0.023009638,0.26878949,0){469504.82,363665.57,417665.14,-1366503,-1065519.5,-1208783.5,2141236.7,1692735.8,1871958.7,-2724385.3,-2201379.5,-2337004.8,3063642.3,2555652.6,2554445.3};
+ST(0.023009638,0.26878949,0,0.025044032,0.27464897,0,0.018422519,0.27450763,0){417665.14,363665.57,282501.19,-1208783.5,-1065519.5,-827496.14,1871958.7,1692735.8,1313896,-2337004.8,-2201379.5,-1707268.8,2554445.3,2555652.6,1979556.1};
+ST(0.048866761,0.029559705,0,0.054261983,0.029107824,0,0.052748817,0.036292023,0){3831772.8,3801269,3796611.1,3467532.3,3450822.2,3254886.9,2773676.3,2782228.4,2248728.5,1816186,1857139.4,921690.78,685852.4,760852.59,-537197.11};
+ST(0.069025318,0.11622387,0,0.06715469,0.10983132,0,0.074105201,0.11070107,0){2631986.5,2794834,2359475.3,-808686.45,-512277.78,-471755.94,-3192250.9,-3213264.7,-2736894.8,-1402768.4,-2112070.8,-1717960.7,2220554.1,1488257.3,1362139.4};
+ST(0.036912897,0.21765752,0,0.042541479,0.22296234,0,0.034969012,0.22634925,0){1486590.9,1481591,1299939.6,-3421295.1,-3531706.6,-3164156.1,2965983.4,3405357.4,3237729.2,-438566.7,-1180392.3,-1478956,-2395869.1,-1772446.7,-1117524.9};
+ST(0.034969012,0.22634925,0,0.042541479,0.22296234,0,0.041402067,0.22952626,0){1299939.6,1481591,1348916.4,-3164156.1,-3531706.6,-3344816,3237729.2,3405357.4,3600200.4,-1478956,-1180392.3,-1982154,-1117524.9,-1772446.7,-667743.82};
+ST(0.036602132,0.28491153,0,0.028198926,0.28535727,0,0.030312881,0.27848596,0){279518.56,230200.16,355416.48,-831596.18,-685197.76,-1048284.8,1362985.6,1124120.6,1688178.9,-1860498.2,-1536674.3,-2242771,2311728.5,1912913.1,2683885.3};
+ST(0.072126291,0.10515927,0,0.06715469,0.10983132,0,0.065931692,0.10408722,0){2539730.3,2794834,2911358.9,-241283.81,-512277.78,-218409.17,-2758172.2,-3213264.7,-3113407,-2254933.2,-2112070.8,-2661455,717337.89,1488257.3,651464.78};
+ST(0.049165273,0.076760106,0,0.047469022,0.070467195,0,0.054876921,0.07294965,0){3570137.5,3608010.8,3558755.8,1384898,1730907.5,1580988.4,-1648055.9,-1046792,-1275447.3,-3672308.6,-3280034.9,-3423192.1,-3449021.3,-3807136.9,-3669097.1};
+ST(0.085115353,0.26563346,0,0.086077973,0.27164165,0,0.081004963,0.27070547,0){313056.52,243157.03,333174.81,-899063.8,-708191.99,-968418.7,1369900.4,1111255.9,1513258.3,-1665255.4,-1417072.6,-1916833.2,1747205.8,1598582.9,2141327.9};
+ST(0.080699945,0.029142305,0,0.085916752,0.02828,0,0.084917502,0.034253561,0){2185639.9,1643257.2,1742331.8,1983669.2,1500211.7,1520580.8,1598386.1,1226559.7,1105294,1065401.8,846114.35,549324.68,433818.71,391827.49,-76880.401};
+ST(0.016939848,0.22904958,0,0.012706169,0.22573828,0,0.017207343,0.22323305,0){714788.59,571782.3,781289.63,-1767596.2,-1386624.6,-1865590.4,1888698.3,1404300.2,1807835.2,-1014237.8,-614658.98,-643322.1,-395054.79,-528535.98,-915362.92};
+ST(0.011838853,0.2301677,0,0.012706169,0.22573828,0,0.016939848,0.22904958,0){504229.49,571782.3,714788.59,-1254859.2,-1386624.6,-1767596.2,1363834.1,1404300.2,1888698.3,-775392.51,-614658.98,-1014237.8,-209768.04,-528535.98,-395054.79};
+ST(0.018343869,0.21720619,0,0.021120118,0.21068669,0,0.02463475,0.21609565,0){888277.19,1077357.5,1153636.1,-2037897.4,-2356401.7,-2626116.1,1749211,1720167.1,2198315,-225952.88,314292.11,-179791.92,-1457259.1,-2093742.8,-1969098.8};
+ST(0.054237851,0.14012792,0,0.049213686,0.13705186,0,0.053497526,0.1329974,0){2856617.8,2922689.8,2959143.9,-2267029,-2132523.3,-1911000.9,-3324577.4,-3499251.9,-3636096,1580891.3,1186505.2,623103.97,3650971.5,3819996.4,3857035.6};
+ST(0.023009638,0.26878949,0,0.027951851,0.26533243,0,0.029991713,0.27132489,0){417665.14,539100.43,469504.82,-1208783.5,-1547025.6,-1366503,1871958.7,2353298.6,2141236.7,-2337004.8,-2852826.8,-2724385.3,2554445.3,2980285,3063642.3};
+ST(0.1,0.071428571,0,0.095867013,0.068756454,0,0.1,0.064285714,0){0,470210.65,0,0,236792.42,0,0,-114175.46,0,0,-408471.99,0,0,-500215.61,0};
+ST(0.039366597,0.19088868,0,0.038852293,0.18542603,0,0.044234359,0.18859393,0){1982365.2,2057873,2102462.5,-3628592.6,-3549951.2,-3756018.8,1030950.1,516044.6,851571.98,2772526.5,3175871.5,3086402.5,-3333638.5,-2819104.7,-3279385.1};
+ST(0.044234359,0.18859393,0,0.038852293,0.18542603,0,0.043573225,0.18196099,0){2102462.5,2057873,2202933.2,-3756018.8,-3549951.2,-3650165.7,851571.98,516044.6,195066.32,3086402.5,3175871.5,3522129.2,-3279385.1,-2819104.7,-2509350};
+ST(0.010546892,0.2198034,0,0.012706169,0.22573828,0,0.0069979116,0.22643766,0){514716.79,571782.3,317964.48,-1201974.2,-1386624.6,-774386.26,1090194.6,1404300.2,793599.18,-253690.09,-614658.98,-364658.79,-751659.26,-528535.98,-270536.88};
+ST(0.0069979116,0.22643766,0,0.012706169,0.22573828,0,0.011838853,0.2301677,0){317964.48,571782.3,504229.49,-774386.26,-1386624.6,-1254859.2,793599.18,1404300.2,1363834.1,-364658.79,-614658.98,-775392.51,-270536.88,-528535.98,-209768.04};
+ST(0.078571429,0,0,0.074656208,0.0053403125,0,0.071428571,0,0){2419478.6,2772385.5,3033974.4,2419535.2,2763721.5,3033978.9,2419645.1,2746414.1,3033982.8,2419827.2,2720533.7,3034008.5,2420024.4,2685936.9,3033714};
+ST(0,0.1,0,0.0052460498,0.10332732,0,0,0.10714286,0){0,545715.18,0,0,-33256.292,0,0,-576983.54,0,0,-508602.25,0,0,99155.047,0};
+ST(0.071428571,0.3,0,0.074657371,0.29452352,0,0.078571429,0.3,0){0,79525.554,0,0,-238312.39,0,0,396309.36,0,0,-552992.95,0,0,707611.71,0};
+ST(0.1,0.16428571,0,0.093710586,0.16080643,0,0.1,0.15714286,0){0,507346.27,0,0,-621948.04,0,0,-366919.85,0,0,704920.6,0,0,207593.47,0};
+ST(0.042113175,0.053290167,0,0.035422008,0.053603109,0,0.038515413,0.047952704,0){3616583.4,3344502.1,3516906.1,2519252.9,2318078.8,2648581.9,657513.67,580213.58,1126309.3,-1403801.4,-1335777.4,-674068.75,-3039615.4,-2842327.2,-2308227.3};
+ST(0.038435934,0.058364632,0,0.035422008,0.053603109,0,0.042113175,0.053290167,0){3459248.5,3344502.1,3616583.4,2206750.4,2318078.8,2519252.9,155241.86,580213.58,657513.67,-1952496,-1335777.4,-1403801.4,-3353689.4,-2842327.2,-3039615.4};
+ST(0.03345202,0.18222482,0,0.034128539,0.18892309,0,0.027249449,0.18607819,0){1947746.5,1872288.6,1646413.8,-3237509.5,-3356683.8,-2861109.6,196057.01,788949.65,464444.42,3107788.7,2731311.2,2518610.9,-2254322.8,-2954777.5,-2323177.4};
+ST(0.1,0.17857143,0,0.095837038,0.182565,0,0.093873231,0.17693503,0){0,291932.87,445896.9,0,-487211.17,-694096.79,0,33971.767,-59504.029,0,464480.32,727141.13,0,-344762.9,-345394.37};
+ST(0.031105381,0.06529626,0,0.032659307,0.059686042,0,0.037071258,0.0642048,0){3030579.1,3158137.1,3365311.2,1667989.8,1964024.3,1900443.5,-444570.51,27282.242,-391679.98,-2357289.6,-1919818.3,-2513388.8,-3210321.2,-3141270.1,-3541461.8};
+ST(0.08415119,0.061061125,0,0.085646934,0.067722415,0,0.079822506,0.065677674,0){1759442.9,1585902.9,2163855.5,1064240.3,821166.94,1180001.4,-51487.645,-339583.13,-340376.77,-1146904.2,-1336670.3,-1706002.2,-1789550.6,-1689538.4,-2296197.5};
+ST(0.079822506,0.065677674,0,0.085646934,0.067722415,0,0.080160084,0.071577727,0){2163855.5,1585902.9,2107851.9,1180001.4,821166.94,977984.82,-340376.77,-339583.13,-676141.96,-1706002.2,-1336670.3,-1967920.1,-2296197.5,-1689538.4,-2205119.3};
+ST(0.067098511,0.16826118,0,0.066399282,0.17458324,0,0.060825265,0.17090728,0){2121688.2,2061554.2,2288734.2,-2928224.5,-3111294.6,-3282960.5,-1008555.7,-477290.81,-862639.89,3311710.7,3354405.6,3657845.3,-250662.47,-1230983.2,-726586.11};
+ST(0.060859952,0.17787963,0,0.061291474,0.18447479,0,0.055202425,0.1814475,0){2182203,2069396,2227021.2,-3438395.7,-3531333.7,-3667462.5,-202892.1,425331.11,145084.74,3555311.4,3230965.1,3573754.5,-1844119.8,-2708277.6,-2457046.3};
+ST(0.1,0.12142857,0,0.094962535,0.11849101,0,0.1,0.11428571,0){0,497557.04,0,0,-175139.73,0,0,-611084.48,0,0,-220851.73,0,0,467971.5,0};
+ST(0.091758141,0.11296708,0,0.094962535,0.11849101,0,0.089230742,0.11966768,0){824791.32,497557.04,1043332.5,-201020.76,-175139.73,-391602.7,-976886.6,-611084.48,-1287980.7,-537824.26,-220851.73,-412950.99,570097.26,467971.5,1030099.2};
+ST(0.1,0.11428571,0,0.094962535,0.11849101,0,0.091758141,0.11296708,0){0,497557.04,824791.32,0,-175139.73,-201020.76,0,-611084.48,-976886.6,0,-220851.73,-537824.26,0,467971.5,570097.26};
+ST(0,0.24285714,0,0.0043813653,0.24702694,0,0,0.25,0){0,145794.38,0,0,-393661.32,0,0,523477.05,0,0,-496310.62,0,0,320224.07,0};
+ST(0,0.05,0,0.004777904,0.053197076,0,0,0.057142857,0){0,557925.04,0,0,389224.92,0,0,102822.82,0,0,-214698.3,0,0,-467537.22,0};
+ST(0.047918899,0.14257657,0,0.049213686,0.13705186,0,0.054237851,0.14012792,0){2842478.3,2922689.8,2856617.8,-2400971.6,-2132523.3,-2267029,-3215455,-3499251.9,-3324577.4,1901551.7,1186505.2,1580891.3,3510918.5,3819996.4,3650971.5};
+ST(0.049678492,0.18505966,0,0.044234359,0.18859393,0,0.043573225,0.18196099,0){2196886.7,2102462.5,2202933.2,-3774046.6,-3756018.8,-3650165.7,512508.07,851571.98,195066.32,3406255.6,3086402.5,3522129.2,-2958276.7,-3279385.1,-2509350};
+ST(0.050398693,0.1921099,0,0.044234359,0.18859393,0,0.049678492,0.18505966,0){2077292.2,2102462.5,2196886.7,-3850553.1,-3756018.8,-3774046.6,1209682,851571.98,512508.07,2818064.5,3086402.5,3406255.6,-3615771.1,-3279385.1,-2958276.7};
+ST(0.055202425,0.1814475,0,0.055890502,0.18802963,0,0.049678492,0.18505966,0){2227021.2,2110328.4,2196886.7,-3667462.5,-3747121.1,-3774046.6,145084.74,795966.68,512508.07,3573754.5,3129878.5,3406255.6,-2457046.3,-3224012.4,-2958276.7};
+ST(0.1,0.27857143,0,0.095069321,0.27540052,0,0.1,0.27142857,0){0,76899.446,0,0,-225624.71,0,0,359465.9,0,0,-469594.27,0,0,548580.83,0};
+ST(0.066600159,0.24211306,0,0.061408089,0.24582042,0,0.059437672,0.2400817,0){1004296.2,1017142.7,1145348.7,-2655015,-2732695.2,-2999714,3359675.2,3591948.1,3711340.5,-2867211.3,-3325647.6,-3009146,1352854.8,2017029.8,1160252.2};
+ST(0.065478411,0.24860928,0,0.061408089,0.24582042,0,0.066600159,0.24211306,0){912058.17,1017142.7,1004296.2,-2478342.9,-2732695.2,-2655015,3344041.2,3591948.1,3359675.2,-3264436.9,-3325647.6,-2867211.3,2261773.6,2017029.8,1352854.8};
+ST(0.1,0.028571429,0,0.095041081,0.024587994,0,0.1,0.021428571,0){0,597113.29,0,0,557751.32,0,0,481620.22,0,0,373740.48,0,0,241099.33,0};
+ST(0.019165757,0.095107709,0,0.024499807,0.092422798,0,0.024938414,0.098415267,0){1930971.9,2390452.1,2383058.5,168744.63,320672.29,68195.72,-1747493.7,-2026771.7,-2312962.3,-2069009.1,-2619357.9,-2447461.4,-502664.26,-944222.72,-204726.33};
+ST(0.041643161,0.17482395,0,0.036146522,0.16944297,0,0.042242048,0.16806859,0){2284160.6,2222447.1,2399442.3,-3458410.7,-3121229.8,-3302042.1,-506290.81,-960241.74,-1157324.9,3718851.8,3509731.4,3737475.6,-1405815.9,-459324.98,-248746.29};
+ST(0.022876349,0.043626948,0,0.025565101,0.048609543,0,0.019247887,0.048569646,0){2488553.5,2702312,2135187.8,1978130.3,2017092.5,1594654.5,1061959.9,820389.33,650408.09,-72059.632,-584372.75,-458538.7,-1191549.5,-1841258.2,-1451674.1};
+ST(0.038217426,0.13599196,0,0.044512931,0.13802764,0,0.041319833,0.14315875,0){2738753.8,2867370.6,2735557.7,-1938161,-2150242,-2343944,-3305386.1,-3405187.4,-3071175.4,972060.89,1298632.3,1904337.3,3589652.3,3729885,3343927.4};
+ST(0.083559522,0.13424014,0,0.081009521,0.1385969,0,0.076271482,0.13373081,0){1462145.4,1630909.4,2012844.4,-981746.52,-1242340.3,-1330317.6,-1784737.2,-1926924,-2463975.8,395362.65,783271.16,494859.01,1914407.3,2113542.9,2631758.9};
+ST(0.071059851,0.17209017,0,0.066399282,0.17458324,0,0.067098511,0.16826118,0){1900690.4,2061554.2,2121688.2,-2772233.4,-3111294.6,-2928224.5,-629520.98,-477290.81,-1008555.7,3060958.1,3354405.6,3311710.7,-774142.34,-1230983.2,-250662.47};
+ST(0.041319833,0.14315875,0,0.044512931,0.13802764,0,0.047918899,0.14257657,0){2735557.7,2867370.6,2842478.3,-2343944,-2150242,-2400971.6,-3071175.4,-3405187.4,-3215455,1904337.3,1298632.3,1901551.7,3343927.4,3729885,3510918.5};
+ST(0,0.16428571,0,0.0046637588,0.16745308,0,0,0.17142857,0){0,362371.83,0,0,-494096.85,0,0,-182769.85,0,0,560561.48,0,0,-21256.565,0};
+ST(0.049678492,0.18505966,0,0.055890502,0.18802963,0,0.050398693,0.1921099,0){2196886.7,2110328.4,2077292.2,-3774046.6,-3747121.1,-3850553.1,512508.07,795966.68,1209682,3406255.6,3129878.5,2818064.5,-2958276.7,-3224012.4,-3615771.1};
+ST(0.043573225,0.18196099,0,0.048811039,0.17808485,0,0.049678492,0.18505966,0){2202933.2,2310715.6,2196886.7,-3650165.7,-3650410,-3774046.6,195066.32,-194330.82,512508.07,3522129.2,3763231.4,3406255.6,-2509350,-1987755.8,-2958276.7};
+ST(0.066710408,0.18109144,0,0.07206248,0.1830344,0,0.06771074,0.1881525,0){1958233.8,1716055.3,1821405.7,-3210995.9,-2879815.5,-3238423,95959.418,236909.5,698008.36,3149708.8,2719220.1,2695511.5,-2111256.9,-2081132.3,-2795478.4};
+ST(0.1,0.18571429,0,0.095837038,0.182565,0,0.1,0.17857143,0){0,291932.87,0,0,-487211.17,0,0,33971.767,0,0,464480.32,0,0,-344762.9,0};
+ST(0.042242048,0.16806859,0,0.036146522,0.16944297,0,0.038427921,0.16264679,0){2399442.3,2222447.1,2389351.9,-3302042.1,-3121229.8,-3020403.6,-1157324.9,-960241.74,-1591681.4,3737475.6,3509731.4,3440909.6,-248746.29,-459324.98,682723.32};
+ST(0.042541479,0.22296234,0,0.04727629,0.22823863,0,0.041402067,0.22952626,0){1481591,1418822.2,1348916.4,-3531706.6,-3492237.2,-3344816,3405357.4,3684627.2,3600200.4,-1180392.3,-1892328,-1982154,-1772446.7,-919608.01,-667743.82};
+ST(0.049797208,0.2214244,0,0.04727629,0.22823863,0,0.042541479,0.22296234,0){1551864.2,1418822.2,1481591,-3662861.4,-3492237.2,-3531706.6,3430735.4,3684627.2,3405357.4,-1003918.8,-1892328,-1180392.3,-2065424.5,-919608.01,-1772446.7};
+ST(0.062195955,0.11505156,0,0.05615957,0.1141762,0,0.059543685,0.10776494,0){2965673.8,3147681.4,3132791.5,-843057.19,-840990.83,-451048.14,-3569130.8,-3764018.8,-3519016.9,-1711501.2,-1917372.9,-2561357.9,2344130.4,2358868.4,1326599.2};
+ST(0.093823791,0.12410599,0,0.087905667,0.12517971,0,0.089230742,0.11966768,0){595735.92,1140990.9,1043332.5,-276601.23,-554517.87,-391602.7,-743959.63,-1425990.8,-1287980.7,-121937.8,-178453.87,-412950.99,678759.2,1334087.8,1030099.2};
+ST(0.066710408,0.18109144,0,0.066399282,0.17458324,0,0.071841704,0.17726974,0){1958233.8,2061554.2,1799263.7,-3210995.9,-3111294.6,-2812994.5,95959.418,-477290.81,-214389.53,3149708.8,3354405.6,2933842.6,-2111256.9,-1230983.2,-1438939.3};
+ST(0.095453592,0.18738967,0,0.095837038,0.182565,0,0.1,0.18571429,0){307137.29,291932.87,0,-541566.85,-487211.17,0,106216.39,33971.767,0,460538.95,464480.32,0,-458087.35,-344762.9,0};
+ST(0.089858368,0.18421461,0,0.095837038,0.182565,0,0.095453592,0.18738967,0){692603.24,291932.87,307137.29,-1178349.1,-487211.17,-541566.85,133849.22,33971.767,106216.39,1084450.2,464480.32,460538.95,-894447.98,-344762.9,-458087.35};
+ST(0.054692531,0.17439284,0,0.048811039,0.17808485,0,0.048076401,0.17082416,0){2346407.8,2310715.6,2424680.5,-3532168.6,-3650410,-3473815.1,-561454.61,-194330.82,-921629.25,3816051.1,3763231.4,3872759.5,-1367177.6,-1987755.8,-754316.94};
+ST(0.030623168,0.1713445,0,0.034648589,0.17585937,0,0.027644767,0.17736901,0){1985985.4,2080615.7,1774040.3,-2866418.8,-3193762.3,-2777088.7,-715248.18,-371953.81,-203929.31,3183566.3,3392886,2892544.7,-696442.05,-1443588.4,-1431643.3};
+ST(0.027644767,0.17736901,0,0.034648589,0.17585937,0,0.03345202,0.18222482,0){1774040.3,2080615.7,1947746.5,-2777088.7,-3193762.3,-3237509.5,-203929.31,-371953.81,196057.01,2892544.7,3392886,3107788.7,-1431643.3,-1443588.4,-2254322.8};
+ST(0.0060491453,0.25298129,0,0.0043813653,0.24702694,0,0.0087429334,0.24792416,0){178654.23,145794.38,283453.34,-493529.07,-393661.32,-768118.62,691183.17,523477.05,1029935.2,-724662.05,-496310.62,-992967.39,585970.08,320224.07,667809.3};
+ST(0,0.25,0,0.0043813653,0.24702694,0,0.0060491453,0.25298129,0){0,145794.38,178654.23,0,-393661.32,-493529.07,0,523477.05,691183.17,0,-496310.62,-724662.05,0,320224.07,585970.08};
+ST(0.093823791,0.12410599,0,0.094962535,0.11849101,0,0.1,0.12142857,0){595735.92,497557.04,0,-276601.23,-175139.73,0,-743959.63,-611084.48,0,-121937.8,-220851.73,0,678759.2,467971.5,0};
+ST(0.076430303,0.18837043,0,0.07206248,0.1830344,0,0.077619244,0.18028791,0){1444535.6,1716055.3,1471797.4,-2574453.4,-2879815.5,-2389894.4,569102.25,236909.5,18944.546,2129625.3,2719220.1,2378251.6,-2235391.7,-2081132.3,-1502642.9};
+ST(0.027249449,0.18607819,0,0.021212478,0.18688263,0,0.021251228,0.18136297,0){1646413.8,1339179.6,1398279.8,-2861109.6,-2348119.2,-2300353.4,464444.42,429909.33,85724.805,2518610.9,2024227.8,2245163.6,-2323177.4,-1955356.8,-1534338.6};
+ST(0.072908259,0.24139656,0,0.066600159,0.24211306,0,0.070607657,0.23670872,0){881474.92,1004296.2,1007105.3,-2322734,-2655015,-2594870.8,2916335.3,3359675.2,3083897.2,-2445637.4,-2867211.3,-2267120.1,1082242,1352854.8,490193.02};
+ST(0.089230742,0.11966768,0,0.094962535,0.11849101,0,0.093823791,0.12410599,0){1043332.5,497557.04,595735.92,-391602.7,-175139.73,-276601.23,-1287980.7,-611084.48,-743959.63,-412950.99,-220851.73,-121937.8,1030099.2,467971.5,678759.2};
+ST(0.038435934,0.058364632,0,0.032659307,0.059686042,0,0.035422008,0.053603109,0){3459248.5,3158137.1,3344502.1,2206750.4,1964024.3,2318078.8,155241.86,27282.242,580213.58,-1952496,-1919818.3,-1335777.4,-3353689.4,-3141270.1,-2842327.2};
+ST(0.050960377,0.23252058,0,0.04727629,0.22823863,0,0.053624899,0.22742186,0){1342135.9,1418822.2,1430137,-3383651.2,-3492237.2,-3503302.1,3804738.6,3684627.2,3648370.9,-2403721.7,-1892328,-1785483,-148681.88,-919608.01,-1060301.4};
+ST(0.025641665,0.25311603,0,0.033025927,0.25326882,0,0.030217898,0.25971254,0){680173.91,809560.38,660621.26,-1879847.5,-2238649.8,-1866014.4,2635470.4,3142273.3,2744196,-2768550.2,-3308331.9,-3141188.1,2247361.6,2697705.3,2987009.7};
+ST(0.017207343,0.22323305,0,0.021374843,0.22646669,0,0.016939848,0.22904958,0){781289.63,906782.43,714788.59,-1865590.4,-2208721,-1767596.2,1807835.2,2264460.9,1888698.3,-643322.1,-1042528.4,-1014237.8,-915362.92,-767856.24,-395054.79};
+ST(0.027746664,0.13122119,0,0.023379755,0.12686903,0,0.030575169,0.1246812,0){2296333.1,2047772.9,2526238.7,-1399007.9,-1065433.1,-1202245.8,-2843055.5,-2558991,-3156412.2,288094.78,-162203.53,-451924.48,2955532.6,2481221.5,2919641.1};
+ST(0.0064812773,0.046734878,0,0.004777904,0.053197076,0,0,0.05,0){761350.4,557925.04,0,582610.88,389224.92,0,267082.8,102822.82,0,-111174.21,-214698.3,0,-463416.67,-467537.22,0};
+ST(0.0094132111,0.052421332,0,0.004777904,0.053197076,0,0.0064812773,0.046734878,0){1088603.4,557925.04,761350.4,768702.62,389224.92,582610.88,222919.17,102822.82,267082.8,-388347.22,-214698.3,-111174.21,-885762.83,-467537.22,-463416.67};
+ST(0.060567191,0.25172758,0,0.061408089,0.24582042,0,0.065478411,0.24860928,0){917440.34,1017142.7,912058.17,-2522838.3,-2732695.2,-2478342.9,3497206.6,3591948.1,3344041.2,-3596815.5,-3325647.6,-3264436.9,2796536,2017029.8,2261773.6};
+ST(0.077619244,0.18028791,0,0.07206248,0.1830344,0,0.071841704,0.17726974,0){1471797.4,1716055.3,1799263.7,-2389894.4,-2879815.5,-2812994.5,18944.546,236909.5,-214389.53,2378251.6,2719220.1,2933842.6,-1502642.9,-2081132.3,-1438939.3};
+ST(0.071841704,0.17726974,0,0.07206248,0.1830344,0,0.066710408,0.18109144,0){1799263.7,1716055.3,1958233.8,-2812994.5,-2879815.5,-3210995.9,-214389.53,236909.5,95959.418,2933842.6,2719220.1,3149708.8,-1438939.3,-2081132.3,-2111256.9};
+ST(0.060859952,0.17787963,0,0.066399282,0.17458324,0,0.066710408,0.18109144,0){2182203,2061554.2,1958233.8,-3438395.7,-3111294.6,-3210995.9,-202892.1,-477290.81,95959.418,3555311.4,3354405.6,3149708.8,-1844119.8,-1230983.2,-2111256.9};
+ST(0.0062494098,0.068021592,0,0.012193394,0.066188359,0,0.011197941,0.071439681,0){709501.16,1364188,1244724.5,364477.97,734639.92,579995.21,-157824.6,-233939.49,-394493.66,-603457.47,-1094586.7,-1158343.6,-756039.79,-1450385,-1303869.8};
+ST(0.016939848,0.22904958,0,0.021374843,0.22646669,0,0.022740693,0.23189018,0){714788.59,906782.43,887604.04,-1767596.2,-2208721,-2230116.3,1888698.3,2264460.9,2485475.6,-1014237.8,-1042528.4,-1529145.6,-395054.79,-767856.24,-172982.46};
+ST(0.019165757,0.095107709,0,0.013714026,0.097839388,0,0.013428016,0.091778472,0){1930971.9,1412613.2,1408980.1,168744.63,55008.627,204626.15,-1747493.7,-1355500.2,-1174648.8,-2069009.1,-1463354,-1549888.7,-502664.26,-165174.7,-600683.83};
+ST(0.053624899,0.22742186,0,0.04727629,0.22823863,0,0.049797208,0.2214244,0){1430137,1418822.2,1551864.2,-3503302.1,-3492237.2,-3662861.4,3648370.9,3684627.2,3430735.4,-1785483,-1892328,-1003918.8,-1060301.4,-919608.01,-2065424.5};
+ST(0.034648589,0.17585937,0,0.038433858,0.18005903,0,0.03345202,0.18222482,0){2080615.7,2131117.1,1947746.5,-3193762.3,-3450732.6,-3237509.5,-371953.81,5612.0128,196057.01,3392886,3447337.8,3107788.7,-1443588.4,-2140463.9,-2254322.8};
+ST(0.028699663,0.054481756,0,0.025565101,0.048609543,0,0.032229878,0.047894836,0){2920693,2702312,3188476.9,1995520.8,2017092.5,2403076.1,438210.61,820389.33,1025710.6,-1257984.1,-584372.75,-604377.64,-2556170.3,-1841258.2,-2086050.7};
+ST(0.03345202,0.18222482,0,0.038433858,0.18005903,0,0.038852293,0.18542603,0){1947746.5,2131117.1,2057873,-3237509.5,-3450732.6,-3549951.2,196057.01,5612.0128,516044.6,3107788.7,3447337.8,3175871.5,-2254322.8,-2140463.9,-2819104.7};
+ST(0.071841704,0.17726974,0,0.066399282,0.17458324,0,0.071059851,0.17209017,0){1799263.7,2061554.2,1900690.4,-2812994.5,-3111294.6,-2772233.4,-214389.53,-477290.81,-629520.98,2933842.6,3354405.6,3060958.1,-1438939.3,-1230983.2,-774142.34};
+ST(0.06137482,0.19024807,0,0.061291474,0.18447479,0,0.06771074,0.1881525,0){1976038.9,2069396,1821405.7,-3592882,-3531333.7,-3238423,963745.22,425331.11,698008.36,2804392.5,3230965.1,2695511.5,-3258719.1,-2708277.6,-2795478.4};
+ST(0.06771074,0.1881525,0,0.061291474,0.18447479,0,0.066710408,0.18109144,0){1821405.7,2069396,1958233.8,-3238423,-3531333.7,-3210995.9,698008.36,425331.11,95959.418,2695511.5,3230965.1,3149708.8,-2795478.4,-2708277.6,-2111256.9};
+ST(0.0081152275,0.10988635,0,0.01198914,0.11616091,0,0.0062042788,0.11791514,0){821145.89,1171325.2,612847.32,-151361.79,-358450.6,-208741.13,-944689.8,-1420119.3,-750565.55,-619246.83,-627101.02,-286207.66,439508.43,984768,561848.67};
+ST(0.0062042788,0.11791514,0,0.01198914,0.11616091,0,0.01093484,0.12117452,0){612847.32,1171325.2,1052666.9,-208741.13,-358450.6,-426753.37,-750565.55,-1420119.3,-1306415.4,-286207.66,-627101.02,-350052.21,561848.67,984768,1098212.1};
+ST(0.081922129,0.20489902,0,0.086709216,0.20730703,0,0.081656406,0.2108727,0){996952.98,734117.03,951384.03,-2081157.6,-1563285.8,-2083808.1,1266338.6,1031586.7,1528962.6,704044.3,398134,263916.4,-2032271.3,-1481512.9,-1843401};
+ST(0.060825265,0.17090728,0,0.066399282,0.17458324,0,0.060859952,0.17787963,0){2288734.2,2061554.2,2182203,-3282960.5,-3111294.6,-3438395.7,-862639.89,-477290.81,-202892.1,3657845.3,3354405.6,3555311.4,-726586.11,-1230983.2,-1844119.8};
+ST(0.084619556,0.23283838,0,0.084319616,0.22565969,0,0.09071018,0.22887426,0){621044.17,696453.76,406264.77,-1568398.7,-1688204.7,-1003622.2,1771426.2,1707540.6,1069446.3,-1133733.9,-743250.94,-568907.82,-42283.716,-649719.93,-233040.27};
+ST(0.078984823,0.22953004,0,0.084319616,0.22565969,0,0.084619556,0.23283838,0){858343.29,696453.76,621044.17,-2128428.8,-1688204.7,-1568398.7,2291087.1,1707540.6,1771426.2,-1261656.1,-743250.94,-1133733.9,-424553.92,-649719.93,-42283.716};
+ST(0.023309936,0.19197185,0,0.025476801,0.19755762,0,0.018704911,0.19716585,0){1390526.6,1423125.8,1103230.1,-2573914.4,-2782737.9,-2149261.2,799964.88,1235431.1,934589.13,1893175.4,1602470.1,1263201.6,-2411477.9,-2766638.2,-2132672.2};
+ST(0.029690249,0.19362013,0,0.025476801,0.19755762,0,0.023309936,0.19197185,0){1647856.1,1423125.8,1390526.6,-3101495.4,-2782737.9,-2573914.4,1088093.1,1235431.1,799964.88,2141745.7,1602470.1,1893175.4,-2977851,-2766638.2,-2411477.9};
+ST(0.038852293,0.18542603,0,0.034128539,0.18892309,0,0.03345202,0.18222482,0){2057873,1872288.6,1947746.5,-3549951.2,-3356683.8,-3237509.5,516044.6,788949.65,196057.01,3175871.5,2731311.2,3107788.7,-2819104.7,-2954777.5,-2254322.8};
+ST(0.039366597,0.19088868,0,0.034128539,0.18892309,0,0.038852293,0.18542603,0){1982365.2,1872288.6,2057873,-3628592.6,-3356683.8,-3549951.2,1030950.1,788949.65,516044.6,2772526.5,2731311.2,3175871.5,-3333638.5,-2954777.5,-2819104.7};
+ST(0.05,0,0,0.051745598,0.0053231545,0,0.046181733,0.0056701177,0){3880596.9,3873250.9,3851009.3,3880622.4,3861228.9,3837454.5,3880662.8,3837214.6,3810385,3880737.9,3801308.2,3769920.5,3880625.6,3753417.7,3715901.2};
+ST(0.045931579,0.29422002,0,0.051526128,0.29458598,0,0.05,0.3,0){116468.36,109871.78,0,-348980.73,-329256.34,0,580225.36,547568.39,0,-809364.6,-764098.34,0,1035478,977975.34,0};
+ST(0.017373248,0.19021363,0,0.021212478,0.18688263,0,0.023309936,0.19197185,0){1095255.9,1339179.6,1390526.6,-1990705.9,-2348119.2,-2573914.4,532263.7,429909.33,799964.88,1555631.8,2024227.8,1893175.4,-1804413.6,-1955356.8,-2411477.9};
+ST(0.08682376,0.20181233,0,0.086709216,0.20730703,0,0.081922129,0.20489902,0){767576.83,734117.03,996952.98,-1560255.4,-1563285.8,-2081157.6,843726.65,1031586.7,1266338.6,688912.23,398134,704044.3,-1555436.8,-1481512.9,-2032271.3};
+ST(0.08466046,0.11619385,0,0.082946441,0.12207685,0,0.077013163,0.11736903,0){1475783,1589878.9,2095773.2,-452604.25,-673263.29,-691227.47,-1789662.1,-1978038.1,-2559181.5,-788262.21,-467139.5,-1023961.4,1243195.1,1708498.9,1873161.8};
+ST(0.065117308,0.15657509,0,0.064971856,0.15110456,0,0.070477538,0.15360968,0){2354870.2,2431817,2153625.7,-2678881.2,-2488096.1,-2316413.6,-1986291.9,-2374265.3,-1978592.7,2952219.2,2543085,2466066.8,1580034,2315361.9,1792310.4};
+ST(0.036308441,0.24745658,0,0.033139613,0.24047735,0,0.040431855,0.24188745,0){958174.94,1026889.2,1110505,-2591684.5,-2694450.7,-2932804,3460190.4,3348643.4,3702149.5,-3307339.6,-2743423.6,-3142324.5,2177878.8,1106136.5,1453973.2};
+ST(0.035422008,0.053603109,0,0.032659307,0.059686042,0,0.028699663,0.054481756,0){3344502.1,3158137.1,2920693,2318078.8,1964024.3,1995520.8,580213.58,27282.242,438210.61,-1335777.4,-1919818.3,-1257984.1,-2842327.2,-3141270.1,-2556170.3};
+ST(0.083337094,0.16031526,0,0.088623123,0.15812222,0,0.088381846,0.16289419,0){1295652.6,918302.92,911153.68,-1575018.8,-1074338,-1156470.7,-956036.82,-735787.48,-599768.12,1781183.7,1199414.9,1317920.1,571788.58,531983.03,244888.24};
+ST(0.029124573,0.24658198,0,0.033139613,0.24047735,0,0.036308441,0.24745658,0){849052.23,1026889.2,958174.94,-2288340.2,-2694450.7,-2591684.5,3030093.5,3348643.4,3460190.4,-2848204.4,-2743423.6,-3307339.6,1797881.3,1106136.5,2177878.8};
+ST(0.058552205,0.15400025,0,0.064971856,0.15110456,0,0.065117308,0.15657509,0){2589572.8,2431817,2354870.2,-2806487.5,-2488096.1,-2678881.2,-2354581.2,-2374265.3,-1986291.9,3003966,2543085,2952219.2,2103059.1,2315361.9,1580034};
+ST(0.026971271,0.22659033,0,0.02301506,0.22157032,0,0.029518097,0.21985532,0){1090633.5,1025043.6,1264894.2,-2658504.1,-2421684.9,-2954793.2,2731189,2274566.1,2682751.8,-1267784.1,-677461.35,-629411.95,-909068.56,-1351813.7,-1842177.8};
+ST(0.029518097,0.21985532,0,0.02301506,0.22157032,0,0.02463475,0.21609565,0){1264894.2,1025043.6,1153636.1,-2954793.2,-2421684.9,-2626116.1,2682751.8,2274566.1,2198315,-629411.95,-677461.35,-179791.92,-1842177.8,-1351813.7,-1969098.8};
+ST(0.038852293,0.18542603,0,0.038433858,0.18005903,0,0.043573225,0.18196099,0){2057873,2131117.1,2202933.2,-3549951.2,-3450732.6,-3650165.7,516044.6,5612.0128,195066.32,3175871.5,3447337.8,3522129.2,-2819104.7,-2140463.9,-2509350};
+ST(0.095652827,0.22622146,0,0.095706332,0.23121352,0,0.09071018,0.22887426,0){199039.37,183910.78,406264.77,-484109.58,-460364.34,-1003622.2,494313.66,508106.39,1069446.3,-223837.82,-303408.65,-568907.82,-173819.74,-52245.513,-233040.27};
+ST(0.066710408,0.18109144,0,0.061291474,0.18447479,0,0.060859952,0.17787963,0){1958233.8,2069396,2182203,-3210995.9,-3531333.7,-3438395.7,95959.418,425331.11,-202892.1,3149708.8,3230965.1,3555311.4,-2111256.9,-2708277.6,-1844119.8};
+ST(0.09123018,0.070922096,0,0.086276325,0.073599227,0,0.085646934,0.067722415,0){983713.53,1502743.3,1585902.9,465586.72,653401.45,821166.94,-297764.17,-565297.67,-339583.13,-904277.98,-1464602.7,-1336670.3,-1034644.8,-1536324.4,-1689538.4};
+ST(0.085646934,0.067722415,0,0.086276325,0.073599227,0,0.080160084,0.071577727,0){1585902.9,1502743.3,2107851.9,821166.94,653401.45,977984.82,-339583.13,-565297.67,-676141.96,-1336670.3,-1464602.7,-1967920.1,-1689538.4,-1536324.4,-2205119.3};
+ST(0.09123018,0.070922096,0,0.095867013,0.068756454,0,0.095795895,0.073622969,0){983713.53,470210.65,473503.74,465586.72,236792.42,205720.2,-297764.17,-114175.46,-178405.32,-904277.98,-408471.99,-461642.03,-1034644.8,-500215.61,-483922.03};
+ST(0.02301506,0.22157032,0,0.021374843,0.22646669,0,0.017207343,0.22323305,0){1025043.6,906782.43,781289.63,-2421684.9,-2208721,-1865590.4,2274566.1,2264460.9,1807835.2,-677461.35,-1042528.4,-643322.1,-1351813.7,-767856.24,-915362.92};
+ST(0.041643161,0.17482395,0,0.038433858,0.18005903,0,0.034648589,0.17585937,0){2284160.6,2131117.1,2080615.7,-3458410.7,-3450732.6,-3193762.3,-506290.81,5612.0128,-371953.81,3718851.8,3447337.8,3392886,-1405815.9,-2140463.9,-1443588.4};
+ST(0.082709707,0.12855445,0,0.082946441,0.12207685,0,0.087905667,0.12517971,0){1568327.1,1589878.9,1140990.9,-869760.99,-673263.29,-554517.87,-1955764.1,-1978038.1,-1425990.8,-1353.9511,-467139.5,-178453.87,1955094.7,1708498.9,1334087.8};
+ST(0.095090425,0.2489538,0,0.095492809,0.25375881,0,0.090077759,0.25268961,0){157454.16,131307.15,291813.61,-428416.46,-363726.6,-805257.31,579817.55,512510.07,1125037.4,-569427.53,-543451.99,-1174248.1,400020.01,449348.78,940920.06};
+ST(0.08974924,0.047235181,0,0.095360834,0.0462161,0,0.094913401,0.051076335,0){1190814.4,547145.45,595503.05,905328.07,421466.87,429138.45,402804.56,198977.54,142901.48,-196265.4,-69217.008,-183223.65,-748421.11,-321602.09,-458373.75};
+ST(0.1,0.22857143,0,0.095706332,0.23121352,0,0.095652827,0.22622146,0){0,183910.78,199039.37,0,-460364.34,-484109.58,0,508106.39,494313.66,0,-303408.65,-223837.82,0,-52245.513,-173819.74};
+ST(0.049213686,0.13705186,0,0.044512931,0.13802764,0,0.045894811,0.13135905,0){2922689.8,2867370.6,2973475.7,-2132523.3,-2150242,-1819976.4,-3499251.9,-3405187.4,-3679581.9,1186505.2,1298632.3,392676.16,3819996.4,3729885,3832095.1};
+ST(0.047918899,0.14257657,0,0.044512931,0.13802764,0,0.049213686,0.13705186,0){2842478.3,2867370.6,2922689.8,-2400971.6,-2150242,-2132523.3,-3215455,-3405187.4,-3499251.9,1901551.7,1298632.3,1186505.2,3510918.5,3729885,3819996.4};
+ST(0.026971271,0.22659033,0,0.021374843,0.22646669,0,0.02301506,0.22157032,0){1090633.5,906782.43,1025043.6,-2658504.1,-2208721,-2421684.9,2731189,2264460.9,2274566.1,-1267784.1,-1042528.4,-677461.35,-909068.56,-767856.24,-1351813.7};
+ST(0.095795895,0.073622969,0,0.095867013,0.068756454,0,0.1,0.071428571,0){473503.74,470210.65,0,205720.2,236792.42,0,-178405.32,-114175.46,0,-461642.03,-408471.99,0,-483922.03,-500215.61,0};
+};
diff --git a/demos/view02.pos b/demos/view02.pos
new file mode 100644
index 0000000000000000000000000000000000000000..2ab8e8d29a8df45e3df0670cdba32a7491c8a22b
--- /dev/null
+++ b/demos/view02.pos
@@ -0,0 +1,362 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Vector map on points
+
+   All important comments are marked with "README"
+*/
+
+View "a vector map" {
+VP(1e-06,1e-06,0){0,0,122.26654,0,0,122.45426,0,0,122.82769,0,0,123.38417,0,0,124.20759};
+VP(1e-06,0.010000933,0){0,0,121.95116,0,0,120.60823,0,0,117.93735,0,0,113.96957,0,0,108.76298};
+VP(1e-06,0.020000867,0){0,0,121.76276,0,0,116.4134,0,0,105.95451,0,0,90.855892,0,0,71.867727};
+VP(1e-06,0.0300008,0){0,0,120.79673,0,0,108.95219,0,0,86.42978,0,0,55.448276,0,0,19.067191};
+VP(1e-06,0.040000733,0){0,0,119.6291,0,0,98.888056,0,0,61.048627,0,0,12.75009,0,0,-37.476665};
+VP(1e-06,0.050000667,0){0,0,118.01437,0,0,86.430423,0,0,31.638139,0,0,-31.806471,0,0,-86.912688};
+VP(1e-06,0.0600006,0){0,0,116.49231,0,0,71.947632,0,0,0.0082419918,0,0,-71.673337,0,0,-115.66034};
+VP(1e-06,0.070000533,0){0,0,114.18838,0,0,55.530819,0,0,-31.604761,0,0,-102.40655,0,0,-120.49233};
+VP(1e-06,0.080000467,0){0,0,111.73884,0,0,37.77248,0,0,-61.122995,0,0,-119.44024,0,0,-98.690267};
+VP(1e-06,0.0900004,0){0,0,109.02764,0,0,19.140014,0,0,-86.347807,0,0,-120.39736,0,0,-55.210037};
+VP(1e-06,0.10000033,0){0,0,105.89652,0,0,-0.0065380069,0,0,-106.09757,0,0,-106.26766,0,0,0.10907541};
+VP(1e-06,0.11000027,0){0,0,102.73901,0,0,-19.150688,0,0,-118.07603,0,0,-76.769682,0,0,55.222067};
+VP(1e-06,0.1200002,0){0,0,98.952931,0,0,-37.767065,0,0,-122.22482,0,0,-37.780096,0,0,98.736188};
+VP(1e-06,0.13000013,0){0,0,95.122755,0,0,-55.584271,0,0,-118.15756,0,0,6.4473841,0,0,120.69955};
+VP(1e-06,0.14000007,0){0,0,90.852382,0,0,-71.806307,0,0,-105.6782,0,0,49.526055,0,0,115.53689};
+VP(1e-06,0.15,0){0,0,86.563988,0,0,-86.610866,0,0,-86.776431,0,0,86.913071,0,0,87.233235};
+VP(1e-06,0.15999993,0){0,0,81.861739,0,0,-98.925044,0,0,-61.054707,0,0,111.37293,0,0,37.582303};
+VP(1e-06,0.16999987,0){0,0,76.880554,0,0,-108.83108,0,0,-31.635178,0,0,121.95453,0,0,-19.051124};
+VP(1e-06,0.1799998,0){0,0,71.93248,0,0,-116.3445,0,0,0.0051803424,0,0,116.09977,0,0,-71.614187};
+VP(1e-06,0.18999973,0){0,0,66.655881,0,0,-120.84615,0,0,31.684673,0,0,94.843218,0,0,-108.67685};
+VP(1e-06,0.19999967,0){0,0,61.126812,0,0,-122.30122,0,0,61.195533,0,0,61.281721,0,0,-122.75882};
+VP(1e-06,0.2099996,0){0,0,55.454746,0,0,-120.62189,0,0,86.3266,0,0,19.057229,0,0,-108.50779};
+VP(1e-06,0.21999953,0){0,0,49.765538,0,0,-116.57634,0,0,106.4713,0,0,-25.419128,0,0,-73.667176};
+VP(1e-06,0.22999947,0){0,0,43.853336,0,0,-109.05425,0,0,118.28173,0,0,-66.779805,0,0,-19.027558};
+VP(1e-06,0.2399994,0){0,0,37.808977,0,0,-98.930918,0,0,122.15279,0,0,-98.667764,0,0,37.647079};
+VP(1e-06,0.24999933,0){0,0,31.614973,0,0,-86.420956,0,0,118.17907,0,0,-118.35504,0,0,86.812866};
+VP(1e-06,0.25999927,0){0,0,25.446319,0,0,-71.890336,0,0,105.77788,0,0,-121.22558,0,0,115.63648};
+VP(1e-06,0.2699992,0){0,0,19.147235,0,0,-55.558139,0,0,86.505401,0,0,-108.94986,0,0,120.6783};
+VP(1e-06,0.27999913,0){0,0,12.792336,0,0,-37.809277,0,0,61.14898,0,0,-81.777482,0,0,98.845675};
+VP(1e-06,0.28999907,0){0,0,6.3850865,0,0,-19.083517,0,0,31.567694,0,0,-43.697424,0,0,55.414892};
+VP(1e-06,0.299999,0){0,0,0.0095385519,0,0,-0.03787688,0,0,0.093923584,0,0,-0.19582795,0,0,0.49155762};
+
+VP(0.0100008,1e-06,0){0,0,1199420,0,0,1199413.7,0,0,1199397.9,0,0,1199378.4,0,0,1199403.4};
+VP(0.0100008,0.010000933,0){0,0,1197824.3,0,0,1184734.2,0,0,1158699.2,0,0,1120019.6,0,0,1069149};
+VP(0.0100008,0.020000867,0){0,0,1192912,0,0,1140722,0,0,1038620.8,0,0,891080.74,0,0,704676.89};
+VP(0.0100008,0.0300008,0){0,0,1184493.3,0,0,1068498.7,0,0,847865.42,0,0,544204.94,0,0,187350.11};
+VP(0.0100008,0.040000733,0){0,0,1173023.5,0,0,970311.11,0,0,599870.71,0,0,125642.73,0,0,-370468.19};
+VP(0.0100008,0.050000667,0){0,0,1158406,0,0,848028.9,0,0,310455.27,0,0,-310247.58,0,0,-847690.45};
+VP(0.0100008,0.0600006,0){0,0,1141160.6,0,0,705256.28,0,0,-99.915745,0,0,-705541.47,0,0,-1141600.4};
+VP(0.0100008,0.070000533,0){0,0,1119507.8,0,0,544453.75,0,0,-310310.46,0,0,-1005770.5,0,0,-1184662.4};
+VP(0.0100008,0.080000467,0){0,0,1095510.9,0,0,370556.44,0,0,-599794.43,0,0,-1173524.1,0,0,-970723.46};
+VP(0.0100008,0.0900004,0){0,0,1068561,0,0,187606.05,0,0,-848133.51,0,0,-1184824.1,0,0,-544820.04};
+VP(0.0100008,0.10000033,0){0,0,1038622.4,0,0,59.994402,0,0,-1038526.3,0,0,-1038609.6,0,0,-114.10057};
+VP(0.0100008,0.11000027,0){0,0,1006283.9,0,0,-187756.34,0,0,-1159127,0,0,-755186.39,0,0,544970.98};
+VP(0.0100008,0.1200002,0){0,0,970146.83,0,0,-370533.83,0,0,-1199206,0,0,-370700.66,0,0,970167.63};
+VP(0.0100008,0.13000013,0){0,0,932049.4,0,0,-544524.54,0,0,-1158572.3,0,0,62773.626,0,0,1184972.7};
+VP(0.0100008,0.14000007,0){0,0,891093.35,0,0,-704750.35,0,0,-1038220.5,0,0,487590.9,0,0,1139583.1};
+VP(0.0100008,0.15,0){0,0,848043.94,0,0,-848162.19,0,0,-847974.76,0,0,848328.9,0,0,847991.67};
+VP(0.0100008,0.15999993,0){0,0,802591.51,0,0,-970520.77,0,0,-600078.94,0,0,1096713.1,0,0,371678.95};
+VP(0.0100008,0.16999987,0){0,0,754801.61,0,0,-1068627.9,0,0,-310284.17,0,0,1197257.1,0,0,-187594.97};
+VP(0.0100008,0.1799998,0){0,0,704861.79,0,0,-1140475,0,0,-9.7592105,0,0,1140481.7,0,0,-704943.27};
+VP(0.0100008,0.18999973,0){0,0,653101.17,0,0,-1184459.4,0,0,310527.61,0,0,931931.51,0,0,-1068734.2};
+VP(0.0100008,0.19999967,0){0,0,599592.55,0,0,-1199104.4,0,0,599503.9,0,0,599267.34,0,0,-1198494.7};
+VP(0.0100008,0.2099996,0){0,0,544384.89,0,0,-1184212.9,0,0,847613.27,0,0,187425.67,0,0,-1067044.3};
+VP(0.0100008,0.21999953,0){0,0,487650.97,0,0,-1140248.2,0,0,1038317,0,0,-249363.16,0,0,-704669.35};
+VP(0.0100008,0.22999947,0){0,0,429775.49,0,0,-1068467.4,0,0,1158136.7,0,0,-652849.84,0,0,-187529.03};
+VP(0.0100008,0.2399994,0){0,0,370742.76,0,0,-970651.21,0,0,1199863,0,0,-970733.39,0,0,370606.77};
+VP(0.0100008,0.24999933,0){0,0,310389.76,0,0,-847996.97,0,0,1158383,0,0,-1158385.8,0,0,848238.2};
+VP(0.0100008,0.25999927,0){0,0,249381.35,0,0,-705070.58,0,0,1038980.9,0,0,-1193427.1,0,0,1141624.8};
+VP(0.0100008,0.2699992,0){0,0,187667.19,0,0,-544609.42,0,0,848186.21,0,0,-1068663.7,0,0,1184526.1};
+VP(0.0100008,0.27999913,0){0,0,125343.27,0,0,-370542.57,0,0,599521.08,0,0,-802247.4,0,0,969885.37};
+VP(0.0100008,0.28999907,0){0,0,62767.644,0,0,-187609.66,0,0,310381.87,0,0,-429732.38,0,0,544296.89};
+VP(0.0100008,0.299999,0){0,0,6.2613191,0,0,-18.79568,0,0,31.365281,0,0,-43.993284,0,0,56.787457};
+
+VP(0.0200006,1e-06,0){0,0,2280709.8,0,0,2280750.8,0,0,2280828.8,0,0,2280959.2,0,0,2281129.6};
+VP(0.0200006,0.010000933,0){0,0,2278084.8,0,0,2253198.7,0,0,2203663.2,0,0,2129974,0,0,2032919.9};
+VP(0.0200006,0.020000867,0){0,0,2268407.5,0,0,2169311.8,0,0,1975439,0,0,1695261.3,0,0,1341077.3};
+VP(0.0200006,0.0300008,0){0,0,2252723.5,0,0,2032071.2,0,0,1612411.9,0,0,1034928.7,0,0,356247.55};
+VP(0.0200006,0.040000733,0){0,0,2231113.2,0,0,1845403.9,0,0,1140636.4,0,0,238607.96,0,0,-704725};
+VP(0.0200006,0.050000667,0){0,0,2203326.5,0,0,1612958.8,0,0,590304.13,0,0,-590735.99,0,0,-1613764.5};
+VP(0.0200006,0.0600006,0){0,0,2169459.4,0,0,1340689.5,0,0,-253.26048,0,0,-1341167.5,0,0,-2169964.1};
+VP(0.0200006,0.070000533,0){0,0,2129890.6,0,0,1035882.8,0,0,-590292.11,0,0,-1913508.9,0,0,-2254296.8};
+VP(0.0200006,0.080000467,0){0,0,2083910,0,0,704847.45,0,0,-1140765.6,0,0,-2231594.2,0,0,-1845800.6};
+VP(0.0200006,0.0900004,0){0,0,2032367.2,0,0,356748.59,0,0,-1612959.6,0,0,-2252643.6,0,0,-1034806.6};
+VP(0.0200006,0.10000033,0){0,0,1975611.2,0,0,57.943352,0,0,-1975420.4,0,0,-1975504.9,0,0,-426.45724};
+VP(0.0200006,0.11000027,0){0,0,1913315.4,0,0,-356703.47,0,0,-2203743.9,0,0,-1436328.1,0,0,1035508.3};
+VP(0.0200006,0.1200002,0){0,0,1845574.3,0,0,-704966.07,0,0,-2281489.6,0,0,-705279.75,0,0,1845900.6};
+VP(0.0200006,0.13000013,0){0,0,1772685.9,0,0,-1035509.4,0,0,-2203500.9,0,0,119407.19,0,0,2253641.5};
+VP(0.0200006,0.14000007,0){0,0,1695112.7,0,0,-1340923.1,0,0,-1975160.6,0,0,928234.38,0,0,2168753.8};
+VP(0.0200006,0.15,0){0,0,1612735.8,0,0,-1612718.7,0,0,-1612310.8,0,0,1612112.4,0,0,1611635.4};
+VP(0.0200006,0.15999993,0){0,0,1526063.3,0,0,-1845120.2,0,0,-1140155.4,0,0,2083304.9,0,0,704343.18};
+VP(0.0200006,0.16999987,0){0,0,1435361,0,0,-2032273.5,0,0,-590286.74,0,0,2277973.9,0,0,-357113.77};
+VP(0.0200006,0.1799998,0){0,0,1340603.7,0,0,-2169104.8,0,0,-187.59264,0,0,2169344.4,0,0,-1340174.3};
+VP(0.0200006,0.18999973,0){0,0,1242326.7,0,0,-2253004.8,0,0,590488.21,0,0,1772854.2,0,0,-2032869.4};
+VP(0.0200006,0.19999967,0){0,0,1140484.2,0,0,-2281080.6,0,0,1140863.6,0,0,1140070,0,0,-2281239};
+VP(0.0200006,0.2099996,0){0,0,1035459.2,0,0,-2252611.6,0,0,1612490.4,0,0,356944.25,0,0,-2031783};
+VP(0.0200006,0.21999953,0){0,0,927776.85,0,0,-2169354.9,0,0,1975370.5,0,0,-474298.34,0,0,-1340371.5};
+VP(0.0200006,0.22999947,0){0,0,817407.12,0,0,-2032357.3,0,0,2203356.6,0,0,-1242461.5,0,0,-356900.43};
+VP(0.0200006,0.2399994,0){0,0,704976.55,0,0,-1845571.3,0,0,2281095,0,0,-1845366.1,0,0,705164.78};
+VP(0.0200006,0.24999933,0){0,0,590364.42,0,0,-1612953.4,0,0,2203467,0,0,-2203634.2,0,0,1613249.1};
+VP(0.0200006,0.25999927,0){0,0,474194.23,0,0,-1340559.8,0,0,1975062.6,0,0,-2267979.5,0,0,2168670.2};
+VP(0.0200006,0.2699992,0){0,0,356872.34,0,0,-1035606,0,0,1612764.1,0,0,-2031781.9,0,0,2251747.9};
+VP(0.0200006,0.27999913,0){0,0,238392.68,0,0,-704748.96,0,0,1140275,0,0,-1525901.8,0,0,1844805.9};
+VP(0.0200006,0.28999907,0){0,0,119394.11,0,0,-356902.82,0,0,590587.11,0,0,-817934.15,0,0,1036489.1};
+VP(0.0200006,0.299999,0){0,0,11.932618,0,0,-35.829397,0,0,59.820438,0,0,-83.966334,0,0,108.36963};
+
+VP(0.0300004,1e-06,0){0,0,3139675.3,0,0,3139674.2,0,0,3139668.3,0,0,3139681.7,0,0,3139723.8};
+VP(0.0300004,0.010000933,0){0,0,3135081.7,0,0,3100734,0,0,3032371.9,0,0,2930692.9,0,0,2796805.3};
+VP(0.0300004,0.020000867,0){0,0,3122126.6,0,0,2985595.8,0,0,2718520.5,0,0,2332639.4,0,0,1845013.2};
+VP(0.0300004,0.0300008,0){0,0,3101041.9,0,0,2797472.5,0,0,2220045.5,0,0,1425300.7,0,0,491065.86};
+VP(0.0300004,0.040000733,0){0,0,3070989.4,0,0,2539964.8,0,0,1569772.9,0,0,328239.6,0,0,-969845.82};
+VP(0.0300004,0.050000667,0){0,0,3032446.4,0,0,2219926.7,0,0,812540.71,0,0,-812639.58,0,0,-2220026.5};
+VP(0.0300004,0.0600006,0){0,0,2985693.7,0,0,1845152.9,0,0,-174.73805,0,0,-1845312.5,0,0,-2985526.4};
+VP(0.0300004,0.070000533,0){0,0,2930943,0,0,1425196.7,0,0,-812730.34,0,0,-2633146.4,0,0,-3100929.6};
+VP(0.0300004,0.080000467,0){0,0,2867944.7,0,0,970103.04,0,0,-1569472.5,0,0,-3070185.6,0,0,-2539414};
+VP(0.0300004,0.0900004,0){0,0,2797367.8,0,0,491226.4,0,0,-2219884.6,0,0,-3100886.7,0,0,-1425369.6};
+VP(0.0300004,0.10000033,0){0,0,2718698.5,0,0,12.448978,0,0,-2718622.2,0,0,-2718532.7,0,0,51.841297};
+VP(0.0300004,0.11000027,0){0,0,2633088.6,0,0,-490806.8,0,0,-3032414,0,0,-1976012.9,0,0,1425239.2};
+VP(0.0300004,0.1200002,0){0,0,2539832.3,0,0,-970162.37,0,0,-3139509.6,0,0,-970062.59,0,0,2540261.1};
+VP(0.0300004,0.13000013,0){0,0,2439829.8,0,0,-1425373.6,0,0,-3032567.4,0,0,164237.87,0,0,3100974.7};
+VP(0.0300004,0.14000007,0){0,0,2333010.1,0,0,-1845587,0,0,-2718525,0,0,1277556.1,0,0,2985337.9};
+VP(0.0300004,0.15,0){0,0,2219900.9,0,0,-2219866.5,0,0,-2219894.7,0,0,2219752.1,0,0,2219752};
+VP(0.0300004,0.15999993,0){0,0,2100853.7,0,0,-2539747.5,0,0,-1570223,0,0,2867706.4,0,0,971142.34};
+VP(0.0300004,0.16999987,0){0,0,1975706.3,0,0,-2797278.9,0,0,-812588.34,0,0,3135118.2,0,0,-490528.6};
+VP(0.0300004,0.1799998,0){0,0,1845354.4,0,0,-2985881,0,0,194.8881,0,0,2985631.7,0,0,-1845788.8};
+VP(0.0300004,0.18999973,0){0,0,1709967.7,0,0,-3100810.8,0,0,812260.37,0,0,2439906.4,0,0,-2796702.4};
+VP(0.0300004,0.19999967,0){0,0,1569708,0,0,-3139313,0,0,1569373.5,0,0,1570104.7,0,0,-3139262.4};
+VP(0.0300004,0.2099996,0){0,0,1425339.6,0,0,-3100757.9,0,0,2219408.5,0,0,492050.16,0,0,-2797743.3};
+VP(0.0300004,0.21999953,0){0,0,1276986.2,0,0,-2985936.9,0,0,2719040,0,0,-652907.22,0,0,-1845598.7};
+VP(0.0300004,0.22999947,0){0,0,1125215.1,0,0,-2797495.5,0,0,3032403.5,0,0,-1709234.6,0,0,-492137.13};
+VP(0.0300004,0.2399994,0){0,0,970144.1,0,0,-2539846.2,0,0,3139378.7,0,0,-2539753.5,0,0,970193.03};
+VP(0.0300004,0.24999933,0){0,0,812491.11,0,0,-2219797.3,0,0,3032408.6,0,0,-3032616.7,0,0,2220319.1};
+VP(0.0300004,0.25999927,0){0,0,652744.28,0,0,-1845353.3,0,0,2718873,0,0,-3122299.7,0,0,2985657.6};
+VP(0.0300004,0.2699992,0){0,0,491182.49,0,0,-1425463.8,0,0,2220200.9,0,0,-2797555.2,0,0,3100901.2};
+VP(0.0300004,0.27999913,0){0,0,328155.37,0,0,-970088.48,0,0,1569536.1,0,0,-2100275,0,0,2539087.9};
+VP(0.0300004,0.28999907,0){0,0,164322.66,0,0,-491193.3,0,0,812760.14,0,0,-1125540.5,0,0,1426162.8};
+VP(0.0300004,0.299999,0){0,0,16.41221,0,0,-49.283756,0,0,82.296358,0,0,-115.54157,0,0,149.15109};
+
+VP(0.0400002,1e-06,0){0,0,3690601,0,0,3690618.3,0,0,3690645.2,0,0,3690704.6,0,0,3690664.7};
+VP(0.0400002,0.010000933,0){0,0,3685613.9,0,0,3645169.9,0,0,3564706,0,0,3445103.4,0,0,3287752.7};
+VP(0.0400002,0.020000867,0){0,0,3670390,0,0,3509941.7,0,0,3196044,0,0,2742426.5,0,0,2168876.8};
+VP(0.0400002,0.0300008,0){0,0,3645136.4,0,0,3288267.4,0,0,2609470.8,0,0,1675240.9,0,0,577177.72};
+VP(0.0400002,0.040000733,0){0,0,3610077.5,0,0,2985786.8,0,0,1845166.8,0,0,385493.72,0,0,-1140750.8};
+VP(0.0400002,0.050000667,0){0,0,3564912,0,0,2609684.4,0,0,955168.57,0,0,-955315.6,0,0,-2609786};
+VP(0.0400002,0.0600006,0){0,0,3510060.8,0,0,2169168.8,0,0,-365.39657,0,0,-2169708.4,0,0,-3510148.3};
+VP(0.0400002,0.070000533,0){0,0,3445393.7,0,0,1675298.9,0,0,-955611.95,0,0,-3095666.7,0,0,-3645126.2};
+VP(0.0400002,0.080000467,0){0,0,3371365.8,0,0,1140256.7,0,0,-1845633.7,0,0,-3610102,0,0,-2984730.7};
+VP(0.0400002,0.0900004,0){0,0,3288335.2,0,0,577001.33,0,0,-2610140.5,0,0,-3645082,0,0,-1674262.7};
+VP(0.0400002,0.10000033,0){0,0,3196271.4,0,0,254.08427,0,0,-3196008.5,0,0,-3196774.9,0,0,-1623.5529};
+VP(0.0400002,0.11000027,0){0,0,3095219.5,0,0,-577212.68,0,0,-3564731.5,0,0,-2322463.3,0,0,1675686.6};
+VP(0.0400002,0.1200002,0){0,0,2985782.7,0,0,-1140499.3,0,0,-3690667.2,0,0,-1140462.4,0,0,2985892.1};
+VP(0.0400002,0.13000013,0){0,0,2868207.9,0,0,-1675702.3,0,0,-3564761.1,0,0,193912.15,0,0,3645088.9};
+VP(0.0400002,0.14000007,0){0,0,2742715.8,0,0,-2169258.5,0,0,-3196241.2,0,0,1500944.4,0,0,3510035.4};
+VP(0.0400002,0.15,0){0,0,2609776.1,0,0,-2609718.6,0,0,-2609840.3,0,0,2609858.9,0,0,2609702.7};
+VP(0.0400002,0.15999993,0){0,0,2469571.8,0,0,-2985800.7,0,0,-1845535.8,0,0,3371611.7,0,0,1141234.7};
+VP(0.0400002,0.16999987,0){0,0,2322604.7,0,0,-3288363.7,0,0,-955261.93,0,0,3685749,0,0,-577636.64};
+VP(0.0400002,0.1799998,0){0,0,2169316.4,0,0,-3510075.5,0,0,26.796365,0,0,3510181.1,0,0,-2169230};
+VP(0.0400002,0.18999973,0){0,0,2010118.7,0,0,-3645239.4,0,0,955058.82,0,0,2868420.1,0,0,-3288332.2};
+VP(0.0400002,0.19999967,0){0,0,1845375.9,0,0,-3690719.5,0,0,1845270.8,0,0,1845577.9,0,0,-3691037.1};
+VP(0.0400002,0.2099996,0){0,0,1675632.4,0,0,-3645342.3,0,0,2609442.4,0,0,578081.72,0,0,-3289083.8};
+VP(0.0400002,0.21999953,0){0,0,1501170.4,0,0,-3510092.5,0,0,3196169.1,0,0,-767085.88,0,0,-2169730.2};
+VP(0.0400002,0.22999947,0){0,0,1322642.5,0,0,-3288389.9,0,0,3564726.5,0,0,-2009812.9,0,0,-577466.5};
+VP(0.0400002,0.2399994,0){0,0,1140541.4,0,0,-2985927.6,0,0,3690606.2,0,0,-2985167.7,0,0,1138794.3};
+VP(0.0400002,0.24999933,0){0,0,955283.2,0,0,-2609818.4,0,0,3564929,0,0,-3564727.2,0,0,2609440.2};
+VP(0.0400002,0.25999927,0){0,0,767387.9,0,0,-2169450.2,0,0,3196377.4,0,0,-3670707.8,0,0,3510598.4};
+VP(0.0400002,0.2699992,0){0,0,577445.52,0,0,-1675755.3,0,0,2609890,0,0,-3288365.9,0,0,3644890.1};
+VP(0.0400002,0.27999913,0){0,0,385709.6,0,0,-1140260.5,0,0,1844946.8,0,0,-2468928.8,0,0,2984936.9};
+VP(0.0400002,0.28999907,0){0,0,193250.5,0,0,-577630.78,0,0,955676.02,0,0,-1323236.2,0,0,1676345.5};
+VP(0.0400002,0.299999,0){0,0,19.269892,0,0,-57.855448,0,0,96.578279,0,0,-135.52806,0,0,174.821};
+
+VP(0.05,1e-06,0){0,0,3880596.9,0,0,3880622.3,0,0,3880662.8,0,0,3880737.8,0,0,3880625.5};
+VP(0.05,0.010000933,0){0,0,3875257,0,0,3832814.6,0,0,3748396.3,0,0,3622968.9,0,0,3457852};
+VP(0.05,0.020000867,0){0,0,3859325.9,0,0,3690717.6,0,0,3360871,0,0,2884239.7,0,0,2281724.7};
+VP(0.05,0.0300008,0){0,0,3832795.1,0,0,3457585.2,0,0,2743849,0,0,1761412.2,0,0,606299.02};
+VP(0.05,0.040000733,0){0,0,3795748.5,0,0,3139286.7,0,0,1939875.1,0,0,404959.06,0,0,-1199883.6};
+VP(0.05,0.050000667,0){0,0,3748343.4,0,0,2744093.2,0,0,1004669.5,0,0,-1003856.9,0,0,-2743333.1};
+VP(0.05,0.0600006,0){0,0,3690625.2,0,0,2281073.8,0,0,326.84409,0,0,-2280514,0,0,-3690376.4};
+VP(0.05,0.070000533,0){0,0,3622800.6,0,0,1761625.1,0,0,-1004534.7,0,0,-3254609.6,0,0,-3832806.6};
+VP(0.05,0.080000467,0){0,0,3545045.4,0,0,1198951.3,0,0,-1940576.3,0,0,-3795861.1,0,0,-3139212.2};
+VP(0.05,0.0900004,0){0,0,3457595.9,0,0,606786.66,0,0,-2744419.3,0,0,-3832656.4,0,0,-1760172.9};
+VP(0.05,0.10000033,0){0,0,3360657,0,0,-97.27265,0,0,-3360730.3,0,0,-3360689.2,0,0,-290.22172};
+VP(0.05,0.11000027,0){0,0,3254514.6,0,0,-607227.37,0,0,-3748501,0,0,-2441826.2,0,0,1762467.9};
+VP(0.05,0.1200002,0){0,0,3139405.5,0,0,-1199386.9,0,0,-3880582.8,0,0,-1198369.5,0,0,3140304.6};
+VP(0.05,0.13000013,0){0,0,3015739.1,0,0,-1761864.9,0,0,-3748289.9,0,0,203145.44,0,0,3832787.8};
+VP(0.05,0.14000007,0){0,0,2883822,0,0,-2280986.9,0,0,-3360663.5,0,0,1578441.1,0,0,3690799.9};
+VP(0.05,0.15,0){0,0,2744031.4,0,0,-2743835.6,0,0,-2744150.4,0,0,2743895.2,0,0,2743942.5};
+VP(0.05,0.15999993,0){0,0,2596561.2,0,0,-3139538.8,0,0,-1940150.4,0,0,3545079.6,0,0,1199618.1};
+VP(0.05,0.16999987,0){0,0,2442166,0,0,-3457549.3,0,0,-1004623.5,0,0,3875273.7,0,0,-606466.48};
+VP(0.05,0.1799998,0){0,0,2280926.6,0,0,-3690675.6,0,0,228.51305,0,0,3690556.3,0,0,-2281736.6};
+VP(0.05,0.18999973,0){0,0,2113533.1,0,0,-3832797.1,0,0,1004136.5,0,0,3016195.2,0,0,-3457260.9};
+VP(0.05,0.19999967,0){0,0,1940296,0,0,-3880556.8,0,0,1940292.4,0,0,1940128.9,0,0,-3880527.5};
+VP(0.05,0.2099996,0){0,0,1761773.3,0,0,-3832816.6,0,0,2743897.2,0,0,607237.83,0,0,-3457747.5};
+VP(0.05,0.21999953,0){0,0,1578460.3,0,0,-3690740.5,0,0,3360363.1,0,0,-805756.13,0,0,-2282297.4};
+VP(0.05,0.22999947,0){0,0,1390737.8,0,0,-3457708.4,0,0,3748297.1,0,0,-2113265.5,0,0,-607333.08};
+VP(0.05,0.2399994,0){0,0,1199209.5,0,0,-3139523.8,0,0,3880564,0,0,-3139310.1,0,0,1198994.4};
+VP(0.05,0.24999933,0){0,0,1004412.5,0,0,-2744075,0,0,3748408.9,0,0,-3748301.5,0,0,2743740};
+VP(0.05,0.25999927,0){0,0,806928.23,0,0,-2281198.4,0,0,3360882.3,0,0,-3859250.9,0,0,3690299};
+VP(0.05,0.2699992,0){0,0,607108.49,0,0,-1761901.2,0,0,2744236.2,0,0,-3457909.7,0,0,3832928};
+VP(0.05,0.27999913,0){0,0,405592.69,0,0,-1199043.3,0,0,1940077.6,0,0,-2596308.7,0,0,3139108.2};
+VP(0.05,0.28999907,0){0,0,203104.02,0,0,-607063.77,0,0,1004310.4,0,0,-1390455.9,0,0,1761206};
+VP(0.05,0.299999,0){0,0,20.358382,0,0,-61.109432,0,0,101.96355,0,0,-142.98836,0,0,184.2584};
+
+VP(0.0599998,1e-06,0){0,0,3690588.4,0,0,3690594.1,0,0,3690600.5,0,0,3690636.8,0,0,3690680.2};
+VP(0.0599998,0.010000933,0){0,0,3685584.9,0,0,3645126.5,0,0,3564649.5,0,0,3445067.6,0,0,3287702};
+VP(0.0599998,0.020000867,0){0,0,3670339.3,0,0,3509847.2,0,0,3195872,0,0,2742162.2,0,0,2168469.5};
+VP(0.0599998,0.0300008,0){0,0,3645265.4,0,0,3288523.2,0,0,2610025.4,0,0,1676315.4,0,0,578890.16};
+VP(0.0599998,0.040000733,0){0,0,3610072.7,0,0,2985916.8,0,0,1845500.4,0,0,385975.87,0,0,-1140557.6};
+VP(0.0599998,0.050000667,0){0,0,3564932.8,0,0,2609563.8,0,0,954567.28,0,0,-956764.73,0,0,-2612108.6};
+VP(0.0599998,0.0600006,0){0,0,3509883.5,0,0,2169100.8,0,0,-294.39187,0,0,-2169556.7,0,0,-3509772.8};
+VP(0.0599998,0.070000533,0){0,0,3445521.6,0,0,1675462,0,0,-955345.58,0,0,-3095407.5,0,0,-3645237};
+VP(0.0599998,0.080000467,0){0,0,3371542.1,0,0,1140096.9,0,0,-1845826.2,0,0,-3610004.7,0,0,-2985003.9};
+VP(0.0599998,0.0900004,0){0,0,3288201,0,0,577167.05,0,0,-2609684.2,0,0,-3644941.6,0,0,-1675304};
+VP(0.0599998,0.10000033,0){0,0,3196255,0,0,-266.67806,0,0,-3196667.6,0,0,-3195888.6,0,0,1895.9665};
+VP(0.0599998,0.11000027,0){0,0,3095213.4,0,0,-577563.51,0,0,-3564996.6,0,0,-2321862.4,0,0,1676966};
+VP(0.0599998,0.1200002,0){0,0,2985745.7,0,0,-1140533.3,0,0,-3690547,0,0,-1140417.7,0,0,2985531.4};
+VP(0.0599998,0.13000013,0){0,0,2868135,0,0,-1675511.4,0,0,-3564775.9,0,0,193668.06,0,0,3645303.7};
+VP(0.0599998,0.14000007,0){0,0,2742731.7,0,0,-2169340.9,0,0,-3196135,0,0,1501116.1,0,0,3509766.4};
+VP(0.0599998,0.15,0){0,0,2609657.8,0,0,-2609701.8,0,0,-2609700.4,0,0,2609527.5,0,0,2610132.1};
+VP(0.0599998,0.15999993,0){0,0,2469577.5,0,0,-2985824.1,0,0,-1845633.7,0,0,3371429.8,0,0,1142123};
+VP(0.0599998,0.16999987,0){0,0,2322691.7,0,0,-3288363,0,0,-955637.58,0,0,3685705.9,0,0,-576298.25};
+VP(0.0599998,0.1799998,0){0,0,2169321.2,0,0,-3510087.5,0,0,216.20285,0,0,3509911.2,0,0,-2169952.5};
+VP(0.0599998,0.18999973,0){0,0,2010122.2,0,0,-3645257.3,0,0,955123.64,0,0,2868380.8,0,0,-3288529.5};
+VP(0.0599998,0.19999967,0){0,0,1845424.5,0,0,-3690692.7,0,0,1844767.2,0,0,1846485.8,0,0,-3690994.8};
+VP(0.0599998,0.2099996,0){0,0,1675514.1,0,0,-3645174.5,0,0,2609662.4,0,0,577237.71,0,0,-3288394.8};
+VP(0.0599998,0.21999953,0){0,0,1501136.6,0,0,-3510009.9,0,0,3196091.5,0,0,-767114.35,0,0,-2169373.8};
+VP(0.0599998,0.22999947,0){0,0,1322529.6,0,0,-3288249.1,0,0,3564963.2,0,0,-2010624.3,0,0,-576282.31};
+VP(0.0599998,0.2399994,0){0,0,1140476.2,0,0,-2985787.6,0,0,3690602.4,0,0,-2985686.8,0,0,1140031.4};
+VP(0.0599998,0.24999933,0){0,0,955300.73,0,0,-2609900.4,0,0,3565088.7,0,0,-3564807.1,0,0,2609057.9};
+VP(0.0599998,0.25999927,0){0,0,767278.73,0,0,-2169195.9,0,0,3196149.1,0,0,-3670645.8,0,0,3510558.2};
+VP(0.0599998,0.2699992,0){0,0,577333.05,0,0,-1675470.1,0,0,2609593.5,0,0,-3288335.9,0,0,3645415};
+VP(0.0599998,0.27999913,0){0,0,385693.71,0,0,-1140199.5,0,0,1844814.4,0,0,-2468724.5,0,0,2984639.7};
+VP(0.0599998,0.28999907,0){0,0,193213.14,0,0,-577508.25,0,0,955436.41,0,0,-1322824.6,0,0,1675692.8};
+VP(0.0599998,0.299999,0){0,0,19.283606,0,0,-57.905204,0,0,96.689606,0,0,-135.74246,0,0,175.18876};
+
+VP(0.0699996,1e-06,0){0,0,3139667.6,0,0,3139665.7,0,0,3139654,0,0,3139650.6,0,0,3139470.9};
+VP(0.0699996,0.010000933,0){0,0,3135125.8,0,0,3100793.8,0,0,3032495.7,0,0,2930991.9,0,0,2797379};
+VP(0.0699996,0.020000867,0){0,0,3122310.7,0,0,2985675.5,0,0,2718374.1,0,0,2332119.2,0,0,1843762.7};
+VP(0.0699996,0.0300008,0){0,0,3100693,0,0,2797093.6,0,0,2219652.4,0,0,1424992.4,0,0,490900.05};
+VP(0.0699996,0.040000733,0){0,0,3070823,0,0,2539797.2,0,0,1569564.7,0,0,327908.52,0,0,-970491.93};
+VP(0.0699996,0.050000667,0){0,0,3032468.4,0,0,2219799.1,0,0,812200.29,0,0,-813120.94,0,0,-2220596.8};
+VP(0.0699996,0.0600006,0){0,0,2985875.8,0,0,1845377.2,0,0,-26.355008,0,0,-1845513.3,0,0,-2986315.5};
+VP(0.0699996,0.070000533,0){0,0,2931046.3,0,0,1425283.6,0,0,-812900.53,0,0,-2633729.7,0,0,-3101410.7};
+VP(0.0699996,0.080000467,0){0,0,2868112.6,0,0,970159.55,0,0,-1569836.3,0,0,-3071130.7,0,0,-2540487.8};
+VP(0.0699996,0.0900004,0){0,0,2797210.7,0,0,490941.67,0,0,-2219930.9,0,0,-3100375.4,0,0,-1424891.3};
+VP(0.0699996,0.10000033,0){0,0,2718885.1,0,0,-182.57461,0,0,-2719058.7,0,0,-2718531.8,0,0,941.97383};
+VP(0.0699996,0.11000027,0){0,0,2632913.9,0,0,-491153,0,0,-3032434.9,0,0,-1975629.9,0,0,1425271.2};
+VP(0.0699996,0.1200002,0){0,0,2539899.6,0,0,-970217.44,0,0,-3139555.4,0,0,-970209.87,0,0,2540083.9};
+VP(0.0699996,0.13000013,0){0,0,2439510.8,0,0,-1425266,0,0,-3031770.5,0,0,164758.65,0,0,3099617.8};
+VP(0.0699996,0.14000007,0){0,0,2332905.6,0,0,-1845309.2,0,0,-2718594,0,0,1277417,0,0,2985507.9};
+VP(0.0699996,0.15,0){0,0,2219941.4,0,0,-2219958.1,0,0,-2219904.1,0,0,2219980.5,0,0,2219784.8};
+VP(0.0699996,0.15999993,0){0,0,2100779.8,0,0,-2539856.5,0,0,-1570056.5,0,0,2867818.8,0,0,971425.75};
+VP(0.0699996,0.16999987,0){0,0,1975781.8,0,0,-2797264.2,0,0,-812705.41,0,0,3135157.1,0,0,-490750.14};
+VP(0.0699996,0.1799998,0){0,0,1845356.9,0,0,-2985850.3,0,0,78.136475,0,0,2985657.3,0,0,-1845159.5};
+VP(0.0699996,0.18999973,0){0,0,1709803.1,0,0,-3100588.9,0,0,812407.05,0,0,2439581.7,0,0,-2797000.3};
+VP(0.0699996,0.19999967,0){0,0,1569746.1,0,0,-3139424.2,0,0,1569485.9,0,0,1570117.5,0,0,-3139429.6};
+VP(0.0699996,0.2099996,0){0,0,1425263.5,0,0,-3100589,0,0,2219581.7,0,0,490836.14,0,0,-2795721.5};
+VP(0.0699996,0.21999953,0){0,0,1277056.4,0,0,-2985909.1,0,0,2718460.4,0,0,-651766.98,0,0,-1846051.6};
+VP(0.0699996,0.22999947,0){0,0,1125152.1,0,0,-2797513.7,0,0,3032908.3,0,0,-1710337.8,0,0,-490994.33};
+VP(0.0699996,0.2399994,0){0,0,970112.98,0,0,-2539826.8,0,0,3139496.3,0,0,-2539996.3,0,0,970367.78};
+VP(0.0699996,0.24999933,0){0,0,812572.07,0,0,-2220016.4,0,0,3032735.9,0,0,-3033096.1,0,0,2221151.5};
+VP(0.0699996,0.25999927,0){0,0,652805.93,0,0,-1845499.8,0,0,2718972.8,0,0,-3122098.8,0,0,2985084.7};
+VP(0.0699996,0.2699992,0){0,0,491084.34,0,0,-1425170.4,0,0,2219732.5,0,0,-2796996.6,0,0,3100323.4};
+VP(0.0699996,0.27999913,0){0,0,328256.73,0,0,-970421.4,0,0,1570170.2,0,0,-2101272.7,0,0,2540471.6};
+VP(0.0699996,0.28999907,0){0,0,164340.78,0,0,-491233.16,0,0,812780.8,0,0,-1125482,0,0,1426000.8};
+VP(0.0699996,0.299999,0){0,0,16.421384,0,0,-49.30993,0,0,82.335561,0,0,-115.58739,0,0,149.15898};
+
+VP(0.0799994,1e-06,0){0,0,2280727.8,0,0,2280773.4,0,0,2280859.1,0,0,2280998.1,0,0,2281181.3};
+VP(0.0799994,0.010000933,0){0,0,2278135,0,0,2253241,0,0,2203682.2,0,0,2129941.2,0,0,2032549};
+VP(0.0799994,0.020000867,0){0,0,2268484.2,0,0,2169326.1,0,0,1975330.1,0,0,1694973.6,0,0,1340374.1};
+VP(0.0799994,0.0300008,0){0,0,2252922.6,0,0,2032386.7,0,0,1612868.3,0,0,1035393.9,0,0,356377.56};
+VP(0.0799994,0.040000733,0){0,0,2231419.5,0,0,1845768.6,0,0,1141095.2,0,0,239142.92,0,0,-704394.97};
+VP(0.0799994,0.050000667,0){0,0,2203162.8,0,0,1612856.7,0,0,590370.34,0,0,-590352.65,0,0,-1612864.9};
+VP(0.0799994,0.0600006,0){0,0,2169276.5,0,0,1340623.4,0,0,-76.71712,0,0,-1340625.6,0,0,-2168934.4};
+VP(0.0799994,0.070000533,0){0,0,2129506.4,0,0,1035589.6,0,0,-590316.24,0,0,-1913067.2,0,0,-2253364};
+VP(0.0799994,0.080000467,0){0,0,2084053.6,0,0,704937.17,0,0,-1140774.2,0,0,-2231740.4,0,0,-1845983.4};
+VP(0.0799994,0.0900004,0){0,0,2032426.1,0,0,356710.38,0,0,-1613120.2,0,0,-2253001.3,0,0,-1035367.5};
+VP(0.0799994,0.10000033,0){0,0,1975085.9,0,0,113.85229,0,0,-1974864.7,0,0,-1975020.8,0,0,-380.74858};
+VP(0.0799994,0.11000027,0){0,0,1913349,0,0,-357029.9,0,0,-2203984,0,0,-1435642.7,0,0,1036881.6};
+VP(0.0799994,0.1200002,0){0,0,1845350.6,0,0,-704873.21,0,0,-2281043.5,0,0,-704842.32,0,0,1845655.7};
+VP(0.0799994,0.13000013,0){0,0,1772745.6,0,0,-1035674.6,0,0,-2203648.2,0,0,119514.15,0,0,2254052.1};
+VP(0.0799994,0.14000007,0){0,0,1695180.1,0,0,-1340871,0,0,-1975338.9,0,0,927997.64,0,0,2169093.9};
+VP(0.0799994,0.15,0){0,0,1612825.4,0,0,-1612841.3,0,0,-1612543.8,0,0,1612521.2,0,0,1612058.3};
+VP(0.0799994,0.15999993,0){0,0,1526244.9,0,0,-1845398.3,0,0,-1140637.4,0,0,2084384,0,0,705209.01};
+VP(0.0799994,0.16999987,0){0,0,1435410.5,0,0,-2032217.3,0,0,-590458.98,0,0,2277698.2,0,0,-356556.54};
+VP(0.0799994,0.1799998,0){0,0,1340670.5,0,0,-2169027.1,0,0,-223.59127,0,0,2168584.1,0,0,-1339615};
+VP(0.0799994,0.18999973,0){0,0,1242273.6,0,0,-2252837.9,0,0,590435.56,0,0,1772500.8,0,0,-2032749.8};
+VP(0.0799994,0.19999967,0){0,0,1140442.6,0,0,-2280848.8,0,0,1140564.8,0,0,1139836,0,0,-2280532.3};
+VP(0.0799994,0.2099996,0){0,0,1035699,0,0,-2253241.8,0,0,1613083.8,0,0,357223.09,0,0,-2033463.9};
+VP(0.0799994,0.21999953,0){0,0,927861.35,0,0,-2169623.2,0,0,1975708.5,0,0,-474255.42,0,0,-1341466.6};
+VP(0.0799994,0.22999947,0){0,0,817383.1,0,0,-2032235.4,0,0,2203103.3,0,0,-1242264.5,0,0,-356700.4};
+VP(0.0799994,0.2399994,0){0,0,704847.79,0,0,-1845370.9,0,0,2281143.2,0,0,-1845622.6,0,0,705007.92};
+VP(0.0799994,0.24999933,0){0,0,590342.97,0,0,-1612830.2,0,0,2203126.1,0,0,-2203043.7,0,0,1612498.1};
+VP(0.0799994,0.25999927,0){0,0,474296.31,0,0,-1340926,0,0,1975847.2,0,0,-2269363.4,0,0,2170870.5};
+VP(0.0799994,0.2699992,0){0,0,356851.6,0,0,-1035659.4,0,0,1613192.7,0,0,-2032947.5,0,0,2253814.8};
+VP(0.0799994,0.27999913,0){0,0,238450.24,0,0,-704928.49,0,0,1140598.6,0,0,-1526410.3,0,0,1845458.3};
+VP(0.0799994,0.28999907,0){0,0,119436.21,0,0,-357043.47,0,0,590866.78,0,0,-818411.64,0,0,1037160.2};
+VP(0.0799994,0.299999,0){0,0,11.922335,0,0,-35.808474,0,0,59.818323,0,0,-84.031,0,0,108.55653};
+
+VP(0.0899992,1e-06,0){0,0,1199336.2,0,0,1199315.5,0,0,1199270.6,0,0,1199207.1,0,0,1199061.5};
+VP(0.0899992,0.010000933,0){0,0,1198153.6,0,0,1185145.9,0,0,1159246.6,0,0,1120701.4,0,0,1069776.6};
+VP(0.0899992,0.020000867,0){0,0,1192685.5,0,0,1140658.7,0,0,1038853.3,0,0,891683.02,0,0,705546.96};
+VP(0.0899992,0.0300008,0){0,0,1184754.2,0,0,1068843,0,0,848337.39,0,0,544778.53,0,0,187690.61};
+VP(0.0899992,0.040000733,0){0,0,1173715.6,0,0,970816.17,0,0,600039.89,0,0,125399.4,0,0,-371189.8};
+VP(0.0899992,0.050000667,0){0,0,1158276.9,0,0,847929.79,0,0,310324.29,0,0,-310562.7,0,0,-848307.62};
+VP(0.0899992,0.0600006,0){0,0,1140753.9,0,0,704922.14,0,0,-103.62936,0,0,-704829.95,0,0,-1139930.4};
+VP(0.0899992,0.070000533,0){0,0,1119714.7,0,0,544556.53,0,0,-310359.94,0,0,-1005943.5,0,0,-1184994.4};
+VP(0.0899992,0.080000467,0){0,0,1095985,0,0,370759.25,0,0,-600042.12,0,0,-1174023.1,0,0,-970761.2};
+VP(0.0899992,0.0900004,0){0,0,1068224.2,0,0,187464.52,0,0,-848034.87,0,0,-1184473.1,0,0,-543987.2};
+VP(0.0899992,0.10000033,0){0,0,1038500.2,0,0,-7.3678079,0,0,-1038769.7,0,0,-1039036.9,0,0,19.416784};
+VP(0.0899992,0.11000027,0){0,0,1006231.9,0,0,-187640.38,0,0,-1158657.2,0,0,-754841.71,0,0,544327.53};
+VP(0.0899992,0.1200002,0){0,0,970113.93,0,0,-370546.78,0,0,-1199019.8,0,0,-370452.42,0,0,969904.3};
+VP(0.0899992,0.13000013,0){0,0,932207.72,0,0,-544547.54,0,0,-1158917.9,0,0,62512.542,0,0,1185501.3};
+VP(0.0899992,0.14000007,0){0,0,891166.13,0,0,-704795.35,0,0,-1038385.7,0,0,487616.78,0,0,1140014.7};
+VP(0.0899992,0.15,0){0,0,848172.12,0,0,-848217.89,0,0,-847844.69,0,0,847957.13,0,0,847385.47};
+VP(0.0899992,0.15999993,0){0,0,802382.91,0,0,-970181.38,0,0,-599616,0,0,1095765.8,0,0,370693.9};
+VP(0.0899992,0.16999987,0){0,0,754932.06,0,0,-1069114.5,0,0,-310447.26,0,0,1199326.7,0,0,-188765.22};
+VP(0.0899992,0.1799998,0){0,0,704958.68,0,0,-1140556,0,0,-248.65236,0,0,1140833,0,0,-704695.97};
+VP(0.0899992,0.18999973,0){0,0,653304.28,0,0,-1184754,0,0,310423.05,0,0,932308.32,0,0,-1068648.6};
+VP(0.0899992,0.19999967,0){0,0,599602.09,0,0,-1199224.6,0,0,599650.17,0,0,599621.62,0,0,-1199377.5};
+VP(0.0899992,0.2099996,0){0,0,544463.23,0,0,-1184405,0,0,847712.47,0,0,187819.44,0,0,-1068128.6};
+VP(0.0899992,0.21999953,0){0,0,488042.66,0,0,-1141175.6,0,0,1039086.6,0,0,-249151.79,0,0,-706017.92};
+VP(0.0899992,0.22999947,0){0,0,429815.99,0,0,-1068649,0,0,1158547.7,0,0,-653406.34,0,0,-187225.04};
+VP(0.0899992,0.2399994,0){0,0,370690.77,0,0,-970386.82,0,0,1199251.8,0,0,-970007.4,0,0,370681.55};
+VP(0.0899992,0.24999933,0){0,0,310390.11,0,0,-848004.17,0,0,1158394,0,0,-1158345.1,0,0,847660.27};
+VP(0.0899992,0.25999927,0){0,0,249481.19,0,0,-705373.73,0,0,1039488.2,0,0,-1194110.6,0,0,1142537.4};
+VP(0.0899992,0.2699992,0){0,0,187639.98,0,0,-544577.4,0,0,848281.6,0,0,-1069054.9,0,0,1185439.9};
+VP(0.0899992,0.27999913,0){0,0,125326.47,0,0,-370529.74,0,0,599621.01,0,0,-802628.46,0,0,970771.43};
+VP(0.0899992,0.28999907,0){0,0,62802.689,0,0,-187757.37,0,0,310765.55,0,0,-430542.75,0,0,545801.11};
+VP(0.0899992,0.299999,0){0,0,6.2583854,0,0,-18.797492,0,0,31.403123,0,0,-44.11748,0,0,56.993715};
+
+VP(0.099999,1e-06,0){0,0,122.2717,0,0,122.22832,0,0,122.14101,0,0,122.01002,0,0,121.86309};
+VP(0.099999,0.010000933,0){0,0,122.46834,0,0,121.03483,0,0,118.188,0,0,113.96935,0,0,108.45126};
+VP(0.099999,0.020000867,0){0,0,121.65209,0,0,116.30315,0,0,105.84466,0,0,90.745939,0,0,71.692521};
+VP(0.099999,0.0300008,0){0,0,120.92677,0,0,109.03403,0,0,86.442932,0,0,55.42058,0,0,19.030381};
+VP(0.099999,0.040000733,0){0,0,119.81359,0,0,99.026732,0,0,61.114881,0,0,12.749458,0,0,-37.607293};
+VP(0.099999,0.050000667,0){0,0,118.01358,0,0,86.395547,0,0,31.616736,0,0,-31.666664,0,0,-86.534566};
+VP(0.099999,0.0600006,0){0,0,116.54411,0,0,71.981358,0,0,-0.080387563,0,0,-72.054845,0,0,-116.34883};
+VP(0.099999,0.070000533,0){0,0,113.96494,0,0,55.410296,0,0,-31.568102,0,0,-102.23279,0,0,-120.27103};
+VP(0.099999,0.080000467,0){0,0,111.95143,0,0,37.861744,0,0,-61.14624,0,0,-119.46009,0,0,-98.614086};
+VP(0.099999,0.0900004,0){0,0,109.0775,0,0,19.117811,0,0,-86.499053,0,0,-120.62539,0,0,-55.236718};
+VP(0.099999,0.10000033,0){0,0,105.77638,0,0,0.00038661946,0,0,-105.70057,0,0,-105.62659,0,0,-0.051360586};
+VP(0.099999,0.11000027,0){0,0,102.7882,0,0,-19.209807,0,0,-118.33606,0,0,-76.968209,0,0,55.676392};
+VP(0.099999,0.1200002,0){0,0,98.846941,0,0,-37.738544,0,0,-122.08846,0,0,-37.705367,0,0,98.674581};
+VP(0.099999,0.13000013,0){0,0,95.300608,0,0,-55.682035,0,0,-118.32145,0,0,6.458813,0,0,120.72836};
+VP(0.099999,0.14000007,0){0,0,90.928246,0,0,-71.860492,0,0,-105.76253,0,0,49.552905,0,0,115.61076};
+VP(0.099999,0.15,0){0,0,86.649422,0,0,-86.706263,0,0,-86.885509,0,0,87.051255,0,0,87.455122};
+VP(0.099999,0.15999993,0){0,0,81.849309,0,0,-98.902526,0,0,-61.030293,0,0,111.30685,0,0,37.639146};
+VP(0.099999,0.16999987,0){0,0,77.088885,0,0,-109.08576,0,0,-31.684924,0,0,122.02127,0,0,-19.059934};
+VP(0.099999,0.1799998,0){0,0,71.759796,0,0,-116.12022,0,0,0.019236055,0,0,116.11968,0,0,-71.659577};
+VP(0.099999,0.18999973,0){0,0,66.548862,0,0,-120.64907,0,0,31.583707,0,0,94.841601,0,0,-108.58648};
+VP(0.099999,0.19999967,0){0,0,61.196684,0,0,-122.402,0,0,61.194661,0,0,61.284233,0,0,-122.59119};
+VP(0.099999,0.2099996,0){0,0,55.531956,0,0,-120.7904,0,0,86.420086,0,0,19.214407,0,0,-108.928};
+VP(0.099999,0.21999953,0){0,0,49.83612,0,0,-116.47011,0,0,105.95411,0,0,-25.423519,0,0,-71.555205};
+VP(0.099999,0.22999947,0){0,0,43.75017,0,0,-108.75091,0,0,117.84066,0,0,-66.39418,0,0,-19.092177};
+VP(0.099999,0.2399994,0){0,0,37.88541,0,0,-99.152242,0,0,122.47173,0,0,-98.953555,0,0,37.716317};
+VP(0.099999,0.24999933,0){0,0,31.620091,0,0,-86.395681,0,0,118.04104,0,0,-118.0743,0,0,86.383089};
+VP(0.099999,0.25999927,0){0,0,25.461477,0,0,-71.929935,0,0,105.82597,0,0,-121.26089,0,0,115.61847};
+VP(0.099999,0.2699992,0){0,0,19.15621,0,0,-55.565276,0,0,86.458221,0,0,-108.78237,0,0,120.35713};
+VP(0.099999,0.27999913,0){0,0,12.779823,0,0,-37.770607,0,0,61.080654,0,0,-81.673399,0,0,98.626637};
+VP(0.099999,0.28999907,0){0,0,6.4118062,0,0,-19.149794,0,0,31.63223,0,0,-43.692585,0,0,55.184315};
+VP(0.099999,0.299999,0){0,0,0.00063643529,0,0,-0.0019081723,0,0,0.0031765239,0,0,-0.0044392302,0,0,0.0056895141};
+
+};
diff --git a/demos/view03.pos b/demos/view03.pos
new file mode 100644
index 0000000000000000000000000000000000000000..3d2ddb6ef5ed35b975d82d45d7d04be343237073
--- /dev/null
+++ b/demos/view03.pos
@@ -0,0 +1,1284 @@
+/* 
+   Gmsh demo file (C) 2000 C. Geuzaine, J.-F. Remacle
+
+   Vector map on triangles
+
+   All important comments are marked with "README"
+*/
+
+View "And another vector map..." {
+VT(0.079090117,0.19794942,0,0.06966854,0.20076802,0,0.071449289,0.19423207,0){0,0,1206859.6,0,0,1570520.4,0,0,1594804.6,0,0,-2368529.7,0,0,-3162888.4,0,0,-3019964.8,0,0,1073015.3,0,0,1636334.6,0,0,1103926.4,0,0,1335740.9,0,0,1503948.1,0,0,2033518.7,0,0,-2359414.1,0,0,-3161601.9,0,0,-2921575.1};
+VT(0.056317057,0.058022103,0,0.045416206,0.061541227,0,0.048663579,0.053435419,0){0,0,3630316.8,0,0,3642820.9,0,0,3726394.8,0,0,2330872.5,0,0,2181474.8,0,0,2589713.3,0,0,197001.66,0,0,-155055.51,0,0,663071.82,0,0,-2007682.1,0,0,-2429600.5,0,0,-1465861.1,0,0,-3494460.7,0,0,-3730025.8,0,0,-3147918.6};
+VT(0.052494391,0.065958781,0,0.045416206,0.061541227,0,0.056317057,0.058022103,0){0,0,3640248,0,0,3642820.9,0,0,3630316.8,0,0,1971511.2,0,0,2181474.8,0,0,2330872.5,0,0,-601016.65,0,0,-155055.51,0,0,197001.66,0,0,-2898090,0,0,-2429600.5,0,0,-2007682.1,0,0,-3866942,0,0,-3730025.8,0,0,-3494460.7};
+VT(0.089437553,0.21298247,0,0.093706234,0.20596864,0,0.1,0.21428571,0){0,0,556322.48,0,0,360320.46,0,0,0,0,0,-1238115.4,0,0,-758974.46,0,0,0,0,0,961021.23,0,0,479351.87,0,0,0,0,0,60411.18,0,0,228803.73,0,0,0,0,0,-1035404.3,0,0,-732939.79,0,0,0};
+VT(0,0.021428571,0,0.0084994266,0.025462386,0,0,0.028571429,0){0,0,0,0,0,1014895.2,0,0,0,0,0,0,0,0,943121.65,0,0,0,0,0,0,0,0,804669.5,0,0,0,0,0,0,0,0,609367.99,0,0,0,0,0,0,0,0,370926.59,0,0,0};
+VT(0,0.27142857,0,0.0087746229,0.27470702,0,0,0.27857143,0){0,0,0,0,0,139476.7,0,0,0,0,0,0,0,0,-408686.72,0,0,0,0,0,0,0,0,649356.33,0,0,0,0,0,0,0,0,-844695.79,0,0,0,0,0,0,0,0,980930.37,0,0,0};
+VT(0.064352171,0.083117586,0,0.058212185,0.089881183,0,0.054828578,0.081464579,0){0,0,3167194.8,0,0,3344291.6,0,0,3492382.6,0,0,915483.69,0,0,593905.21,0,0,1101278.5,0,0,-1987167.2,0,0,-2645013.4,0,0,-2043909.2,0,0,-3477240.4,0,0,-3708817.1,0,0,-3789901.6,0,0,-2495770,0,0,-1722713.3,0,0,-2941538.5};
+VT(0.043491003,0.26677795,0,0.04563604,0.25694979,0,0.0528723,0.26429657,0){0,0,657627.62,0,0,859240.08,0,0,718299.05,0,0,-1894105.9,0,0,-2406042.8,0,0,-2055661.9,0,0,2903724.9,0,0,3472131.8,0,0,3109067.1,0,0,-3565612.1,0,0,-3844488.4,0,0,-3733060,0,0,3800401.2,0,0,3448330.3,0,0,3841282.5};
+VT(0.0528723,0.26429657,0,0.04563604,0.25694979,0,0.054010827,0.25507988,0){0,0,718299.05,0,0,859240.08,0,0,897184.36,0,0,-2055661.9,0,0,-2406042.8,0,0,-2496661.6,0,0,3109067.1,0,0,3472131.8,0,0,3553831.7,0,0,-3733060,0,0,-3844488.4,0,0,-3839088.9,0,0,3841282.5,0,0,3448330.3,0,0,3290330.5};
+VT(0.052748817,0.036292023,0,0.046341114,0.044942776,0,0.043838979,0.034579424,0){0,0,3796611.1,0,0,3748809.1,0,0,3745913.7,0,0,3254886.9,0,0,2933624.2,0,0,3260141.4,0,0,2248728.5,0,0,1480431.3,0,0,2351583.2,0,0,921690.78,0,0,-294933.53,0,0,1138042.7,0,0,-537197.11,0,0,-2006921.6,0,0,-223347.31};
+VT(0.054794838,0.043915046,0,0.046341114,0.044942776,0,0.052748817,0.036292023,0){0,0,3735662.6,0,0,3748809.1,0,0,3796611.1,0,0,2959425,0,0,2933624.2,0,0,3254886.9,0,0,1568238.5,0,0,1480431.3,0,0,2248728.5,0,0,-148813.91,0,0,-294933.53,0,0,921690.78,0,0,-1835117.4,0,0,-2006921.6,0,0,-537197.11};
+VT(0.064795861,0.023107998,0,0.057612168,0.01845715,0,0.064075209,0.013493001,0){0,0,3443592.1,0,0,3752599.8,0,0,3498581.2,0,0,3242943.8,0,0,3612875.5,0,0,3428890.3,0,0,2853338,0,0,3338613.5,0,0,3290906.4,0,0,2297494.4,0,0,2940029.2,0,0,3087427.7,0,0,1607540.9,0,0,2431782.4,0,0,2822154};
+VT(0.08812606,0.087328167,0,0.091953893,0.078440357,0,0.1,0.085714286,0){0,0,1269155.7,0,0,889726.23,0,0,0,0,0,279658.57,0,0,322434.75,0,0,0,0,0,-927894.68,0,0,-450550.32,0,0,0,0,0,-1412053.3,0,0,-936443.15,0,0,0,0,0,-795447.99,0,0,-825354.72,0,0,0};
+VT(0.1,0.21428571,0,0.091864029,0.22106993,0,0.089437553,0.21298247,0){0,0,0,0,0,394005.54,0,0,556322.48,0,0,0,0,0,-927852.61,0,0,-1238115.4,0,0,0,0,0,863120.02,0,0,961021.23,0,0,0,0,0,-241435.16,0,0,60411.18,0,0,0,0,0,-536498.87,0,0,-1035404.3};
+VT(0.091758141,0.11296708,0,0.08466046,0.11619385,0,0.082583958,0.10907049,0){0,0,824791.32,0,0,1475783,0,0,1698614.9,0,0,-201020.76,0,0,-452604.25,0,0,-286603.09,0,0,-976886.6,0,0,-1789662.1,0,0,-1936849,0,0,-537824.26,0,0,-788262.21,0,0,-1323464.6,0,0,570097.26,0,0,1243195.1,0,0,836522.31};
+VT(0.046341114,0.044942776,0,0.053426379,0.049768916,0,0.048663579,0.053435419,0){0,0,3748809.1,0,0,3727873.1,0,0,3726394.8,0,0,2933624.2,0,0,2738031.5,0,0,2589713.3,0,0,1480431.3,0,0,1021148,0,0,663071.82,0,0,-294933.53,0,0,-966926.63,0,0,-1465861.1,0,0,-2006921.6,0,0,-2698501,0,0,-3147918.6};
+VT(0.08596482,0.28314521,0,0.082516133,0.27647665,0,0.089232651,0.27618677,0){0,0,145967.81,0,0,248899.48,0,0,160151.6,0,0,-433371.98,0,0,-731674.12,0,0,-470555.02,0,0,707326.96,0,0,1170289.2,0,0,751874.95,0,0,-959333.22,0,0,-1538273.3,0,0,-986723.61,0,0,1181452.3,0,0,1813237.5,0,0,1160401.4};
+VT(0.089183466,0.023798504,0,0.082332164,0.023444943,0,0.085905658,0.016824409,0){0,0,1283383.3,0,0,2029600,0,0,1656238,0,0,1204105.7,0,0,1907886.4,0,0,1604967.9,0,0,1050439.6,0,0,1671751.1,0,0,1504009.2,0,0,831874.08,0,0,1335359.8,0,0,1356492.3,0,0,561630.79,0,0,918760.81,0,0,1166855};
+VT(0.051013063,0.11801667,0,0.052058531,0.12554764,0,0.045375723,0.12284566,0){0,0,3161388.4,0,0,3065498.6,0,0,3072436,0,0,-1083065.4,0,0,-1512626.5,0,0,-1348503.3,0,0,-3873486.3,0,0,-3831818,0,0,-3829159.4,0,0,-1463412.7,0,0,-428428.64,0,0,-800055.99,0,0,2911579,0,0,3614977.4,0,0,3380414.3};
+VT(0.076938259,0.060604721,0,0.080938662,0.054906318,0,0.08415119,0.061061125,0){0,0,2443533.2,0,0,2097661.4,0,0,1759442.9,0,0,1491930.8,0,0,1423084,0,0,1064240.3,0,0,-40674.57,0,0,290856.94,0,0,-51487.645,0,0,-1557435.8,0,0,-934922.56,0,0,-1146904.2,0,0,-2468002.6,0,0,-1860365.1,0,0,-1789550.6};
+VT(0.027903545,0.087518505,0,0.025411973,0.082310594,0,0.032911969,0.081185013,0){0,0,2674848,0,0,2525130.6,0,0,3037931.3,0,0,580994.77,0,0,762374.09,0,0,971274.35,0,0,-1967676.8,0,0,-1532614.6,0,0,-1756226.8,0,0,-2976106,0,0,-2757779.1,0,0,-3289165.4,0,0,-1655065.1,0,0,-2058136.4,0,0,-2584916.3};
+VT(0.045116599,0.21481108,0,0.053910411,0.21448753,0,0.049797208,0.2214244,0){0,0,1654487.5,0,0,1667429.4,0,0,1551864.2,0,0,-3731787.4,0,0,-3752161.8,0,0,-3662861.4,0,0,3030991.5,0,0,3023771,0,0,3430735.4,0,0,-73694.316,0,0,-28239.212,0,0,-1003918.8,0,0,-2938909.4,0,0,-2988983.1,0,0,-2065424.5};
+VT(0.064795861,0.023107998,0,0.057707972,0.025075094,0,0.057612168,0.01845715,0){0,0,3443592.1,0,0,3734947.8,0,0,3752599.8,0,0,3242943.8,0,0,3478918.2,0,0,3612875.5,0,0,2853338,0,0,2984396.6,0,0,3338613.5,0,0,2297494.4,0,0,2285289.9,0,0,2940029.2,0,0,1607540.9,0,0,1429238.8,0,0,2431782.4};
+VT(0.0093450955,0.28843768,0,0.0045473776,0.2936365,0,0,0.28571429,0){0,0,67949.514,0,0,18406.211,0,0,0,0,0,-202850.84,0,0,-55138.333,0,0,0,0,0,334776.34,0,0,91630.552,0,0,0,0,0,-461793.67,0,0,-127724.83,0,0,0,0,0,581935.08,0,0,162961.08,0,0,0};
+VT(0.1,0.13571429,0,0.093938974,0.13899,0,0.0910478,0.13167545,0){0,0,0,0,0,548364.78,0,0,831136.87,0,0,0,0,0,-422206.84,0,0,-514132.23,0,0,0,0,0,-645591.08,0,0,-1027305.8,0,0,0,0,0,273728.87,0,0,122313.64,0,0,0,0,0,708600.91,0,0,1073956.7};
+VT(0,0.014285714,0,0.0045481906,0.0063920675,0,0.0093389246,0.011691623,0){0,0,0,0,0,552257.15,0,0,1120186.5,0,0,0,0,0,549810.55,0,0,1103410.3,0,0,0,0,0,544927.47,0,0,1070108.3,0,0,0,0,0,537633.65,0,0,1020788.4,0,0,0,0,0,527798.54,0,0,956114.18};
+VT(0.085905658,0.016824409,0,0.093571257,0.018380777,0,0.089183466,0.023798504,0){0,0,1656238,0,0,774815.13,0,0,1283383.3,0,0,1604967.9,0,0,746204.54,0,0,1204105.7,0,0,1504009.2,0,0,690036.86,0,0,1050439.6,0,0,1356492.3,0,0,608388.09,0,0,831874.08,0,0,1166855,0,0,504051.02,0,0,561630.79};
+VT(0.089232651,0.27618677,0,0.093593186,0.28160993,0,0.08596482,0.28314521,0){0,0,160151.6,0,0,74588.283,0,0,145967.81,0,0,-470555.02,0,0,-221009.65,0,0,-433371.98,0,0,751874.95,0,0,359269.18,0,0,707326.96,0,0,-986723.61,0,0,-484261.41,0,0,-959333.22,0,0,1160401.4,0,0,591230.88,0,0,1181452.3};
+VT(0.015416139,0.018002698,0,0.006650898,0.018174199,0,0.0093389246,0.011691623,0){0,0,1798828.3,0,0,801243.34,0,0,1120186.5,0,0,1735136,0,0,772347.91,0,0,1103410.3,0,0,1609995.5,0,0,715593.27,0,0,1070108.3,0,0,1427830.3,0,0,633022.27,0,0,1020788.4,0,0,1194733.1,0,0,527557,0,0,956114.18};
+VT(0.0093450955,0.28843768,0,0.0067236406,0.28198319,0,0.015498485,0.28248556,0){0,0,67949.514,0,0,76627.274,0,0,166274.63,0,0,-202850.84,0,0,-227172.13,0,0,-493262.57,0,0,334776.34,0,0,369685.4,0,0,803759.61,0,0,-461793.67,0,0,-499127.77,0,0,-1087394.1,0,0,581935.08,0,0,610772.43,0,0,1334475.8};
+VT(0.048076401,0.17082416,0,0.048811039,0.17808485,0,0.041643161,0.17482395,0){0,0,2424680.5,0,0,2310715.6,0,0,2284160.6,0,0,-3473815.1,0,0,-3650410,0,0,-3458410.7,0,0,-921629.25,0,0,-194330.82,0,0,-506290.81,0,0,3872759.5,0,0,3763231.4,0,0,3718851.8,0,0,-754316.94,0,0,-1987755.8,0,0,-1405815.9};
+VT(0.041643161,0.17482395,0,0.048811039,0.17808485,0,0.043573225,0.18196099,0){0,0,2284160.6,0,0,2310715.6,0,0,2202933.2,0,0,-3458410.7,0,0,-3650410,0,0,-3650165.7,0,0,-506290.81,0,0,-194330.82,0,0,195066.32,0,0,3718851.8,0,0,3763231.4,0,0,3522129.2,0,0,-1405815.9,0,0,-1987755.8,0,0,-2509350};
+VT(0.020973714,0.16688371,0,0.021502186,0.15931359,0,0.029380008,0.16405835,0){0,0,1525118.3,0,0,1630158.4,0,0,2021292.5,0,0,-2061659.5,0,0,-1947614.2,0,0,-2614335.2,0,0,-799875.51,0,0,-1250943.8,0,0,-1254306.4,0,0,2343184.8,0,0,2191316.6,0,0,2982541.3,0,0,-24581.749,0,0,824223.66,0,0,378860.61};
+VT(0.075422073,0.20645372,0,0.06966854,0.20076802,0,0.079090117,0.19794942,0){0,0,1273700.5,0,0,1570520.4,0,0,1206859.6,0,0,-2693470,0,0,-3162888.4,0,0,-2368529.7,0,0,1728669,0,0,1636334.6,0,0,1073015.3,0,0,766631.5,0,0,1503948.1,0,0,1335740.9,0,0,-2583646.6,0,0,-3161601.9,0,0,-2359414.1};
+VT(0.077619244,0.18028791,0,0.077140734,0.17217741,0,0.085369203,0.17624497,0){0,0,1471797.4,0,0,1584233.7,0,0,1039089.6,0,0,-2389894.4,0,0,-2313491.7,0,0,-1603144.1,0,0,18944.546,0,0,-519338.58,0,0,-168940.91,0,0,2378251.6,0,0,2552719.3,0,0,1695116.9,0,0,-1502642.9,0,0,-655929.75,0,0,-751642.95};
+VT(0.0084994266,0.025462386,0,0.006650898,0.018174199,0,0.015416139,0.018002698,0){0,0,1014895.2,0,0,801243.34,0,0,1798828.3,0,0,943121.65,0,0,772347.91,0,0,1735136,0,0,804669.5,0,0,715593.27,0,0,1609995.5,0,0,609367.99,0,0,633022.27,0,0,1427830.3,0,0,370926.59,0,0,527557,0,0,1194733.1};
+VT(0.015498485,0.28248556,0,0.0067236406,0.28198319,0,0.0087746229,0.27470702,0){0,0,166274.63,0,0,76627.274,0,0,139476.7,0,0,-493262.57,0,0,-227172.13,0,0,-408686.72,0,0,803759.61,0,0,369685.4,0,0,649356.33,0,0,-1087394.1,0,0,-499127.77,0,0,-844695.79,0,0,1334475.8,0,0,610772.43,0,0,980930.37};
+VT(0.029380008,0.16405835,0,0.021502186,0.15931359,0,0.027609688,0.15620978,0){0,0,2021292.5,0,0,1630158.4,0,0,2023546.1,0,0,-2614335.2,0,0,-1947614.2,0,0,-2286520.9,0,0,-1254306.4,0,0,-1250943.8,0,0,-1726415,0,0,2982541.3,0,0,2191316.6,0,0,2510934.9,0,0,378860.61,0,0,824223.66,0,0,1400022.9};
+VT(0.0087746229,0.27470702,0,0.018422519,0.27450763,0,0.015498485,0.28248556,0){0,0,139476.7,0,0,282501.19,0,0,166274.63,0,0,-408686.72,0,0,-827496.14,0,0,-493262.57,0,0,649356.33,0,0,1313896,0,0,803759.61,0,0,-844695.79,0,0,-1707268.8,0,0,-1087394.1,0,0,980930.37,0,0,1979556.1,0,0,1334475.8};
+VT(0.014305262,0.26641769,0,0.018422519,0.27450763,0,0.0087746229,0.27470702,0){0,0,294901.31,0,0,282501.19,0,0,139476.7,0,0,-848621.76,0,0,-827496.14,0,0,-408686.72,0,0,1298521.9,0,0,1313896,0,0,649356.33,0,0,-1589572.3,0,0,-1707268.8,0,0,-844695.79,0,0,1686004.5,0,0,1979556.1,0,0,980930.37};
+VT(0.0084994266,0.025462386,0,0.016759526,0.025876157,0,0.014137494,0.034012185,0){0,0,1014895.2,0,0,1932221.9,0,0,1641076.4,0,0,943121.65,0,0,1791225.7,0,0,1435142,0,0,804669.5,0,0,1519509.7,0,0,1049094.4,0,0,609367.99,0,0,1136895.1,0,0,531342.12,0,0,370926.59,0,0,671081.1,0,0,-53364.585};
+VT(0.015416139,0.018002698,0,0.016759526,0.025876157,0,0.0084994266,0.025462386,0){0,0,1798828.3,0,0,1932221.9,0,0,1014895.2,0,0,1735136,0,0,1791225.7,0,0,943121.65,0,0,1609995.5,0,0,1519509.7,0,0,804669.5,0,0,1427830.3,0,0,1136895.1,0,0,609367.99,0,0,1194733.1,0,0,671081.1,0,0,370926.59};
+VT(0.025770754,0.10718168,0,0.032036001,0.10024616,0,0.034786476,0.1076516,0){0,0,2378738.7,0,0,2837469.6,0,0,2912738.3,0,0,-316264.13,0,0,-12660.65,0,0,-413135.58,0,0,-2653040.8,0,0,-2850146.6,0,0,-3267374.9,0,0,-1984140.6,0,0,-2824890.6,0,0,-2390915.6,0,0,932667.69,0,0,37524.098,0,0,1215377.6};
+VT(0.024938414,0.098415267,0,0.032036001,0.10024616,0,0.025770754,0.10718168,0){0,0,2383058.5,0,0,2837469.6,0,0,2378738.7,0,0,68195.72,0,0,-12660.65,0,0,-316264.13,0,0,-2312962.3,0,0,-2850146.6,0,0,-2653040.8,0,0,-2447461.4,0,0,-2824890.6,0,0,-1984140.6,0,0,-204726.33,0,0,37524.098,0,0,932667.69};
+VT(0.049797208,0.2214244,0,0.053910411,0.21448753,0,0.05718895,0.22161738,0){0,0,1551864.2,0,0,1667429.4,0,0,1508977,0,0,-3662861.4,0,0,-3752161.8,0,0,-3566099.1,0,0,3430735.4,0,0,3023771,0,0,3352547.9,0,0,-1003918.8,0,0,-28239.212,0,0,-1004251.2,0,0,-2065424.5,0,0,-2988983.1,0,0,-1983866.6};
+VT(0.1,0.21428571,0,0.093706234,0.20596864,0,0.1,0.20714286,0){0,0,0,0,0,360320.46,0,0,0,0,0,0,0,0,-758974.46,0,0,0,0,0,0,0,0,479351.87,0,0,0,0,0,0,0,0,228803.73,0,0,0,0,0,0,0,0,-732939.79,0,0,0};
+VT(0.066012722,0.055502179,0,0.064832361,0.062804408,0,0.056317057,0.058022103,0){0,0,3257272.9,0,0,3281120.4,0,0,3630316.8,0,0,2187557.2,0,0,1912310.8,0,0,2330872.5,0,0,399401.17,0,0,-254314.65,0,0,197001.66,0,0,-1519988.7,0,0,-2314932.7,0,0,-2007682.1,0,0,-2940625.1,0,0,-3410309.6,0,0,-3494460.7};
+VT(0.063265205,0.21633109,0,0.066992124,0.20847551,0,0.073708403,0.21517194,0){0,0,1505335.5,0,0,1540360.8,0,0,1225969.3,0,0,-3432481.9,0,0,-3311175.4,0,0,-2772471.1,0,0,2888962.8,0,0,2266191.6,0,0,2271379.1,0,0,-265885.87,0,0,706070.36,0,0,-92677.622,0,0,-2549234.8,0,0,-3078419.5,0,0,-2155133.8};
+VT(0.073708403,0.21517194,0,0.066992124,0.20847551,0,0.075422073,0.20645372,0){0,0,1225969.3,0,0,1540360.8,0,0,1273700.5,0,0,-2772471.1,0,0,-3311175.4,0,0,-2693470,0,0,2271379.1,0,0,2266191.6,0,0,1728669,0,0,-92677.622,0,0,706070.36,0,0,766631.5,0,0,-2155133.8,0,0,-3078419.5,0,0,-2583646.6};
+VT(0.015498485,0.28248556,0,0.017990672,0.29207379,0,0.0093450955,0.28843768,0){0,0,166274.63,0,0,86228.122,0,0,67949.514,0,0,-493262.57,0,0,-258100.45,0,0,-202850.84,0,0,803759.61,0,0,428229.3,0,0,334776.34,0,0,-1087394.1,0,0,-595472.42,0,0,-461793.67,0,0,1334475.8,0,0,758576.15,0,0,581935.08};
+VT(0.0093389246,0.011691623,0,0.01808004,0.0081573173,0,0.015416139,0.018002698,0){0,0,1120186.5,0,0,2085729.2,0,0,1798828.3,0,0,1103410.3,0,0,2070583.9,0,0,1735136,0,0,1070108.3,0,0,2040406.9,0,0,1609995.5,0,0,1020788.4,0,0,1995444.2,0,0,1427830.3,0,0,956114.18,0,0,1935913.6,0,0,1194733.1};
+VT(0.089949388,0.2453858,0,0.092168655,0.23668616,0,0.1,0.24285714,0){0,0,339950.36,0,0,307607.26,0,0,0,0,0,-911669.73,0,0,-792496.69,0,0,0,0,0,1193275.4,0,0,941630.33,0,0,0,0,0,-1095139.7,0,0,-691810.02,0,0,0,0,0,648419.14,0,0,148523.72,0,0,0};
+VT(0.077013163,0.11736903,0,0.074105201,0.11070107,0,0.082583958,0.10907049,0){0,0,2095773.2,0,0,2359475.3,0,0,1698614.9,0,0,-691227.47,0,0,-471755.94,0,0,-286603.09,0,0,-2559181.5,0,0,-2736894.8,0,0,-1936849,0,0,-1023961.4,0,0,-1717960.7,0,0,-1323464.6,0,0,1873161.8,0,0,1362139.4,0,0,836522.31};
+VT(0.1,0.13571429,0,0.0910478,0.13167545,0,0.1,0.12857143,0){0,0,0,0,0,831136.87,0,0,0,0,0,0,0,0,-514132.23,0,0,0,0,0,0,0,0,-1027305.8,0,0,0,0,0,0,0,0,122313.64,0,0,0,0,0,0,0,0,1073956.7,0,0,0};
+VT(0.087331535,0.0958472,0,0.081743274,0.092625466,0,0.08812606,0.087328167,0){0,0,1318484.3,0,0,1862860,0,0,1269155.7,0,0,98077.228,0,0,243386.47,0,0,279658.57,0,0,-1213131.9,0,0,-1587731,0,0,-927894.68,0,0,-1401481.2,0,0,-2038652.4,0,0,-1412053.3,0,0,-292629.72,0,0,-717394.49,0,0,-795447.99};
+VT(0.091053567,0.10618538,0,0.091758141,0.11296708,0,0.082583958,0.10907049,0){0,0,914271.31,0,0,824791.32,0,0,1698614.9,0,0,-104388.15,0,0,-201020.76,0,0,-286603.09,0,0,-1006721.9,0,0,-976886.6,0,0,-1936849,0,0,-787386.88,0,0,-537824.26,0,0,-1323464.6,0,0,309052.61,0,0,570097.26,0,0,836522.31};
+VT(0.092857143,0.3,0,0.091323117,0.29067423,0,0.1,0.29285714,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0};
+VT(0.1,0.0071428571,0,0.091308694,0.0093164623,0,0.092857143,0,0){0,0,0,0,0,1045151,0,0,863626.15,0,0,0,0,0,1035216.9,0,0,863662.39,0,0,0,0,0,1015442.8,0,0,863732,0,0,0,0,0,986027.05,0,0,863838.35,0,0,0,0,0,947106.05,0,0,863813.95};
+VT(0.011573719,0.041901165,0,0.0063343033,0.038958017,0,0.014137494,0.034012185,0){0,0,1347025.1,0,0,751213.74,0,0,1641076.4,0,0,1091815.8,0,0,627892.11,0,0,1435142,0,0,629744.45,0,0,401490.67,0,0,1049094.4,0,0,48353.226,0,0,109174.99,0,0,531342.12,0,0,-542301.86,0,0,-201236.23,0,0,-53364.585};
+VT(0.019499739,0.079597209,0,0.01882241,0.070374011,0,0.026270926,0.075674812,0){0,0,2040354.6,0,0,2018056.9,0,0,2630439.6,0,0,702945.71,0,0,970762.8,0,0,1063205.3,0,0,-1095289.5,0,0,-580354.6,0,0,-1137545.6,0,0,-2175701.2,0,0,-1830388.5,0,0,-2660659.2,0,0,-1830384.7,0,0,-2130853.3,0,0,-2599027.8};
+VT(0.011268327,0.1984065,0,0.015977634,0.20443356,0,0.007303543,0.20469543,0){0,0,682302.12,0,0,895779.15,0,0,422375.13,0,0,-1344805.9,0,0,-1862602.8,0,0,-880191.16,0,0,623458.07,0,0,1114548.4,0,0,531663.92,0,0,739532.85,0,0,659707.69,0,0,303952.91,0,0,-1341727.7,0,0,-1827076.9,0,0,-861341.37};
+VT(0.057323957,0.1204315,0,0.052058531,0.12554764,0,0.051013063,0.11801667,0){0,0,3051716.5,0,0,3065498.6,0,0,3161388.4,0,0,-1191883,0,0,-1512626.5,0,0,-1083065.4,0,0,-3778168.4,0,0,-3831818,0,0,-3873486.3,0,0,-1110713.1,0,0,-428428.64,0,0,-1463412.7,0,0,3101303,0,0,3614977.4,0,0,2911579};
+VT(0.089858368,0.18421461,0,0.091593501,0.1915477,0,0.084368038,0.19048099,0){0,0,692603.24,0,0,544831.72,0,0,992852.93,0,0,-1178349.1,0,0,-1004107.1,0,0,-1809621.2,0,0,133849.22,0,0,301623.68,0,0,495817.1,0,0,1084450.2,0,0,749822.54,0,0,1401810.9,0,0,-894447.98,0,0,-933881.71,0,0,-1649308.4};
+VT(0.015758122,0.23699049,0,0.0069516057,0.23320895,0,0.011838853,0.2301677,0){0,0,597291.98,0,0,288078.49,0,0,504229.49,0,0,-1541119.1,0,0,-728952.19,0,0,-1254859.2,0,0,1837947.1,0,0,827497.2,0,0,1363834.1,0,0,-1363109.4,0,0,-537397.4,0,0,-775392.51,0,0,315646.37,0,0,-5267.3055,0,0,-209768.04};
+VT(0.054794838,0.043915046,0,0.053426379,0.049768916,0,0.046341114,0.044942776,0){0,0,3735662.6,0,0,3727873.1,0,0,3748809.1,0,0,2959425,0,0,2738031.5,0,0,2933624.2,0,0,1568238.5,0,0,1021148,0,0,1480431.3,0,0,-148813.91,0,0,-966926.63,0,0,-294933.53,0,0,-1835117.4,0,0,-2698501,0,0,-2006921.6};
+VT(0,0.28571429,0,0.0067236406,0.28198319,0,0.0093450955,0.28843768,0){0,0,0,0,0,76627.274,0,0,67949.514,0,0,0,0,0,-227172.13,0,0,-202850.84,0,0,0,0,0,369685.4,0,0,334776.34,0,0,0,0,0,-499127.77,0,0,-461793.67,0,0,0,0,0,610772.43,0,0,581935.08};
+VT(0.0093389246,0.011691623,0,0.006650898,0.018174199,0,0,0.014285714,0){0,0,1120186.5,0,0,801243.34,0,0,0,0,0,1103410.3,0,0,772347.91,0,0,0,0,0,1070108.3,0,0,715593.27,0,0,0,0,0,1020788.4,0,0,633022.27,0,0,0,0,0,956114.18,0,0,527557,0,0,0};
+VT(0,0.078571429,0,0.0064539684,0.081629255,0,0,0.085714286,0){0,0,0,0,0,711139.06,0,0,0,0,0,0,0,0,222377.16,0,0,0,0,0,0,0,0,-419239.47,0,0,0,0,0,0,0,0,-772749.89,0,0,0,0,0,0,0,0,-595288.06,0,0,0};
+VT(0.085714286,0.3,0,0.081165886,0.29137431,0,0.091323117,0.29067423,0){0,0,0,0,0,97729.953,0,0,51002.156,0,0,0,0,0,-292395.17,0,0,-152526.43,0,0,0,0,0,484687.71,0,0,252617.29,0,0,0,0,0,-673055.06,0,0,-350336.87,0,0,0,0,0,855744.16,0,0,444691.33};
+VT(0.054876921,0.07294965,0,0.060416267,0.076932239,0,0.054828578,0.081464579,0){0,0,3558755.8,0,0,3380545.3,0,0,3492382.6,0,0,1580988.4,0,0,1302521.2,0,0,1101278.5,0,0,-1275447.3,0,0,-1576156.6,0,0,-2043909.2,0,0,-3423192.1,0,0,-3485992.8,0,0,-3789901.6,0,0,-3669097.1,0,0,-3253298.6,0,0,-2941538.5};
+VT(0.091308694,0.0093164623,0,0.081119523,0.0085521597,0,0.085714286,0,0){0,0,1045151,0,0,2167108.8,0,0,1683752,0,0,1035216.9,0,0,2149779.2,0,0,1683802.7,0,0,1015442.8,0,0,2115263.6,0,0,1683911.1,0,0,986027.05,0,0,2063869.7,0,0,1684108.7,0,0,947106.05,0,0,1995657.9,0,0,1684003.7};
+VT(0.044666369,0.11545829,0,0.042557423,0.10832344,0,0.050721192,0.10961634,0){0,0,3148096.1,0,0,3183930.6,0,0,3257974.6,0,0,-920013.3,0,0,-492142.06,0,0,-583831.78,0,0,-3799301.5,0,0,-3600076,0,0,-3737290.3,0,0,-1769018.1,0,0,-2551523.2,0,0,-2483878.9,0,0,2547335.8,0,0,1442840.6,0,0,1698581.7};
+VT(0.076498673,0.26519709,0,0.083190767,0.25723975,0,0.085115353,0.26563346,0){0,0,473307.48,0,0,434158.6,0,0,313056.52,0,0,-1357765.2,0,0,-1216864.4,0,0,-899063.8,0,0,2063933,0,0,1759626.8,0,0,1369900.4,0,0,-2499100.3,0,0,-1955417.3,0,0,-1665255.4,0,0,2605934.6,0,0,1765235.2,0,0,1747205.8};
+VT(0.084917502,0.034253561,0,0.082493405,0.042375289,0,0.075978544,0.034466341,0){0,0,1742331.8,0,0,1978611.8,0,0,2615244.9,0,0,1520580.8,0,0,1595319.9,0,0,2278283.7,0,0,1105294,0,0,902966.17,0,0,1647758.2,0,0,549324.68,0,0,35643.43,0,0,804880.96,0,0,-76880.401,0,0,-838916.97,0,0,-142067.87};
+VT(0.061244461,0.14481879,0,0.068478919,0.13862632,0,0.069467767,0.146519,0){0,0,2643484.5,0,0,2426951.1,0,0,2287173.5,0,0,-2356788.3,0,0,-1850187.5,0,0,-2120501.9,0,0,-2899198.4,0,0,-2866745.3,0,0,-2441744.6,0,0,2042509.4,0,0,1169007.7,0,0,1942651.5,0,0,3121060.9,0,0,3144665.9,0,0,2583122};
+VT(0.030075176,0.23324008,0,0.022740693,0.23189018,0,0.026971271,0.22659033,0){0,0,1077047.3,0,0,887604.04,0,0,1090633.5,0,0,-2725827,0,0,-2230116.3,0,0,-2658504.1,0,0,3095770.8,0,0,2485475.6,0,0,2731189,0,0,-2013325.9,0,0,-1529145.6,0,0,-1267784.1,0,0,-13872.597,0,0,-172982.46,0,0,-909068.56};
+VT(0.071449289,0.19423207,0,0.076430303,0.18837043,0,0.079090117,0.19794942,0){0,0,1594804.6,0,0,1444535.6,0,0,1206859.6,0,0,-3019964.8,0,0,-2574453.4,0,0,-2368529.7,0,0,1103926.4,0,0,569102.25,0,0,1073015.3,0,0,2033518.7,0,0,2129625.3,0,0,1335740.9,0,0,-2921575.1,0,0,-2235391.7,0,0,-2359414.1};
+VT(0.01062282,0.18656765,0,0.0066871595,0.19241823,0,0,0.18571429,0){0,0,711483.53,0,0,432113.5,0,0,0,0,0,-1243147.4,0,0,-803518.34,0,0,0,0,0,217509.34,0,0,258472.73,0,0,0,0,0,1080570.1,0,0,581490.34,0,0,0,0,0,-1025407.6,0,0,-758588.26,0,0,0};
+VT(0.028699663,0.054481756,0,0.032659307,0.059686042,0,0.025221599,0.062165695,0){0,0,2920693,0,0,3158137.1,0,0,2618029.3,0,0,1995520.8,0,0,1964024.3,0,0,1547191.2,0,0,438210.61,0,0,27282.242,0,0,-156575.4,0,0,-1257984.1,0,0,-1919818.3,0,0,-1796512.5,0,0,-2556170.3,0,0,-3141270.1,0,0,-2702051.5};
+VT(0.032911969,0.081185013,0,0.033761495,0.088496681,0,0.027903545,0.087518505,0){0,0,3037931.3,0,0,3029395.9,0,0,2674848,0,0,971274.35,0,0,608605.12,0,0,580994.77,0,0,-1756226.8,0,0,-2298547.5,0,0,-1967676.8,0,0,-3289165.4,0,0,-3368980,0,0,-2976106,0,0,-2584916.3,0,0,-1747439.7,0,0,-1655065.1};
+VT(0.0084994266,0.025462386,0,0.0058133292,0.032528446,0,0,0.028571429,0){0,0,1014895.2,0,0,694559.72,0,0,0,0,0,943121.65,0,0,614750.96,0,0,0,0,0,804669.5,0,0,464300.7,0,0,0,0,0,609367.99,0,0,260495.38,0,0,0,0,0,370926.59,0,0,26512.55,0,0,0};
+VT(0,0.27142857,0,0.0060732531,0.2674669,0,0.0087746229,0.27470702,0){0,0,0,0,0,124750.88,0,0,139476.7,0,0,0,0,0,-359918.85,0,0,-408686.72,0,0,0,0,0,553735.12,0,0,649356.33,0,0,0,0,0,-683931.42,0,0,-844695.79,0,0,0,0,0,735399.5,0,0,980930.37};
+VT(0.007303543,0.20469543,0,0.015977634,0.20443356,0,0.013229009,0.21171696,0){0,0,422375.13,0,0,895779.15,0,0,698716.07,0,0,-880191.16,0,0,-1862602.8,0,0,-1540332.8,0,0,531663.92,0,0,1114548.4,0,0,1156621.3,0,0,303952.91,0,0,659707.69,0,0,147278.69,0,0,-861341.37,0,0,-1827076.9,0,0,-1334554.8};
+VT(0.036912897,0.21765752,0,0.045116599,0.21481108,0,0.042541479,0.22296234,0){0,0,1486590.9,0,0,1654487.5,0,0,1481591,0,0,-3421295.1,0,0,-3731787.4,0,0,-3531706.6,0,0,2965983.4,0,0,3030991.5,0,0,3405357.4,0,0,-438566.7,0,0,-73694.316,0,0,-1180392.3,0,0,-2395869.1,0,0,-2938909.4,0,0,-1772446.7};
+VT(0.038009007,0.015147577,0,0.029163144,0.015558324,0,0.031710863,0.0075461758,0){0,0,3597209.6,0,0,3068207,0,0,3254919.5,0,0,3506943.3,0,0,2986953.6,0,0,3234618.2,0,0,3328697.3,0,0,2826596.5,0,0,3194153.7,0,0,3067010.9,0,0,2591406.1,0,0,3133832.1,0,0,2728518.9,0,0,2287504.7,0,0,3053845.3};
+VT(0.077069107,0.15686929,0,0.070175425,0.16144206,0,0.070477538,0.15360968,0){0,0,1743907.9,0,0,2074683.8,0,0,2153625.7,0,0,-1994600,0,0,-2570674.4,0,0,-2316413.6,0,0,-1457243.4,0,0,-1460177,0,0,-1978592.7,0,0,2204191.1,0,0,2919916.2,0,0,2466066.8,0,0,1140253.2,0,0,762077.82,0,0,1792310.4};
+VT(0.077393474,0.16425214,0,0.070175425,0.16144206,0,0.077069107,0.15686929,0){0,0,1650679.7,0,0,2074683.8,0,0,1743907.9,0,0,-2141613.9,0,0,-2570674.4,0,0,-1994600,0,0,-1013799.5,0,0,-1460177,0,0,-1457243.4,0,0,2443278.1,0,0,2919916.2,0,0,2204191.1,0,0,287063.28,0,0,762077.82,0,0,1140253.2};
+VT(0.060825265,0.17090728,0,0.054395265,0.16699477,0,0.061476805,0.16269562,0){0,0,2288734.2,0,0,2465605.5,0,0,2391378.9,0,0,-3282960.5,0,0,-3338618.7,0,0,-3025373.1,0,0,-862639.89,0,0,-1283530.8,0,0,-1589341.3,0,0,3657845.3,0,0,3793219.5,0,0,3446908.2,0,0,-726586.11,0,0,-59660.123,0,0,675366.83};
+VT(0.08415119,0.061061125,0,0.079822506,0.065677674,0,0.076938259,0.060604721,0){0,0,1759442.9,0,0,2163855.5,0,0,2443533.2,0,0,1064240.3,0,0,1180001.4,0,0,1491930.8,0,0,-51487.645,0,0,-340376.77,0,0,-40674.57,0,0,-1146904.2,0,0,-1706002.2,0,0,-1557435.8,0,0,-1789550.6,0,0,-2296197.5,0,0,-2468002.6};
+VT(0.038843793,0.21103197,0,0.045116599,0.21481108,0,0.036912897,0.21765752,0){0,0,1637090.1,0,0,1654487.5,0,0,1486590.9,0,0,-3590120.4,0,0,-3731787.4,0,0,-3421295.1,0,0,2645890.8,0,0,3030991.5,0,0,2965983.4,0,0,433646.44,0,0,-73694.316,0,0,-438566.7,0,0,-3163532.2,0,0,-2938909.4,0,0,-2395869.1};
+VT(0.049165273,0.076760106,0,0.054876921,0.07294965,0,0.054828578,0.081464579,0){0,0,3570137.5,0,0,3558755.8,0,0,3492382.6,0,0,1384898,0,0,1580988.4,0,0,1101278.5,0,0,-1648055.9,0,0,-1275447.3,0,0,-2043909.2,0,0,-3672308.6,0,0,-3423192.1,0,0,-3789901.6,0,0,-3449021.3,0,0,-3669097.1,0,0,-2941538.5};
+VT(0.016927821,0.11108648,0,0.017861336,0.10270337,0,0.025770754,0.10718168,0){0,0,1644246.3,0,0,1773538.4,0,0,2378738.7,0,0,-340994.5,0,0,-87655.931,0,0,-316264.13,0,0,-1914445.6,0,0,-1856823.6,0,0,-2653040.8,0,0,-1176430.8,0,0,-1677437.3,0,0,-1984140.6,0,0,981584.41,0,0,261812.45,0,0,932667.69};
+VT(0.028699663,0.054481756,0,0.025221599,0.062165695,0,0.021658338,0.054940441,0){0,0,2920693,0,0,2618029.3,0,0,2341024.9,0,0,1995520.8,0,0,1547191.2,0,0,1587273.2,0,0,438210.61,0,0,-156575.4,0,0,322446.89,0,0,-1257984.1,0,0,-1796512.5,0,0,-1046241,0,0,-2556170.3,0,0,-2702051.5,0,0,-2078353.5};
+VT(0.050721192,0.10961634,0,0.054240748,0.10280037,0,0.059543685,0.10776494,0){0,0,3257974.6,0,0,3302360.6,0,0,3132791.5,0,0,-583831.78,0,0,-169115.68,0,0,-451048.14,0,0,-3737290.3,0,0,-3462856.5,0,0,-3519016.9,0,0,-2483878.9,0,0,-3116478.2,0,0,-2561357.9,0,0,1698581.7,0,0,505791.56,0,0,1326599.2};
+VT(0.059543685,0.10776494,0,0.054240748,0.10280037,0,0.061027247,0.098743066,0){0,0,3132791.5,0,0,3302360.6,0,0,3173016.6,0,0,-451048.14,0,0,-169115.68,0,0,72008.811,0,0,-3519016.9,0,0,-3462856.5,0,0,-3099474,0,0,-2561357.9,0,0,-3116478.2,0,0,-3241975.4,0,0,1326599.2,0,0,505791.56,0,0,-216202.29};
+VT(0.026971271,0.22659033,0,0.034969012,0.22634925,0,0.030075176,0.23324008,0){0,0,1090633.5,0,0,1299939.6,0,0,1077047.3,0,0,-2658504.1,0,0,-3164156.1,0,0,-2725827,0,0,2731189,0,0,3237729.2,0,0,3095770.8,0,0,-1267784.1,0,0,-1478956,0,0,-2013325.9,0,0,-909068.56,0,0,-1117524.9,0,0,-13872.597};
+VT(0.060432552,0.20227914,0,0.066992124,0.20847551,0,0.059551151,0.20970619,0){0,0,1798951.1,0,0,1540360.8,0,0,1688112.8,0,0,-3671781.8,0,0,-3311175.4,0,0,-3664209.4,0,0,2023610.8,0,0,2266191.6,0,0,2601193.1,0,0,1565241.8,0,0,706070.36,0,0,619333.89,0,0,-3653837,0,0,-3078419.5,0,0,-3326584.6};
+VT(0.066799394,0.09162077,0,0.058212185,0.089881183,0,0.064352171,0.083117586,0){0,0,2974160.1,0,0,3344291.6,0,0,3167194.8,0,0,440022.16,0,0,593905.21,0,0,915483.69,0,0,-2469083.6,0,0,-2645013.4,0,0,-1987167.2,0,0,-3274492.4,0,0,-3708817.1,0,0,-3477240.4,0,0,-1290097.2,0,0,-1722713.3,0,0,-2495770};
+VT(0.082942949,0.21818591,0,0.081656406,0.2108727,0,0.089437553,0.21298247,0){0,0,823054.75,0,0,951384.03,0,0,556322.48,0,0,-1901094.8,0,0,-2083808.1,0,0,-1238115.4,0,0,1667014.3,0,0,1528962.6,0,0,961021.23,0,0,-282341.7,0,0,263916.4,0,0,60411.18,0,0,-1297502.9,0,0,-1843401,0,0,-1035404.3};
+VT(0.072126291,0.10515927,0,0.069968451,0.098831219,0,0.079063451,0.10043005,0){0,0,2539730.3,0,0,2730411,0,0,2051820.1,0,0,-241283.81,0,0,57648.531,0,0,-16056.497,0,0,-2758172.2,0,0,-2671597.7,0,0,-2067914.3,0,0,-2254933.2,0,0,-2785714.6,0,0,-2035845.1,0,0,717337.89,0,0,-173126.8,0,0,48244.512};
+VT(0.1,0.014285714,0,0.093571257,0.018380777,0,0.091308694,0.0093164623,0){0,0,0,0,0,774815.13,0,0,1045151,0,0,0,0,0,746204.54,0,0,1035216.9,0,0,0,0,0,690036.86,0,0,1015442.8,0,0,0,0,0,608388.09,0,0,986027.05,0,0,0,0,0,504051.02,0,0,947106.05};
+VT(0.091323117,0.29067423,0,0.093593186,0.28160993,0,0.1,0.28571429,0){0,0,51002.156,0,0,74588.283,0,0,0,0,0,-152526.43,0,0,-221009.65,0,0,0,0,0,252617.29,0,0,359269.18,0,0,0,0,0,-350336.87,0,0,-484261.41,0,0,0,0,0,444691.33,0,0,591230.88,0,0,0};
+VT(0.027746664,0.13122119,0,0.030046638,0.13690443,0,0.021167753,0.13548502,0){0,0,2296333.1,0,0,2369378.2,0,0,1816935.7,0,0,-1399007.9,0,0,-1721516.8,0,0,-1266652.3,0,0,-2843055.5,0,0,-2840145.3,0,0,-2200669.4,0,0,288094.78,0,0,944948.24,0,0,600161.11,0,0,2955532.6,0,0,3098367.4,0,0,2382629.9};
+VT(0.044666369,0.11545829,0,0.051013063,0.11801667,0,0.045375723,0.12284566,0){0,0,3148096.1,0,0,3161388.4,0,0,3072436,0,0,-920013.3,0,0,-1083065.4,0,0,-1348503.3,0,0,-3799301.5,0,0,-3873486.3,0,0,-3829159.4,0,0,-1769018.1,0,0,-1463412.7,0,0,-800055.99,0,0,2547335.8,0,0,2911579,0,0,3380414.3};
+VT(0.1,0.085714286,0,0.093922759,0.092262381,0,0.08812606,0.087328167,0){0,0,0,0,0,652083.63,0,0,1269155.7,0,0,0,0,0,89312.894,0,0,279658.57,0,0,0,0,0,-550573,0,0,-927894.68,0,0,0,0,0,-715327.2,0,0,-1412053.3,0,0,0,0,0,-262838.8,0,0,-795447.99};
+VT(0.056766116,0.23329497,0,0.053624899,0.22742186,0,0.059957308,0.22757204,0){0,0,1298096.4,0,0,1430137,0,0,1366903.5,0,0,-3286228.7,0,0,-3503302.1,0,0,-3351367.9,0,0,3735031.6,0,0,3648370.9,0,0,3498598.8,0,0,-2434254.7,0,0,-1785483,0,0,-1727811.3,0,0,-7070.0355,0,0,-1060301.4,0,0,-990620.01};
+VT(0.032911969,0.081185013,0,0.025411973,0.082310594,0,0.026270926,0.075674812,0){0,0,3037931.3,0,0,2525130.6,0,0,2630439.6,0,0,971274.35,0,0,762374.09,0,0,1063205.3,0,0,-1756226.8,0,0,-1532614.6,0,0,-1137545.6,0,0,-3289165.4,0,0,-2757779.1,0,0,-2660659.2,0,0,-2584916.3,0,0,-2058136.4,0,0,-2599027.8};
+VT(0.1,0.057142857,0,0.09230899,0.063522919,0,0.08944657,0.05485846,0){0,0,0,0,0,877619.52,0,0,1211526.2,0,0,0,0,0,503392.8,0,0,822600.19,0,0,0,0,0,-85524.836,0,0,169573.91,0,0,0,0,0,-638068.15,0,0,-537958.1,0,0,0,0,0,-918939.46,0,0,-1073022.7};
+VT(0.034969012,0.22634925,0,0.037546984,0.23452457,0,0.030075176,0.23324008,0){0,0,1299939.6,0,0,1205921.7,0,0,1077047.3,0,0,-3164156.1,0,0,-3072707.6,0,0,-2725827,0,0,3237729.2,0,0,3550700.1,0,0,3095770.8,0,0,-1478956,0,0,-2423829.8,0,0,-2013325.9,0,0,-1117524.9,0,0,201013.93,0,0,-13872.597};
+VT(0.073708403,0.21517194,0,0.081656406,0.2108727,0,0.082942949,0.21818591,0){0,0,1225969.3,0,0,951384.03,0,0,823054.75,0,0,-2772471.1,0,0,-2083808.1,0,0,-1901094.8,0,0,2271379.1,0,0,1528962.6,0,0,1667014.3,0,0,-92677.622,0,0,263916.4,0,0,-282341.7,0,0,-2155133.8,0,0,-1843401,0,0,-1297502.9};
+VT(0.038464606,0.12667013,0,0.033010101,0.13109378,0,0.030575169,0.1246812,0){0,0,2859316.3,0,0,2584208,0,0,2526238.7,0,0,-1476046.2,0,0,-1567613,0,0,-1202245.8,0,0,-3573486.5,0,0,-3200932.4,0,0,-3156412.2,0,0,-252868.56,0,0,308418.11,0,0,-451924.48,0,0,3451249.3,0,0,3322264.5,0,0,2919641.1};
+VT(0.031264826,0.29263185,0,0.028198926,0.28535727,0,0.036602132,0.28491153,0){0,0,124484.17,0,0,230200.16,0,0,279518.56,0,0,-372709.78,0,0,-685197.76,0,0,-831596.18,0,0,618717.86,0,0,1124120.6,0,0,1362985.6,0,0,-861054.65,0,0,-1536674.3,0,0,-1860498.2,0,0,1098239.8,0,0,1912913.1,0,0,2311728.5};
+VT(0.030575169,0.1246812,0,0.033010101,0.13109378,0,0.027746664,0.13122119,0){0,0,2526238.7,0,0,2584208,0,0,2296333.1,0,0,-1202245.8,0,0,-1567613,0,0,-1399007.9,0,0,-3156412.2,0,0,-3200932.4,0,0,-2843055.5,0,0,-451924.48,0,0,308418.11,0,0,288094.78,0,0,2919641.1,0,0,3322264.5,0,0,2955532.6};
+VT(0.077013163,0.11736903,0,0.070840483,0.12204614,0,0.069025318,0.11622387,0){0,0,2095773.2,0,0,2470738.2,0,0,2631986.5,0,0,-691227.47,0,0,-1044803.2,0,0,-808686.45,0,0,-2559181.5,0,0,-3073782.1,0,0,-3192250.9,0,0,-1023961.4,0,0,-729197.53,0,0,-1402768.4,0,0,1873161.8,0,0,2652961,0,0,2220554.1};
+VT(0.037705658,0.25939989,0,0.034582704,0.26623209,0,0.030217898,0.25971254,0){0,0,758443.36,0,0,604041.77,0,0,660621.26,0,0,-2140288.6,0,0,-1737386.1,0,0,-1866014.4,0,0,3141072.6,0,0,2655775,0,0,2744196,0,0,-3582615.2,0,0,-3245580.1,0,0,-3141188.1,0,0,3385872.9,0,0,3433603.3,0,0,2987009.7};
+VT(0.084604507,0.15255901,0,0.08264437,0.14444108,0,0.09156348,0.14589395,0){0,0,1258841.2,0,0,1463951.5,0,0,734092.88,0,0,-1326319,0,0,-1293607.4,0,0,-670961.7,0,0,-1187789.9,0,0,-1614532.1,0,0,-791796.8,0,0,1390056.3,0,0,1105781,0,0,602866.55,0,0,1113216.6,0,0,1743195.6,0,0,843431.47};
+VT(0.09156348,0.14589395,0,0.08264437,0.14444108,0,0.087083587,0.13880919,0){0,0,734092.88,0,0,1463951.5,0,0,1144744.3,0,0,-670961.7,0,0,-1293607.4,0,0,-877072.07,0,0,-791796.8,0,0,-1614532.1,0,0,-1349889.8,0,0,602866.55,0,0,1105781,0,0,561444.4,0,0,843431.47,0,0,1743195.6,0,0,1481228.8};
+VT(0.034582704,0.26623209,0,0.027951851,0.26533243,0,0.030217898,0.25971254,0){0,0,604041.77,0,0,539100.43,0,0,660621.26,0,0,-1737386.1,0,0,-1547025.6,0,0,-1866014.4,0,0,2655775,0,0,2353298.6,0,0,2744196,0,0,-3245580.1,0,0,-2852826.8,0,0,-3141188.1,0,0,3433603.3,0,0,2980285,0,0,2987009.7};
+VT(0.043573225,0.18196099,0,0.038433858,0.18005903,0,0.041643161,0.17482395,0){0,0,2202933.2,0,0,2131117.1,0,0,2284160.6,0,0,-3650165.7,0,0,-3450732.6,0,0,-3458410.7,0,0,195066.32,0,0,5612.0128,0,0,-506290.81,0,0,3522129.2,0,0,3447337.8,0,0,3718851.8,0,0,-2509350,0,0,-2140463.9,0,0,-1405815.9};
+VT(0.019247887,0.048569646,0,0.014691551,0.054118398,0,0.013132659,0.04767246,0){0,0,2135187.8,0,0,1659245.8,0,0,1507774.2,0,0,1594654.5,0,0,1140472.1,0,0,1139737.5,0,0,650408.09,0,0,265092.56,0,0,493500.09,0,0,-458538.7,0,0,-693242.8,0,0,-273193.01,0,0,-1451674.1,0,0,-1435183.5,0,0,-973395.4};
+VT(0.021167753,0.13548502,0,0.023379755,0.12686903,0,0.027746664,0.13122119,0){0,0,1816935.7,0,0,2047772.9,0,0,2296333.1,0,0,-1266652.3,0,0,-1065433.1,0,0,-1399007.9,0,0,-2200669.4,0,0,-2558991,0,0,-2843055.5,0,0,600161.11,0,0,-162203.53,0,0,288094.78,0,0,2382629.9,0,0,2481221.5,0,0,2955532.6};
+VT(0.044666369,0.11545829,0,0.038084092,0.1145524,0,0.042557423,0.10832344,0){0,0,3148096.1,0,0,2981407.2,0,0,3183930.6,0,0,-920013.3,0,0,-818508.93,0,0,-492142.06,0,0,-3799301.5,0,0,-3575257.7,0,0,-3600076,0,0,-1769018.1,0,0,-1775238,0,0,-2551523.2,0,0,2547335.8,0,0,2287308.3,0,0,1442840.6};
+VT(0.021658338,0.054940441,0,0.014691551,0.054118398,0,0.019247887,0.048569646,0){0,0,2341024.9,0,0,1659245.8,0,0,2135187.8,0,0,1587273.2,0,0,1140472.1,0,0,1594654.5,0,0,322446.89,0,0,265092.56,0,0,650408.09,0,0,-1046241,0,0,-693242.8,0,0,-458538.7,0,0,-2078353.5,0,0,-1435183.5,0,0,-1451674.1};
+VT(0.061027247,0.098743066,0,0.065931692,0.10408722,0,0.059543685,0.10776494,0){0,0,3173016.6,0,0,2911358.9,0,0,3132791.5,0,0,72008.811,0,0,-218409.17,0,0,-451048.14,0,0,-3099474,0,0,-3113407,0,0,-3519016.9,0,0,-3241975.4,0,0,-2661455,0,0,-2561357.9,0,0,-216202.29,0,0,651464.78,0,0,1326599.2};
+VT(0,0.22142857,0,0.0051799073,0.21317882,0,0.010546892,0.2198034,0){0,0,0,0,0,276031.48,0,0,514716.79,0,0,0,0,0,-615227.88,0,0,-1201974.2,0,0,0,0,0,479976.29,0,0,1090194.6,0,0,0,0,0,25450.705,0,0,-253690.09,0,0,0,0,0,-511551.59,0,0,-751659.26};
+VT(0,0.12857143,0,0.0072553778,0.13224921,0,0,0.13571429,0){0,0,0,0,0,674958.82,0,0,0,0,0,0,0,0,-425463.67,0,0,0,0,0,0,0,0,-832230.25,0,0,0,0,0,0,0,0,117822.57,0,0,0,0,0,0,0,0,875622.71,0,0,0};
+VT(0.059543685,0.10776494,0,0.05615957,0.1141762,0,0.050721192,0.10961634,0){0,0,3132791.5,0,0,3147681.4,0,0,3257974.6,0,0,-451048.14,0,0,-840990.83,0,0,-583831.78,0,0,-3519016.9,0,0,-3764018.8,0,0,-3737290.3,0,0,-2561357.9,0,0,-1917372.9,0,0,-2483878.9,0,0,1326599.2,0,0,2358868.4,0,0,1698581.7};
+VT(0.043491003,0.26677795,0,0.045592054,0.27439642,0,0.037999827,0.27482627,0){0,0,657627.62,0,0,513714.39,0,0,474219.19,0,0,-1894105.9,0,0,-1504437.2,0,0,-1389905,0,0,2903724.9,0,0,2387679.2,0,0,2209621.2,0,0,-3565612.1,0,0,-3100344.3,0,0,-2876809.4,0,0,3800401.2,0,0,3591305.7,0,0,3345267.4};
+VT(0.075422073,0.20645372,0,0.081656406,0.2108727,0,0.073708403,0.21517194,0){0,0,1273700.5,0,0,951384.03,0,0,1225969.3,0,0,-2693470,0,0,-2083808.1,0,0,-2772471.1,0,0,1728669,0,0,1528962.6,0,0,2271379.1,0,0,766631.5,0,0,263916.4,0,0,-92677.622,0,0,-2583646.6,0,0,-1843401,0,0,-2155133.8};
+VT(0.048663579,0.053435419,0,0.042113175,0.053290167,0,0.046341114,0.044942776,0){0,0,3726394.8,0,0,3616583.4,0,0,3748809.1,0,0,2589713.3,0,0,2519252.9,0,0,2933624.2,0,0,663071.82,0,0,657513.67,0,0,1480431.3,0,0,-1465861.1,0,0,-1403801.4,0,0,-294933.53,0,0,-3147918.6,0,0,-3039615.4,0,0,-2006921.6};
+VT(0.074105201,0.11070107,0,0.076969725,0.10634022,0,0.082583958,0.10907049,0){0,0,2359475.3,0,0,2181001.1,0,0,1698614.9,0,0,-471755.94,0,0,-255488.75,0,0,-286603.09,0,0,-2736894.8,0,0,-2406546.5,0,0,-1936849,0,0,-1717960.7,0,0,-1869163.7,0,0,-1323464.6,0,0,1362139.4,0,0,756176.24,0,0,836522.31};
+VT(0.08812606,0.087328167,0,0.081743274,0.092625466,0,0.079265602,0.086677581,0){0,0,1269155.7,0,0,1862860,0,0,2114636.1,0,0,279658.57,0,0,243386.47,0,0,488789.06,0,0,-927894.68,0,0,-1587731,0,0,-1512904.7,0,0,-1412053.3,0,0,-2038652.4,0,0,-2351470.6,0,0,-795447.99,0,0,-717394.49,0,0,-1382326.1};
+VT(0.079090117,0.19794942,0,0.076430303,0.18837043,0,0.084368038,0.19048099,0){0,0,1206859.6,0,0,1444535.6,0,0,992852.93,0,0,-2368529.7,0,0,-2574453.4,0,0,-1809621.2,0,0,1073015.3,0,0,569102.25,0,0,495817.1,0,0,1335740.9,0,0,2129625.3,0,0,1401810.9,0,0,-2359414.1,0,0,-2235391.7,0,0,-1649308.4};
+VT(0.0071147476,0.24137211,0,0.0069516057,0.23320895,0,0.015758122,0.23699049,0){0,0,259907.57,0,0,288078.49,0,0,597291.98,0,0,-684802.64,0,0,-728952.19,0,0,-1541119.1,0,0,859611.54,0,0,827497.2,0,0,1837947.1,0,0,-720499.62,0,0,-537397.4,0,0,-1363109.4,0,0,317972.39,0,0,-5267.3055,0,0,315646.37};
+VT(0.075872285,0.081656016,0,0.074756101,0.075901522,0,0.082390534,0.079333541,0){0,0,2427639,0,0,2549479.1,0,0,1865676.5,0,0,758134.07,0,0,1021825.1,0,0,650380.91,0,0,-1432759.9,0,0,-1118145.3,0,0,-988603.29,0,0,-2638364.3,0,0,-2588166.7,0,0,-1983689.6,0,0,-2029677.1,0,0,-2507455.8,0,0,-1686881.4};
+VT(0,0.078571429,0,0.0060853536,0.074713803,0,0.0064539684,0.081629255,0){0,0,0,0,0,681675.12,0,0,711139.06,0,0,0,0,0,285253.65,0,0,222377.16,0,0,0,0,0,-277070.48,0,0,-419239.47,0,0,0,0,0,-678306.76,0,0,-772749.89,0,0,0,0,0,-685312.86,0,0,-595288.06};
+VT(0.050960377,0.23252058,0,0.053624899,0.22742186,0,0.056766116,0.23329497,0){0,0,1342135.9,0,0,1430137,0,0,1298096.4,0,0,-3383651.2,0,0,-3503302.1,0,0,-3286228.7,0,0,3804738.6,0,0,3648370.9,0,0,3735031.6,0,0,-2403721.7,0,0,-1785483,0,0,-2434254.7,0,0,-148681.88,0,0,-1060301.4,0,0,-7070.0355};
+VT(0.085714286,0.3,0,0.091323117,0.29067423,0,0.092857143,0.3,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0};
+VT(0.1,0.014285714,0,0.091308694,0.0093164623,0,0.1,0.0071428571,0){0,0,0,0,0,1045151,0,0,0,0,0,0,0,0,1035216.9,0,0,0,0,0,0,0,0,1015442.8,0,0,0,0,0,0,0,0,986027.05,0,0,0,0,0,0,0,0,947106.05,0,0,0};
+VT(0.056317057,0.058022103,0,0.061015306,0.048529238,0,0.066012722,0.055502179,0){0,0,3630316.8,0,0,3533367.8,0,0,3257272.9,0,0,2330872.5,0,0,2640342.3,0,0,2187557.2,0,0,197001.66,0,0,1080012.2,0,0,399401.17,0,0,-2007682.1,0,0,-753291.7,0,0,-1519988.7,0,0,-3494460.7,0,0,-2396723.8,0,0,-2940625.1};
+VT(0.092857143,0,0,0.091308694,0.0093164623,0,0.085714286,0,0){0,0,863626.15,0,0,1045151,0,0,1683752,0,0,863662.39,0,0,1035216.9,0,0,1683802.7,0,0,863732,0,0,1015442.8,0,0,1683911.1,0,0,863838.35,0,0,986027.05,0,0,1684108.7,0,0,863813.95,0,0,947106.05,0,0,1684003.7};
+VT(0.1,0.29285714,0,0.091323117,0.29067423,0,0.1,0.28571429,0){0,0,0,0,0,51002.156,0,0,0,0,0,0,0,0,-152526.43,0,0,0,0,0,0,0,0,252617.29,0,0,0,0,0,0,0,0,-350336.87,0,0,0,0,0,0,0,0,444691.33,0,0,0};
+VT(0.03928574,0.29335694,0,0.031264826,0.29263185,0,0.036602132,0.28491153,0){0,0,127378.94,0,0,124484.17,0,0,279518.56,0,0,-381522.06,0,0,-372709.78,0,0,-831596.18,0,0,633829.06,0,0,618717.86,0,0,1362985.6,0,0,-883092.25,0,0,-861054.65,0,0,-1860498.2,0,0,1127859.7,0,0,1098239.8,0,0,2311728.5};
+VT(0.038009007,0.015147577,0,0.031710863,0.0075461758,0,0.039686874,0.0066116125,0){0,0,3597209.6,0,0,3254919.5,0,0,3676489.9,0,0,3506943.3,0,0,3234618.2,0,0,3658909.3,0,0,3328697.3,0,0,3194153.7,0,0,3623831.1,0,0,3067010.9,0,0,3133832.1,0,0,3571457.2,0,0,2728518.9,0,0,3053845.3,0,0,3501797.4};
+VT(0.066803853,0.25459223,0,0.071915087,0.24816524,0,0.074279052,0.25633166,0){0,0,789541.66,0,0,803363.84,0,0,635900.39,0,0,-2193455.3,0,0,-2179152.4,0,0,-1777029.4,0,0,3110738.9,0,0,2928525.2,0,0,2553015.8,0,0,-3337877,0,0,-2836050.6,0,0,-2804423.5,0,0,2824240.3,0,0,1927975,0,0,2479429.3};
+VT(0.0071908097,0.26035264,0,0.013885016,0.25805955,0,0.014305262,0.26641769,0){0,0,179155.76,0,0,357160.64,0,0,294901.31,0,0,-507033.49,0,0,-1003688.5,0,0,-848621.76,0,0,748779.14,0,0,1459712.7,0,0,1298521.9,0,0,-863311.12,0,0,-1638678.7,0,0,-1589572.3,0,0,830950.48,0,0,1506406.6,0,0,1686004.5};
+VT(0,0.28571429,0,0.0045473776,0.2936365,0,0,0.29285714,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0};
+VT(0,0.0071428571,0,0.0045481906,0.0063920675,0,0,0.014285714,0){0,0,0,0,0,552257.15,0,0,0,0,0,0,0,0,549810.55,0,0,0,0,0,0,0,0,544927.47,0,0,0,0,0,0,0,0,537633.65,0,0,0,0,0,0,0,0,527798.54,0,0,0};
+VT(0.084604507,0.15255901,0,0.076625322,0.14929356,0,0.08264437,0.14444108,0){0,0,1258841.2,0,0,1845555.4,0,0,1463951.5,0,0,-1326319,0,0,-1818255.1,0,0,-1293607.4,0,0,-1187789.9,0,0,-1872475.3,0,0,-1614532.1,0,0,1390056.3,0,0,1790618.2,0,0,1105781,0,0,1113216.6,0,0,1898765.5,0,0,1743195.6};
+VT(0.041803352,0.076750149,0,0.047307891,0.081963043,0,0.041002292,0.08644635,0){0,0,3453761.9,0,0,3516083,0,0,3351345,0,0,1340279.2,0,0,1080946.4,0,0,787437.3,0,0,-1593440.1,0,0,-2102837.3,0,0,-2379027.1,0,0,-3552303.7,0,0,-3830300,0,0,-3725698.5,0,0,-3337911.6,0,0,-2905310.5,0,0,-2222336.9};
+VT(0,0.21428571,0,0.0051799073,0.21317882,0,0,0.22142857,0){0,0,0,0,0,276031.48,0,0,0,0,0,0,0,0,-615227.88,0,0,0,0,0,0,0,0,479976.29,0,0,0,0,0,0,0,0,25450.705,0,0,0,0,0,0,0,0,-511551.59,0,0,0};
+VT(0.082390534,0.079333541,0,0.074756101,0.075901522,0,0.080160084,0.071577727,0){0,0,1865676.5,0,0,2549479.1,0,0,2107851.9,0,0,650380.91,0,0,1021825.1,0,0,977984.82,0,0,-988603.29,0,0,-1118145.3,0,0,-676141.96,0,0,-1983689.6,0,0,-2588166.7,0,0,-1967920.1,0,0,-1686881.4,0,0,-2507455.8,0,0,-2205119.3};
+VT(0.065478411,0.24860928,0,0.071915087,0.24816524,0,0.066803853,0.25459223,0){0,0,912058.17,0,0,803363.84,0,0,789541.66,0,0,-2478342.9,0,0,-2179152.4,0,0,-2193455.3,0,0,3344041.2,0,0,2928525.2,0,0,3110738.9,0,0,-3264436.9,0,0,-2836050.6,0,0,-3337877,0,0,2261773.6,0,0,1927975,0,0,2824240.3};
+VT(0.08812606,0.087328167,0,0.079265602,0.086677581,0,0.082390534,0.079333541,0){0,0,1269155.7,0,0,2114636.1,0,0,1865676.5,0,0,279658.57,0,0,488789.06,0,0,650380.91,0,0,-927894.68,0,0,-1512904.7,0,0,-988603.29,0,0,-1412053.3,0,0,-2351470.6,0,0,-1983689.6,0,0,-795447.99,0,0,-1382326.1,0,0,-1686881.4};
+VT(0.064832361,0.062804408,0,0.059054943,0.066788508,0,0.056317057,0.058022103,0){0,0,3281120.4,0,0,3499189.3,0,0,3630316.8,0,0,1912310.8,0,0,1856149.2,0,0,2330872.5,0,0,-254314.65,0,0,-658492.2,0,0,197001.66,0,0,-2314932.7,0,0,-2864039.1,0,0,-2007682.1,0,0,-3410309.6,0,0,-3725081.1,0,0,-3494460.7};
+VT(0.045416206,0.061541227,0,0.047469022,0.070467195,0,0.041057987,0.068843254,0){0,0,3642820.9,0,0,3608010.8,0,0,3488848.8,0,0,2181474.8,0,0,1730907.5,0,0,1752771.3,0,0,-155055.51,0,0,-1046792,0,0,-855539,0,0,-2429600.5,0,0,-3280034.9,0,0,-3038218.5,0,0,-3730025.8,0,0,-3807136.9,0,0,-3709409.4};
+VT(0.081119523,0.0085521597,0,0.078020383,0.017034313,0,0.073684623,0.0112317,0){0,0,2167108.8,0,0,2461848.1,0,0,2850123.3,0,0,2149779.2,0,0,2383750.6,0,0,2810738.2,0,0,2115263.6,0,0,2230032.5,0,0,2732509.2,0,0,2063869.7,0,0,2005590.6,0,0,2616540.6,0,0,1995657.9,0,0,1717239.5,0,0,2464223.2};
+VT(0.073754091,0.28851618,0,0.078222118,0.28277283,0,0.081165886,0.29137431,0){0,0,171229.59,0,0,220930.92,0,0,97729.953,0,0,-511212.67,0,0,-655625.13,0,0,-292395.17,0,0,843808.82,0,0,1069057.6,0,0,484687.71,0,0,-1164215.8,0,0,-1447830.3,0,0,-673055.06,0,0,1467609.3,0,0,1779434.3,0,0,855744.16};
+VT(0.029124573,0.24658198,0,0.025641665,0.25311603,0,0.02133326,0.24577003,0){0,0,849052.23,0,0,680173.91,0,0,675269.21,0,0,-2288340.2,0,0,-1879847.5,0,0,-1813848.4,0,0,3030093.5,0,0,2635470.4,0,0,2383092.9,0,0,-2848204.4,0,0,-2768550.2,0,0,-2204305.3,0,0,1797881.3,0,0,2247361.6,0,0,1333319.6};
+VT(0.02133326,0.24577003,0,0.025641665,0.25311603,0,0.018179834,0.25267212,0){0,0,675269.21,0,0,680173.91,0,0,514543.14,0,0,-1813848.4,0,0,-1879847.5,0,0,-1419813.2,0,0,2383092.9,0,0,2635470.4,0,0,1983439.5,0,0,-2204305.3,0,0,-2768550.2,0,0,-2069793.3,0,0,1333319.6,0,0,2247361.6,0,0,1657747.8};
+VT(0.036912897,0.21765752,0,0.030490983,0.2108424,0,0.038843793,0.21103197,0){0,0,1486590.9,0,0,1428644.1,0,0,1637090.1,0,0,-3421295.1,0,0,-3128471,0,0,-3590120.4,0,0,2965983.4,0,0,2293671,0,0,2645890.8,0,0,-438566.7,0,0,399562.24,0,0,433646.44,0,0,-2395869.1,0,0,-2769801.9,0,0,-3163532.2};
+VT(0.089437553,0.21298247,0,0.091864029,0.22106993,0,0.082942949,0.21818591,0){0,0,556322.48,0,0,394005.54,0,0,823054.75,0,0,-1238115.4,0,0,-927852.61,0,0,-1901094.8,0,0,961021.23,0,0,863120.02,0,0,1667014.3,0,0,60411.18,0,0,-241435.16,0,0,-282341.7,0,0,-1035404.3,0,0,-536498.87,0,0,-1297502.9};
+VT(0.0060732531,0.2674669,0,0.0071908097,0.26035264,0,0.014305262,0.26641769,0){0,0,124750.88,0,0,179155.76,0,0,294901.31,0,0,-359918.85,0,0,-507033.49,0,0,-848621.76,0,0,553735.12,0,0,748779.14,0,0,1298521.9,0,0,-683931.42,0,0,-863311.12,0,0,-1589572.3,0,0,735399.5,0,0,830950.48,0,0,1686004.5};
+VT(0.082583958,0.10907049,0,0.08466046,0.11619385,0,0.077013163,0.11736903,0){0,0,1698614.9,0,0,1475783,0,0,2095773.2,0,0,-286603.09,0,0,-452604.25,0,0,-691227.47,0,0,-1936849,0,0,-1789662.1,0,0,-2559181.5,0,0,-1323464.6,0,0,-788262.21,0,0,-1023961.4,0,0,836522.31,0,0,1243195.1,0,0,1873161.8};
+VT(0.060672554,0.13561545,0,0.068478919,0.13862632,0,0.061244461,0.14481879,0){0,0,2778852.8,0,0,2426951.1,0,0,2643484.5,0,0,-1944873,0,0,-1850187.5,0,0,-2356788.3,0,0,-3362653.4,0,0,-2866745.3,0,0,-2899198.4,0,0,935707.85,0,0,1169007.7,0,0,2042509.4,0,0,3643681.7,0,0,3144665.9,0,0,3121060.9};
+VT(0.037999827,0.27482627,0,0.045044357,0.28188841,0,0.036602132,0.28491153,0){0,0,474219.19,0,0,362990.51,0,0,279518.56,0,0,-1389905,0,0,-1075960.6,0,0,-831596.18,0,0,2209621.2,0,0,1750378.7,0,0,1362985.6,0,0,-2876809.4,0,0,-2362097.1,0,0,-1860498.2,0,0,3345267.4,0,0,2889034,0,0,2311728.5};
+VT(0.014137494,0.034012185,0,0.0063343033,0.038958017,0,0.0058133292,0.032528446,0){0,0,1641076.4,0,0,751213.74,0,0,694559.72,0,0,1435142,0,0,627892.11,0,0,614750.96,0,0,1049094.4,0,0,401490.67,0,0,464300.7,0,0,531342.12,0,0,109174.99,0,0,260495.38,0,0,-53364.585,0,0,-201236.23,0,0,26512.55};
+VT(0.070865224,0.080352924,0,0.072044079,0.08604506,0,0.064352171,0.083117586,0){0,0,2808030.6,0,0,2688599.4,0,0,3167194.8,0,0,934415.1,0,0,649473.83,0,0,915483.69,0,0,-1562677.5,0,0,-1882262.6,0,0,-1987167.2,0,0,-3017110.1,0,0,-2986497.2,0,0,-3477240.4,0,0,-2458745.5,0,0,-1825996.4,0,0,-2495770};
+VT(0.061476805,0.16269562,0,0.067098511,0.16826118,0,0.060825265,0.17090728,0){0,0,2391378.9,0,0,2121688.2,0,0,2288734.2,0,0,-3025373.1,0,0,-2928224.5,0,0,-3282960.5,0,0,-1589341.3,0,0,-1008555.7,0,0,-862639.89,0,0,3446908.2,0,0,3311710.7,0,0,3657845.3,0,0,675366.83,0,0,-250662.47,0,0,-726586.11};
+VT(0.052494391,0.065958781,0,0.047469022,0.070467195,0,0.045416206,0.061541227,0){0,0,3640248,0,0,3608010.8,0,0,3642820.9,0,0,1971511.2,0,0,1730907.5,0,0,2181474.8,0,0,-601016.65,0,0,-1046792,0,0,-155055.51,0,0,-2898090,0,0,-3280034.9,0,0,-2429600.5,0,0,-3866942,0,0,-3807136.9,0,0,-3730025.8};
+VT(0.034786476,0.1076516,0,0.030466665,0.11568191,0,0.025770754,0.10718168,0){0,0,2912738.3,0,0,2608170,0,0,2378738.7,0,0,-413135.58,0,0,-773675.45,0,0,-316264.13,0,0,-3267374.9,0,0,-3152461.4,0,0,-2653040.8,0,0,-2390915.6,0,0,-1443702.3,0,0,-1984140.6,0,0,1215377.6,0,0,2136967.4,0,0,932667.69};
+VT(0.054828578,0.081464579,0,0.058212185,0.089881183,0,0.049739958,0.088394034,0){0,0,3492382.6,0,0,3344291.6,0,0,3472240.4,0,0,1101278.5,0,0,593905.21,0,0,703521.31,0,0,-2043909.2,0,0,-2645013.4,0,0,-2626240.1,0,0,-3789901.6,0,0,-3708817.1,0,0,-3862017.3,0,0,-2941538.5,0,0,-1722713.3,0,0,-2018648.2};
+VT(0.079063451,0.10043005,0,0.069968451,0.098831219,0,0.07492972,0.092844339,0){0,0,2051820.1,0,0,2730411,0,0,2431427.6,0,0,-16056.497,0,0,57648.531,0,0,308451.38,0,0,-2067914.3,0,0,-2671597.7,0,0,-2083891.4,0,0,-2035845.1,0,0,-2785714.6,0,0,-2656803.1,0,0,48244.512,0,0,-173126.8,0,0,-910298.79};
+VT(0.013878694,0.17880836,0,0.020636298,0.17424253,0,0.021251228,0.18136297,0){0,0,971566.52,0,0,1433869.3,0,0,1398279.8,0,0,-1548960.4,0,0,-2154082.5,0,0,-2300353.4,0,0,-51095.574,0,0,-351921.61,0,0,85724.805,0,0,1579530,0,0,2330929.4,0,0,2245163.6,0,0,-887966.26,0,0,-819073.82,0,0,-1534338.6};
+VT(0.085905658,0.016824409,0,0.078020383,0.017034313,0,0.081119523,0.0085521597,0){0,0,1656238,0,0,2461848.1,0,0,2167108.8,0,0,1604967.9,0,0,2383750.6,0,0,2149779.2,0,0,1504009.2,0,0,2230032.5,0,0,2115263.6,0,0,1356492.3,0,0,2005590.6,0,0,2063869.7,0,0,1166855,0,0,1717239.5,0,0,1995657.9};
+VT(0.081165886,0.29137431,0,0.078222118,0.28277283,0,0.08596482,0.28314521,0){0,0,97729.953,0,0,220930.92,0,0,145967.81,0,0,-292395.17,0,0,-655625.13,0,0,-433371.98,0,0,484687.71,0,0,1069057.6,0,0,707326.96,0,0,-673055.06,0,0,-1447830.3,0,0,-959333.22,0,0,855744.16,0,0,1779434.3,0,0,1181452.3};
+VT(0.021167753,0.13548502,0,0.017312959,0.14496605,0,0.012304267,0.13852123,0){0,0,1816935.7,0,0,1456929,0,0,1094693.2,0,0,-1266652.3,0,0,-1303417.8,0,0,-832176.34,0,0,-2200669.4,0,0,-1594293.7,0,0,-1294374.3,0,0,600161.11,0,0,1135517.7,0,0,521821.54,0,0,2382629.9,0,0,1713822.2,0,0,1419655.5};
+VT(0.026018946,0.14387862,0,0.017312959,0.14496605,0,0.021167753,0.13548502,0){0,0,2064539,0,0,1456929,0,0,1816935.7,0,0,-1800072.3,0,0,-1303417.8,0,0,-1266652.3,0,0,-2295230.1,0,0,-1594293.7,0,0,-2200669.4,0,0,1506177.8,0,0,1135517.7,0,0,600161.11,0,0,2488196.2,0,0,1713822.2,0,0,2382629.9};
+VT(0.014137494,0.034012185,0,0.0058133292,0.032528446,0,0.0084994266,0.025462386,0){0,0,1641076.4,0,0,694559.72,0,0,1014895.2,0,0,1435142,0,0,614750.96,0,0,943121.65,0,0,1049094.4,0,0,464300.7,0,0,804669.5,0,0,531342.12,0,0,260495.38,0,0,609367.99,0,0,-53364.585,0,0,26512.55,0,0,370926.59};
+VT(0.0087746229,0.27470702,0,0.0060732531,0.2674669,0,0.014305262,0.26641769,0){0,0,139476.7,0,0,124750.88,0,0,294901.31,0,0,-408686.72,0,0,-359918.85,0,0,-848621.76,0,0,649356.33,0,0,553735.12,0,0,1298521.9,0,0,-844695.79,0,0,-683931.42,0,0,-1589572.3,0,0,980930.37,0,0,735399.5,0,0,1686004.5};
+VT(0.045375723,0.12284566,0,0.040442009,0.11996282,0,0.044666369,0.11545829,0){0,0,3072436,0,0,2999410,0,0,3148096.1,0,0,-1348503.3,0,0,-1143461.2,0,0,-920013.3,0,0,-3829159.4,0,0,-3706983.7,0,0,-3799301.5,0,0,-800055.99,0,0,-1150363.3,0,0,-1769018.1,0,0,3380414.3,0,0,2995190.5,0,0,2547335.8};
+VT(0,0.18571429,0,0.0066871595,0.19241823,0,0,0.19285714,0){0,0,0,0,0,432113.5,0,0,0,0,0,0,0,0,-803518.34,0,0,0,0,0,0,0,0,258472.73,0,0,0,0,0,0,0,0,581490.34,0,0,0,0,0,0,0,0,-758588.26,0,0,0};
+VT(0.038464606,0.12667013,0,0.030575169,0.1246812,0,0.035619257,0.12028764,0){0,0,2859316.3,0,0,2526238.7,0,0,2821397.9,0,0,-1476046.2,0,0,-1202245.8,0,0,-1093830.4,0,0,-3573486.5,0,0,-3156412.2,0,0,-3491178.8,0,0,-252868.56,0,0,-451924.48,0,0,-1043884.2,0,0,3451249.3,0,0,2919641.1,0,0,2851838.9};
+VT(0.025770754,0.10718168,0,0.017861336,0.10270337,0,0.024938414,0.098415267,0){0,0,2378738.7,0,0,1773538.4,0,0,2383058.5,0,0,-316264.13,0,0,-87655.931,0,0,68195.72,0,0,-2653040.8,0,0,-1856823.6,0,0,-2312962.3,0,0,-1984140.6,0,0,-1677437.3,0,0,-2447461.4,0,0,932667.69,0,0,261812.45,0,0,-204726.33};
+VT(0.022740693,0.23189018,0,0.025350652,0.23917347,0,0.015758122,0.23699049,0){0,0,887604.04,0,0,868665.73,0,0,597291.98,0,0,-2230116.3,0,0,-2265304,0,0,-1541119.1,0,0,2485475.6,0,0,2773502.3,0,0,1837947.1,0,0,-1529145.6,0,0,-2193941.8,0,0,-1363109.4,0,0,-172982.46,0,0,753574.67,0,0,315646.37};
+VT(0.032911969,0.081185013,0,0.041803352,0.076750149,0,0.041002292,0.08644635,0){0,0,3037931.3,0,0,3453761.9,0,0,3351345,0,0,971274.35,0,0,1340279.2,0,0,787437.3,0,0,-1756226.8,0,0,-1593440.1,0,0,-2379027.1,0,0,-3289165.4,0,0,-3552303.7,0,0,-3725698.5,0,0,-2584916.3,0,0,-3337911.6,0,0,-2222336.9};
+VT(0.0087746229,0.27470702,0,0.0067236406,0.28198319,0,0,0.27857143,0){0,0,139476.7,0,0,76627.274,0,0,0,0,0,-408686.72,0,0,-227172.13,0,0,0,0,0,649356.33,0,0,369685.4,0,0,0,0,0,-844695.79,0,0,-499127.77,0,0,0,0,0,980930.37,0,0,610772.43,0,0,0};
+VT(0,0.021428571,0,0.006650898,0.018174199,0,0.0084994266,0.025462386,0){0,0,0,0,0,801243.34,0,0,1014895.2,0,0,0,0,0,772347.91,0,0,943121.65,0,0,0,0,0,715593.27,0,0,804669.5,0,0,0,0,0,633022.27,0,0,609367.99,0,0,0,0,0,527557,0,0,370926.59};
+VT(0.013229009,0.21171696,0,0.018343869,0.21720619,0,0.010546892,0.2198034,0){0,0,698716.07,0,0,888277.19,0,0,514716.79,0,0,-1540332.8,0,0,-2037897.4,0,0,-1201974.2,0,0,1156621.3,0,0,1749211,0,0,1090194.6,0,0,147278.69,0,0,-225952.88,0,0,-253690.09,0,0,-1334554.8,0,0,-1457259.1,0,0,-751659.26};
+VT(0.010546892,0.2198034,0,0.018343869,0.21720619,0,0.017207343,0.22323305,0){0,0,514716.79,0,0,888277.19,0,0,781289.63,0,0,-1201974.2,0,0,-2037897.4,0,0,-1865590.4,0,0,1090194.6,0,0,1749211,0,0,1807835.2,0,0,-253690.09,0,0,-225952.88,0,0,-643322.1,0,0,-751659.26,0,0,-1457259.1,0,0,-915362.92};
+VT(0.060432552,0.20227914,0,0.06966854,0.20076802,0,0.066992124,0.20847551,0){0,0,1798951.1,0,0,1570520.4,0,0,1540360.8,0,0,-3671781.8,0,0,-3162888.4,0,0,-3311175.4,0,0,2023610.8,0,0,1636334.6,0,0,2266191.6,0,0,1565241.8,0,0,1503948.1,0,0,706070.36,0,0,-3653837,0,0,-3161601.9,0,0,-3078419.5};
+VT(0.066012722,0.055502179,0,0.073604017,0.054819307,0,0.070754378,0.060222618,0){0,0,3257272.9,0,0,2744584.6,0,0,2932444.5,0,0,2187557.2,0,0,1864679.8,0,0,1804303.3,0,0,399401.17,0,0,386939.94,0,0,-17984.254,0,0,-1519988.7,0,0,-1214908.7,0,0,-1833384.6,0,0,-2940625.1,0,0,-2427603.9,0,0,-2943704.7};
+VT(0.025770754,0.10718168,0,0.023213665,0.1150537,0,0.016927821,0.11108648,0){0,0,2378738.7,0,0,2130593.3,0,0,1644246.3,0,0,-316264.13,0,0,-605772.32,0,0,-340994.5,0,0,-2653040.8,0,0,-2564157.8,0,0,-1914445.6,0,0,-1984140.6,0,0,-1229375.9,0,0,-1176430.8,0,0,932667.69,0,0,1684092.7,0,0,981584.41};
+VT(0.024008584,0.022367291,0,0.016759526,0.025876157,0,0.015416139,0.018002698,0){0,0,2639060.6,0,0,1932221.9,0,0,1798828.3,0,0,2494948.4,0,0,1791225.7,0,0,1735136,0,0,2214593.6,0,0,1519509.7,0,0,1609995.5,0,0,1813324.4,0,0,1136895.1,0,0,1427830.3,0,0,1312931.3,0,0,671081.1,0,0,1194733.1};
+VT(0.076938259,0.060604721,0,0.079822506,0.065677674,0,0.072323403,0.067507008,0){0,0,2443533.2,0,0,2163855.5,0,0,2781512.1,0,0,1491930.8,0,0,1180001.4,0,0,1448400.9,0,0,-40674.57,0,0,-340376.77,0,0,-578922.09,0,0,-1557435.8,0,0,-1706002.2,0,0,-2328912.3,0,0,-2468002.6,0,0,-2296197.5,0,0,-2963263.7};
+VT(0.015498485,0.28248556,0,0.018422519,0.27450763,0,0.023483408,0.28013687,0){0,0,166274.63,0,0,282501.19,0,0,270985.88,0,0,-493262.57,0,0,-827496.14,0,0,-801278.39,0,0,803759.61,0,0,1313896,0,0,1297043.7,0,0,-1087394.1,0,0,-1707268.8,0,0,-1736920.8,0,0,1334475.8,0,0,1979556.1,0,0,2101746.5};
+VT(0.047556344,0.24377674,0,0.043027686,0.24899973,0,0.040431855,0.24188745,0){0,0,1122639.4,0,0,999522.33,0,0,1110505,0,0,-2989881.7,0,0,-2720190.5,0,0,-2932804,0,0,3850350.4,0,0,3683283.3,0,0,3702149.5,0,0,-3414324.1,0,0,-3620573.8,0,0,-3142324.5,0,0,1828478.4,0,0,2549278.8,0,0,1453973.2};
+VT(0.092295863,0.26000779,0,0.083190767,0.25723975,0,0.090077759,0.25268961,0){0,0,193329.27,0,0,434158.6,0,0,291813.61,0,0,-546576.12,0,0,-1216864.4,0,0,-805257.31,0,0,805368.84,0,0,1759626.8,0,0,1125037.4,0,0,-924990.4,0,0,-1955417.3,0,0,-1174248.1,0,0,884724.5,0,0,1765235.2,0,0,940920.06};
+VT(0.085115353,0.26563346,0,0.083190767,0.25723975,0,0.092295863,0.26000779,0){0,0,313056.52,0,0,434158.6,0,0,193329.27,0,0,-899063.8,0,0,-1216864.4,0,0,-546576.12,0,0,1369900.4,0,0,1759626.8,0,0,805368.84,0,0,-1665255.4,0,0,-1955417.3,0,0,-924990.4,0,0,1747205.8,0,0,1765235.2,0,0,884724.5};
+VT(0.08974924,0.047235181,0,0.082493405,0.042375289,0,0.092141527,0.03991184,0){0,0,1190814.4,0,0,1978611.8,0,0,927649.93,0,0,905328.07,0,0,1595319.9,0,0,767955.56,0,0,402804.56,0,0,902966.17,0,0,476054.53,0,0,-196265.4,0,0,35643.43,0,0,102192.68,0,0,-748421.11,0,0,-838916.97,0,0,-289378.9};
+VT(0.092141527,0.03991184,0,0.082493405,0.042375289,0,0.084917502,0.034253561,0){0,0,927649.93,0,0,1978611.8,0,0,1742331.8,0,0,767955.56,0,0,1595319.9,0,0,1520580.8,0,0,476054.53,0,0,902966.17,0,0,1105294,0,0,102192.68,0,0,35643.43,0,0,549324.68,0,0,-289378.9,0,0,-838916.97,0,0,-76880.401};
+VT(0.04704595,0.16277363,0,0.042155309,0.15589067,0,0.050010485,0.1548865,0){0,0,2543508.6,0,0,2577776.2,0,0,2672912.2,0,0,-3221973.5,0,0,-2895603.6,0,0,-2946373.7,0,0,-1684138.2,0,0,-2220826.4,0,0,-2371553.9,0,0,3671419.3,0,0,3169529.7,0,0,3189127.5,0,0,704902.67,0,0,1830012,0,0,2045305.7};
+VT(0.04704595,0.16277363,0,0.054395265,0.16699477,0,0.048076401,0.17082416,0){0,0,2543508.6,0,0,2465605.5,0,0,2424680.5,0,0,-3221973.5,0,0,-3338618.7,0,0,-3473815.1,0,0,-1684138.2,0,0,-1283530.8,0,0,-921629.25,0,0,3671419.3,0,0,3793219.5,0,0,3872759.5,0,0,704902.67,0,0,-59660.123,0,0,-754316.94};
+VT(0.046341114,0.044942776,0,0.03663522,0.040674234,0,0.043838979,0.034579424,0){0,0,3748809.1,0,0,3463485.9,0,0,3745913.7,0,0,2933624.2,0,0,2844620.6,0,0,3260141.4,0,0,1480431.3,0,0,1717431.6,0,0,2351583.2,0,0,-294933.53,0,0,283267.24,0,0,1138042.7,0,0,-2006921.6,0,0,-1201989.6,0,0,-223347.31};
+VT(0.038515413,0.047952704,0,0.03663522,0.040674234,0,0.046341114,0.044942776,0){0,0,3516906.1,0,0,3463485.9,0,0,3748809.1,0,0,2648581.9,0,0,2844620.6,0,0,2933624.2,0,0,1126309.3,0,0,1717431.6,0,0,1480431.3,0,0,-674068.75,0,0,283267.24,0,0,-294933.53,0,0,-2308227.3,0,0,-1201989.6,0,0,-2006921.6};
+VT(0.043491003,0.26677795,0,0.037705658,0.25939989,0,0.04563604,0.25694979,0){0,0,657627.62,0,0,758443.36,0,0,859240.08,0,0,-1894105.9,0,0,-2140288.6,0,0,-2406042.8,0,0,2903724.9,0,0,3141072.6,0,0,3472131.8,0,0,-3565612.1,0,0,-3582615.2,0,0,-3844488.4,0,0,3800401.2,0,0,3385872.9,0,0,3448330.3};
+VT(0.04563604,0.25694979,0,0.037705658,0.25939989,0,0.039157325,0.25334591,0){0,0,859240.08,0,0,758443.36,0,0,884627.38,0,0,-2406042.8,0,0,-2140288.6,0,0,-2446896,0,0,3472131.8,0,0,3141072.6,0,0,3436661.2,0,0,-3844488.4,0,0,-3582615.2,0,0,-3622356.9,0,0,3448330.3,0,0,3385872.9,0,0,2960330.2};
+VT(0.077069107,0.15686929,0,0.076625322,0.14929356,0,0.084604507,0.15255901,0){0,0,1743907.9,0,0,1845555.4,0,0,1258841.2,0,0,-1994600,0,0,-1818255.1,0,0,-1326319,0,0,-1457243.4,0,0,-1872475.3,0,0,-1187789.9,0,0,2204191.1,0,0,1790618.2,0,0,1390056.3,0,0,1140253.2,0,0,1898765.5,0,0,1113216.6};
+VT(0.07180958,0.22984275,0,0.076796159,0.2234596,0,0.078984823,0.22953004,0){0,0,1079159.6,0,0,1008421.8,0,0,858343.29,0,0,-2680718.2,0,0,-2411357.4,0,0,-2128428.8,0,0,2899261.6,0,0,2346331.8,0,0,2291087.1,0,0,-1622013.4,0,0,-852928.84,0,0,-1261656.1,0,0,-492395.98,0,0,-1160000.7,0,0,-424553.92};
+VT(0.048076401,0.17082416,0,0.042242048,0.16806859,0,0.04704595,0.16277363,0){0,0,2424680.5,0,0,2399442.3,0,0,2543508.6,0,0,-3473815.1,0,0,-3302042.1,0,0,-3221973.5,0,0,-921629.25,0,0,-1157324.9,0,0,-1684138.2,0,0,3872759.5,0,0,3737475.6,0,0,3671419.3,0,0,-754316.94,0,0,-248746.29,0,0,704902.67};
+VT(0.043027686,0.24899973,0,0.036308441,0.24745658,0,0.040431855,0.24188745,0){0,0,999522.33,0,0,958174.94,0,0,1110505,0,0,-2720190.5,0,0,-2591684.5,0,0,-2932804,0,0,3683283.3,0,0,3460190.4,0,0,3702149.5,0,0,-3620573.8,0,0,-3307339.6,0,0,-3142324.5,0,0,2549278.8,0,0,2177878.8,0,0,1453973.2};
+VT(0.026270926,0.075674812,0,0.025411973,0.082310594,0,0.019499739,0.079597209,0){0,0,2630439.6,0,0,2525130.6,0,0,2040354.6,0,0,1063205.3,0,0,762374.09,0,0,702945.71,0,0,-1137545.6,0,0,-1532614.6,0,0,-1095289.5,0,0,-2660659.2,0,0,-2757779.1,0,0,-2175701.2,0,0,-2599027.8,0,0,-2058136.4,0,0,-1830384.7};
+VT(0.073708403,0.21517194,0,0.069002793,0.22246209,0,0.063265205,0.21633109,0){0,0,1225969.3,0,0,1267491.2,0,0,1505335.5,0,0,-2772471.1,0,0,-3011719.2,0,0,-3432481.9,0,0,2271379.1,0,0,2877058.6,0,0,2888962.8,0,0,-92677.622,0,0,-947533.34,0,0,-265885.87,0,0,-2155133.8,0,0,-1573376.1,0,0,-2549234.8};
+VT(0.082390534,0.079333541,0,0.091953893,0.078440357,0,0.08812606,0.087328167,0){0,0,1865676.5,0,0,889726.23,0,0,1269155.7,0,0,650380.91,0,0,322434.75,0,0,279658.57,0,0,-988603.29,0,0,-450550.32,0,0,-927894.68,0,0,-1983689.6,0,0,-936443.15,0,0,-1412053.3,0,0,-1686881.4,0,0,-825354.72,0,0,-795447.99};
+VT(0.1,0.085714286,0,0.091953893,0.078440357,0,0.1,0.078571429,0){0,0,0,0,0,889726.23,0,0,0,0,0,0,0,0,322434.75,0,0,0,0,0,0,0,0,-450550.32,0,0,0,0,0,0,0,0,-936443.15,0,0,0,0,0,0,0,0,-825354.72,0,0,0};
+VT(0.061631884,0.26868773,0,0.06660802,0.27624666,0,0.059078636,0.27701937,0){0,0,591535.29,0,0,417349.44,0,0,447007.97,0,0,-1711593.4,0,0,-1226359.7,0,0,-1315269.1,0,0,2649353.2,0,0,1959900.4,0,0,2107766.2,0,0,-3304968.8,0,0,-2572844.1,0,0,-2778864.5,0,0,3608394.3,0,0,3027289.2,0,0,3289755.3};
+VT(0.014137494,0.034012185,0,0.017433092,0.042090914,0,0.011573719,0.041901165,0){0,0,1641076.4,0,0,1971771.3,0,0,1347025.1,0,0,1435142,0,0,1594855,0,0,1091815.8,0,0,1049094.4,0,0,913057.13,0,0,629744.45,0,0,531342.12,0,0,56690.05,0,0,48353.226,0,0,-53364.585,0,0,-810753.02,0,0,-542301.86};
+VT(0.1,0.24285714,0,0.092168655,0.23668616,0,0.1,0.23571429,0){0,0,0,0,0,307607.26,0,0,0,0,0,0,0,0,-792496.69,0,0,0,0,0,0,0,0,941630.33,0,0,0,0,0,0,0,0,-691810.02,0,0,0,0,0,0,0,0,148523.72,0,0,0};
+VT(0.0072553778,0.13224921,0,0.0054758376,0.13911323,0,0,0.13571429,0){0,0,674958.82,0,0,495708.7,0,0,0,0,0,-425463.67,0,0,-382921.42,0,0,0,0,0,-832230.25,0,0,-582869.54,0,0,0,0,0,117822.57,0,0,250325.59,0,0,0,0,0,875622.71,0,0,639819.51,0,0,0};
+VT(0.015758122,0.23699049,0,0.025350652,0.23917347,0,0.02133326,0.24577003,0){0,0,597291.98,0,0,868665.73,0,0,675269.21,0,0,-1541119.1,0,0,-2265304,0,0,-1813848.4,0,0,1837947.1,0,0,2773502.3,0,0,2383092.9,0,0,-1363109.4,0,0,-2193941.8,0,0,-2204305.3,0,0,315646.37,0,0,753574.67,0,0,1333319.6};
+VT(0.039157325,0.25334591,0,0.036308441,0.24745658,0,0.043027686,0.24899973,0){0,0,884627.38,0,0,958174.94,0,0,999522.33,0,0,-2446896,0,0,-2591684.5,0,0,-2720190.5,0,0,3436661.2,0,0,3460190.4,0,0,3683283.3,0,0,-3622356.9,0,0,-3307339.6,0,0,-3620573.8,0,0,2960330.2,0,0,2177878.8,0,0,2549278.8};
+VT(0.076158908,0.12549637,0,0.070840483,0.12204614,0,0.077013163,0.11736903,0){0,0,2092101.1,0,0,2470738.2,0,0,2095773.2,0,0,-1030118.9,0,0,-1044803.2,0,0,-691227.47,0,0,-2615047.7,0,0,-3073782.1,0,0,-2559181.5,0,0,-297340.89,0,0,-729197.53,0,0,-1023961.4,0,0,2464056,0,0,2652961,0,0,1873161.8};
+VT(0.041402067,0.22952626,0,0.037546984,0.23452457,0,0.034969012,0.22634925,0){0,0,1348916.4,0,0,1205921.7,0,0,1299939.6,0,0,-3344816,0,0,-3072707.6,0,0,-3164156.1,0,0,3600200.4,0,0,3550700.1,0,0,3237729.2,0,0,-1982154,0,0,-2423829.8,0,0,-1478956,0,0,-667743.82,0,0,201013.93,0,0,-1117524.9};
+VT(0.017207343,0.22323305,0,0.012706169,0.22573828,0,0.010546892,0.2198034,0){0,0,781289.63,0,0,571782.3,0,0,514716.79,0,0,-1865590.4,0,0,-1386624.6,0,0,-1201974.2,0,0,1807835.2,0,0,1404300.2,0,0,1090194.6,0,0,-643322.1,0,0,-614658.98,0,0,-253690.09,0,0,-915362.92,0,0,-528535.98,0,0,-751659.26};
+VT(0.01788586,0.12850833,0,0.023379755,0.12686903,0,0.021167753,0.13548502,0){0,0,1616906.9,0,0,2047772.9,0,0,1816935.7,0,0,-895214.81,0,0,-1065433.1,0,0,-1266652.3,0,0,-2016472.2,0,0,-2558991,0,0,-2200669.4,0,0,-4802.2192,0,0,-162203.53,0,0,600161.11,0,0,2014144.7,0,0,2481221.5,0,0,2382629.9};
+VT(0.042433189,0.024814669,0,0.048866761,0.029559705,0,0.043838979,0.034579424,0){0,0,3739739.8,0,0,3831772.8,0,0,3745913.7,0,0,3488658.7,0,0,3467532.3,0,0,3260141.4,0,0,3003356.3,0,0,2773676.3,0,0,2351583.2,0,0,2316430.4,0,0,1816186,0,0,1138042.7,0,0,1473602,0,0,685852.4,0,0,-223347.31};
+VT(0.051167355,0.022914381,0,0.048866761,0.029559705,0,0.042433189,0.024814669,0){0,0,3850137.8,0,0,3831772.8,0,0,3739739.8,0,0,3629520.4,0,0,3467532.3,0,0,3488658.7,0,0,3200919.1,0,0,2773676.3,0,0,3003356.3,0,0,2588908.3,0,0,1816186,0,0,2316430.4,0,0,1828396.4,0,0,685852.4,0,0,1473602};
+VT(0.092195724,0.16853594,0,0.093710586,0.16080643,0,0.1,0.16428571,0){0,0,598378.34,0,0,507346.27,0,0,0,0,0,-829189.07,0,0,-621948.04,0,0,0,0,0,-278570.16,0,0,-366919.85,0,0,0,0,0,936666.51,0,0,704920.6,0,0,0,0,0,-82641.6,0,0,207593.47,0,0,0};
+VT(0.040431855,0.24188745,0,0.045331711,0.23557633,0,0.047556344,0.24377674,0){0,0,1110505,0,0,1270563.3,0,0,1122639.4,0,0,-2932804,0,0,-3255008.9,0,0,-2989881.7,0,0,3702149.5,0,0,3813331,0,0,3850350.4,0,0,-3142324.5,0,0,-2700862,0,0,-3414324.1,0,0,1453973.2,0,0,404484.48,0,0,1828478.4};
+VT(0.01180171,0.25230222,0,0.013821768,0.24617185,0,0.018179834,0.25267212,0){0,0,347512.04,0,0,454053.45,0,0,514543.14,0,0,-957611.77,0,0,-1221678.8,0,0,-1419813.2,0,0,1333704.3,0,0,1611329.8,0,0,1983439.5,0,0,-1383899.6,0,0,-1502439.1,0,0,-2069793.3,0,0,1095718.6,0,0,928515.88,0,0,1657747.8};
+VT(0.073234584,0.04253025,0,0.067616069,0.037109229,0,0.075978544,0.034466341,0){0,0,2820532.7,0,0,3239242.7,0,0,2615244.9,0,0,2270240.9,0,0,2756202.5,0,0,2278283.7,0,0,1277003.9,0,0,1862139.4,0,0,1647758.2,0,0,34586.382,0,0,690369.93,0,0,804880.96,0,0,-1214797.7,0,0,-584563.48,0,0,-142067.87};
+VT(0.076498673,0.26519709,0,0.068237016,0.26229006,0,0.074279052,0.25633166,0){0,0,473307.48,0,0,639705.29,0,0,635900.39,0,0,-1357765.2,0,0,-1820649,0,0,-1777029.4,0,0,2063933,0,0,2721368.6,0,0,2553015.8,0,0,-2499100.3,0,0,-3203243.1,0,0,-2804423.5,0,0,2605934.6,0,0,3191912.1,0,0,2479429.3};
+VT(0.072323403,0.067507008,0,0.070754378,0.060222618,0,0.076938259,0.060604721,0){0,0,2781512.1,0,0,2932444.5,0,0,2443533.2,0,0,1448400.9,0,0,1804303.3,0,0,1491930.8,0,0,-578922.09,0,0,-17984.254,0,0,-40674.57,0,0,-2328912.3,0,0,-1833384.6,0,0,-1557435.8,0,0,-2963263.7,0,0,-2943704.7,0,0,-2468002.6};
+VT(0.021167753,0.13548502,0,0.030046638,0.13690443,0,0.026018946,0.14387862,0){0,0,1816935.7,0,0,2369378.2,0,0,2064539,0,0,-1266652.3,0,0,-1721516.8,0,0,-1800072.3,0,0,-2200669.4,0,0,-2840145.3,0,0,-2295230.1,0,0,600161.11,0,0,944948.24,0,0,1506177.8,0,0,2382629.9,0,0,3098367.4,0,0,2488196.2};
+VT(0.049721881,0.27094787,0,0.045592054,0.27439642,0,0.043491003,0.26677795,0){0,0,588018.61,0,0,513714.39,0,0,657627.62,0,0,-1710042.9,0,0,-1504437.2,0,0,-1894105.9,0,0,2675009.8,0,0,2387679.2,0,0,2903724.9,0,0,-3394309,0,0,-3100344.3,0,0,-3565612.1,0,0,3801713.7,0,0,3591305.7,0,0,3800401.2};
+VT(0.076271482,0.13373081,0,0.076158908,0.12549637,0,0.082709707,0.12855445,0){0,0,2012844.4,0,0,2092101.1,0,0,1568327.1,0,0,-1330317.6,0,0,-1030118.9,0,0,-869760.99,0,0,-2463975.8,0,0,-2615047.7,0,0,-1955764.1,0,0,494859.01,0,0,-297340.89,0,0,-1353.9511,0,0,2631758.9,0,0,2464056,0,0,1955094.7};
+VT(0.090077759,0.25268961,0,0.085145188,0.25032735,0,0.089949388,0.2453858,0){0,0,291813.61,0,0,448997.25,0,0,339950.36,0,0,-805257.31,0,0,-1228228.7,0,0,-911669.73,0,0,1125037.4,0,0,1682589.8,0,0,1193275.4,0,0,-1174248.1,0,0,-1691886.1,0,0,-1095139.7,0,0,940920.06,0,0,1253443,0,0,648419.14};
+VT(0.08944657,0.05485846,0,0.083998423,0.049627851,0,0.08974924,0.047235181,0){0,0,1211526.2,0,0,1806853.8,0,0,1190814.4,0,0,822600.19,0,0,1329741.5,0,0,905328.07,0,0,169573.91,0,0,501474.01,0,0,402804.56,0,0,-537958.1,0,0,-459273.5,0,0,-196265.4,0,0,-1073022.7,0,0,-1299103.8,0,0,-748421.11};
+VT(0.041643161,0.17482395,0,0.042242048,0.16806859,0,0.048076401,0.17082416,0){0,0,2284160.6,0,0,2399442.3,0,0,2424680.5,0,0,-3458410.7,0,0,-3302042.1,0,0,-3473815.1,0,0,-506290.81,0,0,-1157324.9,0,0,-921629.25,0,0,3718851.8,0,0,3737475.6,0,0,3872759.5,0,0,-1405815.9,0,0,-248746.29,0,0,-754316.94};
+VT(0.038009007,0.015147577,0,0.046063037,0.016810165,0,0.042433189,0.024814669,0){0,0,3597209.6,0,0,3836060.2,0,0,3739739.8,0,0,3506943.3,0,0,3717529.2,0,0,3488658.7,0,0,3328697.3,0,0,3484126.2,0,0,3003356.3,0,0,3067010.9,0,0,3143090.2,0,0,2316430.4,0,0,2728518.9,0,0,2704667.4,0,0,1473602};
+VT(0.037999827,0.27482627,0,0.030312881,0.27848596,0,0.029991713,0.27132489,0){0,0,474219.19,0,0,355416.48,0,0,469504.82,0,0,-1389905,0,0,-1048284.8,0,0,-1366503,0,0,2209621.2,0,0,1688178.9,0,0,2141236.7,0,0,-2876809.4,0,0,-2242771,0,0,-2724385.3,0,0,3345267.4,0,0,2683885.3,0,0,3063642.3};
+VT(0.074931673,0.27468874,0,0.069536278,0.26943087,0,0.076498673,0.26519709,0){0,0,363389.18,0,0,505602.11,0,0,473307.48,0,0,-1064791.9,0,0,-1465439,0,0,-1357765.2,0,0,1691857.9,0,0,2276404,0,0,2063933,0,0,-2200836.4,0,0,-2856108.7,0,0,-2499100.3,0,0,2556129.1,0,0,3145421.5,0,0,2605934.6};
+VT(0.075978544,0.034466341,0,0.068707287,0.030314019,0,0.074388951,0.025102472,0){0,0,2615244.9,0,0,3188897.7,0,0,2772012.4,0,0,2278283.7,0,0,2870259.7,0,0,2581574.2,0,0,1647758.2,0,0,2264806.3,0,0,2213781,0,0,804880.96,0,0,1433032.7,0,0,1693914.7,0,0,-142067.87,0,0,457746.25,0,0,1057277.9};
+VT(0.021251228,0.18136297,0,0.016878531,0.18478654,0,0.013878694,0.17880836,0){0,0,1398279.8,0,0,1113458.1,0,0,971566.52,0,0,-2300353.4,0,0,-1906862.4,0,0,-1548960.4,0,0,85724.805,0,0,245299.96,0,0,-51095.574,0,0,2245163.6,0,0,1732097.5,0,0,1579530,0,0,-1534338.6,0,0,-1479759.2,0,0,-887966.26};
+VT(0.076498673,0.26519709,0,0.081004963,0.27070547,0,0.074931673,0.27468874,0){0,0,473307.48,0,0,333174.81,0,0,363389.18,0,0,-1357765.2,0,0,-968418.7,0,0,-1064791.9,0,0,2063933,0,0,1513258.3,0,0,1691857.9,0,0,-2499100.3,0,0,-1916833.2,0,0,-2200836.4,0,0,2605934.6,0,0,2141327.9,0,0,2556129.1};
+VT(0.085115353,0.26563346,0,0.081004963,0.27070547,0,0.076498673,0.26519709,0){0,0,313056.52,0,0,333174.81,0,0,473307.48,0,0,-899063.8,0,0,-968418.7,0,0,-1357765.2,0,0,1369900.4,0,0,1513258.3,0,0,2063933,0,0,-1665255.4,0,0,-1916833.2,0,0,-2499100.3,0,0,1747205.8,0,0,2141327.9,0,0,2605934.6};
+VT(0.075978544,0.034466341,0,0.080699945,0.029142305,0,0.084917502,0.034253561,0){0,0,2615244.9,0,0,2185639.9,0,0,1742331.8,0,0,2278283.7,0,0,1983669.2,0,0,1520580.8,0,0,1647758.2,0,0,1598386.1,0,0,1105294,0,0,804880.96,0,0,1065401.8,0,0,549324.68,0,0,-142067.87,0,0,433818.71,0,0,-76880.401};
+VT(0.074388951,0.025102472,0,0.080699945,0.029142305,0,0.075978544,0.034466341,0){0,0,2772012.4,0,0,2185639.9,0,0,2615244.9,0,0,2581574.2,0,0,1983669.2,0,0,2278283.7,0,0,2213781,0,0,1598386.1,0,0,1647758.2,0,0,1693914.7,0,0,1065401.8,0,0,804880.96,0,0,1057277.9,0,0,433818.71,0,0,-142067.87};
+VT(0.058552205,0.15400025,0,0.05288218,0.14757716,0,0.061244461,0.14481879,0){0,0,2589572.8,0,0,2767228.4,0,0,2643484.5,0,0,-2806487.5,0,0,-2626819.9,0,0,-2356788.3,0,0,-2354581.2,0,0,-2900596.1,0,0,-2899198.4,0,0,3003966,0,0,2479722.6,0,0,2042509.4,0,0,2103059.1,0,0,3026446,0,0,3121060.9};
+VT(0.050010485,0.1548865,0,0.05288218,0.14757716,0,0.058552205,0.15400025,0){0,0,2672912.2,0,0,2767228.4,0,0,2589572.8,0,0,-2946373.7,0,0,-2626819.9,0,0,-2806487.5,0,0,-2371553.9,0,0,-2900596.1,0,0,-2354581.2,0,0,3189127.5,0,0,2479722.6,0,0,3003966,0,0,2045305.7,0,0,3026446,0,0,2103059.1};
+VT(0.089230742,0.11966768,0,0.08466046,0.11619385,0,0.091758141,0.11296708,0){0,0,1043332.5,0,0,1475783,0,0,824791.32,0,0,-391602.7,0,0,-452604.25,0,0,-201020.76,0,0,-1287980.7,0,0,-1789662.1,0,0,-976886.6,0,0,-412950.99,0,0,-788262.21,0,0,-537824.26,0,0,1030099.2,0,0,1243195.1,0,0,570097.26};
+VT(0.0078195435,0.14622426,0,0.017312959,0.14496605,0,0.013794295,0.15422926,0){0,0,680366.1,0,0,1456929,0,0,1126466.2,0,0,-626541.18,0,0,-1303417.8,0,0,-1226232.2,0,0,-729870.69,0,0,-1594293.7,0,0,-1017954.8,0,0,568744.13,0,0,1135517.7,0,0,1316565.7,0,0,774663.29,0,0,1713822.2,0,0,901352.54};
+VT(0.012304267,0.13852123,0,0.017312959,0.14496605,0,0.0078195435,0.14622426,0){0,0,1094693.2,0,0,1456929,0,0,680366.1,0,0,-832176.34,0,0,-1303417.8,0,0,-626541.18,0,0,-1294374.3,0,0,-1594293.7,0,0,-729870.69,0,0,521821.54,0,0,1135517.7,0,0,568744.13,0,0,1419655.5,0,0,1713822.2,0,0,774663.29};
+VT(0.066401409,0.0434645,0,0.067616069,0.037109229,0,0.073234584,0.04253025,0){0,0,3289675.8,0,0,3239242.7,0,0,2820532.7,0,0,2619840.6,0,0,2756202.5,0,0,2270240.9,0,0,1416557.6,0,0,1862139.4,0,0,1277003.9,0,0,-75156.319,0,0,690369.93,0,0,34586.382,0,0,-1551772,0,0,-584563.48,0,0,-1214797.7};
+VT(0.074279052,0.25633166,0,0.068237016,0.26229006,0,0.066803853,0.25459223,0){0,0,635900.39,0,0,639705.29,0,0,789541.66,0,0,-1777029.4,0,0,-1820649,0,0,-2193455.3,0,0,2553015.8,0,0,2721368.6,0,0,3110738.9,0,0,-2804423.5,0,0,-3203243.1,0,0,-3337877,0,0,2479429.3,0,0,3191912.1,0,0,2824240.3};
+VT(0.064352171,0.083117586,0,0.066925078,0.074981916,0,0.070865224,0.080352924,0){0,0,3167194.8,0,0,3090390.8,0,0,2808030.6,0,0,915483.69,0,0,1280900.5,0,0,934415.1,0,0,-1987167.2,0,0,-1278621.5,0,0,-1562677.5,0,0,-3477240.4,0,0,-3089611.2,0,0,-3017110.1,0,0,-2495770,0,0,-3091904.4,0,0,-2458745.5};
+VT(0.069536278,0.26943087,0,0.06660802,0.27624666,0,0.061631884,0.26868773,0){0,0,505602.11,0,0,417349.44,0,0,591535.29,0,0,-1465439,0,0,-1226359.7,0,0,-1711593.4,0,0,2276404,0,0,1959900.4,0,0,2649353.2,0,0,-2856108.7,0,0,-2572844.1,0,0,-3304968.8,0,0,3145421.5,0,0,3027289.2,0,0,3608394.3};
+VT(0.056317057,0.058022103,0,0.053426379,0.049768916,0,0.061015306,0.048529238,0){0,0,3630316.8,0,0,3727873.1,0,0,3533367.8,0,0,2330872.5,0,0,2738031.5,0,0,2640342.3,0,0,197001.66,0,0,1021148,0,0,1080012.2,0,0,-2007682.1,0,0,-966926.63,0,0,-753291.7,0,0,-3494460.7,0,0,-2698501,0,0,-2396723.8};
+VT(0.064276416,0.12183086,0,0.059246105,0.12763558,0,0.057323957,0.1204315,0){0,0,2809128.6,0,0,2918223.5,0,0,3051716.5,0,0,-1175750.5,0,0,-1563762.3,0,0,-1191883,0,0,-3492840.6,0,0,-3644117.3,0,0,-3778168.4,0,0,-855220.15,0,0,-127593.52,0,0,-1110713.1,0,0,2995580.4,0,0,3585046,0,0,3101303};
+VT(0.011838853,0.2301677,0,0.016939848,0.22904958,0,0.015758122,0.23699049,0){0,0,504229.49,0,0,714788.59,0,0,597291.98,0,0,-1254859.2,0,0,-1767596.2,0,0,-1541119.1,0,0,1363834.1,0,0,1888698.3,0,0,1837947.1,0,0,-775392.51,0,0,-1014237.8,0,0,-1363109.4,0,0,-209768.04,0,0,-395054.79,0,0,315646.37};
+VT(0.046341114,0.044942776,0,0.042113175,0.053290167,0,0.038515413,0.047952704,0){0,0,3748809.1,0,0,3616583.4,0,0,3516906.1,0,0,2933624.2,0,0,2519252.9,0,0,2648581.9,0,0,1480431.3,0,0,657513.67,0,0,1126309.3,0,0,-294933.53,0,0,-1403801.4,0,0,-674068.75,0,0,-2006921.6,0,0,-3039615.4,0,0,-2308227.3};
+VT(0.042433189,0.024814669,0,0.033039341,0.023173825,0,0.038009007,0.015147577,0){0,0,3739739.8,0,0,3318087.9,0,0,3597209.6,0,0,3488658.7,0,0,3123656.1,0,0,3506943.3,0,0,3003356.3,0,0,2746181,0,0,3328697.3,0,0,2316430.4,0,0,2207795.9,0,0,3067010.9,0,0,1473602,0,0,1539940.3,0,0,2728518.9};
+VT(0.050010485,0.1548865,0,0.054296142,0.16027015,0,0.04704595,0.16277363,0){0,0,2672912.2,0,0,2568973.7,0,0,2543508.6,0,0,-2946373.7,0,0,-3120486,0,0,-3221973.5,0,0,-2371553.9,0,0,-1899085.7,0,0,-1684138.2,0,0,3189127.5,0,0,3528266.9,0,0,3671419.3,0,0,2045305.7,0,0,1141594.9,0,0,704902.67};
+VT(0.089949388,0.2453858,0,0.085145188,0.25032735,0,0.083292987,0.24598228,0){0,0,339950.36,0,0,448997.25,0,0,542685.82,0,0,-911669.73,0,0,-1228228.7,0,0,-1458992.1,0,0,1193275.4,0,0,1682589.8,0,0,1920780.7,0,0,-1095139.7,0,0,-1691886.1,0,0,-1784182,0,0,648419.14,0,0,1253443,0,0,1091638.2};
+VT(0.080938662,0.054906318,0,0.083998423,0.049627851,0,0.08944657,0.05485846,0){0,0,2097661.4,0,0,1806853.8,0,0,1211526.2,0,0,1423084,0,0,1329741.5,0,0,822600.19,0,0,290856.94,0,0,501474.01,0,0,169573.91,0,0,-934922.56,0,0,-459273.5,0,0,-537958.1,0,0,-1860365.1,0,0,-1299103.8,0,0,-1073022.7};
+VT(0.021957304,0.26060316,0,0.025641665,0.25311603,0,0.030217898,0.25971254,0){0,0,505833.44,0,0,680173.91,0,0,660621.26,0,0,-1432636.8,0,0,-1879847.5,0,0,-1866014.4,0,0,2119105.6,0,0,2635470.4,0,0,2744196,0,0,-2450095.8,0,0,-2768550.2,0,0,-3141188.1,0,0,2369995.8,0,0,2247361.6,0,0,2987009.7};
+VT(0.018179834,0.25267212,0,0.025641665,0.25311603,0,0.021957304,0.26060316,0){0,0,514543.14,0,0,680173.91,0,0,505833.44,0,0,-1419813.2,0,0,-1879847.5,0,0,-1432636.8,0,0,1983439.5,0,0,2635470.4,0,0,2119105.6,0,0,-2069793.3,0,0,-2768550.2,0,0,-2450095.8,0,0,1657747.8,0,0,2247361.6,0,0,2369995.8};
+VT(0.080160084,0.071577727,0,0.086276325,0.073599227,0,0.082390534,0.079333541,0){0,0,2107851.9,0,0,1502743.3,0,0,1865676.5,0,0,977984.82,0,0,653401.45,0,0,650380.91,0,0,-676141.96,0,0,-565297.67,0,0,-988603.29,0,0,-1967920.1,0,0,-1464602.7,0,0,-1983689.6,0,0,-2205119.3,0,0,-1536324.4,0,0,-1686881.4};
+VT(0.059246105,0.12763558,0,0.052058531,0.12554764,0,0.057323957,0.1204315,0){0,0,2918223.5,0,0,3065498.6,0,0,3051716.5,0,0,-1563762.3,0,0,-1512626.5,0,0,-1191883,0,0,-3644117.3,0,0,-3831818,0,0,-3778168.4,0,0,-127593.52,0,0,-428428.64,0,0,-1110713.1,0,0,3585046,0,0,3614977.4,0,0,3101303};
+VT(0.0910478,0.13167545,0,0.093938974,0.13899,0,0.087083587,0.13880919,0){0,0,831136.87,0,0,548364.78,0,0,1144744.3,0,0,-514132.23,0,0,-422206.84,0,0,-877072.07,0,0,-1027305.8,0,0,-645591.08,0,0,-1349889.8,0,0,122313.64,0,0,273728.87,0,0,561444.4,0,0,1073956.7,0,0,708600.91,0,0,1481228.8};
+VT(0.026270926,0.075674812,0,0.033874053,0.071548869,0,0.032911969,0.081185013,0){0,0,2630439.6,0,0,3157862.8,0,0,3037931.3,0,0,1063205.3,0,0,1466537.3,0,0,971274.35,0,0,-1137545.6,0,0,-1010259.7,0,0,-1756226.8,0,0,-2660659.2,0,0,-2946084.6,0,0,-3289165.4,0,0,-2599027.8,0,0,-3304540.6,0,0,-2584916.3};
+VT(0.033874053,0.071548869,0,0.027058874,0.069011929,0,0.031105381,0.06529626,0){0,0,3157862.8,0,0,2727323.5,0,0,3030579.1,0,0,1466537.3,0,0,1363815.9,0,0,1667989.8,0,0,-1010259.7,0,0,-681543.48,0,0,-444570.51,0,0,-2946084.6,0,0,-2386220.5,0,0,-2357289.6,0,0,-3304540.6,0,0,-2898415.6,0,0,-3210321.2};
+VT(0.1,0.17142857,0,0.092195724,0.16853594,0,0.1,0.16428571,0){0,0,0,0,0,598378.34,0,0,0,0,0,0,0,0,-829189.07,0,0,0,0,0,0,0,0,-278570.16,0,0,0,0,0,0,0,0,936666.51,0,0,0,0,0,0,0,0,-82641.6,0,0,0};
+VT(0.016927821,0.11108648,0,0.023213665,0.1150537,0,0.017763535,0.12074209,0){0,0,1644246.3,0,0,2130593.3,0,0,1657769.5,0,0,-340994.5,0,0,-605772.32,0,0,-657738.05,0,0,-1914445.6,0,0,-2564157.8,0,0,-2054600.3,0,0,-1176430.8,0,0,-1229375.9,0,0,-581651.26,0,0,981584.41,0,0,1684092.7,0,0,1703675.4};
+VT(0.085369203,0.17624497,0,0.082729031,0.18391978,0,0.077619244,0.18028791,0){0,0,1039089.6,0,0,1144258.1,0,0,1471797.4,0,0,-1603144.1,0,0,-1940160.8,0,0,-2389894.4,0,0,-168940.91,0,0,205244.05,0,0,18944.546,0,0,1695116.9,0,0,1797438.3,0,0,2378251.6,0,0,-751642.95,0,0,-1455642.1,0,0,-1502642.9};
+VT(0.060825265,0.17090728,0,0.054692531,0.17439284,0,0.054395265,0.16699477,0){0,0,2288734.2,0,0,2346407.8,0,0,2465605.5,0,0,-3282960.5,0,0,-3532168.6,0,0,-3338618.7,0,0,-862639.89,0,0,-561454.61,0,0,-1283530.8,0,0,3657845.3,0,0,3816051.1,0,0,3793219.5,0,0,-726586.11,0,0,-1367177.6,0,0,-59660.123};
+VT(0.047385855,0.10193045,0,0.054240748,0.10280037,0,0.050721192,0.10961634,0){0,0,3329666.7,0,0,3302360.6,0,0,3257974.6,0,0,-117239.93,0,0,-169115.68,0,0,-583831.78,0,0,-3442848.4,0,0,-3462856.5,0,0,-3737290.3,0,0,-3204510.9,0,0,-3116478.2,0,0,-2483878.9,0,0,350991.89,0,0,505791.56,0,0,1698581.7};
+VT(0.018179834,0.25267212,0,0.013821768,0.24617185,0,0.02133326,0.24577003,0){0,0,514543.14,0,0,454053.45,0,0,675269.21,0,0,-1419813.2,0,0,-1221678.8,0,0,-1813848.4,0,0,1983439.5,0,0,1611329.8,0,0,2383092.9,0,0,-2069793.3,0,0,-1502439.1,0,0,-2204305.3,0,0,1657747.8,0,0,928515.88,0,0,1333319.6};
+VT(0.1,0.22142857,0,0.091864029,0.22106993,0,0.1,0.21428571,0){0,0,0,0,0,394005.54,0,0,0,0,0,0,0,0,-927852.61,0,0,0,0,0,0,0,0,863120.02,0,0,0,0,0,0,0,0,-241435.16,0,0,0,0,0,0,0,0,-536498.87,0,0,0};
+VT(0.038427921,0.16264679,0,0.042155309,0.15589067,0,0.04704595,0.16277363,0){0,0,2389351.9,0,0,2577776.2,0,0,2543508.6,0,0,-3020403.6,0,0,-2895603.6,0,0,-3221973.5,0,0,-1591681.4,0,0,-2220826.4,0,0,-1684138.2,0,0,3440909.6,0,0,3169529.7,0,0,3671419.3,0,0,682723.32,0,0,1830012,0,0,704902.67};
+VT(0.091323117,0.29067423,0,0.081165886,0.29137431,0,0.08596482,0.28314521,0){0,0,51002.156,0,0,97729.953,0,0,145967.81,0,0,-152526.43,0,0,-292395.17,0,0,-433371.98,0,0,252617.29,0,0,484687.71,0,0,707326.96,0,0,-350336.87,0,0,-673055.06,0,0,-959333.22,0,0,444691.33,0,0,855744.16,0,0,1181452.3};
+VT(0.085905658,0.016824409,0,0.081119523,0.0085521597,0,0.091308694,0.0093164623,0){0,0,1656238,0,0,2167108.8,0,0,1045151,0,0,1604967.9,0,0,2149779.2,0,0,1035216.9,0,0,1504009.2,0,0,2115263.6,0,0,1015442.8,0,0,1356492.3,0,0,2063869.7,0,0,986027.05,0,0,1166855,0,0,1995657.9,0,0,947106.05};
+VT(0.069025318,0.11622387,0,0.074105201,0.11070107,0,0.077013163,0.11736903,0){0,0,2631986.5,0,0,2359475.3,0,0,2095773.2,0,0,-808686.45,0,0,-471755.94,0,0,-691227.47,0,0,-3192250.9,0,0,-2736894.8,0,0,-2559181.5,0,0,-1402768.4,0,0,-1717960.7,0,0,-1023961.4,0,0,2220554.1,0,0,1362139.4,0,0,1873161.8};
+VT(0.043569257,0.19619451,0,0.036160627,0.1953007,0,0.039366597,0.19088868,0){0,0,1966078.6,0,0,1834250.2,0,0,1982365.2,0,0,-3794921.6,0,0,-3509998.2,0,0,-3628592.6,0,0,1563901,0,0,1372423.7,0,0,1030950.1,0,0,2340412.7,0,0,2256297.6,0,0,2772526.5,0,0,-3741435.4,0,0,-3434247.7,0,0,-3333638.5};
+VT(0.048791783,0.28884593,0,0.051519181,0.28417908,0,0.055764419,0.28986395,0){0,0,226341.07,0,0,320732.11,0,0,202473.1,0,0,-675936.71,0,0,-953415.16,0,0,-605163.67,0,0,1116322.7,0,0,1560004.1,0,0,1001119.7,0,0,-1541505,0,0,-2123899.5,0,0,-1385941.2,0,0,1945474.1,0,0,2629434.9,0,0,1755276.4};
+VT(0.1,0.092857143,0,0.093922759,0.092262381,0,0.1,0.085714286,0){0,0,0,0,0,652083.63,0,0,0,0,0,0,0,0,89312.894,0,0,0,0,0,0,0,0,-550573,0,0,0,0,0,0,0,0,-715327.2,0,0,0,0,0,0,0,0,-262838.8,0,0,0};
+VT(0.049232245,0.21047418,0,0.053910411,0.21448753,0,0.045116599,0.21481108,0){0,0,1752658.6,0,0,1667429.4,0,0,1654487.5,0,0,-3827070.5,0,0,-3752161.8,0,0,-3731787.4,0,0,2777012.8,0,0,3023771,0,0,3030991.5,0,0,540242.46,0,0,-28239.212,0,0,-73694.316,0,0,-3416565.4,0,0,-2988983.1,0,0,-2938909.4};
+VT(0.082493405,0.042375289,0,0.073234584,0.04253025,0,0.075978544,0.034466341,0){0,0,1978611.8,0,0,2820532.7,0,0,2615244.9,0,0,1595319.9,0,0,2270240.9,0,0,2278283.7,0,0,902966.17,0,0,1277003.9,0,0,1647758.2,0,0,35643.43,0,0,34586.382,0,0,804880.96,0,0,-838916.97,0,0,-1214797.7,0,0,-142067.87};
+VT(0.076498673,0.26519709,0,0.074279052,0.25633166,0,0.083190767,0.25723975,0){0,0,473307.48,0,0,635900.39,0,0,434158.6,0,0,-1357765.2,0,0,-1777029.4,0,0,-1216864.4,0,0,2063933,0,0,2553015.8,0,0,1759626.8,0,0,-2499100.3,0,0,-2804423.5,0,0,-1955417.3,0,0,2605934.6,0,0,2479429.3,0,0,1765235.2};
+VT(0.056199026,0.010061392,0,0.06203594,0.0060944193,0,0.064075209,0.013493001,0){0,0,3801979,0,0,3604620.2,0,0,3498581.2,0,0,3759859.9,0,0,3589956.2,0,0,3428890.3,0,0,3676084,0,0,3560685.5,0,0,3290906.4,0,0,3551608.2,0,0,3516960.1,0,0,3087427.7,0,0,3387596.5,0,0,3458793.9,0,0,2822154};
+VT(0.061476805,0.16269562,0,0.054296142,0.16027015,0,0.058552205,0.15400025,0){0,0,2391378.9,0,0,2568973.7,0,0,2589572.8,0,0,-3025373.1,0,0,-3120486,0,0,-2806487.5,0,0,-1589341.3,0,0,-1899085.7,0,0,-2354581.2,0,0,3446908.2,0,0,3528266.9,0,0,3003966,0,0,675366.83,0,0,1141594.9,0,0,2103059.1};
+VT(0.063469548,0.28521738,0,0.061805884,0.29356168,0,0.055764419,0.28986395,0){0,0,273598.49,0,0,121923.05,0,0,202473.1,0,0,-814255.31,0,0,-365207.83,0,0,-605163.67,0,0,1335465.2,0,0,606815.62,0,0,1001119.7,0,0,-1824812,0,0,-845641.09,0,0,-1385941.2,0,0,2270429.1,0,0,1080583.1,0,0,1755276.4};
+VT(0.08812606,0.087328167,0,0.093922759,0.092262381,0,0.087331535,0.0958472,0){0,0,1269155.7,0,0,652083.63,0,0,1318484.3,0,0,279658.57,0,0,89312.894,0,0,98077.228,0,0,-927894.68,0,0,-550573,0,0,-1213131.9,0,0,-1412053.3,0,0,-715327.2,0,0,-1401481.2,0,0,-795447.99,0,0,-262838.8,0,0,-292629.72};
+VT(0.06961584,0.048915995,0,0.073604017,0.054819307,0,0.066012722,0.055502179,0){0,0,3063466,0,0,2744584.6,0,0,3257272.9,0,0,2277085.6,0,0,1864679.8,0,0,2187557.2,0,0,906160.93,0,0,386939.94,0,0,399401.17,0,0,-697426.19,0,0,-1214908.7,0,0,-1519988.7,0,0,-2122325.6,0,0,-2427603.9,0,0,-2940625.1};
+VT(0.082942949,0.21818591,0,0.076796159,0.2234596,0,0.073708403,0.21517194,0){0,0,823054.75,0,0,1008421.8,0,0,1225969.3,0,0,-1901094.8,0,0,-2411357.4,0,0,-2772471.1,0,0,1667014.3,0,0,2346331.8,0,0,2271379.1,0,0,-282341.7,0,0,-852928.84,0,0,-92677.622,0,0,-1297502.9,0,0,-1160000.7,0,0,-2155133.8};
+VT(0.1,0.064285714,0,0.09230899,0.063522919,0,0.1,0.057142857,0){0,0,0,0,0,877619.52,0,0,0,0,0,0,0,0,503392.8,0,0,0,0,0,0,0,0,-85524.836,0,0,0,0,0,0,0,0,-638068.15,0,0,0,0,0,0,0,0,-918939.46,0,0,0};
+VT(0.067728608,0.12931058,0,0.076158908,0.12549637,0,0.076271482,0.13373081,0){0,0,2567539,0,0,2092101.1,0,0,2012844.4,0,0,-1463631.5,0,0,-1030118.9,0,0,-1330317.6,0,0,-3196956.5,0,0,-2615047.7,0,0,-2463975.8,0,0,89062.443,0,0,-297340.89,0,0,494859.01,0,0,3235608.2,0,0,2464056,0,0,2631758.9};
+VT(0.037999827,0.27482627,0,0.034582704,0.26623209,0,0.043491003,0.26677795,0){0,0,474219.19,0,0,604041.77,0,0,657627.62,0,0,-1389905,0,0,-1737386.1,0,0,-1894105.9,0,0,2209621.2,0,0,2655775,0,0,2903724.9,0,0,-2876809.4,0,0,-3245580.1,0,0,-3565612.1,0,0,3345267.4,0,0,3433603.3,0,0,3800401.2};
+VT(0.029991713,0.27132489,0,0.034582704,0.26623209,0,0.037999827,0.27482627,0){0,0,469504.82,0,0,604041.77,0,0,474219.19,0,0,-1366503,0,0,-1737386.1,0,0,-1389905,0,0,2141236.7,0,0,2655775,0,0,2209621.2,0,0,-2724385.3,0,0,-3245580.1,0,0,-2876809.4,0,0,3063642.3,0,0,3433603.3,0,0,3345267.4};
+VT(0.082516133,0.27647665,0,0.078222118,0.28277283,0,0.074931673,0.27468874,0){0,0,248899.48,0,0,220930.92,0,0,363389.18,0,0,-731674.12,0,0,-655625.13,0,0,-1064791.9,0,0,1170289.2,0,0,1069057.6,0,0,1691857.9,0,0,-1538273.3,0,0,-1447830.3,0,0,-2200836.4,0,0,1813237.5,0,0,1779434.3,0,0,2556129.1};
+VT(0.074388951,0.025102472,0,0.078020383,0.017034313,0,0.082332164,0.023444943,0){0,0,2772012.4,0,0,2461848.1,0,0,2029600,0,0,2581574.2,0,0,2383750.6,0,0,1907886.4,0,0,2213781,0,0,2230032.5,0,0,1671751.1,0,0,1693914.7,0,0,2005590.6,0,0,1335359.8,0,0,1057277.9,0,0,1717239.5,0,0,918760.81};
+VT(0.050721192,0.10961634,0,0.042557423,0.10832344,0,0.047385855,0.10193045,0){0,0,3257974.6,0,0,3183930.6,0,0,3329666.7,0,0,-583831.78,0,0,-492142.06,0,0,-117239.93,0,0,-3737290.3,0,0,-3600076,0,0,-3442848.4,0,0,-2483878.9,0,0,-2551523.2,0,0,-3204510.9,0,0,1698581.7,0,0,1442840.6,0,0,350991.89};
+VT(0.015416139,0.018002698,0,0.022427218,0.014872357,0,0.024008584,0.022367291,0){0,0,1798828.3,0,0,2505875.7,0,0,2639060.6,0,0,1735136,0,0,2445229.8,0,0,2494948.4,0,0,1609995.5,0,0,2325397.7,0,0,2214593.6,0,0,1427830.3,0,0,2149288.4,0,0,1813324.4,0,0,1194733.1,0,0,1920956.8,0,0,1312931.3};
+VT(0.023483408,0.28013687,0,0.0220603,0.28602893,0,0.015498485,0.28248556,0){0,0,270985.88,0,0,181204.07,0,0,166274.63,0,0,-801278.39,0,0,-539738.59,0,0,-493262.57,0,0,1297043.7,0,0,886739.53,0,0,803759.61,0,0,-1736920.8,0,0,-1214791.9,0,0,-1087394.1,0,0,2101746.5,0,0,1516611.7,0,0,1334475.8};
+VT(0.059957308,0.22757204,0,0.053624899,0.22742186,0,0.05718895,0.22161738,0){0,0,1366903.5,0,0,1430137,0,0,1508977,0,0,-3351367.9,0,0,-3503302.1,0,0,-3566099.1,0,0,3498598.8,0,0,3648370.9,0,0,3352547.9,0,0,-1727811.3,0,0,-1785483,0,0,-1004251.2,0,0,-990620.01,0,0,-1060301.4,0,0,-1983866.6};
+VT(0.042433189,0.024814669,0,0.046063037,0.016810165,0,0.051167355,0.022914381,0){0,0,3739739.8,0,0,3836060.2,0,0,3850137.8,0,0,3488658.7,0,0,3717529.2,0,0,3629520.4,0,0,3003356.3,0,0,3484126.2,0,0,3200919.1,0,0,2316430.4,0,0,3143090.2,0,0,2588908.3,0,0,1473602,0,0,2704667.4,0,0,1828396.4};
+VT(0.077619244,0.18028791,0,0.071841704,0.17726974,0,0.077140734,0.17217741,0){0,0,1471797.4,0,0,1799263.7,0,0,1584233.7,0,0,-2389894.4,0,0,-2812994.5,0,0,-2313491.7,0,0,18944.546,0,0,-214389.53,0,0,-519338.58,0,0,2378251.6,0,0,2933842.6,0,0,2552719.3,0,0,-1502642.9,0,0,-1438939.3,0,0,-655929.75};
+VT(0.1,0.29285714,0,0.1,0.3,0,0.092857143,0.3,0){0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+VT(0.043838979,0.034579424,0,0.035858843,0.031497608,0,0.042433189,0.024814669,0){0,0,3745913.7,0,0,3456371.8,0,0,3739739.8,0,0,3260141.4,0,0,3083741.5,0,0,3488658.7,0,0,2351583.2,0,0,2378649.5,0,0,3003356.3,0,0,1138042.7,0,0,1417116.3,0,0,2316430.4,0,0,-223347.31,0,0,302618.73,0,0,1473602};
+VT(0.074931673,0.27468874,0,0.078222118,0.28277283,0,0.071000103,0.28243589,0){0,0,363389.18,0,0,220930.92,0,0,281581.81,0,0,-1064791.9,0,0,-655625.13,0,0,-835250.62,0,0,1691857.9,0,0,1069057.6,0,0,1360764.9,0,0,-2200836.4,0,0,-1447830.3,0,0,-1840418.5,0,0,2556129.1,0,0,1779434.3,0,0,2257916.8};
+VT(0.1,0,0,0.1,0.0071428571,0,0.092857143,0,0){0,0,0,0,0,0,0,0,863626.15,0,0,0,0,0,0,0,0,863662.39,0,0,0,0,0,0,0,0,863732,0,0,0,0,0,0,0,0,863838.35,0,0,0,0,0,0,0,0,863813.95};
+VT(0.070691378,0.017050195,0,0.078020383,0.017034313,0,0.074388951,0.025102472,0){0,0,3076870.7,0,0,2461848.1,0,0,2772012.4,0,0,2979073.3,0,0,2383750.6,0,0,2581574.2,0,0,2786592,0,0,2230032.5,0,0,2213781,0,0,2505581.5,0,0,2005590.6,0,0,1693914.7,0,0,2144710.8,0,0,1717239.5,0,0,1057277.9};
+VT(0.038597539,0.20095921,0,0.036160627,0.1953007,0,0.043569257,0.19619451,0){0,0,1801301.7,0,0,1834250.2,0,0,1966078.6,0,0,-3633864.6,0,0,-3509998.2,0,0,-3794921.6,0,0,1895634,0,0,1372423.7,0,0,1563901,0,0,1705394,0,0,2256297.6,0,0,2340412.7,0,0,-3630918.1,0,0,-3434247.7,0,0,-3741435.4};
+VT(0.059078636,0.27701937,0,0.06660802,0.27624666,0,0.063469548,0.28521738,0){0,0,447007.97,0,0,417349.44,0,0,273598.49,0,0,-1315269.1,0,0,-1226359.7,0,0,-814255.31,0,0,2107766.2,0,0,1959900.4,0,0,1335465.2,0,0,-2778864.5,0,0,-2572844.1,0,0,-1824812,0,0,3289755.3,0,0,3027289.2,0,0,2270429.1};
+VT(0.036602132,0.28491153,0,0.030312881,0.27848596,0,0.037999827,0.27482627,0){0,0,279518.56,0,0,355416.48,0,0,474219.19,0,0,-831596.18,0,0,-1048284.8,0,0,-1389905,0,0,1362985.6,0,0,1688178.9,0,0,2209621.2,0,0,-1860498.2,0,0,-2242771,0,0,-2876809.4,0,0,2311728.5,0,0,2683885.3,0,0,3345267.4};
+VT(0.091053567,0.10618538,0,0.09416017,0.099511923,0,0.1,0.10714286,0){0,0,914271.31,0,0,613994.66,0,0,0,0,0,-104388.15,0,0,5422.3845,0,0,0,0,0,-1006721.9,0,0,-608645.22,0,0,0,0,0,-787386.88,0,0,-619557.01,0,0,0,0,0,309052.61,0,0,-16415.987,0,0,0};
+VT(0.076938259,0.060604721,0,0.073604017,0.054819307,0,0.080938662,0.054906318,0){0,0,2443533.2,0,0,2744584.6,0,0,2097661.4,0,0,1491930.8,0,0,1864679.8,0,0,1423084,0,0,-40674.57,0,0,386939.94,0,0,290856.94,0,0,-1557435.8,0,0,-1214908.7,0,0,-934922.56,0,0,-2468002.6,0,0,-2427603.9,0,0,-1860365.1};
+VT(0.0064539684,0.081629255,0,0.0067127961,0.088875219,0,0,0.085714286,0){0,0,711139.06,0,0,725937.81,0,0,0,0,0,222377.16,0,0,141227.93,0,0,0,0,0,-419239.47,0,0,-557260.38,0,0,0,0,0,-772749.89,0,0,-806944.34,0,0,0,0,0,-595288.06,0,0,-406936.37,0,0,0};
+VT(0.070865224,0.080352924,0,0.074756101,0.075901522,0,0.075872285,0.081656016,0){0,0,2808030.6,0,0,2549479.1,0,0,2427639,0,0,934415.1,0,0,1021825.1,0,0,758134.07,0,0,-1562677.5,0,0,-1118145.3,0,0,-1432759.9,0,0,-3017110.1,0,0,-2588166.7,0,0,-2638364.3,0,0,-2458745.5,0,0,-2507455.8,0,0,-2029677.1};
+VT(0.024044461,0.20382537,0,0.03163445,0.20120488,0,0.030490983,0.2108424,0){0,0,1283805.9,0,0,1608414.7,0,0,1428644.1,0,0,-2655634.7,0,0,-3251875.6,0,0,-3128471,0,0,1553893.8,0,0,1714266.6,0,0,2293671,0,0,995311.88,0,0,1500504,0,0,399562.24,0,0,-2617892.2,0,0,-3248047,0,0,-2769801.9};
+VT(0.071915087,0.24816524,0,0.078142774,0.24370973,0,0.07921504,0.25033934,0){0,0,803363.84,0,0,714639.7,0,0,606155.6,0,0,-2179152.4,0,0,-1902709.3,0,0,-1658203,0,0,2928525.2,0,0,2448578.4,0,0,2271843.6,0,0,-2836050.6,0,0,-2167997.3,0,0,-2284831,0,0,1927975,0,0,1155455.3,0,0,1693484.6};
+VT(0.091308694,0.0093164623,0,0.093571257,0.018380777,0,0.085905658,0.016824409,0){0,0,1045151,0,0,774815.13,0,0,1656238,0,0,1035216.9,0,0,746204.54,0,0,1604967.9,0,0,1015442.8,0,0,690036.86,0,0,1504009.2,0,0,986027.05,0,0,608388.09,0,0,1356492.3,0,0,947106.05,0,0,504051.02,0,0,1166855};
+VT(0.08596482,0.28314521,0,0.093593186,0.28160993,0,0.091323117,0.29067423,0){0,0,145967.81,0,0,74588.283,0,0,51002.156,0,0,-433371.98,0,0,-221009.65,0,0,-152526.43,0,0,707326.96,0,0,359269.18,0,0,252617.29,0,0,-959333.22,0,0,-484261.41,0,0,-350336.87,0,0,1181452.3,0,0,591230.88,0,0,444691.33};
+VT(0.069002793,0.22246209,0,0.076796159,0.2234596,0,0.07180958,0.22984275,0){0,0,1267491.2,0,0,1008421.8,0,0,1079159.6,0,0,-3011719.2,0,0,-2411357.4,0,0,-2680718.2,0,0,2877058.6,0,0,2346331.8,0,0,2899261.6,0,0,-947533.34,0,0,-852928.84,0,0,-1622013.4,0,0,-1573376.1,0,0,-1160000.7,0,0,-492395.98};
+VT(0.04704595,0.16277363,0,0.042242048,0.16806859,0,0.038427921,0.16264679,0){0,0,2543508.6,0,0,2399442.3,0,0,2389351.9,0,0,-3221973.5,0,0,-3302042.1,0,0,-3020403.6,0,0,-1684138.2,0,0,-1157324.9,0,0,-1591681.4,0,0,3671419.3,0,0,3737475.6,0,0,3440909.6,0,0,704902.67,0,0,-248746.29,0,0,682723.32};
+VT(0.030466665,0.11568191,0,0.030575169,0.1246812,0,0.025139549,0.12057635,0){0,0,2608170,0,0,2526238.7,0,0,2224740.3,0,0,-773675.45,0,0,-1202245.8,0,0,-875333.98,0,0,-3152461.4,0,0,-3156412.2,0,0,-2755721.9,0,0,-1443702.3,0,0,-451924.48,0,0,-796179.51,0,0,2136967.4,0,0,2919641.1,0,0,2272644.8};
+VT(0.035619257,0.12028764,0,0.030575169,0.1246812,0,0.030466665,0.11568191,0){0,0,2821397.9,0,0,2526238.7,0,0,2608170,0,0,-1093830.4,0,0,-1202245.8,0,0,-773675.45,0,0,-3491178.8,0,0,-3156412.2,0,0,-3152461.4,0,0,-1043884.2,0,0,-451924.48,0,0,-1443702.3,0,0,2851838.9,0,0,2919641.1,0,0,2136967.4};
+VT(0.016927821,0.11108648,0,0.013465065,0.10662372,0,0.017861336,0.10270337,0){0,0,1644246.3,0,0,1351132.7,0,0,1773538.4,0,0,-340994.5,0,0,-165451.82,0,0,-87655.931,0,0,-1914445.6,0,0,-1496410,0,0,-1856823.6,0,0,-1176430.8,0,0,-1147793.4,0,0,-1677437.3,0,0,981584.41,0,0,489093.12,0,0,261812.45};
+VT(0.055764419,0.28986395,0,0.051519181,0.28417908,0,0.056292141,0.2827555,0){0,0,202473.1,0,0,320732.11,0,0,343081.75,0,0,-605163.67,0,0,-953415.16,0,0,-1018093.3,0,0,1001119.7,0,0,1560004.1,0,0,1660020.8,0,0,-1385941.2,0,0,-2123899.5,0,0,-2248005.1,0,0,1755276.4,0,0,2629434.9,0,0,2762903.8};
+VT(0.0068768393,0.16098373,0,0.0046637588,0.16745308,0,0,0.16428571,0){0,0,553409.29,0,0,362371.83,0,0,0,0,0,-680450.71,0,0,-494096.85,0,0,0,0,0,-397156.36,0,0,-182769.85,0,0,0,0,0,771605.48,0,0,560561.48,0,0,0,0,0,219690.78,0,0,-21256.565,0,0,0};
+VT(0.042541479,0.22296234,0,0.045116599,0.21481108,0,0.049797208,0.2214244,0){0,0,1481591,0,0,1654487.5,0,0,1551864.2,0,0,-3531706.6,0,0,-3731787.4,0,0,-3662861.4,0,0,3405357.4,0,0,3030991.5,0,0,3430735.4,0,0,-1180392.3,0,0,-73694.316,0,0,-1003918.8,0,0,-1772446.7,0,0,-2938909.4,0,0,-2065424.5};
+VT(0.07921504,0.25033934,0,0.078142774,0.24370973,0,0.083292987,0.24598228,0){0,0,606155.6,0,0,714639.7,0,0,542685.82,0,0,-1658203,0,0,-1902709.3,0,0,-1458992.1,0,0,2271843.6,0,0,2448578.4,0,0,1920780.7,0,0,-2284831,0,0,-2167997.3,0,0,-1784182,0,0,1693484.6,0,0,1155455.3,0,0,1091638.2};
+VT(0.042557423,0.10832344,0,0.038084092,0.1145524,0,0.034786476,0.1076516,0){0,0,3183930.6,0,0,2981407.2,0,0,2912738.3,0,0,-492142.06,0,0,-818508.93,0,0,-413135.58,0,0,-3600076,0,0,-3575257.7,0,0,-3267374.9,0,0,-2551523.2,0,0,-1775238,0,0,-2390915.6,0,0,1442840.6,0,0,2287308.3,0,0,1215377.6};
+VT(0.026270926,0.075674812,0,0.027058874,0.069011929,0,0.033874053,0.071548869,0){0,0,2630439.6,0,0,2727323.5,0,0,3157862.8,0,0,1063205.3,0,0,1363815.9,0,0,1466537.3,0,0,-1137545.6,0,0,-681543.48,0,0,-1010259.7,0,0,-2660659.2,0,0,-2386220.5,0,0,-2946084.6,0,0,-2599027.8,0,0,-2898415.6,0,0,-3304540.6};
+VT(0.070754378,0.060222618,0,0.073604017,0.054819307,0,0.076938259,0.060604721,0){0,0,2932444.5,0,0,2744584.6,0,0,2443533.2,0,0,1804303.3,0,0,1864679.8,0,0,1491930.8,0,0,-17984.254,0,0,386939.94,0,0,-40674.57,0,0,-1833384.6,0,0,-1214908.7,0,0,-1557435.8,0,0,-2943704.7,0,0,-2427603.9,0,0,-2468002.6};
+VT(0.061098586,0.072147464,0,0.060416267,0.076932239,0,0.054876921,0.07294965,0){0,0,3389933,0,0,3380545.3,0,0,3558755.8,0,0,1545196.6,0,0,1302521.2,0,0,1580988.4,0,0,-1140417.3,0,0,-1576156.6,0,0,-1275447.3,0,0,-3205469.9,0,0,-3485992.8,0,0,-3423192.1,0,0,-3526423.9,0,0,-3253298.6,0,0,-3669097.1};
+VT(0.061027247,0.098743066,0,0.058212185,0.089881183,0,0.066799394,0.09162077,0){0,0,3173016.6,0,0,3344291.6,0,0,2974160.1,0,0,72008.811,0,0,593905.21,0,0,440022.16,0,0,-3099474,0,0,-2645013.4,0,0,-2469083.6,0,0,-3241975.4,0,0,-3708817.1,0,0,-3274492.4,0,0,-216202.29,0,0,-1722713.3,0,0,-1290097.2};
+VT(0.05718895,0.22161738,0,0.053910411,0.21448753,0,0.063265205,0.21633109,0){0,0,1508977,0,0,1667429.4,0,0,1505335.5,0,0,-3566099.1,0,0,-3752161.8,0,0,-3432481.9,0,0,3352547.9,0,0,3023771,0,0,2888962.8,0,0,-1004251.2,0,0,-28239.212,0,0,-265885.87,0,0,-1983866.6,0,0,-2988983.1,0,0,-2549234.8};
+VT(0.076158908,0.12549637,0,0.082946441,0.12207685,0,0.082709707,0.12855445,0){0,0,2092101.1,0,0,1589878.9,0,0,1568327.1,0,0,-1030118.9,0,0,-673263.29,0,0,-869760.99,0,0,-2615047.7,0,0,-1978038.1,0,0,-1955764.1,0,0,-297340.89,0,0,-467139.5,0,0,-1353.9511,0,0,2464056,0,0,1708498.9,0,0,1955094.7};
+VT(0.052748817,0.036292023,0,0.060555575,0.040182349,0,0.054794838,0.043915046,0){0,0,3796611.1,0,0,3588260.7,0,0,3735662.6,0,0,3254886.9,0,0,2962222.2,0,0,2959425,0,0,2248728.5,0,0,1819353,0,0,1568238.5,0,0,921690.78,0,0,359025.67,0,0,-148813.91,0,0,-537197.11,0,0,-1164330.1,0,0,-1835117.4};
+VT(0.060819012,0.031697917,0,0.060555575,0.040182349,0,0.052748817,0.036292023,0){0,0,3608360,0,0,3588260.7,0,0,3796611.1,0,0,3214477.8,0,0,2962222.2,0,0,3254886.9,0,0,2469695.4,0,0,1819353,0,0,2248728.5,0,0,1455299.1,0,0,359025.67,0,0,921690.78,0,0,281702.17,0,0,-1164330.1,0,0,-537197.11};
+VT(0.054010827,0.25507988,0,0.060672356,0.25950081,0,0.0528723,0.26429657,0){0,0,897184.36,0,0,771273.27,0,0,718299.05,0,0,-2496661.6,0,0,-2177172.3,0,0,-2055661.9,0,0,3553831.7,0,0,3197356.1,0,0,3109067.1,0,0,-3839088.9,0,0,-3651078,0,0,-3733060,0,0,3290330.5,0,0,3457676.3,0,0,3841282.5};
+VT(0.0528723,0.26429657,0,0.060672356,0.25950081,0,0.061631884,0.26868773,0){0,0,718299.05,0,0,771273.27,0,0,591535.29,0,0,-2055661.9,0,0,-2177172.3,0,0,-1711593.4,0,0,3109067.1,0,0,3197356.1,0,0,2649353.2,0,0,-3733060,0,0,-3651078,0,0,-3304968.8,0,0,3841282.5,0,0,3457676.3,0,0,3608394.3};
+VT(0.064075209,0.013493001,0,0.06203594,0.0060944193,0,0.068476894,0.0069177029,0){0,0,3498581.2,0,0,3604620.2,0,0,3242851.4,0,0,3428890.3,0,0,3589956.2,0,0,3225849.8,0,0,3290906.4,0,0,3560685.5,0,0,3191931.3,0,0,3087427.7,0,0,3516960.1,0,0,3141298.2,0,0,2822154,0,0,3458793.9,0,0,3073847.6};
+VT(0.068366879,0.29272708,0,0.061805884,0.29356168,0,0.063469548,0.28521738,0){0,0,123803.43,0,0,121923.05,0,0,273598.49,0,0,-370697.46,0,0,-365207.83,0,0,-814255.31,0,0,615462.12,0,0,606815.62,0,0,1335465.2,0,0,-856697.17,0,0,-845641.09,0,0,-1824812,0,0,1092834.3,0,0,1080583.1,0,0,2270429.1};
+VT(0.036912897,0.21765752,0,0.029518097,0.21985532,0,0.030490983,0.2108424,0){0,0,1486590.9,0,0,1264894.2,0,0,1428644.1,0,0,-3421295.1,0,0,-2954793.2,0,0,-3128471,0,0,2965983.4,0,0,2682751.8,0,0,2293671,0,0,-438566.7,0,0,-629411.95,0,0,399562.24,0,0,-2395869.1,0,0,-1842177.8,0,0,-2769801.9};
+VT(0.012304267,0.13852123,0,0.0054758376,0.13911323,0,0.0072553778,0.13224921,0){0,0,1094693.2,0,0,495708.7,0,0,674958.82,0,0,-832176.34,0,0,-382921.42,0,0,-425463.67,0,0,-1294374.3,0,0,-582869.54,0,0,-832230.25,0,0,521821.54,0,0,250325.59,0,0,117822.57,0,0,1419655.5,0,0,639819.51,0,0,875622.71};
+VT(0.07492972,0.092844339,0,0.072044079,0.08604506,0,0.079265602,0.086677581,0){0,0,2431427.6,0,0,2688599.4,0,0,2114636.1,0,0,308451.38,0,0,649473.83,0,0,488789.06,0,0,-2083891.4,0,0,-1882262.6,0,0,-1512904.7,0,0,-2656803.1,0,0,-2986497.2,0,0,-2351470.6,0,0,-910298.79,0,0,-1825996.4,0,0,-1382326.1};
+VT(0.017373248,0.19021363,0,0.012931293,0.19295437,0,0.01062282,0.18656765,0){0,0,1095255.9,0,0,815194.79,0,0,711483.53,0,0,-1990705.9,0,0,-1524077.7,0,0,-1243147.4,0,0,532263.7,0,0,510133.92,0,0,217509.34,0,0,1555631.8,0,0,1080471.8,0,0,1080570.1,0,0,-1804413.6,0,0,-1450076.4,0,0,-1025407.6};
+VT(0.074388951,0.025102472,0,0.068707287,0.030314019,0,0.064795861,0.023107998,0){0,0,2772012.4,0,0,3188897.7,0,0,3443592.1,0,0,2581574.2,0,0,2870259.7,0,0,3242943.8,0,0,2213781,0,0,2264806.3,0,0,2853338,0,0,1693914.7,0,0,1433032.7,0,0,2297494.4,0,0,1057277.9,0,0,457746.25,0,0,1607540.9};
+VT(0.064795861,0.023107998,0,0.068707287,0.030314019,0,0.060819012,0.031697917,0){0,0,3443592.1,0,0,3188897.7,0,0,3608360,0,0,3242943.8,0,0,2870259.7,0,0,3214477.8,0,0,2853338,0,0,2264806.3,0,0,2469695.4,0,0,2297494.4,0,0,1433032.7,0,0,1455299.1,0,0,1607540.9,0,0,457746.25,0,0,281702.17};
+VT(0.084206466,0.24009781,0,0.092168655,0.23668616,0,0.089949388,0.2453858,0){0,0,569988.38,0,0,307607.26,0,0,339950.36,0,0,-1492933.9,0,0,-792496.69,0,0,-911669.73,0,0,1847439,0,0,941630.33,0,0,1193275.4,0,0,-1498530.8,0,0,-691810.02,0,0,-1095139.7,0,0,578923.58,0,0,148523.72,0,0,648419.14};
+VT(0.056199026,0.010061392,0,0.052049192,0.01582547,0,0.049204373,0.010884263,0){0,0,3801979,0,0,3859264.8,0,0,3873084,0,0,3759859.9,0,0,3753529.9,0,0,3822842.7,0,0,3676084,0,0,3544947.6,0,0,3723003.5,0,0,3551608.2,0,0,3239251.6,0,0,3574883.8,0,0,3387596.5,0,0,2844641.6,0,0,3380124.5};
+VT(0.025221599,0.062165695,0,0.032659307,0.059686042,0,0.031105381,0.06529626,0){0,0,2618029.3,0,0,3158137.1,0,0,3030579.1,0,0,1547191.2,0,0,1964024.3,0,0,1667989.8,0,0,-156575.4,0,0,27282.242,0,0,-444570.51,0,0,-1796512.5,0,0,-1919818.3,0,0,-2357289.6,0,0,-2702051.5,0,0,-3141270.1,0,0,-3210321.2};
+VT(0.031105381,0.06529626,0,0.037071258,0.0642048,0,0.033874053,0.071548869,0){0,0,3030579.1,0,0,3365311.2,0,0,3157862.8,0,0,1667989.8,0,0,1900443.5,0,0,1466537.3,0,0,-444570.51,0,0,-391679.98,0,0,-1010259.7,0,0,-2357289.6,0,0,-2513388.8,0,0,-2946084.6,0,0,-3210321.2,0,0,-3541461.8,0,0,-3304540.6};
+VT(0.064795861,0.023107998,0,0.070691378,0.017050195,0,0.074388951,0.025102472,0){0,0,3443592.1,0,0,3076870.7,0,0,2772012.4,0,0,3242943.8,0,0,2979073.3,0,0,2581574.2,0,0,2853338,0,0,2786592,0,0,2213781,0,0,2297494.4,0,0,2505581.5,0,0,1693914.7,0,0,1607540.9,0,0,2144710.8,0,0,1057277.9};
+VT(0.064075209,0.013493001,0,0.070691378,0.017050195,0,0.064795861,0.023107998,0){0,0,3498581.2,0,0,3076870.7,0,0,3443592.1,0,0,3428890.3,0,0,2979073.3,0,0,3242943.8,0,0,3290906.4,0,0,2786592,0,0,2853338,0,0,3087427.7,0,0,2505581.5,0,0,2297494.4,0,0,2822154,0,0,2144710.8,0,0,1607540.9};
+VT(0.024008584,0.022367291,0,0.033039341,0.023173825,0,0.028359285,0.029784535,0){0,0,2639060.6,0,0,3318087.9,0,0,2981166.2,0,0,2494948.4,0,0,3123656.1,0,0,2693525.9,0,0,2214593.6,0,0,2746181,0,0,2145980.7,0,0,1813324.4,0,0,2207795.9,0,0,1391347.7,0,0,1312931.3,0,0,1539940.3,0,0,502245.34};
+VT(0.075488644,0.14176328,0,0.068478919,0.13862632,0,0.076271482,0.13373081,0){0,0,1990888.2,0,0,2426951.1,0,0,2012844.4,0,0,-1647841.2,0,0,-1850187.5,0,0,-1330317.6,0,0,-2274843.7,0,0,-2866745.3,0,0,-2463975.8,0,0,1255935.2,0,0,1169007.7,0,0,494859.01,0,0,2491166.6,0,0,3144665.9,0,0,2631758.9};
+VT(0.076271482,0.13373081,0,0.068478919,0.13862632,0,0.067728608,0.12931058,0){0,0,2012844.4,0,0,2426951.1,0,0,2567539,0,0,-1330317.6,0,0,-1850187.5,0,0,-1463631.5,0,0,-2463975.8,0,0,-2866745.3,0,0,-3196956.5,0,0,494859.01,0,0,1169007.7,0,0,89062.443,0,0,2631758.9,0,0,3144665.9,0,0,3235608.2};
+VT(0.060432552,0.20227914,0,0.053221516,0.20704838,0,0.051624576,0.1997036,0){0,0,1798951.1,0,0,1805672.4,0,0,1943020.7,0,0,-3671781.8,0,0,-3837129.3,0,0,-3875569.2,0,0,2023610.8,0,0,2511247.5,0,0,1911651.5,0,0,1565241.8,0,0,1011998.4,0,0,1974364.4,0,0,-3653837,0,0,-3650194.7,0,0,-3875892.9};
+VT(0.079063451,0.10043005,0,0.076969725,0.10634022,0,0.072126291,0.10515927,0){0,0,2051820.1,0,0,2181001.1,0,0,2539730.3,0,0,-16056.497,0,0,-255488.75,0,0,-241283.81,0,0,-2067914.3,0,0,-2406546.5,0,0,-2758172.2,0,0,-2035845.1,0,0,-1869163.7,0,0,-2254933.2,0,0,48244.512,0,0,756176.24,0,0,717337.89};
+VT(0.063265205,0.21633109,0,0.053910411,0.21448753,0,0.059551151,0.20970619,0){0,0,1505335.5,0,0,1667429.4,0,0,1688112.8,0,0,-3432481.9,0,0,-3752161.8,0,0,-3664209.4,0,0,2888962.8,0,0,3023771,0,0,2601193.1,0,0,-265885.87,0,0,-28239.212,0,0,619333.89,0,0,-2549234.8,0,0,-2988983.1,0,0,-3326584.6};
+VT(0.059551151,0.20970619,0,0.066992124,0.20847551,0,0.063265205,0.21633109,0){0,0,1688112.8,0,0,1540360.8,0,0,1505335.5,0,0,-3664209.4,0,0,-3311175.4,0,0,-3432481.9,0,0,2601193.1,0,0,2266191.6,0,0,2888962.8,0,0,619333.89,0,0,706070.36,0,0,-265885.87,0,0,-3326584.6,0,0,-3078419.5,0,0,-2549234.8};
+VT(0.1,0.10714286,0,0.09416017,0.099511923,0,0.1,0.1,0){0,0,0,0,0,613994.66,0,0,0,0,0,0,0,0,5422.3845,0,0,0,0,0,0,0,0,-608645.22,0,0,0,0,0,0,0,0,-619557.01,0,0,0,0,0,0,0,0,-16415.987,0,0,0};
+VT(0,0.15714286,0,0.0068768393,0.16098373,0,0,0.16428571,0){0,0,0,0,0,553409.29,0,0,0,0,0,0,0,0,-680450.71,0,0,0,0,0,0,0,0,-397156.36,0,0,0,0,0,0,0,0,771605.48,0,0,0,0,0,0,0,0,219690.78,0,0,0};
+VT(0.031710863,0.0075461758,0,0.029163144,0.015558324,0,0.025468185,0.010276157,0){0,0,3254919.5,0,0,3068207,0,0,2780034,0,0,3234618.2,0,0,2986953.6,0,0,2747892,0,0,3194153.7,0,0,2826596.5,0,0,2683968.5,0,0,3133832.1,0,0,2591406.1,0,0,2589008.8,0,0,3053845.3,0,0,2287504.7,0,0,2463902.9};
+VT(0.072323403,0.067507008,0,0.079822506,0.065677674,0,0.080160084,0.071577727,0){0,0,2781512.1,0,0,2163855.5,0,0,2107851.9,0,0,1448400.9,0,0,1180001.4,0,0,977984.82,0,0,-578922.09,0,0,-340376.77,0,0,-676141.96,0,0,-2328912.3,0,0,-1706002.2,0,0,-1967920.1,0,0,-2963263.7,0,0,-2296197.5,0,0,-2205119.3};
+VT(0.085369203,0.17624497,0,0.093873231,0.17693503,0,0.089858368,0.18421461,0){0,0,1039089.6,0,0,445896.9,0,0,692603.24,0,0,-1603144.1,0,0,-694096.79,0,0,-1178349.1,0,0,-168940.91,0,0,-59504.029,0,0,133849.22,0,0,1695116.9,0,0,727141.13,0,0,1084450.2,0,0,-751642.95,0,0,-345394.37,0,0,-894447.98};
+VT(0.064352171,0.083117586,0,0.072044079,0.08604506,0,0.066799394,0.09162077,0){0,0,3167194.8,0,0,2688599.4,0,0,2974160.1,0,0,915483.69,0,0,649473.83,0,0,440022.16,0,0,-1987167.2,0,0,-1882262.6,0,0,-2469083.6,0,0,-3477240.4,0,0,-2986497.2,0,0,-3274492.4,0,0,-2495770,0,0,-1825996.4,0,0,-1290097.2};
+VT(0.0098751756,0.25600949,0,0.013885016,0.25805955,0,0.0071908097,0.26035264,0){0,0,270470.11,0,0,357160.64,0,0,179155.76,0,0,-755004.71,0,0,-1003688.5,0,0,-507033.49,0,0,1082095.4,0,0,1459712.7,0,0,748779.14,0,0,-1183544.7,0,0,-1638678.7,0,0,-863311.12,0,0,1038261.4,0,0,1506406.6,0,0,830950.48};
+VT(0.016759526,0.025876157,0,0.021348697,0.029751655,0,0.014137494,0.034012185,0){0,0,1932221.9,0,0,2382657.5,0,0,1641076.4,0,0,1791225.7,0,0,2153252.9,0,0,1435142,0,0,1519509.7,0,0,1716520.5,0,0,1049094.4,0,0,1136895.1,0,0,1114508.8,0,0,531342.12,0,0,671081.1,0,0,404958.41,0,0,-53364.585};
+VT(0.019499739,0.079597209,0,0.012549176,0.077039569,0,0.01882241,0.070374011,0){0,0,2040354.6,0,0,1370920.5,0,0,2018056.9,0,0,702945.71,0,0,525978.15,0,0,970762.8,0,0,-1095289.5,0,0,-643140.23,0,0,-580354.6,0,0,-2175701.2,0,0,-1415881.7,0,0,-1830388.5,0,0,-1830384.7,0,0,-1316306.1,0,0,-2130853.3};
+VT(0.0910478,0.13167545,0,0.083559522,0.13424014,0,0.082709707,0.12855445,0){0,0,831136.87,0,0,1462145.4,0,0,1568327.1,0,0,-514132.23,0,0,-981746.52,0,0,-869760.99,0,0,-1027305.8,0,0,-1784737.2,0,0,-1955764.1,0,0,122313.64,0,0,395362.65,0,0,-1353.9511,0,0,1073956.7,0,0,1914407.3,0,0,1955094.7};
+VT(0.087083587,0.13880919,0,0.083559522,0.13424014,0,0.0910478,0.13167545,0){0,0,1144744.3,0,0,1462145.4,0,0,831136.87,0,0,-877072.07,0,0,-981746.52,0,0,-514132.23,0,0,-1349889.8,0,0,-1784737.2,0,0,-1027305.8,0,0,561444.4,0,0,395362.65,0,0,122313.64,0,0,1481228.8,0,0,1914407.3,0,0,1073956.7};
+VT(0.018704911,0.19716585,0,0.015977634,0.20443356,0,0.011268327,0.1984065,0){0,0,1103230.1,0,0,895779.15,0,0,682302.12,0,0,-2149261.2,0,0,-1862602.8,0,0,-1344805.9,0,0,934589.13,0,0,1114548.4,0,0,623458.07,0,0,1263201.6,0,0,659707.69,0,0,739532.85,0,0,-2132672.2,0,0,-1827076.9,0,0,-1341727.7};
+VT(0.01882241,0.070374011,0,0.012549176,0.077039569,0,0.011197941,0.071439681,0){0,0,2018056.9,0,0,1370920.5,0,0,1244724.5,0,0,970762.8,0,0,525978.15,0,0,579995.21,0,0,-580354.6,0,0,-643140.23,0,0,-394493.66,0,0,-1830388.5,0,0,-1415881.7,0,0,-1158343.6,0,0,-2130853.3,0,0,-1316306.1,0,0,-1303869.8};
+VT(0.077013163,0.11736903,0,0.082946441,0.12207685,0,0.076158908,0.12549637,0){0,0,2095773.2,0,0,1589878.9,0,0,2092101.1,0,0,-691227.47,0,0,-673263.29,0,0,-1030118.9,0,0,-2559181.5,0,0,-1978038.1,0,0,-2615047.7,0,0,-1023961.4,0,0,-467139.5,0,0,-297340.89,0,0,1873161.8,0,0,1708498.9,0,0,2464056};
+VT(0.061244461,0.14481879,0,0.064971856,0.15110456,0,0.058552205,0.15400025,0){0,0,2643484.5,0,0,2431817,0,0,2589572.8,0,0,-2356788.3,0,0,-2488096.1,0,0,-2806487.5,0,0,-2899198.4,0,0,-2374265.3,0,0,-2354581.2,0,0,2042509.4,0,0,2543085,0,0,3003966,0,0,3121060.9,0,0,2315361.9,0,0,2103059.1};
+VT(0.0094805882,0.16707285,0,0.014405512,0.17061143,0,0.0069613667,0.17349451,0){0,0,730151.01,0,0,1063653,0,0,517779.21,0,0,-989834.58,0,0,-1519257.6,0,0,-769992.03,0,0,-378084.11,0,0,-412907.51,0,0,-142713.64,0,0,1124284.7,0,0,1696192.6,0,0,839532.94,0,0,-22095.939,0,0,-313907.63,0,0,-266340.1};
+VT(0.017763535,0.12074209,0,0.01198914,0.11616091,0,0.016927821,0.11108648,0){0,0,1657769.5,0,0,1171325.2,0,0,1644246.3,0,0,-657738.05,0,0,-358450.6,0,0,-340994.5,0,0,-2054600.3,0,0,-1420119.3,0,0,-1914445.6,0,0,-581651.26,0,0,-627101.02,0,0,-1176430.8,0,0,1703675.4,0,0,984768,0,0,981584.41};
+VT(0.051624576,0.1997036,0,0.043569257,0.19619451,0,0.050398693,0.1921099,0){0,0,1943020.7,0,0,1966078.6,0,0,2077292.2,0,0,-3875569.2,0,0,-3794921.6,0,0,-3850553.1,0,0,1911651.5,0,0,1563901,0,0,1209682,0,0,1974364.4,0,0,2340412.7,0,0,2818064.5,0,0,-3875892.9,0,0,-3741435.4,0,0,-3615771.1};
+VT(0.051624576,0.1997036,0,0.057391395,0.19462543,0,0.060432552,0.20227914,0){0,0,1943020.7,0,0,1979510.6,0,0,1798951.1,0,0,-3875569.2,0,0,-3763012.6,0,0,-3671781.8,0,0,1911651.5,0,0,1410875.8,0,0,2023610.8,0,0,1974364.4,0,0,2491970.2,0,0,1565241.8,0,0,-3875892.9,0,0,-3656419.8,0,0,-3653837};
+VT(0.03663522,0.040674234,0,0.032229878,0.047894836,0,0.028678488,0.042143634,0){0,0,3463485.9,0,0,3188476.9,0,0,2968313.4,0,0,2844620.6,0,0,2403076.1,0,0,2399521.8,0,0,1717431.6,0,0,1025710.6,0,0,1370917.4,0,0,283267.24,0,0,-604377.64,0,0,79587.615,0,0,-1201989.6,0,0,-2086050.7,0,0,-1227272.3};
+VT(0.038515413,0.047952704,0,0.032229878,0.047894836,0,0.03663522,0.040674234,0){0,0,3516906.1,0,0,3188476.9,0,0,3463485.9,0,0,2648581.9,0,0,2403076.1,0,0,2844620.6,0,0,1126309.3,0,0,1025710.6,0,0,1717431.6,0,0,-674068.75,0,0,-604377.64,0,0,283267.24,0,0,-2308227.3,0,0,-2086050.7,0,0,-1201989.6};
+VT(0.014137494,0.034012185,0,0.021348697,0.029751655,0,0.023478597,0.036718106,0){0,0,1641076.4,0,0,2382657.5,0,0,2561783.8,0,0,1435142,0,0,2153252.9,0,0,2187675.4,0,0,1049094.4,0,0,1716520.5,0,0,1494080.3,0,0,531342.12,0,0,1114508.8,0,0,582277.59,0,0,-53364.585,0,0,404958.41,0,0,-414804.14};
+VT(0.058552205,0.15400025,0,0.065117308,0.15657509,0,0.061476805,0.16269562,0){0,0,2589572.8,0,0,2354870.2,0,0,2391378.9,0,0,-2806487.5,0,0,-2678881.2,0,0,-3025373.1,0,0,-2354581.2,0,0,-1986291.9,0,0,-1589341.3,0,0,3003966,0,0,2952219.2,0,0,3446908.2,0,0,2103059.1,0,0,1580034,0,0,675366.83};
+VT(0.021957304,0.26060316,0,0.013885016,0.25805955,0,0.018179834,0.25267212,0){0,0,505833.44,0,0,357160.64,0,0,514543.14,0,0,-1432636.8,0,0,-1003688.5,0,0,-1419813.2,0,0,2119105.6,0,0,1459712.7,0,0,1983439.5,0,0,-2450095.8,0,0,-1638678.7,0,0,-2069793.3,0,0,2369995.8,0,0,1506406.6,0,0,1657747.8};
+VT(0.018179834,0.25267212,0,0.013885016,0.25805955,0,0.01180171,0.25230222,0){0,0,514543.14,0,0,357160.64,0,0,347512.04,0,0,-1419813.2,0,0,-1003688.5,0,0,-957611.77,0,0,1983439.5,0,0,1459712.7,0,0,1333704.3,0,0,-2069793.3,0,0,-1638678.7,0,0,-1383899.6,0,0,1657747.8,0,0,1506406.6,0,0,1095718.6};
+VT(0.078984823,0.22953004,0,0.077318805,0.23627719,0,0.07180958,0.22984275,0){0,0,858343.29,0,0,830868.27,0,0,1079159.6,0,0,-2128428.8,0,0,-2136157.9,0,0,-2680718.2,0,0,2291087.1,0,0,2525048.7,0,0,2899261.6,0,0,-1261656.1,0,0,-1830714.2,0,0,-1622013.4,0,0,-424553.92,0,0,350702.19,0,0,-492395.98};
+VT(0.1,0.15,0,0.09308158,0.15403623,0,0.09156348,0.14589395,0){0,0,0,0,0,579061.91,0,0,734092.88,0,0,0,0,0,-628036.95,0,0,-670961.7,0,0,0,0,0,-525997.02,0,0,-791796.8,0,0,0,0,0,672596.25,0,0,602866.55,0,0,0,0,0,469080.04,0,0,843431.47};
+VT(0.063469548,0.28521738,0,0.06660802,0.27624666,0,0.071000103,0.28243589,0){0,0,273598.49,0,0,417349.44,0,0,281581.81,0,0,-814255.31,0,0,-1226359.7,0,0,-835250.62,0,0,1335465.2,0,0,1959900.4,0,0,1360764.9,0,0,-1824812,0,0,-2572844.1,0,0,-1840418.5,0,0,2270429.1,0,0,3027289.2,0,0,2257916.8};
+VT(0.056317057,0.058022103,0,0.059054943,0.066788508,0,0.052494391,0.065958781,0){0,0,3630316.8,0,0,3499189.3,0,0,3640248,0,0,2330872.5,0,0,1856149.2,0,0,1971511.2,0,0,197001.66,0,0,-658492.2,0,0,-601016.65,0,0,-2007682.1,0,0,-2864039.1,0,0,-2898090,0,0,-3494460.7,0,0,-3725081.1,0,0,-3866942};
+VT(0.028359285,0.029784535,0,0.021348697,0.029751655,0,0.024008584,0.022367291,0){0,0,2981166.2,0,0,2382657.5,0,0,2639060.6,0,0,2693525.9,0,0,2153252.9,0,0,2494948.4,0,0,2145980.7,0,0,1716520.5,0,0,2214593.6,0,0,1391347.7,0,0,1114508.8,0,0,1813324.4,0,0,502245.34,0,0,404958.41,0,0,1312931.3};
+VT(0.054395265,0.16699477,0,0.054692531,0.17439284,0,0.048076401,0.17082416,0){0,0,2465605.5,0,0,2346407.8,0,0,2424680.5,0,0,-3338618.7,0,0,-3532168.6,0,0,-3473815.1,0,0,-1283530.8,0,0,-561454.61,0,0,-921629.25,0,0,3793219.5,0,0,3816051.1,0,0,3872759.5,0,0,-59660.123,0,0,-1367177.6,0,0,-754316.94};
+VT(0.088381846,0.16289419,0,0.093710586,0.16080643,0,0.092195724,0.16853594,0){0,0,911153.68,0,0,507346.27,0,0,598378.34,0,0,-1156470.7,0,0,-621948.04,0,0,-829189.07,0,0,-599768.12,0,0,-366919.85,0,0,-278570.16,0,0,1317920.1,0,0,704920.6,0,0,936666.51,0,0,244888.24,0,0,207593.47,0,0,-82641.6};
+VT(0.08944657,0.05485846,0,0.09230899,0.063522919,0,0.08415119,0.061061125,0){0,0,1211526.2,0,0,877619.52,0,0,1759442.9,0,0,822600.19,0,0,503392.8,0,0,1064240.3,0,0,169573.91,0,0,-85524.836,0,0,-51487.645,0,0,-537958.1,0,0,-638068.15,0,0,-1146904.2,0,0,-1073022.7,0,0,-918939.46,0,0,-1789550.6};
+VT(0.1,0.19285714,0,0.093164956,0.1980516,0,0.091593501,0.1915477,0){0,0,0,0,0,420734.09,0,0,544831.72,0,0,0,0,0,-826537.04,0,0,-1004107.1,0,0,0,0,0,376428.12,0,0,301623.68,0,0,0,0,0,463603.83,0,0,749822.54,0,0,0,0,0,-823893.15,0,0,-933881.71};
+VT(0,0.042857143,0,0.0063343033,0.038958017,0,0.0064812773,0.046734878,0){0,0,0,0,0,751213.74,0,0,761350.4,0,0,0,0,0,627892.11,0,0,582610.88,0,0,0,0,0,401490.67,0,0,267082.8,0,0,0,0,0,109174.99,0,0,-111174.21,0,0,0,0,0,-201236.23,0,0,-463416.67};
+VT(0.014285714,0.3,0,0.017990672,0.29207379,0,0.021428571,0.3,0){0,0,0,0,0,86228.122,0,0,0,0,0,0,0,0,-258100.45,0,0,0,0,0,0,0,0,428229.3,0,0,0,0,0,0,0,0,-595472.42,0,0,0,0,0,0,0,0,758576.15,0,0,0};
+VT(0.021428571,0,0,0.01808004,0.0081573173,0,0.014285714,0,0){0,0,2419501.9,0,0,2085729.2,0,0,1683701.5,0,0,2419561.9,0,0,2070583.9,0,0,1683671.3,0,0,2419679.8,0,0,2040406.9,0,0,1683611.9,0,0,2419876.4,0,0,1995444.2,0,0,1683542.6,0,0,2419989.4,0,0,1935913.6,0,0,1683226};
+VT(0.080160084,0.071577727,0,0.074756101,0.075901522,0,0.072323403,0.067507008,0){0,0,2107851.9,0,0,2549479.1,0,0,2781512.1,0,0,977984.82,0,0,1021825.1,0,0,1448400.9,0,0,-676141.96,0,0,-1118145.3,0,0,-578922.09,0,0,-1967920.1,0,0,-2588166.7,0,0,-2328912.3,0,0,-2205119.3,0,0,-2507455.8,0,0,-2963263.7};
+VT(0.050398693,0.1921099,0,0.057391395,0.19462543,0,0.051624576,0.1997036,0){0,0,2077292.2,0,0,1979510.6,0,0,1943020.7,0,0,-3850553.1,0,0,-3763012.6,0,0,-3875569.2,0,0,1209682,0,0,1410875.8,0,0,1911651.5,0,0,2818064.5,0,0,2491970.2,0,0,1974364.4,0,0,-3615771.1,0,0,-3656419.8,0,0,-3875892.9};
+VT(0.0062494098,0.068021592,0,0.0060853536,0.074713803,0,0,0.071428571,0){0,0,709501.16,0,0,681675.12,0,0,0,0,0,364477.97,0,0,285253.65,0,0,0,0,0,-157824.6,0,0,-277070.48,0,0,0,0,0,-603457.47,0,0,-678306.76,0,0,0,0,0,-756039.79,0,0,-685312.86,0,0,0};
+VT(0.045331711,0.23557633,0,0.052478219,0.23860916,0,0.047556344,0.24377674,0){0,0,1270563.3,0,0,1222305.6,0,0,1122639.4,0,0,-3255008.9,0,0,-3178913.4,0,0,-2989881.7,0,0,3813331,0,0,3866354.4,0,0,3850350.4,0,0,-2700862,0,0,-3010118,0,0,-3414324.1,0,0,404484.48,0,0,951644.63,0,0,1828478.4};
+VT(0.050960377,0.23252058,0,0.052478219,0.23860916,0,0.045331711,0.23557633,0){0,0,1342135.9,0,0,1222305.6,0,0,1270563.3,0,0,-3383651.2,0,0,-3178913.4,0,0,-3255008.9,0,0,3804738.6,0,0,3866354.4,0,0,3813331,0,0,-2403721.7,0,0,-3010118,0,0,-2700862,0,0,-148681.88,0,0,951644.63,0,0,404484.48};
+VT(0.089949388,0.2453858,0,0.083292987,0.24598228,0,0.084206466,0.24009781,0){0,0,339950.36,0,0,542685.82,0,0,569988.38,0,0,-911669.73,0,0,-1458992.1,0,0,-1492933.9,0,0,1193275.4,0,0,1920780.7,0,0,1847439,0,0,-1095139.7,0,0,-1784182,0,0,-1498530.8,0,0,648419.14,0,0,1091638.2,0,0,578923.58};
+VT(0.08415119,0.061061125,0,0.080938662,0.054906318,0,0.08944657,0.05485846,0){0,0,1759442.9,0,0,2097661.4,0,0,1211526.2,0,0,1064240.3,0,0,1423084,0,0,822600.19,0,0,-51487.645,0,0,290856.94,0,0,169573.91,0,0,-1146904.2,0,0,-934922.56,0,0,-537958.1,0,0,-1789550.6,0,0,-1860365.1,0,0,-1073022.7};
+VT(0.014285714,0.3,0,0.010662343,0.29482959,0,0.017990672,0.29207379,0){0,0,0,0,0,34537.041,0,0,86228.122,0,0,0,0,0,-103506.64,0,0,-258100.45,0,0,0,0,0,172164.12,0,0,428229.3,0,0,0,0,0,-240303.04,0,0,-595472.42,0,0,0,0,0,307518.14,0,0,758576.15};
+VT(0.08944657,0.05485846,0,0.094913401,0.051076335,0,0.1,0.057142857,0){0,0,1211526.2,0,0,595503.05,0,0,0,0,0,822600.19,0,0,429138.45,0,0,0,0,0,169573.91,0,0,142901.48,0,0,0,0,0,-537958.1,0,0,-183223.65,0,0,0,0,0,-1073022.7,0,0,-458373.75,0,0,0};
+VT(0.1,0.24285714,0,0.095090425,0.2489538,0,0.089949388,0.2453858,0){0,0,0,0,0,157454.16,0,0,339950.36,0,0,0,0,0,-428416.46,0,0,-911669.73,0,0,0,0,0,579817.55,0,0,1193275.4,0,0,0,0,0,-569427.53,0,0,-1095139.7,0,0,0,0,0,400020.01,0,0,648419.14};
+VT(0.01808004,0.0081573173,0,0.010679145,0.0052482016,0,0.014285714,0,0){0,0,2085729.2,0,0,1277155.8,0,0,1683701.5,0,0,2070583.9,0,0,1273289.3,0,0,1683671.3,0,0,2040406.9,0,0,1265566.3,0,0,1683611.9,0,0,1995444.2,0,0,1254019.7,0,0,1683542.6,0,0,1935913.6,0,0,1238493.9,0,0,1683226};
+VT(0.045375723,0.12284566,0,0.052058531,0.12554764,0,0.045894811,0.13135905,0){0,0,3072436,0,0,3065498.6,0,0,2973475.7,0,0,-1348503.3,0,0,-1512626.5,0,0,-1819976.4,0,0,-3829159.4,0,0,-3831818,0,0,-3679581.9,0,0,-800055.99,0,0,-428428.64,0,0,392676.16,0,0,3380414.3,0,0,3614977.4,0,0,3832095.1};
+VT(0.045894811,0.13135905,0,0.052058531,0.12554764,0,0.053497526,0.1329974,0){0,0,2973475.7,0,0,3065498.6,0,0,2959143.9,0,0,-1819976.4,0,0,-1512626.5,0,0,-1911000.9,0,0,-3679581.9,0,0,-3831818,0,0,-3636096,0,0,392676.16,0,0,-428428.64,0,0,623103.97,0,0,3832095.1,0,0,3614977.4,0,0,3857035.6};
+VT(0.03163445,0.20120488,0,0.036840853,0.20596239,0,0.030490983,0.2108424,0){0,0,1608414.7,0,0,1679916.9,0,0,1428644.1,0,0,-3251875.6,0,0,-3538121.9,0,0,-3128471,0,0,1714266.6,0,0,2233718.4,0,0,2293671,0,0,1500504,0,0,1067350,0,0,399562.24,0,0,-3248047,0,0,-3414669.4,0,0,-2769801.9};
+VT(0.089858368,0.18421461,0,0.082729031,0.18391978,0,0.085369203,0.17624497,0){0,0,692603.24,0,0,1144258.1,0,0,1039089.6,0,0,-1178349.1,0,0,-1940160.8,0,0,-1603144.1,0,0,133849.22,0,0,205244.05,0,0,-168940.91,0,0,1084450.2,0,0,1797438.3,0,0,1695116.9,0,0,-894447.98,0,0,-1455642.1,0,0,-751642.95};
+VT(0.02463475,0.21609565,0,0.021120118,0.21068669,0,0.030490983,0.2108424,0){0,0,1153636.1,0,0,1077357.5,0,0,1428644.1,0,0,-2626116.1,0,0,-2356401.7,0,0,-3128471,0,0,2198315,0,0,1720167.1,0,0,2293671,0,0,-179791.92,0,0,314292.11,0,0,399562.24,0,0,-1969098.8,0,0,-2093742.8,0,0,-2769801.9};
+VT(0.030490983,0.2108424,0,0.021120118,0.21068669,0,0.024044461,0.20382537,0){0,0,1428644.1,0,0,1077357.5,0,0,1283805.9,0,0,-3128471,0,0,-2356401.7,0,0,-2655634.7,0,0,2293671,0,0,1720167.1,0,0,1553893.8,0,0,399562.24,0,0,314292.11,0,0,995311.88,0,0,-2769801.9,0,0,-2093742.8,0,0,-2617892.2};
+VT(0.047385855,0.10193045,0,0.039702853,0.10111678,0,0.044548934,0.094607351,0){0,0,3329666.7,0,0,3175586.8,0,0,3364209.6,0,0,-117239.93,0,0,-64516.934,0,0,323528.56,0,0,-3442848.4,0,0,-3238866.3,0,0,-3009655.6,0,0,-3204510.9,0,0,-3108635.2,0,0,-3622750.1,0,0,350991.89,0,0,193445.51,0,0,-961698.97};
+VT(0.050721192,0.10961634,0,0.051013063,0.11801667,0,0.044666369,0.11545829,0){0,0,3257974.6,0,0,3161388.4,0,0,3148096.1,0,0,-583831.78,0,0,-1083065.4,0,0,-920013.3,0,0,-3737290.3,0,0,-3873486.3,0,0,-3799301.5,0,0,-2483878.9,0,0,-1463412.7,0,0,-1769018.1,0,0,1698581.7,0,0,2911579,0,0,2547335.8};
+VT(0.055764419,0.28986395,0,0.056292141,0.2827555,0,0.063469548,0.28521738,0){0,0,202473.1,0,0,343081.75,0,0,273598.49,0,0,-605163.67,0,0,-1018093.3,0,0,-814255.31,0,0,1001119.7,0,0,1660020.8,0,0,1335465.2,0,0,-1385941.2,0,0,-2248005.1,0,0,-1824812,0,0,1755276.4,0,0,2762903.8,0,0,2270429.1};
+VT(0.058552205,0.15400025,0,0.054296142,0.16027015,0,0.050010485,0.1548865,0){0,0,2589572.8,0,0,2568973.7,0,0,2672912.2,0,0,-2806487.5,0,0,-3120486,0,0,-2946373.7,0,0,-2354581.2,0,0,-1899085.7,0,0,-2371553.9,0,0,3003966,0,0,3528266.9,0,0,3189127.5,0,0,2103059.1,0,0,1141594.9,0,0,2045305.7};
+VT(0.01062282,0.18656765,0,0.0062925762,0.18063125,0,0.013878694,0.17880836,0){0,0,711483.53,0,0,445914.92,0,0,971566.52,0,0,-1243147.4,0,0,-727143.63,0,0,-1548960.4,0,0,217509.34,0,0,12632.594,0,0,-51095.574,0,0,1080570.1,0,0,719304.1,0,0,1579530,0,0,-1025407.6,0,0,-466469.22,0,0,-887966.26};
+VT(0.030490983,0.2108424,0,0.029518097,0.21985532,0,0.02463475,0.21609565,0){0,0,1428644.1,0,0,1264894.2,0,0,1153636.1,0,0,-3128471,0,0,-2954793.2,0,0,-2626116.1,0,0,2293671,0,0,2682751.8,0,0,2198315,0,0,399562.24,0,0,-629411.95,0,0,-179791.92,0,0,-2769801.9,0,0,-1842177.8,0,0,-1969098.8};
+VT(0.030312881,0.27848596,0,0.025044032,0.27464897,0,0.029991713,0.27132489,0){0,0,355416.48,0,0,363665.57,0,0,469504.82,0,0,-1048284.8,0,0,-1065519.5,0,0,-1366503,0,0,1688178.9,0,0,1692735.8,0,0,2141236.7,0,0,-2242771,0,0,-2201379.5,0,0,-2724385.3,0,0,2683885.3,0,0,2555652.6,0,0,3063642.3};
+VT(0.1,0.15,0,0.09156348,0.14589395,0,0.1,0.14285714,0){0,0,0,0,0,734092.88,0,0,0,0,0,0,0,0,-670961.7,0,0,0,0,0,0,0,0,-791796.8,0,0,0,0,0,0,0,0,602866.55,0,0,0,0,0,0,0,0,843431.47,0,0,0};
+VT(0.054957014,0.24657048,0,0.052478219,0.23860916,0,0.059437672,0.2400817,0){0,0,1058545,0,0,1222305.6,0,0,1145348.7,0,0,-2852831,0,0,-3178913.4,0,0,-2999714,0,0,3777171.8,0,0,3866354.4,0,0,3711340.5,0,0,-3549694.2,0,0,-3010118,0,0,-3009146,0,0,2239441.1,0,0,951644.63,0,0,1160252.2};
+VT(0.047556344,0.24377674,0,0.052478219,0.23860916,0,0.054957014,0.24657048,0){0,0,1122639.4,0,0,1222305.6,0,0,1058545,0,0,-2989881.7,0,0,-3178913.4,0,0,-2852831,0,0,3850350.4,0,0,3866354.4,0,0,3777171.8,0,0,-3414324.1,0,0,-3010118,0,0,-3549694.2,0,0,1828478.4,0,0,951644.63,0,0,2239441.1};
+VT(0.016702178,0.061420197,0,0.025221599,0.062165695,0,0.01882241,0.070374011,0){0,0,1844408.3,0,0,2618029.3,0,0,2018056.9,0,0,1107331.1,0,0,1547191.2,0,0,970762.8,0,0,-72241.295,0,0,-156575.4,0,0,-580354.6,0,0,-1222910.6,0,0,-1796512.5,0,0,-1830388.5,0,0,-1885264.1,0,0,-2702051.5,0,0,-2130853.3};
+VT(0.029380008,0.16405835,0,0.034314476,0.15645926,0,0.038427921,0.16264679,0){0,0,2021292.5,0,0,2334400.9,0,0,2389351.9,0,0,-2614335.2,0,0,-2649968.2,0,0,-3020403.6,0,0,-1254306.4,0,0,-1976247.7,0,0,-1591681.4,0,0,2982541.3,0,0,2917237.1,0,0,3440909.6,0,0,378860.61,0,0,1581967.4,0,0,682723.32};
+VT(0.027609688,0.15620978,0,0.034314476,0.15645926,0,0.029380008,0.16405835,0){0,0,2023546.1,0,0,2334400.9,0,0,2021292.5,0,0,-2286520.9,0,0,-2649968.2,0,0,-2614335.2,0,0,-1726415,0,0,-1976247.7,0,0,-1254306.4,0,0,2510934.9,0,0,2917237.1,0,0,2982541.3,0,0,1400022.9,0,0,1581967.4,0,0,378860.61};
+VT(0.041057987,0.068843254,0,0.037071258,0.0642048,0,0.045416206,0.061541227,0){0,0,3488848.8,0,0,3365311.2,0,0,3642820.9,0,0,1752771.3,0,0,1900443.5,0,0,2181474.8,0,0,-855539,0,0,-391679.98,0,0,-155055.51,0,0,-3038218.5,0,0,-2513388.8,0,0,-2429600.5,0,0,-3709409.4,0,0,-3541461.8,0,0,-3730025.8};
+VT(0.084368038,0.19048099,0,0.082729031,0.18391978,0,0.089858368,0.18421461,0){0,0,992852.93,0,0,1144258.1,0,0,692603.24,0,0,-1809621.2,0,0,-1940160.8,0,0,-1178349.1,0,0,495817.1,0,0,205244.05,0,0,133849.22,0,0,1401810.9,0,0,1797438.3,0,0,1084450.2,0,0,-1649308.4,0,0,-1455642.1,0,0,-894447.98};
+VT(0.020973714,0.16688371,0,0.014405512,0.17061143,0,0.014502412,0.16316663,0){0,0,1525118.3,0,0,1063653,0,0,1121335,0,0,-2061659.5,0,0,-1519257.6,0,0,-1429592.9,0,0,-799875.51,0,0,-412907.51,0,0,-728363.13,0,0,2343184.8,0,0,1696192.6,0,0,1629901.1,0,0,-24581.749,0,0,-313907.63,0,0,280110.31};
+VT(0.03663522,0.040674234,0,0.035858843,0.031497608,0,0.043838979,0.034579424,0){0,0,3463485.9,0,0,3456371.8,0,0,3745913.7,0,0,2844620.6,0,0,3083741.5,0,0,3260141.4,0,0,1717431.6,0,0,2378649.5,0,0,2351583.2,0,0,283267.24,0,0,1417116.3,0,0,1138042.7,0,0,-1201989.6,0,0,302618.73,0,0,-223347.31};
+VT(0.064075209,0.013493001,0,0.057612168,0.01845715,0,0.056199026,0.010061392,0){0,0,3498581.2,0,0,3752599.8,0,0,3801979,0,0,3428890.3,0,0,3612875.5,0,0,3759859.9,0,0,3290906.4,0,0,3338613.5,0,0,3676084,0,0,3087427.7,0,0,2940029.2,0,0,3551608.2,0,0,2822154,0,0,2431782.4,0,0,3387596.5};
+VT(0.025130011,0.29009115,0,0.028198926,0.28535727,0,0.031264826,0.29263185,0){0,0,142877.47,0,0,230200.16,0,0,124484.17,0,0,-427099.39,0,0,-685197.76,0,0,-372709.78,0,0,706741.94,0,0,1124120.6,0,0,618717.86,0,0,-978805.55,0,0,-1536674.3,0,0,-861054.65,0,0,1240164.3,0,0,1912913.1,0,0,1098239.8};
+VT(0.066799394,0.09162077,0,0.069968451,0.098831219,0,0.061027247,0.098743066,0){0,0,2974160.1,0,0,2730411,0,0,3173016.6,0,0,440022.16,0,0,57648.531,0,0,72008.811,0,0,-2469083.6,0,0,-2671597.7,0,0,-3099474,0,0,-3274492.4,0,0,-2785714.6,0,0,-3241975.4,0,0,-1290097.2,0,0,-173126.8,0,0,-216202.29};
+VT(0.063469548,0.28521738,0,0.056292141,0.2827555,0,0.059078636,0.27701937,0){0,0,273598.49,0,0,343081.75,0,0,447007.97,0,0,-814255.31,0,0,-1018093.3,0,0,-1315269.1,0,0,1335465.2,0,0,1660020.8,0,0,2107766.2,0,0,-1824812,0,0,-2248005.1,0,0,-2778864.5,0,0,2270429.1,0,0,2762903.8,0,0,3289755.3};
+VT(0.05718895,0.22161738,0,0.062992669,0.22303634,0,0.059957308,0.22757204,0){0,0,1508977,0,0,1396775.9,0,0,1366903.5,0,0,-3566099.1,0,0,-3331109.7,0,0,-3351367.9,0,0,3352547.9,0,0,3216330,0,0,3498598.8,0,0,-1004251.2,0,0,-1122974.8,0,0,-1727811.3,0,0,-1983866.6,0,0,-1661551.4,0,0,-990620.01};
+VT(0.063265205,0.21633109,0,0.062992669,0.22303634,0,0.05718895,0.22161738,0){0,0,1505335.5,0,0,1396775.9,0,0,1508977,0,0,-3432481.9,0,0,-3331109.7,0,0,-3566099.1,0,0,2888962.8,0,0,3216330,0,0,3352547.9,0,0,-265885.87,0,0,-1122974.8,0,0,-1004251.2,0,0,-2549234.8,0,0,-1661551.4,0,0,-1983866.6};
+VT(0.044637502,0.20577347,0,0.045116599,0.21481108,0,0.038843793,0.21103197,0){0,0,1811821.2,0,0,1654487.5,0,0,1637090.1,0,0,-3810004,0,0,-3731787.4,0,0,-3590120.4,0,0,2390091.8,0,0,3030991.5,0,0,2645890.8,0,0,1174216.7,0,0,-73694.316,0,0,433646.44,0,0,-3685779.4,0,0,-2938909.4,0,0,-3163532.2};
+VT(0.061631884,0.26868773,0,0.055001581,0.27169863,0,0.0528723,0.26429657,0){0,0,591535.29,0,0,565900.8,0,0,718299.05,0,0,-1711593.4,0,0,-1648356.5,0,0,-2055661.9,0,0,2649353.2,0,0,2587095.5,0,0,3109067.1,0,0,-3304968.8,0,0,-3300283.2,0,0,-3733060,0,0,3608394.3,0,0,3725567.5,0,0,3841282.5};
+VT(0.049232245,0.21047418,0,0.045116599,0.21481108,0,0.044637502,0.20577347,0){0,0,1752658.6,0,0,1654487.5,0,0,1811821.2,0,0,-3827070.5,0,0,-3731787.4,0,0,-3810004,0,0,2777012.8,0,0,3030991.5,0,0,2390091.8,0,0,540242.46,0,0,-73694.316,0,0,1174216.7,0,0,-3416565.4,0,0,-2938909.4,0,0,-3685779.4};
+VT(0.1,0.17142857,0,0.093873231,0.17693503,0,0.092195724,0.16853594,0){0,0,0,0,0,445896.9,0,0,598378.34,0,0,0,0,0,-694096.79,0,0,-829189.07,0,0,0,0,0,-59504.029,0,0,-278570.16,0,0,0,0,0,727141.13,0,0,936666.51,0,0,0,0,0,-345394.37,0,0,-82641.6};
+VT(0.0060491453,0.25298129,0,0.0071908097,0.26035264,0,0,0.25714286,0){0,0,178654.23,0,0,179155.76,0,0,0,0,0,-493529.07,0,0,-507033.49,0,0,0,0,0,691183.17,0,0,748779.14,0,0,0,0,0,-724662.05,0,0,-863311.12,0,0,0,0,0,585970.08,0,0,830950.48,0,0,0};
+VT(0.0072553778,0.13224921,0,0.014210915,0.13228117,0,0.012304267,0.13852123,0){0,0,674958.82,0,0,1289449.4,0,0,1094693.2,0,0,-425463.67,0,0,-813665.75,0,0,-832176.34,0,0,-832230.25,0,0,-1589638.3,0,0,-1294374.3,0,0,117822.57,0,0,227067.92,0,0,521821.54,0,0,875622.71,0,0,1673024.3,0,0,1419655.5};
+VT(0.028359285,0.029784535,0,0.030602087,0.036163623,0,0.023478597,0.036718106,0){0,0,2981166.2,0,0,3125169.1,0,0,2561783.8,0,0,2693525.9,0,0,2682310.4,0,0,2187675.4,0,0,2145980.7,0,0,1859340.6,0,0,1494080.3,0,0,1391347.7,0,0,772883.67,0,0,582277.59,0,0,502245.34,0,0,-423255.99,0,0,-414804.14};
+VT(0.023478597,0.036718106,0,0.030602087,0.036163623,0,0.028678488,0.042143634,0){0,0,2561783.8,0,0,3125169.1,0,0,2968313.4,0,0,2187675.4,0,0,2682310.4,0,0,2399521.8,0,0,1494080.3,0,0,1859340.6,0,0,1370917.4,0,0,582277.59,0,0,772883.67,0,0,79587.615,0,0,-414804.14,0,0,-423255.99,0,0,-1227272.3};
+VT(0.0069613667,0.17349451,0,0.014405512,0.17061143,0,0.013878694,0.17880836,0){0,0,517779.21,0,0,1063653,0,0,971566.52,0,0,-769992.03,0,0,-1519257.6,0,0,-1548960.4,0,0,-142713.64,0,0,-412907.51,0,0,-51095.574,0,0,839532.94,0,0,1696192.6,0,0,1579530,0,0,-266340.1,0,0,-313907.63,0,0,-887966.26};
+VT(0.069467767,0.146519,0,0.068478919,0.13862632,0,0.075488644,0.14176328,0){0,0,2287173.5,0,0,2426951.1,0,0,1990888.2,0,0,-2120501.9,0,0,-1850187.5,0,0,-1647841.2,0,0,-2441744.6,0,0,-2866745.3,0,0,-2274843.7,0,0,1942651.5,0,0,1169007.7,0,0,1255935.2,0,0,2583122,0,0,3144665.9,0,0,2491166.6};
+VT(0.043838979,0.034579424,0,0.048866761,0.029559705,0,0.052748817,0.036292023,0){0,0,3745913.7,0,0,3831772.8,0,0,3796611.1,0,0,3260141.4,0,0,3467532.3,0,0,3254886.9,0,0,2351583.2,0,0,2773676.3,0,0,2248728.5,0,0,1138042.7,0,0,1816186,0,0,921690.78,0,0,-223347.31,0,0,685852.4,0,0,-537197.11};
+VT(0.0528723,0.26429657,0,0.049721881,0.27094787,0,0.043491003,0.26677795,0){0,0,718299.05,0,0,588018.61,0,0,657627.62,0,0,-2055661.9,0,0,-1710042.9,0,0,-1894105.9,0,0,3109067.1,0,0,2675009.8,0,0,2903724.9,0,0,-3733060,0,0,-3394309,0,0,-3565612.1,0,0,3841282.5,0,0,3801713.7,0,0,3800401.2};
+VT(0.044548934,0.094607351,0,0.039702853,0.10111678,0,0.03690243,0.09394169,0){0,0,3364209.6,0,0,3175586.8,0,0,3135041.5,0,0,323528.56,0,0,-64516.934,0,0,337961.95,0,0,-3009655.6,0,0,-3238866.3,0,0,-2760700,0,0,-3622750.1,0,0,-3108635.2,0,0,-3396384.7,0,0,-961698.97,0,0,193445.51,0,0,-1002139.6};
+VT(0.089858368,0.18421461,0,0.095453592,0.18738967,0,0.091593501,0.1915477,0){0,0,692603.24,0,0,307137.29,0,0,544831.72,0,0,-1178349.1,0,0,-541566.85,0,0,-1004107.1,0,0,133849.22,0,0,106216.39,0,0,301623.68,0,0,1084450.2,0,0,460538.95,0,0,749822.54,0,0,-894447.98,0,0,-458087.35,0,0,-933881.71};
+VT(0,0.12857143,0,0.0061411468,0.1246533,0,0.0072553778,0.13224921,0){0,0,0,0,0,591118.91,0,0,674958.82,0,0,0,0,0,-280990.71,0,0,-425463.67,0,0,0,0,0,-738586.84,0,0,-832230.25,0,0,0,0,0,-106527.54,0,0,117822.57,0,0,0,0,0,682629.18,0,0,875622.71};
+VT(0.057612168,0.01845715,0,0.052049192,0.01582547,0,0.056199026,0.010061392,0){0,0,3752599.8,0,0,3859264.8,0,0,3801979,0,0,3612875.5,0,0,3753529.9,0,0,3759859.9,0,0,3338613.5,0,0,3544947.6,0,0,3676084,0,0,2940029.2,0,0,3239251.6,0,0,3551608.2,0,0,2431782.4,0,0,2844641.6,0,0,3387596.5};
+VT(0.015977634,0.20443356,0,0.021120118,0.21068669,0,0.013229009,0.21171696,0){0,0,895779.15,0,0,1077357.5,0,0,698716.07,0,0,-1862602.8,0,0,-2356401.7,0,0,-1540332.8,0,0,1114548.4,0,0,1720167.1,0,0,1156621.3,0,0,659707.69,0,0,314292.11,0,0,147278.69,0,0,-1827076.9,0,0,-2093742.8,0,0,-1334554.8};
+VT(0.0064812773,0.046734878,0,0.0063343033,0.038958017,0,0.011573719,0.041901165,0){0,0,761350.4,0,0,751213.74,0,0,1347025.1,0,0,582610.88,0,0,627892.11,0,0,1091815.8,0,0,267082.8,0,0,401490.67,0,0,629744.45,0,0,-111174.21,0,0,109174.99,0,0,48353.226,0,0,-463416.67,0,0,-201236.23,0,0,-542301.86};
+VT(0.054395265,0.16699477,0,0.054296142,0.16027015,0,0.061476805,0.16269562,0){0,0,2465605.5,0,0,2568973.7,0,0,2391378.9,0,0,-3338618.7,0,0,-3120486,0,0,-3025373.1,0,0,-1283530.8,0,0,-1899085.7,0,0,-1589341.3,0,0,3793219.5,0,0,3528266.9,0,0,3446908.2,0,0,-59660.123,0,0,1141594.9,0,0,675366.83};
+VT(0.0094805882,0.16707285,0,0.0046637588,0.16745308,0,0.0068768393,0.16098373,0){0,0,730151.01,0,0,362371.83,0,0,553409.29,0,0,-989834.58,0,0,-494096.85,0,0,-680450.71,0,0,-378084.11,0,0,-182769.85,0,0,-397156.36,0,0,1124284.7,0,0,560561.48,0,0,771605.48,0,0,-22095.939,0,0,-21256.565,0,0,219690.78};
+VT(0.017763535,0.12074209,0,0.023213665,0.1150537,0,0.025139549,0.12057635,0){0,0,1657769.5,0,0,2130593.3,0,0,2224740.3,0,0,-657738.05,0,0,-605772.32,0,0,-875333.98,0,0,-2054600.3,0,0,-2564157.8,0,0,-2755721.9,0,0,-581651.26,0,0,-1229375.9,0,0,-796179.51,0,0,1703675.4,0,0,1684092.7,0,0,2272644.8};
+VT(0,0.14285714,0,0.0078195435,0.14622426,0,0,0.15,0){0,0,0,0,0,680366.1,0,0,0,0,0,0,0,0,-626541.18,0,0,0,0,0,0,0,0,-729870.69,0,0,0,0,0,0,0,0,568744.13,0,0,0,0,0,0,0,0,774663.29,0,0,0};
+VT(0,0.10714286,0,0.0081152275,0.10988635,0,0,0.11428571,0){0,0,0,0,0,821145.89,0,0,0,0,0,0,0,0,-151361.79,0,0,0,0,0,0,0,0,-944689.8,0,0,0,0,0,0,0,0,-619246.83,0,0,0,0,0,0,0,0,439508.43,0,0,0};
+VT(0.023483408,0.28013687,0,0.025044032,0.27464897,0,0.030312881,0.27848596,0){0,0,270985.88,0,0,363665.57,0,0,355416.48,0,0,-801278.39,0,0,-1065519.5,0,0,-1048284.8,0,0,1297043.7,0,0,1692735.8,0,0,1688178.9,0,0,-1736920.8,0,0,-2201379.5,0,0,-2242771,0,0,2101746.5,0,0,2555652.6,0,0,2683885.3};
+VT(0.085369203,0.17624497,0,0.083969261,0.16737329,0,0.092195724,0.16853594,0){0,0,1039089.6,0,0,1198489.7,0,0,598378.34,0,0,-1603144.1,0,0,-1632158.2,0,0,-829189.07,0,0,-168940.91,0,0,-607916.58,0,0,-278570.16,0,0,1695116.9,0,0,1852187.2,0,0,936666.51,0,0,-751642.95,0,0,-62490.334,0,0,-82641.6};
+VT(0.0910478,0.13167545,0,0.093823791,0.12410599,0,0.1,0.12857143,0){0,0,831136.87,0,0,595735.92,0,0,0,0,0,-514132.23,0,0,-276601.23,0,0,0,0,0,-1027305.8,0,0,-743959.63,0,0,0,0,0,122313.64,0,0,-121937.8,0,0,0,0,0,1073956.7,0,0,678759.2,0,0,0};
+VT(0.1,0.10714286,0,0.091758141,0.11296708,0,0.091053567,0.10618538,0){0,0,0,0,0,824791.32,0,0,914271.31,0,0,0,0,0,-201020.76,0,0,-104388.15,0,0,0,0,0,-976886.6,0,0,-1006721.9,0,0,0,0,0,-537824.26,0,0,-787386.88,0,0,0,0,0,570097.26,0,0,309052.61};
+VT(0.01808004,0.0081573173,0,0.022427218,0.014872357,0,0.015416139,0.018002698,0){0,0,2085729.2,0,0,2505875.7,0,0,1798828.3,0,0,2070583.9,0,0,2445229.8,0,0,1735136,0,0,2040406.9,0,0,2325397.7,0,0,1609995.5,0,0,1995444.2,0,0,2149288.4,0,0,1427830.3,0,0,1935913.6,0,0,1920956.8,0,0,1194733.1};
+VT(0.015498485,0.28248556,0,0.0220603,0.28602893,0,0.017990672,0.29207379,0){0,0,166274.63,0,0,181204.07,0,0,86228.122,0,0,-493262.57,0,0,-539738.59,0,0,-258100.45,0,0,803759.61,0,0,886739.53,0,0,428229.3,0,0,-1087394.1,0,0,-1214791.9,0,0,-595472.42,0,0,1334475.8,0,0,1516611.7,0,0,758576.15};
+VT(0.013229009,0.21171696,0,0.021120118,0.21068669,0,0.018343869,0.21720619,0){0,0,698716.07,0,0,1077357.5,0,0,888277.19,0,0,-1540332.8,0,0,-2356401.7,0,0,-2037897.4,0,0,1156621.3,0,0,1720167.1,0,0,1749211,0,0,147278.69,0,0,314292.11,0,0,-225952.88,0,0,-1334554.8,0,0,-2093742.8,0,0,-1457259.1};
+VT(0.061015306,0.048529238,0,0.060555575,0.040182349,0,0.066401409,0.0434645,0){0,0,3533367.8,0,0,3588260.7,0,0,3289675.8,0,0,2640342.3,0,0,2962222.2,0,0,2619840.6,0,0,1080012.2,0,0,1819353,0,0,1416557.6,0,0,-753291.7,0,0,359025.67,0,0,-75156.319,0,0,-2396723.8,0,0,-1164330.1,0,0,-1551772};
+VT(0.054794838,0.043915046,0,0.060555575,0.040182349,0,0.061015306,0.048529238,0){0,0,3735662.6,0,0,3588260.7,0,0,3533367.8,0,0,2959425,0,0,2962222.2,0,0,2640342.3,0,0,1568238.5,0,0,1819353,0,0,1080012.2,0,0,-148813.91,0,0,359025.67,0,0,-753291.7,0,0,-1835117.4,0,0,-1164330.1,0,0,-2396723.8};
+VT(0.01062282,0.18656765,0,0.012931293,0.19295437,0,0.0066871595,0.19241823,0){0,0,711483.53,0,0,815194.79,0,0,432113.5,0,0,-1243147.4,0,0,-1524077.7,0,0,-803518.34,0,0,217509.34,0,0,510133.92,0,0,258472.73,0,0,1080570.1,0,0,1080471.8,0,0,581490.34,0,0,-1025407.6,0,0,-1450076.4,0,0,-758588.26};
+VT(0.010546892,0.2198034,0,0.0069979116,0.22643766,0,0,0.22142857,0){0,0,514716.79,0,0,317964.48,0,0,0,0,0,-1201974.2,0,0,-774386.26,0,0,0,0,0,1090194.6,0,0,793599.18,0,0,0,0,0,-253690.09,0,0,-364658.79,0,0,0,0,0,-751659.26,0,0,-270536.88,0,0,0};
+VT(0.04704595,0.16277363,0,0.054296142,0.16027015,0,0.054395265,0.16699477,0){0,0,2543508.6,0,0,2568973.7,0,0,2465605.5,0,0,-3221973.5,0,0,-3120486,0,0,-3338618.7,0,0,-1684138.2,0,0,-1899085.7,0,0,-1283530.8,0,0,3671419.3,0,0,3528266.9,0,0,3793219.5,0,0,704902.67,0,0,1141594.9,0,0,-59660.123};
+VT(0.015758122,0.23699049,0,0.016939848,0.22904958,0,0.022740693,0.23189018,0){0,0,597291.98,0,0,714788.59,0,0,887604.04,0,0,-1541119.1,0,0,-1767596.2,0,0,-2230116.3,0,0,1837947.1,0,0,1888698.3,0,0,2485475.6,0,0,-1363109.4,0,0,-1014237.8,0,0,-1529145.6,0,0,315646.37,0,0,-395054.79,0,0,-172982.46};
+VT(0.076430303,0.18837043,0,0.082729031,0.18391978,0,0.084368038,0.19048099,0){0,0,1444535.6,0,0,1144258.1,0,0,992852.93,0,0,-2574453.4,0,0,-1940160.8,0,0,-1809621.2,0,0,569102.25,0,0,205244.05,0,0,495817.1,0,0,2129625.3,0,0,1797438.3,0,0,1401810.9,0,0,-2235391.7,0,0,-1455642.1,0,0,-1649308.4};
+VT(0.077619244,0.18028791,0,0.082729031,0.18391978,0,0.076430303,0.18837043,0){0,0,1471797.4,0,0,1144258.1,0,0,1444535.6,0,0,-2389894.4,0,0,-1940160.8,0,0,-2574453.4,0,0,18944.546,0,0,205244.05,0,0,569102.25,0,0,2378251.6,0,0,1797438.3,0,0,2129625.3,0,0,-1502642.9,0,0,-1455642.1,0,0,-2235391.7};
+VT(0.059078636,0.27701937,0,0.056292141,0.2827555,0,0.051703203,0.27754162,0){0,0,447007.97,0,0,343081.75,0,0,454636.43,0,0,-1315269.1,0,0,-1018093.3,0,0,-1338881.7,0,0,2107766.2,0,0,1660020.8,0,0,2149437.1,0,0,-2778864.5,0,0,-2248005.1,0,0,-2841702,0,0,3289755.3,0,0,2762903.8,0,0,3377384.9};
+VT(0.010546892,0.2198034,0,0.0051799073,0.21317882,0,0.013229009,0.21171696,0){0,0,514716.79,0,0,276031.48,0,0,698716.07,0,0,-1201974.2,0,0,-615227.88,0,0,-1540332.8,0,0,1090194.6,0,0,479976.29,0,0,1156621.3,0,0,-253690.09,0,0,25450.705,0,0,147278.69,0,0,-751659.26,0,0,-511551.59,0,0,-1334554.8};
+VT(0.061027247,0.098743066,0,0.052532368,0.096036702,0,0.058212185,0.089881183,0){0,0,3173016.6,0,0,3389506.1,0,0,3344291.6,0,0,72008.811,0,0,240670.51,0,0,593905.21,0,0,-3099474,0,0,-3131818.5,0,0,-2645013.4,0,0,-3241975.4,0,0,-3594959.1,0,0,-3708817.1,0,0,-216202.29,0,0,-718569.73,0,0,-1722713.3};
+VT(0.09156348,0.14589395,0,0.09308158,0.15403623,0,0.084604507,0.15255901,0){0,0,734092.88,0,0,579061.91,0,0,1258841.2,0,0,-670961.7,0,0,-628036.95,0,0,-1326319,0,0,-791796.8,0,0,-525997.02,0,0,-1187789.9,0,0,602866.55,0,0,672596.25,0,0,1390056.3,0,0,843431.47,0,0,469080.04,0,0,1113216.6};
+VT(0,0.2,0,0.007303543,0.20469543,0,0,0.20714286,0){0,0,0,0,0,422375.13,0,0,0,0,0,0,0,0,-880191.16,0,0,0,0,0,0,0,0,531663.92,0,0,0,0,0,0,0,0,303952.91,0,0,0,0,0,0,0,0,-861341.37,0,0,0};
+VT(0.052478219,0.23860916,0,0.056766116,0.23329497,0,0.059437672,0.2400817,0){0,0,1222305.6,0,0,1298096.4,0,0,1145348.7,0,0,-3178913.4,0,0,-3286228.7,0,0,-2999714,0,0,3866354.4,0,0,3735031.6,0,0,3711340.5,0,0,-3010118,0,0,-2434254.7,0,0,-3009146,0,0,951644.63,0,0,-7070.0355,0,0,1160252.2};
+VT(0.045331711,0.23557633,0,0.04727629,0.22823863,0,0.050960377,0.23252058,0){0,0,1270563.3,0,0,1418822.2,0,0,1342135.9,0,0,-3255008.9,0,0,-3492237.2,0,0,-3383651.2,0,0,3813331,0,0,3684627.2,0,0,3804738.6,0,0,-2700862,0,0,-1892328,0,0,-2403721.7,0,0,404484.48,0,0,-919608.01,0,0,-148681.88};
+VT(0.072044079,0.08604506,0,0.075872285,0.081656016,0,0.079265602,0.086677581,0){0,0,2688599.4,0,0,2427639,0,0,2114636.1,0,0,649473.83,0,0,758134.07,0,0,488789.06,0,0,-1882262.6,0,0,-1432759.9,0,0,-1512904.7,0,0,-2986497.2,0,0,-2638364.3,0,0,-2351470.6,0,0,-1825996.4,0,0,-2029677.1,0,0,-1382326.1};
+VT(0.084917502,0.034253561,0,0.092450683,0.030760689,0,0.092141527,0.03991184,0){0,0,1742331.8,0,0,900007.85,0,0,927649.93,0,0,1520580.8,0,0,807431.66,0,0,767955.56,0,0,1105294,0,0,631804.95,0,0,476054.53,0,0,549324.68,0,0,391202.83,0,0,102192.68,0,0,-76880.401,0,0,110124.82,0,0,-289378.9};
+VT(0.092295863,0.26000779,0,0.092520768,0.26920591,0,0.085115353,0.26563346,0){0,0,193329.27,0,0,145042.72,0,0,313056.52,0,0,-546576.12,0,0,-420173.4,0,0,-899063.8,0,0,805368.84,0,0,651988.34,0,0,1369900.4,0,0,-924990.4,0,0,-816598.86,0,0,-1665255.4,0,0,884724.5,0,0,896908.09,0,0,1747205.8};
+VT(0.059437672,0.2400817,0,0.056766116,0.23329497,0,0.064373335,0.2338171,0){0,0,1145348.7,0,0,1298096.4,0,0,1185902.3,0,0,-2999714,0,0,-3286228.7,0,0,-3010536.1,0,0,3711340.5,0,0,3735031.6,0,0,3446119.8,0,0,-3009146,0,0,-2434254.7,0,0,-2291596.2,0,0,1160252.2,0,0,-7070.0355,0,0,79206.699};
+VT(0.075978544,0.034466341,0,0.067616069,0.037109229,0,0.068707287,0.030314019,0){0,0,2615244.9,0,0,3239242.7,0,0,3188897.7,0,0,2278283.7,0,0,2756202.5,0,0,2870259.7,0,0,1647758.2,0,0,1862139.4,0,0,2264806.3,0,0,804880.96,0,0,690369.93,0,0,1433032.7,0,0,-142067.87,0,0,-584563.48,0,0,457746.25};
+VT(0.01062282,0.18656765,0,0.016878531,0.18478654,0,0.017373248,0.19021363,0){0,0,711483.53,0,0,1113458.1,0,0,1095255.9,0,0,-1243147.4,0,0,-1906862.4,0,0,-1990705.9,0,0,217509.34,0,0,245299.96,0,0,532263.7,0,0,1080570.1,0,0,1732097.5,0,0,1555631.8,0,0,-1025407.6,0,0,-1479759.2,0,0,-1804413.6};
+VT(0.013878694,0.17880836,0,0.016878531,0.18478654,0,0.01062282,0.18656765,0){0,0,971566.52,0,0,1113458.1,0,0,711483.53,0,0,-1548960.4,0,0,-1906862.4,0,0,-1243147.4,0,0,-51095.574,0,0,245299.96,0,0,217509.34,0,0,1579530,0,0,1732097.5,0,0,1080570.1,0,0,-887966.26,0,0,-1479759.2,0,0,-1025407.6};
+VT(0.069536278,0.26943087,0,0.068237016,0.26229006,0,0.076498673,0.26519709,0){0,0,505602.11,0,0,639705.29,0,0,473307.48,0,0,-1465439,0,0,-1820649,0,0,-1357765.2,0,0,2276404,0,0,2721368.6,0,0,2063933,0,0,-2856108.7,0,0,-3203243.1,0,0,-2499100.3,0,0,3145421.5,0,0,3191912.1,0,0,2605934.6};
+VT(0.059551151,0.20970619,0,0.053221516,0.20704838,0,0.060432552,0.20227914,0){0,0,1688112.8,0,0,1805672.4,0,0,1798951.1,0,0,-3664209.4,0,0,-3837129.3,0,0,-3671781.8,0,0,2601193.1,0,0,2511247.5,0,0,2023610.8,0,0,619333.89,0,0,1011998.4,0,0,1565241.8,0,0,-3326584.6,0,0,-3650194.7,0,0,-3653837};
+VT(0.066799394,0.09162077,0,0.072044079,0.08604506,0,0.07492972,0.092844339,0){0,0,2974160.1,0,0,2688599.4,0,0,2431427.6,0,0,440022.16,0,0,649473.83,0,0,308451.38,0,0,-2469083.6,0,0,-1882262.6,0,0,-2083891.4,0,0,-3274492.4,0,0,-2986497.2,0,0,-2656803.1,0,0,-1290097.2,0,0,-1825996.4,0,0,-910298.79};
+VT(0.0098751756,0.25600949,0,0.0071908097,0.26035264,0,0.0060491453,0.25298129,0){0,0,270470.11,0,0,179155.76,0,0,178654.23,0,0,-755004.71,0,0,-507033.49,0,0,-493529.07,0,0,1082095.4,0,0,748779.14,0,0,691183.17,0,0,-1183544.7,0,0,-863311.12,0,0,-724662.05,0,0,1038261.4,0,0,830950.48,0,0,585970.08};
+VT(0.077140734,0.17217741,0,0.083969261,0.16737329,0,0.085369203,0.17624497,0){0,0,1584233.7,0,0,1198489.7,0,0,1039089.6,0,0,-2313491.7,0,0,-1632158.2,0,0,-1603144.1,0,0,-519338.58,0,0,-607916.58,0,0,-168940.91,0,0,2552719.3,0,0,1852187.2,0,0,1695116.9,0,0,-655929.75,0,0,-62490.334,0,0,-751642.95};
+VT(0.041402067,0.22952626,0,0.04727629,0.22823863,0,0.045331711,0.23557633,0){0,0,1348916.4,0,0,1418822.2,0,0,1270563.3,0,0,-3344816,0,0,-3492237.2,0,0,-3255008.9,0,0,3600200.4,0,0,3684627.2,0,0,3813331,0,0,-1982154,0,0,-1892328,0,0,-2700862,0,0,-667743.82,0,0,-919608.01,0,0,404484.48};
+VT(0.0071147476,0.24137211,0,0.013821768,0.24617185,0,0.0087429334,0.24792416,0){0,0,259907.57,0,0,454053.45,0,0,283453.34,0,0,-684802.64,0,0,-1221678.8,0,0,-768118.62,0,0,859611.54,0,0,1611329.8,0,0,1029935.2,0,0,-720499.62,0,0,-1502439.1,0,0,-992967.39,0,0,317972.39,0,0,928515.88,0,0,667809.3};
+VT(0.007303543,0.20469543,0,0.0051799073,0.21317882,0,0,0.20714286,0){0,0,422375.13,0,0,276031.48,0,0,0,0,0,-880191.16,0,0,-615227.88,0,0,0,0,0,531663.92,0,0,479976.29,0,0,0,0,0,303952.91,0,0,25450.705,0,0,0,0,0,-861341.37,0,0,-511551.59,0,0,0};
+VT(0.052748817,0.036292023,0,0.054261983,0.029107824,0,0.060819012,0.031697917,0){0,0,3796611.1,0,0,3801269,0,0,3608360,0,0,3254886.9,0,0,3450822.2,0,0,3214477.8,0,0,2248728.5,0,0,2782228.4,0,0,2469695.4,0,0,921690.78,0,0,1857139.4,0,0,1455299.1,0,0,-537197.11,0,0,760852.59,0,0,281702.17};
+VT(0.064832361,0.062804408,0,0.070754378,0.060222618,0,0.072323403,0.067507008,0){0,0,3281120.4,0,0,2932444.5,0,0,2781512.1,0,0,1912310.8,0,0,1804303.3,0,0,1448400.9,0,0,-254314.65,0,0,-17984.254,0,0,-578922.09,0,0,-2314932.7,0,0,-1833384.6,0,0,-2328912.3,0,0,-3410309.6,0,0,-2943704.7,0,0,-2963263.7};
+VT(0.011197941,0.071439681,0,0.0060853536,0.074713803,0,0.0062494098,0.068021592,0){0,0,1244724.5,0,0,681675.12,0,0,709501.16,0,0,579995.21,0,0,285253.65,0,0,364477.97,0,0,-394493.66,0,0,-277070.48,0,0,-157824.6,0,0,-1158343.6,0,0,-678306.76,0,0,-603457.47,0,0,-1303869.8,0,0,-685312.86,0,0,-756039.79};
+VT(0.05288218,0.14757716,0,0.045364072,0.14896511,0,0.047918899,0.14257657,0){0,0,2767228.4,0,0,2729630.7,0,0,2842478.3,0,0,-2626819.9,0,0,-2670475.8,0,0,-2400971.6,0,0,-2900596.1,0,0,-2787568.3,0,0,-3215455,0,0,2479722.6,0,0,2610132.2,0,0,1901551.7,0,0,3026446,0,0,2844182.1,0,0,3510918.5};
+VT(0,0.18571429,0,0.0062925762,0.18063125,0,0.01062282,0.18656765,0){0,0,0,0,0,445914.92,0,0,711483.53,0,0,0,0,0,-727143.63,0,0,-1243147.4,0,0,0,0,0,12632.594,0,0,217509.34,0,0,0,0,0,719304.1,0,0,1080570.1,0,0,0,0,0,-466469.22,0,0,-1025407.6};
+VT(0.077140734,0.17217741,0,0.071841704,0.17726974,0,0.071059851,0.17209017,0){0,0,1584233.7,0,0,1799263.7,0,0,1900690.4,0,0,-2313491.7,0,0,-2812994.5,0,0,-2772233.4,0,0,-519338.58,0,0,-214389.53,0,0,-629520.98,0,0,2552719.3,0,0,2933842.6,0,0,3060958.1,0,0,-655929.75,0,0,-1438939.3,0,0,-774142.34};
+VT(0.066992124,0.20847551,0,0.06966854,0.20076802,0,0.075422073,0.20645372,0){0,0,1540360.8,0,0,1570520.4,0,0,1273700.5,0,0,-3311175.4,0,0,-3162888.4,0,0,-2693470,0,0,2266191.6,0,0,1636334.6,0,0,1728669,0,0,706070.36,0,0,1503948.1,0,0,766631.5,0,0,-3078419.5,0,0,-3161601.9,0,0,-2583646.6};
+VT(0.039157325,0.25334591,0,0.043027686,0.24899973,0,0.04563604,0.25694979,0){0,0,884627.38,0,0,999522.33,0,0,859240.08,0,0,-2446896,0,0,-2720190.5,0,0,-2406042.8,0,0,3436661.2,0,0,3683283.3,0,0,3472131.8,0,0,-3622356.9,0,0,-3620573.8,0,0,-3844488.4,0,0,2960330.2,0,0,2549278.8,0,0,3448330.3};
+VT(0.070175425,0.16144206,0,0.072573599,0.16764459,0,0.067098511,0.16826118,0){0,0,2074683.8,0,0,1881427.5,0,0,2121688.2,0,0,-2570674.4,0,0,-2572760.4,0,0,-2928224.5,0,0,-1460177,0,0,-936075.04,0,0,-1008555.7,0,0,2919916.2,0,0,2916777.1,0,0,3311710.7,0,0,762077.82,0,0,-135849.37,0,0,-250662.47};
+VT(0.014502412,0.16316663,0,0.014405512,0.17061143,0,0.0094805882,0.16707285,0){0,0,1121335,0,0,1063653,0,0,730151.01,0,0,-1429592.9,0,0,-1519257.6,0,0,-989834.58,0,0,-728363.13,0,0,-412907.51,0,0,-378084.11,0,0,1629901.1,0,0,1696192.6,0,0,1124284.7,0,0,280110.31,0,0,-313907.63,0,0,-22095.939};
+VT(0.060819012,0.031697917,0,0.057707972,0.025075094,0,0.064795861,0.023107998,0){0,0,3608360,0,0,3734947.8,0,0,3443592.1,0,0,3214477.8,0,0,3478918.2,0,0,3242943.8,0,0,2469695.4,0,0,2984396.6,0,0,2853338,0,0,1455299.1,0,0,2285289.9,0,0,2297494.4,0,0,281702.17,0,0,1429238.8,0,0,1607540.9};
+VT(0.01882241,0.070374011,0,0.012193394,0.066188359,0,0.016702178,0.061420197,0){0,0,2018056.9,0,0,1364188,0,0,1844408.3,0,0,970762.8,0,0,734639.92,0,0,1107331.1,0,0,-580354.6,0,0,-233939.49,0,0,-72241.295,0,0,-1830388.5,0,0,-1094586.7,0,0,-1222910.6,0,0,-2130853.3,0,0,-1450385,0,0,-1885264.1};
+VT(0.011197941,0.071439681,0,0.012193394,0.066188359,0,0.01882241,0.070374011,0){0,0,1244724.5,0,0,1364188,0,0,2018056.9,0,0,579995.21,0,0,734639.92,0,0,970762.8,0,0,-394493.66,0,0,-233939.49,0,0,-580354.6,0,0,-1158343.6,0,0,-1094586.7,0,0,-1830388.5,0,0,-1303869.8,0,0,-1450385,0,0,-2130853.3};
+VT(0.013132659,0.04767246,0,0.014691551,0.054118398,0,0.0094132111,0.052421332,0){0,0,1507774.2,0,0,1659245.8,0,0,1088603.4,0,0,1139737.5,0,0,1140472.1,0,0,768702.62,0,0,493500.09,0,0,265092.56,0,0,222919.17,0,0,-273193.01,0,0,-693242.8,0,0,-388347.22,0,0,-973395.4,0,0,-1435183.5,0,0,-885762.83};
+VT(0,0.14285714,0,0.0054758376,0.13911323,0,0.0078195435,0.14622426,0){0,0,0,0,0,495708.7,0,0,680366.1,0,0,0,0,0,-382921.42,0,0,-626541.18,0,0,0,0,0,-582869.54,0,0,-729870.69,0,0,0,0,0,250325.59,0,0,568744.13,0,0,0,0,0,639819.51,0,0,774663.29};
+VT(0.09071018,0.22887426,0,0.084319616,0.22565969,0,0.091864029,0.22106993,0){0,0,406264.77,0,0,696453.76,0,0,394005.54,0,0,-1003622.2,0,0,-1688204.7,0,0,-927852.61,0,0,1069446.3,0,0,1707540.6,0,0,863120.02,0,0,-568907.82,0,0,-743250.94,0,0,-241435.16,0,0,-233040.27,0,0,-649719.93,0,0,-536498.87};
+VT(0.033874053,0.071548869,0,0.037071258,0.0642048,0,0.041057987,0.068843254,0){0,0,3157862.8,0,0,3365311.2,0,0,3488848.8,0,0,1466537.3,0,0,1900443.5,0,0,1752771.3,0,0,-1010259.7,0,0,-391679.98,0,0,-855539,0,0,-2946084.6,0,0,-2513388.8,0,0,-3038218.5,0,0,-3304540.6,0,0,-3541461.8,0,0,-3709409.4};
+VT(0.07492972,0.092844339,0,0.069968451,0.098831219,0,0.066799394,0.09162077,0){0,0,2431427.6,0,0,2730411,0,0,2974160.1,0,0,308451.38,0,0,57648.531,0,0,440022.16,0,0,-2083891.4,0,0,-2671597.7,0,0,-2469083.6,0,0,-2656803.1,0,0,-2785714.6,0,0,-3274492.4,0,0,-910298.79,0,0,-173126.8,0,0,-1290097.2};
+VT(0,0.2,0,0.005051806,0.19767546,0,0.007303543,0.20469543,0){0,0,0,0,0,313084.45,0,0,422375.13,0,0,0,0,0,-612892.85,0,0,-880191.16,0,0,0,0,0,273796.53,0,0,531663.92,0,0,0,0,0,350786.74,0,0,303952.91,0,0,0,0,0,-609909.8,0,0,-861341.37};
+VT(0.04563604,0.25694979,0,0.049037582,0.25027532,0,0.054010827,0.25507988,0){0,0,859240.08,0,0,998508.07,0,0,897184.36,0,0,-2406042.8,0,0,-2730849.8,0,0,-2496661.6,0,0,3472131.8,0,0,3739350.2,0,0,3553831.7,0,0,-3844488.4,0,0,-3756698.7,0,0,-3839088.9,0,0,3448330.3,0,0,2778087.3,0,0,3290330.5};
+VT(0.084604507,0.15255901,0,0.083337094,0.16031526,0,0.077069107,0.15686929,0){0,0,1258841.2,0,0,1295652.6,0,0,1743907.9,0,0,-1326319,0,0,-1575018.8,0,0,-1994600,0,0,-1187789.9,0,0,-956036.82,0,0,-1457243.4,0,0,1390056.3,0,0,1781183.7,0,0,2204191.1,0,0,1113216.6,0,0,571788.58,0,0,1140253.2};
+VT(0.082709707,0.12855445,0,0.083559522,0.13424014,0,0.076271482,0.13373081,0){0,0,1568327.1,0,0,1462145.4,0,0,2012844.4,0,0,-869760.99,0,0,-981746.52,0,0,-1330317.6,0,0,-1955764.1,0,0,-1784737.2,0,0,-2463975.8,0,0,-1353.9511,0,0,395362.65,0,0,494859.01,0,0,1955094.7,0,0,1914407.3,0,0,2631758.9};
+VT(0.025468185,0.010276157,0,0.022427218,0.014872357,0,0.01808004,0.0081573173,0){0,0,2780034,0,0,2505875.7,0,0,2085729.2,0,0,2747892,0,0,2445229.8,0,0,2070583.9,0,0,2683968.5,0,0,2325397.7,0,0,2040406.9,0,0,2589008.8,0,0,2149288.4,0,0,1995444.2,0,0,2463902.9,0,0,1920956.8,0,0,1935913.6};
+VT(0.017990672,0.29207379,0,0.0220603,0.28602893,0,0.025130011,0.29009115,0){0,0,86228.122,0,0,181204.07,0,0,142877.47,0,0,-258100.45,0,0,-539738.59,0,0,-427099.39,0,0,428229.3,0,0,886739.53,0,0,706741.94,0,0,-595472.42,0,0,-1214791.9,0,0,-978805.55,0,0,758576.15,0,0,1516611.7,0,0,1240164.3};
+VT(0.076271482,0.13373081,0,0.081009521,0.1385969,0,0.075488644,0.14176328,0){0,0,2012844.4,0,0,1630909.4,0,0,1990888.2,0,0,-1330317.6,0,0,-1242340.3,0,0,-1647841.2,0,0,-2463975.8,0,0,-1926924,0,0,-2274843.7,0,0,494859.01,0,0,783271.16,0,0,1255935.2,0,0,2631758.9,0,0,2113542.9,0,0,2491166.6};
+VT(0.024008584,0.022367291,0,0.021348697,0.029751655,0,0.016759526,0.025876157,0){0,0,2639060.6,0,0,2382657.5,0,0,1932221.9,0,0,2494948.4,0,0,2153252.9,0,0,1791225.7,0,0,2214593.6,0,0,1716520.5,0,0,1519509.7,0,0,1813324.4,0,0,1114508.8,0,0,1136895.1,0,0,1312931.3,0,0,404958.41,0,0,671081.1};
+VT(0.020473685,0.087577432,0,0.025411973,0.082310594,0,0.027903545,0.087518505,0){0,0,2087024.2,0,0,2525130.6,0,0,2674848,0,0,451292.51,0,0,762374.09,0,0,580994.77,0,0,-1538224.3,0,0,-1532614.6,0,0,-1967676.8,0,0,-2322280.1,0,0,-2757779.1,0,0,-2976106,0,0,-1286407.6,0,0,-2058136.4,0,0,-1655065.1};
+VT(0.019499739,0.079597209,0,0.025411973,0.082310594,0,0.020473685,0.087577432,0){0,0,2040354.6,0,0,2525130.6,0,0,2087024.2,0,0,702945.71,0,0,762374.09,0,0,451292.51,0,0,-1095289.5,0,0,-1532614.6,0,0,-1538224.3,0,0,-2175701.2,0,0,-2757779.1,0,0,-2322280.1,0,0,-1830384.7,0,0,-2058136.4,0,0,-1286407.6};
+VT(0.039366597,0.19088868,0,0.044234359,0.18859393,0,0.043569257,0.19619451,0){0,0,1982365.2,0,0,2102462.5,0,0,1966078.6,0,0,-3628592.6,0,0,-3756018.8,0,0,-3794921.6,0,0,1030950.1,0,0,851571.98,0,0,1563901,0,0,2772526.5,0,0,3086402.5,0,0,2340412.7,0,0,-3333638.5,0,0,-3279385.1,0,0,-3741435.4};
+VT(0.042857143,0,0,0.039686874,0.0066116125,0,0.035714286,0,0){0,0,3783299.5,0,0,3676489.9,0,0,3496308.9,0,0,3783327.5,0,0,3658909.3,0,0,3496337.7,0,0,3783379.6,0,0,3623831.1,0,0,3496399.5,0,0,3783486.4,0,0,3571457.2,0,0,3496538.6,0,0,3783576.5,0,0,3501797.4,0,0,3496562.8};
+VT(0.035714286,0.3,0,0.03928574,0.29335694,0,0.042857143,0.3,0){0,0,0,0,0,127378.94,0,0,0,0,0,0,0,0,-381522.06,0,0,0,0,0,0,0,0,633829.06,0,0,0,0,0,0,0,0,-883092.25,0,0,0,0,0,0,0,0,1127859.7,0,0,0};
+VT(0.049165273,0.076760106,0,0.047307891,0.081963043,0,0.041803352,0.076750149,0){0,0,3570137.5,0,0,3516083,0,0,3453761.9,0,0,1384898,0,0,1080946.4,0,0,1340279.2,0,0,-1648055.9,0,0,-2102837.3,0,0,-1593440.1,0,0,-3672308.6,0,0,-3830300,0,0,-3552303.7,0,0,-3449021.3,0,0,-2905310.5,0,0,-3337911.6};
+VT(0.1,0.057142857,0,0.094913401,0.051076335,0,0.1,0.05,0){0,0,0,0,0,595503.05,0,0,0,0,0,0,0,0,429138.45,0,0,0,0,0,0,0,0,142901.48,0,0,0,0,0,0,0,0,-183223.65,0,0,0,0,0,0,0,0,-458373.75,0,0,0};
+VT(0.1,0.25,0,0.095090425,0.2489538,0,0.1,0.24285714,0){0,0,0,0,0,157454.16,0,0,0,0,0,0,0,0,-428416.46,0,0,0,0,0,0,0,0,579817.55,0,0,0,0,0,0,0,0,-569427.53,0,0,0,0,0,0,0,0,400020.01,0,0,0};
+VT(0.071428571,0,0,0.068476894,0.0069177029,0,0.064285714,0,0){0,0,3033974.4,0,0,3242851.4,0,0,3496327.6,0,0,3033978.9,0,0,3225849.8,0,0,3496358.5,0,0,3033982.8,0,0,3191931.3,0,0,3496415,0,0,3034008.5,0,0,3141298.2,0,0,3496523.2,0,0,3033714,0,0,3073847.6,0,0,3496472.9};
+VT(0.064285714,0.3,0,0.068366879,0.29272708,0,0.071428571,0.3,0){0,0,0,0,0,123803.43,0,0,0,0,0,0,0,0,-370697.46,0,0,0,0,0,0,0,0,615462.12,0,0,0,0,0,0,0,0,-856697.17,0,0,0,0,0,0,0,0,1092834.3,0,0,0};
+VT(0.057612168,0.01845715,0,0.057707972,0.025075094,0,0.051167355,0.022914381,0){0,0,3752599.8,0,0,3734947.8,0,0,3850137.8,0,0,3612875.5,0,0,3478918.2,0,0,3629520.4,0,0,3338613.5,0,0,2984396.6,0,0,3200919.1,0,0,2940029.2,0,0,2285289.9,0,0,2588908.3,0,0,2431782.4,0,0,1429238.8,0,0,1828396.4};
+VT(0.021658338,0.054940441,0,0.025221599,0.062165695,0,0.016702178,0.061420197,0){0,0,2341024.9,0,0,2618029.3,0,0,1844408.3,0,0,1587273.2,0,0,1547191.2,0,0,1107331.1,0,0,322446.89,0,0,-156575.4,0,0,-72241.295,0,0,-1046241,0,0,-1796512.5,0,0,-1222910.6,0,0,-2078353.5,0,0,-2702051.5,0,0,-1885264.1};
+VT(0.03663522,0.040674234,0,0.030602087,0.036163623,0,0.035858843,0.031497608,0){0,0,3463485.9,0,0,3125169.1,0,0,3456371.8,0,0,2844620.6,0,0,2682310.4,0,0,3083741.5,0,0,1717431.6,0,0,1859340.6,0,0,2378649.5,0,0,283267.24,0,0,772883.67,0,0,1417116.3,0,0,-1201989.6,0,0,-423255.99,0,0,302618.73};
+VT(0.054240748,0.10280037,0,0.052532368,0.096036702,0,0.061027247,0.098743066,0){0,0,3302360.6,0,0,3389506.1,0,0,3173016.6,0,0,-169115.68,0,0,240670.51,0,0,72008.811,0,0,-3462856.5,0,0,-3131818.5,0,0,-3099474,0,0,-3116478.2,0,0,-3594959.1,0,0,-3241975.4,0,0,505791.56,0,0,-718569.73,0,0,-216202.29};
+VT(0.030046638,0.13690443,0,0.033990129,0.14330646,0,0.026018946,0.14387862,0){0,0,2369378.2,0,0,2486957.5,0,0,2064539,0,0,-1721516.8,0,0,-2138608.5,0,0,-1800072.3,0,0,-2840145.3,0,0,-2786553.8,0,0,-2295230.1,0,0,944948.24,0,0,1748365.6,0,0,1506177.8,0,0,3098367.4,0,0,3031412.6,0,0,2488196.2};
+VT(0.054957014,0.24657048,0,0.060567191,0.25172758,0,0.054010827,0.25507988,0){0,0,1058545,0,0,917440.34,0,0,897184.36,0,0,-2852831,0,0,-2522838.3,0,0,-2496661.6,0,0,3777171.8,0,0,3497206.6,0,0,3553831.7,0,0,-3549694.2,0,0,-3596815.5,0,0,-3839088.9,0,0,2239441.1,0,0,2796536,0,0,3290330.5};
+VT(0.014305262,0.26641769,0,0.023009638,0.26878949,0,0.018422519,0.27450763,0){0,0,294901.31,0,0,417665.14,0,0,282501.19,0,0,-848621.76,0,0,-1208783.5,0,0,-827496.14,0,0,1298521.9,0,0,1871958.7,0,0,1313896,0,0,-1589572.3,0,0,-2337004.8,0,0,-1707268.8,0,0,1686004.5,0,0,2554445.3,0,0,1979556.1};
+VT(0.1,0.2,0,0.093164956,0.1980516,0,0.1,0.19285714,0){0,0,0,0,0,420734.09,0,0,0,0,0,0,0,0,-826537.04,0,0,0,0,0,0,0,0,376428.12,0,0,0,0,0,0,0,0,463603.83,0,0,0,0,0,0,0,0,-823893.15,0,0,0};
+VT(0.049204373,0.010884263,0,0.051745598,0.0053231545,0,0.056199026,0.010061392,0){0,0,3873084,0,0,3873250.9,0,0,3801979,0,0,3822842.7,0,0,3861228.9,0,0,3759859.9,0,0,3723003.5,0,0,3837214.6,0,0,3676084,0,0,3574883.8,0,0,3801308.2,0,0,3551608.2,0,0,3380124.5,0,0,3753417.7,0,0,3387596.5};
+VT(0.050010485,0.1548865,0,0.045364072,0.14896511,0,0.05288218,0.14757716,0){0,0,2672912.2,0,0,2729630.7,0,0,2767228.4,0,0,-2946373.7,0,0,-2670475.8,0,0,-2626819.9,0,0,-2371553.9,0,0,-2787568.3,0,0,-2900596.1,0,0,3189127.5,0,0,2610132.2,0,0,2479722.6,0,0,2045305.7,0,0,2844182.1,0,0,3026446};
+VT(0.055764419,0.28986395,0,0.051526128,0.29458598,0,0.048791783,0.28884593,0){0,0,202473.1,0,0,109871.78,0,0,226341.07,0,0,-605163.67,0,0,-329256.34,0,0,-675936.71,0,0,1001119.7,0,0,547568.39,0,0,1116322.7,0,0,-1385941.2,0,0,-764098.34,0,0,-1541505,0,0,1755276.4,0,0,977975.34,0,0,1945474.1};
+VT(0.083190767,0.25723975,0,0.074279052,0.25633166,0,0.07921504,0.25033934,0){0,0,434158.6,0,0,635900.39,0,0,606155.6,0,0,-1216864.4,0,0,-1777029.4,0,0,-1658203,0,0,1759626.8,0,0,2553015.8,0,0,2271843.6,0,0,-1955417.3,0,0,-2804423.5,0,0,-2284831,0,0,1765235.2,0,0,2479429.3,0,0,1693484.6};
+VT(0.077364239,0.048764008,0,0.073234584,0.04253025,0,0.082493405,0.042375289,0){0,0,2450679,0,0,2820532.7,0,0,1978611.8,0,0,1825420.5,0,0,2270240.9,0,0,1595319.9,0,0,734405.59,0,0,1277003.9,0,0,902966.17,0,0,-544039.45,0,0,34586.382,0,0,35643.43,0,0,-1683943.8,0,0,-1214797.7,0,0,-838916.97};
+VT(0.091953893,0.078440357,0,0.086276325,0.073599227,0,0.09123018,0.070922096,0){0,0,889726.23,0,0,1502743.3,0,0,983713.53,0,0,322434.75,0,0,653401.45,0,0,465586.72,0,0,-450550.32,0,0,-565297.67,0,0,-297764.17,0,0,-936443.15,0,0,-1464602.7,0,0,-904277.98,0,0,-825354.72,0,0,-1536324.4,0,0,-1034644.8};
+VT(0.041002292,0.08644635,0,0.033761495,0.088496681,0,0.032911969,0.081185013,0){0,0,3351345,0,0,3029395.9,0,0,3037931.3,0,0,787437.3,0,0,608605.12,0,0,971274.35,0,0,-2379027.1,0,0,-2298547.5,0,0,-1756226.8,0,0,-3725698.5,0,0,-3368980,0,0,-3289165.4,0,0,-2222336.9,0,0,-1747439.7,0,0,-2584916.3};
+VT(0.038843793,0.21103197,0,0.036840853,0.20596239,0,0.044637502,0.20577347,0){0,0,1637090.1,0,0,1679916.9,0,0,1811821.2,0,0,-3590120.4,0,0,-3538121.9,0,0,-3810004,0,0,2645890.8,0,0,2233718.4,0,0,2390091.8,0,0,433646.44,0,0,1067350,0,0,1174216.7,0,0,-3163532.2,0,0,-3414669.4,0,0,-3685779.4};
+VT(0.013794295,0.15422926,0,0.014502412,0.16316663,0,0.0068768393,0.16098373,0){0,0,1126466.2,0,0,1121335,0,0,553409.29,0,0,-1226232.2,0,0,-1429592.9,0,0,-680450.71,0,0,-1017954.8,0,0,-728363.13,0,0,-397156.36,0,0,1316565.7,0,0,1629901.1,0,0,771605.48,0,0,901352.54,0,0,280110.31,0,0,219690.78};
+VT(0.044637502,0.20577347,0,0.036840853,0.20596239,0,0.038597539,0.20095921,0){0,0,1811821.2,0,0,1679916.9,0,0,1801301.7,0,0,-3810004,0,0,-3538121.9,0,0,-3633864.6,0,0,2390091.8,0,0,2233718.4,0,0,1895634,0,0,1174216.7,0,0,1067350,0,0,1705394,0,0,-3685779.4,0,0,-3414669.4,0,0,-3630918.1};
+VT(0.056199026,0.010061392,0,0.051745598,0.0053231545,0,0.057142857,0,0){0,0,3801979,0,0,3873250.9,0,0,3783317.5,0,0,3759859.9,0,0,3861228.9,0,0,3783357,0,0,3676084,0,0,3837214.6,0,0,3783457.6,0,0,3551608.2,0,0,3801308.2,0,0,3783701.2,0,0,3387596.5,0,0,3753417.7,0,0,3783873.9};
+VT(0.057142857,0,0,0.06203594,0.0060944193,0,0.056199026,0.010061392,0){0,0,3783317.5,0,0,3604620.2,0,0,3801979,0,0,3783357,0,0,3589956.2,0,0,3759859.9,0,0,3783457.6,0,0,3560685.5,0,0,3676084,0,0,3783701.2,0,0,3516960.1,0,0,3551608.2,0,0,3783873.9,0,0,3458793.9,0,0,3387596.5};
+VT(0.049739958,0.088394034,0,0.047307891,0.081963043,0,0.054828578,0.081464579,0){0,0,3472240.4,0,0,3516083,0,0,3492382.6,0,0,703521.31,0,0,1080946.4,0,0,1101278.5,0,0,-2626240.1,0,0,-2102837.3,0,0,-2043909.2,0,0,-3862017.3,0,0,-3830300,0,0,-3789901.6,0,0,-2018648.2,0,0,-2905310.5,0,0,-2941538.5};
+VT(0.054828578,0.081464579,0,0.047307891,0.081963043,0,0.049165273,0.076760106,0){0,0,3492382.6,0,0,3516083,0,0,3570137.5,0,0,1101278.5,0,0,1080946.4,0,0,1384898,0,0,-2043909.2,0,0,-2102837.3,0,0,-1648055.9,0,0,-3789901.6,0,0,-3830300,0,0,-3672308.6,0,0,-2941538.5,0,0,-2905310.5,0,0,-3449021.3};
+VT(0.057142857,0.3,0,0.051526128,0.29458598,0,0.055764419,0.28986395,0){0,0,0,0,0,109871.78,0,0,202473.1,0,0,0,0,0,-329256.34,0,0,-605163.67,0,0,0,0,0,547568.39,0,0,1001119.7,0,0,0,0,0,-764098.34,0,0,-1385941.2,0,0,0,0,0,977975.34,0,0,1755276.4};
+VT(0.055764419,0.28986395,0,0.061805884,0.29356168,0,0.057142857,0.3,0){0,0,202473.1,0,0,121923.05,0,0,0,0,0,-605163.67,0,0,-365207.83,0,0,0,0,0,1001119.7,0,0,606815.62,0,0,0,0,0,-1385941.2,0,0,-845641.09,0,0,0,0,0,1755276.4,0,0,1080583.1,0,0,0};
+VT(0.089949388,0.2453858,0,0.095090425,0.2489538,0,0.090077759,0.25268961,0){0,0,339950.36,0,0,157454.16,0,0,291813.61,0,0,-911669.73,0,0,-428416.46,0,0,-805257.31,0,0,1193275.4,0,0,579817.55,0,0,1125037.4,0,0,-1095139.7,0,0,-569427.53,0,0,-1174248.1,0,0,648419.14,0,0,400020.01,0,0,940920.06};
+VT(0.08974924,0.047235181,0,0.094913401,0.051076335,0,0.08944657,0.05485846,0){0,0,1190814.4,0,0,595503.05,0,0,1211526.2,0,0,905328.07,0,0,429138.45,0,0,822600.19,0,0,402804.56,0,0,142901.48,0,0,169573.91,0,0,-196265.4,0,0,-183223.65,0,0,-537958.1,0,0,-748421.11,0,0,-458373.75,0,0,-1073022.7};
+VT(0.012304267,0.13852123,0,0.014210915,0.13228117,0,0.021167753,0.13548502,0){0,0,1094693.2,0,0,1289449.4,0,0,1816935.7,0,0,-832176.34,0,0,-813665.75,0,0,-1266652.3,0,0,-1294374.3,0,0,-1589638.3,0,0,-2200669.4,0,0,521821.54,0,0,227067.92,0,0,600161.11,0,0,1419655.5,0,0,1673024.3,0,0,2382629.9};
+VT(0.021167753,0.13548502,0,0.014210915,0.13228117,0,0.01788586,0.12850833,0){0,0,1816935.7,0,0,1289449.4,0,0,1616906.9,0,0,-1266652.3,0,0,-813665.75,0,0,-895214.81,0,0,-2200669.4,0,0,-1589638.3,0,0,-2016472.2,0,0,600161.11,0,0,227067.92,0,0,-4802.2192,0,0,2382629.9,0,0,1673024.3,0,0,2014144.7};
+VT(0.045375723,0.12284566,0,0.045894811,0.13135905,0,0.038464606,0.12667013,0){0,0,3072436,0,0,2973475.7,0,0,2859316.3,0,0,-1348503.3,0,0,-1819976.4,0,0,-1476046.2,0,0,-3829159.4,0,0,-3679581.9,0,0,-3573486.5,0,0,-800055.99,0,0,392676.16,0,0,-252868.56,0,0,3380414.3,0,0,3832095.1,0,0,3451249.3};
+VT(0.038464606,0.12667013,0,0.045894811,0.13135905,0,0.038217426,0.13599196,0){0,0,2859316.3,0,0,2973475.7,0,0,2738753.8,0,0,-1476046.2,0,0,-1819976.4,0,0,-1938161,0,0,-3573486.5,0,0,-3679581.9,0,0,-3305386.1,0,0,-252868.56,0,0,392676.16,0,0,972060.89,0,0,3451249.3,0,0,3832095.1,0,0,3589652.3};
+VT(0.0087429334,0.24792416,0,0.013821768,0.24617185,0,0.01180171,0.25230222,0){0,0,283453.34,0,0,454053.45,0,0,347512.04,0,0,-768118.62,0,0,-1221678.8,0,0,-957611.77,0,0,1029935.2,0,0,1611329.8,0,0,1333704.3,0,0,-992967.39,0,0,-1502439.1,0,0,-1383899.6,0,0,667809.3,0,0,928515.88,0,0,1095718.6};
+VT(0.025139549,0.12057635,0,0.023379755,0.12686903,0,0.017763535,0.12074209,0){0,0,2224740.3,0,0,2047772.9,0,0,1657769.5,0,0,-875333.98,0,0,-1065433.1,0,0,-657738.05,0,0,-2755721.9,0,0,-2558991,0,0,-2054600.3,0,0,-796179.51,0,0,-162203.53,0,0,-581651.26,0,0,2272644.8,0,0,2481221.5,0,0,1703675.4};
+VT(0.1,0.1,0,0.09416017,0.099511923,0,0.1,0.092857143,0){0,0,0,0,0,613994.66,0,0,0,0,0,0,0,0,5422.3845,0,0,0,0,0,0,0,0,-608645.22,0,0,0,0,0,0,0,0,-619557.01,0,0,0,0,0,0,0,0,-16415.987,0,0,0};
+VT(0.061015306,0.048529238,0,0.06961584,0.048915995,0,0.066012722,0.055502179,0){0,0,3533367.8,0,0,3063466,0,0,3257272.9,0,0,2640342.3,0,0,2277085.6,0,0,2187557.2,0,0,1080012.2,0,0,906160.93,0,0,399401.17,0,0,-753291.7,0,0,-697426.19,0,0,-1519988.7,0,0,-2396723.8,0,0,-2122325.6,0,0,-2940625.1};
+VT(0.066401409,0.0434645,0,0.06961584,0.048915995,0,0.061015306,0.048529238,0){0,0,3289675.8,0,0,3063466,0,0,3533367.8,0,0,2619840.6,0,0,2277085.6,0,0,2640342.3,0,0,1416557.6,0,0,906160.93,0,0,1080012.2,0,0,-75156.319,0,0,-697426.19,0,0,-753291.7,0,0,-1551772,0,0,-2122325.6,0,0,-2396723.8};
+VT(0.051703203,0.27754162,0,0.055001581,0.27169863,0,0.059078636,0.27701937,0){0,0,454636.43,0,0,565900.8,0,0,447007.97,0,0,-1338881.7,0,0,-1648356.5,0,0,-1315269.1,0,0,2149437.1,0,0,2587095.5,0,0,2107766.2,0,0,-2841702,0,0,-3300283.2,0,0,-2778864.5,0,0,3377384.9,0,0,3725567.5,0,0,3289755.3};
+VT(0.036308441,0.24745658,0,0.033025927,0.25326882,0,0.029124573,0.24658198,0){0,0,958174.94,0,0,809560.38,0,0,849052.23,0,0,-2591684.5,0,0,-2238649.8,0,0,-2288340.2,0,0,3460190.4,0,0,3142273.3,0,0,3030093.5,0,0,-3307339.6,0,0,-3308331.9,0,0,-2848204.4,0,0,2177878.8,0,0,2697705.3,0,0,1797881.3};
+VT(0.020636298,0.17424253,0,0.025851591,0.17077962,0,0.027644767,0.17736901,0){0,0,1433869.3,0,0,1763476.8,0,0,1774040.3,0,0,-2154082.5,0,0,-2524912.6,0,0,-2777088.7,0,0,-351921.61,0,0,-673288.62,0,0,-203929.31,0,0,2330929.4,0,0,2815714.9,0,0,2892544.7,0,0,-819073.82,0,0,-542697.73,0,0,-1431643.3};
+VT(0.1,0.092857143,0,0.09416017,0.099511923,0,0.093922759,0.092262381,0){0,0,0,0,0,613994.66,0,0,652083.63,0,0,0,0,0,5422.3845,0,0,89312.894,0,0,0,0,0,-608645.22,0,0,-550573,0,0,0,0,0,-619557.01,0,0,-715327.2,0,0,0,0,0,-16415.987,0,0,-262838.8};
+VT(0.084604507,0.15255901,0,0.088623123,0.15812222,0,0.083337094,0.16031526,0){0,0,1258841.2,0,0,918302.92,0,0,1295652.6,0,0,-1326319,0,0,-1074338,0,0,-1575018.8,0,0,-1187789.9,0,0,-735787.48,0,0,-956036.82,0,0,1390056.3,0,0,1199414.9,0,0,1781183.7,0,0,1113216.6,0,0,531983.03,0,0,571788.58};
+VT(0.017312959,0.14496605,0,0.022775714,0.15147437,0,0.013794295,0.15422926,0){0,0,1456929,0,0,1786181.8,0,0,1126466.2,0,0,-1303417.8,0,0,-1841345.2,0,0,-1226232.2,0,0,-1594293.7,0,0,-1729359.8,0,0,-1017954.8,0,0,1135517.7,0,0,1894858,0,0,1316565.7,0,0,1713822.2,0,0,1670732.8,0,0,901352.54};
+VT(0.057391395,0.19462543,0,0.064671223,0.19505087,0,0.060432552,0.20227914,0){0,0,1979510.6,0,0,1815232.4,0,0,1798951.1,0,0,-3763012.6,0,0,-3465163,0,0,-3671781.8,0,0,1410875.8,0,0,1334352.3,0,0,2023610.8,0,0,2491970.2,0,0,2252470.6,0,0,1565241.8,0,0,-3656419.8,0,0,-3382100.5,0,0,-3653837};
+VT(0,0.057142857,0,0.0079950318,0.059686314,0,0,0.064285714,0){0,0,0,0,0,917766.47,0,0,0,0,0,0,0,0,570756.35,0,0,0,0,0,0,0,0,7912.4367,0,0,0,0,0,0,0,0,-557994.72,0,0,0,0,0,0,0,0,-913265.38,0,0,0};
+VT(0.1,0.20714286,0,0.093706234,0.20596864,0,0.1,0.2,0){0,0,0,0,0,360320.46,0,0,0,0,0,0,0,0,-758974.46,0,0,0,0,0,0,0,0,479351.87,0,0,0,0,0,0,0,0,228803.73,0,0,0,0,0,0,0,0,-732939.79,0,0,0};
+VT(0.1,0.021428571,0,0.093571257,0.018380777,0,0.1,0.014285714,0){0,0,0,0,0,774815.13,0,0,0,0,0,0,0,0,746204.54,0,0,0,0,0,0,0,0,690036.86,0,0,0,0,0,0,0,0,608388.09,0,0,0,0,0,0,0,0,504051.02,0,0,0};
+VT(0.1,0.28571429,0,0.093593186,0.28160993,0,0.1,0.27857143,0){0,0,0,0,0,74588.283,0,0,0,0,0,0,0,0,-221009.65,0,0,0,0,0,0,0,0,359269.18,0,0,0,0,0,0,0,0,-484261.41,0,0,0,0,0,0,0,0,591230.88,0,0,0};
+VT(0.042155309,0.15589067,0,0.045364072,0.14896511,0,0.050010485,0.1548865,0){0,0,2577776.2,0,0,2729630.7,0,0,2672912.2,0,0,-2895603.6,0,0,-2670475.8,0,0,-2946373.7,0,0,-2220826.4,0,0,-2787568.3,0,0,-2371553.9,0,0,3169529.7,0,0,2610132.2,0,0,3189127.5,0,0,1830012,0,0,2844182.1,0,0,2045305.7};
+VT(0.059078636,0.27701937,0,0.055001581,0.27169863,0,0.061631884,0.26868773,0){0,0,447007.97,0,0,565900.8,0,0,591535.29,0,0,-1315269.1,0,0,-1648356.5,0,0,-1711593.4,0,0,2107766.2,0,0,2587095.5,0,0,2649353.2,0,0,-2778864.5,0,0,-3300283.2,0,0,-3304968.8,0,0,3289755.3,0,0,3725567.5,0,0,3608394.3};
+VT(0.024044461,0.20382537,0,0.015977634,0.20443356,0,0.018704911,0.19716585,0){0,0,1283805.9,0,0,895779.15,0,0,1103230.1,0,0,-2655634.7,0,0,-1862602.8,0,0,-2149261.2,0,0,1553893.8,0,0,1114548.4,0,0,934589.13,0,0,995311.88,0,0,659707.69,0,0,1263201.6,0,0,-2617892.2,0,0,-1827076.9,0,0,-2132672.2};
+VT(0.045416206,0.061541227,0,0.037071258,0.0642048,0,0.038435934,0.058364632,0){0,0,3642820.9,0,0,3365311.2,0,0,3459248.5,0,0,2181474.8,0,0,1900443.5,0,0,2206750.4,0,0,-155055.51,0,0,-391679.98,0,0,155241.86,0,0,-2429600.5,0,0,-2513388.8,0,0,-1952496,0,0,-3730025.8,0,0,-3541461.8,0,0,-3353689.4};
+VT(0.092195724,0.16853594,0,0.083969261,0.16737329,0,0.088381846,0.16289419,0){0,0,598378.34,0,0,1198489.7,0,0,911153.68,0,0,-829189.07,0,0,-1632158.2,0,0,-1156470.7,0,0,-278570.16,0,0,-607916.58,0,0,-599768.12,0,0,936666.51,0,0,1852187.2,0,0,1317920.1,0,0,-82641.6,0,0,-62490.334,0,0,244888.24};
+VT(0.067098511,0.16826118,0,0.072573599,0.16764459,0,0.071059851,0.17209017,0){0,0,2121688.2,0,0,1881427.5,0,0,1900690.4,0,0,-2928224.5,0,0,-2572760.4,0,0,-2772233.4,0,0,-1008555.7,0,0,-936075.04,0,0,-629520.98,0,0,3311710.7,0,0,2916777.1,0,0,3060958.1,0,0,-250662.47,0,0,-135849.37,0,0,-774142.34};
+VT(0.05718895,0.22161738,0,0.053624899,0.22742186,0,0.049797208,0.2214244,0){0,0,1508977,0,0,1430137,0,0,1551864.2,0,0,-3566099.1,0,0,-3503302.1,0,0,-3662861.4,0,0,3352547.9,0,0,3648370.9,0,0,3430735.4,0,0,-1004251.2,0,0,-1785483,0,0,-1003918.8,0,0,-1983866.6,0,0,-1060301.4,0,0,-2065424.5};
+VT(0.085714286,0,0,0.081119523,0.0085521597,0,0.078571429,0,0){0,0,1683752,0,0,2167108.8,0,0,2419478.6,0,0,1683802.7,0,0,2149779.2,0,0,2419535.2,0,0,1683911.1,0,0,2115263.6,0,0,2419645.1,0,0,1684108.7,0,0,2063869.7,0,0,2419827.2,0,0,1684003.7,0,0,1995657.9,0,0,2420024.4};
+VT(0.078571429,0.3,0,0.081165886,0.29137431,0,0.085714286,0.3,0){0,0,0,0,0,97729.953,0,0,0,0,0,0,0,0,-292395.17,0,0,0,0,0,0,0,0,484687.71,0,0,0,0,0,0,0,0,-673055.06,0,0,0,0,0,0,0,0,855744.16,0,0,0};
+VT(0.082709707,0.12855445,0,0.087905667,0.12517971,0,0.0910478,0.13167545,0){0,0,1568327.1,0,0,1140990.9,0,0,831136.87,0,0,-869760.99,0,0,-554517.87,0,0,-514132.23,0,0,-1955764.1,0,0,-1425990.8,0,0,-1027305.8,0,0,-1353.9511,0,0,-178453.87,0,0,122313.64,0,0,1955094.7,0,0,1334087.8,0,0,1073956.7};
+VT(0,0.20714286,0,0.0051799073,0.21317882,0,0,0.21428571,0){0,0,0,0,0,276031.48,0,0,0,0,0,0,0,0,-615227.88,0,0,0,0,0,0,0,0,479976.29,0,0,0,0,0,0,0,0,25450.705,0,0,0,0,0,0,0,0,-511551.59,0,0,0};
+VT(0.018704911,0.19716585,0,0.012931293,0.19295437,0,0.017373248,0.19021363,0){0,0,1103230.1,0,0,815194.79,0,0,1095255.9,0,0,-2149261.2,0,0,-1524077.7,0,0,-1990705.9,0,0,934589.13,0,0,510133.92,0,0,532263.7,0,0,1263201.6,0,0,1080471.8,0,0,1555631.8,0,0,-2132672.2,0,0,-1450076.4,0,0,-1804413.6};
+VT(0.011268327,0.1984065,0,0.012931293,0.19295437,0,0.018704911,0.19716585,0){0,0,682302.12,0,0,815194.79,0,0,1103230.1,0,0,-1344805.9,0,0,-1524077.7,0,0,-2149261.2,0,0,623458.07,0,0,510133.92,0,0,934589.13,0,0,739532.85,0,0,1080471.8,0,0,1263201.6,0,0,-1341727.7,0,0,-1450076.4,0,0,-2132672.2};
+VT(0.1,0.26428571,0,0.092295863,0.26000779,0,0.1,0.25714286,0){0,0,0,0,0,193329.27,0,0,0,0,0,0,0,0,-546576.12,0,0,0,0,0,0,0,0,805368.84,0,0,0,0,0,0,0,0,-924990.4,0,0,0,0,0,0,0,0,884724.5,0,0,0};
+VT(0.1,0.042857143,0,0.092141527,0.03991184,0,0.1,0.035714286,0){0,0,0,0,0,927649.93,0,0,0,0,0,0,0,0,767955.56,0,0,0,0,0,0,0,0,476054.53,0,0,0,0,0,0,0,0,102192.68,0,0,0,0,0,0,0,0,-289378.9,0,0,0};
+VT(0.1,0.17857143,0,0.093873231,0.17693503,0,0.1,0.17142857,0){0,0,0,0,0,445896.9,0,0,0,0,0,0,0,0,-694096.79,0,0,0,0,0,0,0,0,-59504.029,0,0,0,0,0,0,0,0,727141.13,0,0,0,0,0,0,0,0,-345394.37,0,0,0};
+VT(0.069002793,0.22246209,0,0.065627137,0.22734606,0,0.062992669,0.22303634,0){0,0,1267491.2,0,0,1270705.1,0,0,1396775.9,0,0,-3011719.2,0,0,-3111357.1,0,0,-3331109.7,0,0,2877058.6,0,0,3236198.8,0,0,3216330,0,0,-947533.34,0,0,-1576358.2,0,0,-1122974.8,0,0,-1573376.1,0,0,-953054.66,0,0,-1661551.4};
+VT(0.03690243,0.09394169,0,0.033761495,0.088496681,0,0.041002292,0.08644635,0){0,0,3135041.5,0,0,3029395.9,0,0,3351345,0,0,337961.95,0,0,608605.12,0,0,787437.3,0,0,-2760700,0,0,-2298547.5,0,0,-2379027.1,0,0,-3396384.7,0,0,-3368980,0,0,-3725698.5,0,0,-1002139.6,0,0,-1747439.7,0,0,-2222336.9};
+VT(0.021957304,0.26060316,0,0.023009638,0.26878949,0,0.014305262,0.26641769,0){0,0,505833.44,0,0,417665.14,0,0,294901.31,0,0,-1432636.8,0,0,-1208783.5,0,0,-848621.76,0,0,2119105.6,0,0,1871958.7,0,0,1298521.9,0,0,-2450095.8,0,0,-2337004.8,0,0,-1589572.3,0,0,2369995.8,0,0,2554445.3,0,0,1686004.5};
+VT(0.071428571,0,0,0.074656208,0.0053403125,0,0.068476894,0.0069177029,0){0,0,3033974.4,0,0,2772385.5,0,0,3242851.4,0,0,3033978.9,0,0,2763721.5,0,0,3225849.8,0,0,3033982.8,0,0,2746414.1,0,0,3191931.3,0,0,3034008.5,0,0,2720533.7,0,0,3141298.2,0,0,3033714,0,0,2685936.9,0,0,3073847.6};
+VT(0.042433189,0.024814669,0,0.035858843,0.031497608,0,0.033039341,0.023173825,0){0,0,3739739.8,0,0,3456371.8,0,0,3318087.9,0,0,3488658.7,0,0,3083741.5,0,0,3123656.1,0,0,3003356.3,0,0,2378649.5,0,0,2746181,0,0,2316430.4,0,0,1417116.3,0,0,2207795.9,0,0,1473602,0,0,302618.73,0,0,1539940.3};
+VT(0.033039341,0.023173825,0,0.035858843,0.031497608,0,0.028359285,0.029784535,0){0,0,3318087.9,0,0,3456371.8,0,0,2981166.2,0,0,3123656.1,0,0,3083741.5,0,0,2693525.9,0,0,2746181,0,0,2378649.5,0,0,2145980.7,0,0,2207795.9,0,0,1417116.3,0,0,1391347.7,0,0,1539940.3,0,0,302618.73,0,0,502245.34};
+VT(0.069002793,0.22246209,0,0.062992669,0.22303634,0,0.063265205,0.21633109,0){0,0,1267491.2,0,0,1396775.9,0,0,1505335.5,0,0,-3011719.2,0,0,-3331109.7,0,0,-3432481.9,0,0,2877058.6,0,0,3216330,0,0,2888962.8,0,0,-947533.34,0,0,-1122974.8,0,0,-265885.87,0,0,-1573376.1,0,0,-1661551.4,0,0,-2549234.8};
+VT(0.068366879,0.29272708,0,0.074657371,0.29452352,0,0.071428571,0.3,0){0,0,123803.43,0,0,79525.554,0,0,0,0,0,-370697.46,0,0,-238312.39,0,0,0,0,0,615462.12,0,0,396309.36,0,0,0,0,0,-856697.17,0,0,-552992.95,0,0,0,0,0,1092834.3,0,0,707611.71,0,0,0};
+VT(0.029124573,0.24658198,0,0.033025927,0.25326882,0,0.025641665,0.25311603,0){0,0,849052.23,0,0,809560.38,0,0,680173.91,0,0,-2288340.2,0,0,-2238649.8,0,0,-1879847.5,0,0,3030093.5,0,0,3142273.3,0,0,2635470.4,0,0,-2848204.4,0,0,-3308331.9,0,0,-2768550.2,0,0,1797881.3,0,0,2697705.3,0,0,2247361.6};
+VT(0.091593501,0.1915477,0,0.095453592,0.18738967,0,0.1,0.19285714,0){0,0,544831.72,0,0,307137.29,0,0,0,0,0,-1004107.1,0,0,-541566.85,0,0,0,0,0,301623.68,0,0,106216.39,0,0,0,0,0,749822.54,0,0,460538.95,0,0,0,0,0,-933881.71,0,0,-458087.35,0,0,0};
+VT(0.091593501,0.1915477,0,0.087008075,0.19596841,0,0.084368038,0.19048099,0){0,0,544831.72,0,0,798107.94,0,0,992852.93,0,0,-1004107.1,0,0,-1537171.7,0,0,-1809621.2,0,0,301623.68,0,0,625323.3,0,0,495817.1,0,0,749822.54,0,0,958187.81,0,0,1401810.9,0,0,-933881.71,0,0,-1512909.8,0,0,-1649308.4};
+VT(0.021251228,0.18136297,0,0.027644767,0.17736901,0,0.027249449,0.18607819,0){0,0,1398279.8,0,0,1774040.3,0,0,1646413.8,0,0,-2300353.4,0,0,-2777088.7,0,0,-2861109.6,0,0,85724.805,0,0,-203929.31,0,0,464444.42,0,0,2245163.6,0,0,2892544.7,0,0,2518610.9,0,0,-1534338.6,0,0,-1431643.3,0,0,-2323177.4};
+VT(0.027249449,0.18607819,0,0.027644767,0.17736901,0,0.03345202,0.18222482,0){0,0,1646413.8,0,0,1774040.3,0,0,1947746.5,0,0,-2861109.6,0,0,-2777088.7,0,0,-3237509.5,0,0,464444.42,0,0,-203929.31,0,0,196057.01,0,0,2518610.9,0,0,2892544.7,0,0,3107788.7,0,0,-2323177.4,0,0,-1431643.3,0,0,-2254322.8};
+VT(0.030466665,0.11568191,0,0.023213665,0.1150537,0,0.025770754,0.10718168,0){0,0,2608170,0,0,2130593.3,0,0,2378738.7,0,0,-773675.45,0,0,-605772.32,0,0,-316264.13,0,0,-3152461.4,0,0,-2564157.8,0,0,-2653040.8,0,0,-1443702.3,0,0,-1229375.9,0,0,-1984140.6,0,0,2136967.4,0,0,1684092.7,0,0,932667.69};
+VT(0.028678488,0.042143634,0,0.025565101,0.048609543,0,0.022876349,0.043626948,0){0,0,2968313.4,0,0,2702312,0,0,2488553.5,0,0,2399521.8,0,0,2017092.5,0,0,1978130.3,0,0,1370917.4,0,0,820389.33,0,0,1061959.9,0,0,79587.615,0,0,-584372.75,0,0,-72059.632,0,0,-1227272.3,0,0,-1841258.2,0,0,-1191549.5};
+VT(0.032229878,0.047894836,0,0.025565101,0.048609543,0,0.028678488,0.042143634,0){0,0,3188476.9,0,0,2702312,0,0,2968313.4,0,0,2403076.1,0,0,2017092.5,0,0,2399521.8,0,0,1025710.6,0,0,820389.33,0,0,1370917.4,0,0,-604377.64,0,0,-584372.75,0,0,79587.615,0,0,-2086050.7,0,0,-1841258.2,0,0,-1227272.3};
+VT(0.091864029,0.22106993,0,0.084319616,0.22565969,0,0.082942949,0.21818591,0){0,0,394005.54,0,0,696453.76,0,0,823054.75,0,0,-927852.61,0,0,-1688204.7,0,0,-1901094.8,0,0,863120.02,0,0,1707540.6,0,0,1667014.3,0,0,-241435.16,0,0,-743250.94,0,0,-282341.7,0,0,-536498.87,0,0,-649719.93,0,0,-1297502.9};
+VT(0.023478597,0.036718106,0,0.017433092,0.042090914,0,0.014137494,0.034012185,0){0,0,2561783.8,0,0,1971771.3,0,0,1641076.4,0,0,2187675.4,0,0,1594855,0,0,1435142,0,0,1494080.3,0,0,913057.13,0,0,1049094.4,0,0,582277.59,0,0,56690.05,0,0,531342.12,0,0,-414804.14,0,0,-810753.02,0,0,-53364.585};
+VT(0.013794295,0.15422926,0,0.022775714,0.15147437,0,0.021502186,0.15931359,0){0,0,1126466.2,0,0,1786181.8,0,0,1630158.4,0,0,-1226232.2,0,0,-1841345.2,0,0,-1947614.2,0,0,-1017954.8,0,0,-1729359.8,0,0,-1250943.8,0,0,1316565.7,0,0,1894858,0,0,2191316.6,0,0,901352.54,0,0,1670732.8,0,0,824223.66};
+VT(0.020473685,0.087577432,0,0.019165757,0.095107709,0,0.013428016,0.091778472,0){0,0,2087024.2,0,0,1930971.9,0,0,1408980.1,0,0,451292.51,0,0,168744.63,0,0,204626.15,0,0,-1538224.3,0,0,-1747493.7,0,0,-1174648.8,0,0,-2322280.1,0,0,-2069009.1,0,0,-1549888.7,0,0,-1286407.6,0,0,-502664.26,0,0,-600683.83};
+VT(0.06137482,0.19024807,0,0.064671223,0.19505087,0,0.057391395,0.19462543,0){0,0,1976038.9,0,0,1815232.4,0,0,1979510.6,0,0,-3592882,0,0,-3465163,0,0,-3763012.6,0,0,963745.22,0,0,1334352.3,0,0,1410875.8,0,0,2804392.5,0,0,2252470.6,0,0,2491970.2,0,0,-3258719.1,0,0,-3382100.5,0,0,-3656419.8};
+VT(0.038217426,0.13599196,0,0.033990129,0.14330646,0,0.030046638,0.13690443,0){0,0,2738753.8,0,0,2486957.5,0,0,2369378.2,0,0,-1938161,0,0,-2138608.5,0,0,-1721516.8,0,0,-3305386.1,0,0,-2786553.8,0,0,-2840145.3,0,0,972060.89,0,0,1748365.6,0,0,944948.24,0,0,3589652.3,0,0,3031412.6,0,0,3098367.4};
+VT(0,0.12142857,0,0.0062042788,0.11791514,0,0.0061411468,0.1246533,0){0,0,0,0,0,612847.32,0,0,591118.91,0,0,0,0,0,-208741.13,0,0,-280990.71,0,0,0,0,0,-750565.55,0,0,-738586.84,0,0,0,0,0,-286207.66,0,0,-106527.54,0,0,0,0,0,561848.67,0,0,682629.18};
+VT(0.0078195435,0.14622426,0,0.0054758376,0.13911323,0,0.012304267,0.13852123,0){0,0,680366.1,0,0,495708.7,0,0,1094693.2,0,0,-626541.18,0,0,-382921.42,0,0,-832176.34,0,0,-729870.69,0,0,-582869.54,0,0,-1294374.3,0,0,568744.13,0,0,250325.59,0,0,521821.54,0,0,774663.29,0,0,639819.51,0,0,1419655.5};
+VT(0.082390534,0.079333541,0,0.086276325,0.073599227,0,0.091953893,0.078440357,0){0,0,1865676.5,0,0,1502743.3,0,0,889726.23,0,0,650380.91,0,0,653401.45,0,0,322434.75,0,0,-988603.29,0,0,-565297.67,0,0,-450550.32,0,0,-1983689.6,0,0,-1464602.7,0,0,-936443.15,0,0,-1686881.4,0,0,-1536324.4,0,0,-825354.72};
+VT(0.038084092,0.1145524,0,0.040442009,0.11996282,0,0.035619257,0.12028764,0){0,0,2981407.2,0,0,2999410,0,0,2821397.9,0,0,-818508.93,0,0,-1143461.2,0,0,-1093830.4,0,0,-3575257.7,0,0,-3706983.7,0,0,-3491178.8,0,0,-1775238,0,0,-1150363.3,0,0,-1043884.2,0,0,2287308.3,0,0,2995190.5,0,0,2851838.9};
+VT(0.027644767,0.17736901,0,0.025851591,0.17077962,0,0.030623168,0.1713445,0){0,0,1774040.3,0,0,1763476.8,0,0,1985985.4,0,0,-2777088.7,0,0,-2524912.6,0,0,-2866418.8,0,0,-203929.31,0,0,-673288.62,0,0,-715248.18,0,0,2892544.7,0,0,2815714.9,0,0,3183566.3,0,0,-1431643.3,0,0,-542697.73,0,0,-696442.05};
+VT(0.025139549,0.12057635,0,0.023213665,0.1150537,0,0.030466665,0.11568191,0){0,0,2224740.3,0,0,2130593.3,0,0,2608170,0,0,-875333.98,0,0,-605772.32,0,0,-773675.45,0,0,-2755721.9,0,0,-2564157.8,0,0,-3152461.4,0,0,-796179.51,0,0,-1229375.9,0,0,-1443702.3,0,0,2272644.8,0,0,1684092.7,0,0,2136967.4};
+VT(0.08682376,0.20181233,0,0.087008075,0.19596841,0,0.093164956,0.1980516,0){0,0,767576.83,0,0,798107.94,0,0,420734.09,0,0,-1560255.4,0,0,-1537171.7,0,0,-826537.04,0,0,843726.65,0,0,625323.3,0,0,376428.12,0,0,688912.23,0,0,958187.81,0,0,463603.83,0,0,-1555436.8,0,0,-1512909.8,0,0,-823893.15};
+VT(0.093164956,0.1980516,0,0.087008075,0.19596841,0,0.091593501,0.1915477,0){0,0,420734.09,0,0,798107.94,0,0,544831.72,0,0,-826537.04,0,0,-1537171.7,0,0,-1004107.1,0,0,376428.12,0,0,625323.3,0,0,301623.68,0,0,463603.83,0,0,958187.81,0,0,749822.54,0,0,-823893.15,0,0,-1512909.8,0,0,-933881.71};
+VT(0.1,0.26428571,0,0.092520768,0.26920591,0,0.092295863,0.26000779,0){0,0,0,0,0,145042.72,0,0,193329.27,0,0,0,0,0,-420173.4,0,0,-546576.12,0,0,0,0,0,651988.34,0,0,805368.84,0,0,0,0,0,-816598.86,0,0,-924990.4,0,0,0,0,0,896908.09,0,0,884724.5};
+VT(0.092141527,0.03991184,0,0.092450683,0.030760689,0,0.1,0.035714286,0){0,0,927649.93,0,0,900007.85,0,0,0,0,0,767955.56,0,0,807431.66,0,0,0,0,0,476054.53,0,0,631804.95,0,0,0,0,0,102192.68,0,0,391202.83,0,0,0,0,0,-289378.9,0,0,110124.82,0,0,0};
+VT(0.015758122,0.23699049,0,0.013821768,0.24617185,0,0.0071147476,0.24137211,0){0,0,597291.98,0,0,454053.45,0,0,259907.57,0,0,-1541119.1,0,0,-1221678.8,0,0,-684802.64,0,0,1837947.1,0,0,1611329.8,0,0,859611.54,0,0,-1363109.4,0,0,-1502439.1,0,0,-720499.62,0,0,315646.37,0,0,928515.88,0,0,317972.39};
+VT(0.08264437,0.14444108,0,0.076625322,0.14929356,0,0.075488644,0.14176328,0){0,0,1463951.5,0,0,1845555.4,0,0,1990888.2,0,0,-1293607.4,0,0,-1818255.1,0,0,-1647841.2,0,0,-1614532.1,0,0,-1872475.3,0,0,-2274843.7,0,0,1105781,0,0,1790618.2,0,0,1255935.2,0,0,1743195.6,0,0,1898765.5,0,0,2491166.6};
+VT(0.093706234,0.20596864,0,0.093164956,0.1980516,0,0.1,0.2,0){0,0,360320.46,0,0,420734.09,0,0,0,0,0,-758974.46,0,0,-826537.04,0,0,0,0,0,479351.87,0,0,376428.12,0,0,0,0,0,228803.73,0,0,463603.83,0,0,0,0,0,-732939.79,0,0,-823893.15,0,0,0};
+VT(0.048663579,0.053435419,0,0.053426379,0.049768916,0,0.056317057,0.058022103,0){0,0,3726394.8,0,0,3727873.1,0,0,3630316.8,0,0,2589713.3,0,0,2738031.5,0,0,2330872.5,0,0,663071.82,0,0,1021148,0,0,197001.66,0,0,-1465861.1,0,0,-966926.63,0,0,-2007682.1,0,0,-3147918.6,0,0,-2698501,0,0,-3494460.7};
+VT(0.052532368,0.096036702,0,0.044548934,0.094607351,0,0.049739958,0.088394034,0){0,0,3389506.1,0,0,3364209.6,0,0,3472240.4,0,0,240670.51,0,0,323528.56,0,0,703521.31,0,0,-3131818.5,0,0,-3009655.6,0,0,-2626240.1,0,0,-3594959.1,0,0,-3622750.1,0,0,-3862017.3,0,0,-718569.73,0,0,-961698.97,0,0,-2018648.2};
+VT(0.070175425,0.16144206,0,0.067098511,0.16826118,0,0.061476805,0.16269562,0){0,0,2074683.8,0,0,2121688.2,0,0,2391378.9,0,0,-2570674.4,0,0,-2928224.5,0,0,-3025373.1,0,0,-1460177,0,0,-1008555.7,0,0,-1589341.3,0,0,2919916.2,0,0,3311710.7,0,0,3446908.2,0,0,762077.82,0,0,-250662.47,0,0,675366.83};
+VT(0.0087429334,0.24792416,0,0.0043813653,0.24702694,0,0.0071147476,0.24137211,0){0,0,283453.34,0,0,145794.38,0,0,259907.57,0,0,-768118.62,0,0,-393661.32,0,0,-684802.64,0,0,1029935.2,0,0,523477.05,0,0,859611.54,0,0,-992967.39,0,0,-496310.62,0,0,-720499.62,0,0,667809.3,0,0,320224.07,0,0,317972.39};
+VT(0.092195724,0.16853594,0,0.093873231,0.17693503,0,0.085369203,0.17624497,0){0,0,598378.34,0,0,445896.9,0,0,1039089.6,0,0,-829189.07,0,0,-694096.79,0,0,-1603144.1,0,0,-278570.16,0,0,-59504.029,0,0,-168940.91,0,0,936666.51,0,0,727141.13,0,0,1695116.9,0,0,-82641.6,0,0,-345394.37,0,0,-751642.95};
+VT(0.082583958,0.10907049,0,0.086838536,0.10220901,0,0.091053567,0.10618538,0){0,0,1698614.9,0,0,1341203.8,0,0,914271.31,0,0,-286603.09,0,0,-54099.381,0,0,-104388.15,0,0,-1936849,0,0,-1393108.8,0,0,-1006721.9,0,0,-1323464.6,0,0,-1282822.5,0,0,-787386.88,0,0,836522.31,0,0,161880.97,0,0,309052.61};
+VT(0.044637502,0.20577347,0,0.053221516,0.20704838,0,0.049232245,0.21047418,0){0,0,1811821.2,0,0,1805672.4,0,0,1752658.6,0,0,-3810004,0,0,-3837129.3,0,0,-3827070.5,0,0,2390091.8,0,0,2511247.5,0,0,2777012.8,0,0,1174216.7,0,0,1011998.4,0,0,540242.46,0,0,-3685779.4,0,0,-3650194.7,0,0,-3416565.4};
+VT(0.051624576,0.1997036,0,0.053221516,0.20704838,0,0.044637502,0.20577347,0){0,0,1943020.7,0,0,1805672.4,0,0,1811821.2,0,0,-3875569.2,0,0,-3837129.3,0,0,-3810004,0,0,1911651.5,0,0,2511247.5,0,0,2390091.8,0,0,1974364.4,0,0,1011998.4,0,0,1174216.7,0,0,-3875892.9,0,0,-3650194.7,0,0,-3685779.4};
+VT(0.013794295,0.15422926,0,0.0056981356,0.15371602,0,0.0078195435,0.14622426,0){0,0,1126466.2,0,0,478995.44,0,0,680366.1,0,0,-1226232.2,0,0,-516269.88,0,0,-626541.18,0,0,-1017954.8,0,0,-438816.38,0,0,-729870.69,0,0,1316565.7,0,0,550400.04,0,0,568744.13,0,0,901352.54,0,0,395913.98,0,0,774663.29};
+VT(0.013878694,0.17880836,0,0.0062925762,0.18063125,0,0.0069613667,0.17349451,0){0,0,971566.52,0,0,445914.92,0,0,517779.21,0,0,-1548960.4,0,0,-727143.63,0,0,-769992.03,0,0,-51095.574,0,0,12632.594,0,0,-142713.64,0,0,1579530,0,0,719304.1,0,0,839532.94,0,0,-887966.26,0,0,-466469.22,0,0,-266340.1};
+VT(0,0.23571429,0,0.0071147476,0.24137211,0,0,0.24285714,0){0,0,0,0,0,259907.57,0,0,0,0,0,0,0,0,-684802.64,0,0,0,0,0,0,0,0,859611.54,0,0,0,0,0,0,0,0,-720499.62,0,0,0,0,0,0,0,0,317972.39,0,0,0};
+VT(0.021502186,0.15931359,0,0.014502412,0.16316663,0,0.013794295,0.15422926,0){0,0,1630158.4,0,0,1121335,0,0,1126466.2,0,0,-1947614.2,0,0,-1429592.9,0,0,-1226232.2,0,0,-1250943.8,0,0,-728363.13,0,0,-1017954.8,0,0,2191316.6,0,0,1629901.1,0,0,1316565.7,0,0,824223.66,0,0,280110.31,0,0,901352.54};
+VT(0.01882241,0.070374011,0,0.027058874,0.069011929,0,0.026270926,0.075674812,0){0,0,2018056.9,0,0,2727323.5,0,0,2630439.6,0,0,970762.8,0,0,1363815.9,0,0,1063205.3,0,0,-580354.6,0,0,-681543.48,0,0,-1137545.6,0,0,-1830388.5,0,0,-2386220.5,0,0,-2660659.2,0,0,-2130853.3,0,0,-2898415.6,0,0,-2599027.8};
+VT(0.072323403,0.067507008,0,0.074756101,0.075901522,0,0.066925078,0.074981916,0){0,0,2781512.1,0,0,2549479.1,0,0,3090390.8,0,0,1448400.9,0,0,1021825.1,0,0,1280900.5,0,0,-578922.09,0,0,-1118145.3,0,0,-1278621.5,0,0,-2328912.3,0,0,-2588166.7,0,0,-3089611.2,0,0,-2963263.7,0,0,-2507455.8,0,0,-3091904.4};
+VT(0.010955873,0.10281868,0,0.013465065,0.10662372,0,0.0081152275,0.10988635,0){0,0,1124212.8,0,0,1351132.7,0,0,821145.89,0,0,-57954.543,0,0,-165451.82,0,0,-151361.79,0,0,-1179275.3,0,0,-1496410,0,0,-944689.8,0,0,-1060620.9,0,0,-1147793.4,0,0,-619246.83,0,0,173274.75,0,0,489093.12,0,0,439508.43};
+VT(0.069968451,0.098831219,0,0.065931692,0.10408722,0,0.061027247,0.098743066,0){0,0,2730411,0,0,2911358.9,0,0,3173016.6,0,0,57648.531,0,0,-218409.17,0,0,72008.811,0,0,-2671597.7,0,0,-3113407,0,0,-3099474,0,0,-2785714.6,0,0,-2661455,0,0,-3241975.4,0,0,-173126.8,0,0,651464.78,0,0,-216202.29};
+VT(0.018704911,0.19716585,0,0.025476801,0.19755762,0,0.024044461,0.20382537,0){0,0,1103230.1,0,0,1423125.8,0,0,1283805.9,0,0,-2149261.2,0,0,-2782737.9,0,0,-2655634.7,0,0,934589.13,0,0,1235431.1,0,0,1553893.8,0,0,1263201.6,0,0,1602470.1,0,0,995311.88,0,0,-2132672.2,0,0,-2766638.2,0,0,-2617892.2};
+VT(0,0.27857143,0,0.0067236406,0.28198319,0,0,0.28571429,0){0,0,0,0,0,76627.274,0,0,0,0,0,0,0,0,-227172.13,0,0,0,0,0,0,0,0,369685.4,0,0,0,0,0,0,0,0,-499127.77,0,0,0,0,0,0,0,0,610772.43,0,0,0};
+VT(0.026018946,0.14387862,0,0.033990129,0.14330646,0,0.030440206,0.150204,0){0,0,2064539,0,0,2486957.5,0,0,2239650.6,0,0,-1800072.3,0,0,-2138608.5,0,0,-2249230.7,0,0,-2295230.1,0,0,-2786553.8,0,0,-2230054.7,0,0,1506177.8,0,0,1748365.6,0,0,2258843.4,0,0,2488196.2,0,0,3031412.6,0,0,2220211.9};
+VT(0,0.014285714,0,0.006650898,0.018174199,0,0,0.021428571,0){0,0,0,0,0,801243.34,0,0,0,0,0,0,0,0,772347.91,0,0,0,0,0,0,0,0,715593.27,0,0,0,0,0,0,0,0,633022.27,0,0,0,0,0,0,0,0,527557,0,0,0};
+VT(0.022740693,0.23189018,0,0.021374843,0.22646669,0,0.026971271,0.22659033,0){0,0,887604.04,0,0,906782.43,0,0,1090633.5,0,0,-2230116.3,0,0,-2208721,0,0,-2658504.1,0,0,2485475.6,0,0,2264460.9,0,0,2731189,0,0,-1529145.6,0,0,-1042528.4,0,0,-1267784.1,0,0,-172982.46,0,0,-767856.24,0,0,-909068.56};
+VT(0.030075176,0.23324008,0,0.025350652,0.23917347,0,0.022740693,0.23189018,0){0,0,1077047.3,0,0,868665.73,0,0,887604.04,0,0,-2725827,0,0,-2265304,0,0,-2230116.3,0,0,3095770.8,0,0,2773502.3,0,0,2485475.6,0,0,-2013325.9,0,0,-2193941.8,0,0,-1529145.6,0,0,-13872.597,0,0,753574.67,0,0,-172982.46};
+VT(0.054957014,0.24657048,0,0.061408089,0.24582042,0,0.060567191,0.25172758,0){0,0,1058545,0,0,1017142.7,0,0,917440.34,0,0,-2852831,0,0,-2732695.2,0,0,-2522838.3,0,0,3777171.8,0,0,3591948.1,0,0,3497206.6,0,0,-3549694.2,0,0,-3325647.6,0,0,-3596815.5,0,0,2239441.1,0,0,2017029.8,0,0,2796536};
+VT(0.047385855,0.10193045,0,0.044548934,0.094607351,0,0.052532368,0.096036702,0){0,0,3329666.7,0,0,3364209.6,0,0,3389506.1,0,0,-117239.93,0,0,323528.56,0,0,240670.51,0,0,-3442848.4,0,0,-3009655.6,0,0,-3131818.5,0,0,-3204510.9,0,0,-3622750.1,0,0,-3594959.1,0,0,350991.89,0,0,-961698.97,0,0,-718569.73};
+VT(0.069467767,0.146519,0,0.064971856,0.15110456,0,0.061244461,0.14481879,0){0,0,2287173.5,0,0,2431817,0,0,2643484.5,0,0,-2120501.9,0,0,-2488096.1,0,0,-2356788.3,0,0,-2441744.6,0,0,-2374265.3,0,0,-2899198.4,0,0,1942651.5,0,0,2543085,0,0,2042509.4,0,0,2583122,0,0,2315361.9,0,0,3121060.9};
+VT(0.0081152275,0.10988635,0,0.0052460498,0.10332732,0,0.010955873,0.10281868,0){0,0,821145.89,0,0,545715.18,0,0,1124212.8,0,0,-151361.79,0,0,-33256.292,0,0,-57954.543,0,0,-944689.8,0,0,-576983.54,0,0,-1179275.3,0,0,-619246.83,0,0,-508602.25,0,0,-1060620.9,0,0,439508.43,0,0,99155.047,0,0,173274.75};
+VT(0.030466665,0.11568191,0,0.038084092,0.1145524,0,0.035619257,0.12028764,0){0,0,2608170,0,0,2981407.2,0,0,2821397.9,0,0,-773675.45,0,0,-818508.93,0,0,-1093830.4,0,0,-3152461.4,0,0,-3575257.7,0,0,-3491178.8,0,0,-1443702.3,0,0,-1775238,0,0,-1043884.2,0,0,2136967.4,0,0,2287308.3,0,0,2851838.9};
+VT(0.0094132111,0.052421332,0,0.014691551,0.054118398,0,0.0079950318,0.059686314,0){0,0,1088603.4,0,0,1659245.8,0,0,917766.47,0,0,768702.62,0,0,1140472.1,0,0,570756.35,0,0,222919.17,0,0,265092.56,0,0,7912.4367,0,0,-388347.22,0,0,-693242.8,0,0,-557994.72,0,0,-885762.83,0,0,-1435183.5,0,0,-913265.38};
+VT(0.020636298,0.17424253,0,0.027644767,0.17736901,0,0.021251228,0.18136297,0){0,0,1433869.3,0,0,1774040.3,0,0,1398279.8,0,0,-2154082.5,0,0,-2777088.7,0,0,-2300353.4,0,0,-351921.61,0,0,-203929.31,0,0,85724.805,0,0,2330929.4,0,0,2892544.7,0,0,2245163.6,0,0,-819073.82,0,0,-1431643.3,0,0,-1534338.6};
+VT(0.0081152275,0.10988635,0,0.013465065,0.10662372,0,0.016927821,0.11108648,0){0,0,821145.89,0,0,1351132.7,0,0,1644246.3,0,0,-151361.79,0,0,-165451.82,0,0,-340994.5,0,0,-944689.8,0,0,-1496410,0,0,-1914445.6,0,0,-619246.83,0,0,-1147793.4,0,0,-1176430.8,0,0,439508.43,0,0,489093.12,0,0,981584.41};
+VT(0.054828578,0.081464579,0,0.060416267,0.076932239,0,0.064352171,0.083117586,0){0,0,3492382.6,0,0,3380545.3,0,0,3167194.8,0,0,1101278.5,0,0,1302521.2,0,0,915483.69,0,0,-2043909.2,0,0,-1576156.6,0,0,-1987167.2,0,0,-3789901.6,0,0,-3485992.8,0,0,-3477240.4,0,0,-2941538.5,0,0,-3253298.6,0,0,-2495770};
+VT(0.0069979116,0.22643766,0,0.0069516057,0.23320895,0,0,0.22857143,0){0,0,317964.48,0,0,288078.49,0,0,0,0,0,-774386.26,0,0,-728952.19,0,0,0,0,0,793599.18,0,0,827497.2,0,0,0,0,0,-364658.79,0,0,-537397.4,0,0,0,0,0,-270536.88,0,0,-5267.3055,0,0,0};
+VT(0.0068768393,0.16098373,0,0.0056981356,0.15371602,0,0.013794295,0.15422926,0){0,0,553409.29,0,0,478995.44,0,0,1126466.2,0,0,-680450.71,0,0,-516269.88,0,0,-1226232.2,0,0,-397156.36,0,0,-438816.38,0,0,-1017954.8,0,0,771605.48,0,0,550400.04,0,0,1316565.7,0,0,219690.78,0,0,395913.98,0,0,901352.54};
+VT(0.08264437,0.14444108,0,0.081009521,0.1385969,0,0.087083587,0.13880919,0){0,0,1463951.5,0,0,1630909.4,0,0,1144744.3,0,0,-1293607.4,0,0,-1242340.3,0,0,-877072.07,0,0,-1614532.1,0,0,-1926924,0,0,-1349889.8,0,0,1105781,0,0,783271.16,0,0,561444.4,0,0,1743195.6,0,0,2113542.9,0,0,1481228.8};
+VT(0.064373335,0.2338171,0,0.066600159,0.24211306,0,0.059437672,0.2400817,0){0,0,1185902.3,0,0,1004296.2,0,0,1145348.7,0,0,-3010536.1,0,0,-2655015,0,0,-2999714,0,0,3446119.8,0,0,3359675.2,0,0,3711340.5,0,0,-2291596.2,0,0,-2867211.3,0,0,-3009146,0,0,79206.699,0,0,1352854.8,0,0,1160252.2};
+VT(0.061015306,0.048529238,0,0.053426379,0.049768916,0,0.054794838,0.043915046,0){0,0,3533367.8,0,0,3727873.1,0,0,3735662.6,0,0,2640342.3,0,0,2738031.5,0,0,2959425,0,0,1080012.2,0,0,1021148,0,0,1568238.5,0,0,-753291.7,0,0,-966926.63,0,0,-148813.91,0,0,-2396723.8,0,0,-2698501,0,0,-1835117.4};
+VT(0.074931673,0.27468874,0,0.081004963,0.27070547,0,0.082516133,0.27647665,0){0,0,363389.18,0,0,333174.81,0,0,248899.48,0,0,-1064791.9,0,0,-968418.7,0,0,-731674.12,0,0,1691857.9,0,0,1513258.3,0,0,1170289.2,0,0,-2200836.4,0,0,-1916833.2,0,0,-1538273.3,0,0,2556129.1,0,0,2141327.9,0,0,1813237.5};
+VT(0.082332164,0.023444943,0,0.080699945,0.029142305,0,0.074388951,0.025102472,0){0,0,2029600,0,0,2185639.9,0,0,2772012.4,0,0,1907886.4,0,0,1983669.2,0,0,2581574.2,0,0,1671751.1,0,0,1598386.1,0,0,2213781,0,0,1335359.8,0,0,1065401.8,0,0,1693914.7,0,0,918760.81,0,0,433818.71,0,0,1057277.9};
+VT(0,0.10714286,0,0.0052460498,0.10332732,0,0.0081152275,0.10988635,0){0,0,0,0,0,545715.18,0,0,821145.89,0,0,0,0,0,-33256.292,0,0,-151361.79,0,0,0,0,0,-576983.54,0,0,-944689.8,0,0,0,0,0,-508602.25,0,0,-619246.83,0,0,0,0,0,99155.047,0,0,439508.43};
+VT(0.019499739,0.079597209,0,0.01318623,0.084416193,0,0.012549176,0.077039569,0){0,0,2040354.6,0,0,1411871.7,0,0,1370920.5,0,0,702945.71,0,0,378554.62,0,0,525978.15,0,0,-1095289.5,0,0,-931831.12,0,0,-643140.23,0,0,-2175701.2,0,0,-1560266,0,0,-1415881.7,0,0,-1830384.7,0,0,-1046999.7,0,0,-1316306.1};
+VT(0.084917502,0.034253561,0,0.085916752,0.02828,0,0.092450683,0.030760689,0){0,0,1742331.8,0,0,1643257.2,0,0,900007.85,0,0,1520580.8,0,0,1500211.7,0,0,807431.66,0,0,1105294,0,0,1226559.7,0,0,631804.95,0,0,549324.68,0,0,846114.35,0,0,391202.83,0,0,-76880.401,0,0,391827.49,0,0,110124.82};
+VT(0.092520768,0.26920591,0,0.086077973,0.27164165,0,0.085115353,0.26563346,0){0,0,145042.72,0,0,243157.03,0,0,313056.52,0,0,-420173.4,0,0,-708191.99,0,0,-899063.8,0,0,651988.34,0,0,1111255.9,0,0,1369900.4,0,0,-816598.86,0,0,-1417072.6,0,0,-1665255.4,0,0,896908.09,0,0,1598582.9,0,0,1747205.8};
+VT(0.037999827,0.27482627,0,0.045592054,0.27439642,0,0.045044357,0.28188841,0){0,0,474219.19,0,0,513714.39,0,0,362990.51,0,0,-1389905,0,0,-1504437.2,0,0,-1075960.6,0,0,2209621.2,0,0,2387679.2,0,0,1750378.7,0,0,-2876809.4,0,0,-3100344.3,0,0,-2362097.1,0,0,3345267.4,0,0,3591305.7,0,0,2889034};
+VT(0.077393474,0.16425214,0,0.083969261,0.16737329,0,0.077140734,0.17217741,0){0,0,1650679.7,0,0,1198489.7,0,0,1584233.7,0,0,-2141613.9,0,0,-1632158.2,0,0,-2313491.7,0,0,-1013799.5,0,0,-607916.58,0,0,-519338.58,0,0,2443278.1,0,0,1852187.2,0,0,2552719.3,0,0,287063.28,0,0,-62490.334,0,0,-655929.75};
+VT(0.066925078,0.074981916,0,0.074756101,0.075901522,0,0.070865224,0.080352924,0){0,0,3090390.8,0,0,2549479.1,0,0,2808030.6,0,0,1280900.5,0,0,1021825.1,0,0,934415.1,0,0,-1278621.5,0,0,-1118145.3,0,0,-1562677.5,0,0,-3089611.2,0,0,-2588166.7,0,0,-3017110.1,0,0,-3091904.4,0,0,-2507455.8,0,0,-2458745.5};
+VT(0.017373248,0.19021363,0,0.023309936,0.19197185,0,0.018704911,0.19716585,0){0,0,1095255.9,0,0,1390526.6,0,0,1103230.1,0,0,-1990705.9,0,0,-2573914.4,0,0,-2149261.2,0,0,532263.7,0,0,799964.88,0,0,934589.13,0,0,1555631.8,0,0,1893175.4,0,0,1263201.6,0,0,-1804413.6,0,0,-2411477.9,0,0,-2132672.2};
+VT(0.079090117,0.19794942,0,0.081922129,0.20489902,0,0.075422073,0.20645372,0){0,0,1206859.6,0,0,996952.98,0,0,1273700.5,0,0,-2368529.7,0,0,-2081157.6,0,0,-2693470,0,0,1073015.3,0,0,1266338.6,0,0,1728669,0,0,1335740.9,0,0,704044.3,0,0,766631.5,0,0,-2359414.1,0,0,-2032271.3,0,0,-2583646.6};
+VT(0.08682376,0.20181233,0,0.081922129,0.20489902,0,0.079090117,0.19794942,0){0,0,767576.83,0,0,996952.98,0,0,1206859.6,0,0,-1560255.4,0,0,-2081157.6,0,0,-2368529.7,0,0,843726.65,0,0,1266338.6,0,0,1073015.3,0,0,688912.23,0,0,704044.3,0,0,1335740.9,0,0,-1555436.8,0,0,-2032271.3,0,0,-2359414.1};
+VT(0.039686874,0.0066116125,0,0.031710863,0.0075461758,0,0.035714286,0,0){0,0,3676489.9,0,0,3254919.5,0,0,3496308.9,0,0,3658909.3,0,0,3234618.2,0,0,3496337.7,0,0,3623831.1,0,0,3194153.7,0,0,3496399.5,0,0,3571457.2,0,0,3133832.1,0,0,3496538.6,0,0,3501797.4,0,0,3053845.3,0,0,3496562.8};
+VT(0.035714286,0.3,0,0.031264826,0.29263185,0,0.03928574,0.29335694,0){0,0,0,0,0,124484.17,0,0,127378.94,0,0,0,0,0,-372709.78,0,0,-381522.06,0,0,0,0,0,618717.86,0,0,633829.06,0,0,0,0,0,-861054.65,0,0,-883092.25,0,0,0,0,0,1098239.8,0,0,1127859.7};
+VT(0.022775714,0.15147437,0,0.030440206,0.150204,0,0.027609688,0.15620978,0){0,0,1786181.8,0,0,2239650.6,0,0,2023546.1,0,0,-1841345.2,0,0,-2249230.7,0,0,-2286520.9,0,0,-1729359.8,0,0,-2230054.7,0,0,-1726415,0,0,1894858,0,0,2258843.4,0,0,2510934.9,0,0,1670732.8,0,0,2220211.9,0,0,1400022.9};
+VT(0.0079950318,0.059686314,0,0.014691551,0.054118398,0,0.016702178,0.061420197,0){0,0,917766.47,0,0,1659245.8,0,0,1844408.3,0,0,570756.35,0,0,1140472.1,0,0,1107331.1,0,0,7912.4367,0,0,265092.56,0,0,-72241.295,0,0,-557994.72,0,0,-693242.8,0,0,-1222910.6,0,0,-913265.38,0,0,-1435183.5,0,0,-1885264.1};
+VT(0,0.028571429,0,0.0058133292,0.032528446,0,0,0.035714286,0){0,0,0,0,0,694559.72,0,0,0,0,0,0,0,0,614750.96,0,0,0,0,0,0,0,0,464300.7,0,0,0,0,0,0,0,0,260495.38,0,0,0,0,0,0,0,0,26512.55,0,0,0};
+VT(0.067728608,0.12931058,0,0.068478919,0.13862632,0,0.060672554,0.13561545,0){0,0,2567539,0,0,2426951.1,0,0,2778852.8,0,0,-1463631.5,0,0,-1850187.5,0,0,-1944873,0,0,-3196956.5,0,0,-2866745.3,0,0,-3362653.4,0,0,89062.443,0,0,1169007.7,0,0,935707.85,0,0,3235608.2,0,0,3144665.9,0,0,3643681.7};
+VT(0,0.26428571,0,0.0060732531,0.2674669,0,0,0.27142857,0){0,0,0,0,0,124750.88,0,0,0,0,0,0,0,0,-359918.85,0,0,0,0,0,0,0,0,553735.12,0,0,0,0,0,0,0,0,-683931.42,0,0,0,0,0,0,0,0,735399.5,0,0,0};
+VT(0.072323403,0.067507008,0,0.064846874,0.068845861,0,0.064832361,0.062804408,0){0,0,2781512.1,0,0,3243292.3,0,0,3281120.4,0,0,1448400.9,0,0,1629296.1,0,0,1912310.8,0,0,-578922.09,0,0,-795531.06,0,0,-254314.65,0,0,-2328912.3,0,0,-2824516.6,0,0,-2314932.7,0,0,-2963263.7,0,0,-3448034.5,0,0,-3410309.6};
+VT(0.1,0.15714286,0,0.09308158,0.15403623,0,0.1,0.15,0){0,0,0,0,0,579061.91,0,0,0,0,0,0,0,0,-628036.95,0,0,0,0,0,0,0,0,-525997.02,0,0,0,0,0,0,0,0,672596.25,0,0,0,0,0,0,0,0,469080.04,0,0,0};
+VT(0.040431855,0.24188745,0,0.037546984,0.23452457,0,0.045331711,0.23557633,0){0,0,1110505,0,0,1205921.7,0,0,1270563.3,0,0,-2932804,0,0,-3072707.6,0,0,-3255008.9,0,0,3702149.5,0,0,3550700.1,0,0,3813331,0,0,-3142324.5,0,0,-2423829.8,0,0,-2700862,0,0,1453973.2,0,0,201013.93,0,0,404484.48};
+VT(0.067728608,0.12931058,0,0.070840483,0.12204614,0,0.076158908,0.12549637,0){0,0,2567539,0,0,2470738.2,0,0,2092101.1,0,0,-1463631.5,0,0,-1044803.2,0,0,-1030118.9,0,0,-3196956.5,0,0,-3073782.1,0,0,-2615047.7,0,0,89062.443,0,0,-729197.53,0,0,-297340.89,0,0,3235608.2,0,0,2652961,0,0,2464056};
+VT(0.046181733,0.0056701177,0,0.043829005,0.011024747,0,0.039686874,0.0066116125,0){0,0,3851009.3,0,0,3801549.1,0,0,3676489.9,0,0,3837454.5,0,0,3750937.1,0,0,3658909.3,0,0,3810385,0,0,3650381.9,0,0,3623831.1,0,0,3769920.5,0,0,3501249.8,0,0,3571457.2,0,0,3715901.2,0,0,3305260.3,0,0,3501797.4};
+VT(0.066803853,0.25459223,0,0.060567191,0.25172758,0,0.065478411,0.24860928,0){0,0,789541.66,0,0,917440.34,0,0,912058.17,0,0,-2193455.3,0,0,-2522838.3,0,0,-2478342.9,0,0,3110738.9,0,0,3497206.6,0,0,3344041.2,0,0,-3337877,0,0,-3596815.5,0,0,-3264436.9,0,0,2824240.3,0,0,2796536,0,0,2261773.6};
+VT(0.03928574,0.29335694,0,0.043131118,0.28864457,0,0.045931579,0.29422002,0){0,0,127378.94,0,0,225252.57,0,0,116468.36,0,0,-381522.06,0,0,-672574.82,0,0,-348980.73,0,0,633829.06,0,0,1110400.5,0,0,580225.36,0,0,-883092.25,0,0,-1532552.2,0,0,-809364.6,0,0,1127859.7,0,0,1932837.8,0,0,1035478};
+VT(0.038597539,0.20095921,0,0.043569257,0.19619451,0,0.044637502,0.20577347,0){0,0,1801301.7,0,0,1966078.6,0,0,1811821.2,0,0,-3633864.6,0,0,-3794921.6,0,0,-3810004,0,0,1895634,0,0,1563901,0,0,2390091.8,0,0,1705394,0,0,2340412.7,0,0,1174216.7,0,0,-3630918.1,0,0,-3741435.4,0,0,-3685779.4};
+VT(0.044637502,0.20577347,0,0.043569257,0.19619451,0,0.051624576,0.1997036,0){0,0,1811821.2,0,0,1966078.6,0,0,1943020.7,0,0,-3810004,0,0,-3794921.6,0,0,-3875569.2,0,0,2390091.8,0,0,1563901,0,0,1911651.5,0,0,1174216.7,0,0,2340412.7,0,0,1974364.4,0,0,-3685779.4,0,0,-3741435.4,0,0,-3875892.9};
+VT(0,0.092857143,0,0.0071591483,0.096788703,0,0,0.1,0){0,0,0,0,0,756711.76,0,0,0,0,0,0,0,0,43634.951,0,0,0,0,0,0,0,0,-710572.63,0,0,0,0,0,0,0,0,-795194.2,0,0,0,0,0,0,0,0,-130859.45,0,0,0};
+VT(0.017990672,0.29207379,0,0.010662343,0.29482959,0,0.0093450955,0.28843768,0){0,0,86228.122,0,0,34537.041,0,0,67949.514,0,0,-258100.45,0,0,-103506.64,0,0,-202850.84,0,0,428229.3,0,0,172164.12,0,0,334776.34,0,0,-595472.42,0,0,-240303.04,0,0,-461793.67,0,0,758576.15,0,0,307518.14,0,0,581935.08};
+VT(0.0093389246,0.011691623,0,0.010679145,0.0052482016,0,0.01808004,0.0081573173,0){0,0,1120186.5,0,0,1277155.8,0,0,2085729.2,0,0,1103410.3,0,0,1273289.3,0,0,2070583.9,0,0,1070108.3,0,0,1265566.3,0,0,2040406.9,0,0,1020788.4,0,0,1254019.7,0,0,1995444.2,0,0,956114.18,0,0,1238493.9,0,0,1935913.6};
+VT(0.060672554,0.13561545,0,0.054237851,0.14012792,0,0.053497526,0.1329974,0){0,0,2778852.8,0,0,2856617.8,0,0,2959143.9,0,0,-1944873,0,0,-2267029,0,0,-1911000.9,0,0,-3362653.4,0,0,-3324577.4,0,0,-3636096,0,0,935707.85,0,0,1580891.3,0,0,623103.97,0,0,3643681.7,0,0,3650971.5,0,0,3857035.6};
+VT(0.074279052,0.25633166,0,0.071915087,0.24816524,0,0.07921504,0.25033934,0){0,0,635900.39,0,0,803363.84,0,0,606155.6,0,0,-1777029.4,0,0,-2179152.4,0,0,-1658203,0,0,2553015.8,0,0,2928525.2,0,0,2271843.6,0,0,-2804423.5,0,0,-2836050.6,0,0,-2284831,0,0,2479429.3,0,0,1927975,0,0,1693484.6};
+VT(0.091864029,0.22106993,0,0.095652827,0.22622146,0,0.09071018,0.22887426,0){0,0,394005.54,0,0,199039.37,0,0,406264.77,0,0,-927852.61,0,0,-484109.58,0,0,-1003622.2,0,0,863120.02,0,0,494313.66,0,0,1069446.3,0,0,-241435.16,0,0,-223837.82,0,0,-568907.82,0,0,-536498.87,0,0,-173819.74,0,0,-233040.27};
+VT(0.021658338,0.054940441,0,0.025565101,0.048609543,0,0.028699663,0.054481756,0){0,0,2341024.9,0,0,2702312,0,0,2920693,0,0,1587273.2,0,0,2017092.5,0,0,1995520.8,0,0,322446.89,0,0,820389.33,0,0,438210.61,0,0,-1046241,0,0,-584372.75,0,0,-1257984.1,0,0,-2078353.5,0,0,-1841258.2,0,0,-2556170.3};
+VT(0.019247887,0.048569646,0,0.025565101,0.048609543,0,0.021658338,0.054940441,0){0,0,2135187.8,0,0,2702312,0,0,2341024.9,0,0,1594654.5,0,0,2017092.5,0,0,1587273.2,0,0,650408.09,0,0,820389.33,0,0,322446.89,0,0,-458538.7,0,0,-584372.75,0,0,-1046241,0,0,-1451674.1,0,0,-1841258.2,0,0,-2078353.5};
+VT(0.084368038,0.19048099,0,0.087008075,0.19596841,0,0.079090117,0.19794942,0){0,0,992852.93,0,0,798107.94,0,0,1206859.6,0,0,-1809621.2,0,0,-1537171.7,0,0,-2368529.7,0,0,495817.1,0,0,625323.3,0,0,1073015.3,0,0,1401810.9,0,0,958187.81,0,0,1335740.9,0,0,-1649308.4,0,0,-1512909.8,0,0,-2359414.1};
+VT(0.029991713,0.27132489,0,0.027951851,0.26533243,0,0.034582704,0.26623209,0){0,0,469504.82,0,0,539100.43,0,0,604041.77,0,0,-1366503,0,0,-1547025.6,0,0,-1737386.1,0,0,2141236.7,0,0,2353298.6,0,0,2655775,0,0,-2724385.3,0,0,-2852826.8,0,0,-3245580.1,0,0,3063642.3,0,0,2980285,0,0,3433603.3};
+VT(0.043569257,0.19619451,0,0.044234359,0.18859393,0,0.050398693,0.1921099,0){0,0,1966078.6,0,0,2102462.5,0,0,2077292.2,0,0,-3794921.6,0,0,-3756018.8,0,0,-3850553.1,0,0,1563901,0,0,851571.98,0,0,1209682,0,0,2340412.7,0,0,3086402.5,0,0,2818064.5,0,0,-3741435.4,0,0,-3279385.1,0,0,-3615771.1};
+VT(0.0069613667,0.17349451,0,0.0046637588,0.16745308,0,0.0094805882,0.16707285,0){0,0,517779.21,0,0,362371.83,0,0,730151.01,0,0,-769992.03,0,0,-494096.85,0,0,-989834.58,0,0,-142713.64,0,0,-182769.85,0,0,-378084.11,0,0,839532.94,0,0,560561.48,0,0,1124284.7,0,0,-266340.1,0,0,-21256.565,0,0,-22095.939};
+VT(0.074931673,0.27468874,0,0.06660802,0.27624666,0,0.069536278,0.26943087,0){0,0,363389.18,0,0,417349.44,0,0,505602.11,0,0,-1064791.9,0,0,-1226359.7,0,0,-1465439,0,0,1691857.9,0,0,1959900.4,0,0,2276404,0,0,-2200836.4,0,0,-2572844.1,0,0,-2856108.7,0,0,2556129.1,0,0,3027289.2,0,0,3145421.5};
+VT(0.068476894,0.0069177029,0,0.074656208,0.0053403125,0,0.073684623,0.0112317,0){0,0,3242851.4,0,0,2772385.5,0,0,2850123.3,0,0,3225849.8,0,0,2763721.5,0,0,2810738.2,0,0,3191931.3,0,0,2746414.1,0,0,2732509.2,0,0,3141298.2,0,0,2720533.7,0,0,2616540.6,0,0,3073847.6,0,0,2685936.9,0,0,2464223.2};
+VT(0.073754091,0.28851618,0,0.074657371,0.29452352,0,0.068366879,0.29272708,0){0,0,171229.59,0,0,79525.554,0,0,123803.43,0,0,-511212.67,0,0,-238312.39,0,0,-370697.46,0,0,843808.82,0,0,396309.36,0,0,615462.12,0,0,-1164215.8,0,0,-552992.95,0,0,-856697.17,0,0,1467609.3,0,0,707611.71,0,0,1092834.3};
+VT(0.025130011,0.29009115,0,0.024877102,0.29495936,0,0.017990672,0.29207379,0){0,0,142877.47,0,0,72135.52,0,0,86228.122,0,0,-427099.39,0,0,-216205.93,0,0,-258100.45,0,0,706741.94,0,0,359676.71,0,0,428229.3,0,0,-978805.55,0,0,-502149.61,0,0,-595472.42,0,0,1240164.3,0,0,642973.44,0,0,758576.15};
+VT(0.017990672,0.29207379,0,0.024877102,0.29495936,0,0.021428571,0.3,0){0,0,86228.122,0,0,72135.52,0,0,0,0,0,-258100.45,0,0,-216205.93,0,0,0,0,0,428229.3,0,0,359676.71,0,0,0,0,0,-595472.42,0,0,-502149.61,0,0,0,0,0,758576.15,0,0,642973.44,0,0,0};
+VT(0.021428571,0,0,0.025051818,0.0051959301,0,0.01808004,0.0081573173,0){0,0,2419501.9,0,0,2747435.6,0,0,2085729.2,0,0,2419561.9,0,0,2739316.7,0,0,2070583.9,0,0,2419679.8,0,0,2723095.2,0,0,2040406.9,0,0,2419876.4,0,0,2698832.3,0,0,1995444.2,0,0,2419989.4,0,0,2666496.7,0,0,1935913.6};
+VT(0.01808004,0.0081573173,0,0.025051818,0.0051959301,0,0.025468185,0.010276157,0){0,0,2085729.2,0,0,2747435.6,0,0,2780034,0,0,2070583.9,0,0,2739316.7,0,0,2747892,0,0,2040406.9,0,0,2723095.2,0,0,2683968.5,0,0,1995444.2,0,0,2698832.3,0,0,2589008.8,0,0,1935913.6,0,0,2666496.7,0,0,2463902.9};
+VT(0.061244461,0.14481879,0,0.054237851,0.14012792,0,0.060672554,0.13561545,0){0,0,2643484.5,0,0,2856617.8,0,0,2778852.8,0,0,-2356788.3,0,0,-2267029,0,0,-1944873,0,0,-2899198.4,0,0,-3324577.4,0,0,-3362653.4,0,0,2042509.4,0,0,1580891.3,0,0,935707.85,0,0,3121060.9,0,0,3650971.5,0,0,3643681.7};
+VT(0.079090117,0.19794942,0,0.087008075,0.19596841,0,0.08682376,0.20181233,0){0,0,1206859.6,0,0,798107.94,0,0,767576.83,0,0,-2368529.7,0,0,-1537171.7,0,0,-1560255.4,0,0,1073015.3,0,0,625323.3,0,0,843726.65,0,0,1335740.9,0,0,958187.81,0,0,688912.23,0,0,-2359414.1,0,0,-1512909.8,0,0,-1555436.8};
+VT(0.093710586,0.16080643,0,0.088623123,0.15812222,0,0.09308158,0.15403623,0){0,0,507346.27,0,0,918302.92,0,0,579061.91,0,0,-621948.04,0,0,-1074338,0,0,-628036.95,0,0,-366919.85,0,0,-735787.48,0,0,-525997.02,0,0,704920.6,0,0,1199414.9,0,0,672596.25,0,0,207593.47,0,0,531983.03,0,0,469080.04};
+VT(0.088381846,0.16289419,0,0.088623123,0.15812222,0,0.093710586,0.16080643,0){0,0,911153.68,0,0,918302.92,0,0,507346.27,0,0,-1156470.7,0,0,-1074338,0,0,-621948.04,0,0,-599768.12,0,0,-735787.48,0,0,-366919.85,0,0,1317920.1,0,0,1199414.9,0,0,704920.6,0,0,244888.24,0,0,531983.03,0,0,207593.47};
+VT(0.060672554,0.13561545,0,0.059246105,0.12763558,0,0.067728608,0.12931058,0){0,0,2778852.8,0,0,2918223.5,0,0,2567539,0,0,-1944873,0,0,-1563762.3,0,0,-1463631.5,0,0,-3362653.4,0,0,-3644117.3,0,0,-3196956.5,0,0,935707.85,0,0,-127593.52,0,0,89062.443,0,0,3643681.7,0,0,3585046,0,0,3235608.2};
+VT(0.02133326,0.24577003,0,0.025350652,0.23917347,0,0.029124573,0.24658198,0){0,0,675269.21,0,0,868665.73,0,0,849052.23,0,0,-1813848.4,0,0,-2265304,0,0,-2288340.2,0,0,2383092.9,0,0,2773502.3,0,0,3030093.5,0,0,-2204305.3,0,0,-2193941.8,0,0,-2848204.4,0,0,1333319.6,0,0,753574.67,0,0,1797881.3};
+VT(0.037897724,0.149701,0,0.045364072,0.14896511,0,0.042155309,0.15589067,0){0,0,2552043.8,0,0,2729630.7,0,0,2577776.2,0,0,-2536068.8,0,0,-2670475.8,0,0,-2895603.6,0,0,-2567975.2,0,0,-2787568.3,0,0,-2220826.4,0,0,2520076,0,0,2610132.2,0,0,3169529.7,0,0,2583694.6,0,0,2844182.1,0,0,1830012};
+VT(0.071449289,0.19423207,0,0.06771074,0.1881525,0,0.076430303,0.18837043,0){0,0,1594804.6,0,0,1821405.7,0,0,1444535.6,0,0,-3019964.8,0,0,-3238423,0,0,-2574453.4,0,0,1103926.4,0,0,698008.36,0,0,569102.25,0,0,2033518.7,0,0,2695511.5,0,0,2129625.3,0,0,-2921575.1,0,0,-2795478.4,0,0,-2235391.7};
+VT(0.078984823,0.22953004,0,0.084619556,0.23283838,0,0.077318805,0.23627719,0){0,0,858343.29,0,0,621044.17,0,0,830868.27,0,0,-2128428.8,0,0,-1568398.7,0,0,-2136157.9,0,0,2291087.1,0,0,1771426.2,0,0,2525048.7,0,0,-1261656.1,0,0,-1133733.9,0,0,-1830714.2,0,0,-424553.92,0,0,-42283.716,0,0,350702.19};
+VT(0.077318805,0.23627719,0,0.084619556,0.23283838,0,0.084206466,0.24009781,0){0,0,830868.27,0,0,621044.17,0,0,569988.38,0,0,-2136157.9,0,0,-1568398.7,0,0,-1492933.9,0,0,2525048.7,0,0,1771426.2,0,0,1847439,0,0,-1830714.2,0,0,-1133733.9,0,0,-1498530.8,0,0,350702.19,0,0,-42283.716,0,0,578923.58};
+VT(0.026018946,0.14387862,0,0.030440206,0.150204,0,0.022775714,0.15147437,0){0,0,2064539,0,0,2239650.6,0,0,1786181.8,0,0,-1800072.3,0,0,-2249230.7,0,0,-1841345.2,0,0,-2295230.1,0,0,-2230054.7,0,0,-1729359.8,0,0,1506177.8,0,0,2258843.4,0,0,1894858,0,0,2488196.2,0,0,2220211.9,0,0,1670732.8};
+VT(0.07492972,0.092844339,0,0.081743274,0.092625466,0,0.079063451,0.10043005,0){0,0,2431427.6,0,0,1862860,0,0,2051820.1,0,0,308451.38,0,0,243386.47,0,0,-16056.497,0,0,-2083891.4,0,0,-1587731,0,0,-2067914.3,0,0,-2656803.1,0,0,-2038652.4,0,0,-2035845.1,0,0,-910298.79,0,0,-717394.49,0,0,48244.512};
+VT(0.079063451,0.10043005,0,0.081743274,0.092625466,0,0.087331535,0.0958472,0){0,0,2051820.1,0,0,1862860,0,0,1318484.3,0,0,-16056.497,0,0,243386.47,0,0,98077.228,0,0,-2067914.3,0,0,-1587731,0,0,-1213131.9,0,0,-2035845.1,0,0,-2038652.4,0,0,-1401481.2,0,0,48244.512,0,0,-717394.49,0,0,-292629.72};
+VT(0.066012722,0.055502179,0,0.070754378,0.060222618,0,0.064832361,0.062804408,0){0,0,3257272.9,0,0,2932444.5,0,0,3281120.4,0,0,2187557.2,0,0,1804303.3,0,0,1912310.8,0,0,399401.17,0,0,-17984.254,0,0,-254314.65,0,0,-1519988.7,0,0,-1833384.6,0,0,-2314932.7,0,0,-2940625.1,0,0,-2943704.7,0,0,-3410309.6};
+VT(0.069467767,0.146519,0,0.076625322,0.14929356,0,0.070477538,0.15360968,0){0,0,2287173.5,0,0,1845555.4,0,0,2153625.7,0,0,-2120501.9,0,0,-1818255.1,0,0,-2316413.6,0,0,-2441744.6,0,0,-1872475.3,0,0,-1978592.7,0,0,1942651.5,0,0,1790618.2,0,0,2466066.8,0,0,2583122,0,0,1898765.5,0,0,1792310.4};
+VT(0.075488644,0.14176328,0,0.076625322,0.14929356,0,0.069467767,0.146519,0){0,0,1990888.2,0,0,1845555.4,0,0,2287173.5,0,0,-1647841.2,0,0,-1818255.1,0,0,-2120501.9,0,0,-2274843.7,0,0,-1872475.3,0,0,-2441744.6,0,0,1255935.2,0,0,1790618.2,0,0,1942651.5,0,0,2491166.6,0,0,1898765.5,0,0,2583122};
+VT(0.070607657,0.23670872,0,0.066600159,0.24211306,0,0.064373335,0.2338171,0){0,0,1007105.3,0,0,1004296.2,0,0,1185902.3,0,0,-2594870.8,0,0,-2655015,0,0,-3010536.1,0,0,3083897.2,0,0,3359675.2,0,0,3446119.8,0,0,-2267120.1,0,0,-2867211.3,0,0,-2291596.2,0,0,490193.02,0,0,1352854.8,0,0,79206.699};
+VT(0.1,0.11428571,0,0.091758141,0.11296708,0,0.1,0.10714286,0){0,0,0,0,0,824791.32,0,0,0,0,0,0,0,0,-201020.76,0,0,0,0,0,0,0,0,-976886.6,0,0,0,0,0,0,0,0,-537824.26,0,0,0,0,0,0,0,0,570097.26,0,0,0};
+VT(0.017763535,0.12074209,0,0.023379755,0.12686903,0,0.01788586,0.12850833,0){0,0,1657769.5,0,0,2047772.9,0,0,1616906.9,0,0,-657738.05,0,0,-1065433.1,0,0,-895214.81,0,0,-2054600.3,0,0,-2558991,0,0,-2016472.2,0,0,-581651.26,0,0,-162203.53,0,0,-4802.2192,0,0,1703675.4,0,0,2481221.5,0,0,2014144.7};
+VT(0.016927821,0.11108648,0,0.01198914,0.11616091,0,0.0081152275,0.10988635,0){0,0,1644246.3,0,0,1171325.2,0,0,821145.89,0,0,-340994.5,0,0,-358450.6,0,0,-151361.79,0,0,-1914445.6,0,0,-1420119.3,0,0,-944689.8,0,0,-1176430.8,0,0,-627101.02,0,0,-619246.83,0,0,981584.41,0,0,984768,0,0,439508.43};
+VT(0.1,0.021428571,0,0.095041081,0.024587994,0,0.093571257,0.018380777,0){0,0,0,0,0,597113.29,0,0,774815.13,0,0,0,0,0,557751.32,0,0,746204.54,0,0,0,0,0,481620.22,0,0,690036.86,0,0,0,0,0,373740.48,0,0,608388.09,0,0,0,0,0,241099.33,0,0,504051.02};
+VT(0.093593186,0.28160993,0,0.095069321,0.27540052,0,0.1,0.27857143,0){0,0,74588.283,0,0,76899.446,0,0,0,0,0,-221009.65,0,0,-225624.71,0,0,0,0,0,359269.18,0,0,359465.9,0,0,0,0,0,-484261.41,0,0,-469594.27,0,0,0,0,0,591230.88,0,0,548580.83,0,0,0};
+VT(0.0071591483,0.096788703,0,0.0052460498,0.10332732,0,0,0.1,0){0,0,756711.76,0,0,545715.18,0,0,0,0,0,43634.951,0,0,-33256.292,0,0,0,0,0,-710572.63,0,0,-576983.54,0,0,0,0,0,-795194.2,0,0,-508602.25,0,0,0,0,0,-130859.45,0,0,99155.047,0,0,0};
+VT(0.09416017,0.099511923,0,0.086838536,0.10220901,0,0.087331535,0.0958472,0){0,0,613994.66,0,0,1341203.8,0,0,1318484.3,0,0,5422.3845,0,0,-54099.381,0,0,98077.228,0,0,-608645.22,0,0,-1393108.8,0,0,-1213131.9,0,0,-619557.01,0,0,-1282822.5,0,0,-1401481.2,0,0,-16415.987,0,0,161880.97,0,0,-292629.72};
+VT(0.049204373,0.010884263,0,0.043829005,0.011024747,0,0.046181733,0.0056701177,0){0,0,3873084,0,0,3801549.1,0,0,3851009.3,0,0,3822842.7,0,0,3750937.1,0,0,3837454.5,0,0,3723003.5,0,0,3650381.9,0,0,3810385,0,0,3574883.8,0,0,3501249.8,0,0,3769920.5,0,0,3380124.5,0,0,3305260.3,0,0,3715901.2};
+VT(0.045931579,0.29422002,0,0.043131118,0.28864457,0,0.048791783,0.28884593,0){0,0,116468.36,0,0,225252.57,0,0,226341.07,0,0,-348980.73,0,0,-672574.82,0,0,-675936.71,0,0,580225.36,0,0,1110400.5,0,0,1116322.7,0,0,-809364.6,0,0,-1532552.2,0,0,-1541505,0,0,1035478,0,0,1932837.8,0,0,1945474.1};
+VT(0.020473685,0.087577432,0,0.024499807,0.092422798,0,0.019165757,0.095107709,0){0,0,2087024.2,0,0,2390452.1,0,0,1930971.9,0,0,451292.51,0,0,320672.29,0,0,168744.63,0,0,-1538224.3,0,0,-2026771.7,0,0,-1747493.7,0,0,-2322280.1,0,0,-2619357.9,0,0,-2069009.1,0,0,-1286407.6,0,0,-944222.72,0,0,-502664.26};
+VT(0.041002292,0.08644635,0,0.044548934,0.094607351,0,0.03690243,0.09394169,0){0,0,3351345,0,0,3364209.6,0,0,3135041.5,0,0,787437.3,0,0,323528.56,0,0,337961.95,0,0,-2379027.1,0,0,-3009655.6,0,0,-2760700,0,0,-3725698.5,0,0,-3622750.1,0,0,-3396384.7,0,0,-2222336.9,0,0,-961698.97,0,0,-1002139.6};
+VT(0.049739958,0.088394034,0,0.044548934,0.094607351,0,0.041002292,0.08644635,0){0,0,3472240.4,0,0,3364209.6,0,0,3351345,0,0,703521.31,0,0,323528.56,0,0,787437.3,0,0,-2626240.1,0,0,-3009655.6,0,0,-2379027.1,0,0,-3862017.3,0,0,-3622750.1,0,0,-3725698.5,0,0,-2018648.2,0,0,-961698.97,0,0,-2222336.9};
+VT(0.041319833,0.14315875,0,0.033990129,0.14330646,0,0.038217426,0.13599196,0){0,0,2735557.7,0,0,2486957.5,0,0,2738753.8,0,0,-2343944,0,0,-2138608.5,0,0,-1938161,0,0,-3071175.4,0,0,-2786553.8,0,0,-3305386.1,0,0,1904337.3,0,0,1748365.6,0,0,972060.89,0,0,3343927.4,0,0,3031412.6,0,0,3589652.3};
+VT(0.042857143,0,0,0.046181733,0.0056701177,0,0.039686874,0.0066116125,0){0,0,3783299.5,0,0,3851009.3,0,0,3676489.9,0,0,3783327.5,0,0,3837454.5,0,0,3658909.3,0,0,3783379.6,0,0,3810385,0,0,3623831.1,0,0,3783486.4,0,0,3769920.5,0,0,3571457.2,0,0,3783576.5,0,0,3715901.2,0,0,3501797.4};
+VT(0.03928574,0.29335694,0,0.045931579,0.29422002,0,0.042857143,0.3,0){0,0,127378.94,0,0,116468.36,0,0,0,0,0,-381522.06,0,0,-348980.73,0,0,0,0,0,633829.06,0,0,580225.36,0,0,0,0,0,-883092.25,0,0,-809364.6,0,0,0,0,0,1127859.7,0,0,1035478,0,0,0};
+VT(0.030217898,0.25971254,0,0.027951851,0.26533243,0,0.021957304,0.26060316,0){0,0,660621.26,0,0,539100.43,0,0,505833.44,0,0,-1866014.4,0,0,-1547025.6,0,0,-1432636.8,0,0,2744196,0,0,2353298.6,0,0,2119105.6,0,0,-3141188.1,0,0,-2852826.8,0,0,-2450095.8,0,0,2987009.7,0,0,2980285,0,0,2369995.8};
+VT(0.091053567,0.10618538,0,0.086838536,0.10220901,0,0.09416017,0.099511923,0){0,0,914271.31,0,0,1341203.8,0,0,613994.66,0,0,-104388.15,0,0,-54099.381,0,0,5422.3845,0,0,-1006721.9,0,0,-1393108.8,0,0,-608645.22,0,0,-787386.88,0,0,-1282822.5,0,0,-619557.01,0,0,309052.61,0,0,161880.97,0,0,-16415.987};
+VT(0.0045473776,0.2936365,0,0.010662343,0.29482959,0,0.0071428571,0.3,0){0,0,18406.211,0,0,34537.041,0,0,0,0,0,-55138.333,0,0,-103506.64,0,0,0,0,0,91630.552,0,0,172164.12,0,0,0,0,0,-127724.83,0,0,-240303.04,0,0,0,0,0,162961.08,0,0,307518.14,0,0,0};
+VT(0.01093484,0.12117452,0,0.01198914,0.11616091,0,0.017763535,0.12074209,0){0,0,1052666.9,0,0,1171325.2,0,0,1657769.5,0,0,-426753.37,0,0,-358450.6,0,0,-657738.05,0,0,-1306415.4,0,0,-1420119.3,0,0,-2054600.3,0,0,-350052.21,0,0,-627101.02,0,0,-581651.26,0,0,1098212.1,0,0,984768,0,0,1703675.4};
+VT(0.043491003,0.26677795,0,0.034582704,0.26623209,0,0.037705658,0.25939989,0){0,0,657627.62,0,0,604041.77,0,0,758443.36,0,0,-1894105.9,0,0,-1737386.1,0,0,-2140288.6,0,0,2903724.9,0,0,2655775,0,0,3141072.6,0,0,-3565612.1,0,0,-3245580.1,0,0,-3582615.2,0,0,3800401.2,0,0,3433603.3,0,0,3385872.9};
+VT(0.0071428571,0,0,0.010679145,0.0052482016,0,0.0045481906,0.0063920675,0){0,0,863498.79,0,0,1277155.8,0,0,552257.15,0,0,863505.11,0,0,1273289.3,0,0,549810.55,0,0,863516.31,0,0,1265566.3,0,0,544927.47,0,0,863538.53,0,0,1254019.7,0,0,537633.65,0,0,863596.62,0,0,1238493.9,0,0,527798.54};
+VT(0.020636298,0.17424253,0,0.014405512,0.17061143,0,0.020973714,0.16688371,0){0,0,1433869.3,0,0,1063653,0,0,1525118.3,0,0,-2154082.5,0,0,-1519257.6,0,0,-2061659.5,0,0,-351921.61,0,0,-412907.51,0,0,-799875.51,0,0,2330929.4,0,0,1696192.6,0,0,2343184.8,0,0,-819073.82,0,0,-313907.63,0,0,-24581.749};
+VT(0.018422519,0.27450763,0,0.025044032,0.27464897,0,0.023483408,0.28013687,0){0,0,282501.19,0,0,363665.57,0,0,270985.88,0,0,-827496.14,0,0,-1065519.5,0,0,-801278.39,0,0,1313896,0,0,1692735.8,0,0,1297043.7,0,0,-1707268.8,0,0,-2201379.5,0,0,-1736920.8,0,0,1979556.1,0,0,2555652.6,0,0,2101746.5};
+VT(0.0061411468,0.1246533,0,0.0062042788,0.11791514,0,0.01093484,0.12117452,0){0,0,591118.91,0,0,612847.32,0,0,1052666.9,0,0,-280990.71,0,0,-208741.13,0,0,-426753.37,0,0,-738586.84,0,0,-750565.55,0,0,-1306415.4,0,0,-106527.54,0,0,-286207.66,0,0,-350052.21,0,0,682629.18,0,0,561848.67,0,0,1098212.1};
+VT(0.042557423,0.10832344,0,0.039702853,0.10111678,0,0.047385855,0.10193045,0){0,0,3183930.6,0,0,3175586.8,0,0,3329666.7,0,0,-492142.06,0,0,-64516.934,0,0,-117239.93,0,0,-3600076,0,0,-3238866.3,0,0,-3442848.4,0,0,-2551523.2,0,0,-3108635.2,0,0,-3204510.9,0,0,1442840.6,0,0,193445.51,0,0,350991.89};
+VT(0.0081152275,0.10988635,0,0.0062042788,0.11791514,0,0,0.11428571,0){0,0,821145.89,0,0,612847.32,0,0,0,0,0,-151361.79,0,0,-208741.13,0,0,0,0,0,-944689.8,0,0,-750565.55,0,0,0,0,0,-619246.83,0,0,-286207.66,0,0,0,0,0,439508.43,0,0,561848.67,0,0,0};
+VT(0.067728608,0.12931058,0,0.059246105,0.12763558,0,0.064276416,0.12183086,0){0,0,2567539,0,0,2918223.5,0,0,2809128.6,0,0,-1463631.5,0,0,-1563762.3,0,0,-1175750.5,0,0,-3196956.5,0,0,-3644117.3,0,0,-3492840.6,0,0,89062.443,0,0,-127593.52,0,0,-855220.15,0,0,3235608.2,0,0,3585046,0,0,2995580.4};
+VT(0.0079950318,0.059686314,0,0.004777904,0.053197076,0,0.0094132111,0.052421332,0){0,0,917766.47,0,0,557925.04,0,0,1088603.4,0,0,570756.35,0,0,389224.92,0,0,768702.62,0,0,7912.4367,0,0,102822.82,0,0,222919.17,0,0,-557994.72,0,0,-214698.3,0,0,-388347.22,0,0,-913265.38,0,0,-467537.22,0,0,-885762.83};
+VT(0.064276416,0.12183086,0,0.062195955,0.11505156,0,0.069025318,0.11622387,0){0,0,2809128.6,0,0,2965673.8,0,0,2631986.5,0,0,-1175750.5,0,0,-843057.19,0,0,-808686.45,0,0,-3492840.6,0,0,-3569130.8,0,0,-3192250.9,0,0,-855220.15,0,0,-1711501.2,0,0,-1402768.4,0,0,2995580.4,0,0,2344130.4,0,0,2220554.1};
+VT(0.057323957,0.1204315,0,0.062195955,0.11505156,0,0.064276416,0.12183086,0){0,0,3051716.5,0,0,2965673.8,0,0,2809128.6,0,0,-1191883,0,0,-843057.19,0,0,-1175750.5,0,0,-3778168.4,0,0,-3569130.8,0,0,-3492840.6,0,0,-1110713.1,0,0,-1711501.2,0,0,-855220.15,0,0,3101303,0,0,2344130.4,0,0,2995580.4};
+VT(0.073684623,0.0112317,0,0.074656208,0.0053403125,0,0.081119523,0.0085521597,0){0,0,2850123.3,0,0,2772385.5,0,0,2167108.8,0,0,2810738.2,0,0,2763721.5,0,0,2149779.2,0,0,2732509.2,0,0,2746414.1,0,0,2115263.6,0,0,2616540.6,0,0,2720533.7,0,0,2063869.7,0,0,2464223.2,0,0,2685936.9,0,0,1995657.9};
+VT(0.081165886,0.29137431,0,0.074657371,0.29452352,0,0.073754091,0.28851618,0){0,0,97729.953,0,0,79525.554,0,0,171229.59,0,0,-292395.17,0,0,-238312.39,0,0,-511212.67,0,0,484687.71,0,0,396309.36,0,0,843808.82,0,0,-673055.06,0,0,-552992.95,0,0,-1164215.8,0,0,855744.16,0,0,707611.71,0,0,1467609.3};
+VT(0.064276416,0.12183086,0,0.070840483,0.12204614,0,0.067728608,0.12931058,0){0,0,2809128.6,0,0,2470738.2,0,0,2567539,0,0,-1175750.5,0,0,-1044803.2,0,0,-1463631.5,0,0,-3492840.6,0,0,-3073782.1,0,0,-3196956.5,0,0,-855220.15,0,0,-729197.53,0,0,89062.443,0,0,2995580.4,0,0,2652961,0,0,3235608.2};
+VT(0.058212185,0.089881183,0,0.052532368,0.096036702,0,0.049739958,0.088394034,0){0,0,3344291.6,0,0,3389506.1,0,0,3472240.4,0,0,593905.21,0,0,240670.51,0,0,703521.31,0,0,-2645013.4,0,0,-3131818.5,0,0,-2626240.1,0,0,-3708817.1,0,0,-3594959.1,0,0,-3862017.3,0,0,-1722713.3,0,0,-718569.73,0,0,-2018648.2};
+VT(0.017433092,0.042090914,0,0.013132659,0.04767246,0,0.011573719,0.041901165,0){0,0,1971771.3,0,0,1507774.2,0,0,1347025.1,0,0,1594855,0,0,1139737.5,0,0,1091815.8,0,0,913057.13,0,0,493500.09,0,0,629744.45,0,0,56690.05,0,0,-273193.01,0,0,48353.226,0,0,-810753.02,0,0,-973395.4,0,0,-542301.86};
+VT(0.042155309,0.15589067,0,0.034314476,0.15645926,0,0.037897724,0.149701,0){0,0,2577776.2,0,0,2334400.9,0,0,2552043.8,0,0,-2895603.6,0,0,-2649968.2,0,0,-2536068.8,0,0,-2220826.4,0,0,-1976247.7,0,0,-2567975.2,0,0,3169529.7,0,0,2917237.1,0,0,2520076,0,0,1830012,0,0,1581967.4,0,0,2583694.6};
+VT(0.038427921,0.16264679,0,0.034314476,0.15645926,0,0.042155309,0.15589067,0){0,0,2389351.9,0,0,2334400.9,0,0,2577776.2,0,0,-3020403.6,0,0,-2649968.2,0,0,-2895603.6,0,0,-1591681.4,0,0,-1976247.7,0,0,-2220826.4,0,0,3440909.6,0,0,2917237.1,0,0,3169529.7,0,0,682723.32,0,0,1581967.4,0,0,1830012};
+VT(0.044666369,0.11545829,0,0.040442009,0.11996282,0,0.038084092,0.1145524,0){0,0,3148096.1,0,0,2999410,0,0,2981407.2,0,0,-920013.3,0,0,-1143461.2,0,0,-818508.93,0,0,-3799301.5,0,0,-3706983.7,0,0,-3575257.7,0,0,-1769018.1,0,0,-1150363.3,0,0,-1775238,0,0,2547335.8,0,0,2995190.5,0,0,2287308.3};
+VT(0.041002292,0.08644635,0,0.047307891,0.081963043,0,0.049739958,0.088394034,0){0,0,3351345,0,0,3516083,0,0,3472240.4,0,0,787437.3,0,0,1080946.4,0,0,703521.31,0,0,-2379027.1,0,0,-2102837.3,0,0,-2626240.1,0,0,-3725698.5,0,0,-3830300,0,0,-3862017.3,0,0,-2222336.9,0,0,-2905310.5,0,0,-2018648.2};
+VT(0.09156348,0.14589395,0,0.093938974,0.13899,0,0.1,0.14285714,0){0,0,734092.88,0,0,548364.78,0,0,0,0,0,-670961.7,0,0,-422206.84,0,0,0,0,0,-791796.8,0,0,-645591.08,0,0,0,0,0,602866.55,0,0,273728.87,0,0,0,0,0,843431.47,0,0,708600.91,0,0,0};
+VT(0.1,0.12857143,0,0.093823791,0.12410599,0,0.1,0.12142857,0){0,0,0,0,0,595735.92,0,0,0,0,0,0,0,0,-276601.23,0,0,0,0,0,0,0,0,-743959.63,0,0,0,0,0,0,0,0,-121937.8,0,0,0,0,0,0,0,0,678759.2,0,0,0};
+VT(0.080938662,0.054906318,0,0.073604017,0.054819307,0,0.077364239,0.048764008,0){0,0,2097661.4,0,0,2744584.6,0,0,2450679,0,0,1423084,0,0,1864679.8,0,0,1825420.5,0,0,290856.94,0,0,386939.94,0,0,734405.59,0,0,-934922.56,0,0,-1214908.7,0,0,-544039.45,0,0,-1860365.1,0,0,-2427603.9,0,0,-1683943.8};
+VT(0.082942949,0.21818591,0,0.084319616,0.22565969,0,0.076796159,0.2234596,0){0,0,823054.75,0,0,696453.76,0,0,1008421.8,0,0,-1901094.8,0,0,-1688204.7,0,0,-2411357.4,0,0,1667014.3,0,0,1707540.6,0,0,2346331.8,0,0,-282341.7,0,0,-743250.94,0,0,-852928.84,0,0,-1297502.9,0,0,-649719.93,0,0,-1160000.7};
+VT(0.1,0.27142857,0,0.092520768,0.26920591,0,0.1,0.26428571,0){0,0,0,0,0,145042.72,0,0,0,0,0,0,0,0,-420173.4,0,0,0,0,0,0,0,0,651988.34,0,0,0,0,0,0,0,0,-816598.86,0,0,0,0,0,0,0,0,896908.09,0,0,0};
+VT(0.1,0.035714286,0,0.092450683,0.030760689,0,0.1,0.028571429,0){0,0,0,0,0,900007.85,0,0,0,0,0,0,0,0,807431.66,0,0,0,0,0,0,0,0,631804.95,0,0,0,0,0,0,0,0,391202.83,0,0,0,0,0,0,0,0,110124.82,0,0,0};
+VT(0.045416206,0.061541227,0,0.042113175,0.053290167,0,0.048663579,0.053435419,0){0,0,3642820.9,0,0,3616583.4,0,0,3726394.8,0,0,2181474.8,0,0,2519252.9,0,0,2589713.3,0,0,-155055.51,0,0,657513.67,0,0,663071.82,0,0,-2429600.5,0,0,-1403801.4,0,0,-1465861.1,0,0,-3730025.8,0,0,-3039615.4,0,0,-3147918.6};
+VT(0.038435934,0.058364632,0,0.042113175,0.053290167,0,0.045416206,0.061541227,0){0,0,3459248.5,0,0,3616583.4,0,0,3642820.9,0,0,2206750.4,0,0,2519252.9,0,0,2181474.8,0,0,155241.86,0,0,657513.67,0,0,-155055.51,0,0,-1952496,0,0,-1403801.4,0,0,-2429600.5,0,0,-3353689.4,0,0,-3039615.4,0,0,-3730025.8};
+VT(0.0528723,0.26429657,0,0.055001581,0.27169863,0,0.049721881,0.27094787,0){0,0,718299.05,0,0,565900.8,0,0,588018.61,0,0,-2055661.9,0,0,-1648356.5,0,0,-1710042.9,0,0,3109067.1,0,0,2587095.5,0,0,2675009.8,0,0,-3733060,0,0,-3300283.2,0,0,-3394309,0,0,3841282.5,0,0,3725567.5,0,0,3801713.7};
+VT(0.082516133,0.27647665,0,0.086077973,0.27164165,0,0.089232651,0.27618677,0){0,0,248899.48,0,0,243157.03,0,0,160151.6,0,0,-731674.12,0,0,-708191.99,0,0,-470555.02,0,0,1170289.2,0,0,1111255.9,0,0,751874.95,0,0,-1538273.3,0,0,-1417072.6,0,0,-986723.61,0,0,1813237.5,0,0,1598582.9,0,0,1160401.4};
+VT(0.089183466,0.023798504,0,0.085916752,0.02828,0,0.082332164,0.023444943,0){0,0,1283383.3,0,0,1643257.2,0,0,2029600,0,0,1204105.7,0,0,1500211.7,0,0,1907886.4,0,0,1050439.6,0,0,1226559.7,0,0,1671751.1,0,0,831874.08,0,0,846114.35,0,0,1335359.8,0,0,561630.79,0,0,391827.49,0,0,918760.81};
+VT(0.079063451,0.10043005,0,0.086838536,0.10220901,0,0.082583958,0.10907049,0){0,0,2051820.1,0,0,1341203.8,0,0,1698614.9,0,0,-16056.497,0,0,-54099.381,0,0,-286603.09,0,0,-2067914.3,0,0,-1393108.8,0,0,-1936849,0,0,-2035845.1,0,0,-1282822.5,0,0,-1323464.6,0,0,48244.512,0,0,161880.97,0,0,836522.31};
+VT(0.059543685,0.10776494,0,0.06715469,0.10983132,0,0.062195955,0.11505156,0){0,0,3132791.5,0,0,2794834,0,0,2965673.8,0,0,-451048.14,0,0,-512277.78,0,0,-843057.19,0,0,-3519016.9,0,0,-3213264.7,0,0,-3569130.8,0,0,-2561357.9,0,0,-2112070.8,0,0,-1711501.2,0,0,1326599.2,0,0,1488257.3,0,0,2344130.4};
+VT(0.011838853,0.2301677,0,0.0069516057,0.23320895,0,0.0069979116,0.22643766,0){0,0,504229.49,0,0,288078.49,0,0,317964.48,0,0,-1254859.2,0,0,-728952.19,0,0,-774386.26,0,0,1363834.1,0,0,827497.2,0,0,793599.18,0,0,-775392.51,0,0,-537397.4,0,0,-364658.79,0,0,-209768.04,0,0,-5267.3055,0,0,-270536.88};
+VT(0.070477538,0.15360968,0,0.076625322,0.14929356,0,0.077069107,0.15686929,0){0,0,2153625.7,0,0,1845555.4,0,0,1743907.9,0,0,-2316413.6,0,0,-1818255.1,0,0,-1994600,0,0,-1978592.7,0,0,-1872475.3,0,0,-1457243.4,0,0,2466066.8,0,0,1790618.2,0,0,2204191.1,0,0,1792310.4,0,0,1898765.5,0,0,1140253.2};
+VT(0.09123018,0.070922096,0,0.095795895,0.073622969,0,0.091953893,0.078440357,0){0,0,983713.53,0,0,473503.74,0,0,889726.23,0,0,465586.72,0,0,205720.2,0,0,322434.75,0,0,-297764.17,0,0,-178405.32,0,0,-450550.32,0,0,-904277.98,0,0,-461642.03,0,0,-936443.15,0,0,-1034644.8,0,0,-483922.03,0,0,-825354.72};
+VT(0.041057987,0.068843254,0,0.041803352,0.076750149,0,0.033874053,0.071548869,0){0,0,3488848.8,0,0,3453761.9,0,0,3157862.8,0,0,1752771.3,0,0,1340279.2,0,0,1466537.3,0,0,-855539,0,0,-1593440.1,0,0,-1010259.7,0,0,-3038218.5,0,0,-3552303.7,0,0,-2946084.6,0,0,-3709409.4,0,0,-3337911.6,0,0,-3304540.6};
+VT(0.075422073,0.20645372,0,0.081922129,0.20489902,0,0.081656406,0.2108727,0){0,0,1273700.5,0,0,996952.98,0,0,951384.03,0,0,-2693470,0,0,-2081157.6,0,0,-2083808.1,0,0,1728669,0,0,1266338.6,0,0,1528962.6,0,0,766631.5,0,0,704044.3,0,0,263916.4,0,0,-2583646.6,0,0,-2032271.3,0,0,-1843401};
+VT(0.084206466,0.24009781,0,0.084619556,0.23283838,0,0.092168655,0.23668616,0){0,0,569988.38,0,0,621044.17,0,0,307607.26,0,0,-1492933.9,0,0,-1568398.7,0,0,-792496.69,0,0,1847439,0,0,1771426.2,0,0,941630.33,0,0,-1498530.8,0,0,-1133733.9,0,0,-691810.02,0,0,578923.58,0,0,-42283.716,0,0,148523.72};
+VT(0.092168655,0.23668616,0,0.084619556,0.23283838,0,0.09071018,0.22887426,0){0,0,307607.26,0,0,621044.17,0,0,406264.77,0,0,-792496.69,0,0,-1568398.7,0,0,-1003622.2,0,0,941630.33,0,0,1771426.2,0,0,1069446.3,0,0,-691810.02,0,0,-1133733.9,0,0,-568907.82,0,0,148523.72,0,0,-42283.716,0,0,-233040.27};
+VT(0.071000103,0.28243589,0,0.078222118,0.28277283,0,0.073754091,0.28851618,0){0,0,281581.81,0,0,220930.92,0,0,171229.59,0,0,-835250.62,0,0,-655625.13,0,0,-511212.67,0,0,1360764.9,0,0,1069057.6,0,0,843808.82,0,0,-1840418.5,0,0,-1447830.3,0,0,-1164215.8,0,0,2257916.8,0,0,1779434.3,0,0,1467609.3};
+VT(0.073684623,0.0112317,0,0.078020383,0.017034313,0,0.070691378,0.017050195,0){0,0,2850123.3,0,0,2461848.1,0,0,3076870.7,0,0,2810738.2,0,0,2383750.6,0,0,2979073.3,0,0,2732509.2,0,0,2230032.5,0,0,2786592,0,0,2616540.6,0,0,2005590.6,0,0,2505581.5,0,0,2464223.2,0,0,1717239.5,0,0,2144710.8};
+VT(0.028678488,0.042143634,0,0.022876349,0.043626948,0,0.023478597,0.036718106,0){0,0,2968313.4,0,0,2488553.5,0,0,2561783.8,0,0,2399521.8,0,0,1978130.3,0,0,2187675.4,0,0,1370917.4,0,0,1061959.9,0,0,1494080.3,0,0,79587.615,0,0,-72059.632,0,0,582277.59,0,0,-1227272.3,0,0,-1191549.5,0,0,-414804.14};
+VT(0.053497526,0.1329974,0,0.059246105,0.12763558,0,0.060672554,0.13561545,0){0,0,2959143.9,0,0,2918223.5,0,0,2778852.8,0,0,-1911000.9,0,0,-1563762.3,0,0,-1944873,0,0,-3636096,0,0,-3644117.3,0,0,-3362653.4,0,0,623103.97,0,0,-127593.52,0,0,935707.85,0,0,3857035.6,0,0,3585046,0,0,3643681.7};
+VT(0.087083587,0.13880919,0,0.093938974,0.13899,0,0.09156348,0.14589395,0){0,0,1144744.3,0,0,548364.78,0,0,734092.88,0,0,-877072.07,0,0,-422206.84,0,0,-670961.7,0,0,-1349889.8,0,0,-645591.08,0,0,-791796.8,0,0,561444.4,0,0,273728.87,0,0,602866.55,0,0,1481228.8,0,0,708600.91,0,0,843431.47};
+VT(0.054957014,0.24657048,0,0.049037582,0.25027532,0,0.047556344,0.24377674,0){0,0,1058545,0,0,998508.07,0,0,1122639.4,0,0,-2852831,0,0,-2730849.8,0,0,-2989881.7,0,0,3777171.8,0,0,3739350.2,0,0,3850350.4,0,0,-3549694.2,0,0,-3756698.7,0,0,-3414324.1,0,0,2239441.1,0,0,2778087.3,0,0,1828478.4};
+VT(0.06771074,0.1881525,0,0.07206248,0.1830344,0,0.076430303,0.18837043,0){0,0,1821405.7,0,0,1716055.3,0,0,1444535.6,0,0,-3238423,0,0,-2879815.5,0,0,-2574453.4,0,0,698008.36,0,0,236909.5,0,0,569102.25,0,0,2695511.5,0,0,2719220.1,0,0,2129625.3,0,0,-2795478.4,0,0,-2081132.3,0,0,-2235391.7};
+VT(0.093571257,0.018380777,0,0.095041081,0.024587994,0,0.089183466,0.023798504,0){0,0,774815.13,0,0,597113.29,0,0,1283383.3,0,0,746204.54,0,0,557751.32,0,0,1204105.7,0,0,690036.86,0,0,481620.22,0,0,1050439.6,0,0,608388.09,0,0,373740.48,0,0,831874.08,0,0,504051.02,0,0,241099.33,0,0,561630.79};
+VT(0.089232651,0.27618677,0,0.095069321,0.27540052,0,0.093593186,0.28160993,0){0,0,160151.6,0,0,76899.446,0,0,74588.283,0,0,-470555.02,0,0,-225624.71,0,0,-221009.65,0,0,751874.95,0,0,359465.9,0,0,359269.18,0,0,-986723.61,0,0,-469594.27,0,0,-484261.41,0,0,1160401.4,0,0,548580.83,0,0,591230.88};
+VT(0.017861336,0.10270337,0,0.019165757,0.095107709,0,0.024938414,0.098415267,0){0,0,1773538.4,0,0,1930971.9,0,0,2383058.5,0,0,-87655.931,0,0,168744.63,0,0,68195.72,0,0,-1856823.6,0,0,-1747493.7,0,0,-2312962.3,0,0,-1677437.3,0,0,-2069009.1,0,0,-2447461.4,0,0,261812.45,0,0,-502664.26,0,0,-204726.33};
+VT(0.082583958,0.10907049,0,0.076969725,0.10634022,0,0.079063451,0.10043005,0){0,0,1698614.9,0,0,2181001.1,0,0,2051820.1,0,0,-286603.09,0,0,-255488.75,0,0,-16056.497,0,0,-1936849,0,0,-2406546.5,0,0,-2067914.3,0,0,-1323464.6,0,0,-1869163.7,0,0,-2035845.1,0,0,836522.31,0,0,756176.24,0,0,48244.512};
+VT(0.020473685,0.087577432,0,0.01318623,0.084416193,0,0.019499739,0.079597209,0){0,0,2087024.2,0,0,1411871.7,0,0,2040354.6,0,0,451292.51,0,0,378554.62,0,0,702945.71,0,0,-1538224.3,0,0,-931831.12,0,0,-1095289.5,0,0,-2322280.1,0,0,-1560266,0,0,-2175701.2,0,0,-1286407.6,0,0,-1046999.7,0,0,-1830384.7};
+VT(0.087331535,0.0958472,0,0.086838536,0.10220901,0,0.079063451,0.10043005,0){0,0,1318484.3,0,0,1341203.8,0,0,2051820.1,0,0,98077.228,0,0,-54099.381,0,0,-16056.497,0,0,-1213131.9,0,0,-1393108.8,0,0,-2067914.3,0,0,-1401481.2,0,0,-1282822.5,0,0,-2035845.1,0,0,-292629.72,0,0,161880.97,0,0,48244.512};
+VT(0.019247887,0.048569646,0,0.013132659,0.04767246,0,0.017433092,0.042090914,0){0,0,2135187.8,0,0,1507774.2,0,0,1971771.3,0,0,1594654.5,0,0,1139737.5,0,0,1594855,0,0,650408.09,0,0,493500.09,0,0,913057.13,0,0,-458538.7,0,0,-273193.01,0,0,56690.05,0,0,-1451674.1,0,0,-973395.4,0,0,-810753.02};
+VT(0.071000103,0.28243589,0,0.06660802,0.27624666,0,0.074931673,0.27468874,0){0,0,281581.81,0,0,417349.44,0,0,363389.18,0,0,-835250.62,0,0,-1226359.7,0,0,-1064791.9,0,0,1360764.9,0,0,1959900.4,0,0,1691857.9,0,0,-1840418.5,0,0,-2572844.1,0,0,-2200836.4,0,0,2257916.8,0,0,3027289.2,0,0,2556129.1};
+VT(0.076796159,0.2234596,0,0.084319616,0.22565969,0,0.078984823,0.22953004,0){0,0,1008421.8,0,0,696453.76,0,0,858343.29,0,0,-2411357.4,0,0,-1688204.7,0,0,-2128428.8,0,0,2346331.8,0,0,1707540.6,0,0,2291087.1,0,0,-852928.84,0,0,-743250.94,0,0,-1261656.1,0,0,-1160000.7,0,0,-649719.93,0,0,-424553.92};
+VT(0.087083587,0.13880919,0,0.081009521,0.1385969,0,0.083559522,0.13424014,0){0,0,1144744.3,0,0,1630909.4,0,0,1462145.4,0,0,-877072.07,0,0,-1242340.3,0,0,-981746.52,0,0,-1349889.8,0,0,-1926924,0,0,-1784737.2,0,0,561444.4,0,0,783271.16,0,0,395362.65,0,0,1481228.8,0,0,2113542.9,0,0,1914407.3};
+VT(0,0.057142857,0,0.004777904,0.053197076,0,0.0079950318,0.059686314,0){0,0,0,0,0,557925.04,0,0,917766.47,0,0,0,0,0,389224.92,0,0,570756.35,0,0,0,0,0,102822.82,0,0,7912.4367,0,0,0,0,0,-214698.3,0,0,-557994.72,0,0,0,0,0,-467537.22,0,0,-913265.38};
+VT(0.0079950318,0.059686314,0,0.0062494098,0.068021592,0,0,0.064285714,0){0,0,917766.47,0,0,709501.16,0,0,0,0,0,570756.35,0,0,364477.97,0,0,0,0,0,7912.4367,0,0,-157824.6,0,0,0,0,0,-557994.72,0,0,-603457.47,0,0,0,0,0,-913265.38,0,0,-756039.79,0,0,0};
+VT(0.041057987,0.068843254,0,0.047469022,0.070467195,0,0.041803352,0.076750149,0){0,0,3488848.8,0,0,3608010.8,0,0,3453761.9,0,0,1752771.3,0,0,1730907.5,0,0,1340279.2,0,0,-855539,0,0,-1046792,0,0,-1593440.1,0,0,-3038218.5,0,0,-3280034.9,0,0,-3552303.7,0,0,-3709409.4,0,0,-3807136.9,0,0,-3337911.6};
+VT(0.0071591483,0.096788703,0,0.0067127961,0.088875219,0,0.013428016,0.091778472,0){0,0,756711.76,0,0,725937.81,0,0,1408980.1,0,0,43634.951,0,0,141227.93,0,0,204626.15,0,0,-710572.63,0,0,-557260.38,0,0,-1174648.8,0,0,-795194.2,0,0,-806944.34,0,0,-1549888.7,0,0,-130859.45,0,0,-406936.37,0,0,-600683.83};
+VT(0.081119523,0.0085521597,0,0.074656208,0.0053403125,0,0.078571429,0,0){0,0,2167108.8,0,0,2772385.5,0,0,2419478.6,0,0,2149779.2,0,0,2763721.5,0,0,2419535.2,0,0,2115263.6,0,0,2746414.1,0,0,2419645.1,0,0,2063869.7,0,0,2720533.7,0,0,2419827.2,0,0,1995657.9,0,0,2685936.9,0,0,2420024.4};
+VT(0.078571429,0.3,0,0.074657371,0.29452352,0,0.081165886,0.29137431,0){0,0,0,0,0,79525.554,0,0,97729.953,0,0,0,0,0,-238312.39,0,0,-292395.17,0,0,0,0,0,396309.36,0,0,484687.71,0,0,0,0,0,-552992.95,0,0,-673055.06,0,0,0,0,0,707611.71,0,0,855744.16};
+VT(0.082332164,0.023444943,0,0.078020383,0.017034313,0,0.085905658,0.016824409,0){0,0,2029600,0,0,2461848.1,0,0,1656238,0,0,1907886.4,0,0,2383750.6,0,0,1604967.9,0,0,1671751.1,0,0,2230032.5,0,0,1504009.2,0,0,1335359.8,0,0,2005590.6,0,0,1356492.3,0,0,918760.81,0,0,1717239.5,0,0,1166855};
+VT(0.08596482,0.28314521,0,0.078222118,0.28277283,0,0.082516133,0.27647665,0){0,0,145967.81,0,0,220930.92,0,0,248899.48,0,0,-433371.98,0,0,-655625.13,0,0,-731674.12,0,0,707326.96,0,0,1069057.6,0,0,1170289.2,0,0,-959333.22,0,0,-1447830.3,0,0,-1538273.3,0,0,1181452.3,0,0,1779434.3,0,0,1813237.5};
+VT(0.072908259,0.24139656,0,0.078142774,0.24370973,0,0.071915087,0.24816524,0){0,0,881474.92,0,0,714639.7,0,0,803363.84,0,0,-2322734,0,0,-1902709.3,0,0,-2179152.4,0,0,2916335.3,0,0,2448578.4,0,0,2928525.2,0,0,-2445637.4,0,0,-2167997.3,0,0,-2836050.6,0,0,1082242,0,0,1155455.3,0,0,1927975};
+VT(0.010955873,0.10281868,0,0.013714026,0.097839388,0,0.017861336,0.10270337,0){0,0,1124212.8,0,0,1412613.2,0,0,1773538.4,0,0,-57954.543,0,0,55008.627,0,0,-87655.931,0,0,-1179275.3,0,0,-1355500.2,0,0,-1856823.6,0,0,-1060620.9,0,0,-1463354,0,0,-1677437.3,0,0,173274.75,0,0,-165174.7,0,0,261812.45};
+VT(0,0.092857143,0,0.0067127961,0.088875219,0,0.0071591483,0.096788703,0){0,0,0,0,0,725937.81,0,0,756711.76,0,0,0,0,0,141227.93,0,0,43634.951,0,0,0,0,0,-557260.38,0,0,-710572.63,0,0,0,0,0,-806944.34,0,0,-795194.2,0,0,0,0,0,-406936.37,0,0,-130859.45};
+VT(0.081656406,0.2108727,0,0.086709216,0.20730703,0,0.089437553,0.21298247,0){0,0,951384.03,0,0,734117.03,0,0,556322.48,0,0,-2083808.1,0,0,-1563285.8,0,0,-1238115.4,0,0,1528962.6,0,0,1031586.7,0,0,961021.23,0,0,263916.4,0,0,398134,0,0,60411.18,0,0,-1843401,0,0,-1481512.9,0,0,-1035404.3};
+VT(0.033761495,0.088496681,0,0.030017634,0.093495078,0,0.027903545,0.087518505,0){0,0,3029395.9,0,0,2771844.6,0,0,2674848,0,0,608605.12,0,0,320378.42,0,0,580994.77,0,0,-2298547.5,0,0,-2414486.4,0,0,-1967676.8,0,0,-3368980,0,0,-3014031.4,0,0,-2976106,0,0,-1747439.7,0,0,-948223.96,0,0,-1655065.1};
+VT(0.073708403,0.21517194,0,0.076796159,0.2234596,0,0.069002793,0.22246209,0){0,0,1225969.3,0,0,1008421.8,0,0,1267491.2,0,0,-2772471.1,0,0,-2411357.4,0,0,-3011719.2,0,0,2271379.1,0,0,2346331.8,0,0,2877058.6,0,0,-92677.622,0,0,-852928.84,0,0,-947533.34,0,0,-2155133.8,0,0,-1160000.7,0,0,-1573376.1};
+VT(0.072126291,0.10515927,0,0.065931692,0.10408722,0,0.069968451,0.098831219,0){0,0,2539730.3,0,0,2911358.9,0,0,2730411,0,0,-241283.81,0,0,-218409.17,0,0,57648.531,0,0,-2758172.2,0,0,-3113407,0,0,-2671597.7,0,0,-2254933.2,0,0,-2661455,0,0,-2785714.6,0,0,717337.89,0,0,651464.78,0,0,-173126.8};
+VT(0.066401409,0.0434645,0,0.073234584,0.04253025,0,0.06961584,0.048915995,0){0,0,3289675.8,0,0,2820532.7,0,0,3063466,0,0,2619840.6,0,0,2270240.9,0,0,2277085.6,0,0,1416557.6,0,0,1277003.9,0,0,906160.93,0,0,-75156.319,0,0,34586.382,0,0,-697426.19,0,0,-1551772,0,0,-1214797.7,0,0,-2122325.6};
+VT(0.06961584,0.048915995,0,0.073234584,0.04253025,0,0.077364239,0.048764008,0){0,0,3063466,0,0,2820532.7,0,0,2450679,0,0,2277085.6,0,0,2270240.9,0,0,1825420.5,0,0,906160.93,0,0,1277003.9,0,0,734405.59,0,0,-697426.19,0,0,34586.382,0,0,-544039.45,0,0,-2122325.6,0,0,-1214797.7,0,0,-1683943.8};
+VT(0.030017634,0.093495078,0,0.024499807,0.092422798,0,0.027903545,0.087518505,0){0,0,2771844.6,0,0,2390452.1,0,0,2674848,0,0,320378.42,0,0,320672.29,0,0,580994.77,0,0,-2414486.4,0,0,-2026771.7,0,0,-1967676.8,0,0,-3014031.4,0,0,-2619357.9,0,0,-2976106,0,0,-948223.96,0,0,-944222.72,0,0,-1655065.1};
+VT(0.079265602,0.086677581,0,0.081743274,0.092625466,0,0.07492972,0.092844339,0){0,0,2114636.1,0,0,1862860,0,0,2431427.6,0,0,488789.06,0,0,243386.47,0,0,308451.38,0,0,-1512904.7,0,0,-1587731,0,0,-2083891.4,0,0,-2351470.6,0,0,-2038652.4,0,0,-2656803.1,0,0,-1382326.1,0,0,-717394.49,0,0,-910298.79};
+VT(0.083969261,0.16737329,0,0.083337094,0.16031526,0,0.088381846,0.16289419,0){0,0,1198489.7,0,0,1295652.6,0,0,911153.68,0,0,-1632158.2,0,0,-1575018.8,0,0,-1156470.7,0,0,-607916.58,0,0,-956036.82,0,0,-599768.12,0,0,1852187.2,0,0,1781183.7,0,0,1317920.1,0,0,-62490.334,0,0,571788.58,0,0,244888.24};
+VT(0,0.071428571,0,0.0060853536,0.074713803,0,0,0.078571429,0){0,0,0,0,0,681675.12,0,0,0,0,0,0,0,0,285253.65,0,0,0,0,0,0,0,0,-277070.48,0,0,0,0,0,0,0,0,-678306.76,0,0,0,0,0,0,0,0,-685312.86,0,0,0};
+VT(0.0068768393,0.16098373,0,0.014502412,0.16316663,0,0.0094805882,0.16707285,0){0,0,553409.29,0,0,1121335,0,0,730151.01,0,0,-680450.71,0,0,-1429592.9,0,0,-989834.58,0,0,-397156.36,0,0,-728363.13,0,0,-378084.11,0,0,771605.48,0,0,1629901.1,0,0,1124284.7,0,0,219690.78,0,0,280110.31,0,0,-22095.939};
+VT(0.09123018,0.070922096,0,0.085646934,0.067722415,0,0.09230899,0.063522919,0){0,0,983713.53,0,0,1585902.9,0,0,877619.52,0,0,465586.72,0,0,821166.94,0,0,503392.8,0,0,-297764.17,0,0,-339583.13,0,0,-85524.836,0,0,-904277.98,0,0,-1336670.3,0,0,-638068.15,0,0,-1034644.8,0,0,-1689538.4,0,0,-918939.46};
+VT(0.09230899,0.063522919,0,0.085646934,0.067722415,0,0.08415119,0.061061125,0){0,0,877619.52,0,0,1585902.9,0,0,1759442.9,0,0,503392.8,0,0,821166.94,0,0,1064240.3,0,0,-85524.836,0,0,-339583.13,0,0,-51487.645,0,0,-638068.15,0,0,-1336670.3,0,0,-1146904.2,0,0,-918939.46,0,0,-1689538.4,0,0,-1789550.6};
+VT(0.035619257,0.12028764,0,0.040442009,0.11996282,0,0.038464606,0.12667013,0){0,0,2821397.9,0,0,2999410,0,0,2859316.3,0,0,-1093830.4,0,0,-1143461.2,0,0,-1476046.2,0,0,-3491178.8,0,0,-3706983.7,0,0,-3573486.5,0,0,-1043884.2,0,0,-1150363.3,0,0,-252868.56,0,0,2851838.9,0,0,2995190.5,0,0,3451249.3};
+VT(0.038464606,0.12667013,0,0.040442009,0.11996282,0,0.045375723,0.12284566,0){0,0,2859316.3,0,0,2999410,0,0,3072436,0,0,-1476046.2,0,0,-1143461.2,0,0,-1348503.3,0,0,-3573486.5,0,0,-3706983.7,0,0,-3829159.4,0,0,-252868.56,0,0,-1150363.3,0,0,-800055.99,0,0,3451249.3,0,0,2995190.5,0,0,3380414.3};
+VT(0.051167355,0.022914381,0,0.054261983,0.029107824,0,0.048866761,0.029559705,0){0,0,3850137.8,0,0,3801269,0,0,3831772.8,0,0,3629520.4,0,0,3450822.2,0,0,3467532.3,0,0,3200919.1,0,0,2782228.4,0,0,2773676.3,0,0,2588908.3,0,0,1857139.4,0,0,1816186,0,0,1828396.4,0,0,760852.59,0,0,685852.4};
+VT(0,0.15714286,0,0.0056981356,0.15371602,0,0.0068768393,0.16098373,0){0,0,0,0,0,478995.44,0,0,553409.29,0,0,0,0,0,-516269.88,0,0,-680450.71,0,0,0,0,0,-438816.38,0,0,-397156.36,0,0,0,0,0,550400.04,0,0,771605.48,0,0,0,0,0,395913.98,0,0,219690.78};
+VT(0.029380008,0.16405835,0,0.036146522,0.16944297,0,0.030623168,0.1713445,0){0,0,2021292.5,0,0,2222447.1,0,0,1985985.4,0,0,-2614335.2,0,0,-3121229.8,0,0,-2866418.8,0,0,-1254306.4,0,0,-960241.74,0,0,-715248.18,0,0,2982541.3,0,0,3509731.4,0,0,3183566.3,0,0,378860.61,0,0,-459324.98,0,0,-696442.05};
+VT(0.038427921,0.16264679,0,0.036146522,0.16944297,0,0.029380008,0.16405835,0){0,0,2389351.9,0,0,2222447.1,0,0,2021292.5,0,0,-3020403.6,0,0,-3121229.8,0,0,-2614335.2,0,0,-1591681.4,0,0,-960241.74,0,0,-1254306.4,0,0,3440909.6,0,0,3509731.4,0,0,2982541.3,0,0,682723.32,0,0,-459324.98,0,0,378860.61};
+VT(0.057707972,0.025075094,0,0.054261983,0.029107824,0,0.051167355,0.022914381,0){0,0,3734947.8,0,0,3801269,0,0,3850137.8,0,0,3478918.2,0,0,3450822.2,0,0,3629520.4,0,0,2984396.6,0,0,2782228.4,0,0,3200919.1,0,0,2285289.9,0,0,1857139.4,0,0,2588908.3,0,0,1429238.8,0,0,760852.59,0,0,1828396.4};
+VT(0.033039341,0.023173825,0,0.029163144,0.015558324,0,0.038009007,0.015147577,0){0,0,3318087.9,0,0,3068207,0,0,3597209.6,0,0,3123656.1,0,0,2986953.6,0,0,3506943.3,0,0,2746181,0,0,2826596.5,0,0,3328697.3,0,0,2207795.9,0,0,2591406.1,0,0,3067010.9,0,0,1539940.3,0,0,2287504.7,0,0,2728518.9};
+VT(0.0071428571,0.3,0,0.010662343,0.29482959,0,0.014285714,0.3,0){0,0,0,0,0,34537.041,0,0,0,0,0,0,0,0,-103506.64,0,0,0,0,0,0,0,0,172164.12,0,0,0,0,0,0,0,0,-240303.04,0,0,0,0,0,0,0,0,307518.14,0,0,0};
+VT(0.014285714,0,0,0.010679145,0.0052482016,0,0.0071428571,0,0){0,0,1683701.5,0,0,1277155.8,0,0,863498.79,0,0,1683671.3,0,0,1273289.3,0,0,863505.11,0,0,1683611.9,0,0,1265566.3,0,0,863516.31,0,0,1683542.6,0,0,1254019.7,0,0,863538.53,0,0,1683226,0,0,1238493.9,0,0,863596.62};
+VT(0.0078195435,0.14622426,0,0.0056981356,0.15371602,0,0,0.15,0){0,0,680366.1,0,0,478995.44,0,0,0,0,0,-626541.18,0,0,-516269.88,0,0,0,0,0,-729870.69,0,0,-438816.38,0,0,0,0,0,568744.13,0,0,550400.04,0,0,0,0,0,774663.29,0,0,395913.98,0,0,0};
+VT(0.062195955,0.11505156,0,0.06715469,0.10983132,0,0.069025318,0.11622387,0){0,0,2965673.8,0,0,2794834,0,0,2631986.5,0,0,-843057.19,0,0,-512277.78,0,0,-808686.45,0,0,-3569130.8,0,0,-3213264.7,0,0,-3192250.9,0,0,-1711501.2,0,0,-2112070.8,0,0,-1402768.4,0,0,2344130.4,0,0,1488257.3,0,0,2220554.1};
+VT(0.010955873,0.10281868,0,0.0052460498,0.10332732,0,0.0071591483,0.096788703,0){0,0,1124212.8,0,0,545715.18,0,0,756711.76,0,0,-57954.543,0,0,-33256.292,0,0,43634.951,0,0,-1179275.3,0,0,-576983.54,0,0,-710572.63,0,0,-1060620.9,0,0,-508602.25,0,0,-795194.2,0,0,173274.75,0,0,99155.047,0,0,-130859.45};
+VT(0.059054943,0.066788508,0,0.064846874,0.068845861,0,0.061098586,0.072147464,0){0,0,3499189.3,0,0,3243292.3,0,0,3389933,0,0,1856149.2,0,0,1629296.1,0,0,1545196.6,0,0,-658492.2,0,0,-795531.06,0,0,-1140417.3,0,0,-2864039.1,0,0,-2824516.6,0,0,-3205469.9,0,0,-3725081.1,0,0,-3448034.5,0,0,-3526423.9};
+VT(0.064832361,0.062804408,0,0.064846874,0.068845861,0,0.059054943,0.066788508,0){0,0,3281120.4,0,0,3243292.3,0,0,3499189.3,0,0,1912310.8,0,0,1629296.1,0,0,1856149.2,0,0,-254314.65,0,0,-795531.06,0,0,-658492.2,0,0,-2314932.7,0,0,-2824516.6,0,0,-2864039.1,0,0,-3410309.6,0,0,-3448034.5,0,0,-3725081.1};
+VT(0.016702178,0.061420197,0,0.012193394,0.066188359,0,0.0079950318,0.059686314,0){0,0,1844408.3,0,0,1364188,0,0,917766.47,0,0,1107331.1,0,0,734639.92,0,0,570756.35,0,0,-72241.295,0,0,-233939.49,0,0,7912.4367,0,0,-1222910.6,0,0,-1094586.7,0,0,-557994.72,0,0,-1885264.1,0,0,-1450385,0,0,-913265.38};
+VT(0.029380008,0.16405835,0,0.025851591,0.17077962,0,0.020973714,0.16688371,0){0,0,2021292.5,0,0,1763476.8,0,0,1525118.3,0,0,-2614335.2,0,0,-2524912.6,0,0,-2061659.5,0,0,-1254306.4,0,0,-673288.62,0,0,-799875.51,0,0,2982541.3,0,0,2815714.9,0,0,2343184.8,0,0,378860.61,0,0,-542697.73,0,0,-24581.749};
+VT(0.045331711,0.23557633,0,0.037546984,0.23452457,0,0.041402067,0.22952626,0){0,0,1270563.3,0,0,1205921.7,0,0,1348916.4,0,0,-3255008.9,0,0,-3072707.6,0,0,-3344816,0,0,3813331,0,0,3550700.1,0,0,3600200.4,0,0,-2700862,0,0,-2423829.8,0,0,-1982154,0,0,404484.48,0,0,201013.93,0,0,-667743.82};
+VT(0.018343869,0.21720619,0,0.02301506,0.22157032,0,0.017207343,0.22323305,0){0,0,888277.19,0,0,1025043.6,0,0,781289.63,0,0,-2037897.4,0,0,-2421684.9,0,0,-1865590.4,0,0,1749211,0,0,2274566.1,0,0,1807835.2,0,0,-225952.88,0,0,-677461.35,0,0,-643322.1,0,0,-1457259.1,0,0,-1351813.7,0,0,-915362.92};
+VT(0.02463475,0.21609565,0,0.02301506,0.22157032,0,0.018343869,0.21720619,0){0,0,1153636.1,0,0,1025043.6,0,0,888277.19,0,0,-2626116.1,0,0,-2421684.9,0,0,-2037897.4,0,0,2198315,0,0,2274566.1,0,0,1749211,0,0,-179791.92,0,0,-677461.35,0,0,-225952.88,0,0,-1969098.8,0,0,-1351813.7,0,0,-1457259.1};
+VT(0.077318805,0.23627719,0,0.070607657,0.23670872,0,0.07180958,0.22984275,0){0,0,830868.27,0,0,1007105.3,0,0,1079159.6,0,0,-2136157.9,0,0,-2594870.8,0,0,-2680718.2,0,0,2525048.7,0,0,3083897.2,0,0,2899261.6,0,0,-1830714.2,0,0,-2267120.1,0,0,-1622013.4,0,0,350702.19,0,0,490193.02,0,0,-492395.98};
+VT(0.0071147476,0.24137211,0,0.0043813653,0.24702694,0,0,0.24285714,0){0,0,259907.57,0,0,145794.38,0,0,0,0,0,-684802.64,0,0,-393661.32,0,0,0,0,0,859611.54,0,0,523477.05,0,0,0,0,0,-720499.62,0,0,-496310.62,0,0,0,0,0,317972.39,0,0,320224.07,0,0,0};
+VT(0.079265602,0.086677581,0,0.075872285,0.081656016,0,0.082390534,0.079333541,0){0,0,2114636.1,0,0,2427639,0,0,1865676.5,0,0,488789.06,0,0,758134.07,0,0,650380.91,0,0,-1512904.7,0,0,-1432759.9,0,0,-988603.29,0,0,-2351470.6,0,0,-2638364.3,0,0,-1983689.6,0,0,-1382326.1,0,0,-2029677.1,0,0,-1686881.4};
+VT(0,0.17142857,0,0.0069613667,0.17349451,0,0,0.17857143,0){0,0,0,0,0,517779.21,0,0,0,0,0,0,0,0,-769992.03,0,0,0,0,0,0,0,0,-142713.64,0,0,0,0,0,0,0,0,839532.94,0,0,0,0,0,0,0,0,-266340.1,0,0,0};
+VT(0.038009007,0.015147577,0,0.043829005,0.011024747,0,0.046063037,0.016810165,0){0,0,3597209.6,0,0,3801549.1,0,0,3836060.2,0,0,3506943.3,0,0,3750937.1,0,0,3717529.2,0,0,3328697.3,0,0,3650381.9,0,0,3484126.2,0,0,3067010.9,0,0,3501249.8,0,0,3143090.2,0,0,2728518.9,0,0,3305260.3,0,0,2704667.4};
+VT(0.025221599,0.062165695,0,0.027058874,0.069011929,0,0.01882241,0.070374011,0){0,0,2618029.3,0,0,2727323.5,0,0,2018056.9,0,0,1547191.2,0,0,1363815.9,0,0,970762.8,0,0,-156575.4,0,0,-681543.48,0,0,-580354.6,0,0,-1796512.5,0,0,-2386220.5,0,0,-1830388.5,0,0,-2702051.5,0,0,-2898415.6,0,0,-2130853.3};
+VT(0.077393474,0.16425214,0,0.083337094,0.16031526,0,0.083969261,0.16737329,0){0,0,1650679.7,0,0,1295652.6,0,0,1198489.7,0,0,-2141613.9,0,0,-1575018.8,0,0,-1632158.2,0,0,-1013799.5,0,0,-956036.82,0,0,-607916.58,0,0,2443278.1,0,0,1781183.7,0,0,1852187.2,0,0,287063.28,0,0,571788.58,0,0,-62490.334};
+VT(0.05288218,0.14757716,0,0.054237851,0.14012792,0,0.061244461,0.14481879,0){0,0,2767228.4,0,0,2856617.8,0,0,2643484.5,0,0,-2626819.9,0,0,-2267029,0,0,-2356788.3,0,0,-2900596.1,0,0,-3324577.4,0,0,-2899198.4,0,0,2479722.6,0,0,1580891.3,0,0,2042509.4,0,0,3026446,0,0,3650971.5,0,0,3121060.9};
+VT(0.047918899,0.14257657,0,0.054237851,0.14012792,0,0.05288218,0.14757716,0){0,0,2842478.3,0,0,2856617.8,0,0,2767228.4,0,0,-2400971.6,0,0,-2267029,0,0,-2626819.9,0,0,-3215455,0,0,-3324577.4,0,0,-2900596.1,0,0,1901551.7,0,0,1580891.3,0,0,2479722.6,0,0,3510918.5,0,0,3650971.5,0,0,3026446};
+VT(0.026018946,0.14387862,0,0.022775714,0.15147437,0,0.017312959,0.14496605,0){0,0,2064539,0,0,1786181.8,0,0,1456929,0,0,-1800072.3,0,0,-1841345.2,0,0,-1303417.8,0,0,-2295230.1,0,0,-1729359.8,0,0,-1594293.7,0,0,1506177.8,0,0,1894858,0,0,1135517.7,0,0,2488196.2,0,0,1670732.8,0,0,1713822.2};
+VT(0,0.042857143,0,0.0064812773,0.046734878,0,0,0.05,0){0,0,0,0,0,761350.4,0,0,0,0,0,0,0,0,582610.88,0,0,0,0,0,0,0,0,267082.8,0,0,0,0,0,0,0,0,-111174.21,0,0,0,0,0,0,0,0,-463416.67,0,0,0};
+VT(0.024008584,0.022367291,0,0.029163144,0.015558324,0,0.033039341,0.023173825,0){0,0,2639060.6,0,0,3068207,0,0,3318087.9,0,0,2494948.4,0,0,2986953.6,0,0,3123656.1,0,0,2214593.6,0,0,2826596.5,0,0,2746181,0,0,1813324.4,0,0,2591406.1,0,0,2207795.9,0,0,1312931.3,0,0,2287504.7,0,0,1539940.3};
+VT(0.053497526,0.1329974,0,0.052058531,0.12554764,0,0.059246105,0.12763558,0){0,0,2959143.9,0,0,3065498.6,0,0,2918223.5,0,0,-1911000.9,0,0,-1512626.5,0,0,-1563762.3,0,0,-3636096,0,0,-3831818,0,0,-3644117.3,0,0,623103.97,0,0,-428428.64,0,0,-127593.52,0,0,3857035.6,0,0,3614977.4,0,0,3585046};
+VT(0.020973714,0.16688371,0,0.014502412,0.16316663,0,0.021502186,0.15931359,0){0,0,1525118.3,0,0,1121335,0,0,1630158.4,0,0,-2061659.5,0,0,-1429592.9,0,0,-1947614.2,0,0,-799875.51,0,0,-728363.13,0,0,-1250943.8,0,0,2343184.8,0,0,1629901.1,0,0,2191316.6,0,0,-24581.749,0,0,280110.31,0,0,824223.66};
+VT(0.083292987,0.24598228,0,0.078142774,0.24370973,0,0.084206466,0.24009781,0){0,0,542685.82,0,0,714639.7,0,0,569988.38,0,0,-1458992.1,0,0,-1902709.3,0,0,-1492933.9,0,0,1920780.7,0,0,2448578.4,0,0,1847439,0,0,-1784182,0,0,-2167997.3,0,0,-1498530.8,0,0,1091638.2,0,0,1155455.3,0,0,578923.58};
+VT(0.039686874,0.0066116125,0,0.043829005,0.011024747,0,0.038009007,0.015147577,0){0,0,3676489.9,0,0,3801549.1,0,0,3597209.6,0,0,3658909.3,0,0,3750937.1,0,0,3506943.3,0,0,3623831.1,0,0,3650381.9,0,0,3328697.3,0,0,3571457.2,0,0,3501249.8,0,0,3067010.9,0,0,3501797.4,0,0,3305260.3,0,0,2728518.9};
+VT(0,0.085714286,0,0.0067127961,0.088875219,0,0,0.092857143,0){0,0,0,0,0,725937.81,0,0,0,0,0,0,0,0,141227.93,0,0,0,0,0,0,0,0,-557260.38,0,0,0,0,0,0,0,0,-806944.34,0,0,0,0,0,0,0,0,-406936.37,0,0,0};
+VT(0.036602132,0.28491153,0,0.043131118,0.28864457,0,0.03928574,0.29335694,0){0,0,279518.56,0,0,225252.57,0,0,127378.94,0,0,-831596.18,0,0,-672574.82,0,0,-381522.06,0,0,1362985.6,0,0,1110400.5,0,0,633829.06,0,0,-1860498.2,0,0,-1532552.2,0,0,-883092.25,0,0,2311728.5,0,0,1932837.8,0,0,1127859.7};
+VT(0.023478597,0.036718106,0,0.021348697,0.029751655,0,0.028359285,0.029784535,0){0,0,2561783.8,0,0,2382657.5,0,0,2981166.2,0,0,2187675.4,0,0,2153252.9,0,0,2693525.9,0,0,1494080.3,0,0,1716520.5,0,0,2145980.7,0,0,582277.59,0,0,1114508.8,0,0,1391347.7,0,0,-414804.14,0,0,404958.41,0,0,502245.34};
+VT(0.014305262,0.26641769,0,0.013885016,0.25805955,0,0.021957304,0.26060316,0){0,0,294901.31,0,0,357160.64,0,0,505833.44,0,0,-848621.76,0,0,-1003688.5,0,0,-1432636.8,0,0,1298521.9,0,0,1459712.7,0,0,2119105.6,0,0,-1589572.3,0,0,-1638678.7,0,0,-2450095.8,0,0,1686004.5,0,0,1506406.6,0,0,2369995.8};
+VT(0.050960377,0.23252058,0,0.056766116,0.23329497,0,0.052478219,0.23860916,0){0,0,1342135.9,0,0,1298096.4,0,0,1222305.6,0,0,-3383651.2,0,0,-3286228.7,0,0,-3178913.4,0,0,3804738.6,0,0,3735031.6,0,0,3866354.4,0,0,-2403721.7,0,0,-2434254.7,0,0,-3010118,0,0,-148681.88,0,0,-7070.0355,0,0,951644.63};
+VT(0.027746664,0.13122119,0,0.033010101,0.13109378,0,0.030046638,0.13690443,0){0,0,2296333.1,0,0,2584208,0,0,2369378.2,0,0,-1399007.9,0,0,-1567613,0,0,-1721516.8,0,0,-2843055.5,0,0,-3200932.4,0,0,-2840145.3,0,0,288094.78,0,0,308418.11,0,0,944948.24,0,0,2955532.6,0,0,3322264.5,0,0,3098367.4};
+VT(0.030046638,0.13690443,0,0.033010101,0.13109378,0,0.038217426,0.13599196,0){0,0,2369378.2,0,0,2584208,0,0,2738753.8,0,0,-1721516.8,0,0,-1567613,0,0,-1938161,0,0,-2840145.3,0,0,-3200932.4,0,0,-3305386.1,0,0,944948.24,0,0,308418.11,0,0,972060.89,0,0,3098367.4,0,0,3322264.5,0,0,3589652.3};
+VT(0.077140734,0.17217741,0,0.072573599,0.16764459,0,0.077393474,0.16425214,0){0,0,1584233.7,0,0,1881427.5,0,0,1650679.7,0,0,-2313491.7,0,0,-2572760.4,0,0,-2141613.9,0,0,-519338.58,0,0,-936075.04,0,0,-1013799.5,0,0,2552719.3,0,0,2916777.1,0,0,2443278.1,0,0,-655929.75,0,0,-135849.37,0,0,287063.28};
+VT(0.071059851,0.17209017,0,0.072573599,0.16764459,0,0.077140734,0.17217741,0){0,0,1900690.4,0,0,1881427.5,0,0,1584233.7,0,0,-2772233.4,0,0,-2572760.4,0,0,-2313491.7,0,0,-629520.98,0,0,-936075.04,0,0,-519338.58,0,0,3060958.1,0,0,2916777.1,0,0,2552719.3,0,0,-774142.34,0,0,-135849.37,0,0,-655929.75};
+VT(0.1,0.22142857,0,0.095652827,0.22622146,0,0.091864029,0.22106993,0){0,0,0,0,0,199039.37,0,0,394005.54,0,0,0,0,0,-484109.58,0,0,-927852.61,0,0,0,0,0,494313.66,0,0,863120.02,0,0,0,0,0,-223837.82,0,0,-241435.16,0,0,0,0,0,-173819.74,0,0,-536498.87};
+VT(0.0067127961,0.088875219,0,0.01318623,0.084416193,0,0.013428016,0.091778472,0){0,0,725937.81,0,0,1411871.7,0,0,1408980.1,0,0,141227.93,0,0,378554.62,0,0,204626.15,0,0,-557260.38,0,0,-931831.12,0,0,-1174648.8,0,0,-806944.34,0,0,-1560266,0,0,-1549888.7,0,0,-406936.37,0,0,-1046999.7,0,0,-600683.83};
+VT(0.034786476,0.1076516,0,0.038084092,0.1145524,0,0.030466665,0.11568191,0){0,0,2912738.3,0,0,2981407.2,0,0,2608170,0,0,-413135.58,0,0,-818508.93,0,0,-773675.45,0,0,-3267374.9,0,0,-3575257.7,0,0,-3152461.4,0,0,-2390915.6,0,0,-1775238,0,0,-1443702.3,0,0,1215377.6,0,0,2287308.3,0,0,2136967.4};
+VT(0.1,0.15714286,0,0.093710586,0.16080643,0,0.09308158,0.15403623,0){0,0,0,0,0,507346.27,0,0,579061.91,0,0,0,0,0,-621948.04,0,0,-628036.95,0,0,0,0,0,-366919.85,0,0,-525997.02,0,0,0,0,0,704920.6,0,0,672596.25,0,0,0,0,0,207593.47,0,0,469080.04};
+VT(0.0071428571,0,0,0.0045481906,0.0063920675,0,0,0,0){0,0,863498.79,0,0,552257.15,0,0,0,0,0,863505.11,0,0,549810.55,0,0,0,0,0,863516.31,0,0,544927.47,0,0,0,0,0,863538.53,0,0,537633.65,0,0,0,0,0,863596.62,0,0,527798.54,0,0,0};
+VT(0,0,0,0.0045481906,0.0063920675,0,0,0.0071428571,0){0,0,0,0,0,552257.15,0,0,0,0,0,0,0,0,549810.55,0,0,0,0,0,0,0,0,544927.47,0,0,0,0,0,0,0,0,537633.65,0,0,0,0,0,0,0,0,527798.54,0,0,0};
+VT(0,0.29285714,0,0.0045473776,0.2936365,0,0,0.3,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0};
+VT(0,0.3,0,0.0045473776,0.2936365,0,0.0071428571,0.3,0){0,0,0,0,0,18406.211,0,0,0,0,0,0,0,0,-55138.333,0,0,0,0,0,0,0,0,91630.552,0,0,0,0,0,0,0,0,-127724.83,0,0,0,0,0,0,0,0,162961.08,0,0,0};
+VT(0.092295863,0.26000779,0,0.095492809,0.25375881,0,0.1,0.25714286,0){0,0,193329.27,0,0,131307.15,0,0,0,0,0,-546576.12,0,0,-363726.6,0,0,0,0,0,805368.84,0,0,512510.07,0,0,0,0,0,-924990.4,0,0,-543451.99,0,0,0,0,0,884724.5,0,0,449348.78,0,0,0};
+VT(0.1,0.042857143,0,0.095360834,0.0462161,0,0.092141527,0.03991184,0){0,0,0,0,0,547145.45,0,0,927649.93,0,0,0,0,0,421466.87,0,0,767955.56,0,0,0,0,0,198977.54,0,0,476054.53,0,0,0,0,0,-69217.008,0,0,102192.68,0,0,0,0,0,-321602.09,0,0,-289378.9};
+VT(0.017861336,0.10270337,0,0.013465065,0.10662372,0,0.010955873,0.10281868,0){0,0,1773538.4,0,0,1351132.7,0,0,1124212.8,0,0,-87655.931,0,0,-165451.82,0,0,-57954.543,0,0,-1856823.6,0,0,-1496410,0,0,-1179275.3,0,0,-1677437.3,0,0,-1147793.4,0,0,-1060620.9,0,0,261812.45,0,0,489093.12,0,0,173274.75};
+VT(0.029690249,0.19362013,0,0.034128539,0.18892309,0,0.036160627,0.1953007,0){0,0,1647856.1,0,0,1872288.6,0,0,1834250.2,0,0,-3101495.4,0,0,-3356683.8,0,0,-3509998.2,0,0,1088093.1,0,0,788949.65,0,0,1372423.7,0,0,2141745.7,0,0,2731311.2,0,0,2256297.6,0,0,-2977851,0,0,-2954777.5,0,0,-3434247.7};
+VT(0.070175425,0.16144206,0,0.065117308,0.15657509,0,0.070477538,0.15360968,0){0,0,2074683.8,0,0,2354870.2,0,0,2153625.7,0,0,-2570674.4,0,0,-2678881.2,0,0,-2316413.6,0,0,-1460177,0,0,-1986291.9,0,0,-1978592.7,0,0,2919916.2,0,0,2952219.2,0,0,2466066.8,0,0,762077.82,0,0,1580034,0,0,1792310.4};
+VT(0.061476805,0.16269562,0,0.065117308,0.15657509,0,0.070175425,0.16144206,0){0,0,2391378.9,0,0,2354870.2,0,0,2074683.8,0,0,-3025373.1,0,0,-2678881.2,0,0,-2570674.4,0,0,-1589341.3,0,0,-1986291.9,0,0,-1460177,0,0,3446908.2,0,0,2952219.2,0,0,2919916.2,0,0,675366.83,0,0,1580034,0,0,762077.82};
+VT(0.016702178,0.061420197,0,0.014691551,0.054118398,0,0.021658338,0.054940441,0){0,0,1844408.3,0,0,1659245.8,0,0,2341024.9,0,0,1107331.1,0,0,1140472.1,0,0,1587273.2,0,0,-72241.295,0,0,265092.56,0,0,322446.89,0,0,-1222910.6,0,0,-693242.8,0,0,-1046241,0,0,-1885264.1,0,0,-1435183.5,0,0,-2078353.5};
+VT(0.029690249,0.19362013,0,0.023309936,0.19197185,0,0.027249449,0.18607819,0){0,0,1647856.1,0,0,1390526.6,0,0,1646413.8,0,0,-3101495.4,0,0,-2573914.4,0,0,-2861109.6,0,0,1088093.1,0,0,799964.88,0,0,464444.42,0,0,2141745.7,0,0,1893175.4,0,0,2518610.9,0,0,-2977851,0,0,-2411477.9,0,0,-2323177.4};
+VT(0.030217898,0.25971254,0,0.033025927,0.25326882,0,0.037705658,0.25939989,0){0,0,660621.26,0,0,809560.38,0,0,758443.36,0,0,-1866014.4,0,0,-2238649.8,0,0,-2140288.6,0,0,2744196,0,0,3142273.3,0,0,3141072.6,0,0,-3141188.1,0,0,-3308331.9,0,0,-3582615.2,0,0,2987009.7,0,0,2697705.3,0,0,3385872.9};
+VT(0.037705658,0.25939989,0,0.033025927,0.25326882,0,0.039157325,0.25334591,0){0,0,758443.36,0,0,809560.38,0,0,884627.38,0,0,-2140288.6,0,0,-2238649.8,0,0,-2446896,0,0,3141072.6,0,0,3142273.3,0,0,3436661.2,0,0,-3582615.2,0,0,-3308331.9,0,0,-3622356.9,0,0,3385872.9,0,0,2697705.3,0,0,2960330.2};
+VT(0.072908259,0.24139656,0,0.070607657,0.23670872,0,0.077318805,0.23627719,0){0,0,881474.92,0,0,1007105.3,0,0,830868.27,0,0,-2322734,0,0,-2594870.8,0,0,-2136157.9,0,0,2916335.3,0,0,3083897.2,0,0,2525048.7,0,0,-2445637.4,0,0,-2267120.1,0,0,-1830714.2,0,0,1082242,0,0,490193.02,0,0,350702.19};
+VT(0.013229009,0.21171696,0,0.0051799073,0.21317882,0,0.007303543,0.20469543,0){0,0,698716.07,0,0,276031.48,0,0,422375.13,0,0,-1540332.8,0,0,-615227.88,0,0,-880191.16,0,0,1156621.3,0,0,479976.29,0,0,531663.92,0,0,147278.69,0,0,25450.705,0,0,303952.91,0,0,-1334554.8,0,0,-511551.59,0,0,-861341.37};
+VT(0.047918899,0.14257657,0,0.045364072,0.14896511,0,0.041319833,0.14315875,0){0,0,2842478.3,0,0,2729630.7,0,0,2735557.7,0,0,-2400971.6,0,0,-2670475.8,0,0,-2343944,0,0,-3215455,0,0,-2787568.3,0,0,-3071175.4,0,0,1901551.7,0,0,2610132.2,0,0,1904337.3,0,0,3510918.5,0,0,2844182.1,0,0,3343927.4};
+VT(0.035714286,0,0,0.031710863,0.0075461758,0,0.028571429,0,0){0,0,3496308.9,0,0,3254919.5,0,0,3033980.1,0,0,3496337.7,0,0,3234618.2,0,0,3033983.4,0,0,3496399.5,0,0,3194153.7,0,0,3033988.7,0,0,3496538.6,0,0,3133832.1,0,0,3034024.4,0,0,3496562.8,0,0,3053845.3,0,0,3033982.5};
+VT(0.028571429,0.3,0,0.031264826,0.29263185,0,0.035714286,0.3,0){0,0,0,0,0,124484.17,0,0,0,0,0,0,0,0,-372709.78,0,0,0,0,0,0,0,0,618717.86,0,0,0,0,0,0,0,0,-861054.65,0,0,0,0,0,0,0,0,1098239.8,0,0,0};
+VT(0.077069107,0.15686929,0,0.083337094,0.16031526,0,0.077393474,0.16425214,0){0,0,1743907.9,0,0,1295652.6,0,0,1650679.7,0,0,-1994600,0,0,-1575018.8,0,0,-2141613.9,0,0,-1457243.4,0,0,-956036.82,0,0,-1013799.5,0,0,2204191.1,0,0,1781183.7,0,0,2443278.1,0,0,1140253.2,0,0,571788.58,0,0,287063.28};
+VT(0.032036001,0.10024616,0,0.030017634,0.093495078,0,0.03690243,0.09394169,0){0,0,2837469.6,0,0,2771844.6,0,0,3135041.5,0,0,-12660.65,0,0,320378.42,0,0,337961.95,0,0,-2850146.6,0,0,-2414486.4,0,0,-2760700,0,0,-2824890.6,0,0,-3014031.4,0,0,-3396384.7,0,0,37524.098,0,0,-948223.96,0,0,-1002139.6};
+VT(0.091953893,0.078440357,0,0.095795895,0.073622969,0,0.1,0.078571429,0){0,0,889726.23,0,0,473503.74,0,0,0,0,0,322434.75,0,0,205720.2,0,0,0,0,0,-450550.32,0,0,-178405.32,0,0,0,0,0,-936443.15,0,0,-461642.03,0,0,0,0,0,-825354.72,0,0,-483922.03,0,0,0};
+VT(0.084206466,0.24009781,0,0.078142774,0.24370973,0,0.077318805,0.23627719,0){0,0,569988.38,0,0,714639.7,0,0,830868.27,0,0,-1492933.9,0,0,-1902709.3,0,0,-2136157.9,0,0,1847439,0,0,2448578.4,0,0,2525048.7,0,0,-1498530.8,0,0,-2167997.3,0,0,-1830714.2,0,0,578923.58,0,0,1155455.3,0,0,350702.19};
+VT(0.021502186,0.15931359,0,0.022775714,0.15147437,0,0.027609688,0.15620978,0){0,0,1630158.4,0,0,1786181.8,0,0,2023546.1,0,0,-1947614.2,0,0,-1841345.2,0,0,-2286520.9,0,0,-1250943.8,0,0,-1729359.8,0,0,-1726415,0,0,2191316.6,0,0,1894858,0,0,2510934.9,0,0,824223.66,0,0,1670732.8,0,0,1400022.9};
+VT(0.0066871595,0.19241823,0,0.005051806,0.19767546,0,0,0.19285714,0){0,0,432113.5,0,0,313084.45,0,0,0,0,0,-803518.34,0,0,-612892.85,0,0,0,0,0,258472.73,0,0,273796.53,0,0,0,0,0,581490.34,0,0,350786.74,0,0,0,0,0,-758588.26,0,0,-609909.8,0,0,0};
+VT(0.013878694,0.17880836,0,0.014405512,0.17061143,0,0.020636298,0.17424253,0){0,0,971566.52,0,0,1063653,0,0,1433869.3,0,0,-1548960.4,0,0,-1519257.6,0,0,-2154082.5,0,0,-51095.574,0,0,-412907.51,0,0,-351921.61,0,0,1579530,0,0,1696192.6,0,0,2330929.4,0,0,-887966.26,0,0,-313907.63,0,0,-819073.82};
+VT(0.02133326,0.24577003,0,0.013821768,0.24617185,0,0.015758122,0.23699049,0){0,0,675269.21,0,0,454053.45,0,0,597291.98,0,0,-1813848.4,0,0,-1221678.8,0,0,-1541119.1,0,0,2383092.9,0,0,1611329.8,0,0,1837947.1,0,0,-2204305.3,0,0,-1502439.1,0,0,-1363109.4,0,0,1333319.6,0,0,928515.88,0,0,315646.37};
+VT(0.049721881,0.27094787,0,0.055001581,0.27169863,0,0.051703203,0.27754162,0){0,0,588018.61,0,0,565900.8,0,0,454636.43,0,0,-1710042.9,0,0,-1648356.5,0,0,-1338881.7,0,0,2675009.8,0,0,2587095.5,0,0,2149437.1,0,0,-3394309,0,0,-3300283.2,0,0,-2841702,0,0,3801713.7,0,0,3725567.5,0,0,3377384.9};
+VT(0.030490983,0.2108424,0,0.036840853,0.20596239,0,0.038843793,0.21103197,0){0,0,1428644.1,0,0,1679916.9,0,0,1637090.1,0,0,-3128471,0,0,-3538121.9,0,0,-3590120.4,0,0,2293671,0,0,2233718.4,0,0,2645890.8,0,0,399562.24,0,0,1067350,0,0,433646.44,0,0,-2769801.9,0,0,-3414669.4,0,0,-3163532.2};
+VT(0.028678488,0.042143634,0,0.030602087,0.036163623,0,0.03663522,0.040674234,0){0,0,2968313.4,0,0,3125169.1,0,0,3463485.9,0,0,2399521.8,0,0,2682310.4,0,0,2844620.6,0,0,1370917.4,0,0,1859340.6,0,0,1717431.6,0,0,79587.615,0,0,772883.67,0,0,283267.24,0,0,-1227272.3,0,0,-423255.99,0,0,-1201989.6};
+VT(0,0.25,0,0.0060491453,0.25298129,0,0,0.25714286,0){0,0,0,0,0,178654.23,0,0,0,0,0,0,0,0,-493529.07,0,0,0,0,0,0,0,0,691183.17,0,0,0,0,0,0,0,0,-724662.05,0,0,0,0,0,0,0,0,585970.08,0,0,0};
+VT(0.024044461,0.20382537,0,0.025476801,0.19755762,0,0.03163445,0.20120488,0){0,0,1283805.9,0,0,1423125.8,0,0,1608414.7,0,0,-2655634.7,0,0,-2782737.9,0,0,-3251875.6,0,0,1553893.8,0,0,1235431.1,0,0,1714266.6,0,0,995311.88,0,0,1602470.1,0,0,1500504,0,0,-2617892.2,0,0,-2766638.2,0,0,-3248047};
+VT(0.065478411,0.24860928,0,0.066600159,0.24211306,0,0.071915087,0.24816524,0){0,0,912058.17,0,0,1004296.2,0,0,803363.84,0,0,-2478342.9,0,0,-2655015,0,0,-2179152.4,0,0,3344041.2,0,0,3359675.2,0,0,2928525.2,0,0,-3264436.9,0,0,-2867211.3,0,0,-2836050.6,0,0,2261773.6,0,0,1352854.8,0,0,1927975};
+VT(0.071915087,0.24816524,0,0.066600159,0.24211306,0,0.072908259,0.24139656,0){0,0,803363.84,0,0,1004296.2,0,0,881474.92,0,0,-2179152.4,0,0,-2655015,0,0,-2322734,0,0,2928525.2,0,0,3359675.2,0,0,2916335.3,0,0,-2836050.6,0,0,-2867211.3,0,0,-2445637.4,0,0,1927975,0,0,1352854.8,0,0,1082242};
+VT(0.032036001,0.10024616,0,0.039702853,0.10111678,0,0.034786476,0.1076516,0){0,0,2837469.6,0,0,3175586.8,0,0,2912738.3,0,0,-12660.65,0,0,-64516.934,0,0,-413135.58,0,0,-2850146.6,0,0,-3238866.3,0,0,-3267374.9,0,0,-2824890.6,0,0,-3108635.2,0,0,-2390915.6,0,0,37524.098,0,0,193445.51,0,0,1215377.6};
+VT(0.047556344,0.24377674,0,0.049037582,0.25027532,0,0.043027686,0.24899973,0){0,0,1122639.4,0,0,998508.07,0,0,999522.33,0,0,-2989881.7,0,0,-2730849.8,0,0,-2720190.5,0,0,3850350.4,0,0,3739350.2,0,0,3683283.3,0,0,-3414324.1,0,0,-3756698.7,0,0,-3620573.8,0,0,1828478.4,0,0,2778087.3,0,0,2549278.8};
+VT(0.070865224,0.080352924,0,0.075872285,0.081656016,0,0.072044079,0.08604506,0){0,0,2808030.6,0,0,2427639,0,0,2688599.4,0,0,934415.1,0,0,758134.07,0,0,649473.83,0,0,-1562677.5,0,0,-1432759.9,0,0,-1882262.6,0,0,-3017110.1,0,0,-2638364.3,0,0,-2986497.2,0,0,-2458745.5,0,0,-2029677.1,0,0,-1825996.4};
+VT(0.021957304,0.26060316,0,0.027951851,0.26533243,0,0.023009638,0.26878949,0){0,0,505833.44,0,0,539100.43,0,0,417665.14,0,0,-1432636.8,0,0,-1547025.6,0,0,-1208783.5,0,0,2119105.6,0,0,2353298.6,0,0,1871958.7,0,0,-2450095.8,0,0,-2852826.8,0,0,-2337004.8,0,0,2369995.8,0,0,2980285,0,0,2554445.3};
+VT(0.081004963,0.27070547,0,0.086077973,0.27164165,0,0.082516133,0.27647665,0){0,0,333174.81,0,0,243157.03,0,0,248899.48,0,0,-968418.7,0,0,-708191.99,0,0,-731674.12,0,0,1513258.3,0,0,1111255.9,0,0,1170289.2,0,0,-1916833.2,0,0,-1417072.6,0,0,-1538273.3,0,0,2141327.9,0,0,1598582.9,0,0,1813237.5};
+VT(0.082332164,0.023444943,0,0.085916752,0.02828,0,0.080699945,0.029142305,0){0,0,2029600,0,0,1643257.2,0,0,2185639.9,0,0,1907886.4,0,0,1500211.7,0,0,1983669.2,0,0,1671751.1,0,0,1226559.7,0,0,1598386.1,0,0,1335359.8,0,0,846114.35,0,0,1065401.8,0,0,918760.81,0,0,391827.49,0,0,433818.71};
+VT(0.047385855,0.10193045,0,0.052532368,0.096036702,0,0.054240748,0.10280037,0){0,0,3329666.7,0,0,3389506.1,0,0,3302360.6,0,0,-117239.93,0,0,240670.51,0,0,-169115.68,0,0,-3442848.4,0,0,-3131818.5,0,0,-3462856.5,0,0,-3204510.9,0,0,-3594959.1,0,0,-3116478.2,0,0,350991.89,0,0,-718569.73,0,0,505791.56};
+VT(0.012549176,0.077039569,0,0.01318623,0.084416193,0,0.0064539684,0.081629255,0){0,0,1370920.5,0,0,1411871.7,0,0,711139.06,0,0,525978.15,0,0,378554.62,0,0,222377.16,0,0,-643140.23,0,0,-931831.12,0,0,-419239.47,0,0,-1415881.7,0,0,-1560266,0,0,-772749.89,0,0,-1316306.1,0,0,-1046999.7,0,0,-595288.06};
+VT(0.054010827,0.25507988,0,0.060567191,0.25172758,0,0.060672356,0.25950081,0){0,0,897184.36,0,0,917440.34,0,0,771273.27,0,0,-2496661.6,0,0,-2522838.3,0,0,-2177172.3,0,0,3553831.7,0,0,3497206.6,0,0,3197356.1,0,0,-3839088.9,0,0,-3596815.5,0,0,-3651078,0,0,3290330.5,0,0,2796536,0,0,3457676.3};
+VT(0.060672356,0.25950081,0,0.060567191,0.25172758,0,0.066803853,0.25459223,0){0,0,771273.27,0,0,917440.34,0,0,789541.66,0,0,-2177172.3,0,0,-2522838.3,0,0,-2193455.3,0,0,3197356.1,0,0,3497206.6,0,0,3110738.9,0,0,-3651078,0,0,-3596815.5,0,0,-3337877,0,0,3457676.3,0,0,2796536,0,0,2824240.3};
+VT(0.092450683,0.030760689,0,0.085916752,0.02828,0,0.089183466,0.023798504,0){0,0,900007.85,0,0,1643257.2,0,0,1283383.3,0,0,807431.66,0,0,1500211.7,0,0,1204105.7,0,0,631804.95,0,0,1226559.7,0,0,1050439.6,0,0,391202.83,0,0,846114.35,0,0,831874.08,0,0,110124.82,0,0,391827.49,0,0,561630.79};
+VT(0.089232651,0.27618677,0,0.086077973,0.27164165,0,0.092520768,0.26920591,0){0,0,160151.6,0,0,243157.03,0,0,145042.72,0,0,-470555.02,0,0,-708191.99,0,0,-420173.4,0,0,751874.95,0,0,1111255.9,0,0,651988.34,0,0,-986723.61,0,0,-1417072.6,0,0,-816598.86,0,0,1160401.4,0,0,1598582.9,0,0,896908.09};
+VT(0.064373335,0.2338171,0,0.065627137,0.22734606,0,0.07180958,0.22984275,0){0,0,1185902.3,0,0,1270705.1,0,0,1079159.6,0,0,-3010536.1,0,0,-3111357.1,0,0,-2680718.2,0,0,3446119.8,0,0,3236198.8,0,0,2899261.6,0,0,-2291596.2,0,0,-1576358.2,0,0,-1622013.4,0,0,79206.699,0,0,-953054.66,0,0,-492395.98};
+VT(0.059957308,0.22757204,0,0.065627137,0.22734606,0,0.064373335,0.2338171,0){0,0,1366903.5,0,0,1270705.1,0,0,1185902.3,0,0,-3351367.9,0,0,-3111357.1,0,0,-3010536.1,0,0,3498598.8,0,0,3236198.8,0,0,3446119.8,0,0,-1727811.3,0,0,-1576358.2,0,0,-2291596.2,0,0,-990620.01,0,0,-953054.66,0,0,79206.699};
+VT(0.027609688,0.15620978,0,0.030440206,0.150204,0,0.034314476,0.15645926,0){0,0,2023546.1,0,0,2239650.6,0,0,2334400.9,0,0,-2286520.9,0,0,-2249230.7,0,0,-2649968.2,0,0,-1726415,0,0,-2230054.7,0,0,-1976247.7,0,0,2510934.9,0,0,2258843.4,0,0,2917237.1,0,0,1400022.9,0,0,2220211.9,0,0,1581967.4};
+VT(0.03690243,0.09394169,0,0.030017634,0.093495078,0,0.033761495,0.088496681,0){0,0,3135041.5,0,0,2771844.6,0,0,3029395.9,0,0,337961.95,0,0,320378.42,0,0,608605.12,0,0,-2760700,0,0,-2414486.4,0,0,-2298547.5,0,0,-3396384.7,0,0,-3014031.4,0,0,-3368980,0,0,-1002139.6,0,0,-948223.96,0,0,-1747439.7};
+VT(0.023478597,0.036718106,0,0.022876349,0.043626948,0,0.017433092,0.042090914,0){0,0,2561783.8,0,0,2488553.5,0,0,1971771.3,0,0,2187675.4,0,0,1978130.3,0,0,1594855,0,0,1494080.3,0,0,1061959.9,0,0,913057.13,0,0,582277.59,0,0,-72059.632,0,0,56690.05,0,0,-414804.14,0,0,-1191549.5,0,0,-810753.02};
+VT(0,0.064285714,0,0.0062494098,0.068021592,0,0,0.071428571,0){0,0,0,0,0,709501.16,0,0,0,0,0,0,0,0,364477.97,0,0,0,0,0,0,0,0,-157824.6,0,0,0,0,0,0,0,0,-603457.47,0,0,0,0,0,0,0,0,-756039.79,0,0,0};
+VT(0.020973714,0.16688371,0,0.025851591,0.17077962,0,0.020636298,0.17424253,0){0,0,1525118.3,0,0,1763476.8,0,0,1433869.3,0,0,-2061659.5,0,0,-2524912.6,0,0,-2154082.5,0,0,-799875.51,0,0,-673288.62,0,0,-351921.61,0,0,2343184.8,0,0,2815714.9,0,0,2330929.4,0,0,-24581.749,0,0,-542697.73,0,0,-819073.82};
+VT(0.075488644,0.14176328,0,0.081009521,0.1385969,0,0.08264437,0.14444108,0){0,0,1990888.2,0,0,1630909.4,0,0,1463951.5,0,0,-1647841.2,0,0,-1242340.3,0,0,-1293607.4,0,0,-2274843.7,0,0,-1926924,0,0,-1614532.1,0,0,1255935.2,0,0,783271.16,0,0,1105781,0,0,2491166.6,0,0,2113542.9,0,0,1743195.6};
+VT(0.01180171,0.25230222,0,0.013885016,0.25805955,0,0.0098751756,0.25600949,0){0,0,347512.04,0,0,357160.64,0,0,270470.11,0,0,-957611.77,0,0,-1003688.5,0,0,-755004.71,0,0,1333704.3,0,0,1459712.7,0,0,1082095.4,0,0,-1383899.6,0,0,-1638678.7,0,0,-1183544.7,0,0,1095718.6,0,0,1506406.6,0,0,1038261.4};
+VT(0.0064539684,0.081629255,0,0.01318623,0.084416193,0,0.0067127961,0.088875219,0){0,0,711139.06,0,0,1411871.7,0,0,725937.81,0,0,222377.16,0,0,378554.62,0,0,141227.93,0,0,-419239.47,0,0,-931831.12,0,0,-557260.38,0,0,-772749.89,0,0,-1560266,0,0,-806944.34,0,0,-595288.06,0,0,-1046999.7,0,0,-406936.37};
+VT(0.034786476,0.1076516,0,0.039702853,0.10111678,0,0.042557423,0.10832344,0){0,0,2912738.3,0,0,3175586.8,0,0,3183930.6,0,0,-413135.58,0,0,-64516.934,0,0,-492142.06,0,0,-3267374.9,0,0,-3238866.3,0,0,-3600076,0,0,-2390915.6,0,0,-3108635.2,0,0,-2551523.2,0,0,1215377.6,0,0,193445.51,0,0,1442840.6};
+VT(0.064373335,0.2338171,0,0.056766116,0.23329497,0,0.059957308,0.22757204,0){0,0,1185902.3,0,0,1298096.4,0,0,1366903.5,0,0,-3010536.1,0,0,-3286228.7,0,0,-3351367.9,0,0,3446119.8,0,0,3735031.6,0,0,3498598.8,0,0,-2291596.2,0,0,-2434254.7,0,0,-1727811.3,0,0,79206.699,0,0,-7070.0355,0,0,-990620.01};
+VT(0.071000103,0.28243589,0,0.069147655,0.28722413,0,0.063469548,0.28521738,0){0,0,281581.81,0,0,213884.16,0,0,273598.49,0,0,-835250.62,0,0,-637821.62,0,0,-814255.31,0,0,1360764.9,0,0,1050341,0,0,1335465.2,0,0,-1840418.5,0,0,-1444059.1,0,0,-1824812,0,0,2257916.8,0,0,1811586.6,0,0,2270429.1};
+VT(0.073754091,0.28851618,0,0.069147655,0.28722413,0,0.071000103,0.28243589,0){0,0,171229.59,0,0,213884.16,0,0,281581.81,0,0,-511212.67,0,0,-637821.62,0,0,-835250.62,0,0,843808.82,0,0,1050341,0,0,1360764.9,0,0,-1164215.8,0,0,-1444059.1,0,0,-1840418.5,0,0,1467609.3,0,0,1811586.6,0,0,2257916.8};
+VT(0.064075209,0.013493001,0,0.069232026,0.01217315,0,0.070691378,0.017050195,0){0,0,3498581.2,0,0,3187096.8,0,0,3076870.7,0,0,3428890.3,0,0,3135369.8,0,0,2979073.3,0,0,3290906.4,0,0,3032749.5,0,0,2786592,0,0,3087427.7,0,0,2880922.9,0,0,2505581.5,0,0,2822154,0,0,2682056.5,0,0,2144710.8};
+VT(0.070691378,0.017050195,0,0.069232026,0.01217315,0,0.073684623,0.0112317,0){0,0,3076870.7,0,0,3187096.8,0,0,2850123.3,0,0,2979073.3,0,0,3135369.8,0,0,2810738.2,0,0,2786592,0,0,3032749.5,0,0,2732509.2,0,0,2505581.5,0,0,2880922.9,0,0,2616540.6,0,0,2144710.8,0,0,2682056.5,0,0,2464223.2};
+VT(0.062992669,0.22303634,0,0.065627137,0.22734606,0,0.059957308,0.22757204,0){0,0,1396775.9,0,0,1270705.1,0,0,1366903.5,0,0,-3331109.7,0,0,-3111357.1,0,0,-3351367.9,0,0,3216330,0,0,3236198.8,0,0,3498598.8,0,0,-1122974.8,0,0,-1576358.2,0,0,-1727811.3,0,0,-1661551.4,0,0,-953054.66,0,0,-990620.01};
+VT(0.007303543,0.20469543,0,0.005051806,0.19767546,0,0.011268327,0.1984065,0){0,0,422375.13,0,0,313084.45,0,0,682302.12,0,0,-880191.16,0,0,-612892.85,0,0,-1344805.9,0,0,531663.92,0,0,273796.53,0,0,623458.07,0,0,303952.91,0,0,350786.74,0,0,739532.85,0,0,-861341.37,0,0,-609909.8,0,0,-1341727.7};
+VT(0.054876921,0.07294965,0,0.047469022,0.070467195,0,0.052494391,0.065958781,0){0,0,3558755.8,0,0,3608010.8,0,0,3640248,0,0,1580988.4,0,0,1730907.5,0,0,1971511.2,0,0,-1275447.3,0,0,-1046792,0,0,-601016.65,0,0,-3423192.1,0,0,-3280034.9,0,0,-2898090,0,0,-3669097.1,0,0,-3807136.9,0,0,-3866942};
+VT(0.041803352,0.076750149,0,0.047469022,0.070467195,0,0.049165273,0.076760106,0){0,0,3453761.9,0,0,3608010.8,0,0,3570137.5,0,0,1340279.2,0,0,1730907.5,0,0,1384898,0,0,-1593440.1,0,0,-1046792,0,0,-1648055.9,0,0,-3552303.7,0,0,-3280034.9,0,0,-3672308.6,0,0,-3337911.6,0,0,-3807136.9,0,0,-3449021.3};
+VT(0,0.23571429,0,0.0069516057,0.23320895,0,0.0071147476,0.24137211,0){0,0,0,0,0,288078.49,0,0,259907.57,0,0,0,0,0,-728952.19,0,0,-684802.64,0,0,0,0,0,827497.2,0,0,859611.54,0,0,0,0,0,-537397.4,0,0,-720499.62,0,0,0,0,0,-5267.3055,0,0,317972.39};
+VT(0.038597539,0.20095921,0,0.036840853,0.20596239,0,0.03163445,0.20120488,0){0,0,1801301.7,0,0,1679916.9,0,0,1608414.7,0,0,-3633864.6,0,0,-3538121.9,0,0,-3251875.6,0,0,1895634,0,0,2233718.4,0,0,1714266.6,0,0,1705394,0,0,1067350,0,0,1500504,0,0,-3630918.1,0,0,-3414669.4,0,0,-3248047};
+VT(0.033874053,0.071548869,0,0.041803352,0.076750149,0,0.032911969,0.081185013,0){0,0,3157862.8,0,0,3453761.9,0,0,3037931.3,0,0,1466537.3,0,0,1340279.2,0,0,971274.35,0,0,-1010259.7,0,0,-1593440.1,0,0,-1756226.8,0,0,-2946084.6,0,0,-3552303.7,0,0,-3289165.4,0,0,-3304540.6,0,0,-3337911.6,0,0,-2584916.3};
+VT(0.1,0.05,0,0.095360834,0.0462161,0,0.1,0.042857143,0){0,0,0,0,0,547145.45,0,0,0,0,0,0,0,0,421466.87,0,0,0,0,0,0,0,0,198977.54,0,0,0,0,0,0,0,0,-69217.008,0,0,0,0,0,0,0,0,-321602.09,0,0,0};
+VT(0.069025318,0.11622387,0,0.070840483,0.12204614,0,0.064276416,0.12183086,0){0,0,2631986.5,0,0,2470738.2,0,0,2809128.6,0,0,-808686.45,0,0,-1044803.2,0,0,-1175750.5,0,0,-3192250.9,0,0,-3073782.1,0,0,-3492840.6,0,0,-1402768.4,0,0,-729197.53,0,0,-855220.15,0,0,2220554.1,0,0,2652961,0,0,2995580.4};
+VT(0.1,0.25714286,0,0.095492809,0.25375881,0,0.1,0.25,0){0,0,0,0,0,131307.15,0,0,0,0,0,0,0,0,-363726.6,0,0,0,0,0,0,0,0,512510.07,0,0,0,0,0,0,0,0,-543451.99,0,0,0,0,0,0,0,0,449348.78,0,0,0};
+VT(0,0.11428571,0,0.0062042788,0.11791514,0,0,0.12142857,0){0,0,0,0,0,612847.32,0,0,0,0,0,0,0,0,-208741.13,0,0,0,0,0,0,0,0,-750565.55,0,0,0,0,0,0,0,0,-286207.66,0,0,0,0,0,0,0,0,561848.67,0,0,0};
+VT(0.092141527,0.03991184,0,0.095360834,0.0462161,0,0.08974924,0.047235181,0){0,0,927649.93,0,0,547145.45,0,0,1190814.4,0,0,767955.56,0,0,421466.87,0,0,905328.07,0,0,476054.53,0,0,198977.54,0,0,402804.56,0,0,102192.68,0,0,-69217.008,0,0,-196265.4,0,0,-289378.9,0,0,-321602.09,0,0,-748421.11};
+VT(0.090077759,0.25268961,0,0.095492809,0.25375881,0,0.092295863,0.26000779,0){0,0,291813.61,0,0,131307.15,0,0,193329.27,0,0,-805257.31,0,0,-363726.6,0,0,-546576.12,0,0,1125037.4,0,0,512510.07,0,0,805368.84,0,0,-1174248.1,0,0,-543451.99,0,0,-924990.4,0,0,940920.06,0,0,449348.78,0,0,884724.5};
+VT(0.054010827,0.25507988,0,0.049037582,0.25027532,0,0.054957014,0.24657048,0){0,0,897184.36,0,0,998508.07,0,0,1058545,0,0,-2496661.6,0,0,-2730849.8,0,0,-2852831,0,0,3553831.7,0,0,3739350.2,0,0,3777171.8,0,0,-3839088.9,0,0,-3756698.7,0,0,-3549694.2,0,0,3290330.5,0,0,2778087.3,0,0,2239441.1};
+VT(0,0.19285714,0,0.005051806,0.19767546,0,0,0.2,0){0,0,0,0,0,313084.45,0,0,0,0,0,0,0,0,-612892.85,0,0,0,0,0,0,0,0,273796.53,0,0,0,0,0,0,0,0,350786.74,0,0,0,0,0,0,0,0,-609909.8,0,0,0};
+VT(0.024938414,0.098415267,0,0.030017634,0.093495078,0,0.032036001,0.10024616,0){0,0,2383058.5,0,0,2771844.6,0,0,2837469.6,0,0,68195.72,0,0,320378.42,0,0,-12660.65,0,0,-2312962.3,0,0,-2414486.4,0,0,-2850146.6,0,0,-2447461.4,0,0,-3014031.4,0,0,-2824890.6,0,0,-204726.33,0,0,-948223.96,0,0,37524.098};
+VT(0.06966854,0.20076802,0,0.064671223,0.19505087,0,0.071449289,0.19423207,0){0,0,1570520.4,0,0,1815232.4,0,0,1594804.6,0,0,-3162888.4,0,0,-3465163,0,0,-3019964.8,0,0,1636334.6,0,0,1334352.3,0,0,1103926.4,0,0,1503948.1,0,0,2252470.6,0,0,2033518.7,0,0,-3161601.9,0,0,-3382100.5,0,0,-2921575.1};
+VT(0.060432552,0.20227914,0,0.064671223,0.19505087,0,0.06966854,0.20076802,0){0,0,1798951.1,0,0,1815232.4,0,0,1570520.4,0,0,-3671781.8,0,0,-3465163,0,0,-3162888.4,0,0,2023610.8,0,0,1334352.3,0,0,1636334.6,0,0,1565241.8,0,0,2252470.6,0,0,1503948.1,0,0,-3653837,0,0,-3382100.5,0,0,-3161601.9};
+VT(0.014210915,0.13228117,0,0.012365279,0.12660144,0,0.01788586,0.12850833,0){0,0,1289449.4,0,0,1158576.2,0,0,1616906.9,0,0,-813665.75,0,0,-596487.84,0,0,-895214.81,0,0,-1589638.3,0,0,-1447959.2,0,0,-2016472.2,0,0,227067.92,0,0,-105993.81,0,0,-4802.2192,0,0,1673024.3,0,0,1396357.8,0,0,2014144.7};
+VT(0.0072553778,0.13224921,0,0.012365279,0.12660144,0,0.014210915,0.13228117,0){0,0,674958.82,0,0,1158576.2,0,0,1289449.4,0,0,-425463.67,0,0,-596487.84,0,0,-813665.75,0,0,-832230.25,0,0,-1447959.2,0,0,-1589638.3,0,0,117822.57,0,0,-105993.81,0,0,227067.92,0,0,875622.71,0,0,1396357.8,0,0,1673024.3};
+VT(0.030575169,0.1246812,0,0.023379755,0.12686903,0,0.025139549,0.12057635,0){0,0,2526238.7,0,0,2047772.9,0,0,2224740.3,0,0,-1202245.8,0,0,-1065433.1,0,0,-875333.98,0,0,-3156412.2,0,0,-2558991,0,0,-2755721.9,0,0,-451924.48,0,0,-162203.53,0,0,-796179.51,0,0,2919641.1,0,0,2481221.5,0,0,2272644.8};
+VT(0.036160627,0.1953007,0,0.034128539,0.18892309,0,0.039366597,0.19088868,0){0,0,1834250.2,0,0,1872288.6,0,0,1982365.2,0,0,-3509998.2,0,0,-3356683.8,0,0,-3628592.6,0,0,1372423.7,0,0,788949.65,0,0,1030950.1,0,0,2256297.6,0,0,2731311.2,0,0,2772526.5,0,0,-3434247.7,0,0,-2954777.5,0,0,-3333638.5};
+VT(0.041319833,0.14315875,0,0.045364072,0.14896511,0,0.037897724,0.149701,0){0,0,2735557.7,0,0,2729630.7,0,0,2552043.8,0,0,-2343944,0,0,-2670475.8,0,0,-2536068.8,0,0,-3071175.4,0,0,-2787568.3,0,0,-2567975.2,0,0,1904337.3,0,0,2610132.2,0,0,2520076,0,0,3343927.4,0,0,2844182.1,0,0,2583694.6};
+VT(0.0058133292,0.032528446,0,0.0063343033,0.038958017,0,0,0.035714286,0){0,0,694559.72,0,0,751213.74,0,0,0,0,0,614750.96,0,0,627892.11,0,0,0,0,0,464300.7,0,0,401490.67,0,0,0,0,0,260495.38,0,0,109174.99,0,0,0,0,0,26512.55,0,0,-201236.23,0,0,0};
+VT(0.045044357,0.28188841,0,0.045592054,0.27439642,0,0.051703203,0.27754162,0){0,0,362990.51,0,0,513714.39,0,0,454636.43,0,0,-1075960.6,0,0,-1504437.2,0,0,-1338881.7,0,0,1750378.7,0,0,2387679.2,0,0,2149437.1,0,0,-2362097.1,0,0,-3100344.3,0,0,-2841702,0,0,2889034,0,0,3591305.7,0,0,3377384.9};
+VT(0.068476894,0.0069177029,0,0.06203594,0.0060944193,0,0.064285714,0,0){0,0,3242851.4,0,0,3604620.2,0,0,3496327.6,0,0,3225849.8,0,0,3589956.2,0,0,3496358.5,0,0,3191931.3,0,0,3560685.5,0,0,3496415,0,0,3141298.2,0,0,3516960.1,0,0,3496523.2,0,0,3073847.6,0,0,3458793.9,0,0,3496472.9};
+VT(0.064285714,0.3,0,0.061805884,0.29356168,0,0.068366879,0.29272708,0){0,0,0,0,0,121923.05,0,0,123803.43,0,0,0,0,0,-365207.83,0,0,-370697.46,0,0,0,0,0,606815.62,0,0,615462.12,0,0,0,0,0,-845641.09,0,0,-856697.17,0,0,0,0,0,1080583.1,0,0,1092834.3};
+VT(0.07180958,0.22984275,0,0.065627137,0.22734606,0,0.069002793,0.22246209,0){0,0,1079159.6,0,0,1270705.1,0,0,1267491.2,0,0,-2680718.2,0,0,-3111357.1,0,0,-3011719.2,0,0,2899261.6,0,0,3236198.8,0,0,2877058.6,0,0,-1622013.4,0,0,-1576358.2,0,0,-947533.34,0,0,-492395.98,0,0,-953054.66,0,0,-1573376.1};
+VT(0.066925078,0.074981916,0,0.060416267,0.076932239,0,0.061098586,0.072147464,0){0,0,3090390.8,0,0,3380545.3,0,0,3389933,0,0,1280900.5,0,0,1302521.2,0,0,1545196.6,0,0,-1278621.5,0,0,-1576156.6,0,0,-1140417.3,0,0,-3089611.2,0,0,-3485992.8,0,0,-3205469.9,0,0,-3091904.4,0,0,-3253298.6,0,0,-3526423.9};
+VT(0.064352171,0.083117586,0,0.060416267,0.076932239,0,0.066925078,0.074981916,0){0,0,3167194.8,0,0,3380545.3,0,0,3090390.8,0,0,915483.69,0,0,1302521.2,0,0,1280900.5,0,0,-1987167.2,0,0,-1576156.6,0,0,-1278621.5,0,0,-3477240.4,0,0,-3485992.8,0,0,-3089611.2,0,0,-2495770,0,0,-3253298.6,0,0,-3091904.4};
+VT(0.0060491453,0.25298129,0,0.01180171,0.25230222,0,0.0098751756,0.25600949,0){0,0,178654.23,0,0,347512.04,0,0,270470.11,0,0,-493529.07,0,0,-957611.77,0,0,-755004.71,0,0,691183.17,0,0,1333704.3,0,0,1082095.4,0,0,-724662.05,0,0,-1383899.6,0,0,-1183544.7,0,0,585970.08,0,0,1095718.6,0,0,1038261.4};
+VT(0.0087429334,0.24792416,0,0.01180171,0.25230222,0,0.0060491453,0.25298129,0){0,0,283453.34,0,0,347512.04,0,0,178654.23,0,0,-768118.62,0,0,-957611.77,0,0,-493529.07,0,0,1029935.2,0,0,1333704.3,0,0,691183.17,0,0,-992967.39,0,0,-1383899.6,0,0,-724662.05,0,0,667809.3,0,0,1095718.6,0,0,585970.08};
+VT(0.055202425,0.1814475,0,0.061291474,0.18447479,0,0.055890502,0.18802963,0){0,0,2227021.2,0,0,2069396,0,0,2110328.4,0,0,-3667462.5,0,0,-3531333.7,0,0,-3747121.1,0,0,145084.74,0,0,425331.11,0,0,795966.68,0,0,3573754.5,0,0,3230965.1,0,0,3129878.5,0,0,-2457046.3,0,0,-2708277.6,0,0,-3224012.4};
+VT(0.025350652,0.23917347,0,0.033139613,0.24047735,0,0.029124573,0.24658198,0){0,0,868665.73,0,0,1026889.2,0,0,849052.23,0,0,-2265304,0,0,-2694450.7,0,0,-2288340.2,0,0,2773502.3,0,0,3348643.4,0,0,3030093.5,0,0,-2193941.8,0,0,-2743423.6,0,0,-2848204.4,0,0,753574.67,0,0,1106136.5,0,0,1797881.3};
+VT(0,0.12142857,0,0.0061411468,0.1246533,0,0,0.12857143,0){0,0,0,0,0,591118.91,0,0,0,0,0,0,0,0,-280990.71,0,0,0,0,0,0,0,0,-738586.84,0,0,0,0,0,0,0,0,-106527.54,0,0,0,0,0,0,0,0,682629.18,0,0,0};
+VT(0.03163445,0.20120488,0,0.036160627,0.1953007,0,0.038597539,0.20095921,0){0,0,1608414.7,0,0,1834250.2,0,0,1801301.7,0,0,-3251875.6,0,0,-3509998.2,0,0,-3633864.6,0,0,1714266.6,0,0,1372423.7,0,0,1895634,0,0,1500504,0,0,2256297.6,0,0,1705394,0,0,-3248047,0,0,-3434247.7,0,0,-3630918.1};
+VT(0.029690249,0.19362013,0,0.036160627,0.1953007,0,0.03163445,0.20120488,0){0,0,1647856.1,0,0,1834250.2,0,0,1608414.7,0,0,-3101495.4,0,0,-3509998.2,0,0,-3251875.6,0,0,1088093.1,0,0,1372423.7,0,0,1714266.6,0,0,2141745.7,0,0,2256297.6,0,0,1500504,0,0,-2977851,0,0,-3434247.7,0,0,-3248047};
+VT(0,0.17142857,0,0.0046637588,0.16745308,0,0.0069613667,0.17349451,0){0,0,0,0,0,362371.83,0,0,517779.21,0,0,0,0,0,-494096.85,0,0,-769992.03,0,0,0,0,0,-182769.85,0,0,-142713.64,0,0,0,0,0,560561.48,0,0,839532.94,0,0,0,0,0,-21256.565,0,0,-266340.1};
+VT(0.034314476,0.15645926,0,0.030440206,0.150204,0,0.037897724,0.149701,0){0,0,2334400.9,0,0,2239650.6,0,0,2552043.8,0,0,-2649968.2,0,0,-2249230.7,0,0,-2536068.8,0,0,-1976247.7,0,0,-2230054.7,0,0,-2567975.2,0,0,2917237.1,0,0,2258843.4,0,0,2520076,0,0,1581967.4,0,0,2220211.9,0,0,2583694.6};
+VT(0.077393474,0.16425214,0,0.072573599,0.16764459,0,0.070175425,0.16144206,0){0,0,1650679.7,0,0,1881427.5,0,0,2074683.8,0,0,-2141613.9,0,0,-2572760.4,0,0,-2570674.4,0,0,-1013799.5,0,0,-936075.04,0,0,-1460177,0,0,2443278.1,0,0,2916777.1,0,0,2919916.2,0,0,287063.28,0,0,-135849.37,0,0,762077.82};
+VT(0.050398693,0.1921099,0,0.055890502,0.18802963,0,0.057391395,0.19462543,0){0,0,2077292.2,0,0,2110328.4,0,0,1979510.6,0,0,-3850553.1,0,0,-3747121.1,0,0,-3763012.6,0,0,1209682,0,0,795966.68,0,0,1410875.8,0,0,2818064.5,0,0,3129878.5,0,0,2491970.2,0,0,-3615771.1,0,0,-3224012.4,0,0,-3656419.8};
+VT(0.057391395,0.19462543,0,0.055890502,0.18802963,0,0.06137482,0.19024807,0){0,0,1979510.6,0,0,2110328.4,0,0,1976038.9,0,0,-3763012.6,0,0,-3747121.1,0,0,-3592882,0,0,1410875.8,0,0,795966.68,0,0,963745.22,0,0,2491970.2,0,0,3129878.5,0,0,2804392.5,0,0,-3656419.8,0,0,-3224012.4,0,0,-3258719.1};
+VT(0,0.13571429,0,0.0054758376,0.13911323,0,0,0.14285714,0){0,0,0,0,0,495708.7,0,0,0,0,0,0,0,0,-382921.42,0,0,0,0,0,0,0,0,-582869.54,0,0,0,0,0,0,0,0,250325.59,0,0,0,0,0,0,0,0,639819.51,0,0,0};
+VT(0.063469548,0.28521738,0,0.069147655,0.28722413,0,0.068366879,0.29272708,0){0,0,273598.49,0,0,213884.16,0,0,123803.43,0,0,-814255.31,0,0,-637821.62,0,0,-370697.46,0,0,1335465.2,0,0,1050341,0,0,615462.12,0,0,-1824812,0,0,-1444059.1,0,0,-856697.17,0,0,2270429.1,0,0,1811586.6,0,0,1092834.3};
+VT(0.068366879,0.29272708,0,0.069147655,0.28722413,0,0.073754091,0.28851618,0){0,0,123803.43,0,0,213884.16,0,0,171229.59,0,0,-370697.46,0,0,-637821.62,0,0,-511212.67,0,0,615462.12,0,0,1050341,0,0,843808.82,0,0,-856697.17,0,0,-1444059.1,0,0,-1164215.8,0,0,1092834.3,0,0,1811586.6,0,0,1467609.3};
+VT(0.068476894,0.0069177029,0,0.069232026,0.01217315,0,0.064075209,0.013493001,0){0,0,3242851.4,0,0,3187096.8,0,0,3498581.2,0,0,3225849.8,0,0,3135369.8,0,0,3428890.3,0,0,3191931.3,0,0,3032749.5,0,0,3290906.4,0,0,3141298.2,0,0,2880922.9,0,0,3087427.7,0,0,3073847.6,0,0,2682056.5,0,0,2822154};
+VT(0.073684623,0.0112317,0,0.069232026,0.01217315,0,0.068476894,0.0069177029,0){0,0,2850123.3,0,0,3187096.8,0,0,3242851.4,0,0,2810738.2,0,0,3135369.8,0,0,3225849.8,0,0,2732509.2,0,0,3032749.5,0,0,3191931.3,0,0,2616540.6,0,0,2880922.9,0,0,3141298.2,0,0,2464223.2,0,0,2682056.5,0,0,3073847.6};
+VT(0,0.26428571,0,0.0071908097,0.26035264,0,0.0060732531,0.2674669,0){0,0,0,0,0,179155.76,0,0,124750.88,0,0,0,0,0,-507033.49,0,0,-359918.85,0,0,0,0,0,748779.14,0,0,553735.12,0,0,0,0,0,-863311.12,0,0,-683931.42,0,0,0,0,0,830950.48,0,0,735399.5};
+VT(0.093873231,0.17693503,0,0.095837038,0.182565,0,0.089858368,0.18421461,0){0,0,445896.9,0,0,291932.87,0,0,692603.24,0,0,-694096.79,0,0,-487211.17,0,0,-1178349.1,0,0,-59504.029,0,0,33971.767,0,0,133849.22,0,0,727141.13,0,0,464480.32,0,0,1084450.2,0,0,-345394.37,0,0,-344762.9,0,0,-894447.98};
+VT(0.023309936,0.19197185,0,0.021212478,0.18688263,0,0.027249449,0.18607819,0){0,0,1390526.6,0,0,1339179.6,0,0,1646413.8,0,0,-2573914.4,0,0,-2348119.2,0,0,-2861109.6,0,0,799964.88,0,0,429909.33,0,0,464444.42,0,0,1893175.4,0,0,2024227.8,0,0,2518610.9,0,0,-2411477.9,0,0,-1955356.8,0,0,-2323177.4};
+VT(0,0.035714286,0,0.0063343033,0.038958017,0,0,0.042857143,0){0,0,0,0,0,751213.74,0,0,0,0,0,0,0,0,627892.11,0,0,0,0,0,0,0,0,401490.67,0,0,0,0,0,0,0,0,109174.99,0,0,0,0,0,0,0,0,-201236.23,0,0,0};
+VT(0,0.22857143,0,0.0069516057,0.23320895,0,0,0.23571429,0){0,0,0,0,0,288078.49,0,0,0,0,0,0,0,0,-728952.19,0,0,0,0,0,0,0,0,827497.2,0,0,0,0,0,0,0,0,-537397.4,0,0,0,0,0,0,0,0,-5267.3055,0,0,0};
+VT(0.031710863,0.0075461758,0,0.025051818,0.0051959301,0,0.028571429,0,0){0,0,3254919.5,0,0,2747435.6,0,0,3033980.1,0,0,3234618.2,0,0,2739316.7,0,0,3033983.4,0,0,3194153.7,0,0,2723095.2,0,0,3033988.7,0,0,3133832.1,0,0,2698832.3,0,0,3034024.4,0,0,3053845.3,0,0,2666496.7,0,0,3033982.5};
+VT(0.028571429,0.3,0,0.024877102,0.29495936,0,0.031264826,0.29263185,0){0,0,0,0,0,72135.52,0,0,124484.17,0,0,0,0,0,-216205.93,0,0,-372709.78,0,0,0,0,0,359676.71,0,0,618717.86,0,0,0,0,0,-502149.61,0,0,-861054.65,0,0,0,0,0,642973.44,0,0,1098239.8};
+VT(0.025468185,0.010276157,0,0.025051818,0.0051959301,0,0.031710863,0.0075461758,0){0,0,2780034,0,0,2747435.6,0,0,3254919.5,0,0,2747892,0,0,2739316.7,0,0,3234618.2,0,0,2683968.5,0,0,2723095.2,0,0,3194153.7,0,0,2589008.8,0,0,2698832.3,0,0,3133832.1,0,0,2463902.9,0,0,2666496.7,0,0,3053845.3};
+VT(0.031264826,0.29263185,0,0.024877102,0.29495936,0,0.025130011,0.29009115,0){0,0,124484.17,0,0,72135.52,0,0,142877.47,0,0,-372709.78,0,0,-216205.93,0,0,-427099.39,0,0,618717.86,0,0,359676.71,0,0,706741.94,0,0,-861054.65,0,0,-502149.61,0,0,-978805.55,0,0,1098239.8,0,0,642973.44,0,0,1240164.3};
+VT(0.024938414,0.098415267,0,0.024499807,0.092422798,0,0.030017634,0.093495078,0){0,0,2383058.5,0,0,2390452.1,0,0,2771844.6,0,0,68195.72,0,0,320672.29,0,0,320378.42,0,0,-2312962.3,0,0,-2026771.7,0,0,-2414486.4,0,0,-2447461.4,0,0,-2619357.9,0,0,-3014031.4,0,0,-204726.33,0,0,-944222.72,0,0,-948223.96};
+VT(0.083292987,0.24598228,0,0.085145188,0.25032735,0,0.07921504,0.25033934,0){0,0,542685.82,0,0,448997.25,0,0,606155.6,0,0,-1458992.1,0,0,-1228228.7,0,0,-1658203,0,0,1920780.7,0,0,1682589.8,0,0,2271843.6,0,0,-1784182,0,0,-1691886.1,0,0,-2284831,0,0,1091638.2,0,0,1253443,0,0,1693484.6};
+VT(0.077364239,0.048764008,0,0.083998423,0.049627851,0,0.080938662,0.054906318,0){0,0,2450679,0,0,1806853.8,0,0,2097661.4,0,0,1825420.5,0,0,1329741.5,0,0,1423084,0,0,734405.59,0,0,501474.01,0,0,290856.94,0,0,-544039.45,0,0,-459273.5,0,0,-934922.56,0,0,-1683943.8,0,0,-1299103.8,0,0,-1860365.1};
+VT(0,0.25714286,0,0.0071908097,0.26035264,0,0,0.26428571,0){0,0,0,0,0,179155.76,0,0,0,0,0,0,0,0,-507033.49,0,0,0,0,0,0,0,0,748779.14,0,0,0,0,0,0,0,0,-863311.12,0,0,0,0,0,0,0,0,830950.48,0,0,0};
+VT(0.059437672,0.2400817,0,0.061408089,0.24582042,0,0.054957014,0.24657048,0){0,0,1145348.7,0,0,1017142.7,0,0,1058545,0,0,-2999714,0,0,-2732695.2,0,0,-2852831,0,0,3711340.5,0,0,3591948.1,0,0,3777171.8,0,0,-3009146,0,0,-3325647.6,0,0,-3549694.2,0,0,1160252.2,0,0,2017029.8,0,0,2239441.1};
+VT(0.052494391,0.065958781,0,0.059054943,0.066788508,0,0.054876921,0.07294965,0){0,0,3640248,0,0,3499189.3,0,0,3558755.8,0,0,1971511.2,0,0,1856149.2,0,0,1580988.4,0,0,-601016.65,0,0,-658492.2,0,0,-1275447.3,0,0,-2898090,0,0,-2864039.1,0,0,-3423192.1,0,0,-3866942,0,0,-3725081.1,0,0,-3669097.1};
+VT(0.054876921,0.07294965,0,0.059054943,0.066788508,0,0.061098586,0.072147464,0){0,0,3558755.8,0,0,3499189.3,0,0,3389933,0,0,1580988.4,0,0,1856149.2,0,0,1545196.6,0,0,-1275447.3,0,0,-658492.2,0,0,-1140417.3,0,0,-3423192.1,0,0,-2864039.1,0,0,-3205469.9,0,0,-3669097.1,0,0,-3725081.1,0,0,-3526423.9};
+VT(0.1,0.14285714,0,0.093938974,0.13899,0,0.1,0.13571429,0){0,0,0,0,0,548364.78,0,0,0,0,0,0,0,0,-422206.84,0,0,0,0,0,0,0,0,-645591.08,0,0,0,0,0,0,0,0,273728.87,0,0,0,0,0,0,0,0,708600.91,0,0,0};
+VT(0.030623168,0.1713445,0,0.025851591,0.17077962,0,0.029380008,0.16405835,0){0,0,1985985.4,0,0,1763476.8,0,0,2021292.5,0,0,-2866418.8,0,0,-2524912.6,0,0,-2614335.2,0,0,-715248.18,0,0,-673288.62,0,0,-1254306.4,0,0,3183566.3,0,0,2815714.9,0,0,2982541.3,0,0,-696442.05,0,0,-542697.73,0,0,378860.61};
+VT(0.0064812773,0.046734878,0,0.013132659,0.04767246,0,0.0094132111,0.052421332,0){0,0,761350.4,0,0,1507774.2,0,0,1088603.4,0,0,582610.88,0,0,1139737.5,0,0,768702.62,0,0,267082.8,0,0,493500.09,0,0,222919.17,0,0,-111174.21,0,0,-273193.01,0,0,-388347.22,0,0,-463416.67,0,0,-973395.4,0,0,-885762.83};
+VT(0.011573719,0.041901165,0,0.013132659,0.04767246,0,0.0064812773,0.046734878,0){0,0,1347025.1,0,0,1507774.2,0,0,761350.4,0,0,1091815.8,0,0,1139737.5,0,0,582610.88,0,0,629744.45,0,0,493500.09,0,0,267082.8,0,0,48353.226,0,0,-273193.01,0,0,-111174.21,0,0,-542301.86,0,0,-973395.4,0,0,-463416.67};
+VT(0.092168655,0.23668616,0,0.095706332,0.23121352,0,0.1,0.23571429,0){0,0,307607.26,0,0,183910.78,0,0,0,0,0,-792496.69,0,0,-460364.34,0,0,0,0,0,941630.33,0,0,508106.39,0,0,0,0,0,-691810.02,0,0,-303408.65,0,0,0,0,0,148523.72,0,0,-52245.513,0,0,0};
+VT(0.048791783,0.28884593,0,0.043131118,0.28864457,0,0.045044357,0.28188841,0){0,0,226341.07,0,0,225252.57,0,0,362990.51,0,0,-675936.71,0,0,-672574.82,0,0,-1075960.6,0,0,1116322.7,0,0,1110400.5,0,0,1750378.7,0,0,-1541505,0,0,-1532552.2,0,0,-2362097.1,0,0,1945474.1,0,0,1932837.8,0,0,2889034};
+VT(0.045044357,0.28188841,0,0.043131118,0.28864457,0,0.036602132,0.28491153,0){0,0,362990.51,0,0,225252.57,0,0,279518.56,0,0,-1075960.6,0,0,-672574.82,0,0,-831596.18,0,0,1750378.7,0,0,1110400.5,0,0,1362985.6,0,0,-2362097.1,0,0,-1532552.2,0,0,-1860498.2,0,0,2889034,0,0,1932837.8,0,0,2311728.5};
+VT(0.071449289,0.19423207,0,0.064671223,0.19505087,0,0.06771074,0.1881525,0){0,0,1594804.6,0,0,1815232.4,0,0,1821405.7,0,0,-3019964.8,0,0,-3465163,0,0,-3238423,0,0,1103926.4,0,0,1334352.3,0,0,698008.36,0,0,2033518.7,0,0,2252470.6,0,0,2695511.5,0,0,-2921575.1,0,0,-3382100.5,0,0,-2795478.4};
+VT(0.06771074,0.1881525,0,0.064671223,0.19505087,0,0.06137482,0.19024807,0){0,0,1821405.7,0,0,1815232.4,0,0,1976038.9,0,0,-3238423,0,0,-3465163,0,0,-3592882,0,0,698008.36,0,0,1334352.3,0,0,963745.22,0,0,2695511.5,0,0,2252470.6,0,0,2804392.5,0,0,-2795478.4,0,0,-3382100.5,0,0,-3258719.1};
+VT(0.051703203,0.27754162,0,0.051519181,0.28417908,0,0.045044357,0.28188841,0){0,0,454636.43,0,0,320732.11,0,0,362990.51,0,0,-1338881.7,0,0,-953415.16,0,0,-1075960.6,0,0,2149437.1,0,0,1560004.1,0,0,1750378.7,0,0,-2841702,0,0,-2123899.5,0,0,-2362097.1,0,0,3377384.9,0,0,2629434.9,0,0,2889034};
+VT(0.045044357,0.28188841,0,0.051519181,0.28417908,0,0.048791783,0.28884593,0){0,0,362990.51,0,0,320732.11,0,0,226341.07,0,0,-1075960.6,0,0,-953415.16,0,0,-675936.71,0,0,1750378.7,0,0,1560004.1,0,0,1116322.7,0,0,-2362097.1,0,0,-2123899.5,0,0,-1541505,0,0,2889034,0,0,2629434.9,0,0,1945474.1};
+VT(0.066925078,0.074981916,0,0.064846874,0.068845861,0,0.072323403,0.067507008,0){0,0,3090390.8,0,0,3243292.3,0,0,2781512.1,0,0,1280900.5,0,0,1629296.1,0,0,1448400.9,0,0,-1278621.5,0,0,-795531.06,0,0,-578922.09,0,0,-3089611.2,0,0,-2824516.6,0,0,-2328912.3,0,0,-3091904.4,0,0,-3448034.5,0,0,-2963263.7};
+VT(0.017861336,0.10270337,0,0.013714026,0.097839388,0,0.019165757,0.095107709,0){0,0,1773538.4,0,0,1412613.2,0,0,1930971.9,0,0,-87655.931,0,0,55008.627,0,0,168744.63,0,0,-1856823.6,0,0,-1355500.2,0,0,-1747493.7,0,0,-1677437.3,0,0,-1463354,0,0,-2069009.1,0,0,261812.45,0,0,-165174.7,0,0,-502664.26};
+VT(0.072126291,0.10515927,0,0.076969725,0.10634022,0,0.074105201,0.11070107,0){0,0,2539730.3,0,0,2181001.1,0,0,2359475.3,0,0,-241283.81,0,0,-255488.75,0,0,-471755.94,0,0,-2758172.2,0,0,-2406546.5,0,0,-2736894.8,0,0,-2254933.2,0,0,-1869163.7,0,0,-1717960.7,0,0,717337.89,0,0,756176.24,0,0,1362139.4};
+VT(0.077318805,0.23627719,0,0.078142774,0.24370973,0,0.072908259,0.24139656,0){0,0,830868.27,0,0,714639.7,0,0,881474.92,0,0,-2136157.9,0,0,-1902709.3,0,0,-2322734,0,0,2525048.7,0,0,2448578.4,0,0,2916335.3,0,0,-1830714.2,0,0,-2167997.3,0,0,-2445637.4,0,0,350702.19,0,0,1155455.3,0,0,1082242};
+VT(0,0.17857143,0,0.0062925762,0.18063125,0,0,0.18571429,0){0,0,0,0,0,445914.92,0,0,0,0,0,0,0,0,-727143.63,0,0,0,0,0,0,0,0,12632.594,0,0,0,0,0,0,0,0,719304.1,0,0,0,0,0,0,0,0,-466469.22,0,0,0};
+VT(0.045894811,0.13135905,0,0.044512931,0.13802764,0,0.038217426,0.13599196,0){0,0,2973475.7,0,0,2867370.6,0,0,2738753.8,0,0,-1819976.4,0,0,-2150242,0,0,-1938161,0,0,-3679581.9,0,0,-3405187.4,0,0,-3305386.1,0,0,392676.16,0,0,1298632.3,0,0,972060.89,0,0,3832095.1,0,0,3729885,0,0,3589652.3};
+VT(0.028198926,0.28535727,0,0.0220603,0.28602893,0,0.023483408,0.28013687,0){0,0,230200.16,0,0,181204.07,0,0,270985.88,0,0,-685197.76,0,0,-539738.59,0,0,-801278.39,0,0,1124120.6,0,0,886739.53,0,0,1297043.7,0,0,-1536674.3,0,0,-1214791.9,0,0,-1736920.8,0,0,1912913.1,0,0,1516611.7,0,0,2101746.5};
+VT(0.053497526,0.1329974,0,0.049213686,0.13705186,0,0.045894811,0.13135905,0){0,0,2959143.9,0,0,2922689.8,0,0,2973475.7,0,0,-1911000.9,0,0,-2132523.3,0,0,-1819976.4,0,0,-3636096,0,0,-3499251.9,0,0,-3679581.9,0,0,623103.97,0,0,1186505.2,0,0,392676.16,0,0,3857035.6,0,0,3819996.4,0,0,3832095.1};
+VT(0.060819012,0.031697917,0,0.054261983,0.029107824,0,0.057707972,0.025075094,0){0,0,3608360,0,0,3801269,0,0,3734947.8,0,0,3214477.8,0,0,3450822.2,0,0,3478918.2,0,0,2469695.4,0,0,2782228.4,0,0,2984396.6,0,0,1455299.1,0,0,1857139.4,0,0,2285289.9,0,0,281702.17,0,0,760852.59,0,0,1429238.8};
+VT(0.038217426,0.13599196,0,0.033010101,0.13109378,0,0.038464606,0.12667013,0){0,0,2738753.8,0,0,2584208,0,0,2859316.3,0,0,-1938161,0,0,-1567613,0,0,-1476046.2,0,0,-3305386.1,0,0,-3200932.4,0,0,-3573486.5,0,0,972060.89,0,0,308418.11,0,0,-252868.56,0,0,3589652.3,0,0,3322264.5,0,0,3451249.3};
+VT(0.07180958,0.22984275,0,0.070607657,0.23670872,0,0.064373335,0.2338171,0){0,0,1079159.6,0,0,1007105.3,0,0,1185902.3,0,0,-2680718.2,0,0,-2594870.8,0,0,-3010536.1,0,0,2899261.6,0,0,3083897.2,0,0,3446119.8,0,0,-1622013.4,0,0,-2267120.1,0,0,-2291596.2,0,0,-492395.98,0,0,490193.02,0,0,79206.699};
+VT(0.09308158,0.15403623,0,0.088623123,0.15812222,0,0.084604507,0.15255901,0){0,0,579061.91,0,0,918302.92,0,0,1258841.2,0,0,-628036.95,0,0,-1074338,0,0,-1326319,0,0,-525997.02,0,0,-735787.48,0,0,-1187789.9,0,0,672596.25,0,0,1199414.9,0,0,1390056.3,0,0,469080.04,0,0,531983.03,0,0,1113216.6};
+VT(0.031105381,0.06529626,0,0.027058874,0.069011929,0,0.025221599,0.062165695,0){0,0,3030579.1,0,0,2727323.5,0,0,2618029.3,0,0,1667989.8,0,0,1363815.9,0,0,1547191.2,0,0,-444570.51,0,0,-681543.48,0,0,-156575.4,0,0,-2357289.6,0,0,-2386220.5,0,0,-1796512.5,0,0,-3210321.2,0,0,-2898415.6,0,0,-2702051.5};
+VT(0,0.15,0,0.0056981356,0.15371602,0,0,0.15714286,0){0,0,0,0,0,478995.44,0,0,0,0,0,0,0,0,-516269.88,0,0,0,0,0,0,0,0,-438816.38,0,0,0,0,0,0,0,0,550400.04,0,0,0,0,0,0,0,0,395913.98,0,0,0};
+VT(0.040431855,0.24188745,0,0.033139613,0.24047735,0,0.037546984,0.23452457,0){0,0,1110505,0,0,1026889.2,0,0,1205921.7,0,0,-2932804,0,0,-2694450.7,0,0,-3072707.6,0,0,3702149.5,0,0,3348643.4,0,0,3550700.1,0,0,-3142324.5,0,0,-2743423.6,0,0,-2423829.8,0,0,1453973.2,0,0,1106136.5,0,0,201013.93};
+VT(0.077364239,0.048764008,0,0.073604017,0.054819307,0,0.06961584,0.048915995,0){0,0,2450679,0,0,2744584.6,0,0,3063466,0,0,1825420.5,0,0,1864679.8,0,0,2277085.6,0,0,734405.59,0,0,386939.94,0,0,906160.93,0,0,-544039.45,0,0,-1214908.7,0,0,-697426.19,0,0,-1683943.8,0,0,-2427603.9,0,0,-2122325.6};
+VT(0.037546984,0.23452457,0,0.033139613,0.24047735,0,0.030075176,0.23324008,0){0,0,1205921.7,0,0,1026889.2,0,0,1077047.3,0,0,-3072707.6,0,0,-2694450.7,0,0,-2725827,0,0,3550700.1,0,0,3348643.4,0,0,3095770.8,0,0,-2423829.8,0,0,-2743423.6,0,0,-2013325.9,0,0,201013.93,0,0,1106136.5,0,0,-13872.597};
+VT(0.03690243,0.09394169,0,0.039702853,0.10111678,0,0.032036001,0.10024616,0){0,0,3135041.5,0,0,3175586.8,0,0,2837469.6,0,0,337961.95,0,0,-64516.934,0,0,-12660.65,0,0,-2760700,0,0,-3238866.3,0,0,-2850146.6,0,0,-3396384.7,0,0,-3108635.2,0,0,-2824890.6,0,0,-1002139.6,0,0,193445.51,0,0,37524.098};
+VT(0.054692531,0.17439284,0,0.060859952,0.17787963,0,0.055202425,0.1814475,0){0,0,2346407.8,0,0,2182203,0,0,2227021.2,0,0,-3532168.6,0,0,-3438395.7,0,0,-3667462.5,0,0,-561454.61,0,0,-202892.1,0,0,145084.74,0,0,3816051.1,0,0,3555311.4,0,0,3573754.5,0,0,-1367177.6,0,0,-1844119.8,0,0,-2457046.3};
+VT(0.060825265,0.17090728,0,0.060859952,0.17787963,0,0.054692531,0.17439284,0){0,0,2288734.2,0,0,2182203,0,0,2346407.8,0,0,-3282960.5,0,0,-3438395.7,0,0,-3532168.6,0,0,-862639.89,0,0,-202892.1,0,0,-561454.61,0,0,3657845.3,0,0,3555311.4,0,0,3816051.1,0,0,-726586.11,0,0,-1844119.8,0,0,-1367177.6};
+VT(0.092520768,0.26920591,0,0.095069321,0.27540052,0,0.089232651,0.27618677,0){0,0,145042.72,0,0,76899.446,0,0,160151.6,0,0,-420173.4,0,0,-225624.71,0,0,-470555.02,0,0,651988.34,0,0,359465.9,0,0,751874.95,0,0,-816598.86,0,0,-469594.27,0,0,-986723.61,0,0,896908.09,0,0,548580.83,0,0,1160401.4};
+VT(0.1,0.27142857,0,0.095069321,0.27540052,0,0.092520768,0.26920591,0){0,0,0,0,0,76899.446,0,0,145042.72,0,0,0,0,0,-225624.71,0,0,-420173.4,0,0,0,0,0,359465.9,0,0,651988.34,0,0,0,0,0,-469594.27,0,0,-816598.86,0,0,0,0,0,548580.83,0,0,896908.09};
+VT(0.092450683,0.030760689,0,0.095041081,0.024587994,0,0.1,0.028571429,0){0,0,900007.85,0,0,597113.29,0,0,0,0,0,807431.66,0,0,557751.32,0,0,0,0,0,631804.95,0,0,481620.22,0,0,0,0,0,391202.83,0,0,373740.48,0,0,0,0,0,110124.82,0,0,241099.33,0,0,0};
+VT(0.089183466,0.023798504,0,0.095041081,0.024587994,0,0.092450683,0.030760689,0){0,0,1283383.3,0,0,597113.29,0,0,900007.85,0,0,1204105.7,0,0,557751.32,0,0,807431.66,0,0,1050439.6,0,0,481620.22,0,0,631804.95,0,0,831874.08,0,0,373740.48,0,0,391202.83,0,0,561630.79,0,0,241099.33,0,0,110124.82};
+VT(0.041643161,0.17482395,0,0.034648589,0.17585937,0,0.036146522,0.16944297,0){0,0,2284160.6,0,0,2080615.7,0,0,2222447.1,0,0,-3458410.7,0,0,-3193762.3,0,0,-3121229.8,0,0,-506290.81,0,0,-371953.81,0,0,-960241.74,0,0,3718851.8,0,0,3392886,0,0,3509731.4,0,0,-1405815.9,0,0,-1443588.4,0,0,-459324.98};
+VT(0.1,0.25,0,0.095492809,0.25375881,0,0.095090425,0.2489538,0){0,0,0,0,0,131307.15,0,0,157454.16,0,0,0,0,0,-363726.6,0,0,-428416.46,0,0,0,0,0,512510.07,0,0,579817.55,0,0,0,0,0,-543451.99,0,0,-569427.53,0,0,0,0,0,449348.78,0,0,400020.01};
+VT(0.094913401,0.051076335,0,0.095360834,0.0462161,0,0.1,0.05,0){0,0,595503.05,0,0,547145.45,0,0,0,0,0,429138.45,0,0,421466.87,0,0,0,0,0,142901.48,0,0,198977.54,0,0,0,0,0,-183223.65,0,0,-69217.008,0,0,0,0,0,-458373.75,0,0,-321602.09,0,0,0};
+VT(0.068707287,0.030314019,0,0.067616069,0.037109229,0,0.060819012,0.031697917,0){0,0,3188897.7,0,0,3239242.7,0,0,3608360,0,0,2870259.7,0,0,2756202.5,0,0,3214477.8,0,0,2264806.3,0,0,1862139.4,0,0,2469695.4,0,0,1433032.7,0,0,690369.93,0,0,1455299.1,0,0,457746.25,0,0,-584563.48,0,0,281702.17};
+VT(0.061631884,0.26868773,0,0.068237016,0.26229006,0,0.069536278,0.26943087,0){0,0,591535.29,0,0,639705.29,0,0,505602.11,0,0,-1711593.4,0,0,-1820649,0,0,-1465439,0,0,2649353.2,0,0,2721368.6,0,0,2276404,0,0,-3304968.8,0,0,-3203243.1,0,0,-2856108.7,0,0,3608394.3,0,0,3191912.1,0,0,3145421.5};
+VT(0.057142857,0,0,0.051745598,0.0053231545,0,0.05,0,0){0,0,3783317.5,0,0,3873250.9,0,0,3880596.9,0,0,3783357,0,0,3861228.9,0,0,3880622.4,0,0,3783457.6,0,0,3837214.6,0,0,3880662.8,0,0,3783701.2,0,0,3801308.2,0,0,3880737.9,0,0,3783873.9,0,0,3753417.7,0,0,3880625.6};
+VT(0.05,0.3,0,0.051526128,0.29458598,0,0.057142857,0.3,0){0,0,0,0,0,109871.78,0,0,0,0,0,0,0,0,-329256.34,0,0,0,0,0,0,0,0,547568.39,0,0,0,0,0,0,0,0,-764098.34,0,0,0,0,0,0,0,0,977975.34,0,0,0};
+VT(0.1,0.064285714,0,0.095867013,0.068756454,0,0.09230899,0.063522919,0){0,0,0,0,0,470210.65,0,0,877619.52,0,0,0,0,0,236792.42,0,0,503392.8,0,0,0,0,0,-114175.46,0,0,-85524.836,0,0,0,0,0,-408471.99,0,0,-638068.15,0,0,0,0,0,-500215.61,0,0,-918939.46};
+VT(0.039157325,0.25334591,0,0.033025927,0.25326882,0,0.036308441,0.24745658,0){0,0,884627.38,0,0,809560.38,0,0,958174.94,0,0,-2446896,0,0,-2238649.8,0,0,-2591684.5,0,0,3436661.2,0,0,3142273.3,0,0,3460190.4,0,0,-3622356.9,0,0,-3308331.9,0,0,-3307339.6,0,0,2960330.2,0,0,2697705.3,0,0,2177878.8};
+VT(0.030440206,0.150204,0,0.033990129,0.14330646,0,0.037897724,0.149701,0){0,0,2239650.6,0,0,2486957.5,0,0,2552043.8,0,0,-2249230.7,0,0,-2138608.5,0,0,-2536068.8,0,0,-2230054.7,0,0,-2786553.8,0,0,-2567975.2,0,0,2258843.4,0,0,1748365.6,0,0,2520076,0,0,2220211.9,0,0,3031412.6,0,0,2583694.6};
+VT(0.025130011,0.29009115,0,0.0220603,0.28602893,0,0.028198926,0.28535727,0){0,0,142877.47,0,0,181204.07,0,0,230200.16,0,0,-427099.39,0,0,-539738.59,0,0,-685197.76,0,0,706741.94,0,0,886739.53,0,0,1124120.6,0,0,-978805.55,0,0,-1214791.9,0,0,-1536674.3,0,0,1240164.3,0,0,1516611.7,0,0,1912913.1};
+VT(0.013428016,0.091778472,0,0.013714026,0.097839388,0,0.0071591483,0.096788703,0){0,0,1408980.1,0,0,1412613.2,0,0,756711.76,0,0,204626.15,0,0,55008.627,0,0,43634.951,0,0,-1174648.8,0,0,-1355500.2,0,0,-710572.63,0,0,-1549888.7,0,0,-1463354,0,0,-795194.2,0,0,-600683.83,0,0,-165174.7,0,0,-130859.45};
+VT(0.0071591483,0.096788703,0,0.013714026,0.097839388,0,0.010955873,0.10281868,0){0,0,756711.76,0,0,1412613.2,0,0,1124212.8,0,0,43634.951,0,0,55008.627,0,0,-57954.543,0,0,-710572.63,0,0,-1355500.2,0,0,-1179275.3,0,0,-795194.2,0,0,-1463354,0,0,-1060620.9,0,0,-130859.45,0,0,-165174.7,0,0,173274.75};
+VT(0.037897724,0.149701,0,0.033990129,0.14330646,0,0.041319833,0.14315875,0){0,0,2552043.8,0,0,2486957.5,0,0,2735557.7,0,0,-2536068.8,0,0,-2138608.5,0,0,-2343944,0,0,-2567975.2,0,0,-2786553.8,0,0,-3071175.4,0,0,2520076,0,0,1748365.6,0,0,1904337.3,0,0,2583694.6,0,0,3031412.6,0,0,3343927.4};
+VT(0.035858843,0.031497608,0,0.030602087,0.036163623,0,0.028359285,0.029784535,0){0,0,3456371.8,0,0,3125169.1,0,0,2981166.2,0,0,3083741.5,0,0,2682310.4,0,0,2693525.9,0,0,2378649.5,0,0,1859340.6,0,0,2145980.7,0,0,1417116.3,0,0,772883.67,0,0,1391347.7,0,0,302618.73,0,0,-423255.99,0,0,502245.34};
+VT(0.026971271,0.22659033,0,0.029518097,0.21985532,0,0.034969012,0.22634925,0){0,0,1090633.5,0,0,1264894.2,0,0,1299939.6,0,0,-2658504.1,0,0,-2954793.2,0,0,-3164156.1,0,0,2731189,0,0,2682751.8,0,0,3237729.2,0,0,-1267784.1,0,0,-629411.95,0,0,-1478956,0,0,-909068.56,0,0,-1842177.8,0,0,-1117524.9};
+VT(0.034969012,0.22634925,0,0.029518097,0.21985532,0,0.036912897,0.21765752,0){0,0,1299939.6,0,0,1264894.2,0,0,1486590.9,0,0,-3164156.1,0,0,-2954793.2,0,0,-3421295.1,0,0,3237729.2,0,0,2682751.8,0,0,2965983.4,0,0,-1478956,0,0,-629411.95,0,0,-438566.7,0,0,-1117524.9,0,0,-1842177.8,0,0,-2395869.1};
+VT(0.051167355,0.022914381,0,0.052049192,0.01582547,0,0.057612168,0.01845715,0){0,0,3850137.8,0,0,3859264.8,0,0,3752599.8,0,0,3629520.4,0,0,3753529.9,0,0,3612875.5,0,0,3200919.1,0,0,3544947.6,0,0,3338613.5,0,0,2588908.3,0,0,3239251.6,0,0,2940029.2,0,0,1828396.4,0,0,2844641.6,0,0,2431782.4};
+VT(0.09071018,0.22887426,0,0.095706332,0.23121352,0,0.092168655,0.23668616,0){0,0,406264.77,0,0,183910.78,0,0,307607.26,0,0,-1003622.2,0,0,-460364.34,0,0,-792496.69,0,0,1069446.3,0,0,508106.39,0,0,941630.33,0,0,-568907.82,0,0,-303408.65,0,0,-691810.02,0,0,-233040.27,0,0,-52245.513,0,0,148523.72};
+VT(0.027903545,0.087518505,0,0.024499807,0.092422798,0,0.020473685,0.087577432,0){0,0,2674848,0,0,2390452.1,0,0,2087024.2,0,0,580994.77,0,0,320672.29,0,0,451292.51,0,0,-1967676.8,0,0,-2026771.7,0,0,-1538224.3,0,0,-2976106,0,0,-2619357.9,0,0,-2322280.1,0,0,-1655065.1,0,0,-944222.72,0,0,-1286407.6};
+VT(0.036146522,0.16944297,0,0.034648589,0.17585937,0,0.030623168,0.1713445,0){0,0,2222447.1,0,0,2080615.7,0,0,1985985.4,0,0,-3121229.8,0,0,-3193762.3,0,0,-2866418.8,0,0,-960241.74,0,0,-371953.81,0,0,-715248.18,0,0,3509731.4,0,0,3392886,0,0,3183566.3,0,0,-459324.98,0,0,-1443588.4,0,0,-696442.05};
+VT(0.027249449,0.18607819,0,0.034128539,0.18892309,0,0.029690249,0.19362013,0){0,0,1646413.8,0,0,1872288.6,0,0,1647856.1,0,0,-2861109.6,0,0,-3356683.8,0,0,-3101495.4,0,0,464444.42,0,0,788949.65,0,0,1088093.1,0,0,2518610.9,0,0,2731311.2,0,0,2141745.7,0,0,-2323177.4,0,0,-2954777.5,0,0,-2977851};
+VT(0,0.22142857,0,0.0069979116,0.22643766,0,0,0.22857143,0){0,0,0,0,0,317964.48,0,0,0,0,0,0,0,0,-774386.26,0,0,0,0,0,0,0,0,793599.18,0,0,0,0,0,0,0,0,-364658.79,0,0,0,0,0,0,0,0,-270536.88,0,0,0};
+VT(0.059551151,0.20970619,0,0.053910411,0.21448753,0,0.053221516,0.20704838,0){0,0,1688112.8,0,0,1667429.4,0,0,1805672.4,0,0,-3664209.4,0,0,-3752161.8,0,0,-3837129.3,0,0,2601193.1,0,0,3023771,0,0,2511247.5,0,0,619333.89,0,0,-28239.212,0,0,1011998.4,0,0,-3326584.6,0,0,-2988983.1,0,0,-3650194.7};
+VT(0.053221516,0.20704838,0,0.053910411,0.21448753,0,0.049232245,0.21047418,0){0,0,1805672.4,0,0,1667429.4,0,0,1752658.6,0,0,-3837129.3,0,0,-3752161.8,0,0,-3827070.5,0,0,2511247.5,0,0,3023771,0,0,2777012.8,0,0,1011998.4,0,0,-28239.212,0,0,540242.46,0,0,-3650194.7,0,0,-2988983.1,0,0,-3416565.4};
+VT(0.024008584,0.022367291,0,0.022427218,0.014872357,0,0.029163144,0.015558324,0){0,0,2639060.6,0,0,2505875.7,0,0,3068207,0,0,2494948.4,0,0,2445229.8,0,0,2986953.6,0,0,2214593.6,0,0,2325397.7,0,0,2826596.5,0,0,1813324.4,0,0,2149288.4,0,0,2591406.1,0,0,1312931.3,0,0,1920956.8,0,0,2287504.7};
+VT(0.029163144,0.015558324,0,0.022427218,0.014872357,0,0.025468185,0.010276157,0){0,0,3068207,0,0,2505875.7,0,0,2780034,0,0,2986953.6,0,0,2445229.8,0,0,2747892,0,0,2826596.5,0,0,2325397.7,0,0,2683968.5,0,0,2591406.1,0,0,2149288.4,0,0,2589008.8,0,0,2287504.7,0,0,1920956.8,0,0,2463902.9};
+VT(0.01788586,0.12850833,0,0.012365279,0.12660144,0,0.017763535,0.12074209,0){0,0,1616906.9,0,0,1158576.2,0,0,1657769.5,0,0,-895214.81,0,0,-596487.84,0,0,-657738.05,0,0,-2016472.2,0,0,-1447959.2,0,0,-2054600.3,0,0,-4802.2192,0,0,-105993.81,0,0,-581651.26,0,0,2014144.7,0,0,1396357.8,0,0,1703675.4};
+VT(0.017763535,0.12074209,0,0.012365279,0.12660144,0,0.01093484,0.12117452,0){0,0,1657769.5,0,0,1158576.2,0,0,1052666.9,0,0,-657738.05,0,0,-596487.84,0,0,-426753.37,0,0,-2054600.3,0,0,-1447959.2,0,0,-1306415.4,0,0,-581651.26,0,0,-105993.81,0,0,-350052.21,0,0,1703675.4,0,0,1396357.8,0,0,1098212.1};
+VT(0.03163445,0.20120488,0,0.025476801,0.19755762,0,0.029690249,0.19362013,0){0,0,1608414.7,0,0,1423125.8,0,0,1647856.1,0,0,-3251875.6,0,0,-2782737.9,0,0,-3101495.4,0,0,1714266.6,0,0,1235431.1,0,0,1088093.1,0,0,1500504,0,0,1602470.1,0,0,2141745.7,0,0,-3248047,0,0,-2766638.2,0,0,-2977851};
+VT(0.09230899,0.063522919,0,0.095867013,0.068756454,0,0.09123018,0.070922096,0){0,0,877619.52,0,0,470210.65,0,0,983713.53,0,0,503392.8,0,0,236792.42,0,0,465586.72,0,0,-85524.836,0,0,-114175.46,0,0,-297764.17,0,0,-638068.15,0,0,-408471.99,0,0,-904277.98,0,0,-918939.46,0,0,-500215.61,0,0,-1034644.8};
+VT(0.0079950318,0.059686314,0,0.012193394,0.066188359,0,0.0062494098,0.068021592,0){0,0,917766.47,0,0,1364188,0,0,709501.16,0,0,570756.35,0,0,734639.92,0,0,364477.97,0,0,7912.4367,0,0,-233939.49,0,0,-157824.6,0,0,-557994.72,0,0,-1094586.7,0,0,-603457.47,0,0,-913265.38,0,0,-1450385,0,0,-756039.79};
+VT(0.050721192,0.10961634,0,0.05615957,0.1141762,0,0.051013063,0.11801667,0){0,0,3257974.6,0,0,3147681.4,0,0,3161388.4,0,0,-583831.78,0,0,-840990.83,0,0,-1083065.4,0,0,-3737290.3,0,0,-3764018.8,0,0,-3873486.3,0,0,-2483878.9,0,0,-1917372.9,0,0,-1463412.7,0,0,1698581.7,0,0,2358868.4,0,0,2911579};
+VT(0.051703203,0.27754162,0,0.045592054,0.27439642,0,0.049721881,0.27094787,0){0,0,454636.43,0,0,513714.39,0,0,588018.61,0,0,-1338881.7,0,0,-1504437.2,0,0,-1710042.9,0,0,2149437.1,0,0,2387679.2,0,0,2675009.8,0,0,-2841702,0,0,-3100344.3,0,0,-3394309,0,0,3377384.9,0,0,3591305.7,0,0,3801713.7};
+VT(0.024044461,0.20382537,0,0.021120118,0.21068669,0,0.015977634,0.20443356,0){0,0,1283805.9,0,0,1077357.5,0,0,895779.15,0,0,-2655634.7,0,0,-2356401.7,0,0,-1862602.8,0,0,1553893.8,0,0,1720167.1,0,0,1114548.4,0,0,995311.88,0,0,314292.11,0,0,659707.69,0,0,-2617892.2,0,0,-2093742.8,0,0,-1827076.9};
+VT(0.08682376,0.20181233,0,0.093164956,0.1980516,0,0.093706234,0.20596864,0){0,0,767576.83,0,0,420734.09,0,0,360320.46,0,0,-1560255.4,0,0,-826537.04,0,0,-758974.46,0,0,843726.65,0,0,376428.12,0,0,479351.87,0,0,688912.23,0,0,463603.83,0,0,228803.73,0,0,-1555436.8,0,0,-823893.15,0,0,-732939.79};
+VT(0.030075176,0.23324008,0,0.033139613,0.24047735,0,0.025350652,0.23917347,0){0,0,1077047.3,0,0,1026889.2,0,0,868665.73,0,0,-2725827,0,0,-2694450.7,0,0,-2265304,0,0,3095770.8,0,0,3348643.4,0,0,2773502.3,0,0,-2013325.9,0,0,-2743423.6,0,0,-2193941.8,0,0,-13872.597,0,0,1106136.5,0,0,753574.67};
+VT(0.032229878,0.047894836,0,0.035422008,0.053603109,0,0.028699663,0.054481756,0){0,0,3188476.9,0,0,3344502.1,0,0,2920693,0,0,2403076.1,0,0,2318078.8,0,0,1995520.8,0,0,1025710.6,0,0,580213.58,0,0,438210.61,0,0,-604377.64,0,0,-1335777.4,0,0,-1257984.1,0,0,-2086050.7,0,0,-2842327.2,0,0,-2556170.3};
+VT(0.038515413,0.047952704,0,0.035422008,0.053603109,0,0.032229878,0.047894836,0){0,0,3516906.1,0,0,3344502.1,0,0,3188476.9,0,0,2648581.9,0,0,2318078.8,0,0,2403076.1,0,0,1126309.3,0,0,580213.58,0,0,1025710.6,0,0,-674068.75,0,0,-1335777.4,0,0,-604377.64,0,0,-2308227.3,0,0,-2842327.2,0,0,-2086050.7};
+VT(0.0093450955,0.28843768,0,0.010662343,0.29482959,0,0.0045473776,0.2936365,0){0,0,67949.514,0,0,34537.041,0,0,18406.211,0,0,-202850.84,0,0,-103506.64,0,0,-55138.333,0,0,334776.34,0,0,172164.12,0,0,91630.552,0,0,-461793.67,0,0,-240303.04,0,0,-127724.83,0,0,581935.08,0,0,307518.14,0,0,162961.08};
+VT(0.0045481906,0.0063920675,0,0.010679145,0.0052482016,0,0.0093389246,0.011691623,0){0,0,552257.15,0,0,1277155.8,0,0,1120186.5,0,0,549810.55,0,0,1273289.3,0,0,1103410.3,0,0,544927.47,0,0,1265566.3,0,0,1070108.3,0,0,537633.65,0,0,1254019.7,0,0,1020788.4,0,0,527798.54,0,0,1238493.9,0,0,956114.18};
+VT(0.064285714,0,0,0.06203594,0.0060944193,0,0.057142857,0,0){0,0,3496327.6,0,0,3604620.2,0,0,3783317.5,0,0,3496358.5,0,0,3589956.2,0,0,3783357,0,0,3496415,0,0,3560685.5,0,0,3783457.6,0,0,3496523.2,0,0,3516960.1,0,0,3783701.2,0,0,3496472.9,0,0,3458793.9,0,0,3783873.9};
+VT(0.057142857,0.3,0,0.061805884,0.29356168,0,0.064285714,0.3,0){0,0,0,0,0,121923.05,0,0,0,0,0,0,0,0,-365207.83,0,0,0,0,0,0,0,0,606815.62,0,0,0,0,0,0,0,0,-845641.09,0,0,0,0,0,0,0,0,1080583.1,0,0,0};
+VT(0.070477538,0.15360968,0,0.064971856,0.15110456,0,0.069467767,0.146519,0){0,0,2153625.7,0,0,2431817,0,0,2287173.5,0,0,-2316413.6,0,0,-2488096.1,0,0,-2120501.9,0,0,-1978592.7,0,0,-2374265.3,0,0,-2441744.6,0,0,2466066.8,0,0,2543085,0,0,1942651.5,0,0,1792310.4,0,0,2315361.9,0,0,2583122};
+VT(0.048791783,0.28884593,0,0.051526128,0.29458598,0,0.045931579,0.29422002,0){0,0,226341.07,0,0,109871.78,0,0,116468.36,0,0,-675936.71,0,0,-329256.34,0,0,-348980.73,0,0,1116322.7,0,0,547568.39,0,0,580225.36,0,0,-1541505,0,0,-764098.34,0,0,-809364.6,0,0,1945474.1,0,0,977975.34,0,0,1035478};
+VT(0.046181733,0.0056701177,0,0.051745598,0.0053231545,0,0.049204373,0.010884263,0){0,0,3851009.3,0,0,3873250.9,0,0,3873084,0,0,3837454.5,0,0,3861228.9,0,0,3822842.7,0,0,3810385,0,0,3837214.6,0,0,3723003.5,0,0,3769920.5,0,0,3801308.2,0,0,3574883.8,0,0,3715901.2,0,0,3753417.7,0,0,3380124.5};
+VT(0.089230742,0.11966768,0,0.082946441,0.12207685,0,0.08466046,0.11619385,0){0,0,1043332.5,0,0,1589878.9,0,0,1475783,0,0,-391602.7,0,0,-673263.29,0,0,-452604.25,0,0,-1287980.7,0,0,-1978038.1,0,0,-1789662.1,0,0,-412950.99,0,0,-467139.5,0,0,-788262.21,0,0,1030099.2,0,0,1708498.9,0,0,1243195.1};
+VT(0.1,0.078571429,0,0.095795895,0.073622969,0,0.1,0.071428571,0){0,0,0,0,0,473503.74,0,0,0,0,0,0,0,0,205720.2,0,0,0,0,0,0,0,0,-178405.32,0,0,0,0,0,0,0,0,-461642.03,0,0,0,0,0,0,0,0,-483922.03,0,0,0};
+VT(0.017433092,0.042090914,0,0.022876349,0.043626948,0,0.019247887,0.048569646,0){0,0,1971771.3,0,0,2488553.5,0,0,2135187.8,0,0,1594855,0,0,1978130.3,0,0,1594654.5,0,0,913057.13,0,0,1061959.9,0,0,650408.09,0,0,56690.05,0,0,-72059.632,0,0,-458538.7,0,0,-810753.02,0,0,-1191549.5,0,0,-1451674.1};
+VT(0.060819012,0.031697917,0,0.067616069,0.037109229,0,0.060555575,0.040182349,0){0,0,3608360,0,0,3239242.7,0,0,3588260.7,0,0,3214477.8,0,0,2756202.5,0,0,2962222.2,0,0,2469695.4,0,0,1862139.4,0,0,1819353,0,0,1455299.1,0,0,690369.93,0,0,359025.67,0,0,281702.17,0,0,-584563.48,0,0,-1164330.1};
+VT(0.060672356,0.25950081,0,0.068237016,0.26229006,0,0.061631884,0.26868773,0){0,0,771273.27,0,0,639705.29,0,0,591535.29,0,0,-2177172.3,0,0,-1820649,0,0,-1711593.4,0,0,3197356.1,0,0,2721368.6,0,0,2649353.2,0,0,-3651078,0,0,-3203243.1,0,0,-3304968.8,0,0,3457676.3,0,0,3191912.1,0,0,3608394.3};
+VT(0.043027686,0.24899973,0,0.049037582,0.25027532,0,0.04563604,0.25694979,0){0,0,999522.33,0,0,998508.07,0,0,859240.08,0,0,-2720190.5,0,0,-2730849.8,0,0,-2406042.8,0,0,3683283.3,0,0,3739350.2,0,0,3472131.8,0,0,-3620573.8,0,0,-3756698.7,0,0,-3844488.4,0,0,2549278.8,0,0,2778087.3,0,0,3448330.3};
+VT(0.061098586,0.072147464,0,0.064846874,0.068845861,0,0.066925078,0.074981916,0){0,0,3389933,0,0,3243292.3,0,0,3090390.8,0,0,1545196.6,0,0,1629296.1,0,0,1280900.5,0,0,-1140417.3,0,0,-795531.06,0,0,-1278621.5,0,0,-3205469.9,0,0,-2824516.6,0,0,-3089611.2,0,0,-3526423.9,0,0,-3448034.5,0,0,-3091904.4};
+VT(0.051013063,0.11801667,0,0.05615957,0.1141762,0,0.057323957,0.1204315,0){0,0,3161388.4,0,0,3147681.4,0,0,3051716.5,0,0,-1083065.4,0,0,-840990.83,0,0,-1191883,0,0,-3873486.3,0,0,-3764018.8,0,0,-3778168.4,0,0,-1463412.7,0,0,-1917372.9,0,0,-1110713.1,0,0,2911579,0,0,2358868.4,0,0,3101303};
+VT(0.1,0.22857143,0,0.095652827,0.22622146,0,0.1,0.22142857,0){0,0,0,0,0,199039.37,0,0,0,0,0,0,0,0,-484109.58,0,0,0,0,0,0,0,0,494313.66,0,0,0,0,0,0,0,0,-223837.82,0,0,0,0,0,0,0,0,-173819.74,0,0,0};
+VT(0.1,0.19285714,0,0.095453592,0.18738967,0,0.1,0.18571429,0){0,0,0,0,0,307137.29,0,0,0,0,0,0,0,0,-541566.85,0,0,0,0,0,0,0,0,106216.39,0,0,0,0,0,0,0,0,460538.95,0,0,0,0,0,0,0,0,-458087.35,0,0,0};
+VT(0.049678492,0.18505966,0,0.048811039,0.17808485,0,0.055202425,0.1814475,0){0,0,2196886.7,0,0,2310715.6,0,0,2227021.2,0,0,-3774046.6,0,0,-3650410,0,0,-3667462.5,0,0,512508.07,0,0,-194330.82,0,0,145084.74,0,0,3406255.6,0,0,3763231.4,0,0,3573754.5,0,0,-2958276.7,0,0,-1987755.8,0,0,-2457046.3};
+VT(0.089437553,0.21298247,0,0.086709216,0.20730703,0,0.093706234,0.20596864,0){0,0,556322.48,0,0,734117.03,0,0,360320.46,0,0,-1238115.4,0,0,-1563285.8,0,0,-758974.46,0,0,961021.23,0,0,1031586.7,0,0,479351.87,0,0,60411.18,0,0,398134,0,0,228803.73,0,0,-1035404.3,0,0,-1481512.9,0,0,-732939.79};
+VT(0.093706234,0.20596864,0,0.086709216,0.20730703,0,0.08682376,0.20181233,0){0,0,360320.46,0,0,734117.03,0,0,767576.83,0,0,-758974.46,0,0,-1563285.8,0,0,-1560255.4,0,0,479351.87,0,0,1031586.7,0,0,843726.65,0,0,228803.73,0,0,398134,0,0,688912.23,0,0,-732939.79,0,0,-1481512.9,0,0,-1555436.8};
+VT(0.074105201,0.11070107,0,0.06715469,0.10983132,0,0.072126291,0.10515927,0){0,0,2359475.3,0,0,2794834,0,0,2539730.3,0,0,-471755.94,0,0,-512277.78,0,0,-241283.81,0,0,-2736894.8,0,0,-3213264.7,0,0,-2758172.2,0,0,-1717960.7,0,0,-2112070.8,0,0,-2254933.2,0,0,1362139.4,0,0,1488257.3,0,0,717337.89};
+VT(0.056292141,0.2827555,0,0.051519181,0.28417908,0,0.051703203,0.27754162,0){0,0,343081.75,0,0,320732.11,0,0,454636.43,0,0,-1018093.3,0,0,-953415.16,0,0,-1338881.7,0,0,1660020.8,0,0,1560004.1,0,0,2149437.1,0,0,-2248005.1,0,0,-2123899.5,0,0,-2841702,0,0,2762903.8,0,0,2629434.9,0,0,3377384.9};
+VT(0.055202425,0.1814475,0,0.048811039,0.17808485,0,0.054692531,0.17439284,0){0,0,2227021.2,0,0,2310715.6,0,0,2346407.8,0,0,-3667462.5,0,0,-3650410,0,0,-3532168.6,0,0,145084.74,0,0,-194330.82,0,0,-561454.61,0,0,3573754.5,0,0,3763231.4,0,0,3816051.1,0,0,-2457046.3,0,0,-1987755.8,0,0,-1367177.6};
+VT(0.046063037,0.016810165,0,0.043829005,0.011024747,0,0.049204373,0.010884263,0){0,0,3836060.2,0,0,3801549.1,0,0,3873084,0,0,3717529.2,0,0,3750937.1,0,0,3822842.7,0,0,3484126.2,0,0,3650381.9,0,0,3723003.5,0,0,3143090.2,0,0,3501249.8,0,0,3574883.8,0,0,2704667.4,0,0,3305260.3,0,0,3380124.5};
+VT(0.037071258,0.0642048,0,0.032659307,0.059686042,0,0.038435934,0.058364632,0){0,0,3365311.2,0,0,3158137.1,0,0,3459248.5,0,0,1900443.5,0,0,1964024.3,0,0,2206750.4,0,0,-391679.98,0,0,27282.242,0,0,155241.86,0,0,-2513388.8,0,0,-1919818.3,0,0,-1952496,0,0,-3541461.8,0,0,-3141270.1,0,0,-3353689.4};
+VT(0.011268327,0.1984065,0,0.005051806,0.19767546,0,0.0066871595,0.19241823,0){0,0,682302.12,0,0,313084.45,0,0,432113.5,0,0,-1344805.9,0,0,-612892.85,0,0,-803518.34,0,0,623458.07,0,0,273796.53,0,0,258472.73,0,0,739532.85,0,0,350786.74,0,0,581490.34,0,0,-1341727.7,0,0,-609909.8,0,0,-758588.26};
+VT(0.011197941,0.071439681,0,0.012549176,0.077039569,0,0.0060853536,0.074713803,0){0,0,1244724.5,0,0,1370920.5,0,0,681675.12,0,0,579995.21,0,0,525978.15,0,0,285253.65,0,0,-394493.66,0,0,-643140.23,0,0,-277070.48,0,0,-1158343.6,0,0,-1415881.7,0,0,-678306.76,0,0,-1303869.8,0,0,-1316306.1,0,0,-685312.86};
+VT(0.0060853536,0.074713803,0,0.012549176,0.077039569,0,0.0064539684,0.081629255,0){0,0,681675.12,0,0,1370920.5,0,0,711139.06,0,0,285253.65,0,0,525978.15,0,0,222377.16,0,0,-277070.48,0,0,-643140.23,0,0,-419239.47,0,0,-678306.76,0,0,-1415881.7,0,0,-772749.89,0,0,-685312.86,0,0,-1316306.1,0,0,-595288.06};
+VT(0.0910478,0.13167545,0,0.087905667,0.12517971,0,0.093823791,0.12410599,0){0,0,831136.87,0,0,1140990.9,0,0,595735.92,0,0,-514132.23,0,0,-554517.87,0,0,-276601.23,0,0,-1027305.8,0,0,-1425990.8,0,0,-743959.63,0,0,122313.64,0,0,-178453.87,0,0,-121937.8,0,0,1073956.7,0,0,1334087.8,0,0,678759.2};
+VT(0.087905667,0.12517971,0,0.082946441,0.12207685,0,0.089230742,0.11966768,0){0,0,1140990.9,0,0,1589878.9,0,0,1043332.5,0,0,-554517.87,0,0,-673263.29,0,0,-391602.7,0,0,-1425990.8,0,0,-1978038.1,0,0,-1287980.7,0,0,-178453.87,0,0,-467139.5,0,0,-412950.99,0,0,1334087.8,0,0,1708498.9,0,0,1030099.2};
+VT(0.0066871595,0.19241823,0,0.012931293,0.19295437,0,0.011268327,0.1984065,0){0,0,432113.5,0,0,815194.79,0,0,682302.12,0,0,-803518.34,0,0,-1524077.7,0,0,-1344805.9,0,0,258472.73,0,0,510133.92,0,0,623458.07,0,0,581490.34,0,0,1080471.8,0,0,739532.85,0,0,-758588.26,0,0,-1450076.4,0,0,-1341727.7};
+VT(0.05,0,0,0.046181733,0.0056701177,0,0.042857143,0,0){0,0,3880596.9,0,0,3851009.3,0,0,3783299.5,0,0,3880622.4,0,0,3837454.5,0,0,3783327.5,0,0,3880662.8,0,0,3810385,0,0,3783379.6,0,0,3880737.9,0,0,3769920.5,0,0,3783486.4,0,0,3880625.6,0,0,3715901.2,0,0,3783576.5};
+VT(0.042857143,0.3,0,0.045931579,0.29422002,0,0.05,0.3,0){0,0,0,0,0,116468.36,0,0,0,0,0,0,0,0,-348980.73,0,0,0,0,0,0,0,0,580225.36,0,0,0,0,0,0,0,0,-809364.6,0,0,0,0,0,0,0,0,1035478,0,0,0};
+VT(0.057323957,0.1204315,0,0.05615957,0.1141762,0,0.062195955,0.11505156,0){0,0,3051716.5,0,0,3147681.4,0,0,2965673.8,0,0,-1191883,0,0,-840990.83,0,0,-843057.19,0,0,-3778168.4,0,0,-3764018.8,0,0,-3569130.8,0,0,-1110713.1,0,0,-1917372.9,0,0,-1711501.2,0,0,3101303,0,0,2358868.4,0,0,2344130.4};
+VT(0.013428016,0.091778472,0,0.01318623,0.084416193,0,0.020473685,0.087577432,0){0,0,1408980.1,0,0,1411871.7,0,0,2087024.2,0,0,204626.15,0,0,378554.62,0,0,451292.51,0,0,-1174648.8,0,0,-931831.12,0,0,-1538224.3,0,0,-1549888.7,0,0,-1560266,0,0,-2322280.1,0,0,-600683.83,0,0,-1046999.7,0,0,-1286407.6};
+VT(0.030312881,0.27848596,0,0.028198926,0.28535727,0,0.023483408,0.28013687,0){0,0,355416.48,0,0,230200.16,0,0,270985.88,0,0,-1048284.8,0,0,-685197.76,0,0,-801278.39,0,0,1688178.9,0,0,1124120.6,0,0,1297043.7,0,0,-2242771,0,0,-1536674.3,0,0,-1736920.8,0,0,2683885.3,0,0,1912913.1,0,0,2101746.5};
+VT(0.0069613667,0.17349451,0,0.0062925762,0.18063125,0,0,0.17857143,0){0,0,517779.21,0,0,445914.92,0,0,0,0,0,-769992.03,0,0,-727143.63,0,0,0,0,0,-142713.64,0,0,12632.594,0,0,0,0,0,839532.94,0,0,719304.1,0,0,0,0,0,-266340.1,0,0,-466469.22,0,0,0};
+VT(0.046063037,0.016810165,0,0.052049192,0.01582547,0,0.051167355,0.022914381,0){0,0,3836060.2,0,0,3859264.8,0,0,3850137.8,0,0,3717529.2,0,0,3753529.9,0,0,3629520.4,0,0,3484126.2,0,0,3544947.6,0,0,3200919.1,0,0,3143090.2,0,0,3239251.6,0,0,2588908.3,0,0,2704667.4,0,0,2844641.6,0,0,1828396.4};
+VT(0.065931692,0.10408722,0,0.06715469,0.10983132,0,0.059543685,0.10776494,0){0,0,2911358.9,0,0,2794834,0,0,3132791.5,0,0,-218409.17,0,0,-512277.78,0,0,-451048.14,0,0,-3113407,0,0,-3213264.7,0,0,-3519016.9,0,0,-2661455,0,0,-2112070.8,0,0,-2561357.9,0,0,651464.78,0,0,1488257.3,0,0,1326599.2};
+VT(0.083190767,0.25723975,0,0.085145188,0.25032735,0,0.090077759,0.25268961,0){0,0,434158.6,0,0,448997.25,0,0,291813.61,0,0,-1216864.4,0,0,-1228228.7,0,0,-805257.31,0,0,1759626.8,0,0,1682589.8,0,0,1125037.4,0,0,-1955417.3,0,0,-1691886.1,0,0,-1174248.1,0,0,1765235.2,0,0,1253443,0,0,940920.06};
+VT(0.07921504,0.25033934,0,0.085145188,0.25032735,0,0.083190767,0.25723975,0){0,0,606155.6,0,0,448997.25,0,0,434158.6,0,0,-1658203,0,0,-1228228.7,0,0,-1216864.4,0,0,2271843.6,0,0,1682589.8,0,0,1759626.8,0,0,-2284831,0,0,-1691886.1,0,0,-1955417.3,0,0,1693484.6,0,0,1253443,0,0,1765235.2};
+VT(0.08974924,0.047235181,0,0.083998423,0.049627851,0,0.082493405,0.042375289,0){0,0,1190814.4,0,0,1806853.8,0,0,1978611.8,0,0,905328.07,0,0,1329741.5,0,0,1595319.9,0,0,402804.56,0,0,501474.01,0,0,902966.17,0,0,-196265.4,0,0,-459273.5,0,0,35643.43,0,0,-748421.11,0,0,-1299103.8,0,0,-838916.97};
+VT(0.082493405,0.042375289,0,0.083998423,0.049627851,0,0.077364239,0.048764008,0){0,0,1978611.8,0,0,1806853.8,0,0,2450679,0,0,1595319.9,0,0,1329741.5,0,0,1825420.5,0,0,902966.17,0,0,501474.01,0,0,734405.59,0,0,35643.43,0,0,-459273.5,0,0,-544039.45,0,0,-838916.97,0,0,-1299103.8,0,0,-1683943.8};
+VT(0.1,0.23571429,0,0.095706332,0.23121352,0,0.1,0.22857143,0){0,0,0,0,0,183910.78,0,0,0,0,0,0,0,0,-460364.34,0,0,0,0,0,0,0,0,508106.39,0,0,0,0,0,0,0,0,-303408.65,0,0,0,0,0,0,0,0,-52245.513,0,0,0};
+VT(0.055890502,0.18802963,0,0.061291474,0.18447479,0,0.06137482,0.19024807,0){0,0,2110328.4,0,0,2069396,0,0,1976038.9,0,0,-3747121.1,0,0,-3531333.7,0,0,-3592882,0,0,795966.68,0,0,425331.11,0,0,963745.22,0,0,3129878.5,0,0,3230965.1,0,0,2804392.5,0,0,-3224012.4,0,0,-2708277.6,0,0,-3258719.1};
+VT(0.049204373,0.010884263,0,0.052049192,0.01582547,0,0.046063037,0.016810165,0){0,0,3873084,0,0,3859264.8,0,0,3836060.2,0,0,3822842.7,0,0,3753529.9,0,0,3717529.2,0,0,3723003.5,0,0,3544947.6,0,0,3484126.2,0,0,3574883.8,0,0,3239251.6,0,0,3143090.2,0,0,3380124.5,0,0,2844641.6,0,0,2704667.4};
+VT(0.021428571,0.3,0,0.024877102,0.29495936,0,0.028571429,0.3,0){0,0,0,0,0,72135.52,0,0,0,0,0,0,0,0,-216205.93,0,0,0,0,0,0,0,0,359676.71,0,0,0,0,0,0,0,0,-502149.61,0,0,0,0,0,0,0,0,642973.44,0,0,0};
+VT(0.028571429,0,0,0.025051818,0.0051959301,0,0.021428571,0,0){0,0,3033980.1,0,0,2747435.6,0,0,2419501.9,0,0,3033983.4,0,0,2739316.7,0,0,2419561.9,0,0,3033988.7,0,0,2723095.2,0,0,2419679.8,0,0,3034024.4,0,0,2698832.3,0,0,2419876.4,0,0,3033982.5,0,0,2666496.7,0,0,2419989.4};
+VT(0.093922759,0.092262381,0,0.09416017,0.099511923,0,0.087331535,0.0958472,0){0,0,652083.63,0,0,613994.66,0,0,1318484.3,0,0,89312.894,0,0,5422.3845,0,0,98077.228,0,0,-550573,0,0,-608645.22,0,0,-1213131.9,0,0,-715327.2,0,0,-619557.01,0,0,-1401481.2,0,0,-262838.8,0,0,-16415.987,0,0,-292629.72};
+VT(0.01093484,0.12117452,0,0.012365279,0.12660144,0,0.0061411468,0.1246533,0){0,0,1052666.9,0,0,1158576.2,0,0,591118.91,0,0,-426753.37,0,0,-596487.84,0,0,-280990.71,0,0,-1306415.4,0,0,-1447959.2,0,0,-738586.84,0,0,-350052.21,0,0,-105993.81,0,0,-106527.54,0,0,1098212.1,0,0,1396357.8,0,0,682629.18};
+VT(0.0061411468,0.1246533,0,0.012365279,0.12660144,0,0.0072553778,0.13224921,0){0,0,591118.91,0,0,1158576.2,0,0,674958.82,0,0,-280990.71,0,0,-596487.84,0,0,-425463.67,0,0,-738586.84,0,0,-1447959.2,0,0,-832230.25,0,0,-106527.54,0,0,-105993.81,0,0,117822.57,0,0,682629.18,0,0,1396357.8,0,0,875622.71};
+VT(0.066803853,0.25459223,0,0.068237016,0.26229006,0,0.060672356,0.25950081,0){0,0,789541.66,0,0,639705.29,0,0,771273.27,0,0,-2193455.3,0,0,-1820649,0,0,-2177172.3,0,0,3110738.9,0,0,2721368.6,0,0,3197356.1,0,0,-3337877,0,0,-3203243.1,0,0,-3651078,0,0,2824240.3,0,0,3191912.1,0,0,3457676.3};
+VT(0.060555575,0.040182349,0,0.067616069,0.037109229,0,0.066401409,0.0434645,0){0,0,3588260.7,0,0,3239242.7,0,0,3289675.8,0,0,2962222.2,0,0,2756202.5,0,0,2619840.6,0,0,1819353,0,0,1862139.4,0,0,1416557.6,0,0,359025.67,0,0,690369.93,0,0,-75156.319,0,0,-1164330.1,0,0,-584563.48,0,0,-1551772};
+VT(0.016878531,0.18478654,0,0.021212478,0.18688263,0,0.017373248,0.19021363,0){0,0,1113458.1,0,0,1339179.6,0,0,1095255.9,0,0,-1906862.4,0,0,-2348119.2,0,0,-1990705.9,0,0,245299.96,0,0,429909.33,0,0,532263.7,0,0,1732097.5,0,0,2024227.8,0,0,1555631.8,0,0,-1479759.2,0,0,-1955356.8,0,0,-1804413.6};
+VT(0.021251228,0.18136297,0,0.021212478,0.18688263,0,0.016878531,0.18478654,0){0,0,1398279.8,0,0,1339179.6,0,0,1113458.1,0,0,-2300353.4,0,0,-2348119.2,0,0,-1906862.4,0,0,85724.805,0,0,429909.33,0,0,245299.96,0,0,2245163.6,0,0,2024227.8,0,0,1732097.5,0,0,-1534338.6,0,0,-1955356.8,0,0,-1479759.2};
+VT(0.029991713,0.27132489,0,0.025044032,0.27464897,0,0.023009638,0.26878949,0){0,0,469504.82,0,0,363665.57,0,0,417665.14,0,0,-1366503,0,0,-1065519.5,0,0,-1208783.5,0,0,2141236.7,0,0,1692735.8,0,0,1871958.7,0,0,-2724385.3,0,0,-2201379.5,0,0,-2337004.8,0,0,3063642.3,0,0,2555652.6,0,0,2554445.3};
+VT(0.023009638,0.26878949,0,0.025044032,0.27464897,0,0.018422519,0.27450763,0){0,0,417665.14,0,0,363665.57,0,0,282501.19,0,0,-1208783.5,0,0,-1065519.5,0,0,-827496.14,0,0,1871958.7,0,0,1692735.8,0,0,1313896,0,0,-2337004.8,0,0,-2201379.5,0,0,-1707268.8,0,0,2554445.3,0,0,2555652.6,0,0,1979556.1};
+VT(0.048866761,0.029559705,0,0.054261983,0.029107824,0,0.052748817,0.036292023,0){0,0,3831772.8,0,0,3801269,0,0,3796611.1,0,0,3467532.3,0,0,3450822.2,0,0,3254886.9,0,0,2773676.3,0,0,2782228.4,0,0,2248728.5,0,0,1816186,0,0,1857139.4,0,0,921690.78,0,0,685852.4,0,0,760852.59,0,0,-537197.11};
+VT(0.069025318,0.11622387,0,0.06715469,0.10983132,0,0.074105201,0.11070107,0){0,0,2631986.5,0,0,2794834,0,0,2359475.3,0,0,-808686.45,0,0,-512277.78,0,0,-471755.94,0,0,-3192250.9,0,0,-3213264.7,0,0,-2736894.8,0,0,-1402768.4,0,0,-2112070.8,0,0,-1717960.7,0,0,2220554.1,0,0,1488257.3,0,0,1362139.4};
+VT(0.036912897,0.21765752,0,0.042541479,0.22296234,0,0.034969012,0.22634925,0){0,0,1486590.9,0,0,1481591,0,0,1299939.6,0,0,-3421295.1,0,0,-3531706.6,0,0,-3164156.1,0,0,2965983.4,0,0,3405357.4,0,0,3237729.2,0,0,-438566.7,0,0,-1180392.3,0,0,-1478956,0,0,-2395869.1,0,0,-1772446.7,0,0,-1117524.9};
+VT(0.034969012,0.22634925,0,0.042541479,0.22296234,0,0.041402067,0.22952626,0){0,0,1299939.6,0,0,1481591,0,0,1348916.4,0,0,-3164156.1,0,0,-3531706.6,0,0,-3344816,0,0,3237729.2,0,0,3405357.4,0,0,3600200.4,0,0,-1478956,0,0,-1180392.3,0,0,-1982154,0,0,-1117524.9,0,0,-1772446.7,0,0,-667743.82};
+VT(0.036602132,0.28491153,0,0.028198926,0.28535727,0,0.030312881,0.27848596,0){0,0,279518.56,0,0,230200.16,0,0,355416.48,0,0,-831596.18,0,0,-685197.76,0,0,-1048284.8,0,0,1362985.6,0,0,1124120.6,0,0,1688178.9,0,0,-1860498.2,0,0,-1536674.3,0,0,-2242771,0,0,2311728.5,0,0,1912913.1,0,0,2683885.3};
+VT(0.072126291,0.10515927,0,0.06715469,0.10983132,0,0.065931692,0.10408722,0){0,0,2539730.3,0,0,2794834,0,0,2911358.9,0,0,-241283.81,0,0,-512277.78,0,0,-218409.17,0,0,-2758172.2,0,0,-3213264.7,0,0,-3113407,0,0,-2254933.2,0,0,-2112070.8,0,0,-2661455,0,0,717337.89,0,0,1488257.3,0,0,651464.78};
+VT(0.049165273,0.076760106,0,0.047469022,0.070467195,0,0.054876921,0.07294965,0){0,0,3570137.5,0,0,3608010.8,0,0,3558755.8,0,0,1384898,0,0,1730907.5,0,0,1580988.4,0,0,-1648055.9,0,0,-1046792,0,0,-1275447.3,0,0,-3672308.6,0,0,-3280034.9,0,0,-3423192.1,0,0,-3449021.3,0,0,-3807136.9,0,0,-3669097.1};
+VT(0.085115353,0.26563346,0,0.086077973,0.27164165,0,0.081004963,0.27070547,0){0,0,313056.52,0,0,243157.03,0,0,333174.81,0,0,-899063.8,0,0,-708191.99,0,0,-968418.7,0,0,1369900.4,0,0,1111255.9,0,0,1513258.3,0,0,-1665255.4,0,0,-1417072.6,0,0,-1916833.2,0,0,1747205.8,0,0,1598582.9,0,0,2141327.9};
+VT(0.080699945,0.029142305,0,0.085916752,0.02828,0,0.084917502,0.034253561,0){0,0,2185639.9,0,0,1643257.2,0,0,1742331.8,0,0,1983669.2,0,0,1500211.7,0,0,1520580.8,0,0,1598386.1,0,0,1226559.7,0,0,1105294,0,0,1065401.8,0,0,846114.35,0,0,549324.68,0,0,433818.71,0,0,391827.49,0,0,-76880.401};
+VT(0.016939848,0.22904958,0,0.012706169,0.22573828,0,0.017207343,0.22323305,0){0,0,714788.59,0,0,571782.3,0,0,781289.63,0,0,-1767596.2,0,0,-1386624.6,0,0,-1865590.4,0,0,1888698.3,0,0,1404300.2,0,0,1807835.2,0,0,-1014237.8,0,0,-614658.98,0,0,-643322.1,0,0,-395054.79,0,0,-528535.98,0,0,-915362.92};
+VT(0.011838853,0.2301677,0,0.012706169,0.22573828,0,0.016939848,0.22904958,0){0,0,504229.49,0,0,571782.3,0,0,714788.59,0,0,-1254859.2,0,0,-1386624.6,0,0,-1767596.2,0,0,1363834.1,0,0,1404300.2,0,0,1888698.3,0,0,-775392.51,0,0,-614658.98,0,0,-1014237.8,0,0,-209768.04,0,0,-528535.98,0,0,-395054.79};
+VT(0.018343869,0.21720619,0,0.021120118,0.21068669,0,0.02463475,0.21609565,0){0,0,888277.19,0,0,1077357.5,0,0,1153636.1,0,0,-2037897.4,0,0,-2356401.7,0,0,-2626116.1,0,0,1749211,0,0,1720167.1,0,0,2198315,0,0,-225952.88,0,0,314292.11,0,0,-179791.92,0,0,-1457259.1,0,0,-2093742.8,0,0,-1969098.8};
+VT(0.054237851,0.14012792,0,0.049213686,0.13705186,0,0.053497526,0.1329974,0){0,0,2856617.8,0,0,2922689.8,0,0,2959143.9,0,0,-2267029,0,0,-2132523.3,0,0,-1911000.9,0,0,-3324577.4,0,0,-3499251.9,0,0,-3636096,0,0,1580891.3,0,0,1186505.2,0,0,623103.97,0,0,3650971.5,0,0,3819996.4,0,0,3857035.6};
+VT(0.023009638,0.26878949,0,0.027951851,0.26533243,0,0.029991713,0.27132489,0){0,0,417665.14,0,0,539100.43,0,0,469504.82,0,0,-1208783.5,0,0,-1547025.6,0,0,-1366503,0,0,1871958.7,0,0,2353298.6,0,0,2141236.7,0,0,-2337004.8,0,0,-2852826.8,0,0,-2724385.3,0,0,2554445.3,0,0,2980285,0,0,3063642.3};
+VT(0.1,0.071428571,0,0.095867013,0.068756454,0,0.1,0.064285714,0){0,0,0,0,0,470210.65,0,0,0,0,0,0,0,0,236792.42,0,0,0,0,0,0,0,0,-114175.46,0,0,0,0,0,0,0,0,-408471.99,0,0,0,0,0,0,0,0,-500215.61,0,0,0};
+VT(0.039366597,0.19088868,0,0.038852293,0.18542603,0,0.044234359,0.18859393,0){0,0,1982365.2,0,0,2057873,0,0,2102462.5,0,0,-3628592.6,0,0,-3549951.2,0,0,-3756018.8,0,0,1030950.1,0,0,516044.6,0,0,851571.98,0,0,2772526.5,0,0,3175871.5,0,0,3086402.5,0,0,-3333638.5,0,0,-2819104.7,0,0,-3279385.1};
+VT(0.044234359,0.18859393,0,0.038852293,0.18542603,0,0.043573225,0.18196099,0){0,0,2102462.5,0,0,2057873,0,0,2202933.2,0,0,-3756018.8,0,0,-3549951.2,0,0,-3650165.7,0,0,851571.98,0,0,516044.6,0,0,195066.32,0,0,3086402.5,0,0,3175871.5,0,0,3522129.2,0,0,-3279385.1,0,0,-2819104.7,0,0,-2509350};
+VT(0.010546892,0.2198034,0,0.012706169,0.22573828,0,0.0069979116,0.22643766,0){0,0,514716.79,0,0,571782.3,0,0,317964.48,0,0,-1201974.2,0,0,-1386624.6,0,0,-774386.26,0,0,1090194.6,0,0,1404300.2,0,0,793599.18,0,0,-253690.09,0,0,-614658.98,0,0,-364658.79,0,0,-751659.26,0,0,-528535.98,0,0,-270536.88};
+VT(0.0069979116,0.22643766,0,0.012706169,0.22573828,0,0.011838853,0.2301677,0){0,0,317964.48,0,0,571782.3,0,0,504229.49,0,0,-774386.26,0,0,-1386624.6,0,0,-1254859.2,0,0,793599.18,0,0,1404300.2,0,0,1363834.1,0,0,-364658.79,0,0,-614658.98,0,0,-775392.51,0,0,-270536.88,0,0,-528535.98,0,0,-209768.04};
+VT(0.078571429,0,0,0.074656208,0.0053403125,0,0.071428571,0,0){0,0,2419478.6,0,0,2772385.5,0,0,3033974.4,0,0,2419535.2,0,0,2763721.5,0,0,3033978.9,0,0,2419645.1,0,0,2746414.1,0,0,3033982.8,0,0,2419827.2,0,0,2720533.7,0,0,3034008.5,0,0,2420024.4,0,0,2685936.9,0,0,3033714};
+VT(0,0.1,0,0.0052460498,0.10332732,0,0,0.10714286,0){0,0,0,0,0,545715.18,0,0,0,0,0,0,0,0,-33256.292,0,0,0,0,0,0,0,0,-576983.54,0,0,0,0,0,0,0,0,-508602.25,0,0,0,0,0,0,0,0,99155.047,0,0,0};
+VT(0.071428571,0.3,0,0.074657371,0.29452352,0,0.078571429,0.3,0){0,0,0,0,0,79525.554,0,0,0,0,0,0,0,0,-238312.39,0,0,0,0,0,0,0,0,396309.36,0,0,0,0,0,0,0,0,-552992.95,0,0,0,0,0,0,0,0,707611.71,0,0,0};
+VT(0.1,0.16428571,0,0.093710586,0.16080643,0,0.1,0.15714286,0){0,0,0,0,0,507346.27,0,0,0,0,0,0,0,0,-621948.04,0,0,0,0,0,0,0,0,-366919.85,0,0,0,0,0,0,0,0,704920.6,0,0,0,0,0,0,0,0,207593.47,0,0,0};
+VT(0.042113175,0.053290167,0,0.035422008,0.053603109,0,0.038515413,0.047952704,0){0,0,3616583.4,0,0,3344502.1,0,0,3516906.1,0,0,2519252.9,0,0,2318078.8,0,0,2648581.9,0,0,657513.67,0,0,580213.58,0,0,1126309.3,0,0,-1403801.4,0,0,-1335777.4,0,0,-674068.75,0,0,-3039615.4,0,0,-2842327.2,0,0,-2308227.3};
+VT(0.038435934,0.058364632,0,0.035422008,0.053603109,0,0.042113175,0.053290167,0){0,0,3459248.5,0,0,3344502.1,0,0,3616583.4,0,0,2206750.4,0,0,2318078.8,0,0,2519252.9,0,0,155241.86,0,0,580213.58,0,0,657513.67,0,0,-1952496,0,0,-1335777.4,0,0,-1403801.4,0,0,-3353689.4,0,0,-2842327.2,0,0,-3039615.4};
+VT(0.03345202,0.18222482,0,0.034128539,0.18892309,0,0.027249449,0.18607819,0){0,0,1947746.5,0,0,1872288.6,0,0,1646413.8,0,0,-3237509.5,0,0,-3356683.8,0,0,-2861109.6,0,0,196057.01,0,0,788949.65,0,0,464444.42,0,0,3107788.7,0,0,2731311.2,0,0,2518610.9,0,0,-2254322.8,0,0,-2954777.5,0,0,-2323177.4};
+VT(0.1,0.17857143,0,0.095837038,0.182565,0,0.093873231,0.17693503,0){0,0,0,0,0,291932.87,0,0,445896.9,0,0,0,0,0,-487211.17,0,0,-694096.79,0,0,0,0,0,33971.767,0,0,-59504.029,0,0,0,0,0,464480.32,0,0,727141.13,0,0,0,0,0,-344762.9,0,0,-345394.37};
+VT(0.031105381,0.06529626,0,0.032659307,0.059686042,0,0.037071258,0.0642048,0){0,0,3030579.1,0,0,3158137.1,0,0,3365311.2,0,0,1667989.8,0,0,1964024.3,0,0,1900443.5,0,0,-444570.51,0,0,27282.242,0,0,-391679.98,0,0,-2357289.6,0,0,-1919818.3,0,0,-2513388.8,0,0,-3210321.2,0,0,-3141270.1,0,0,-3541461.8};
+VT(0.08415119,0.061061125,0,0.085646934,0.067722415,0,0.079822506,0.065677674,0){0,0,1759442.9,0,0,1585902.9,0,0,2163855.5,0,0,1064240.3,0,0,821166.94,0,0,1180001.4,0,0,-51487.645,0,0,-339583.13,0,0,-340376.77,0,0,-1146904.2,0,0,-1336670.3,0,0,-1706002.2,0,0,-1789550.6,0,0,-1689538.4,0,0,-2296197.5};
+VT(0.079822506,0.065677674,0,0.085646934,0.067722415,0,0.080160084,0.071577727,0){0,0,2163855.5,0,0,1585902.9,0,0,2107851.9,0,0,1180001.4,0,0,821166.94,0,0,977984.82,0,0,-340376.77,0,0,-339583.13,0,0,-676141.96,0,0,-1706002.2,0,0,-1336670.3,0,0,-1967920.1,0,0,-2296197.5,0,0,-1689538.4,0,0,-2205119.3};
+VT(0.067098511,0.16826118,0,0.066399282,0.17458324,0,0.060825265,0.17090728,0){0,0,2121688.2,0,0,2061554.2,0,0,2288734.2,0,0,-2928224.5,0,0,-3111294.6,0,0,-3282960.5,0,0,-1008555.7,0,0,-477290.81,0,0,-862639.89,0,0,3311710.7,0,0,3354405.6,0,0,3657845.3,0,0,-250662.47,0,0,-1230983.2,0,0,-726586.11};
+VT(0.060859952,0.17787963,0,0.061291474,0.18447479,0,0.055202425,0.1814475,0){0,0,2182203,0,0,2069396,0,0,2227021.2,0,0,-3438395.7,0,0,-3531333.7,0,0,-3667462.5,0,0,-202892.1,0,0,425331.11,0,0,145084.74,0,0,3555311.4,0,0,3230965.1,0,0,3573754.5,0,0,-1844119.8,0,0,-2708277.6,0,0,-2457046.3};
+VT(0.1,0.12142857,0,0.094962535,0.11849101,0,0.1,0.11428571,0){0,0,0,0,0,497557.04,0,0,0,0,0,0,0,0,-175139.73,0,0,0,0,0,0,0,0,-611084.48,0,0,0,0,0,0,0,0,-220851.73,0,0,0,0,0,0,0,0,467971.5,0,0,0};
+VT(0.091758141,0.11296708,0,0.094962535,0.11849101,0,0.089230742,0.11966768,0){0,0,824791.32,0,0,497557.04,0,0,1043332.5,0,0,-201020.76,0,0,-175139.73,0,0,-391602.7,0,0,-976886.6,0,0,-611084.48,0,0,-1287980.7,0,0,-537824.26,0,0,-220851.73,0,0,-412950.99,0,0,570097.26,0,0,467971.5,0,0,1030099.2};
+VT(0.1,0.11428571,0,0.094962535,0.11849101,0,0.091758141,0.11296708,0){0,0,0,0,0,497557.04,0,0,824791.32,0,0,0,0,0,-175139.73,0,0,-201020.76,0,0,0,0,0,-611084.48,0,0,-976886.6,0,0,0,0,0,-220851.73,0,0,-537824.26,0,0,0,0,0,467971.5,0,0,570097.26};
+VT(0,0.24285714,0,0.0043813653,0.24702694,0,0,0.25,0){0,0,0,0,0,145794.38,0,0,0,0,0,0,0,0,-393661.32,0,0,0,0,0,0,0,0,523477.05,0,0,0,0,0,0,0,0,-496310.62,0,0,0,0,0,0,0,0,320224.07,0,0,0};
+VT(0,0.05,0,0.004777904,0.053197076,0,0,0.057142857,0){0,0,0,0,0,557925.04,0,0,0,0,0,0,0,0,389224.92,0,0,0,0,0,0,0,0,102822.82,0,0,0,0,0,0,0,0,-214698.3,0,0,0,0,0,0,0,0,-467537.22,0,0,0};
+VT(0.047918899,0.14257657,0,0.049213686,0.13705186,0,0.054237851,0.14012792,0){0,0,2842478.3,0,0,2922689.8,0,0,2856617.8,0,0,-2400971.6,0,0,-2132523.3,0,0,-2267029,0,0,-3215455,0,0,-3499251.9,0,0,-3324577.4,0,0,1901551.7,0,0,1186505.2,0,0,1580891.3,0,0,3510918.5,0,0,3819996.4,0,0,3650971.5};
+VT(0.049678492,0.18505966,0,0.044234359,0.18859393,0,0.043573225,0.18196099,0){0,0,2196886.7,0,0,2102462.5,0,0,2202933.2,0,0,-3774046.6,0,0,-3756018.8,0,0,-3650165.7,0,0,512508.07,0,0,851571.98,0,0,195066.32,0,0,3406255.6,0,0,3086402.5,0,0,3522129.2,0,0,-2958276.7,0,0,-3279385.1,0,0,-2509350};
+VT(0.050398693,0.1921099,0,0.044234359,0.18859393,0,0.049678492,0.18505966,0){0,0,2077292.2,0,0,2102462.5,0,0,2196886.7,0,0,-3850553.1,0,0,-3756018.8,0,0,-3774046.6,0,0,1209682,0,0,851571.98,0,0,512508.07,0,0,2818064.5,0,0,3086402.5,0,0,3406255.6,0,0,-3615771.1,0,0,-3279385.1,0,0,-2958276.7};
+VT(0.055202425,0.1814475,0,0.055890502,0.18802963,0,0.049678492,0.18505966,0){0,0,2227021.2,0,0,2110328.4,0,0,2196886.7,0,0,-3667462.5,0,0,-3747121.1,0,0,-3774046.6,0,0,145084.74,0,0,795966.68,0,0,512508.07,0,0,3573754.5,0,0,3129878.5,0,0,3406255.6,0,0,-2457046.3,0,0,-3224012.4,0,0,-2958276.7};
+VT(0.1,0.27857143,0,0.095069321,0.27540052,0,0.1,0.27142857,0){0,0,0,0,0,76899.446,0,0,0,0,0,0,0,0,-225624.71,0,0,0,0,0,0,0,0,359465.9,0,0,0,0,0,0,0,0,-469594.27,0,0,0,0,0,0,0,0,548580.83,0,0,0};
+VT(0.066600159,0.24211306,0,0.061408089,0.24582042,0,0.059437672,0.2400817,0){0,0,1004296.2,0,0,1017142.7,0,0,1145348.7,0,0,-2655015,0,0,-2732695.2,0,0,-2999714,0,0,3359675.2,0,0,3591948.1,0,0,3711340.5,0,0,-2867211.3,0,0,-3325647.6,0,0,-3009146,0,0,1352854.8,0,0,2017029.8,0,0,1160252.2};
+VT(0.065478411,0.24860928,0,0.061408089,0.24582042,0,0.066600159,0.24211306,0){0,0,912058.17,0,0,1017142.7,0,0,1004296.2,0,0,-2478342.9,0,0,-2732695.2,0,0,-2655015,0,0,3344041.2,0,0,3591948.1,0,0,3359675.2,0,0,-3264436.9,0,0,-3325647.6,0,0,-2867211.3,0,0,2261773.6,0,0,2017029.8,0,0,1352854.8};
+VT(0.1,0.028571429,0,0.095041081,0.024587994,0,0.1,0.021428571,0){0,0,0,0,0,597113.29,0,0,0,0,0,0,0,0,557751.32,0,0,0,0,0,0,0,0,481620.22,0,0,0,0,0,0,0,0,373740.48,0,0,0,0,0,0,0,0,241099.33,0,0,0};
+VT(0.019165757,0.095107709,0,0.024499807,0.092422798,0,0.024938414,0.098415267,0){0,0,1930971.9,0,0,2390452.1,0,0,2383058.5,0,0,168744.63,0,0,320672.29,0,0,68195.72,0,0,-1747493.7,0,0,-2026771.7,0,0,-2312962.3,0,0,-2069009.1,0,0,-2619357.9,0,0,-2447461.4,0,0,-502664.26,0,0,-944222.72,0,0,-204726.33};
+VT(0.041643161,0.17482395,0,0.036146522,0.16944297,0,0.042242048,0.16806859,0){0,0,2284160.6,0,0,2222447.1,0,0,2399442.3,0,0,-3458410.7,0,0,-3121229.8,0,0,-3302042.1,0,0,-506290.81,0,0,-960241.74,0,0,-1157324.9,0,0,3718851.8,0,0,3509731.4,0,0,3737475.6,0,0,-1405815.9,0,0,-459324.98,0,0,-248746.29};
+VT(0.022876349,0.043626948,0,0.025565101,0.048609543,0,0.019247887,0.048569646,0){0,0,2488553.5,0,0,2702312,0,0,2135187.8,0,0,1978130.3,0,0,2017092.5,0,0,1594654.5,0,0,1061959.9,0,0,820389.33,0,0,650408.09,0,0,-72059.632,0,0,-584372.75,0,0,-458538.7,0,0,-1191549.5,0,0,-1841258.2,0,0,-1451674.1};
+VT(0.038217426,0.13599196,0,0.044512931,0.13802764,0,0.041319833,0.14315875,0){0,0,2738753.8,0,0,2867370.6,0,0,2735557.7,0,0,-1938161,0,0,-2150242,0,0,-2343944,0,0,-3305386.1,0,0,-3405187.4,0,0,-3071175.4,0,0,972060.89,0,0,1298632.3,0,0,1904337.3,0,0,3589652.3,0,0,3729885,0,0,3343927.4};
+VT(0.083559522,0.13424014,0,0.081009521,0.1385969,0,0.076271482,0.13373081,0){0,0,1462145.4,0,0,1630909.4,0,0,2012844.4,0,0,-981746.52,0,0,-1242340.3,0,0,-1330317.6,0,0,-1784737.2,0,0,-1926924,0,0,-2463975.8,0,0,395362.65,0,0,783271.16,0,0,494859.01,0,0,1914407.3,0,0,2113542.9,0,0,2631758.9};
+VT(0.071059851,0.17209017,0,0.066399282,0.17458324,0,0.067098511,0.16826118,0){0,0,1900690.4,0,0,2061554.2,0,0,2121688.2,0,0,-2772233.4,0,0,-3111294.6,0,0,-2928224.5,0,0,-629520.98,0,0,-477290.81,0,0,-1008555.7,0,0,3060958.1,0,0,3354405.6,0,0,3311710.7,0,0,-774142.34,0,0,-1230983.2,0,0,-250662.47};
+VT(0.041319833,0.14315875,0,0.044512931,0.13802764,0,0.047918899,0.14257657,0){0,0,2735557.7,0,0,2867370.6,0,0,2842478.3,0,0,-2343944,0,0,-2150242,0,0,-2400971.6,0,0,-3071175.4,0,0,-3405187.4,0,0,-3215455,0,0,1904337.3,0,0,1298632.3,0,0,1901551.7,0,0,3343927.4,0,0,3729885,0,0,3510918.5};
+VT(0,0.16428571,0,0.0046637588,0.16745308,0,0,0.17142857,0){0,0,0,0,0,362371.83,0,0,0,0,0,0,0,0,-494096.85,0,0,0,0,0,0,0,0,-182769.85,0,0,0,0,0,0,0,0,560561.48,0,0,0,0,0,0,0,0,-21256.565,0,0,0};
+VT(0.049678492,0.18505966,0,0.055890502,0.18802963,0,0.050398693,0.1921099,0){0,0,2196886.7,0,0,2110328.4,0,0,2077292.2,0,0,-3774046.6,0,0,-3747121.1,0,0,-3850553.1,0,0,512508.07,0,0,795966.68,0,0,1209682,0,0,3406255.6,0,0,3129878.5,0,0,2818064.5,0,0,-2958276.7,0,0,-3224012.4,0,0,-3615771.1};
+VT(0.043573225,0.18196099,0,0.048811039,0.17808485,0,0.049678492,0.18505966,0){0,0,2202933.2,0,0,2310715.6,0,0,2196886.7,0,0,-3650165.7,0,0,-3650410,0,0,-3774046.6,0,0,195066.32,0,0,-194330.82,0,0,512508.07,0,0,3522129.2,0,0,3763231.4,0,0,3406255.6,0,0,-2509350,0,0,-1987755.8,0,0,-2958276.7};
+VT(0.066710408,0.18109144,0,0.07206248,0.1830344,0,0.06771074,0.1881525,0){0,0,1958233.8,0,0,1716055.3,0,0,1821405.7,0,0,-3210995.9,0,0,-2879815.5,0,0,-3238423,0,0,95959.418,0,0,236909.5,0,0,698008.36,0,0,3149708.8,0,0,2719220.1,0,0,2695511.5,0,0,-2111256.9,0,0,-2081132.3,0,0,-2795478.4};
+VT(0.1,0.18571429,0,0.095837038,0.182565,0,0.1,0.17857143,0){0,0,0,0,0,291932.87,0,0,0,0,0,0,0,0,-487211.17,0,0,0,0,0,0,0,0,33971.767,0,0,0,0,0,0,0,0,464480.32,0,0,0,0,0,0,0,0,-344762.9,0,0,0};
+VT(0.042242048,0.16806859,0,0.036146522,0.16944297,0,0.038427921,0.16264679,0){0,0,2399442.3,0,0,2222447.1,0,0,2389351.9,0,0,-3302042.1,0,0,-3121229.8,0,0,-3020403.6,0,0,-1157324.9,0,0,-960241.74,0,0,-1591681.4,0,0,3737475.6,0,0,3509731.4,0,0,3440909.6,0,0,-248746.29,0,0,-459324.98,0,0,682723.32};
+VT(0.042541479,0.22296234,0,0.04727629,0.22823863,0,0.041402067,0.22952626,0){0,0,1481591,0,0,1418822.2,0,0,1348916.4,0,0,-3531706.6,0,0,-3492237.2,0,0,-3344816,0,0,3405357.4,0,0,3684627.2,0,0,3600200.4,0,0,-1180392.3,0,0,-1892328,0,0,-1982154,0,0,-1772446.7,0,0,-919608.01,0,0,-667743.82};
+VT(0.049797208,0.2214244,0,0.04727629,0.22823863,0,0.042541479,0.22296234,0){0,0,1551864.2,0,0,1418822.2,0,0,1481591,0,0,-3662861.4,0,0,-3492237.2,0,0,-3531706.6,0,0,3430735.4,0,0,3684627.2,0,0,3405357.4,0,0,-1003918.8,0,0,-1892328,0,0,-1180392.3,0,0,-2065424.5,0,0,-919608.01,0,0,-1772446.7};
+VT(0.062195955,0.11505156,0,0.05615957,0.1141762,0,0.059543685,0.10776494,0){0,0,2965673.8,0,0,3147681.4,0,0,3132791.5,0,0,-843057.19,0,0,-840990.83,0,0,-451048.14,0,0,-3569130.8,0,0,-3764018.8,0,0,-3519016.9,0,0,-1711501.2,0,0,-1917372.9,0,0,-2561357.9,0,0,2344130.4,0,0,2358868.4,0,0,1326599.2};
+VT(0.093823791,0.12410599,0,0.087905667,0.12517971,0,0.089230742,0.11966768,0){0,0,595735.92,0,0,1140990.9,0,0,1043332.5,0,0,-276601.23,0,0,-554517.87,0,0,-391602.7,0,0,-743959.63,0,0,-1425990.8,0,0,-1287980.7,0,0,-121937.8,0,0,-178453.87,0,0,-412950.99,0,0,678759.2,0,0,1334087.8,0,0,1030099.2};
+VT(0.066710408,0.18109144,0,0.066399282,0.17458324,0,0.071841704,0.17726974,0){0,0,1958233.8,0,0,2061554.2,0,0,1799263.7,0,0,-3210995.9,0,0,-3111294.6,0,0,-2812994.5,0,0,95959.418,0,0,-477290.81,0,0,-214389.53,0,0,3149708.8,0,0,3354405.6,0,0,2933842.6,0,0,-2111256.9,0,0,-1230983.2,0,0,-1438939.3};
+VT(0.095453592,0.18738967,0,0.095837038,0.182565,0,0.1,0.18571429,0){0,0,307137.29,0,0,291932.87,0,0,0,0,0,-541566.85,0,0,-487211.17,0,0,0,0,0,106216.39,0,0,33971.767,0,0,0,0,0,460538.95,0,0,464480.32,0,0,0,0,0,-458087.35,0,0,-344762.9,0,0,0};
+VT(0.089858368,0.18421461,0,0.095837038,0.182565,0,0.095453592,0.18738967,0){0,0,692603.24,0,0,291932.87,0,0,307137.29,0,0,-1178349.1,0,0,-487211.17,0,0,-541566.85,0,0,133849.22,0,0,33971.767,0,0,106216.39,0,0,1084450.2,0,0,464480.32,0,0,460538.95,0,0,-894447.98,0,0,-344762.9,0,0,-458087.35};
+VT(0.054692531,0.17439284,0,0.048811039,0.17808485,0,0.048076401,0.17082416,0){0,0,2346407.8,0,0,2310715.6,0,0,2424680.5,0,0,-3532168.6,0,0,-3650410,0,0,-3473815.1,0,0,-561454.61,0,0,-194330.82,0,0,-921629.25,0,0,3816051.1,0,0,3763231.4,0,0,3872759.5,0,0,-1367177.6,0,0,-1987755.8,0,0,-754316.94};
+VT(0.030623168,0.1713445,0,0.034648589,0.17585937,0,0.027644767,0.17736901,0){0,0,1985985.4,0,0,2080615.7,0,0,1774040.3,0,0,-2866418.8,0,0,-3193762.3,0,0,-2777088.7,0,0,-715248.18,0,0,-371953.81,0,0,-203929.31,0,0,3183566.3,0,0,3392886,0,0,2892544.7,0,0,-696442.05,0,0,-1443588.4,0,0,-1431643.3};
+VT(0.027644767,0.17736901,0,0.034648589,0.17585937,0,0.03345202,0.18222482,0){0,0,1774040.3,0,0,2080615.7,0,0,1947746.5,0,0,-2777088.7,0,0,-3193762.3,0,0,-3237509.5,0,0,-203929.31,0,0,-371953.81,0,0,196057.01,0,0,2892544.7,0,0,3392886,0,0,3107788.7,0,0,-1431643.3,0,0,-1443588.4,0,0,-2254322.8};
+VT(0.0060491453,0.25298129,0,0.0043813653,0.24702694,0,0.0087429334,0.24792416,0){0,0,178654.23,0,0,145794.38,0,0,283453.34,0,0,-493529.07,0,0,-393661.32,0,0,-768118.62,0,0,691183.17,0,0,523477.05,0,0,1029935.2,0,0,-724662.05,0,0,-496310.62,0,0,-992967.39,0,0,585970.08,0,0,320224.07,0,0,667809.3};
+VT(0,0.25,0,0.0043813653,0.24702694,0,0.0060491453,0.25298129,0){0,0,0,0,0,145794.38,0,0,178654.23,0,0,0,0,0,-393661.32,0,0,-493529.07,0,0,0,0,0,523477.05,0,0,691183.17,0,0,0,0,0,-496310.62,0,0,-724662.05,0,0,0,0,0,320224.07,0,0,585970.08};
+VT(0.093823791,0.12410599,0,0.094962535,0.11849101,0,0.1,0.12142857,0){0,0,595735.92,0,0,497557.04,0,0,0,0,0,-276601.23,0,0,-175139.73,0,0,0,0,0,-743959.63,0,0,-611084.48,0,0,0,0,0,-121937.8,0,0,-220851.73,0,0,0,0,0,678759.2,0,0,467971.5,0,0,0};
+VT(0.076430303,0.18837043,0,0.07206248,0.1830344,0,0.077619244,0.18028791,0){0,0,1444535.6,0,0,1716055.3,0,0,1471797.4,0,0,-2574453.4,0,0,-2879815.5,0,0,-2389894.4,0,0,569102.25,0,0,236909.5,0,0,18944.546,0,0,2129625.3,0,0,2719220.1,0,0,2378251.6,0,0,-2235391.7,0,0,-2081132.3,0,0,-1502642.9};
+VT(0.027249449,0.18607819,0,0.021212478,0.18688263,0,0.021251228,0.18136297,0){0,0,1646413.8,0,0,1339179.6,0,0,1398279.8,0,0,-2861109.6,0,0,-2348119.2,0,0,-2300353.4,0,0,464444.42,0,0,429909.33,0,0,85724.805,0,0,2518610.9,0,0,2024227.8,0,0,2245163.6,0,0,-2323177.4,0,0,-1955356.8,0,0,-1534338.6};
+VT(0.072908259,0.24139656,0,0.066600159,0.24211306,0,0.070607657,0.23670872,0){0,0,881474.92,0,0,1004296.2,0,0,1007105.3,0,0,-2322734,0,0,-2655015,0,0,-2594870.8,0,0,2916335.3,0,0,3359675.2,0,0,3083897.2,0,0,-2445637.4,0,0,-2867211.3,0,0,-2267120.1,0,0,1082242,0,0,1352854.8,0,0,490193.02};
+VT(0.089230742,0.11966768,0,0.094962535,0.11849101,0,0.093823791,0.12410599,0){0,0,1043332.5,0,0,497557.04,0,0,595735.92,0,0,-391602.7,0,0,-175139.73,0,0,-276601.23,0,0,-1287980.7,0,0,-611084.48,0,0,-743959.63,0,0,-412950.99,0,0,-220851.73,0,0,-121937.8,0,0,1030099.2,0,0,467971.5,0,0,678759.2};
+VT(0.038435934,0.058364632,0,0.032659307,0.059686042,0,0.035422008,0.053603109,0){0,0,3459248.5,0,0,3158137.1,0,0,3344502.1,0,0,2206750.4,0,0,1964024.3,0,0,2318078.8,0,0,155241.86,0,0,27282.242,0,0,580213.58,0,0,-1952496,0,0,-1919818.3,0,0,-1335777.4,0,0,-3353689.4,0,0,-3141270.1,0,0,-2842327.2};
+VT(0.050960377,0.23252058,0,0.04727629,0.22823863,0,0.053624899,0.22742186,0){0,0,1342135.9,0,0,1418822.2,0,0,1430137,0,0,-3383651.2,0,0,-3492237.2,0,0,-3503302.1,0,0,3804738.6,0,0,3684627.2,0,0,3648370.9,0,0,-2403721.7,0,0,-1892328,0,0,-1785483,0,0,-148681.88,0,0,-919608.01,0,0,-1060301.4};
+VT(0.025641665,0.25311603,0,0.033025927,0.25326882,0,0.030217898,0.25971254,0){0,0,680173.91,0,0,809560.38,0,0,660621.26,0,0,-1879847.5,0,0,-2238649.8,0,0,-1866014.4,0,0,2635470.4,0,0,3142273.3,0,0,2744196,0,0,-2768550.2,0,0,-3308331.9,0,0,-3141188.1,0,0,2247361.6,0,0,2697705.3,0,0,2987009.7};
+VT(0.017207343,0.22323305,0,0.021374843,0.22646669,0,0.016939848,0.22904958,0){0,0,781289.63,0,0,906782.43,0,0,714788.59,0,0,-1865590.4,0,0,-2208721,0,0,-1767596.2,0,0,1807835.2,0,0,2264460.9,0,0,1888698.3,0,0,-643322.1,0,0,-1042528.4,0,0,-1014237.8,0,0,-915362.92,0,0,-767856.24,0,0,-395054.79};
+VT(0.027746664,0.13122119,0,0.023379755,0.12686903,0,0.030575169,0.1246812,0){0,0,2296333.1,0,0,2047772.9,0,0,2526238.7,0,0,-1399007.9,0,0,-1065433.1,0,0,-1202245.8,0,0,-2843055.5,0,0,-2558991,0,0,-3156412.2,0,0,288094.78,0,0,-162203.53,0,0,-451924.48,0,0,2955532.6,0,0,2481221.5,0,0,2919641.1};
+VT(0.0064812773,0.046734878,0,0.004777904,0.053197076,0,0,0.05,0){0,0,761350.4,0,0,557925.04,0,0,0,0,0,582610.88,0,0,389224.92,0,0,0,0,0,267082.8,0,0,102822.82,0,0,0,0,0,-111174.21,0,0,-214698.3,0,0,0,0,0,-463416.67,0,0,-467537.22,0,0,0};
+VT(0.0094132111,0.052421332,0,0.004777904,0.053197076,0,0.0064812773,0.046734878,0){0,0,1088603.4,0,0,557925.04,0,0,761350.4,0,0,768702.62,0,0,389224.92,0,0,582610.88,0,0,222919.17,0,0,102822.82,0,0,267082.8,0,0,-388347.22,0,0,-214698.3,0,0,-111174.21,0,0,-885762.83,0,0,-467537.22,0,0,-463416.67};
+VT(0.060567191,0.25172758,0,0.061408089,0.24582042,0,0.065478411,0.24860928,0){0,0,917440.34,0,0,1017142.7,0,0,912058.17,0,0,-2522838.3,0,0,-2732695.2,0,0,-2478342.9,0,0,3497206.6,0,0,3591948.1,0,0,3344041.2,0,0,-3596815.5,0,0,-3325647.6,0,0,-3264436.9,0,0,2796536,0,0,2017029.8,0,0,2261773.6};
+VT(0.077619244,0.18028791,0,0.07206248,0.1830344,0,0.071841704,0.17726974,0){0,0,1471797.4,0,0,1716055.3,0,0,1799263.7,0,0,-2389894.4,0,0,-2879815.5,0,0,-2812994.5,0,0,18944.546,0,0,236909.5,0,0,-214389.53,0,0,2378251.6,0,0,2719220.1,0,0,2933842.6,0,0,-1502642.9,0,0,-2081132.3,0,0,-1438939.3};
+VT(0.071841704,0.17726974,0,0.07206248,0.1830344,0,0.066710408,0.18109144,0){0,0,1799263.7,0,0,1716055.3,0,0,1958233.8,0,0,-2812994.5,0,0,-2879815.5,0,0,-3210995.9,0,0,-214389.53,0,0,236909.5,0,0,95959.418,0,0,2933842.6,0,0,2719220.1,0,0,3149708.8,0,0,-1438939.3,0,0,-2081132.3,0,0,-2111256.9};
+VT(0.060859952,0.17787963,0,0.066399282,0.17458324,0,0.066710408,0.18109144,0){0,0,2182203,0,0,2061554.2,0,0,1958233.8,0,0,-3438395.7,0,0,-3111294.6,0,0,-3210995.9,0,0,-202892.1,0,0,-477290.81,0,0,95959.418,0,0,3555311.4,0,0,3354405.6,0,0,3149708.8,0,0,-1844119.8,0,0,-1230983.2,0,0,-2111256.9};
+VT(0.0062494098,0.068021592,0,0.012193394,0.066188359,0,0.011197941,0.071439681,0){0,0,709501.16,0,0,1364188,0,0,1244724.5,0,0,364477.97,0,0,734639.92,0,0,579995.21,0,0,-157824.6,0,0,-233939.49,0,0,-394493.66,0,0,-603457.47,0,0,-1094586.7,0,0,-1158343.6,0,0,-756039.79,0,0,-1450385,0,0,-1303869.8};
+VT(0.016939848,0.22904958,0,0.021374843,0.22646669,0,0.022740693,0.23189018,0){0,0,714788.59,0,0,906782.43,0,0,887604.04,0,0,-1767596.2,0,0,-2208721,0,0,-2230116.3,0,0,1888698.3,0,0,2264460.9,0,0,2485475.6,0,0,-1014237.8,0,0,-1042528.4,0,0,-1529145.6,0,0,-395054.79,0,0,-767856.24,0,0,-172982.46};
+VT(0.019165757,0.095107709,0,0.013714026,0.097839388,0,0.013428016,0.091778472,0){0,0,1930971.9,0,0,1412613.2,0,0,1408980.1,0,0,168744.63,0,0,55008.627,0,0,204626.15,0,0,-1747493.7,0,0,-1355500.2,0,0,-1174648.8,0,0,-2069009.1,0,0,-1463354,0,0,-1549888.7,0,0,-502664.26,0,0,-165174.7,0,0,-600683.83};
+VT(0.053624899,0.22742186,0,0.04727629,0.22823863,0,0.049797208,0.2214244,0){0,0,1430137,0,0,1418822.2,0,0,1551864.2,0,0,-3503302.1,0,0,-3492237.2,0,0,-3662861.4,0,0,3648370.9,0,0,3684627.2,0,0,3430735.4,0,0,-1785483,0,0,-1892328,0,0,-1003918.8,0,0,-1060301.4,0,0,-919608.01,0,0,-2065424.5};
+VT(0.034648589,0.17585937,0,0.038433858,0.18005903,0,0.03345202,0.18222482,0){0,0,2080615.7,0,0,2131117.1,0,0,1947746.5,0,0,-3193762.3,0,0,-3450732.6,0,0,-3237509.5,0,0,-371953.81,0,0,5612.0128,0,0,196057.01,0,0,3392886,0,0,3447337.8,0,0,3107788.7,0,0,-1443588.4,0,0,-2140463.9,0,0,-2254322.8};
+VT(0.028699663,0.054481756,0,0.025565101,0.048609543,0,0.032229878,0.047894836,0){0,0,2920693,0,0,2702312,0,0,3188476.9,0,0,1995520.8,0,0,2017092.5,0,0,2403076.1,0,0,438210.61,0,0,820389.33,0,0,1025710.6,0,0,-1257984.1,0,0,-584372.75,0,0,-604377.64,0,0,-2556170.3,0,0,-1841258.2,0,0,-2086050.7};
+VT(0.03345202,0.18222482,0,0.038433858,0.18005903,0,0.038852293,0.18542603,0){0,0,1947746.5,0,0,2131117.1,0,0,2057873,0,0,-3237509.5,0,0,-3450732.6,0,0,-3549951.2,0,0,196057.01,0,0,5612.0128,0,0,516044.6,0,0,3107788.7,0,0,3447337.8,0,0,3175871.5,0,0,-2254322.8,0,0,-2140463.9,0,0,-2819104.7};
+VT(0.071841704,0.17726974,0,0.066399282,0.17458324,0,0.071059851,0.17209017,0){0,0,1799263.7,0,0,2061554.2,0,0,1900690.4,0,0,-2812994.5,0,0,-3111294.6,0,0,-2772233.4,0,0,-214389.53,0,0,-477290.81,0,0,-629520.98,0,0,2933842.6,0,0,3354405.6,0,0,3060958.1,0,0,-1438939.3,0,0,-1230983.2,0,0,-774142.34};
+VT(0.06137482,0.19024807,0,0.061291474,0.18447479,0,0.06771074,0.1881525,0){0,0,1976038.9,0,0,2069396,0,0,1821405.7,0,0,-3592882,0,0,-3531333.7,0,0,-3238423,0,0,963745.22,0,0,425331.11,0,0,698008.36,0,0,2804392.5,0,0,3230965.1,0,0,2695511.5,0,0,-3258719.1,0,0,-2708277.6,0,0,-2795478.4};
+VT(0.06771074,0.1881525,0,0.061291474,0.18447479,0,0.066710408,0.18109144,0){0,0,1821405.7,0,0,2069396,0,0,1958233.8,0,0,-3238423,0,0,-3531333.7,0,0,-3210995.9,0,0,698008.36,0,0,425331.11,0,0,95959.418,0,0,2695511.5,0,0,3230965.1,0,0,3149708.8,0,0,-2795478.4,0,0,-2708277.6,0,0,-2111256.9};
+VT(0.0081152275,0.10988635,0,0.01198914,0.11616091,0,0.0062042788,0.11791514,0){0,0,821145.89,0,0,1171325.2,0,0,612847.32,0,0,-151361.79,0,0,-358450.6,0,0,-208741.13,0,0,-944689.8,0,0,-1420119.3,0,0,-750565.55,0,0,-619246.83,0,0,-627101.02,0,0,-286207.66,0,0,439508.43,0,0,984768,0,0,561848.67};
+VT(0.0062042788,0.11791514,0,0.01198914,0.11616091,0,0.01093484,0.12117452,0){0,0,612847.32,0,0,1171325.2,0,0,1052666.9,0,0,-208741.13,0,0,-358450.6,0,0,-426753.37,0,0,-750565.55,0,0,-1420119.3,0,0,-1306415.4,0,0,-286207.66,0,0,-627101.02,0,0,-350052.21,0,0,561848.67,0,0,984768,0,0,1098212.1};
+VT(0.081922129,0.20489902,0,0.086709216,0.20730703,0,0.081656406,0.2108727,0){0,0,996952.98,0,0,734117.03,0,0,951384.03,0,0,-2081157.6,0,0,-1563285.8,0,0,-2083808.1,0,0,1266338.6,0,0,1031586.7,0,0,1528962.6,0,0,704044.3,0,0,398134,0,0,263916.4,0,0,-2032271.3,0,0,-1481512.9,0,0,-1843401};
+VT(0.060825265,0.17090728,0,0.066399282,0.17458324,0,0.060859952,0.17787963,0){0,0,2288734.2,0,0,2061554.2,0,0,2182203,0,0,-3282960.5,0,0,-3111294.6,0,0,-3438395.7,0,0,-862639.89,0,0,-477290.81,0,0,-202892.1,0,0,3657845.3,0,0,3354405.6,0,0,3555311.4,0,0,-726586.11,0,0,-1230983.2,0,0,-1844119.8};
+VT(0.084619556,0.23283838,0,0.084319616,0.22565969,0,0.09071018,0.22887426,0){0,0,621044.17,0,0,696453.76,0,0,406264.77,0,0,-1568398.7,0,0,-1688204.7,0,0,-1003622.2,0,0,1771426.2,0,0,1707540.6,0,0,1069446.3,0,0,-1133733.9,0,0,-743250.94,0,0,-568907.82,0,0,-42283.716,0,0,-649719.93,0,0,-233040.27};
+VT(0.078984823,0.22953004,0,0.084319616,0.22565969,0,0.084619556,0.23283838,0){0,0,858343.29,0,0,696453.76,0,0,621044.17,0,0,-2128428.8,0,0,-1688204.7,0,0,-1568398.7,0,0,2291087.1,0,0,1707540.6,0,0,1771426.2,0,0,-1261656.1,0,0,-743250.94,0,0,-1133733.9,0,0,-424553.92,0,0,-649719.93,0,0,-42283.716};
+VT(0.023309936,0.19197185,0,0.025476801,0.19755762,0,0.018704911,0.19716585,0){0,0,1390526.6,0,0,1423125.8,0,0,1103230.1,0,0,-2573914.4,0,0,-2782737.9,0,0,-2149261.2,0,0,799964.88,0,0,1235431.1,0,0,934589.13,0,0,1893175.4,0,0,1602470.1,0,0,1263201.6,0,0,-2411477.9,0,0,-2766638.2,0,0,-2132672.2};
+VT(0.029690249,0.19362013,0,0.025476801,0.19755762,0,0.023309936,0.19197185,0){0,0,1647856.1,0,0,1423125.8,0,0,1390526.6,0,0,-3101495.4,0,0,-2782737.9,0,0,-2573914.4,0,0,1088093.1,0,0,1235431.1,0,0,799964.88,0,0,2141745.7,0,0,1602470.1,0,0,1893175.4,0,0,-2977851,0,0,-2766638.2,0,0,-2411477.9};
+VT(0.038852293,0.18542603,0,0.034128539,0.18892309,0,0.03345202,0.18222482,0){0,0,2057873,0,0,1872288.6,0,0,1947746.5,0,0,-3549951.2,0,0,-3356683.8,0,0,-3237509.5,0,0,516044.6,0,0,788949.65,0,0,196057.01,0,0,3175871.5,0,0,2731311.2,0,0,3107788.7,0,0,-2819104.7,0,0,-2954777.5,0,0,-2254322.8};
+VT(0.039366597,0.19088868,0,0.034128539,0.18892309,0,0.038852293,0.18542603,0){0,0,1982365.2,0,0,1872288.6,0,0,2057873,0,0,-3628592.6,0,0,-3356683.8,0,0,-3549951.2,0,0,1030950.1,0,0,788949.65,0,0,516044.6,0,0,2772526.5,0,0,2731311.2,0,0,3175871.5,0,0,-3333638.5,0,0,-2954777.5,0,0,-2819104.7};
+VT(0.05,0,0,0.051745598,0.0053231545,0,0.046181733,0.0056701177,0){0,0,3880596.9,0,0,3873250.9,0,0,3851009.3,0,0,3880622.4,0,0,3861228.9,0,0,3837454.5,0,0,3880662.8,0,0,3837214.6,0,0,3810385,0,0,3880737.9,0,0,3801308.2,0,0,3769920.5,0,0,3880625.6,0,0,3753417.7,0,0,3715901.2};
+VT(0.045931579,0.29422002,0,0.051526128,0.29458598,0,0.05,0.3,0){0,0,116468.36,0,0,109871.78,0,0,0,0,0,-348980.73,0,0,-329256.34,0,0,0,0,0,580225.36,0,0,547568.39,0,0,0,0,0,-809364.6,0,0,-764098.34,0,0,0,0,0,1035478,0,0,977975.34,0,0,0};
+VT(0.017373248,0.19021363,0,0.021212478,0.18688263,0,0.023309936,0.19197185,0){0,0,1095255.9,0,0,1339179.6,0,0,1390526.6,0,0,-1990705.9,0,0,-2348119.2,0,0,-2573914.4,0,0,532263.7,0,0,429909.33,0,0,799964.88,0,0,1555631.8,0,0,2024227.8,0,0,1893175.4,0,0,-1804413.6,0,0,-1955356.8,0,0,-2411477.9};
+VT(0.08682376,0.20181233,0,0.086709216,0.20730703,0,0.081922129,0.20489902,0){0,0,767576.83,0,0,734117.03,0,0,996952.98,0,0,-1560255.4,0,0,-1563285.8,0,0,-2081157.6,0,0,843726.65,0,0,1031586.7,0,0,1266338.6,0,0,688912.23,0,0,398134,0,0,704044.3,0,0,-1555436.8,0,0,-1481512.9,0,0,-2032271.3};
+VT(0.08466046,0.11619385,0,0.082946441,0.12207685,0,0.077013163,0.11736903,0){0,0,1475783,0,0,1589878.9,0,0,2095773.2,0,0,-452604.25,0,0,-673263.29,0,0,-691227.47,0,0,-1789662.1,0,0,-1978038.1,0,0,-2559181.5,0,0,-788262.21,0,0,-467139.5,0,0,-1023961.4,0,0,1243195.1,0,0,1708498.9,0,0,1873161.8};
+VT(0.065117308,0.15657509,0,0.064971856,0.15110456,0,0.070477538,0.15360968,0){0,0,2354870.2,0,0,2431817,0,0,2153625.7,0,0,-2678881.2,0,0,-2488096.1,0,0,-2316413.6,0,0,-1986291.9,0,0,-2374265.3,0,0,-1978592.7,0,0,2952219.2,0,0,2543085,0,0,2466066.8,0,0,1580034,0,0,2315361.9,0,0,1792310.4};
+VT(0.036308441,0.24745658,0,0.033139613,0.24047735,0,0.040431855,0.24188745,0){0,0,958174.94,0,0,1026889.2,0,0,1110505,0,0,-2591684.5,0,0,-2694450.7,0,0,-2932804,0,0,3460190.4,0,0,3348643.4,0,0,3702149.5,0,0,-3307339.6,0,0,-2743423.6,0,0,-3142324.5,0,0,2177878.8,0,0,1106136.5,0,0,1453973.2};
+VT(0.035422008,0.053603109,0,0.032659307,0.059686042,0,0.028699663,0.054481756,0){0,0,3344502.1,0,0,3158137.1,0,0,2920693,0,0,2318078.8,0,0,1964024.3,0,0,1995520.8,0,0,580213.58,0,0,27282.242,0,0,438210.61,0,0,-1335777.4,0,0,-1919818.3,0,0,-1257984.1,0,0,-2842327.2,0,0,-3141270.1,0,0,-2556170.3};
+VT(0.083337094,0.16031526,0,0.088623123,0.15812222,0,0.088381846,0.16289419,0){0,0,1295652.6,0,0,918302.92,0,0,911153.68,0,0,-1575018.8,0,0,-1074338,0,0,-1156470.7,0,0,-956036.82,0,0,-735787.48,0,0,-599768.12,0,0,1781183.7,0,0,1199414.9,0,0,1317920.1,0,0,571788.58,0,0,531983.03,0,0,244888.24};
+VT(0.029124573,0.24658198,0,0.033139613,0.24047735,0,0.036308441,0.24745658,0){0,0,849052.23,0,0,1026889.2,0,0,958174.94,0,0,-2288340.2,0,0,-2694450.7,0,0,-2591684.5,0,0,3030093.5,0,0,3348643.4,0,0,3460190.4,0,0,-2848204.4,0,0,-2743423.6,0,0,-3307339.6,0,0,1797881.3,0,0,1106136.5,0,0,2177878.8};
+VT(0.058552205,0.15400025,0,0.064971856,0.15110456,0,0.065117308,0.15657509,0){0,0,2589572.8,0,0,2431817,0,0,2354870.2,0,0,-2806487.5,0,0,-2488096.1,0,0,-2678881.2,0,0,-2354581.2,0,0,-2374265.3,0,0,-1986291.9,0,0,3003966,0,0,2543085,0,0,2952219.2,0,0,2103059.1,0,0,2315361.9,0,0,1580034};
+VT(0.026971271,0.22659033,0,0.02301506,0.22157032,0,0.029518097,0.21985532,0){0,0,1090633.5,0,0,1025043.6,0,0,1264894.2,0,0,-2658504.1,0,0,-2421684.9,0,0,-2954793.2,0,0,2731189,0,0,2274566.1,0,0,2682751.8,0,0,-1267784.1,0,0,-677461.35,0,0,-629411.95,0,0,-909068.56,0,0,-1351813.7,0,0,-1842177.8};
+VT(0.029518097,0.21985532,0,0.02301506,0.22157032,0,0.02463475,0.21609565,0){0,0,1264894.2,0,0,1025043.6,0,0,1153636.1,0,0,-2954793.2,0,0,-2421684.9,0,0,-2626116.1,0,0,2682751.8,0,0,2274566.1,0,0,2198315,0,0,-629411.95,0,0,-677461.35,0,0,-179791.92,0,0,-1842177.8,0,0,-1351813.7,0,0,-1969098.8};
+VT(0.038852293,0.18542603,0,0.038433858,0.18005903,0,0.043573225,0.18196099,0){0,0,2057873,0,0,2131117.1,0,0,2202933.2,0,0,-3549951.2,0,0,-3450732.6,0,0,-3650165.7,0,0,516044.6,0,0,5612.0128,0,0,195066.32,0,0,3175871.5,0,0,3447337.8,0,0,3522129.2,0,0,-2819104.7,0,0,-2140463.9,0,0,-2509350};
+VT(0.095652827,0.22622146,0,0.095706332,0.23121352,0,0.09071018,0.22887426,0){0,0,199039.37,0,0,183910.78,0,0,406264.77,0,0,-484109.58,0,0,-460364.34,0,0,-1003622.2,0,0,494313.66,0,0,508106.39,0,0,1069446.3,0,0,-223837.82,0,0,-303408.65,0,0,-568907.82,0,0,-173819.74,0,0,-52245.513,0,0,-233040.27};
+VT(0.066710408,0.18109144,0,0.061291474,0.18447479,0,0.060859952,0.17787963,0){0,0,1958233.8,0,0,2069396,0,0,2182203,0,0,-3210995.9,0,0,-3531333.7,0,0,-3438395.7,0,0,95959.418,0,0,425331.11,0,0,-202892.1,0,0,3149708.8,0,0,3230965.1,0,0,3555311.4,0,0,-2111256.9,0,0,-2708277.6,0,0,-1844119.8};
+VT(0.09123018,0.070922096,0,0.086276325,0.073599227,0,0.085646934,0.067722415,0){0,0,983713.53,0,0,1502743.3,0,0,1585902.9,0,0,465586.72,0,0,653401.45,0,0,821166.94,0,0,-297764.17,0,0,-565297.67,0,0,-339583.13,0,0,-904277.98,0,0,-1464602.7,0,0,-1336670.3,0,0,-1034644.8,0,0,-1536324.4,0,0,-1689538.4};
+VT(0.085646934,0.067722415,0,0.086276325,0.073599227,0,0.080160084,0.071577727,0){0,0,1585902.9,0,0,1502743.3,0,0,2107851.9,0,0,821166.94,0,0,653401.45,0,0,977984.82,0,0,-339583.13,0,0,-565297.67,0,0,-676141.96,0,0,-1336670.3,0,0,-1464602.7,0,0,-1967920.1,0,0,-1689538.4,0,0,-1536324.4,0,0,-2205119.3};
+VT(0.09123018,0.070922096,0,0.095867013,0.068756454,0,0.095795895,0.073622969,0){0,0,983713.53,0,0,470210.65,0,0,473503.74,0,0,465586.72,0,0,236792.42,0,0,205720.2,0,0,-297764.17,0,0,-114175.46,0,0,-178405.32,0,0,-904277.98,0,0,-408471.99,0,0,-461642.03,0,0,-1034644.8,0,0,-500215.61,0,0,-483922.03};
+VT(0.02301506,0.22157032,0,0.021374843,0.22646669,0,0.017207343,0.22323305,0){0,0,1025043.6,0,0,906782.43,0,0,781289.63,0,0,-2421684.9,0,0,-2208721,0,0,-1865590.4,0,0,2274566.1,0,0,2264460.9,0,0,1807835.2,0,0,-677461.35,0,0,-1042528.4,0,0,-643322.1,0,0,-1351813.7,0,0,-767856.24,0,0,-915362.92};
+VT(0.041643161,0.17482395,0,0.038433858,0.18005903,0,0.034648589,0.17585937,0){0,0,2284160.6,0,0,2131117.1,0,0,2080615.7,0,0,-3458410.7,0,0,-3450732.6,0,0,-3193762.3,0,0,-506290.81,0,0,5612.0128,0,0,-371953.81,0,0,3718851.8,0,0,3447337.8,0,0,3392886,0,0,-1405815.9,0,0,-2140463.9,0,0,-1443588.4};
+VT(0.082709707,0.12855445,0,0.082946441,0.12207685,0,0.087905667,0.12517971,0){0,0,1568327.1,0,0,1589878.9,0,0,1140990.9,0,0,-869760.99,0,0,-673263.29,0,0,-554517.87,0,0,-1955764.1,0,0,-1978038.1,0,0,-1425990.8,0,0,-1353.9511,0,0,-467139.5,0,0,-178453.87,0,0,1955094.7,0,0,1708498.9,0,0,1334087.8};
+VT(0.095090425,0.2489538,0,0.095492809,0.25375881,0,0.090077759,0.25268961,0){0,0,157454.16,0,0,131307.15,0,0,291813.61,0,0,-428416.46,0,0,-363726.6,0,0,-805257.31,0,0,579817.55,0,0,512510.07,0,0,1125037.4,0,0,-569427.53,0,0,-543451.99,0,0,-1174248.1,0,0,400020.01,0,0,449348.78,0,0,940920.06};
+VT(0.08974924,0.047235181,0,0.095360834,0.0462161,0,0.094913401,0.051076335,0){0,0,1190814.4,0,0,547145.45,0,0,595503.05,0,0,905328.07,0,0,421466.87,0,0,429138.45,0,0,402804.56,0,0,198977.54,0,0,142901.48,0,0,-196265.4,0,0,-69217.008,0,0,-183223.65,0,0,-748421.11,0,0,-321602.09,0,0,-458373.75};
+VT(0.1,0.22857143,0,0.095706332,0.23121352,0,0.095652827,0.22622146,0){0,0,0,0,0,183910.78,0,0,199039.37,0,0,0,0,0,-460364.34,0,0,-484109.58,0,0,0,0,0,508106.39,0,0,494313.66,0,0,0,0,0,-303408.65,0,0,-223837.82,0,0,0,0,0,-52245.513,0,0,-173819.74};
+VT(0.049213686,0.13705186,0,0.044512931,0.13802764,0,0.045894811,0.13135905,0){0,0,2922689.8,0,0,2867370.6,0,0,2973475.7,0,0,-2132523.3,0,0,-2150242,0,0,-1819976.4,0,0,-3499251.9,0,0,-3405187.4,0,0,-3679581.9,0,0,1186505.2,0,0,1298632.3,0,0,392676.16,0,0,3819996.4,0,0,3729885,0,0,3832095.1};
+VT(0.047918899,0.14257657,0,0.044512931,0.13802764,0,0.049213686,0.13705186,0){0,0,2842478.3,0,0,2867370.6,0,0,2922689.8,0,0,-2400971.6,0,0,-2150242,0,0,-2132523.3,0,0,-3215455,0,0,-3405187.4,0,0,-3499251.9,0,0,1901551.7,0,0,1298632.3,0,0,1186505.2,0,0,3510918.5,0,0,3729885,0,0,3819996.4};
+VT(0.026971271,0.22659033,0,0.021374843,0.22646669,0,0.02301506,0.22157032,0){0,0,1090633.5,0,0,906782.43,0,0,1025043.6,0,0,-2658504.1,0,0,-2208721,0,0,-2421684.9,0,0,2731189,0,0,2264460.9,0,0,2274566.1,0,0,-1267784.1,0,0,-1042528.4,0,0,-677461.35,0,0,-909068.56,0,0,-767856.24,0,0,-1351813.7};
+VT(0.095795895,0.073622969,0,0.095867013,0.068756454,0,0.1,0.071428571,0){0,0,473503.74,0,0,470210.65,0,0,0,0,0,205720.2,0,0,236792.42,0,0,0,0,0,-178405.32,0,0,-114175.46,0,0,0,0,0,-461642.03,0,0,-408471.99,0,0,0,0,0,-483922.03,0,0,-500215.61,0,0,0};
+};
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..fb1391cf84f1d34faedc158c0b42c961097ce09a
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,41 @@
+
+RM      = rm
+RMFLAGS = -f
+
+dvi:
+	texi2dvi gmsh.texi 
+
+ps: dvi
+	dvips gmsh -o
+
+pdf:
+	texi2pdf gmsh.texi 
+
+html:
+	texi2html -expandinfo -number -split_chapter gmsh.texi
+
+html2:
+	Texi2html -init_file gmsh.htmlconfig gmsh.texi
+
+html3:
+	makeinfo --html gmsh.texi
+
+info:
+	makeinfo gmsh.texi
+
+infoz:
+	gtar zcvf gmsh-info.tgz gmsh.info*
+
+doc: ps pdf html info
+
+install:
+	cp gmsh.info* /usr/local/info/
+	install-info gmsh.info /usr/local/info/dir
+
+clean:
+	$(RM) $(RMFLAGS) *.cp* *.fn* *.ky* *.pg* *.tp* *.vr* *.mv* \
+                         *.log *.toc *.aux \
+                         *.dvi *.ps gmsh.pdf \
+                         *.html *.info* gmsh-info.tgz*
+
+
diff --git a/doc/gmsh.1 b/doc/gmsh.1
new file mode 100644
index 0000000000000000000000000000000000000000..0f9fd79d35195868b9cfcc42bcff77dec54831ec
--- /dev/null
+++ b/doc/gmsh.1
@@ -0,0 +1,200 @@
+.\" ======================================================================
+.\"
+.\" This is the manual page for Gmsh
+.\" 
+.\" Copyright (c) 2000 C. Geuzaine, J.-F. Remacle
+.\" 
+.\" ======================================================================
+.TH Gmsh 0.995 "23 November 2000"
+.UC 4
+.\" ======================================================================
+.SH NAME
+Gmsh \- a 3D mesh generator with built-in pre- and post-processing
+facilities
+.\" ======================================================================
+.SH SYNOPSIS
+.B gmsh [file(s)] [option(s)]
+.\" ======================================================================
+.SH DESCRIPTION
+\fIGmsh\fR is an automatic three-dimensional finite element mesh
+generator, primarily Delaunay, with built-in pre- and post-processing
+facilities. Its primal goal is to provide a simple meshing tool for
+academic test cases with parametric input and up to date visualization
+capabilities. One of the strengths of \fIGmsh\fR is its ability to
+respect a characteristic length field for the generation of adapted
+meshes on lines, surfaces and volumes. These adapted meshes can be
+mixed with simple structured (transfinite, elliptic, etc.)  meshes in
+order to augment the flexibility.
+.SS Geometrical Entity Definition
+Parameterized geometries are created by successively defining points,
+oriented curves (segments, circles, ellipsis, splines, etc.), oriented
+surfaces (plane surfaces, ruled surfaces, etc.)  and volumes. Compound
+groups of geometrical entities can be defined, based on these elementary
+parameterized geometric entities.
+.SS Mesh Generation
+A finite element mesh is a tessellation of a given subset of R^3 by
+elementary geometrical elements of various shapes (in this case lines,
+triangles, quadrangles, tetrahedra, prisms and hexahedra), arranged in
+such a way that two of them intersect, if they do, along a common
+face, edge or node, and never otherwise. All the finite element meshes
+produced by \fIGmsh\fR as unstructured, even if they were generated in
+a structured way. This implies that the elementary geometrical
+elements are defined only by an ordered list of their vertices (which
+allows the orientation of all their lower order geometrical entities)
+but no predefined relation is assumed between any two elementary
+elements.
+.PP
+The procedure follows the same order as for the geometry creation:
+curves are discretized first; the mesh of the curves is then used to
+mesh the surfaces; then the mesh of the surfaces is used to mesh the
+volumes. This automatically assures the continuity of the mesh when,
+for example, two surfaces share a common curve. Every meshing step is
+constrained by the characteristic length field, which can be uniform,
+specified by characteristic length associated to elementary
+geometrical entities, or associated to another mesh (the background
+mesh).
+.PP
+For each meshing step (i.e. the discretization of lines, surfaces and
+volumes), all structured mesh directives are executed first, and serve
+as additional constraints for the unstructured parts. The implemented
+Delaunay algorithm is subdivided in the following five steps for
+surface/volume discretization:
+.TP 4
+.B 1.
+trivial meshing of a box including the convex polygon/polyhedron
+defined by the boundary nodes resulting from the discretization of the
+curves/surfaces; 
+.TP 4
+.B 2.
+creation of the initial mesh by insertion of all the nodes on the
+curves/surfaces thanks to the Bowyer algorithm; 
+.TP 4
+.B 3.
+boundary restoration to force all the edges/faces of the
+curves/surfaces to be present in the initial mesh;
+.TP 4
+.B 4.
+suppression of all the undesired triangles/tetrahedra (in
+particular those containing the nodes of the initial box); 
+.TP 4
+.B 5.
+insertion of new nodes by the Bowyer algorithm until the
+characteristic size of each simplex is lower or equal to the
+characteristic length field evaluated at the center of its
+circumscribed circle/sphere.
+.SS Scalar, vector and tensor field Visualization
+Multiple post-processing scalar or vector maps can be loaded and
+manipulated (globally or individually) along with the geometry and the
+mesh. Scalar fields are represented by iso-value curves or color maps
+and vector fields by three-dimensional arrows or displacement
+maps. Post-processor functions include offsets, elevation, interactive
+color map modification, range clamping, interactive animation, vector
+postscript output, etc.
+.\" ======================================================================
+.SH MESH OPTIONS
+.TP 4
+.B file[s]
+one or more ASCII file(s) containing the geometrical, mesh or
+post-processing descriptions.
+.TP 4
+.B \-0
+parse all input files and exit. 
+.TP 4
+.B \-1
+perform the one-dimensional mesh, i.e. discretize all the curves in
+the geometry.
+.TP 4
+.B \-2
+perform the two-dimensional mesh, i.e. discretize all the surfaces in
+the geometry.
+.TP 4
+.B \-3
+perform the three-dimensional mesh, i.e. discretize all the volumes in
+the geometry.
+.TP 4
+.B \-smooth int
+set the number of smoothing passes (default value is 3).
+.TP 4
+.B \-degree int
+set the degree of the generated elements (default value is 1).
+.TP 4
+.B \-scale float
+apply a global scaling factor to the generated mesh (default value is
+1.0).
+.TP 4
+.B \-bgm file
+load view in file as current background mesh.
+.TP 4
+.B \-extrude
+extrude 2-dimensional mesh (interactively)
+.TP 4
+.B \-recombine
+recombine extruded meshes
+.\" ======================================================================
+.SH POST-PROCESSING OPTIONS
+.TP 4
+.B \-dl
+enable OpenGL display lists.
+.TP 4
+.B \-noview
+hide all views at startup.
+.\" ======================================================================
+.SH DISPLAY OPTIONS
+.TP 4
+.B \-nodb
+suppress the double buffer. Use this options if you use \fIGmsh\fR on
+a remote host without GLX.
+.TP 4
+.B \-noov
+suppress overlay visual.
+.TP 4
+.B \-alpha
+enable alpha blending.
+.TP 4
+.B \-info
+show visual info at startup.
+.TP 4
+.B \-geometry geom
+specify main window geometry.
+.TP 4
+.B \-viewport 9*float.
+specify rotation, translation and scale
+.TP 4
+.B \-display disp.
+specify display.
+.TP 4
+.B \-perspective
+use perspective instead of orthographic projection.
+.TP 4
+.B \-flash
+allow colormap flashing.
+.TP 4
+.B \-samevisual
+force same visual for OpenGL and GUI.
+.\" ======================================================================
+.SH OTHER OPTIONS
+.TP 4
+.B \-threads
+enable threads.
+.TP 4
+.B \-path string
+set the path for included files.
+.TP 4
+.B \-version
+show version information.
+.TP 4
+.B \-help
+show help message.
+.\" ======================================================================
+.SH AUTHORS
+Christophe Geuzaine (Christope.Geuzaine@ulg.ac.be) and Jean-Francois
+Remacle (remacle@scorec.rpi.edu). 
+.\" ======================================================================
+.SH SEE ALSO
+Gmsh homepage at \fIhttp://www.geuz.org/gmsh/\fR
+.PP
+Gmsh example files in \fI/usr/doc/gmsh-0.995/\fR
+.PP
+GetDP (a scientific computation software for the numerical solution of
+integro-differential equations, using finite element and integral type
+methods) at \fIhttp://www.geuz.org/getdp/\fR
diff --git a/doc/gmsh.texi b/doc/gmsh.texi
new file mode 100644
index 0000000000000000000000000000000000000000..a51045c43b1e302629c37886289d6d4ae0e373c3
--- /dev/null
+++ b/doc/gmsh.texi
@@ -0,0 +1,220 @@
+\input texinfo.tex    @c -*-texinfo-*-
+@c =========================================================================
+@c
+@c This is the GMSH documentation texinfo source file
+@c
+@c Indexing : @cindex  == concepts
+@c            @tindex  == syntax
+@c            @mvindex == metasyntactic variables
+@c
+@c Before release, run C-u C-c C-u C-a in GNU Emacs
+@c This updates all node pointers and menus
+@c
+@c =========================================================================
+@c %**start of header
+@setfilename gmsh.info
+@set EDITION 0.1
+@set VERSION 0.98
+@set UPDATED 4 March 2000
+@set UPDATE-MONTH March 2000
+@set COPYRIGHT @copyright{} 1997-2000 Christophe Geuzaine, Jean-Francois Remacle
+@set WEB @uref{http://www.geuz.org/gmsh/}
+@settitle GMSH @value{VERSION}
+@footnotestyle separate
+@setchapternewpage odd
+@paragraphindent 0
+@finalout
+@defcodeindex mv
+@c %**end of header
+
+@ifinfo
+@dircategory Mesh Generation
+@direntry
+* Gmsh: (gmsh).         a mesh generator with pre- and post-processing facilities
+@end direntry
+@noindent
+This is Edition @value{EDITION}, last updated @value{UPDATED}, of the
+@cite{Gmsh Manual}, for Gmsh, Version @value{VERSION}.
+@noindent
+Copyright @value{COPYRIGHT}
+@end ifinfo
+
+@iftex
+@global@let@bullet=-
+@global@let@sl=@it
+@global@setfont@indit@itshape{9}{1000}
+@global@let@linkcolor=@Blue
+@parskip=5pt
+@end iftex
+
+@c =========================================================================
+@c Title page
+@c =========================================================================
+
+@shorttitlepage Gmsh
+@titlepage
+@title Gmsh
+@subtitle The documentation for Gmsh, Version @value{VERSION}
+@subtitle A automatic mesh generator with pre- and post-processing facilities
+@subtitle 
+@subtitle Edition @value{EDITION}, @value{UPDATE-MONTH}
+
+@author Christophe Geuzaine
+@author Jean-Francois Remacle
+
+@page
+@vskip 0pt plus 1filll
+Copyright @value{COPYRIGHT}
+@sp 1
+This document was prepared with Texinfo (@uref{http://texinfo.org}). The source
+of this document as well as formatted versions (info, postscript, pdf, html)
+are available at @value{WEB}.
+@end titlepage
+
+@c =========================================================================
+@c Table of contents
+@c =========================================================================
+
+@summarycontents
+@contents
+
+@c =========================================================================
+@c Top node
+@c =========================================================================
+
+@ifnottex
+@node Top, Copying, (dir), (dir)
+@top Gmsh
+
+Gmsh is an automatic three-dimensional mesh generator, with pre- and
+post-processing facilities.
+
+This is Edition @value{EDITION} of the @cite{Gmsh Manual}, last updated
+@value{UPDATED} for Gmsh Version @value{VERSION}.
+@end ifnottex
+
+
+@c =========================================================================
+@c Master menu
+@c =========================================================================
+
+@menu
+* Copying::                     Copyright and copying conditions
+* Introduction::                Basic presentation
+* Geometry::                    
+* Mesh::                        
+* Post-Processing::             
+* File formats::                Input and output file formats
+* Concept index::               
+* Syntax index::                
+* Variable index::              
+@end menu
+
+
+@c =========================================================================
+@c Copying Conditions
+@c =========================================================================
+
+@node Copying, Introduction, Top, Top
+@unnumbered Copying Conditions
+
+@cindex Copyright
+@cindex Web site
+@cindex Internet address
+@cindex Download
+@cindex Platforms
+
+Executable versions of Gmsh can be downloaded for most of the classical UNIX
+platforms (SUN, DEC, IBM, HP, SGI and Linux) and for Windows 95/98/NT from the
+web site @value{WEB} (no source distribution is available for the moment). The
+executable versions of Gmsh are free; the only thing asked if you use Gmsh is
+to mention it in your work. 
+
+@c =========================================================================
+@c Introduction
+@c =========================================================================
+
+@node Introduction, Geometry, Copying, Top
+@unnumbered Introduction
+
+@cindex Introduction
+
+Gmsh . Eventually, the most difficult thing about Gmsh is to find a way to
+pronouce 'Gmsh'...
+
+@c =========================================================================
+@c Geometry
+@c =========================================================================
+
+@node Geometry, Mesh, Introduction, Top
+@unnumbered Geometry
+
+@cindex Geometry
+
+@c =========================================================================
+@c Mesh
+@c =========================================================================
+
+@node Mesh, Post-Processing, Geometry, Top
+@unnumbered Mesh
+
+@cindex Mesh
+
+@c =========================================================================
+@c Post-Processing
+@c =========================================================================
+
+@node Post-Processing, File formats, Mesh, Top
+@unnumbered Post-Processing
+
+@cindex Post-Processing
+
+
+@c =========================================================================
+@c File Formats
+@c =========================================================================
+
+@node File formats, Concept index, Post-Processing, Top
+@appendix File Formats
+
+
+
+@c =========================================================================
+@c Concept Index
+@c =========================================================================
+
+@node Concept index, Syntax index, File formats, Top
+@unnumbered Concept Index
+
+@cindex Index, concepts
+@cindex Concepts, index
+
+@printindex cp
+
+@c =========================================================================
+@c Syntax Index
+@c =========================================================================
+
+@node Syntax index, Variable index, Concept index, Top
+@unnumbered Syntax Index
+
+@cindex Index, syntax
+@cindex Syntax, index
+@cindex Keywords, index
+
+@printindex tp
+
+@c =========================================================================
+@c Variable Index
+@c =========================================================================
+
+@node Variable index,  , Syntax index, Top
+@unnumbered Variable Index
+
+@cindex Index, metasyntactic variables
+@cindex Variables, index
+@cindex Metasyntactic variables, index
+
+@printindex mv
+
+@bye
diff --git a/examples/Bug_MaillageSplines.geo b/examples/Bug_MaillageSplines.geo
new file mode 100644
index 0000000000000000000000000000000000000000..08ad7be9296f97f78bcdd5117722aca0acbf3361
--- /dev/null
+++ b/examples/Bug_MaillageSplines.geo
@@ -0,0 +1,11 @@
+Point(1) = {0.0,0.0,0.0,.1};
+Point(2) = {1,0.0,0.0,.1};
+Point(3) = {1,1,0.0,.1};
+Point(4) = {.5,.5,1,.1};
+Point(5) = {1.2,.3,-.2,.1};
+Point(6) = {.5,0,.2,.1};
+Spline(1) = {1,4,3};
+Spline(2) = {3,5,2};
+Spline(3) = {2,6,1};
+Line Loop(4) = {2,3,1};
+Ruled Surface(5) = {4};
diff --git a/examples/big.geo b/examples/big.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1a7c0aacf0317cad0b491d158491d7093b1d23cc
--- /dev/null
+++ b/examples/big.geo
@@ -0,0 +1,50 @@
+la = .05;
+la2 = .03;
+
+Point(newp) = {0,0,0,la};  /* Point 1 */
+Point(newp) = {-1,0,0,la};  /* Point 2 */
+Point(newp) = {1,0,0,la};  /* Point 3 */
+Point(newp) = {1.1,0,0,la};  /* Point 4 */
+Point(newp) = {-1.1,0,0,la};  /* Point 5 */
+Circle(2) = {4,1,5};
+Circle(3) = {3,1,2};
+Point(newp) = {-.2,.4,0,la};  /* Point 6 */
+Point(newp) = {-.2,.4,0,la};  /* Point 7 */
+Point(newp) = {.2,.4,0,la};  /* Point 8 */
+Point(newp) = {.6,.4,0,la};  /* Point 9 */
+Point(newp) = {-.6,.4,0,la2};  /* Point 10 */
+Point(newp) = {-.65,.4,0,la2};  /* Point 11 */
+Point(newp) = {-.55,.4,0,la2};  /* Point 12 */
+Point(newp) = {-.25,.4,0,la2};  /* Point 13 */
+Point(newp) = {-.15,.4,0,la2};  /* Point 14 */
+Point(newp) = {.15,.4,0,la2};  /* Point 15 */
+Point(newp) = {.25,.4,0,la2};  /* Point 16 */
+Point(newp) = {.55,.4,0,la2};  /* Point 17 */
+Point(newp) = {.65,.4,0,la2};  /* Point 18 */
+
+Circle(4) = {18,9,17};
+Circle(5) = {17,9,18};
+Circle(6) = {16,8,15};
+Circle(7) = {15,8,16};
+Circle(8) = {14,7,13};
+Circle(9) = {13,7,14};
+Circle(10) = {12,10,11};
+Circle(11) = {11,10,12};
+
+Line(12) = {5,2};
+Line(13) = {2,3};
+Line(14) = {3,4};
+Loop(15) = {-12,-2,-14,3};
+Plane Surface(16) = {15};
+Loop(17) = {3,13};
+Loop(18) = {10,11};
+Loop(19) = {8,9};
+Loop(20) = {6,7};
+Loop(21) = {4,5};
+Plane Surface(22) = {17,18,19,20,21};
+
+Transfinite Line{12,14} = 7 Using Progression 0.9;
+Transfinite Line{2,3} = 40;
+Transfinite Surface{16} = {5,2,3,4};
+
+Recombine Surface{16};
diff --git a/examples/biz.geo b/examples/biz.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1652fde2a470880f95c525d7fb07402182f03d21
--- /dev/null
+++ b/examples/biz.geo
@@ -0,0 +1,27 @@
+Point(1) = {0,0,0,1.0};
+Point(2) = {1,0,0,1.0};
+Point(3) = {.5,1,0,1.0};
+Point(4) = {.75,.5,0,1.0};
+Line(1) = {2,1};
+Line(2) = {1,3};
+Line(3) = {3,4};
+Line(4) = {4,2};
+Line Loop(5) = {1,2,3,4};
+Ruled Surface(6) = {5};
+
+Point(5) = {1,1,0.0,1.0};
+Point(6) = {1,.5,0.0,1.0};
+Line(7) = {3,5};
+Line(8) = {5,6};
+Line(9) = {6,4};
+Line Loop(10) = {-3,7,8,9};
+Ruled Surface(11) = {10};
+
+Transfinite Line {2,4} = 5;
+Transfinite Line {3,1,8} = 10;
+Transfinite Line {7,9} = 10;
+
+Transfinite Surface {6} = {1,2,4,3};
+Transfinite Surface {11} = {4,6,5,3};
+
+Recombine Surface {6,11};
diff --git a/examples/brain.geo b/examples/brain.geo
new file mode 100644
index 0000000000000000000000000000000000000000..e42ba7b2511f172392a135c9524abc292481dc83
--- /dev/null
+++ b/examples/brain.geo
@@ -0,0 +1,35 @@
+Point(newp) = {0,0,0,0.1};  /* Point 1 */
+Point(newp) = {1,0,0,0.1};  /* Point 2 */
+Point(newp) = {-1,0,0,0.1};  /* Point 3 */
+
+Point(newp) = {0,.8,0,0.1};  /* Point 4 */
+Point(newp) = {0,0,.8,0.1};  /* Point 5 */
+Point(newp) = {0,0,-.8,0.1};  /* Point 6 */
+
+Point(newp) = {.1,0,-.79,.1};  /* Point 7 */
+Point(newp) = {.3,0,-.73,.1};  /* Point 8 */
+Point(newp) = {.65,0,-.55,.1};  /* Point 9 */
+Point(newp) = {.9,0,-.38,.1};  /* Point 10 */
+
+Point(newp) = {.1,0,.79,.1};  /* Point 11 */
+Point(newp) = {.3,0,.73,.1};  /* Point 12 */
+Point(newp) = {.65,0,.55,.1};  /* Point 13 */
+Point(newp) = {.9,0,.38,.1};  /* Point 14 */
+
+Spline(1) = {6,7,8,9,10,2};
+Circle(2) = {6,1,4};
+Circle(3) = {2,1,1,4};
+Line Loop(4) = {3,-2,1};
+Ruled Surface(5) = {4};
+
+Spline(6) = {5,11,12,13,14,2};
+Circle(7) = {5,1,4};
+Line Loop(8) = {3,-7,6};
+Ruled Surface(9) = {8};
+Line(10) = {6,5};
+Line Loop(11) = {7,-2,10};
+Plane Surface(12) = {11};
+Line Loop(13) = {-1,10,6};
+Plane Surface(14) = {13};
+Surface Loop(15) = {12,9,-5,-14};
+Complex Volume(16) = {15};
diff --git a/examples/bug_demi_cercles.geo b/examples/bug_demi_cercles.geo
new file mode 100644
index 0000000000000000000000000000000000000000..e0766a20f1f17d26fcd4180df75ca54914f93c71
--- /dev/null
+++ b/examples/bug_demi_cercles.geo
@@ -0,0 +1,13 @@
+Point(1) = {0.0,0.0,0.0,.08};
+Point(2) = {-.5,0.0,0.0,.08};
+Point(3) = {.5,0.0,0.0,.08};
+Point(4) = {.5,-.5,0.0,.08};
+Point(5) = {-.5,-.5,0.0,.08};
+Circle(1) = {3,1,2};
+Line(2) = {3,4};
+Line(3) = {4,5};
+Line(4) = {5,2};
+Line Loop(5) = {3,4,-1,2};
+Plane Surface(6) = {5};
+Extrude(6, {0,0,.5});
+Coherence;
diff --git a/examples/bug_ellipses.geo b/examples/bug_ellipses.geo
new file mode 100644
index 0000000000000000000000000000000000000000..eb0fb3910227eebf32d6b63973e04250ab07fd68
--- /dev/null
+++ b/examples/bug_ellipses.geo
@@ -0,0 +1,37 @@
+Point(newp) = { 0,  0,0,.1};  
+Point(newp) = {-1,  0,0,.1};  
+Point(newp) = { 1,  0,0,.1};  
+Point(newp) = { 0, .5,0,.1};  
+Point(newp) = { 0,-.5,0,.1};  
+Point(newp) = { 0,  0,.8,.1};  
+Point(newp) = { 0,  0,-1,.1};  
+
+Ellipsis(1) = {3,1,3,4};
+Ellipsis(2) = {4,1,2,2};
+Ellipsis(3) = {2,1,2,5};
+Ellipsis(4) = {5,1,3,3};
+Ellipsis(5) = {7,1,7,4};
+Ellipsis(6) = {4,1,6,6};
+Ellipsis(7) = {6,1,6,5};
+Ellipsis(8) = {5,1,7,7};
+Ellipsis(9) = {6,1,3,3};
+Ellipsis(10) = {2,1,2,6};
+Ellipsis(11) = {7,1,2,2};
+Ellipsis(12) = {3,1,3,7};
+
+Line Loop(13) = {1,6,9};
+Ruled Surface(14) = {13};
+Line Loop(15) = {4,-9,7};
+Ruled Surface(16) = {15};
+Line Loop(17) = {-7,-10,3};
+Ruled Surface(18) = {17};
+Line Loop(19) = {3,8,11};
+Ruled Surface(20) = {19};
+Line Loop(21) = {2,-11,5};
+Ruled Surface(22) = {21};
+Line Loop(23) = {-5,-12,1};
+Ruled Surface(24) = {23};
+Line Loop(25) = {-12,-4,8};
+Ruled Surface(26) = {25};
+Line Loop(27) = {-6,2,10};
+Ruled Surface(28) = {27};
diff --git a/examples/bug_select.geo b/examples/bug_select.geo
new file mode 100644
index 0000000000000000000000000000000000000000..403f564c6ea785a6b7fec7a61fc798f635a61da4
--- /dev/null
+++ b/examples/bug_select.geo
@@ -0,0 +1,56 @@
+la = .1;
+lc = .2;
+
+Point(1) = {-1,0,0,lc};
+Point(2) = {1,0,0,lc};
+Point(3) = {1,0.5,0,lc};
+Point(4) = {-1,0.5,0,lc};
+Point(5) = {-1.1,0.6,0,lc};
+Point(6) = {1.1,0.6,0,lc};
+Point(7) = {1.1,0,0,lc};
+Point(8) = {-1.1,0,0,lc};
+Point(9) = {-.3,0,0,lc};
+Point(10) = {.3,0,0,lc};
+Point(11) = {.4,0,0,la};
+Point(12) = {.2,0,0,la};
+Point(13) = {-.2,0,0,la};
+Point(14) = {-.4,0,0,la};
+Point(15) = {-.3,.1,0,la};
+Point(16) = {-.3,-.1,0,la};
+Point(17) = {.3,-.1,0,la};
+Point(18) = {.3,.1,0,la};
+Point(19) = {0,-.5,0,lc};
+Point(20) = {2,-.5,0,lc};
+Point(21) = {-2,-.5,0,lc};
+Point(22) = {0,1.5,0,lc};
+Point(23) = {0,1.7,0,lc};
+Point(24) = {2.2,-.5,0,lc};
+Point(25) = {-2.2,-.5,0,lc};
+
+Line(1) = {8,1};
+Line(2) = {1,4};
+Line(3) = {4,3};
+Line(4) = {3,2};
+Line(5) = {2,7};
+Line(6) = {7,6};
+Line(7) = {6,5};
+Line(8) = {5,8};
+Circle(9) = {11,10,18};
+Circle(10) = {18,10,12};
+Circle(11) = {12,10,17};
+Circle(12) = {17,10,11};
+Circle(13) = {13,9,15};
+Circle(14) = {15,9,14};
+Circle(15) = {14,9,16};
+Circle(16) = {16,9,13};
+Circle(17) = {20,19,22};
+Circle(18) = {22,19,21};
+Line(19) = {21,19};
+Line(20) = {20,19};
+Line(21) = {20,24};
+Line(22) = {21,25};
+Circle(23) = {24,19,23};
+Circle(24) = {23,19,25};
+
+Line Loop(27) = {19,-20,17,18};
+Plane Surface(28) = {27};
diff --git a/examples/carre.geo b/examples/carre.geo
new file mode 100644
index 0000000000000000000000000000000000000000..7385bb5b9ac83233e231d236c8d69c77afe9c7ff
--- /dev/null
+++ b/examples/carre.geo
@@ -0,0 +1,9 @@
+l = 2;
+Point(1) = {1.0,0.0,0.0,l};
+Point(2) = {1.0,1.0,0.0,l};
+Point(3) = {0.0,0.0,0.0,l};
+Point(4) = {0.0,1.0,0.0,l};
+Line(1) = {2,1};
+Line(2) = {1,3};
+Line(3) = {3,4};
+Line(4) = {4,2};
diff --git a/examples/coin.geo b/examples/coin.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0f5eaa31c7932bbe12c8b74cabec0a1e4db5098c
--- /dev/null
+++ b/examples/coin.geo
@@ -0,0 +1,39 @@
+lc = 0.05 ;
+lc = 0.1 ;
+
+
+/* Point      1 */
+Point(newp) = {0,0,0,lc};
+/* Point      2 */
+Point(newp) = {1,0,0,lc};
+/* Point      3 */
+Point(newp) = {0.5,0,0,lc};
+/* Point      4 */
+Point(newp) = {0.5,0.5,0,lc};
+/* Point      5 */
+Point(newp) = {1,0.5,0,lc};
+/* Point      6 */
+Point(newp) = {1,1,0,lc};
+/* Point      7 */
+Point(newp) = {0,1,0,lc};
+Delete {
+ Point(2);
+}
+Line(1) = Liste[3,4];
+Line(2) = Liste[4,5];
+Line(3) = Liste[5,6];
+Line(4) = Liste[6,7];
+Line(5) = Liste[7,1];
+Line(6) = Liste[1,3];
+
+Loop(7) = {5,6,1,2,3,4};
+Plane Surface(8) = {7};
+
+
+Air = 1111 ;
+CL0 = 2222 ;
+CL1 = 3333 ;
+
+Physical Volume (Air) = Liste[8] ;
+Physical Surface (CL0) = Liste[1,2] ;
+Physical Surface (CL1) = Liste[4,5] ;
diff --git a/examples/cube.geo b/examples/cube.geo
new file mode 100644
index 0000000000000000000000000000000000000000..75db8b37cb7b441864c0139095dd11a663c62fec
--- /dev/null
+++ b/examples/cube.geo
@@ -0,0 +1,58 @@
+lcar1 = .2;
+
+Point(newp) = {0.5,0.5,0.5,lcar1}; /* Point      1 */
+Point(newp) = {0.5,0.5,0,lcar1}; /* Point      2 */
+Point(newp) = {0,0.5,0.5,lcar1}; /* Point      3 */
+Point(newp) = {0,0,0.5,lcar1}; /* Point      4 */
+Point(newp) = {0.5,0,0.5,lcar1}; /* Point      5 */
+Point(newp) = {0.5,0,0,lcar1}; /* Point      6 */
+Point(newp) = {0,0.5,0,lcar1}; /* Point      7 */
+Point(newp) = {0,1,0,lcar1}; /* Point      8 */
+Point(newp) = {1,1,0,lcar1}; /* Point     9 */
+Point(newp) = {0,0,1,lcar1}; /* Point     10 */
+Point(newp) = {0,1,1,lcar1}; /* Point     11 */
+Point(newp) = {1,1,1,lcar1}; /* Point     12 */
+Point(newp) = {1,0,1,lcar1}; /* Point     13 */
+Point(newp) = {1,0,0,lcar1};
+
+Line(1) = {8,9};
+Line(2) = {9,12};
+Line(3) = {12,11};
+Line(4) = {11,8};
+Line(5) = {9,14};
+Line(6) = {14,13};
+Line(7) = {13,12};
+Line(8) = {11,10};
+Line(9) = {10,13};
+Line(10) = {10,4};
+Line(11) = {4,5};
+Line(12) = {5,6};
+Line(13) = {6,2};
+Line(14) = {2,1};
+Line(15) = {1,3};
+Line(16) = {3,7};
+Line(17) = {7,2};
+Line(18) = {3,4};
+Line(19) = {5,1};
+Line(20) = {7,8};
+Line(21) = {6,14};
+Line Loop(22) = {11,19,15,18};
+Plane Surface(23) = {22};
+Line Loop(24) = {16,17,14,15};
+Plane Surface(25) = {24};
+Line Loop(26) = {-17,20,1,5,-21,13};
+Plane Surface(27) = {26};
+Line Loop(28) = {4,1,2,3};
+Plane Surface(29) = {28};
+Line Loop(30) = {7,-2,5,6};
+Plane Surface(31) = {30};
+Line Loop(32) = {6,-9,10,11,12,21};
+Plane Surface(33) = {32};
+Line Loop(34) = {7,3,8,9};
+Plane Surface(35) = {34};
+Line Loop(36) = {10,-18,16,20,-4,8};
+Plane Surface(37) = {36};
+Line Loop(38) = {-14,-13,-12,19};
+Plane Surface(39) = {38};
+Surface Loop(40) = {35,31,29,37,33,23,39,25,27};
+Complex Volume(41) = {40};
diff --git a/examples/d2.geo b/examples/d2.geo
new file mode 100644
index 0000000000000000000000000000000000000000..86239fb5cee80b4d9fb474628ed854cb5b9647d7
--- /dev/null
+++ b/examples/d2.geo
@@ -0,0 +1,1065 @@
+Point(3895) = {1.177410e-02,-2.768003e-03,0,1.e-3};
+Point(3897) = {1.081196e-02,-3.794565e-03,0,1.e-3};
+Point(3896) = {1.040081e-02,-4.225326e-03,0,1.e-3};
+Point(3968) = {9.501183e-03,-5.167856e-03,0,1.e-3};
+Point(3995) = {8.172335e-03,-6.541147e-03,0,1.e-3};
+Point(4003) = {6.820756e-03,-7.914438e-03,0,1.e-3};
+Point(3857) = {5.454371e-03,-9.287729e-03,0,1.e-3};
+Point(3856) = {3.534352e-03,-1.119762e-02,0,1.e-3};
+Point(3860) = {7.877699e-04,-1.389559e-02,0,1.e-3};
+Point(3861) = {-1.958812e-03,-1.658843e-02,0,1.e-3};
+Point(3863) = {-4.705394e-03,-1.930092e-02,0,1.e-3};
+Point(3864) = {-7.451976e-03,-2.206110e-02,0,1.e-3};
+Point(3865) = {-1.019856e-02,-2.490134e-02,0,1.e-3};
+Point(3866) = {-1.294514e-02,-2.785668e-02,0,1.e-3};
+Point(3867) = {-1.569172e-02,-3.097311e-02,0,1.e-3};
+Point(3868) = {-1.819787e-02,-3.400697e-02,0,1.e-3};
+Point(3869) = {-1.843830e-02,-3.430929e-02,0,1.e-3};
+Point(3870) = {-2.032098e-02,-3.675355e-02,0,1.e-3};
+Point(3871) = {-2.233602e-02,-3.950013e-02,0,1.e-3};
+Point(3872) = {-2.428062e-02,-4.224671e-02,0,1.e-3};
+Point(3977) = {-2.615522e-02,-4.499330e-02,0,1.e-3};
+Point(3877) = {-2.795526e-02,-4.773988e-02,0,1.e-3};
+Point(3876) = {-2.966457e-02,-5.048646e-02,0,1.e-3};
+Point(3878) = {-3.128951e-02,-5.323304e-02,0,1.e-3};
+Point(3934) = {-3.282722e-02,-5.597962e-02,0,1.e-3};
+Point(3873) = {-3.427526e-02,-5.872621e-02,0,1.e-3};
+Point(3874) = {-3.563187e-02,-6.147279e-02,0,1.e-3};
+Point(3875) = {-3.689577e-02,-6.421937e-02,0,1.e-3};
+Point(3935) = {-3.803475e-02,-6.696595e-02,0,1.e-3};
+Point(3880) = {-3.906585e-02,-6.971253e-02,0,1.e-3};
+Point(3879) = {-3.999980e-02,-7.245912e-02,0,1.e-3};
+Point(3881) = {-4.084348e-02,-7.520570e-02,0,1.e-3};
+Point(3936) = {-4.159737e-02,-7.795228e-02,0,1.e-3};
+Point(3882) = {-4.219350e-02,-8.069886e-02,0,1.e-3};
+Point(3883) = {-4.268262e-02,-8.344544e-02,0,1.e-3};
+Point(3885) = {-4.302180e-02,-8.619203e-02,0,1.e-3};
+Point(3884) = {-4.315754e-02,-8.815942e-02,0,1.e-3};
+Point(1218) = {-4.315754e-02,-8.893861e-02,0,1.e-3};
+Point(3933) = {-4.315754e-02,-8.955185e-02,0,1.e-3};
+Point(3996) = {-4.314894e-02,-9.031190e-02,0,1.e-3};
+Point(3989) = {-4.310538e-02,-9.168519e-02,0,1.e-3};
+Point(3990) = {-4.298693e-02,-9.305848e-02,0,1.e-3};
+Point(3978) = {-4.281442e-02,-9.443177e-02,0,1.e-3};
+Point(3979) = {-4.254831e-02,-9.580506e-02,0,1.e-3};
+Point(3974) = {-4.215142e-02,-9.717835e-02,0,1.e-3};
+Point(3973) = {-4.166490e-02,-9.855164e-02,0,1.e-3};
+Point(3963) = {-4.107412e-02,-9.992494e-02,0,1.e-3};
+Point(3947) = {-4.041096e-02,-1.011964e-01,0,1.e-3};
+Point(3948) = {-4.035707e-02,-1.012982e-01,0,1.e-3};
+Point(3904) = {-3.903767e-02,-1.033356e-01,0,1.e-3};
+Point(3903) = {-3.766438e-02,-1.048133e-01,0,1.e-3};
+Point(3946) = {-3.629109e-02,-1.058804e-01,0,1.e-3};
+Point(3902) = {-3.491780e-02,-1.066897e-01,0,1.e-3};
+Point(3901) = {-3.354451e-02,-1.073184e-01,0,1.e-3};
+Point(3900) = {-3.217121e-02,-1.078168e-01,0,1.e-3};
+Point(3908) = {-3.079792e-02,-1.081973e-01,0,1.e-3};
+Point(3907) = {-2.942463e-02,-1.084688e-01,0,1.e-3};
+Point(3951) = {-2.805134e-02,-1.086029e-01,0,1.e-3};
+Point(3950) = {-2.667805e-02,-1.086423e-01,0,1.e-3};
+Point(3847) = {-2.580700e-02,-1.086440e-01,0,1.e-3};
+Point(3949) = {-2.667805e-02,-1.088853e-01,0,1.e-3};
+Point(3952) = {-2.805134e-02,-1.092658e-01,0,1.e-3};
+Point(3905) = {-2.942463e-02,-1.096463e-01,0,1.e-3};
+Point(3906) = {-3.079792e-02,-1.100268e-01,0,1.e-3};
+Point(3909) = {-3.217121e-02,-1.104020e-01,0,1.e-3};
+Point(3969) = {-3.354451e-02,-1.107749e-01,0,1.e-3};
+Point(3970) = {-3.491780e-02,-1.111477e-01,0,1.e-3};
+Point(3997) = {-3.629109e-02,-1.115205e-01,0,1.e-3};
+Point(3998) = {-3.766438e-02,-1.118690e-01,0,1.e-3};
+Point(4004) = {-3.903767e-02,-1.122095e-01,0,1.e-3};
+Point(3959) = {-4.041096e-02,-1.125499e-01,0,1.e-3};
+Point(3960) = {-4.315754e-02,-1.131897e-01,0,1.e-3};
+Point(3972) = {-4.590412e-02,-1.137699e-01,0,1.e-3};
+Point(3984) = {-4.865071e-02,-1.143079e-01,0,1.e-3};
+Point(3988) = {-5.139729e-02,-1.147970e-01,0,1.e-3};
+Point(3961) = {-5.414387e-02,-1.152035e-01,0,1.e-3};
+Point(3962) = {-5.689045e-02,-1.155501e-01,0,1.e-3};
+Point(3937) = {-5.963703e-02,-1.157358e-01,0,1.e-3};
+Point(3938) = {-6.238362e-02,-1.158519e-01,0,1.e-3};
+Point(3886) = {-6.513020e-02,-1.158332e-01,0,1.e-3};
+Point(3887) = {-6.787678e-02,-1.156607e-01,0,1.e-3};
+Point(3888) = {-7.062336e-02,-1.152790e-01,0,1.e-3};
+Point(3993) = {-7.199665e-02,-1.150098e-01,0,1.e-3};
+Point(3994) = {-7.336994e-02,-1.146075e-01,0,1.e-3};
+Point(3971) = {-7.474324e-02,-1.141776e-01,0,1.e-3};
+Point(3918) = {-7.611653e-02,-1.135965e-01,0,1.e-3};
+Point(3919) = {-7.748982e-02,-1.129165e-01,0,1.e-3};
+Point(3920) = {-7.886311e-02,-1.121014e-01,0,1.e-3};
+Point(3956) = {-8.023640e-02,-1.111186e-01,0,1.e-3};
+Point(3955) = {-8.047561e-02,-1.109113e-01,0,1.e-3};
+Point(3965) = {-8.160969e-02,-1.098434e-01,0,1.e-3};
+Point(3966) = {-8.189452e-02,-1.095380e-01,0,1.e-3};
+Point(3910) = {-8.297356e-02,-1.081647e-01,0,1.e-3};
+Point(3913) = {-8.376570e-02,-1.067914e-01,0,1.e-3};
+Point(3912) = {-8.435627e-02,-1.054263e-01,0,1.e-3};
+Point(3911) = {-8.435982e-02,-1.054181e-01,0,1.e-3};
+Point(3914) = {-8.478803e-02,-1.040448e-01,0,1.e-3};
+Point(3915) = {-8.503641e-02,-1.026715e-01,0,1.e-3};
+Point(3916) = {-8.516945e-02,-1.012982e-01,0,1.e-3};
+Point(3917) = {-8.522183e-02,-9.992494e-02,0,1.e-3};
+Point(3953) = {-8.512327e-02,-9.855164e-02,0,1.e-3};
+Point(3954) = {-8.495463e-02,-9.717835e-02,0,1.e-3};
+Point(3964) = {-8.467545e-02,-9.580506e-02,0,1.e-3};
+Point(3975) = {-8.433113e-02,-9.443177e-02,0,1.e-3};
+Point(3992) = {-8.387660e-02,-9.305848e-02,0,1.e-3};
+Point(3991) = {-8.341194e-02,-9.168519e-02,0,1.e-3};
+Point(3999) = {-8.280629e-02,-9.031190e-02,0,1.e-3};
+Point(3939) = {-8.220063e-02,-8.893861e-02,0,1.e-3};
+Point(3967) = {-8.076693e-02,-8.619203e-02,0,1.e-3};
+Point(3987) = {-7.916546e-02,-8.344544e-02,0,1.e-3};
+Point(3985) = {-7.886311e-02,-8.298081e-02,0,1.e-3};
+Point(3986) = {-7.737820e-02,-8.069886e-02,0,1.e-3};
+Point(4002) = {-7.542111e-02,-7.795228e-02,0,1.e-3};
+Point(3922) = {-7.335979e-02,-7.520570e-02,0,1.e-3};
+Point(4005) = {-7.112105e-02,-7.245912e-02,0,1.e-3};
+Point(3851) = {-6.873828e-02,-6.971253e-02,0,1.e-3};
+Point(3850) = {-6.372231e-02,-6.421937e-02,0,1.e-3};
+Point(3853) = {-5.963703e-02,-6.001430e-02,0,1.e-3};
+Point(3852) = {-5.414387e-02,-5.469298e-02,0,1.e-3};
+Point(3849) = {-4.865071e-02,-4.961204e-02,0,1.e-3};
+Point(3848) = {-4.315754e-02,-4.465740e-02,0,1.e-3};
+Point(3921) = {-3.766438e-02,-3.985542e-02,0,1.e-3};
+Point(3983) = {-3.491780e-02,-3.750843e-02,0,1.e-3};
+Point(3982) = {-3.217121e-02,-3.519259e-02,0,1.e-3};
+Point(3976) = {-2.942463e-02,-3.289435e-02,0,1.e-3};
+Point(3929) = {-2.744807e-02,-3.126039e-02,0,1.e-3};
+Point(3958) = {-2.667805e-02,-3.062383e-02,0,1.e-3};
+Point(3928) = {-2.411032e-02,-2.851380e-02,0,1.e-3};
+Point(3957) = {-2.393147e-02,-2.836765e-02,0,1.e-3};
+Point(3927) = {-2.118489e-02,-2.612321e-02,0,1.e-3};
+Point(3926) = {-1.843830e-02,-2.390843e-02,0,1.e-3};
+Point(3925) = {-1.569172e-02,-2.170681e-02,0,1.e-3};
+Point(3924) = {-1.294514e-02,-1.952576e-02,0,1.e-3};
+Point(3932) = {-1.040573e-02,-1.752748e-02,0,1.e-3};
+Point(3931) = {-1.019856e-02,-1.736495e-02,0,1.e-3};
+Point(3930) = {-7.451976e-03,-1.521330e-02,0,1.e-3};
+Point(3923) = {-4.705394e-03,-1.307794e-02,0,1.e-3};
+Point(3862) = {-1.958812e-03,-1.095092e-02,0,1.e-3};
+Point(3859) = {1.960946e-04,-9.287729e-03,0,1.e-3};
+Point(3858) = {7.877699e-04,-8.831063e-03,0,1.e-3};
+Point(3855) = {3.534352e-03,-6.728705e-03,0,1.e-3};
+Point(3854) = {6.280934e-03,-4.633175e-03,0,1.e-3};
+Point(3945) = {7.386845e-03,-3.794565e-03,0,1.e-3};
+Point(3944) = {7.654225e-03,-3.591811e-03,0,1.e-3};
+Point(3899) = {9.027516e-03,-2.550448e-03,0,1.e-3};
+Point(3898) = {1.040081e-02,-1.509310e-03,0,1.e-3};
+Point(3894) = {1.177410e-02,-4.686545e-04,0,1.e-3};
+Point(3890) = {1.282184e-02,3.253082e-04,0,1.e-3};
+Point(3893) = {1.314739e-02,5.720012e-04,0,1.e-3};
+Point(3941) = {1.463351e-02,1.698599e-03,0,1.e-3};
+Point(4000) = {1.644012e-02,3.071890e-03,0,1.e-3};
+Point(3980) = {1.824674e-02,4.445181e-03,0,1.e-3};
+Point(3846) = {1.892400e-02,4.960000e-03,0,1.e-3};
+Point(3981) = {1.843389e-02,4.445181e-03,0,1.e-3};
+Point(4001) = {1.712649e-02,3.071890e-03,0,1.e-3};
+Point(3942) = {1.584524e-02,1.698599e-03,0,1.e-3};
+Point(3940) = {1.460138e-02,3.253082e-04,0,1.e-3};
+Point(3889) = {1.452068e-02,2.362167e-04,0,1.e-3};
+Point(3892) = {1.335131e-02,-1.047983e-03,0,1.e-3};
+Point(3891) = {1.314739e-02,-1.270371e-03,0,1.e-3};
+Point(3943) = {1.209204e-02,-2.421274e-03,0,1.e-3};
+Point(4063) = {4.498368e-02,-9.287729e-03,0,1.e-3};
+Point(4062) = {4.610574e-02,-6.541147e-03,0,1.e-3};
+Point(4061) = {4.755089e-02,-3.794565e-03,0,1.e-3};
+Point(4114) = {4.934166e-02,-1.047983e-03,0,1.e-3};
+Point(4153) = {5.143154e-02,1.698599e-03,0,1.e-3};
+Point(4178) = {5.390637e-02,4.445181e-03,0,1.e-3};
+Point(4179) = {5.571941e-02,6.252892e-03,0,1.e-3};
+Point(4191) = {5.846599e-02,8.699713e-03,0,1.e-3};
+Point(4203) = {6.121257e-02,1.103796e-02,0,1.e-3};
+Point(4109) = {6.350284e-02,1.268493e-02,0,1.e-3};
+Point(4202) = {6.670574e-02,1.498818e-02,0,1.e-3};
+Point(4199) = {7.170787e-02,1.817809e-02,0,1.e-3};
+Point(4201) = {7.219890e-02,1.846566e-02,0,1.e-3};
+Point(4200) = {7.769207e-02,2.168274e-02,0,1.e-3};
+Point(4100) = {8.318523e-02,2.447113e-02,0,1.e-3};
+Point(4099) = {9.417156e-02,2.953992e-02,0,1.e-3};
+Point(4045) = {1.051579e-01,3.374477e-02,0,1.e-3};
+Point(4044) = {1.161442e-01,3.745387e-02,0,1.e-3};
+Point(4043) = {1.271305e-01,4.084705e-02,0,1.e-3};
+Point(4147) = {1.381169e-01,4.362166e-02,0,1.e-3};
+Point(4146) = {1.491032e-01,4.590535e-02,0,1.e-3};
+Point(4180) = {1.600895e-01,4.775547e-02,0,1.e-3};
+Point(4167) = {1.710759e-01,4.909090e-02,0,1.e-3};
+Point(4166) = {1.820622e-01,5.028654e-02,0,1.e-3};
+Point(4134) = {1.930485e-01,5.118303e-02,0,1.e-3};
+Point(4133) = {2.040348e-01,5.209637e-02,0,1.e-3};
+Point(4098) = {2.150212e-01,5.304431e-02,0,1.e-3};
+Point(4097) = {2.260075e-01,5.389186e-02,0,1.e-3};
+Point(4042) = {2.369938e-01,5.466596e-02,0,1.e-3};
+Point(4041) = {2.479802e-01,5.535583e-02,0,1.e-3};
+Point(4040) = {2.589665e-01,5.602171e-02,0,1.e-3};
+Point(4095) = {2.699528e-01,5.660820e-02,0,1.e-3};
+Point(4096) = {2.809391e-01,5.717080e-02,0,1.e-3};
+Point(4132) = {2.919255e-01,5.768210e-02,0,1.e-3};
+Point(4131) = {3.029118e-01,5.816077e-02,0,1.e-3};
+Point(4165) = {3.138981e-01,5.861410e-02,0,1.e-3};
+Point(4164) = {3.248844e-01,5.902748e-02,0,1.e-3};
+Point(4163) = {3.358708e-01,5.942876e-02,0,1.e-3};
+Point(4130) = {3.468571e-01,5.978313e-02,0,1.e-3};
+Point(4129) = {3.578434e-01,6.012088e-02,0,1.e-3};
+Point(4094) = {3.688298e-01,6.041918e-02,0,1.e-3};
+Point(4093) = {3.798161e-01,6.068571e-02,0,1.e-3};
+Point(4039) = {3.908024e-01,6.092523e-02,0,1.e-3};
+Point(4038) = {4.017887e-01,6.111444e-02,0,1.e-3};
+Point(4037) = {4.127751e-01,6.128792e-02,0,1.e-3};
+Point(4092) = {4.237614e-01,6.139510e-02,0,1.e-3};
+Point(4091) = {4.347477e-01,6.148330e-02,0,1.e-3};
+Point(4128) = {4.457341e-01,6.152051e-02,0,1.e-3};
+Point(4127) = {4.567204e-01,6.152534e-02,0,1.e-3};
+Point(4162) = {4.677067e-01,6.149964e-02,0,1.e-3};
+Point(4161) = {4.786930e-01,6.143130e-02,0,1.e-3};
+Point(4183) = {4.896794e-01,6.134928e-02,0,1.e-3};
+Point(4160) = {5.006657e-01,6.120560e-02,0,1.e-3};
+Point(4159) = {5.116520e-01,6.104561e-02,0,1.e-3};
+Point(4126) = {5.226384e-01,6.083535e-02,0,1.e-3};
+Point(4125) = {5.336247e-01,6.058889e-02,0,1.e-3};
+Point(4088) = {5.446110e-01,6.030455e-02,0,1.e-3};
+Point(4087) = {5.555973e-01,5.996460e-02,0,1.e-3};
+Point(4033) = {5.665837e-01,5.960434e-02,0,1.e-3};
+Point(4032) = {5.775700e-01,5.915575e-02,0,1.e-3};
+Point(4031) = {5.885563e-01,5.867545e-02,0,1.e-3};
+Point(4086) = {5.995427e-01,5.809113e-02,0,1.e-3};
+Point(4085) = {6.105290e-01,5.746759e-02,0,1.e-3};
+Point(4124) = {6.215153e-01,5.679937e-02,0,1.e-3};
+Point(4123) = {6.325016e-01,5.616104e-02,0,1.e-3};
+Point(4158) = {6.434880e-01,5.553466e-02,0,1.e-3};
+Point(4157) = {6.544743e-01,5.490460e-02,0,1.e-3};
+Point(4156) = {6.654606e-01,5.425221e-02,0,1.e-3};
+Point(4122) = {6.764469e-01,5.351456e-02,0,1.e-3};
+Point(4121) = {6.874333e-01,5.273401e-02,0,1.e-3};
+Point(4081) = {6.984196e-01,5.190181e-02,0,1.e-3};
+Point(4080) = {7.094059e-01,5.101347e-02,0,1.e-3};
+Point(4020) = {7.203923e-01,5.010133e-02,0,1.e-3};
+Point(4019) = {7.313786e-01,4.909498e-02,0,1.e-3};
+Point(4018) = {7.423649e-01,4.806316e-02,0,1.e-3};
+Point(4143) = {7.533512e-01,4.694984e-02,0,1.e-3};
+Point(4118) = {7.643376e-01,4.579371e-02,0,1.e-3};
+Point(4022) = {7.753239e-01,4.458624e-02,0,1.e-3};
+Point(4016) = {7.863102e-01,4.330843e-02,0,1.e-3};
+Point(4015) = {7.972966e-01,4.200167e-02,0,1.e-3};
+Point(4011) = {8.082829e-01,4.058146e-02,0,1.e-3};
+Point(4010) = {8.192692e-01,3.912968e-02,0,1.e-3};
+Point(4009) = {8.302555e-01,3.758209e-02,0,1.e-3};
+Point(4219) = {8.357487e-01,3.680830e-02,0,1.e-3};
+Point(4177) = {8.412419e-01,3.598390e-02,0,1.e-3};
+Point(4176) = {8.467350e-01,3.515767e-02,0,1.e-3};
+Point(4149) = {8.494816e-01,3.474456e-02,0,1.e-3};
+Point(4059) = {8.522282e-01,3.433145e-02,0,1.e-3};
+Point(4058) = {8.549748e-01,3.391833e-02,0,1.e-3};
+Point(4055) = {8.577214e-01,3.349214e-02,0,1.e-3};
+Point(4113) = {8.604679e-01,3.306571e-02,0,1.e-3};
+Point(4110) = {8.632145e-01,3.263928e-02,0,1.e-3};
+Point(4213) = {8.659611e-01,3.221285e-02,0,1.e-3};
+Point(4210) = {8.687077e-01,3.178643e-02,0,1.e-3};
+Point(4217) = {8.714543e-01,3.136000e-02,0,1.e-3};
+Point(4006) = {8.740950e-01,3.095000e-02,0,1.e-3};
+Point(4218) = {8.714543e-01,3.095677e-02,0,1.e-3};
+Point(4211) = {8.687077e-01,3.096380e-02,0,1.e-3};
+Point(4212) = {8.659611e-01,3.097084e-02,0,1.e-3};
+Point(4111) = {8.632145e-01,3.097787e-02,0,1.e-3};
+Point(4112) = {8.604679e-01,3.098491e-02,0,1.e-3};
+Point(4056) = {8.577214e-01,3.099195e-02,0,1.e-3};
+Point(4057) = {8.549748e-01,3.099898e-02,0,1.e-3};
+Point(4060) = {8.522282e-01,3.100602e-02,0,1.e-3};
+Point(4148) = {8.494816e-01,3.101305e-02,0,1.e-3};
+Point(4150) = {8.467350e-01,3.102009e-02,0,1.e-3};
+Point(4208) = {8.439885e-01,3.102712e-02,0,1.e-3};
+Point(4209) = {8.412419e-01,3.103416e-02,0,1.e-3};
+Point(4215) = {8.357487e-01,3.104823e-02,0,1.e-3};
+Point(4216) = {8.302555e-01,3.106230e-02,0,1.e-3};
+Point(4220) = {8.247624e-01,3.107638e-02,0,1.e-3};
+Point(4012) = {8.192692e-01,3.109045e-02,0,1.e-3};
+Point(4013) = {8.082829e-01,3.111859e-02,0,1.e-3};
+Point(4014) = {7.972966e-01,3.114674e-02,0,1.e-3};
+Point(4017) = {7.863102e-01,3.117488e-02,0,1.e-3};
+Point(4021) = {7.753239e-01,3.120302e-02,0,1.e-3};
+Point(4023) = {7.643376e-01,3.123117e-02,0,1.e-3};
+Point(4117) = {7.533512e-01,3.125931e-02,0,1.e-3};
+Point(4082) = {7.423649e-01,3.128745e-02,0,1.e-3};
+Point(4083) = {7.313786e-01,3.131560e-02,0,1.e-3};
+Point(4024) = {7.203923e-01,3.134374e-02,0,1.e-3};
+Point(4025) = {7.094059e-01,3.137188e-02,0,1.e-3};
+Point(4007) = {6.999910e-01,3.139600e-02,0,1.e-3};
+Point(4026) = {6.999910e-01,2.367126e-02,0,1.e-3};
+Point(4027) = {6.999910e-01,1.268493e-02,0,1.e-3};
+Point(4028) = {6.999910e-01,1.698599e-03,0,1.e-3};
+Point(4029) = {6.999910e-01,-9.287729e-03,0,1.e-3};
+Point(4008) = {6.999910e-01,-1.722400e-02,0,1.e-3};
+Point(4030) = {6.984196e-01,-1.751626e-02,0,1.e-3};
+Point(4084) = {6.874333e-01,-1.955960e-02,0,1.e-3};
+Point(4194) = {6.764469e-01,-2.159776e-02,0,1.e-3};
+Point(4195) = {6.654606e-01,-2.362865e-02,0,1.e-3};
+Point(4154) = {6.544743e-01,-2.588904e-02,0,1.e-3};
+Point(4155) = {6.434880e-01,-2.825320e-02,0,1.e-3};
+Point(4119) = {6.325016e-01,-3.016078e-02,0,1.e-3};
+Point(4120) = {6.215153e-01,-3.200586e-02,0,1.e-3};
+Point(4089) = {6.105290e-01,-3.369569e-02,0,1.e-3};
+Point(4090) = {5.995427e-01,-3.534073e-02,0,1.e-3};
+Point(4034) = {5.885563e-01,-3.694183e-02,0,1.e-3};
+Point(4035) = {5.775700e-01,-3.852074e-02,0,1.e-3};
+Point(4036) = {5.665837e-01,-4.009157e-02,0,1.e-3};
+Point(4144) = {5.555973e-01,-4.161619e-02,0,1.e-3};
+Point(4192) = {5.446110e-01,-4.311363e-02,0,1.e-3};
+Point(4193) = {5.336247e-01,-4.454372e-02,0,1.e-3};
+Point(4184) = {5.226384e-01,-4.589904e-02,0,1.e-3};
+Point(4185) = {5.116520e-01,-4.719211e-02,0,1.e-3};
+Point(4168) = {5.006657e-01,-4.834107e-02,0,1.e-3};
+Point(4169) = {4.896794e-01,-4.944199e-02,0,1.e-3};
+Point(4135) = {4.786930e-01,-5.032590e-02,0,1.e-3};
+Point(4136) = {4.677067e-01,-5.113121e-02,0,1.e-3};
+Point(4101) = {4.567204e-01,-5.175527e-02,0,1.e-3};
+Point(4102) = {4.457341e-01,-5.227269e-02,0,1.e-3};
+Point(4049) = {4.347477e-01,-5.270239e-02,0,1.e-3};
+Point(4050) = {4.237614e-01,-5.305741e-02,0,1.e-3};
+Point(4051) = {4.127751e-01,-5.339040e-02,0,1.e-3};
+Point(4103) = {4.017887e-01,-5.365720e-02,0,1.e-3};
+Point(4104) = {3.908024e-01,-5.390137e-02,0,1.e-3};
+Point(4137) = {3.798161e-01,-5.408775e-02,0,1.e-3};
+Point(4138) = {3.688298e-01,-5.423035e-02,0,1.e-3};
+Point(4170) = {3.578434e-01,-5.433335e-02,0,1.e-3};
+Point(4171) = {3.468571e-01,-5.436941e-02,0,1.e-3};
+Point(4186) = {3.358708e-01,-5.438425e-02,0,1.e-3};
+Point(4172) = {3.248844e-01,-5.431051e-02,0,1.e-3};
+Point(4173) = {3.138981e-01,-5.421116e-02,0,1.e-3};
+Point(4139) = {3.029118e-01,-5.403703e-02,0,1.e-3};
+Point(4140) = {2.919255e-01,-5.379680e-02,0,1.e-3};
+Point(4105) = {2.809391e-01,-5.349015e-02,0,1.e-3};
+Point(4106) = {2.699528e-01,-5.307623e-02,0,1.e-3};
+Point(4052) = {2.589665e-01,-5.262516e-02,0,1.e-3};
+Point(4053) = {2.479802e-01,-5.205332e-02,0,1.e-3};
+Point(4054) = {2.369938e-01,-5.145659e-02,0,1.e-3};
+Point(4107) = {2.260075e-01,-5.078306e-02,0,1.e-3};
+Point(4108) = {2.150212e-01,-5.007146e-02,0,1.e-3};
+Point(4141) = {2.040348e-01,-4.931867e-02,0,1.e-3};
+Point(4142) = {1.930485e-01,-4.849150e-02,0,1.e-3};
+Point(4174) = {1.820622e-01,-4.763665e-02,0,1.e-3};
+Point(4175) = {1.710759e-01,-4.665625e-02,0,1.e-3};
+Point(4187) = {1.600895e-01,-4.564614e-02,0,1.e-3};
+Point(4188) = {1.491032e-01,-4.455428e-02,0,1.e-3};
+Point(4145) = {1.381169e-01,-4.339482e-02,0,1.e-3};
+Point(4046) = {1.271305e-01,-4.218155e-02,0,1.e-3};
+Point(4047) = {1.161442e-01,-4.082776e-02,0,1.e-3};
+Point(4048) = {1.051579e-01,-3.939290e-02,0,1.e-3};
+Point(4196) = {9.966472e-02,-3.862964e-02,0,1.e-3};
+Point(4197) = {9.417156e-02,-3.788513e-02,0,1.e-3};
+Point(4198) = {8.867839e-02,-3.720163e-02,0,1.e-3};
+Point(4189) = {8.318523e-02,-3.651554e-02,0,1.e-3};
+Point(4190) = {7.769207e-02,-3.569174e-02,0,1.e-3};
+Point(4214) = {7.494548e-02,-3.527985e-02,0,1.e-3};
+Point(4181) = {7.219890e-02,-3.481687e-02,0,1.e-3};
+Point(4182) = {6.945232e-02,-3.430639e-02,0,1.e-3};
+Point(4151) = {6.670574e-02,-3.379591e-02,0,1.e-3};
+Point(4152) = {6.395916e-02,-3.322033e-02,0,1.e-3};
+Point(4064) = {6.121257e-02,-3.263264e-02,0,1.e-3};
+Point(4065) = {5.846599e-02,-3.189105e-02,0,1.e-3};
+Point(4066) = {5.635416e-02,-3.126039e-02,0,1.e-3};
+Point(4205) = {5.434612e-02,-3.049426e-02,0,1.e-3};
+Point(4206) = {5.297283e-02,-2.986940e-02,0,1.e-3};
+Point(4207) = {5.159954e-02,-2.914883e-02,0,1.e-3};
+Point(4072) = {5.022625e-02,-2.824438e-02,0,1.e-3};
+Point(4074) = {4.885296e-02,-2.716087e-02,0,1.e-3};
+Point(4073) = {4.883074e-02,-2.714051e-02,0,1.e-3};
+Point(4076) = {4.747966e-02,-2.578824e-02,0,1.e-3};
+Point(4075) = {4.746129e-02,-2.576722e-02,0,1.e-3};
+Point(4079) = {4.639274e-02,-2.439393e-02,0,1.e-3};
+Point(4078) = {4.561283e-02,-2.302064e-02,0,1.e-3};
+Point(4077) = {4.500573e-02,-2.164735e-02,0,1.e-3};
+Point(4068) = {4.450243e-02,-2.027406e-02,0,1.e-3};
+Point(4067) = {4.415104e-02,-1.890077e-02,0,1.e-3};
+Point(4069) = {4.402927e-02,-1.752748e-02,0,1.e-3};
+Point(4070) = {4.404617e-02,-1.615418e-02,0,1.e-3};
+Point(4071) = {4.411753e-02,-1.478089e-02,0,1.e-3};
+Point(4115) = {4.421802e-02,-1.340760e-02,0,1.e-3};
+Point(4116) = {4.435615e-02,-1.203431e-02,0,1.e-3};
+Point(4204) = {4.461695e-02,-1.066102e-02,0,1.e-3};
+Point(11) = {4.552264e+01,-2.254225e+01,0,1.000000e+00};
+Point(2233) = {4.552264e+01,-1.129225e+01,0,1.000000e+00};
+Point(5) = {4.552264e+01,-4.224671e-02,0,1.000000e+00};
+Point(2236) = {4.552264e+01,1.120775e+01,0,1.000000e+00};
+Point(14) = {4.552264e+01,2.245775e+01,0,1.000000e+00};
+Point(2) = {4.552264e+01,4.495775e+01,0,1.000000e+00};
+Point(15) = {2.302264e+01,4.495775e+01,0,1.000000e+00};
+Point(2301) = {1.177264e+01,4.495775e+01,0,1.000000e+00};
+Point(6) = {5.226384e-01,4.495775e+01,0,1.000000e+00};
+Point(2304) = {-1.072736e+01,4.495775e+01,0,1.000000e+00};
+Point(18) = {-2.197736e+01,4.495775e+01,0,1.000000e+00};
+Point(3) = {-4.447736e+01,4.495775e+01,0,1.000000e+00};
+Point(19) = {-4.447736e+01,2.245775e+01,0,1.000000e+00};
+Point(2240) = {-4.447736e+01,1.120775e+01,0,1.000000e+00};
+Point(7) = {-4.447736e+01,-4.224671e-02,0,1.000000e+00};
+Point(2243) = {-4.447736e+01,-1.129225e+01,0,1.000000e+00};
+Point(22) = {-4.447736e+01,-2.254225e+01,0,1.000000e+00};
+Point(4) = {-4.447736e+01,-4.504225e+01,0,1.000000e+00};
+Point(23) = {-2.197736e+01,-4.504225e+01,0,1.000000e+00};
+Point(2317) = {-1.072736e+01,-4.504225e+01,0,1.000000e+00};
+Point(8) = {5.226384e-01,-4.504225e+01,0,1.000000e+00};
+Point(2297) = {1.177264e+01,-4.504225e+01,0,1.000000e+00};
+Point(10) = {2.302264e+01,-4.504225e+01,0,1.000000e+00};
+Point(1) = {4.552264e+01,-4.504225e+01,0,1.000000e+00};
+Point(4298) = {1.125732e+00,-1.356305e-01,0,1.000000e+00};
+Point(4297) = {1.128473e+00,-1.383771e-01,0,1.000000e+00};
+Point(4222) = {1.130511e+00,-1.404190e-01,0,1.000000e+00};
+Point(4250) = {1.130200e+00,-1.411237e-01,0,1.000000e+00};
+Point(4252) = {1.128987e+00,-1.438702e-01,0,1.000000e+00};
+Point(4221) = {1.128033e+00,-1.460320e-01,0,1.000000e+00};
+Point(4251) = {1.126886e+00,-1.450775e-01,0,1.000000e+00};
+Point(4299) = {1.124140e+00,-1.427912e-01,0,1.000000e+00};
+Point(4335) = {1.121393e+00,-1.405048e-01,0,1.000000e+00};
+Point(4337) = {1.118647e+00,-1.382318e-01,0,1.000000e+00};
+Point(4267) = {1.115900e+00,-1.359746e-01,0,1.000000e+00};
+Point(4294) = {1.115481e+00,-1.356305e-01,0,1.000000e+00};
+Point(4269) = {1.110407e+00,-1.315213e-01,0,1.000000e+00};
+Point(4233) = {1.104914e+00,-1.272651e-01,0,1.000000e+00};
+Point(4234) = {1.099421e+00,-1.231333e-01,0,1.000000e+00};
+Point(4273) = {1.093927e+00,-1.190696e-01,0,1.000000e+00};
+Point(4293) = {1.088434e+00,-1.150965e-01,0,1.000000e+00};
+Point(4314) = {1.082941e+00,-1.112096e-01,0,1.000000e+00};
+Point(4317) = {1.077448e+00,-1.073829e-01,0,1.000000e+00};
+Point(4318) = {1.071955e+00,-1.037168e-01,0,1.000000e+00};
+Point(4274) = {1.066462e+00,-1.001266e-01,0,1.000000e+00};
+Point(4235) = {1.060968e+00,-9.664561e-02,0,1.000000e+00};
+Point(4236) = {1.055475e+00,-9.329373e-02,0,1.000000e+00};
+Point(4237) = {1.049982e+00,-8.999964e-02,0,1.000000e+00};
+Point(4301) = {1.044489e+00,-8.685139e-02,0,1.000000e+00};
+Point(4319) = {1.038996e+00,-8.375978e-02,0,1.000000e+00};
+Point(4321) = {1.033503e+00,-8.073620e-02,0,1.000000e+00};
+Point(4320) = {1.033435e+00,-8.069886e-02,0,1.000000e+00};
+Point(4322) = {1.028009e+00,-7.778268e-02,0,1.000000e+00};
+Point(4347) = {1.022516e+00,-7.485902e-02,0,1.000000e+00};
+Point(4323) = {1.017023e+00,-7.206071e-02,0,1.000000e+00};
+Point(4324) = {1.011530e+00,-6.928798e-02,0,1.000000e+00};
+Point(4325) = {1.006037e+00,-6.656447e-02,0,1.000000e+00};
+Point(4276) = {1.000544e+00,-6.390345e-02,0,1.000000e+00};
+Point(4238) = {9.950505e-01,-6.128188e-02,0,1.000000e+00};
+Point(4240) = {9.895573e-01,-5.875476e-02,0,1.000000e+00};
+Point(4239) = {9.894949e-01,-5.872621e-02,0,1.000000e+00};
+Point(4241) = {9.840641e-01,-5.625125e-02,0,1.000000e+00};
+Point(4277) = {9.785710e-01,-5.382099e-02,0,1.000000e+00};
+Point(4326) = {9.730778e-01,-5.141086e-02,0,1.000000e+00};
+Point(4327) = {9.675846e-01,-4.903782e-02,0,1.000000e+00};
+Point(4328) = {9.620915e-01,-4.670806e-02,0,1.000000e+00};
+Point(4350) = {9.565983e-01,-4.440955e-02,0,1.000000e+00};
+Point(4348) = {9.511052e-01,-4.217563e-02,0,1.000000e+00};
+Point(4349) = {9.456120e-01,-3.995849e-02,0,1.000000e+00};
+Point(4332) = {9.401188e-01,-3.778658e-02,0,1.000000e+00};
+Point(4333) = {9.346257e-01,-3.563417e-02,0,1.000000e+00};
+Point(4334) = {9.291325e-01,-3.354304e-02,0,1.000000e+00};
+Point(4278) = {9.236393e-01,-3.147155e-02,0,1.000000e+00};
+Point(4247) = {9.181462e-01,-2.942051e-02,0,1.000000e+00};
+Point(4248) = {9.126530e-01,-2.741688e-02,0,1.000000e+00};
+Point(4249) = {9.071598e-01,-2.541811e-02,0,1.000000e+00};
+Point(4282) = {9.016667e-01,-2.339436e-02,0,1.000000e+00};
+Point(4283) = {8.961735e-01,-2.121581e-02,0,1.000000e+00};
+Point(4341) = {8.934269e-01,-2.008894e-02,0,1.000000e+00};
+Point(4342) = {8.906803e-01,-1.868991e-02,0,1.000000e+00};
+Point(4343) = {8.879338e-01,-1.729088e-02,0,1.000000e+00};
+Point(4289) = {8.851872e-01,-1.539587e-02,0,1.000000e+00};
+Point(4290) = {8.824406e-01,-1.328983e-02,0,1.000000e+00};
+Point(4286) = {8.796940e-01,-1.068337e-02,0,1.000000e+00};
+Point(4255) = {8.785175e-01,-9.287729e-03,0,1.000000e+00};
+Point(4257) = {8.763537e-01,-6.541147e-03,0,1.000000e+00};
+Point(4256) = {8.745583e-01,-3.794565e-03,0,1.000000e+00};
+Point(4346) = {8.737982e-01,-2.421274e-03,0,1.000000e+00};
+Point(4288) = {8.731375e-01,-1.047983e-03,0,1.000000e+00};
+Point(4287) = {8.725645e-01,3.253082e-04,0,1.000000e+00};
+Point(4260) = {8.721474e-01,1.698599e-03,0,1.000000e+00};
+Point(4259) = {8.718264e-01,3.071890e-03,0,1.000000e+00};
+Point(4258) = {8.716296e-01,4.445181e-03,0,1.000000e+00};
+Point(4262) = {8.715751e-01,5.818472e-03,0,1.000000e+00};
+Point(4261) = {8.716587e-01,7.191763e-03,0,1.000000e+00};
+Point(4264) = {8.718582e-01,8.565054e-03,0,1.000000e+00};
+Point(4263) = {8.721688e-01,9.938345e-03,0,1.000000e+00};
+Point(4265) = {8.726207e-01,1.131164e-02,0,1.000000e+00};
+Point(4266) = {8.732553e-01,1.268493e-02,0,1.000000e+00};
+Point(4303) = {8.741084e-01,1.405822e-02,0,1.000000e+00};
+Point(4302) = {8.742009e-01,1.417564e-02,0,1.000000e+00};
+Point(4304) = {8.752094e-01,1.543151e-02,0,1.000000e+00};
+Point(4305) = {8.755741e-01,1.580615e-02,0,1.000000e+00};
+Point(4306) = {8.765464e-01,1.680480e-02,0,1.000000e+00};
+Point(4307) = {8.769474e-01,1.712646e-02,0,1.000000e+00};
+Point(4308) = {8.783004e-01,1.817809e-02,0,1.000000e+00};
+Point(4309) = {8.783207e-01,1.819390e-02,0,1.000000e+00};
+Point(4345) = {8.796940e-01,1.898483e-02,0,1.000000e+00};
+Point(4344) = {8.810673e-01,1.969096e-02,0,1.000000e+00};
+Point(4254) = {8.824406e-01,2.018966e-02,0,1.000000e+00};
+Point(4253) = {8.851872e-01,2.092940e-02,0,1.000000e+00};
+Point(4285) = {8.879338e-01,2.136484e-02,0,1.000000e+00};
+Point(4284) = {8.906803e-01,2.153023e-02,0,1.000000e+00};
+Point(4340) = {8.934269e-01,2.149455e-02,0,1.000000e+00};
+Point(4339) = {8.961735e-01,2.136105e-02,0,1.000000e+00};
+Point(4338) = {8.989201e-01,2.104930e-02,0,1.000000e+00};
+Point(4246) = {9.016667e-01,2.064514e-02,0,1.000000e+00};
+Point(4245) = {9.071598e-01,1.954695e-02,0,1.000000e+00};
+Point(4281) = {9.126530e-01,1.818666e-02,0,1.000000e+00};
+Point(4280) = {9.181462e-01,1.648801e-02,0,1.000000e+00};
+Point(4279) = {9.236393e-01,1.459116e-02,0,1.000000e+00};
+Point(4244) = {9.291325e-01,1.255534e-02,0,1.000000e+00};
+Point(4243) = {9.346257e-01,1.024686e-02,0,1.000000e+00};
+Point(4242) = {9.401188e-01,7.859173e-03,0,1.000000e+00};
+Point(4296) = {9.456120e-01,5.245962e-03,0,1.000000e+00};
+Point(4295) = {9.511052e-01,2.515401e-03,0,1.000000e+00};
+Point(4300) = {9.565983e-01,-3.522322e-04,0,1.000000e+00};
+Point(4330) = {9.620915e-01,-3.368852e-03,0,1.000000e+00};
+Point(4331) = {9.628545e-01,-3.794565e-03,0,1.000000e+00};
+Point(4329) = {9.675846e-01,-6.447130e-03,0,1.000000e+00};
+Point(4232) = {9.730778e-01,-9.700323e-03,0,1.000000e+00};
+Point(4231) = {9.840641e-01,-1.646639e-02,0,1.000000e+00};
+Point(4230) = {9.950505e-01,-2.366260e-02,0,1.000000e+00};
+Point(4229) = {1.006037e+00,-3.132299e-02,0,1.000000e+00};
+Point(4228) = {1.017023e+00,-3.943289e-02,0,1.000000e+00};
+Point(4227) = {1.028009e+00,-4.793142e-02,0,1.000000e+00};
+Point(4225) = {1.038996e+00,-5.669110e-02,0,1.000000e+00};
+Point(4226) = {1.048275e+00,-6.421937e-02,0,1.000000e+00};
+Point(4312) = {1.054944e+00,-6.971253e-02,0,1.000000e+00};
+Point(4223) = {1.060968e+00,-7.473580e-02,0,1.000000e+00};
+Point(4224) = {1.061523e+00,-7.520570e-02,0,1.000000e+00};
+Point(4311) = {1.066462e+00,-7.943817e-02,0,1.000000e+00};
+Point(4310) = {1.067933e+00,-8.069886e-02,0,1.000000e+00};
+Point(4275) = {1.071955e+00,-8.420612e-02,0,1.000000e+00};
+Point(4316) = {1.077448e+00,-8.903994e-02,0,1.000000e+00};
+Point(4315) = {1.082941e+00,-9.395896e-02,0,1.000000e+00};
+Point(4313) = {1.088434e+00,-9.897945e-02,0,1.000000e+00};
+Point(4292) = {1.093927e+00,-1.041032e-01,0,1.000000e+00};
+Point(4272) = {1.099421e+00,-1.093858e-01,0,1.000000e+00};
+Point(4271) = {1.104914e+00,-1.148004e-01,0,1.000000e+00};
+Point(4270) = {1.110407e+00,-1.202740e-01,0,1.000000e+00};
+Point(4268) = {1.114765e+00,-1.246442e-01,0,1.000000e+00};
+Point(4291) = {1.120249e+00,-1.301373e-01,0,1.000000e+00};
+Point(4336) = {1.122990e+00,-1.328839e-01,0,1.000000e+00};
+Line(1) = {3895,3897};
+Line(2) = {3897,3896};
+Line(3) = {3896,3968};
+Line(4) = {3968,3995};
+Line(5) = {3995,4003};
+Line(6) = {4003,3857};
+Line(7) = {3857,3856};
+Line(8) = {3856,3860};
+Line(9) = {3860,3861};
+Line(10) = {3861,3863};
+Line(11) = {3863,3864};
+Line(12) = {3864,3865};
+Line(13) = {3865,3866};
+Line(14) = {3866,3867};
+Line(15) = {3867,3868};
+Line(16) = {3868,3869};
+Line(17) = {3869,3870};
+Line(18) = {3870,3871};
+Line(19) = {3871,3872};
+Line(20) = {3872,3977};
+Line(21) = {3977,3877};
+Line(22) = {3877,3876};
+Line(23) = {3876,3878};
+Line(24) = {3878,3934};
+Line(25) = {3934,3873};
+Line(26) = {3873,3874};
+Line(27) = {3874,3875};
+Line(28) = {3875,3935};
+Line(29) = {3935,3880};
+Line(30) = {3880,3879};
+Line(31) = {3879,3881};
+Line(32) = {3881,3936};
+Line(33) = {3936,3882};
+Line(34) = {3882,3883};
+Line(35) = {3883,3885};
+Line(36) = {3885,3884};
+Line(37) = {3884,1218};
+Line(38) = {1218,3933};
+Line(39) = {3933,3996};
+Line(40) = {3996,3989};
+Line(41) = {3989,3990};
+Line(42) = {3990,3978};
+Line(43) = {3978,3979};
+Line(44) = {3979,3974};
+Line(45) = {3974,3973};
+Line(46) = {3973,3963};
+Line(47) = {3963,3947};
+Line(48) = {3947,3948};
+Line(49) = {3948,3904};
+Line(50) = {3904,3903};
+Line(51) = {3903,3946};
+Line(52) = {3946,3902};
+Line(53) = {3902,3901};
+Line(54) = {3901,3900};
+Line(55) = {3900,3908};
+Line(56) = {3908,3907};
+Line(57) = {3907,3951};
+Line(58) = {3951,3950};
+Line(59) = {3950,3847};
+Line(60) = {3847,3949};
+Line(61) = {3949,3952};
+Line(62) = {3952,3905};
+Line(63) = {3905,3906};
+Line(64) = {3906,3909};
+Line(65) = {3909,3969};
+Line(66) = {3969,3970};
+Line(67) = {3970,3997};
+Line(68) = {3997,3998};
+Line(69) = {3998,4004};
+Line(70) = {4004,3959};
+Line(71) = {3959,3960};
+Line(72) = {3960,3972};
+Line(73) = {3972,3984};
+Line(74) = {3984,3988};
+Line(75) = {3988,3961};
+Line(76) = {3961,3962};
+Line(77) = {3962,3937};
+Line(78) = {3937,3938};
+Line(79) = {3938,3886};
+Line(80) = {3886,3887};
+Line(81) = {3887,3888};
+Line(82) = {3888,3993};
+Line(83) = {3993,3994};
+Line(84) = {3994,3971};
+Line(85) = {3971,3918};
+Line(86) = {3918,3919};
+Line(87) = {3919,3920};
+Line(88) = {3920,3956};
+Line(89) = {3956,3955};
+Line(90) = {3955,3965};
+Line(91) = {3965,3966};
+Line(92) = {3966,3910};
+Line(93) = {3910,3913};
+Line(94) = {3913,3912};
+Line(95) = {3912,3911};
+Line(96) = {3911,3914};
+Line(97) = {3914,3915};
+Line(98) = {3915,3916};
+Line(99) = {3916,3917};
+Line(100) = {3917,3953};
+Line(101) = {3953,3954};
+Line(102) = {3954,3964};
+Line(103) = {3964,3975};
+Line(104) = {3975,3992};
+Line(105) = {3992,3991};
+Line(106) = {3991,3999};
+Line(107) = {3999,3939};
+Line(108) = {3939,3967};
+Line(109) = {3967,3987};
+Line(110) = {3987,3985};
+Line(111) = {3985,3986};
+Line(112) = {3986,4002};
+Line(113) = {4002,3922};
+Line(114) = {3922,4005};
+Line(115) = {4005,3851};
+Line(116) = {3851,3850};
+Line(117) = {3850,3853};
+Line(118) = {3853,3852};
+Line(119) = {3852,3849};
+Line(120) = {3849,3848};
+Line(121) = {3848,3921};
+Line(122) = {3921,3983};
+Line(123) = {3983,3982};
+Line(124) = {3982,3976};
+Line(125) = {3976,3929};
+Line(126) = {3929,3958};
+Line(127) = {3958,3928};
+Line(128) = {3928,3957};
+Line(129) = {3957,3927};
+Line(130) = {3927,3926};
+Line(131) = {3926,3925};
+Line(132) = {3925,3924};
+Line(133) = {3924,3932};
+Line(134) = {3932,3931};
+Line(135) = {3931,3930};
+Line(136) = {3930,3923};
+Line(137) = {3923,3862};
+Line(138) = {3862,3859};
+Line(139) = {3859,3858};
+Line(140) = {3858,3855};
+Line(141) = {3855,3854};
+Line(142) = {3854,3945};
+Line(143) = {3945,3944};
+Line(144) = {3944,3899};
+Line(145) = {3899,3898};
+Line(146) = {3898,3894};
+Line(147) = {3894,3890};
+Line(148) = {3890,3893};
+Line(149) = {3893,3941};
+Line(150) = {3941,4000};
+Line(151) = {4000,3980};
+Line(152) = {3980,3846};
+Line(153) = {3846,3981};
+Line(154) = {3981,4001};
+Line(155) = {4001,3942};
+Line(156) = {3942,3940};
+Line(157) = {3940,3889};
+Line(158) = {3889,3892};
+Line(159) = {3892,3891};
+Line(160) = {3891,3943};
+Line(161) = {3943,3895};
+Line(162) = {4063,4062};
+Line(163) = {4062,4061};
+Line(164) = {4061,4114};
+Line(165) = {4114,4153};
+Line(166) = {4153,4178};
+Line(167) = {4178,4179};
+Line(168) = {4179,4191};
+Line(169) = {4191,4203};
+Line(170) = {4203,4109};
+Line(171) = {4109,4202};
+Line(172) = {4202,4199};
+Line(173) = {4199,4201};
+Line(174) = {4201,4200};
+Line(175) = {4200,4100};
+Line(176) = {4100,4099};
+Line(177) = {4099,4045};
+Line(178) = {4045,4044};
+Line(179) = {4044,4043};
+Line(180) = {4043,4147};
+Line(181) = {4147,4146};
+Line(182) = {4146,4180};
+Line(183) = {4180,4167};
+Line(184) = {4167,4166};
+Line(185) = {4166,4134};
+Line(186) = {4134,4133};
+Line(187) = {4133,4098};
+Line(188) = {4098,4097};
+Line(189) = {4097,4042};
+Line(190) = {4042,4041};
+Line(191) = {4041,4040};
+Line(192) = {4040,4095};
+Line(193) = {4095,4096};
+Line(194) = {4096,4132};
+Line(195) = {4132,4131};
+Line(196) = {4131,4165};
+Line(197) = {4165,4164};
+Line(198) = {4164,4163};
+Line(199) = {4163,4130};
+Line(200) = {4130,4129};
+Line(201) = {4129,4094};
+Line(202) = {4094,4093};
+Line(203) = {4093,4039};
+Line(204) = {4039,4038};
+Line(205) = {4038,4037};
+Line(206) = {4037,4092};
+Line(207) = {4092,4091};
+Line(208) = {4091,4128};
+Line(209) = {4128,4127};
+Line(210) = {4127,4162};
+Line(211) = {4162,4161};
+Line(212) = {4161,4183};
+Line(213) = {4183,4160};
+Line(214) = {4160,4159};
+Line(215) = {4159,4126};
+Line(216) = {4126,4125};
+Line(217) = {4125,4088};
+Line(218) = {4088,4087};
+Line(219) = {4087,4033};
+Line(220) = {4033,4032};
+Line(221) = {4032,4031};
+Line(222) = {4031,4086};
+Line(223) = {4086,4085};
+Line(224) = {4085,4124};
+Line(225) = {4124,4123};
+Line(226) = {4123,4158};
+Line(227) = {4158,4157};
+Line(228) = {4157,4156};
+Line(229) = {4156,4122};
+Line(230) = {4122,4121};
+Line(231) = {4121,4081};
+Line(232) = {4081,4080};
+Line(233) = {4080,4020};
+Line(234) = {4020,4019};
+Line(235) = {4019,4018};
+Line(236) = {4018,4143};
+Line(237) = {4143,4118};
+Line(238) = {4118,4022};
+Line(239) = {4022,4016};
+Line(240) = {4016,4015};
+Line(241) = {4015,4011};
+Line(242) = {4011,4010};
+Line(243) = {4010,4009};
+Line(244) = {4009,4219};
+Line(245) = {4219,4177};
+Line(246) = {4177,4176};
+Line(247) = {4176,4149};
+Line(248) = {4149,4059};
+Line(249) = {4059,4058};
+Line(250) = {4058,4055};
+Line(251) = {4055,4113};
+Line(252) = {4113,4110};
+Line(253) = {4110,4213};
+Line(254) = {4213,4210};
+Line(255) = {4210,4217};
+Line(256) = {4217,4006};
+Line(257) = {4006,4218};
+Line(258) = {4218,4211};
+Line(259) = {4211,4212};
+Line(260) = {4212,4111};
+Line(261) = {4111,4112};
+Line(262) = {4112,4056};
+Line(263) = {4056,4057};
+Line(264) = {4057,4060};
+Line(265) = {4060,4148};
+Line(266) = {4148,4150};
+Line(267) = {4150,4208};
+Line(268) = {4208,4209};
+Line(269) = {4209,4215};
+Line(270) = {4215,4216};
+Line(271) = {4216,4220};
+Line(272) = {4220,4012};
+Line(273) = {4012,4013};
+Line(274) = {4013,4014};
+Line(275) = {4014,4017};
+Line(276) = {4017,4021};
+Line(277) = {4021,4023};
+Line(278) = {4023,4117};
+Line(279) = {4117,4082};
+Line(280) = {4082,4083};
+Line(281) = {4083,4024};
+Line(282) = {4024,4025};
+Line(283) = {4025,4007};
+Line(284) = {4007,4026};
+Line(285) = {4026,4027};
+Line(286) = {4027,4028};
+Line(287) = {4028,4029};
+Line(288) = {4029,4008};
+Line(289) = {4008,4030};
+Line(290) = {4030,4084};
+Line(291) = {4084,4194};
+Line(292) = {4194,4195};
+Line(293) = {4195,4154};
+Line(294) = {4154,4155};
+Line(295) = {4155,4119};
+Line(296) = {4119,4120};
+Line(297) = {4120,4089};
+Line(298) = {4089,4090};
+Line(299) = {4090,4034};
+Line(300) = {4034,4035};
+Line(301) = {4035,4036};
+Line(302) = {4036,4144};
+Line(303) = {4144,4192};
+Line(304) = {4192,4193};
+Line(305) = {4193,4184};
+Line(306) = {4184,4185};
+Line(307) = {4185,4168};
+Line(308) = {4168,4169};
+Line(309) = {4169,4135};
+Line(310) = {4135,4136};
+Line(311) = {4136,4101};
+Line(312) = {4101,4102};
+Line(313) = {4102,4049};
+Line(314) = {4049,4050};
+Line(315) = {4050,4051};
+Line(316) = {4051,4103};
+Line(317) = {4103,4104};
+Line(318) = {4104,4137};
+Line(319) = {4137,4138};
+Line(320) = {4138,4170};
+Line(321) = {4170,4171};
+Line(322) = {4171,4186};
+Line(323) = {4186,4172};
+Line(324) = {4172,4173};
+Line(325) = {4173,4139};
+Line(326) = {4139,4140};
+Line(327) = {4140,4105};
+Line(328) = {4105,4106};
+Line(329) = {4106,4052};
+Line(330) = {4052,4053};
+Line(331) = {4053,4054};
+Line(332) = {4054,4107};
+Line(333) = {4107,4108};
+Line(334) = {4108,4141};
+Line(335) = {4141,4142};
+Line(336) = {4142,4174};
+Line(337) = {4174,4175};
+Line(338) = {4175,4187};
+Line(339) = {4187,4188};
+Line(340) = {4188,4145};
+Line(341) = {4145,4046};
+Line(342) = {4046,4047};
+Line(343) = {4047,4048};
+Line(344) = {4048,4196};
+Line(345) = {4196,4197};
+Line(346) = {4197,4198};
+Line(347) = {4198,4189};
+Line(348) = {4189,4190};
+Line(349) = {4190,4214};
+Line(350) = {4214,4181};
+Line(351) = {4181,4182};
+Line(352) = {4182,4151};
+Line(353) = {4151,4152};
+Line(354) = {4152,4064};
+Line(355) = {4064,4065};
+Line(356) = {4065,4066};
+Line(357) = {4066,4205};
+Line(358) = {4205,4206};
+Line(359) = {4206,4207};
+Line(360) = {4207,4072};
+Line(361) = {4072,4074};
+Line(362) = {4074,4073};
+Line(363) = {4073,4076};
+Line(364) = {4076,4075};
+Line(365) = {4075,4079};
+Line(366) = {4079,4078};
+Line(367) = {4078,4077};
+Line(368) = {4077,4068};
+Line(369) = {4068,4067};
+Line(370) = {4067,4069};
+Line(371) = {4069,4070};
+Line(372) = {4070,4071};
+Line(373) = {4071,4115};
+Line(374) = {4115,4116};
+Line(375) = {4116,4204};
+Line(376) = {4204,4063};
+Line(377) = {11,2233};
+Line(378) = {2233,5};
+Line(379) = {5,2236};
+Line(380) = {2236,14};
+Line(381) = {14,2};
+Line(382) = {2,15};
+Line(383) = {15,2301};
+Line(384) = {2301,6};
+Line(385) = {6,2304};
+Line(386) = {2304,18};
+Line(387) = {18,3};
+Line(388) = {3,19};
+Line(389) = {19,2240};
+Line(390) = {2240,7};
+Line(391) = {7,2243};
+Line(392) = {2243,22};
+Line(393) = {22,4};
+Line(394) = {4,23};
+Line(395) = {23,2317};
+Line(396) = {2317,8};
+Line(397) = {8,2297};
+Line(398) = {2297,10};
+Line(399) = {10,1};
+Line(400) = {1,11};
+Line(401) = {4298,4297};
+Line(402) = {4297,4222};
+Line(403) = {4222,4250};
+Line(404) = {4250,4252};
+Line(405) = {4252,4221};
+Line(406) = {4221,4251};
+Line(407) = {4251,4299};
+Line(408) = {4299,4335};
+Line(409) = {4335,4337};
+Line(410) = {4337,4267};
+Line(411) = {4267,4294};
+Line(412) = {4294,4269};
+Line(413) = {4269,4233};
+Line(414) = {4233,4234};
+Line(415) = {4234,4273};
+Line(416) = {4273,4293};
+Line(417) = {4293,4314};
+Line(418) = {4314,4317};
+Line(419) = {4317,4318};
+Line(420) = {4318,4274};
+Line(421) = {4274,4235};
+Line(422) = {4235,4236};
+Line(423) = {4236,4237};
+Line(424) = {4237,4301};
+Line(425) = {4301,4319};
+Line(426) = {4319,4321};
+Line(427) = {4321,4320};
+Line(428) = {4320,4322};
+Line(429) = {4322,4347};
+Line(430) = {4347,4323};
+Line(431) = {4323,4324};
+Line(432) = {4324,4325};
+Line(433) = {4325,4276};
+Line(434) = {4276,4238};
+Line(435) = {4238,4240};
+Line(436) = {4240,4239};
+Line(437) = {4239,4241};
+Line(438) = {4241,4277};
+Line(439) = {4277,4326};
+Line(440) = {4326,4327};
+Line(441) = {4327,4328};
+Line(442) = {4328,4350};
+Line(443) = {4350,4348};
+Line(444) = {4348,4349};
+Line(445) = {4349,4332};
+Line(446) = {4332,4333};
+Line(447) = {4333,4334};
+Line(448) = {4334,4278};
+Line(449) = {4278,4247};
+Line(450) = {4247,4248};
+Line(451) = {4248,4249};
+Line(452) = {4249,4282};
+Line(453) = {4282,4283};
+Line(454) = {4283,4341};
+Line(455) = {4341,4342};
+Line(456) = {4342,4343};
+Line(457) = {4343,4289};
+Line(458) = {4289,4290};
+Line(459) = {4290,4286};
+Line(460) = {4286,4255};
+Line(461) = {4255,4257};
+Line(462) = {4257,4256};
+Line(463) = {4256,4346};
+Line(464) = {4346,4288};
+Line(465) = {4288,4287};
+Line(466) = {4287,4260};
+Line(467) = {4260,4259};
+Line(468) = {4259,4258};
+Line(469) = {4258,4262};
+Line(470) = {4262,4261};
+Line(471) = {4261,4264};
+Line(472) = {4264,4263};
+Line(473) = {4263,4265};
+Line(474) = {4265,4266};
+Line(475) = {4266,4303};
+Line(476) = {4303,4302};
+Line(477) = {4302,4304};
+Line(478) = {4304,4305};
+Line(479) = {4305,4306};
+Line(480) = {4306,4307};
+Line(481) = {4307,4308};
+Line(482) = {4308,4309};
+Line(483) = {4309,4345};
+Line(484) = {4345,4344};
+Line(485) = {4344,4254};
+Line(486) = {4254,4253};
+Line(487) = {4253,4285};
+Line(488) = {4285,4284};
+Line(489) = {4284,4340};
+Line(490) = {4340,4339};
+Line(491) = {4339,4338};
+Line(492) = {4338,4246};
+Line(493) = {4246,4245};
+Line(494) = {4245,4281};
+Line(495) = {4281,4280};
+Line(496) = {4280,4279};
+Line(497) = {4279,4244};
+Line(498) = {4244,4243};
+Line(499) = {4243,4242};
+Line(500) = {4242,4296};
+Line(501) = {4296,4295};
+Line(502) = {4295,4300};
+Line(503) = {4300,4330};
+Line(504) = {4330,4331};
+Line(505) = {4331,4329};
+Line(506) = {4329,4232};
+Line(507) = {4232,4231};
+Line(508) = {4231,4230};
+Line(509) = {4230,4229};
+Line(510) = {4229,4228};
+Line(511) = {4228,4227};
+Line(512) = {4227,4225};
+Line(513) = {4225,4226};
+Line(514) = {4226,4312};
+Line(515) = {4312,4223};
+Line(516) = {4223,4224};
+Line(517) = {4224,4311};
+Line(518) = {4311,4310};
+Line(519) = {4310,4275};
+Line(520) = {4275,4316};
+Line(521) = {4316,4315};
+Line(522) = {4315,4313};
+Line(523) = {4313,4292};
+Line(524) = {4292,4272};
+Line(525) = {4272,4271};
+Line(526) = {4271,4270};
+Line(527) = {4270,4268};
+Line(528) = {4268,4291};
+Line(529) = {4291,4336};
+Line(530) = {4336,4298};
+Line Loop(531) = {384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383};
+Line Loop(532) = {316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315};
+Line Loop(533) = {446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445};
+Line Loop(534) = {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40};
+Plane Surface(535) = {531,532,534,533};
diff --git a/examples/dd.geo b/examples/dd.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0a851e9c512a96b75f3c7bbacb01295189ff146f
--- /dev/null
+++ b/examples/dd.geo
@@ -0,0 +1,1080 @@
+lcext = 6. ;
+
+Point(3895) = {1.177410e-02,-2.768003e-03,0,1.e-3};
+Point(3897) = {1.081196e-02,-3.794565e-03,0,1.e-3};
+Point(3896) = {1.040081e-02,-4.225326e-03,0,1.e-3};
+Point(3968) = {9.501183e-03,-5.167856e-03,0,1.e-3};
+Point(3995) = {8.172335e-03,-6.541147e-03,0,1.e-3};
+Point(4003) = {6.820756e-03,-7.914438e-03,0,1.e-3};
+Point(3857) = {5.454371e-03,-9.287729e-03,0,1.e-3};
+Point(3856) = {3.534352e-03,-1.119762e-02,0,1.e-3};
+Point(3860) = {7.877699e-04,-1.389559e-02,0,1.e-3};
+Point(3861) = {-1.958812e-03,-1.658843e-02,0,1.e-3};
+Point(3863) = {-4.705394e-03,-1.930092e-02,0,1.e-3};
+Point(3864) = {-7.451976e-03,-2.206110e-02,0,1.e-3};
+Point(3865) = {-1.019856e-02,-2.490134e-02,0,1.e-3};
+Point(3866) = {-1.294514e-02,-2.785668e-02,0,1.e-3};
+Point(3867) = {-1.569172e-02,-3.097311e-02,0,1.e-3};
+Point(3868) = {-1.819787e-02,-3.400697e-02,0,1.e-3};
+Point(3869) = {-1.843830e-02,-3.430929e-02,0,1.e-3};
+Point(3870) = {-2.032098e-02,-3.675355e-02,0,1.e-3};
+Point(3871) = {-2.233602e-02,-3.950013e-02,0,1.e-3};
+Point(3872) = {-2.428062e-02,-4.224671e-02,0,1.e-3};
+Point(3977) = {-2.615522e-02,-4.499330e-02,0,1.e-3};
+Point(3877) = {-2.795526e-02,-4.773988e-02,0,1.e-3};
+Point(3876) = {-2.966457e-02,-5.048646e-02,0,1.e-3};
+Point(3878) = {-3.128951e-02,-5.323304e-02,0,1.e-3};
+Point(3934) = {-3.282722e-02,-5.597962e-02,0,1.e-3};
+Point(3873) = {-3.427526e-02,-5.872621e-02,0,1.e-3};
+Point(3874) = {-3.563187e-02,-6.147279e-02,0,1.e-3};
+Point(3875) = {-3.689577e-02,-6.421937e-02,0,1.e-3};
+Point(3935) = {-3.803475e-02,-6.696595e-02,0,1.e-3};
+Point(3880) = {-3.906585e-02,-6.971253e-02,0,1.e-3};
+Point(3879) = {-3.999980e-02,-7.245912e-02,0,1.e-3};
+Point(3881) = {-4.084348e-02,-7.520570e-02,0,1.e-3};
+Point(3936) = {-4.159737e-02,-7.795228e-02,0,1.e-3};
+Point(3882) = {-4.219350e-02,-8.069886e-02,0,1.e-3};
+Point(3883) = {-4.268262e-02,-8.344544e-02,0,1.e-3};
+Point(3885) = {-4.302180e-02,-8.619203e-02,0,1.e-3};
+Point(3884) = {-4.315754e-02,-8.815942e-02,0,1.e-3};
+Point(1218) = {-4.315754e-02,-8.893861e-02,0,1.e-3};
+Point(3933) = {-4.315754e-02,-8.955185e-02,0,1.e-3};
+Point(3996) = {-4.314894e-02,-9.031190e-02,0,1.e-3};
+Point(3989) = {-4.310538e-02,-9.168519e-02,0,1.e-3};
+Point(3990) = {-4.298693e-02,-9.305848e-02,0,1.e-3};
+Point(3978) = {-4.281442e-02,-9.443177e-02,0,1.e-3};
+Point(3979) = {-4.254831e-02,-9.580506e-02,0,1.e-3};
+Point(3974) = {-4.215142e-02,-9.717835e-02,0,1.e-3};
+Point(3973) = {-4.166490e-02,-9.855164e-02,0,1.e-3};
+Point(3963) = {-4.107412e-02,-9.992494e-02,0,1.e-3};
+Point(3947) = {-4.041096e-02,-1.011964e-01,0,1.e-3};
+Point(3948) = {-4.035707e-02,-1.012982e-01,0,1.e-3};
+Point(3904) = {-3.903767e-02,-1.033356e-01,0,1.e-3};
+Point(3903) = {-3.766438e-02,-1.048133e-01,0,1.e-3};
+Point(3946) = {-3.629109e-02,-1.058804e-01,0,1.e-3};
+Point(3902) = {-3.491780e-02,-1.066897e-01,0,1.e-3};
+Point(3901) = {-3.354451e-02,-1.073184e-01,0,1.e-3};
+Point(3900) = {-3.217121e-02,-1.078168e-01,0,1.e-3};
+Point(3908) = {-3.079792e-02,-1.081973e-01,0,1.e-3};
+Point(3907) = {-2.942463e-02,-1.084688e-01,0,1.e-3};
+Point(3951) = {-2.805134e-02,-1.086029e-01,0,1.e-3};
+Point(3950) = {-2.667805e-02,-1.086423e-01,0,1.e-3};
+Point(3847) = {-2.580700e-02,-1.086440e-01,0,1.e-3};
+Point(3949) = {-2.667805e-02,-1.088853e-01,0,1.e-3};
+Point(3952) = {-2.805134e-02,-1.092658e-01,0,1.e-3};
+Point(3905) = {-2.942463e-02,-1.096463e-01,0,1.e-3};
+Point(3906) = {-3.079792e-02,-1.100268e-01,0,1.e-3};
+Point(3909) = {-3.217121e-02,-1.104020e-01,0,1.e-3};
+Point(3969) = {-3.354451e-02,-1.107749e-01,0,1.e-3};
+Point(3970) = {-3.491780e-02,-1.111477e-01,0,1.e-3};
+Point(3997) = {-3.629109e-02,-1.115205e-01,0,1.e-3};
+Point(3998) = {-3.766438e-02,-1.118690e-01,0,1.e-3};
+Point(4004) = {-3.903767e-02,-1.122095e-01,0,1.e-3};
+Point(3959) = {-4.041096e-02,-1.125499e-01,0,1.e-3};
+Point(3960) = {-4.315754e-02,-1.131897e-01,0,1.e-3};
+Point(3972) = {-4.590412e-02,-1.137699e-01,0,1.e-3};
+Point(3984) = {-4.865071e-02,-1.143079e-01,0,1.e-3};
+Point(3988) = {-5.139729e-02,-1.147970e-01,0,1.e-3};
+Point(3961) = {-5.414387e-02,-1.152035e-01,0,1.e-3};
+Point(3962) = {-5.689045e-02,-1.155501e-01,0,1.e-3};
+Point(3937) = {-5.963703e-02,-1.157358e-01,0,1.e-3};
+Point(3938) = {-6.238362e-02,-1.158519e-01,0,1.e-3};
+Point(3886) = {-6.513020e-02,-1.158332e-01,0,1.e-3};
+Point(3887) = {-6.787678e-02,-1.156607e-01,0,1.e-3};
+Point(3888) = {-7.062336e-02,-1.152790e-01,0,1.e-3};
+Point(3993) = {-7.199665e-02,-1.150098e-01,0,1.e-3};
+Point(3994) = {-7.336994e-02,-1.146075e-01,0,1.e-3};
+Point(3971) = {-7.474324e-02,-1.141776e-01,0,1.e-3};
+Point(3918) = {-7.611653e-02,-1.135965e-01,0,1.e-3};
+Point(3919) = {-7.748982e-02,-1.129165e-01,0,1.e-3};
+Point(3920) = {-7.886311e-02,-1.121014e-01,0,1.e-3};
+Point(3956) = {-8.023640e-02,-1.111186e-01,0,1.e-3};
+Point(3955) = {-8.047561e-02,-1.109113e-01,0,1.e-3};
+Point(3965) = {-8.160969e-02,-1.098434e-01,0,1.e-3};
+Point(3966) = {-8.189452e-02,-1.095380e-01,0,1.e-3};
+Point(3910) = {-8.297356e-02,-1.081647e-01,0,1.e-3};
+Point(3913) = {-8.376570e-02,-1.067914e-01,0,1.e-3};
+Point(3912) = {-8.435627e-02,-1.054263e-01,0,1.e-3};
+Point(3911) = {-8.435982e-02,-1.054181e-01,0,1.e-3};
+Point(3914) = {-8.478803e-02,-1.040448e-01,0,1.e-3};
+Point(3915) = {-8.503641e-02,-1.026715e-01,0,1.e-3};
+Point(3916) = {-8.516945e-02,-1.012982e-01,0,1.e-3};
+Point(3917) = {-8.522183e-02,-9.992494e-02,0,1.e-3};
+Point(3953) = {-8.512327e-02,-9.855164e-02,0,1.e-3};
+Point(3954) = {-8.495463e-02,-9.717835e-02,0,1.e-3};
+Point(3964) = {-8.467545e-02,-9.580506e-02,0,1.e-3};
+Point(3975) = {-8.433113e-02,-9.443177e-02,0,1.e-3};
+Point(3992) = {-8.387660e-02,-9.305848e-02,0,1.e-3};
+Point(3991) = {-8.341194e-02,-9.168519e-02,0,1.e-3};
+Point(3999) = {-8.280629e-02,-9.031190e-02,0,1.e-3};
+Point(3939) = {-8.220063e-02,-8.893861e-02,0,1.e-3};
+Point(3967) = {-8.076693e-02,-8.619203e-02,0,1.e-3};
+Point(3987) = {-7.916546e-02,-8.344544e-02,0,1.e-3};
+Point(3985) = {-7.886311e-02,-8.298081e-02,0,1.e-3};
+Point(3986) = {-7.737820e-02,-8.069886e-02,0,1.e-3};
+Point(4002) = {-7.542111e-02,-7.795228e-02,0,1.e-3};
+Point(3922) = {-7.335979e-02,-7.520570e-02,0,1.e-3};
+Point(4005) = {-7.112105e-02,-7.245912e-02,0,1.e-3};
+Point(3851) = {-6.873828e-02,-6.971253e-02,0,1.e-3};
+Point(3850) = {-6.372231e-02,-6.421937e-02,0,1.e-3};
+Point(3853) = {-5.963703e-02,-6.001430e-02,0,1.e-3};
+Point(3852) = {-5.414387e-02,-5.469298e-02,0,1.e-3};
+Point(3849) = {-4.865071e-02,-4.961204e-02,0,1.e-3};
+Point(3848) = {-4.315754e-02,-4.465740e-02,0,1.e-3};
+Point(3921) = {-3.766438e-02,-3.985542e-02,0,1.e-3};
+Point(3983) = {-3.491780e-02,-3.750843e-02,0,1.e-3};
+Point(3982) = {-3.217121e-02,-3.519259e-02,0,1.e-3};
+Point(3976) = {-2.942463e-02,-3.289435e-02,0,1.e-3};
+Point(3929) = {-2.744807e-02,-3.126039e-02,0,1.e-3};
+Point(3958) = {-2.667805e-02,-3.062383e-02,0,1.e-3};
+Point(3928) = {-2.411032e-02,-2.851380e-02,0,1.e-3};
+Point(3957) = {-2.393147e-02,-2.836765e-02,0,1.e-3};
+Point(3927) = {-2.118489e-02,-2.612321e-02,0,1.e-3};
+Point(3926) = {-1.843830e-02,-2.390843e-02,0,1.e-3};
+Point(3925) = {-1.569172e-02,-2.170681e-02,0,1.e-3};
+Point(3924) = {-1.294514e-02,-1.952576e-02,0,1.e-3};
+Point(3932) = {-1.040573e-02,-1.752748e-02,0,1.e-3};
+Point(3931) = {-1.019856e-02,-1.736495e-02,0,1.e-3};
+Point(3930) = {-7.451976e-03,-1.521330e-02,0,1.e-3};
+Point(3923) = {-4.705394e-03,-1.307794e-02,0,1.e-3};
+Point(3862) = {-1.958812e-03,-1.095092e-02,0,1.e-3};
+Point(3859) = {1.960946e-04,-9.287729e-03,0,1.e-3};
+Point(3858) = {7.877699e-04,-8.831063e-03,0,1.e-3};
+Point(3855) = {3.534352e-03,-6.728705e-03,0,1.e-3};
+Point(3854) = {6.280934e-03,-4.633175e-03,0,1.e-3};
+Point(3945) = {7.386845e-03,-3.794565e-03,0,1.e-3};
+Point(3944) = {7.654225e-03,-3.591811e-03,0,1.e-3};
+Point(3899) = {9.027516e-03,-2.550448e-03,0,1.e-3};
+Point(3898) = {1.040081e-02,-1.509310e-03,0,1.e-3};
+Point(3894) = {1.177410e-02,-4.686545e-04,0,1.e-3};
+Point(3890) = {1.282184e-02,3.253082e-04,0,1.e-3};
+Point(3893) = {1.314739e-02,5.720012e-04,0,1.e-3};
+Point(3941) = {1.463351e-02,1.698599e-03,0,1.e-3};
+Point(4000) = {1.644012e-02,3.071890e-03,0,1.e-3};
+Point(3980) = {1.824674e-02,4.445181e-03,0,1.e-3};
+Point(3846) = {1.892400e-02,4.960000e-03,0,1.e-3};
+Point(3981) = {1.843389e-02,4.445181e-03,0,1.e-3};
+Point(4001) = {1.712649e-02,3.071890e-03,0,1.e-3};
+Point(3942) = {1.584524e-02,1.698599e-03,0,1.e-3};
+Point(3940) = {1.460138e-02,3.253082e-04,0,1.e-3};
+Point(3889) = {1.452068e-02,2.362167e-04,0,1.e-3};
+Point(3892) = {1.335131e-02,-1.047983e-03,0,1.e-3};
+Point(3891) = {1.314739e-02,-1.270371e-03,0,1.e-3};
+Point(3943) = {1.209204e-02,-2.421274e-03,0,1.e-3};
+Point(4063) = {4.498368e-02,-9.287729e-03,0,1.e-3};
+Point(4062) = {4.610574e-02,-6.541147e-03,0,1.e-3};
+Point(4061) = {4.755089e-02,-3.794565e-03,0,1.e-3};
+Point(4114) = {4.934166e-02,-1.047983e-03,0,1.e-3};
+Point(4153) = {5.143154e-02,1.698599e-03,0,1.e-3};
+Point(4178) = {5.390637e-02,4.445181e-03,0,1.e-3};
+Point(4179) = {5.571941e-02,6.252892e-03,0,1.e-3};
+Point(4191) = {5.846599e-02,8.699713e-03,0,1.e-3};
+Point(4203) = {6.121257e-02,1.103796e-02,0,1.e-3};
+Point(4109) = {6.350284e-02,1.268493e-02,0,1.e-3};
+Point(4202) = {6.670574e-02,1.498818e-02,0,1.e-3};
+Point(4199) = {7.170787e-02,1.817809e-02,0,1.e-3};
+Point(4201) = {7.219890e-02,1.846566e-02,0,1.e-3};
+Point(4200) = {7.769207e-02,2.168274e-02,0,1.e-3};
+Point(4100) = {8.318523e-02,2.447113e-02,0,1.e-3};
+Point(4099) = {9.417156e-02,2.953992e-02,0,1.e-3};
+Point(4045) = {1.051579e-01,3.374477e-02,0,1.e-3};
+Point(4044) = {1.161442e-01,3.745387e-02,0,1.e-3};
+Point(4043) = {1.271305e-01,4.084705e-02,0,1.e-3};
+Point(4147) = {1.381169e-01,4.362166e-02,0,1.e-3};
+Point(4146) = {1.491032e-01,4.590535e-02,0,1.e-3};
+Point(4180) = {1.600895e-01,4.775547e-02,0,1.e-3};
+Point(4167) = {1.710759e-01,4.909090e-02,0,1.e-3};
+Point(4166) = {1.820622e-01,5.028654e-02,0,1.e-3};
+Point(4134) = {1.930485e-01,5.118303e-02,0,1.e-3};
+Point(4133) = {2.040348e-01,5.209637e-02,0,1.e-3};
+Point(4098) = {2.150212e-01,5.304431e-02,0,1.e-3};
+Point(4097) = {2.260075e-01,5.389186e-02,0,1.e-3};
+Point(4042) = {2.369938e-01,5.466596e-02,0,1.e-3};
+Point(4041) = {2.479802e-01,5.535583e-02,0,1.e-3};
+Point(4040) = {2.589665e-01,5.602171e-02,0,1.e-3};
+Point(4095) = {2.699528e-01,5.660820e-02,0,1.e-3};
+Point(4096) = {2.809391e-01,5.717080e-02,0,1.e-3};
+Point(4132) = {2.919255e-01,5.768210e-02,0,1.e-3};
+Point(4131) = {3.029118e-01,5.816077e-02,0,1.e-3};
+Point(4165) = {3.138981e-01,5.861410e-02,0,1.e-3};
+Point(4164) = {3.248844e-01,5.902748e-02,0,1.e-3};
+Point(4163) = {3.358708e-01,5.942876e-02,0,1.e-3};
+Point(4130) = {3.468571e-01,5.978313e-02,0,1.e-3};
+Point(4129) = {3.578434e-01,6.012088e-02,0,1.e-3};
+Point(4094) = {3.688298e-01,6.041918e-02,0,1.e-3};
+Point(4093) = {3.798161e-01,6.068571e-02,0,1.e-3};
+Point(4039) = {3.908024e-01,6.092523e-02,0,1.e-3};
+Point(4038) = {4.017887e-01,6.111444e-02,0,1.e-3};
+Point(4037) = {4.127751e-01,6.128792e-02,0,1.e-3};
+Point(4092) = {4.237614e-01,6.139510e-02,0,1.e-3};
+Point(4091) = {4.347477e-01,6.148330e-02,0,1.e-3};
+Point(4128) = {4.457341e-01,6.152051e-02,0,1.e-3};
+Point(4127) = {4.567204e-01,6.152534e-02,0,1.e-3};
+Point(4162) = {4.677067e-01,6.149964e-02,0,1.e-3};
+Point(4161) = {4.786930e-01,6.143130e-02,0,1.e-3};
+Point(4183) = {4.896794e-01,6.134928e-02,0,1.e-3};
+Point(4160) = {5.006657e-01,6.120560e-02,0,1.e-3};
+Point(4159) = {5.116520e-01,6.104561e-02,0,1.e-3};
+Point(4126) = {5.226384e-01,6.083535e-02,0,1.e-3};
+Point(4125) = {5.336247e-01,6.058889e-02,0,1.e-3};
+Point(4088) = {5.446110e-01,6.030455e-02,0,1.e-3};
+Point(4087) = {5.555973e-01,5.996460e-02,0,1.e-3};
+Point(4033) = {5.665837e-01,5.960434e-02,0,1.e-3};
+Point(4032) = {5.775700e-01,5.915575e-02,0,1.e-3};
+Point(4031) = {5.885563e-01,5.867545e-02,0,1.e-3};
+Point(4086) = {5.995427e-01,5.809113e-02,0,1.e-3};
+Point(4085) = {6.105290e-01,5.746759e-02,0,1.e-3};
+Point(4124) = {6.215153e-01,5.679937e-02,0,1.e-3};
+Point(4123) = {6.325016e-01,5.616104e-02,0,1.e-3};
+Point(4158) = {6.434880e-01,5.553466e-02,0,1.e-3};
+Point(4157) = {6.544743e-01,5.490460e-02,0,1.e-3};
+Point(4156) = {6.654606e-01,5.425221e-02,0,1.e-3};
+Point(4122) = {6.764469e-01,5.351456e-02,0,1.e-3};
+Point(4121) = {6.874333e-01,5.273401e-02,0,1.e-3};
+Point(4081) = {6.984196e-01,5.190181e-02,0,1.e-3};
+Point(4080) = {7.094059e-01,5.101347e-02,0,1.e-3};
+Point(4020) = {7.203923e-01,5.010133e-02,0,1.e-3};
+Point(4019) = {7.313786e-01,4.909498e-02,0,1.e-3};
+Point(4018) = {7.423649e-01,4.806316e-02,0,1.e-3};
+Point(4143) = {7.533512e-01,4.694984e-02,0,1.e-3};
+Point(4118) = {7.643376e-01,4.579371e-02,0,1.e-3};
+Point(4022) = {7.753239e-01,4.458624e-02,0,1.e-3};
+Point(4016) = {7.863102e-01,4.330843e-02,0,1.e-3};
+Point(4015) = {7.972966e-01,4.200167e-02,0,1.e-3};
+Point(4011) = {8.082829e-01,4.058146e-02,0,1.e-3};
+Point(4010) = {8.192692e-01,3.912968e-02,0,1.e-3};
+Point(4009) = {8.302555e-01,3.758209e-02,0,1.e-3};
+Point(4219) = {8.357487e-01,3.680830e-02,0,1.e-3};
+Point(4177) = {8.412419e-01,3.598390e-02,0,1.e-3};
+Point(4176) = {8.467350e-01,3.515767e-02,0,1.e-3};
+Point(4149) = {8.494816e-01,3.474456e-02,0,1.e-3};
+Point(4059) = {8.522282e-01,3.433145e-02,0,1.e-3};
+Point(4058) = {8.549748e-01,3.391833e-02,0,1.e-3};
+Point(4055) = {8.577214e-01,3.349214e-02,0,1.e-3};
+Point(4113) = {8.604679e-01,3.306571e-02,0,1.e-3};
+Point(4110) = {8.632145e-01,3.263928e-02,0,1.e-3};
+Point(4213) = {8.659611e-01,3.221285e-02,0,1.e-3};
+Point(4210) = {8.687077e-01,3.178643e-02,0,1.e-3};
+Point(4217) = {8.714543e-01,3.136000e-02,0,1.e-3};
+Point(4006) = {8.740950e-01,3.095000e-02,0,1.e-3};
+Point(4218) = {8.714543e-01,3.095677e-02,0,1.e-3};
+Point(4211) = {8.687077e-01,3.096380e-02,0,1.e-3};
+Point(4212) = {8.659611e-01,3.097084e-02,0,1.e-3};
+Point(4111) = {8.632145e-01,3.097787e-02,0,1.e-3};
+Point(4112) = {8.604679e-01,3.098491e-02,0,1.e-3};
+Point(4056) = {8.577214e-01,3.099195e-02,0,1.e-3};
+Point(4057) = {8.549748e-01,3.099898e-02,0,1.e-3};
+Point(4060) = {8.522282e-01,3.100602e-02,0,1.e-3};
+Point(4148) = {8.494816e-01,3.101305e-02,0,1.e-3};
+Point(4150) = {8.467350e-01,3.102009e-02,0,1.e-3};
+Point(4208) = {8.439885e-01,3.102712e-02,0,1.e-3};
+Point(4209) = {8.412419e-01,3.103416e-02,0,1.e-3};
+Point(4215) = {8.357487e-01,3.104823e-02,0,1.e-3};
+Point(4216) = {8.302555e-01,3.106230e-02,0,1.e-3};
+Point(4220) = {8.247624e-01,3.107638e-02,0,1.e-3};
+Point(4012) = {8.192692e-01,3.109045e-02,0,1.e-3};
+Point(4013) = {8.082829e-01,3.111859e-02,0,1.e-3};
+Point(4014) = {7.972966e-01,3.114674e-02,0,1.e-3};
+Point(4017) = {7.863102e-01,3.117488e-02,0,1.e-3};
+Point(4021) = {7.753239e-01,3.120302e-02,0,1.e-3};
+Point(4023) = {7.643376e-01,3.123117e-02,0,1.e-3};
+Point(4117) = {7.533512e-01,3.125931e-02,0,1.e-3};
+Point(4082) = {7.423649e-01,3.128745e-02,0,1.e-3};
+Point(4083) = {7.313786e-01,3.131560e-02,0,1.e-3};
+Point(4024) = {7.203923e-01,3.134374e-02,0,1.e-3};
+Point(4025) = {7.094059e-01,3.137188e-02,0,1.e-3};
+Point(4007) = {6.999910e-01,3.139600e-02,0,1.e-3};
+Point(4026) = {6.999910e-01,2.367126e-02,0,1.e-3};
+Point(4027) = {6.999910e-01,1.268493e-02,0,1.e-3};
+Point(4028) = {6.999910e-01,1.698599e-03,0,1.e-3};
+Point(4029) = {6.999910e-01,-9.287729e-03,0,1.e-3};
+Point(4008) = {6.999910e-01,-1.722400e-02,0,1.e-3};
+Point(4030) = {6.984196e-01,-1.751626e-02,0,1.e-3};
+Point(4084) = {6.874333e-01,-1.955960e-02,0,1.e-3};
+Point(4194) = {6.764469e-01,-2.159776e-02,0,1.e-3};
+Point(4195) = {6.654606e-01,-2.362865e-02,0,1.e-3};
+Point(4154) = {6.544743e-01,-2.588904e-02,0,1.e-3};
+Point(4155) = {6.434880e-01,-2.825320e-02,0,1.e-3};
+Point(4119) = {6.325016e-01,-3.016078e-02,0,1.e-3};
+Point(4120) = {6.215153e-01,-3.200586e-02,0,1.e-3};
+Point(4089) = {6.105290e-01,-3.369569e-02,0,1.e-3};
+Point(4090) = {5.995427e-01,-3.534073e-02,0,1.e-3};
+Point(4034) = {5.885563e-01,-3.694183e-02,0,1.e-3};
+Point(4035) = {5.775700e-01,-3.852074e-02,0,1.e-3};
+Point(4036) = {5.665837e-01,-4.009157e-02,0,1.e-3};
+Point(4144) = {5.555973e-01,-4.161619e-02,0,1.e-3};
+Point(4192) = {5.446110e-01,-4.311363e-02,0,1.e-3};
+Point(4193) = {5.336247e-01,-4.454372e-02,0,1.e-3};
+Point(4184) = {5.226384e-01,-4.589904e-02,0,1.e-3};
+Point(4185) = {5.116520e-01,-4.719211e-02,0,1.e-3};
+Point(4168) = {5.006657e-01,-4.834107e-02,0,1.e-3};
+Point(4169) = {4.896794e-01,-4.944199e-02,0,1.e-3};
+Point(4135) = {4.786930e-01,-5.032590e-02,0,1.e-3};
+Point(4136) = {4.677067e-01,-5.113121e-02,0,1.e-3};
+Point(4101) = {4.567204e-01,-5.175527e-02,0,1.e-3};
+Point(4102) = {4.457341e-01,-5.227269e-02,0,1.e-3};
+Point(4049) = {4.347477e-01,-5.270239e-02,0,1.e-3};
+Point(4050) = {4.237614e-01,-5.305741e-02,0,1.e-3};
+Point(4051) = {4.127751e-01,-5.339040e-02,0,1.e-3};
+Point(4103) = {4.017887e-01,-5.365720e-02,0,1.e-3};
+Point(4104) = {3.908024e-01,-5.390137e-02,0,1.e-3};
+Point(4137) = {3.798161e-01,-5.408775e-02,0,1.e-3};
+Point(4138) = {3.688298e-01,-5.423035e-02,0,1.e-3};
+Point(4170) = {3.578434e-01,-5.433335e-02,0,1.e-3};
+Point(4171) = {3.468571e-01,-5.436941e-02,0,1.e-3};
+Point(4186) = {3.358708e-01,-5.438425e-02,0,1.e-3};
+Point(4172) = {3.248844e-01,-5.431051e-02,0,1.e-3};
+Point(4173) = {3.138981e-01,-5.421116e-02,0,1.e-3};
+Point(4139) = {3.029118e-01,-5.403703e-02,0,1.e-3};
+Point(4140) = {2.919255e-01,-5.379680e-02,0,1.e-3};
+Point(4105) = {2.809391e-01,-5.349015e-02,0,1.e-3};
+Point(4106) = {2.699528e-01,-5.307623e-02,0,1.e-3};
+Point(4052) = {2.589665e-01,-5.262516e-02,0,1.e-3};
+Point(4053) = {2.479802e-01,-5.205332e-02,0,1.e-3};
+Point(4054) = {2.369938e-01,-5.145659e-02,0,1.e-3};
+Point(4107) = {2.260075e-01,-5.078306e-02,0,1.e-3};
+Point(4108) = {2.150212e-01,-5.007146e-02,0,1.e-3};
+Point(4141) = {2.040348e-01,-4.931867e-02,0,1.e-3};
+Point(4142) = {1.930485e-01,-4.849150e-02,0,1.e-3};
+Point(4174) = {1.820622e-01,-4.763665e-02,0,1.e-3};
+Point(4175) = {1.710759e-01,-4.665625e-02,0,1.e-3};
+Point(4187) = {1.600895e-01,-4.564614e-02,0,1.e-3};
+Point(4188) = {1.491032e-01,-4.455428e-02,0,1.e-3};
+Point(4145) = {1.381169e-01,-4.339482e-02,0,1.e-3};
+Point(4046) = {1.271305e-01,-4.218155e-02,0,1.e-3};
+Point(4047) = {1.161442e-01,-4.082776e-02,0,1.e-3};
+Point(4048) = {1.051579e-01,-3.939290e-02,0,1.e-3};
+Point(4196) = {9.966472e-02,-3.862964e-02,0,1.e-3};
+Point(4197) = {9.417156e-02,-3.788513e-02,0,1.e-3};
+Point(4198) = {8.867839e-02,-3.720163e-02,0,1.e-3};
+Point(4189) = {8.318523e-02,-3.651554e-02,0,1.e-3};
+Point(4190) = {7.769207e-02,-3.569174e-02,0,1.e-3};
+Point(4214) = {7.494548e-02,-3.527985e-02,0,1.e-3};
+Point(4181) = {7.219890e-02,-3.481687e-02,0,1.e-3};
+Point(4182) = {6.945232e-02,-3.430639e-02,0,1.e-3};
+Point(4151) = {6.670574e-02,-3.379591e-02,0,1.e-3};
+Point(4152) = {6.395916e-02,-3.322033e-02,0,1.e-3};
+Point(4064) = {6.121257e-02,-3.263264e-02,0,1.e-3};
+Point(4065) = {5.846599e-02,-3.189105e-02,0,1.e-3};
+Point(4066) = {5.635416e-02,-3.126039e-02,0,1.e-3};
+Point(4205) = {5.434612e-02,-3.049426e-02,0,1.e-3};
+Point(4206) = {5.297283e-02,-2.986940e-02,0,1.e-3};
+Point(4207) = {5.159954e-02,-2.914883e-02,0,1.e-3};
+Point(4072) = {5.022625e-02,-2.824438e-02,0,1.e-3};
+Point(4074) = {4.885296e-02,-2.716087e-02,0,1.e-3};
+Point(4073) = {4.883074e-02,-2.714051e-02,0,1.e-3};
+Point(4076) = {4.747966e-02,-2.578824e-02,0,1.e-3};
+Point(4075) = {4.746129e-02,-2.576722e-02,0,1.e-3};
+Point(4079) = {4.639274e-02,-2.439393e-02,0,1.e-3};
+Point(4078) = {4.561283e-02,-2.302064e-02,0,1.e-3};
+Point(4077) = {4.500573e-02,-2.164735e-02,0,1.e-3};
+Point(4068) = {4.450243e-02,-2.027406e-02,0,1.e-3};
+Point(4067) = {4.415104e-02,-1.890077e-02,0,1.e-3};
+Point(4069) = {4.402927e-02,-1.752748e-02,0,1.e-3};
+Point(4070) = {4.404617e-02,-1.615418e-02,0,1.e-3};
+Point(4071) = {4.411753e-02,-1.478089e-02,0,1.e-3};
+Point(4115) = {4.421802e-02,-1.340760e-02,0,1.e-3};
+Point(4116) = {4.435615e-02,-1.203431e-02,0,1.e-3};
+Point(4204) = {4.461695e-02,-1.066102e-02,0,1.e-3};
+Point(11) = {4.552264e+01,-2.254225e+01,0,lcext};
+Point(2233) = {4.552264e+01,-1.129225e+01,0,lcext};
+Point(5) = {4.552264e+01,-4.224671e-02,0,lcext};
+Point(2236) = {4.552264e+01,1.120775e+01,0,lcext};
+Point(14) = {4.552264e+01,2.245775e+01,0,lcext};
+Point(2) = {4.552264e+01,4.495775e+01,0,lcext};
+Point(15) = {2.302264e+01,4.495775e+01,0,lcext};
+Point(2301) = {1.177264e+01,4.495775e+01,0,lcext};
+Point(6) = {5.226384e-01,4.495775e+01,0,lcext};
+Point(2304) = {-1.072736e+01,4.495775e+01,0,lcext};
+Point(18) = {-2.197736e+01,4.495775e+01,0,lcext};
+Point(3) = {-4.447736e+01,4.495775e+01,0,lcext};
+Point(19) = {-4.447736e+01,2.245775e+01,0,lcext};
+Point(2240) = {-4.447736e+01,1.120775e+01,0,lcext};
+Point(7) = {-4.447736e+01,-4.224671e-02,0,lcext};
+Point(2243) = {-4.447736e+01,-1.129225e+01,0,lcext};
+Point(22) = {-4.447736e+01,-2.254225e+01,0,lcext};
+Point(4) = {-4.447736e+01,-4.504225e+01,0,lcext};
+Point(23) = {-2.197736e+01,-4.504225e+01,0,lcext};
+Point(2317) = {-1.072736e+01,-4.504225e+01,0,lcext};
+Point(8) = {5.226384e-01,-4.504225e+01,0,lcext};
+Point(2297) = {1.177264e+01,-4.504225e+01,0,lcext};
+Point(10) = {2.302264e+01,-4.504225e+01,0,lcext};
+Point(1) = {4.552264e+01,-4.504225e+01,0,lcext};
+Point(4298) = {1.125732e+00,-1.356305e-01,0,lcext};
+Point(4297) = {1.128473e+00,-1.383771e-01,0,lcext};
+Point(4222) = {1.130511e+00,-1.404190e-01,0,lcext};
+Point(4250) = {1.130200e+00,-1.411237e-01,0,lcext};
+Point(4252) = {1.128987e+00,-1.438702e-01,0,lcext};
+Point(4221) = {1.128033e+00,-1.460320e-01,0,lcext};
+Point(4251) = {1.126886e+00,-1.450775e-01,0,lcext};
+Point(4299) = {1.124140e+00,-1.427912e-01,0,lcext};
+Point(4335) = {1.121393e+00,-1.405048e-01,0,lcext};
+Point(4337) = {1.118647e+00,-1.382318e-01,0,lcext};
+Point(4267) = {1.115900e+00,-1.359746e-01,0,lcext};
+Point(4294) = {1.115481e+00,-1.356305e-01,0,lcext};
+Point(4269) = {1.110407e+00,-1.315213e-01,0,lcext};
+Point(4233) = {1.104914e+00,-1.272651e-01,0,lcext};
+Point(4234) = {1.099421e+00,-1.231333e-01,0,lcext};
+Point(4273) = {1.093927e+00,-1.190696e-01,0,lcext};
+Point(4293) = {1.088434e+00,-1.150965e-01,0,lcext};
+Point(4314) = {1.082941e+00,-1.112096e-01,0,lcext};
+Point(4317) = {1.077448e+00,-1.073829e-01,0,lcext};
+Point(4318) = {1.071955e+00,-1.037168e-01,0,lcext};
+Point(4274) = {1.066462e+00,-1.001266e-01,0,lcext};
+Point(4235) = {1.060968e+00,-9.664561e-02,0,lcext};
+Point(4236) = {1.055475e+00,-9.329373e-02,0,lcext};
+Point(4237) = {1.049982e+00,-8.999964e-02,0,lcext};
+Point(4301) = {1.044489e+00,-8.685139e-02,0,lcext};
+Point(4319) = {1.038996e+00,-8.375978e-02,0,lcext};
+Point(4321) = {1.033503e+00,-8.073620e-02,0,lcext};
+Point(4320) = {1.033435e+00,-8.069886e-02,0,lcext};
+Point(4322) = {1.028009e+00,-7.778268e-02,0,lcext};
+Point(4347) = {1.022516e+00,-7.485902e-02,0,lcext};
+Point(4323) = {1.017023e+00,-7.206071e-02,0,lcext};
+Point(4324) = {1.011530e+00,-6.928798e-02,0,lcext};
+Point(4325) = {1.006037e+00,-6.656447e-02,0,lcext};
+Point(4276) = {1.000544e+00,-6.390345e-02,0,lcext};
+Point(4238) = {9.950505e-01,-6.128188e-02,0,lcext};
+Point(4240) = {9.895573e-01,-5.875476e-02,0,lcext};
+Point(4239) = {9.894949e-01,-5.872621e-02,0,lcext};
+Point(4241) = {9.840641e-01,-5.625125e-02,0,lcext};
+Point(4277) = {9.785710e-01,-5.382099e-02,0,lcext};
+Point(4326) = {9.730778e-01,-5.141086e-02,0,lcext};
+Point(4327) = {9.675846e-01,-4.903782e-02,0,lcext};
+Point(4328) = {9.620915e-01,-4.670806e-02,0,lcext};
+Point(4350) = {9.565983e-01,-4.440955e-02,0,lcext};
+Point(4348) = {9.511052e-01,-4.217563e-02,0,lcext};
+Point(4349) = {9.456120e-01,-3.995849e-02,0,lcext};
+Point(4332) = {9.401188e-01,-3.778658e-02,0,lcext};
+Point(4333) = {9.346257e-01,-3.563417e-02,0,lcext};
+Point(4334) = {9.291325e-01,-3.354304e-02,0,lcext};
+Point(4278) = {9.236393e-01,-3.147155e-02,0,lcext};
+Point(4247) = {9.181462e-01,-2.942051e-02,0,lcext};
+Point(4248) = {9.126530e-01,-2.741688e-02,0,lcext};
+Point(4249) = {9.071598e-01,-2.541811e-02,0,lcext};
+Point(4282) = {9.016667e-01,-2.339436e-02,0,lcext};
+Point(4283) = {8.961735e-01,-2.121581e-02,0,lcext};
+Point(4341) = {8.934269e-01,-2.008894e-02,0,lcext};
+Point(4342) = {8.906803e-01,-1.868991e-02,0,lcext};
+Point(4343) = {8.879338e-01,-1.729088e-02,0,lcext};
+Point(4289) = {8.851872e-01,-1.539587e-02,0,lcext};
+Point(4290) = {8.824406e-01,-1.328983e-02,0,lcext};
+Point(4286) = {8.796940e-01,-1.068337e-02,0,lcext};
+Point(4255) = {8.785175e-01,-9.287729e-03,0,lcext};
+Point(4257) = {8.763537e-01,-6.541147e-03,0,lcext};
+Point(4256) = {8.745583e-01,-3.794565e-03,0,lcext};
+Point(4346) = {8.737982e-01,-2.421274e-03,0,lcext};
+Point(4288) = {8.731375e-01,-1.047983e-03,0,lcext};
+Point(4287) = {8.725645e-01,3.253082e-04,0,lcext};
+Point(4260) = {8.721474e-01,1.698599e-03,0,lcext};
+Point(4259) = {8.718264e-01,3.071890e-03,0,lcext};
+Point(4258) = {8.716296e-01,4.445181e-03,0,lcext};
+Point(4262) = {8.715751e-01,5.818472e-03,0,lcext};
+Point(4261) = {8.716587e-01,7.191763e-03,0,lcext};
+Point(4264) = {8.718582e-01,8.565054e-03,0,lcext};
+Point(4263) = {8.721688e-01,9.938345e-03,0,lcext};
+Point(4265) = {8.726207e-01,1.131164e-02,0,lcext};
+Point(4266) = {8.732553e-01,1.268493e-02,0,lcext};
+Point(4303) = {8.741084e-01,1.405822e-02,0,lcext};
+Point(4302) = {8.742009e-01,1.417564e-02,0,lcext};
+Point(4304) = {8.752094e-01,1.543151e-02,0,lcext};
+Point(4305) = {8.755741e-01,1.580615e-02,0,lcext};
+Point(4306) = {8.765464e-01,1.680480e-02,0,lcext};
+Point(4307) = {8.769474e-01,1.712646e-02,0,lcext};
+Point(4308) = {8.783004e-01,1.817809e-02,0,lcext};
+Point(4309) = {8.783207e-01,1.819390e-02,0,lcext};
+Point(4345) = {8.796940e-01,1.898483e-02,0,lcext};
+Point(4344) = {8.810673e-01,1.969096e-02,0,lcext};
+Point(4254) = {8.824406e-01,2.018966e-02,0,lcext};
+Point(4253) = {8.851872e-01,2.092940e-02,0,lcext};
+Point(4285) = {8.879338e-01,2.136484e-02,0,lcext};
+Point(4284) = {8.906803e-01,2.153023e-02,0,lcext};
+Point(4340) = {8.934269e-01,2.149455e-02,0,lcext};
+Point(4339) = {8.961735e-01,2.136105e-02,0,lcext};
+Point(4338) = {8.989201e-01,2.104930e-02,0,lcext};
+Point(4246) = {9.016667e-01,2.064514e-02,0,lcext};
+Point(4245) = {9.071598e-01,1.954695e-02,0,lcext};
+Point(4281) = {9.126530e-01,1.818666e-02,0,lcext};
+Point(4280) = {9.181462e-01,1.648801e-02,0,lcext};
+Point(4279) = {9.236393e-01,1.459116e-02,0,lcext};
+Point(4244) = {9.291325e-01,1.255534e-02,0,lcext};
+Point(4243) = {9.346257e-01,1.024686e-02,0,lcext};
+Point(4242) = {9.401188e-01,7.859173e-03,0,lcext};
+Point(4296) = {9.456120e-01,5.245962e-03,0,lcext};
+Point(4295) = {9.511052e-01,2.515401e-03,0,lcext};
+Point(4300) = {9.565983e-01,-3.522322e-04,0,lcext};
+Point(4330) = {9.620915e-01,-3.368852e-03,0,lcext};
+Point(4331) = {9.628545e-01,-3.794565e-03,0,lcext};
+Point(4329) = {9.675846e-01,-6.447130e-03,0,lcext};
+Point(4232) = {9.730778e-01,-9.700323e-03,0,lcext};
+Point(4231) = {9.840641e-01,-1.646639e-02,0,lcext};
+Point(4230) = {9.950505e-01,-2.366260e-02,0,lcext};
+Point(4229) = {1.006037e+00,-3.132299e-02,0,lcext};
+Point(4228) = {1.017023e+00,-3.943289e-02,0,lcext};
+Point(4227) = {1.028009e+00,-4.793142e-02,0,lcext};
+Point(4225) = {1.038996e+00,-5.669110e-02,0,lcext};
+Point(4226) = {1.048275e+00,-6.421937e-02,0,lcext};
+Point(4312) = {1.054944e+00,-6.971253e-02,0,lcext};
+Point(4223) = {1.060968e+00,-7.473580e-02,0,lcext};
+Point(4224) = {1.061523e+00,-7.520570e-02,0,lcext};
+Point(4311) = {1.066462e+00,-7.943817e-02,0,lcext};
+Point(4310) = {1.067933e+00,-8.069886e-02,0,lcext};
+Point(4275) = {1.071955e+00,-8.420612e-02,0,lcext};
+Point(4316) = {1.077448e+00,-8.903994e-02,0,lcext};
+Point(4315) = {1.082941e+00,-9.395896e-02,0,lcext};
+Point(4313) = {1.088434e+00,-9.897945e-02,0,lcext};
+Point(4292) = {1.093927e+00,-1.041032e-01,0,lcext};
+Point(4272) = {1.099421e+00,-1.093858e-01,0,lcext};
+Point(4271) = {1.104914e+00,-1.148004e-01,0,lcext};
+Point(4270) = {1.110407e+00,-1.202740e-01,0,lcext};
+Point(4268) = {1.114765e+00,-1.246442e-01,0,lcext};
+Point(4291) = {1.120249e+00,-1.301373e-01,0,lcext};
+Point(4336) = {1.122990e+00,-1.328839e-01,0,lcext};
+Line(1) = {3895,3897};
+Line(2) = {3897,3896};
+Line(3) = {3896,3968};
+Line(4) = {3968,3995};
+Line(5) = {3995,4003};
+Line(6) = {4003,3857};
+Line(7) = {3857,3856};
+Line(8) = {3856,3860};
+Line(9) = {3860,3861};
+Line(10) = {3861,3863};
+Line(11) = {3863,3864};
+Line(12) = {3864,3865};
+Line(13) = {3865,3866};
+Line(14) = {3866,3867};
+Line(15) = {3867,3868};
+Line(16) = {3868,3869};
+Line(17) = {3869,3870};
+Line(18) = {3870,3871};
+Line(19) = {3871,3872};
+Line(20) = {3872,3977};
+Line(21) = {3977,3877};
+Line(22) = {3877,3876};
+Line(23) = {3876,3878};
+Line(24) = {3878,3934};
+Line(25) = {3934,3873};
+Line(26) = {3873,3874};
+Line(27) = {3874,3875};
+Line(28) = {3875,3935};
+Line(29) = {3935,3880};
+Line(30) = {3880,3879};
+Line(31) = {3879,3881};
+Line(32) = {3881,3936};
+Line(33) = {3936,3882};
+Line(34) = {3882,3883};
+Line(35) = {3883,3885};
+Line(36) = {3885,3884};
+Line(37) = {3884,1218};
+Line(38) = {1218,3933};
+Line(39) = {3933,3996};
+Line(40) = {3996,3989};
+Line(41) = {3989,3990};
+Line(42) = {3990,3978};
+Line(43) = {3978,3979};
+Line(44) = {3979,3974};
+Line(45) = {3974,3973};
+Line(46) = {3973,3963};
+Line(47) = {3963,3947};
+Line(48) = {3947,3948};
+Line(49) = {3948,3904};
+Line(50) = {3904,3903};
+Line(51) = {3903,3946};
+Line(52) = {3946,3902};
+Line(53) = {3902,3901};
+Line(54) = {3901,3900};
+Line(55) = {3900,3908};
+Line(56) = {3908,3907};
+Line(57) = {3907,3951};
+Line(58) = {3951,3950};
+Line(59) = {3950,3847};
+Line(60) = {3847,3949};
+Line(61) = {3949,3952};
+Line(62) = {3952,3905};
+Line(63) = {3905,3906};
+Line(64) = {3906,3909};
+Line(65) = {3909,3969};
+Line(66) = {3969,3970};
+Line(67) = {3970,3997};
+Line(68) = {3997,3998};
+Line(69) = {3998,4004};
+Line(70) = {4004,3959};
+Line(71) = {3959,3960};
+Line(72) = {3960,3972};
+Line(73) = {3972,3984};
+Line(74) = {3984,3988};
+Line(75) = {3988,3961};
+Line(76) = {3961,3962};
+Line(77) = {3962,3937};
+Line(78) = {3937,3938};
+Line(79) = {3938,3886};
+Line(80) = {3886,3887};
+Line(81) = {3887,3888};
+Line(82) = {3888,3993};
+Line(83) = {3993,3994};
+Line(84) = {3994,3971};
+Line(85) = {3971,3918};
+Line(86) = {3918,3919};
+Line(87) = {3919,3920};
+Line(88) = {3920,3956};
+Line(89) = {3956,3955};
+Line(90) = {3955,3965};
+Line(91) = {3965,3966};
+Line(92) = {3966,3910};
+Line(93) = {3910,3913};
+Line(94) = {3913,3912};
+Line(95) = {3912,3911};
+Line(96) = {3911,3914};
+Line(97) = {3914,3915};
+Line(98) = {3915,3916};
+Line(99) = {3916,3917};
+Line(100) = {3917,3953};
+Line(101) = {3953,3954};
+Line(102) = {3954,3964};
+Line(103) = {3964,3975};
+Line(104) = {3975,3992};
+Line(105) = {3992,3991};
+Line(106) = {3991,3999};
+Line(107) = {3999,3939};
+Line(108) = {3939,3967};
+Line(109) = {3967,3987};
+Line(110) = {3987,3985};
+Line(111) = {3985,3986};
+Line(112) = {3986,4002};
+Line(113) = {4002,3922};
+Line(114) = {3922,4005};
+Line(115) = {4005,3851};
+Line(116) = {3851,3850};
+Line(117) = {3850,3853};
+Line(118) = {3853,3852};
+Line(119) = {3852,3849};
+Line(120) = {3849,3848};
+Line(121) = {3848,3921};
+Line(122) = {3921,3983};
+Line(123) = {3983,3982};
+Line(124) = {3982,3976};
+Line(125) = {3976,3929};
+Line(126) = {3929,3958};
+Line(127) = {3958,3928};
+Line(128) = {3928,3957};
+Line(129) = {3957,3927};
+Line(130) = {3927,3926};
+Line(131) = {3926,3925};
+Line(132) = {3925,3924};
+Line(133) = {3924,3932};
+Line(134) = {3932,3931};
+Line(135) = {3931,3930};
+Line(136) = {3930,3923};
+Line(137) = {3923,3862};
+Line(138) = {3862,3859};
+Line(139) = {3859,3858};
+Line(140) = {3858,3855};
+Line(141) = {3855,3854};
+Line(142) = {3854,3945};
+Line(143) = {3945,3944};
+Line(144) = {3944,3899};
+Line(145) = {3899,3898};
+Line(146) = {3898,3894};
+Line(147) = {3894,3890};
+Line(148) = {3890,3893};
+Line(149) = {3893,3941};
+Line(150) = {3941,4000};
+Line(151) = {4000,3980};
+Line(152) = {3980,3846};
+Line(153) = {3846,3981};
+Line(154) = {3981,4001};
+Line(155) = {4001,3942};
+Line(156) = {3942,3940};
+Line(157) = {3940,3889};
+Line(158) = {3889,3892};
+Line(159) = {3892,3891};
+Line(160) = {3891,3943};
+Line(161) = {3943,3895};
+Line(162) = {4063,4062};
+Line(163) = {4062,4061};
+Line(164) = {4061,4114};
+Line(165) = {4114,4153};
+Line(166) = {4153,4178};
+Line(167) = {4178,4179};
+Line(168) = {4179,4191};
+Line(169) = {4191,4203};
+Line(170) = {4203,4109};
+Line(171) = {4109,4202};
+Line(172) = {4202,4199};
+Line(173) = {4199,4201};
+Line(174) = {4201,4200};
+Line(175) = {4200,4100};
+Line(176) = {4100,4099};
+Line(177) = {4099,4045};
+Line(178) = {4045,4044};
+Line(179) = {4044,4043};
+Line(180) = {4043,4147};
+Line(181) = {4147,4146};
+Line(182) = {4146,4180};
+Line(183) = {4180,4167};
+Line(184) = {4167,4166};
+Line(185) = {4166,4134};
+Line(186) = {4134,4133};
+Line(187) = {4133,4098};
+Line(188) = {4098,4097};
+Line(189) = {4097,4042};
+Line(190) = {4042,4041};
+Line(191) = {4041,4040};
+Line(192) = {4040,4095};
+Line(193) = {4095,4096};
+Line(194) = {4096,4132};
+Line(195) = {4132,4131};
+Line(196) = {4131,4165};
+Line(197) = {4165,4164};
+Line(198) = {4164,4163};
+Line(199) = {4163,4130};
+Line(200) = {4130,4129};
+Line(201) = {4129,4094};
+Line(202) = {4094,4093};
+Line(203) = {4093,4039};
+Line(204) = {4039,4038};
+Line(205) = {4038,4037};
+Line(206) = {4037,4092};
+Line(207) = {4092,4091};
+Line(208) = {4091,4128};
+Line(209) = {4128,4127};
+Line(210) = {4127,4162};
+Line(211) = {4162,4161};
+Line(212) = {4161,4183};
+Line(213) = {4183,4160};
+Line(214) = {4160,4159};
+Line(215) = {4159,4126};
+Line(216) = {4126,4125};
+Line(217) = {4125,4088};
+Line(218) = {4088,4087};
+Line(219) = {4087,4033};
+Line(220) = {4033,4032};
+Line(221) = {4032,4031};
+Line(222) = {4031,4086};
+Line(223) = {4086,4085};
+Line(224) = {4085,4124};
+Line(225) = {4124,4123};
+Line(226) = {4123,4158};
+Line(227) = {4158,4157};
+Line(228) = {4157,4156};
+Line(229) = {4156,4122};
+Line(230) = {4122,4121};
+Line(231) = {4121,4081};
+Line(232) = {4081,4080};
+Line(233) = {4080,4020};
+Line(234) = {4020,4019};
+Line(235) = {4019,4018};
+Line(236) = {4018,4143};
+Line(237) = {4143,4118};
+Line(238) = {4118,4022};
+Line(239) = {4022,4016};
+Line(240) = {4016,4015};
+Line(241) = {4015,4011};
+Line(242) = {4011,4010};
+Line(243) = {4010,4009};
+Line(244) = {4009,4219};
+Line(245) = {4219,4177};
+Line(246) = {4177,4176};
+Line(247) = {4176,4149};
+Line(248) = {4149,4059};
+Line(249) = {4059,4058};
+Line(250) = {4058,4055};
+Line(251) = {4055,4113};
+Line(252) = {4113,4110};
+Line(253) = {4110,4213};
+Line(254) = {4213,4210};
+Line(255) = {4210,4217};
+Line(256) = {4217,4006};
+Line(257) = {4006,4218};
+Line(258) = {4218,4211};
+Line(259) = {4211,4212};
+Line(260) = {4212,4111};
+Line(261) = {4111,4112};
+Line(262) = {4112,4056};
+Line(263) = {4056,4057};
+Line(264) = {4057,4060};
+Line(265) = {4060,4148};
+Line(266) = {4148,4150};
+Line(267) = {4150,4208};
+Line(268) = {4208,4209};
+Line(269) = {4209,4215};
+Line(270) = {4215,4216};
+Line(271) = {4216,4220};
+Line(272) = {4220,4012};
+Line(273) = {4012,4013};
+Line(274) = {4013,4014};
+Line(275) = {4014,4017};
+Line(276) = {4017,4021};
+Line(277) = {4021,4023};
+Line(278) = {4023,4117};
+Line(279) = {4117,4082};
+Line(280) = {4082,4083};
+Line(281) = {4083,4024};
+Line(282) = {4024,4025};
+Line(283) = {4025,4007};
+Line(284) = {4007,4026};
+Line(285) = {4026,4027};
+Line(286) = {4027,4028};
+Line(287) = {4028,4029};
+Line(288) = {4029,4008};
+Line(289) = {4008,4030};
+Line(290) = {4030,4084};
+Line(291) = {4084,4194};
+Line(292) = {4194,4195};
+Line(293) = {4195,4154};
+Line(294) = {4154,4155};
+Line(295) = {4155,4119};
+Line(296) = {4119,4120};
+Line(297) = {4120,4089};
+Line(298) = {4089,4090};
+Line(299) = {4090,4034};
+Line(300) = {4034,4035};
+Line(301) = {4035,4036};
+Line(302) = {4036,4144};
+Line(303) = {4144,4192};
+Line(304) = {4192,4193};
+Line(305) = {4193,4184};
+Line(306) = {4184,4185};
+Line(307) = {4185,4168};
+Line(308) = {4168,4169};
+Line(309) = {4169,4135};
+Line(310) = {4135,4136};
+Line(311) = {4136,4101};
+Line(312) = {4101,4102};
+Line(313) = {4102,4049};
+Line(314) = {4049,4050};
+Line(315) = {4050,4051};
+Line(316) = {4051,4103};
+Line(317) = {4103,4104};
+Line(318) = {4104,4137};
+Line(319) = {4137,4138};
+Line(320) = {4138,4170};
+Line(321) = {4170,4171};
+Line(322) = {4171,4186};
+Line(323) = {4186,4172};
+Line(324) = {4172,4173};
+Line(325) = {4173,4139};
+Line(326) = {4139,4140};
+Line(327) = {4140,4105};
+Line(328) = {4105,4106};
+Line(329) = {4106,4052};
+Line(330) = {4052,4053};
+Line(331) = {4053,4054};
+Line(332) = {4054,4107};
+Line(333) = {4107,4108};
+Line(334) = {4108,4141};
+Line(335) = {4141,4142};
+Line(336) = {4142,4174};
+Line(337) = {4174,4175};
+Line(338) = {4175,4187};
+Line(339) = {4187,4188};
+Line(340) = {4188,4145};
+Line(341) = {4145,4046};
+Line(342) = {4046,4047};
+Line(343) = {4047,4048};
+Line(344) = {4048,4196};
+Line(345) = {4196,4197};
+Line(346) = {4197,4198};
+Line(347) = {4198,4189};
+Line(348) = {4189,4190};
+Line(349) = {4190,4214};
+Line(350) = {4214,4181};
+Line(351) = {4181,4182};
+Line(352) = {4182,4151};
+Line(353) = {4151,4152};
+Line(354) = {4152,4064};
+Line(355) = {4064,4065};
+Line(356) = {4065,4066};
+Line(357) = {4066,4205};
+Line(358) = {4205,4206};
+Line(359) = {4206,4207};
+Line(360) = {4207,4072};
+Line(361) = {4072,4074};
+Line(362) = {4074,4073};
+Line(363) = {4073,4076};
+Line(364) = {4076,4075};
+Line(365) = {4075,4079};
+Line(366) = {4079,4078};
+Line(367) = {4078,4077};
+Line(368) = {4077,4068};
+Line(369) = {4068,4067};
+Line(370) = {4067,4069};
+Line(371) = {4069,4070};
+Line(372) = {4070,4071};
+Line(373) = {4071,4115};
+Line(374) = {4115,4116};
+Line(375) = {4116,4204};
+Line(376) = {4204,4063};
+Line(377) = {11,2233};
+Line(378) = {2233,5};
+Line(379) = {5,2236};
+Line(380) = {2236,14};
+Line(381) = {14,2};
+Line(382) = {2,15};
+Line(383) = {15,2301};
+Line(384) = {2301,6};
+Line(385) = {6,2304};
+Line(386) = {2304,18};
+Line(387) = {18,3};
+Line(388) = {3,19};
+Line(389) = {19,2240};
+Line(390) = {2240,7};
+Line(391) = {7,2243};
+Line(392) = {2243,22};
+Line(393) = {22,4};
+Line(394) = {4,23};
+Line(395) = {23,2317};
+Line(396) = {2317,8};
+Line(397) = {8,2297};
+Line(398) = {2297,10};
+Line(399) = {10,1};
+Line(400) = {1,11};
+Line(401) = {4298,4297};
+Line(402) = {4297,4222};
+Line(403) = {4222,4250};
+Line(404) = {4250,4252};
+Line(405) = {4252,4221};
+Line(406) = {4221,4251};
+Line(407) = {4251,4299};
+Line(408) = {4299,4335};
+Line(409) = {4335,4337};
+Line(410) = {4337,4267};
+Line(411) = {4267,4294};
+Line(412) = {4294,4269};
+Line(413) = {4269,4233};
+Line(414) = {4233,4234};
+Line(415) = {4234,4273};
+Line(416) = {4273,4293};
+Line(417) = {4293,4314};
+Line(418) = {4314,4317};
+Line(419) = {4317,4318};
+Line(420) = {4318,4274};
+Line(421) = {4274,4235};
+Line(422) = {4235,4236};
+Line(423) = {4236,4237};
+Line(424) = {4237,4301};
+Line(425) = {4301,4319};
+Line(426) = {4319,4321};
+Line(427) = {4321,4320};
+Line(428) = {4320,4322};
+Line(429) = {4322,4347};
+Line(430) = {4347,4323};
+Line(431) = {4323,4324};
+Line(432) = {4324,4325};
+Line(433) = {4325,4276};
+Line(434) = {4276,4238};
+Line(435) = {4238,4240};
+Line(436) = {4240,4239};
+Line(437) = {4239,4241};
+Line(438) = {4241,4277};
+Line(439) = {4277,4326};
+Line(440) = {4326,4327};
+Line(441) = {4327,4328};
+Line(442) = {4328,4350};
+Line(443) = {4350,4348};
+Line(444) = {4348,4349};
+Line(445) = {4349,4332};
+Line(446) = {4332,4333};
+Line(447) = {4333,4334};
+Line(448) = {4334,4278};
+Line(449) = {4278,4247};
+Line(450) = {4247,4248};
+Line(451) = {4248,4249};
+Line(452) = {4249,4282};
+Line(453) = {4282,4283};
+Line(454) = {4283,4341};
+Line(455) = {4341,4342};
+Line(456) = {4342,4343};
+Line(457) = {4343,4289};
+Line(458) = {4289,4290};
+Line(459) = {4290,4286};
+Line(460) = {4286,4255};
+Line(461) = {4255,4257};
+Line(462) = {4257,4256};
+Line(463) = {4256,4346};
+Line(464) = {4346,4288};
+Line(465) = {4288,4287};
+Line(466) = {4287,4260};
+Line(467) = {4260,4259};
+Line(468) = {4259,4258};
+Line(469) = {4258,4262};
+Line(470) = {4262,4261};
+Line(471) = {4261,4264};
+Line(472) = {4264,4263};
+Line(473) = {4263,4265};
+Line(474) = {4265,4266};
+Line(475) = {4266,4303};
+Line(476) = {4303,4302};
+Line(477) = {4302,4304};
+Line(478) = {4304,4305};
+Line(479) = {4305,4306};
+Line(480) = {4306,4307};
+Line(481) = {4307,4308};
+Line(482) = {4308,4309};
+Line(483) = {4309,4345};
+Line(484) = {4345,4344};
+Line(485) = {4344,4254};
+Line(486) = {4254,4253};
+Line(487) = {4253,4285};
+Line(488) = {4285,4284};
+Line(489) = {4284,4340};
+Line(490) = {4340,4339};
+Line(491) = {4339,4338};
+Line(492) = {4338,4246};
+Line(493) = {4246,4245};
+Line(494) = {4245,4281};
+Line(495) = {4281,4280};
+Line(496) = {4280,4279};
+Line(497) = {4279,4244};
+Line(498) = {4244,4243};
+Line(499) = {4243,4242};
+Line(500) = {4242,4296};
+Line(501) = {4296,4295};
+Line(502) = {4295,4300};
+Line(503) = {4300,4330};
+Line(504) = {4330,4331};
+Line(505) = {4331,4329};
+Line(506) = {4329,4232};
+Line(507) = {4232,4231};
+Line(508) = {4231,4230};
+Line(509) = {4230,4229};
+Line(510) = {4229,4228};
+Line(511) = {4228,4227};
+Line(512) = {4227,4225};
+Line(513) = {4225,4226};
+Line(514) = {4226,4312};
+Line(515) = {4312,4223};
+Line(516) = {4223,4224};
+Line(517) = {4224,4311};
+Line(518) = {4311,4310};
+Line(519) = {4310,4275};
+Line(520) = {4275,4316};
+Line(521) = {4316,4315};
+Line(522) = {4315,4313};
+Line(523) = {4313,4292};
+Line(524) = {4292,4272};
+Line(525) = {4272,4271};
+Line(526) = {4271,4270};
+Line(527) = {4270,4268};
+Line(528) = {4268,4291};
+Line(529) = {4291,4336};
+Line(530) = {4336,4298};
+Line Loop(531) = {311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310};
+
+//Plane Surface(532) = {531};
+
+Line Loop(533) = {36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
+
+Line Loop(534) = {451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450};
+
+/*
+Plane Surface(535) = {534};
+
+Plane Surface(536) = {533};
+*/
+
+Line Loop(537) = {386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383,384,385};
+
+
+Plane Surface(538) = {537,531,533,534}; 
diff --git a/examples/fissure.geo b/examples/fissure.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1b33e91c18129d5210ca91f18319cb14a0ac2ea1
--- /dev/null
+++ b/examples/fissure.geo
@@ -0,0 +1,18 @@
+eps = 1.e-3 ;
+
+Point(1) = {-1,-1,0,.1} ;
+Point(2) = {-1,1,0,.1} ;
+Point(3) = {1,-1,0,.1} ;
+Point(4) = {1,1,0,.1} ;
+Point(5) = {-1,0,0,.06} ;
+Point(6) = {0,0,0,.03} ;
+Point(7) = {-1,0+eps,0,.06} ;
+Line(1) = {5,1};
+Line(2) = {1,3};
+Line(3) = {3,4};
+Line(4) = {4,2};
+Line(5) = {2,7};
+Line(6) = {7,6};
+Line(7) = {6,5};
+Line Loop(8) = {5,6,7,1,2,3,4};
+Plane Surface(9) = {8};
diff --git a/examples/gmsh.tmp b/examples/gmsh.tmp
new file mode 100644
index 0000000000000000000000000000000000000000..6c7de338556384b0da0864d6add5617a41de3e91
--- /dev/null
+++ b/examples/gmsh.tmp
@@ -0,0 +1 @@
+Plane Surface(28) = {27};
diff --git a/examples/h6.geo b/examples/h6.geo
new file mode 100644
index 0000000000000000000000000000000000000000..349a558949ef1fcb4560e90db061816c7bd6b607
--- /dev/null
+++ b/examples/h6.geo
@@ -0,0 +1,18 @@
+h = 0.1;
+h2 = 0.031;
+Point(1) = { 0.00000E+00, 0.00000E+00, 0.0 , h2};
+Point(2) = { 1.00000E-01, 0.00000E+00, 0.0 , h2};
+Point(3) = { 0.00000E+00, 4.00000E-01, 0.00000E+00,h2};
+Point(4) = { 0.00000E+00, 0.00000E+00, 0.00000E+00,h2};
+Point(5) = { 1.00000E-01, 4.00000E-01, 0.00000E+00,h2};
+Line(1) = Liste[1,3];
+Line(2) = Liste[3,5];
+Line(3) = Liste[5,2];
+Line(4) = Liste[2,1];
+Boucle(5) = Liste[2,3,4,1];
+Zone(6) = Liste[5];
+
+AIR = 1 ;
+CLD = 2 ;
+Physical Volume(AIR) = Liste [-6];
+Physical Volume(CLD) = Liste [4];
diff --git a/examples/pp.geo b/examples/pp.geo
new file mode 100644
index 0000000000000000000000000000000000000000..f0c0967acf3f6980ffa16fa3593b0a853919cc30
--- /dev/null
+++ b/examples/pp.geo
@@ -0,0 +1,8 @@
+
+Point(101) = {0,0,0,1} ;
+Point(102) = {0,1,1,1} ;
+Point(100) = {1,1,0,1} ;
+Point(103) = {1,0,1,1} ;
+
+Line(2001) = {100, 101} ;
+Line(2000) = {102, 103} ;
diff --git a/examples/pri1.geo b/examples/pri1.geo
new file mode 100644
index 0000000000000000000000000000000000000000..d537e222cbbe26b62ec93d4e4b070023470fe985
--- /dev/null
+++ b/examples/pri1.geo
@@ -0,0 +1,46 @@
+Point(1) = {0.0,0.0,0.0,1.0};
+Point(2) = {1,0.0,0.0,1.0};
+Point(3) = {1,0.0,1,1.0};
+Point(4) = {1,2,1,1.0};
+Point(5) = {0,2,0,1.0};
+Point(6) = {1,2,0,1.0};
+
+Line(1) = {4,6};
+Line(2) = {6,5};
+Line(3) = {5,4};
+Line(4) = {2,1};
+Line(5) = {1,3};
+Line(6) = {3,2};
+Line(7) = {2,6};
+Line(8) = {5,1};
+Line(9) = {3,4};
+
+Line Loop(10) = {9,-3,8,5};
+Plane Surface(11) = {10};
+Line Loop(12) = {-7,-6,9,1};
+Plane Surface(13) = {12};
+Line Loop(14) = {-4,7,2,8};
+Plane Surface(15) = {14};
+Line Loop(16) = {6,4,5};
+Plane Surface(17) = {16};
+Line Loop(18) = {1,2,3};
+Plane Surface(19) = {18};
+
+Surface Loop(20) = {13,15,17,-11,-19};
+Complex Volume(21) = {20};
+
+Transfinite Line {1,2,3,4,5,6,7,8,9} = 3;
+
+Transfinite Surface {17} = {1,3,2};
+Transfinite Surface {15} = {1,2,6,5};
+Transfinite Surface {11} = {1,3,4,5};
+Transfinite Surface {13} = {3,2,6,4};
+Transfinite Surface {19} = {5,4,6};
+
+Transfinite Volume {21} = {1,3,2,5,4,6};
+
+/*
+Recombine Surface {17,19};
+*/
+Recombine Surface {11,13,15};
+
diff --git a/examples/quads.geo b/examples/quads.geo
new file mode 100644
index 0000000000000000000000000000000000000000..164c1a0de6417493b7d4a0e61537ec53798bc9cf
--- /dev/null
+++ b/examples/quads.geo
@@ -0,0 +1,56 @@
+l = .3;
+Point(1) = {-2,-1,0,l};
+Point(2) = {-2,1,0,l};
+Point(3) = {0,-1,0,l};
+Point(4) = {0,1,0,l};
+Point(5) = {-3,-2,0,l};
+Point(6) = {-3,2,0,l};
+Point(7) = {1,-2,0,l};
+Point(8) = {1,2,0,l};
+
+Line(1) = {6,8};
+Line(2) = {8,7};
+Line(3) = {7,5};
+Line(4) = {5,6};
+Line(5) = {2,1};
+Line(6) = {1,3};
+Line(7) = {3,4};
+Line(8) = {4,2};
+
+Line Loop(9) = {5,6,7,8};
+Plane Surface(10) = {9};
+
+Line Loop(11) = {2,3,4,1};
+Plane Surface(12) = {11,9};
+
+/* this will try to produce quadrangles for surfaces 10 and 12 */
+
+Recombine Surface {10,12} ;
+
+
+/* For surface 10, we force a structured mesh (transfinite meshing) */
+
+/* We force the number of points on the lines 5,6,7,8 to be 10 and 5 */
+Transfinite Line {5,7} = 10 ;
+Transfinite Line {6,8} = 5 ;
+
+/* we define transfinite interpolation on surface 10, determined by the 
+   ordering of the for ***vertices*** 1,3,2,4  */
+Transfinite Surface {10} = {1,3,4,2} ;
+
+/*
+   result :
+  
+   Surface 10 should be made entirely of quads
+   Surface 12 should be mixed tri/quad
+
+   comments :
+
+   Transfinite surfaces can only have 3 or 4 sides
+
+   to have a specified repartion of the nodes for transfinite lines :
+   
+   Transfinite Line {X} = Y Using Power Z ;
+   Transfinite Line {X} = Y Using Bump Z ;
+
+*/
diff --git a/examples/rot.geo b/examples/rot.geo
new file mode 100644
index 0000000000000000000000000000000000000000..523500e101fba4a41bbcdac263dde20be262ea6b
--- /dev/null
+++ b/examples/rot.geo
@@ -0,0 +1,13 @@
+Point(1) = {0,0,0,.25};
+Point(2) = {0,1,0,.25};
+Point(3) = {1,0,0,.25};
+Point(4) = {1,1,0,.25};
+Line(1) = {1,2};
+Line(2) = {2,4};
+Line(3) = {4,3};
+Line(4) = {3,1};
+Line Loop(5) = {4,1,2,3};
+Plane Surface(6) = 5;
+Extrude( 6, { 1.,0.,0.}, {0,-1,0.}, 1.57);
+Extrude(24, {0,0,-1}, {-1,-1,0}, 1.57);
+Coherence;
diff --git a/examples/sph.geo b/examples/sph.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0f4a835045cc612d756b27aeeb19196074eb500f
--- /dev/null
+++ b/examples/sph.geo
@@ -0,0 +1,56 @@
+lc = 0.01;
+dext = .05;
+dint = .055;
+
+Point(1) = {0,0,0,lc};  
+Point(2) = {dint,0,0,lc};
+Point(3) = {0,dint,0,lc};
+Point(4) = {0,0,dint,lc};
+Point(5) = {dext,0,0,lc};
+Point(6) = {0,dext,0,lc};
+Point(7) = {0,0,dext,lc};
+
+Circle(1) = {7,1,5};
+Circle(2) = {4,1,2};
+Circle(3) = {5,1,6};
+Circle(4) = {2,1,3};
+Circle(5) = {7,1,6};
+Circle(6) = {4,1,3};
+Line(7) = {1,5};
+Line(8) = {5,2};
+Line(9) = {1,6};
+Line(10) = {6,3};
+Line(11) = {1,7};
+Line(12) = {7,4};
+
+Line Loop(17) = {2,-8,-1,12};
+Plane Surface(18) = {17};
+Line Loop(19) = {-4,-8,3,10};
+Plane Surface(20) = {19};
+Line Loop(21) = {-6,-12,5,10};
+Plane Surface(22) = {21};
+
+Line Loop(23) = {-6,2,4};
+Ruled Surface(24) = {23};
+Line Loop(25) = {-5,1,3};
+Ruled Surface(26) = {25};
+
+Surface Loop(27) = {24,-22,-18,20,-26};
+Complex Volume(28) = {27};
+
+Transfinite Line {1,2,3,4,5,6} = 10 ;
+Transfinite Line {-8,-10,-12} = 5 Using Power 1.6 ;
+
+Transfinite Surface {22} = {4,7,6,3};
+Transfinite Surface {20} = {3,2,5,6};
+Transfinite Surface {18} = {4,2,5,7};
+
+Transfinite Surface {24} = {3,4,2};
+Transfinite Surface {26} = {6,7,5};
+
+Recombine Surface {18,20,22};
+/*
+Recombine Surface {24,26};
+*/
+Transfinite Volume {28} = {3,4,2,6,7,5};
+
diff --git a/examples/these.geo b/examples/these.geo
new file mode 100644
index 0000000000000000000000000000000000000000..52c5b44d28918db1aa38a0959ae14e4d84858dce
--- /dev/null
+++ b/examples/these.geo
@@ -0,0 +1,26 @@
+l= .3;
+Point(1) = {-1.00000E+00,-1.00000E-00, 0.00000E+00,l};
+Point(2) = {-1.00000E+00, 1.00000E-00, 0.00000E+00,l};
+Point(3) = { 1.00000E+00, 1.00000E-00, 0.00000E+00,l};
+Point(4) = { 1.00000E+00,-1.00000E-00, 0.00000E+00,l};
+Point(5) = {-0.00000E+00,-0.00000E-00, 0.00000E+00,l};
+Point(6) = {-0.00000E+00, 1.00000E-00, 0.00000E+00,l};
+Point(7) = { 1.00000E+00, 0.00000E-00, 0.00000E+00,l};
+
+Line(1) = Liste[2,6];
+Line(2) = Liste[6,5];
+Line(3) = Liste[5,7];
+Line(4) = Liste[7,4];
+Line(5) = Liste[4,1];
+Line(6) = Liste[1,2];
+Line Loop(7) = Liste[3,4,5,6,1,2];
+Plane Surface(8) = Liste[7];
+Extrude ( 8, { 0.00000E+00, 0.00000E+00, 1.00000E+00} );
+Line(35) = Liste[6,3];
+Line(36) = Liste[3,7];
+Line Loop(37) = Liste[3,-36,-35,2];
+Plane Surface(38) = Liste[37];
+Extrude ( 38, { 0.00000E+00, 0.00000E+00,-1.00000E+00} );
+Extrude ( 8, { 0.00000E+00, 0.00000E+00,-1.00000E+00} );
+Surface Loop(80) = Liste[56,-79,-68,22,25,-71,-74,28,31,-76,-53,-38,19,34,33,-50];
+Complex Volume(81) = Liste[80];
diff --git a/examples/tooth.geo b/examples/tooth.geo
new file mode 100644
index 0000000000000000000000000000000000000000..726b24fe9889d4af6dafa754f9c0820dc010d9c1
--- /dev/null
+++ b/examples/tooth.geo
@@ -0,0 +1,190 @@
+
+dT1 = 10.e-3 ;
+dT2 = 10.e-3 ;
+dT3 = 10.e-3 ;
+
+lT1 = 10.e-3 ;
+lT2 = 10.e-3 ;
+lT3 = 10.e-3 ;
+
+e = 0.65e-3/2. ;
+
+
+pp = 4.99e-3 ;
+
+p0 = pp ;
+pT1 = pp ;  pT2 = pp ;  pT3 = pp ;
+pT13 = pp ; pT23 = pp ;
+
+
+Point(1) = { -dT3/2.,0,0,p0};
+
+Point(2) = { -dT3/2.-lT1,   0, 0, pT1};
+Point(3) = { -dT3/2.-lT1, dT1, 0, pT1};
+
+Point(4) = { -dT3/2., dT1    , 0, pT13};
+
+Point(5) = { -dT3/2., dT1+lT3, 0, pT3};
+Point(6) = {  dT3/2., dT1+lT3, 0, pT3};
+
+Point(7) = {  dT3/2., dT2    , 0, pT23};
+
+Point(8) = {  dT3/2.+lT2, dT2, 0, pT2};
+Point(9) = {  dT3/2.+lT2,   0, 0, pT2};
+
+Point(10) = { dT3/2.,0,0,p0};
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {4,1};
+Line(5) = {1,10};
+Line(6) = {10,7};
+Line(7) = {7,4};
+Line(8) = {4,5};
+Line(9) = {5,6};
+Line(10) = {6,7};
+Line(11) = {7,8};
+Line(12) = {8,9};
+Line(13) = {9,10};
+Line Loop(14) = {1,2,3,4};
+Plane Surface(15) = {14};
+Line Loop(16) = {11,12,13,6};
+Plane Surface(17) = {16};
+Line Loop(18) = {8,9,10,7};
+Plane Surface(19) = {18};
+Line Loop(20) = {5,6,7,4};
+Plane Surface(21) = {20};
+Translate({0,0,e}) {
+  Duplicata { Surface(15); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(21); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(17); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(19); }
+}
+Coherence;
+Line(46) = {2,12};
+Line(47) = {3,14};
+Line(48) = {1,11};
+Line(49) = {4,16};
+Line(50) = {5,26};
+Line(51) = {6,28};
+Line(52) = {7,20};
+Line(53) = {10,18};
+Line(54) = {9,24};
+Line(55) = {8,22};
+
+Line Loop(56) = {23,-47,-2,46};
+Plane Surface(57) = {56};
+Line Loop(58) = {22,-46,-1,48};
+Plane Surface(59) = {58};
+Line Loop(60) = {-49,-3,47,24};
+Plane Surface(61) = {60};
+Line Loop(62) = {-25,-49,4,48};
+Plane Surface(63) = {62};
+Line Loop(64) = {40,-50,-8,49};
+Plane Surface(65) = {64};
+Line Loop(66) = {41,-51,-9,50};
+Plane Surface(67) = {66};
+Line Loop(68) = {-42,-51,10,52};
+Plane Surface(69) = {68};
+Line Loop(70) = {-30,-52,7,49};
+Plane Surface(71) = {70};
+Line Loop(72) = {28,-53,-5,48};
+Plane Surface(73) = {72};
+Line Loop(74) = {29,-52,-6,53};
+Plane Surface(75) = {74};
+Line Loop(76) = {34,-55,-11,52};
+Plane Surface(77) = {76};
+Line Loop(78) = {36,-53,-13,54};
+Plane Surface(79) = {78};
+Line Loop(80) = {-35,-55,12,54};
+Plane Surface(81) = {80};
+Surface Loop(82) = {63,27,-59,-57,-61,-15};
+Complex Volume(83) = {82};
+Surface Loop(84) = {75,-39,77,-81,17,79};
+Complex Volume(85) = {84};
+Surface Loop(86) = {71,45,-65,-67,69,-19};
+Complex Volume(87) = {86};
+Surface Loop(88) = {71,33,-73,-75,-21,63};
+Complex Volume(89) = {88};
+
+/* selon e */
+
+Transfinite Line {-46,-48,-53,-54,-47,-49,-52,-55,-50,-51}
+  = 8 Using Power 1.2 ;
+
+/* vers les angles */
+
+Transfinite Line {-3,-24,1,22, 11,34,-13,-36,  8,40,-10,-42}
+  = 11 Using Power 1.4 ;
+
+/* selon y pour f1 et f2 */
+
+Transfinite Line {-2,-23,4,25,-6,-29,12,35}
+  = 11 Using Bump -1.4 ;
+
+/* selon x pour f3 */
+
+Transfinite Line {9,41,7,30,5,28}
+  = 11 Using Bump -1.4 ;
+
+
+Transfinite Surface {15} = {1,2,3,4} ;
+Transfinite Surface {27} = {11,12,14,16} ;
+
+Transfinite Surface {17} = {9,10,7,8} ;
+Transfinite Surface {39} = {24,18,20,22} ;
+
+Transfinite Surface {19} = {7,4,5,6} ;
+Transfinite Surface {45} = {20,16,26,28} ;
+
+Transfinite Surface {21} = {10,1,4,7} ;
+Transfinite Surface {33} = {18,11,16,20} ;
+
+Transfinite Surface {57} = {2,12,14,3} ;
+Transfinite Surface {63} = {1,11,16,4} ;
+Transfinite Surface {75} = {10,18,20,7} ;
+Transfinite Surface {81} = {9,24,22,8} ;
+Transfinite Surface {65} = {4,16,26,5} ;
+Transfinite Surface {69} = {7,20,28,6} ;
+
+Transfinite Surface {59} = {12,11,1,2} ;
+Transfinite Surface {61} = {14,16,4,3} ;
+
+Transfinite Surface {73} = {11,18,10,1} ;
+Transfinite Surface {71} = {16,20,7,4} ;
+Transfinite Surface {67} = {26,28,6,5} ;
+
+Transfinite Surface {79} = {18,24,9,10} ;
+Transfinite Surface {77} = {20,22,8,7} ;
+
+
+Recombine Surface {15,27,17,39,19,45,21,33,57,63,75,81,59,61,73,71,67,79,77,65,69} ;
+
+
+Transfinite Volume {83} = {1,2,12,11,4,3,14,16} ;
+Transfinite Volume {85} = {9,10,18,24,8,7,20,22} ;
+Transfinite Volume {87} = {7,4,16,20,6,5,26,28} ;
+Transfinite Volume {89} = {10,1,11,18,7,4,16,20} ;
+
+
+Physical Volume(101) = {83,85,87,89} ;  /* Tooth */
+
+Physical Line(2001) = { 2,47,23,46} ; /* LineFlux1 */
+Physical Line(2002) = {55,12,54,35} ; /* LineFlux2 */
+Physical Line(2003) = { 9,51,41,50} ; /* LineFlux3 */
+
+Physical Surface(1001) = {57} ;  /* Flux1 */
+Physical Surface(1002) = {81} ;  /* Flux2 */
+Physical Surface(1003) = {67} ;  /* Flux3 */
+
+Physical Surface(1100) = {27,33,39, 59,73,79, 61,65,45,69,77} ;  /* SkinTooth */
diff --git a/examples/tooth2.geo b/examples/tooth2.geo
new file mode 100644
index 0000000000000000000000000000000000000000..5a31717843edefe6bc8e3cf4d541d1d95f2ebfaa
--- /dev/null
+++ b/examples/tooth2.geo
@@ -0,0 +1,135 @@
+
+dT1 = 10.e-3 ;
+dT2 = 10.e-3 ;
+dT3 = 10.e-3 ;
+
+lT1 = 10.e-3 ;
+lT2 = 10.e-3 ;
+lT3 = 10.e-3 ;
+
+e = 0.65e-2/2. ;
+
+
+pp = 4.99e-3 ;
+
+p0 = pp ;
+pT1 = pp ;  pT2 = pp ;  pT3 = pp ;
+pT13 = pp ; pT23 = pp ;
+
+
+Point(1) = { -dT3/2.,0,0,p0};
+
+Point(2) = { -dT3/2.-lT1,   0, 0, pT1};
+Point(3) = { -dT3/2.-lT1, dT1, 0, pT1};
+
+Point(4) = { -dT3/2., dT1    , 0, pT13};
+
+Point(5) = { -dT3/2., dT1+lT3, 0, pT3};
+Point(6) = {  dT3/2., dT1+lT3, 0, pT3};
+
+Point(7) = {  dT3/2., dT2    , 0, pT23};
+
+Point(8) = {  dT3/2.+lT2, dT2, 0, pT2};
+Point(9) = {  dT3/2.+lT2,   0, 0, pT2};
+
+Point(10) = { dT3/2.,0,0,p0};
+
+Line(1) = {1,2};
+Line(2) = {2,3};
+Line(3) = {3,4};
+Line(4) = {4,1};
+Line(5) = {1,10};
+Line(6) = {10,7};
+Line(7) = {7,4};
+Line(8) = {4,5};
+Line(9) = {5,6};
+Line(10) = {6,7};
+Line(11) = {7,8};
+Line(12) = {8,9};
+Line(13) = {9,10};
+Line Loop(14) = {1,2,3,4};
+Plane Surface(15) = {14};
+Line Loop(16) = {11,12,13,6};
+Plane Surface(17) = {16};
+Line Loop(18) = {8,9,10,7};
+Plane Surface(19) = {18};
+Line Loop(20) = {5,6,7,4};
+Plane Surface(21) = {20};
+Translate({0,0,e}) {
+  Duplicata { Surface(15); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(21); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(17); }
+}
+Coherence;
+Translate({0,0,e}) {
+  Duplicata { Surface(19); }
+}
+Coherence;
+Line(46) = {2,12};
+Line(47) = {3,14};
+Line(48) = {1,11};
+Line(49) = {4,16};
+Line(50) = {5,26};
+Line(51) = {6,28};
+Line(52) = {7,20};
+Line(53) = {10,18};
+Line(54) = {9,24};
+Line(55) = {8,22};
+
+Line Loop(56) = {23,-47,-2,46};
+Plane Surface(57) = {56};
+Line Loop(58) = {22,-46,-1,48};
+Plane Surface(59) = {58};
+Line Loop(60) = {-49,-3,47,24};
+Plane Surface(61) = {60};
+Line Loop(62) = {-25,-49,4,48};
+Plane Surface(63) = {62};
+Line Loop(64) = {40,-50,-8,49};
+Plane Surface(65) = {64};
+Line Loop(66) = {41,-51,-9,50};
+Plane Surface(67) = {66};
+Line Loop(68) = {-42,-51,10,52};
+Plane Surface(69) = {68};
+Line Loop(70) = {-30,-52,7,49};
+Plane Surface(71) = {70};
+Line Loop(72) = {28,-53,-5,48};
+Plane Surface(73) = {72};
+Line Loop(74) = {29,-52,-6,53};
+Plane Surface(75) = {74};
+Line Loop(76) = {34,-55,-11,52};
+Plane Surface(77) = {76};
+Line Loop(78) = {36,-53,-13,54};
+Plane Surface(79) = {78};
+Line Loop(80) = {-35,-55,12,54};
+Plane Surface(81) = {80};
+Surface Loop(82) = {63,27,-59,-57,-61,-15};
+Complex Volume(83) = {82};
+Surface Loop(84) = {75,-39,77,-81,17,79};
+Complex Volume(85) = {84};
+Surface Loop(86) = {71,45,-65,-67,69,-19};
+Complex Volume(87) = {86};
+Surface Loop(88) = {71,33,-73,-75,-21,63};
+Complex Volume(89) = {88};
+
+nbpts1 = 1.0;
+
+Transfinite Line{46,47,49,48,53,52,50,51,55,54} = nbpts1 Using Power 1.0;
+
+nbpts2 = 10;
+Transfinite Line{9,41,7,30,3,24,11,34,13,36,5,28,1,22} = nbpts2 Using Power 1.0;
+nbpts3 = 15;
+Transfinite Line{2,23,4,25,8,40,10,42,6,29,12,35} = nbpts3 Using Power 1.0;
+Transfinite Surface{27} = {12,11,16,14};
+Transfinite Surface{33} = {11,18,20,16};
+Transfinite Surface{39} = {18,24,22,20};
+Transfinite Surface{15} = {2,1,4,3};
+Transfinite Surface{21} = {1,10,7,4};
+Transfinite Surface{17} = {10,9,8,7};
+Transfinite Surface{45} = {16,20,28,26};
+Transfinite Surface{19} = {4,7,6,5};
diff --git a/examples/tr3d.geo b/examples/tr3d.geo
new file mode 100644
index 0000000000000000000000000000000000000000..0d46b26e43476457023d463b889a029dec479ad1
--- /dev/null
+++ b/examples/tr3d.geo
@@ -0,0 +1,20 @@
+Point(1) = {0,0,0,.2}; 
+Point(2) = {0,1,0,.2}; 
+Point(3) = {1,0,0,.2}; 
+Point(4) = {0,0,.5,.2};
+
+Line(7) = {3,4};
+Circle(8) = {3,1,2};
+Line(9) = {1,3};
+Line(10) = {1,4};
+Line(11) = {1,2};
+Line(12) = {4,2};
+
+Line Loop(13) = {9,8,-11};
+Plane Surface(14) = {13};
+Line Loop(15) = {10,12,-11};
+Plane Surface(16) = {15};
+Line Loop(17) = {-8,7,12};
+Ruled Surface(18) = {17};
+Line Loop(19) = {-10,9,7};
+Plane Surface(20) = {19};
diff --git a/examples/transfini.geo b/examples/transfini.geo
new file mode 100644
index 0000000000000000000000000000000000000000..fe185cd0ff032edd9104e104b8418da90521840b
--- /dev/null
+++ b/examples/transfini.geo
@@ -0,0 +1,33 @@
+l = .3;
+Point(1) = {-2,-1,0,l};
+Point(2) = {-2,1,0,l};
+Point(3) = {0,-1,0,l};
+Point(4) = {0,1,0,l};
+Point(5) = {-3,-2,0,l};
+Point(6) = {-3,2,0,l};
+Point(7) = {1,-2,0,l};
+Point(8) = {1,2,0,l};
+
+Line(1) = {6,8};
+Line(2) = {8,7};
+Line(3) = {7,5};
+Line(4) = {5,6};
+Line(5) = {2,1};
+Line(6) = {1,3};
+Line(7) = {3,4};
+Line(8) = {4,2};
+
+Loop(9) = {5,6,7,8};
+Plane Surface(10) = {9};
+
+Loop(11) = {2,3,4,1};
+Plane Surface(12) = {11,9};
+
+Transfinite Line 5 = 10 Using Power 1;
+Transfinite Line 7 = 10 Using Power 1;
+Transfinite Line 6 = 10 Using Power 1;
+Transfinite Line 8 = 10 Using Power 1;
+
+
+Recombine Surface {10} = 30;
+
diff --git a/examples/tt.geo b/examples/tt.geo
new file mode 100644
index 0000000000000000000000000000000000000000..c877f1fcb1eb7b54e01d582b0329da6dbb0914ec
--- /dev/null
+++ b/examples/tt.geo
@@ -0,0 +1,41 @@
+l = 1;
+Point(1) = {-2,-1,0,l};
+Point(2) = {-2,1,0,l};
+Point(3) = {0,-1,0,l};
+Point(4) = {0,1,0,l};
+Point(5) = {-3,-2,0,l};
+Point(6) = {-3,2,0,l};
+Point(7) = {1,-2,0,l};
+Point(8) = {1,2,0,l};
+
+Line(1) = {6,8};
+Line(2) = {8,7};
+Line(3) = {7,5};
+Line(4) = {5,6};
+Line(5) = {2,1};
+Line(6) = {1,3};
+Line(7) = {3,4};
+Line(8) = {4,2};
+
+/*
+Loop(9) = {5,6,7,8};
+Plane Surface(10) = {9};
+
+Loop(11) = {2,3,4,1};
+Plane Surface(12) = {11,9};
+
+
+Transfinite Line {5,6,7,8} = 3;
+
+Physical Point(9999) = {2};
+
+Physical Line(2222) = {6,7};
+Physical Line(3333) = {-7,-6};
+
+Physical Association(111111)= {3333,2222};
+*/
+
+Line Loop(9) = {5,6,7,8};
+Plane Surface(10) = {9};
+
+Physical Surface(1111) = 10 ;
diff --git a/examples/tt4.geo b/examples/tt4.geo
new file mode 100644
index 0000000000000000000000000000000000000000..c0c7314aba4f2fa8c96c6f3d6a02901e3c63dde4
--- /dev/null
+++ b/examples/tt4.geo
@@ -0,0 +1,66 @@
+Point(1) = {0.0,0.0,0.0,1.0};
+Point(2) = {1,0.0,0.0,1.0};
+Point(3) = {.5,.1,0.0,1.0};
+Point(4) = {.5,.2,0.0,1.0};
+Point(5) = {0,.5,0.0,1.0};
+Point(6) = {1,.55,0.0,1.0};
+Point(7) = {0,0,1,1.0};
+
+Line(1) = {2,6};
+Line(2) = {5,1};
+Spline(3) = {1,3,2};
+Spline(4) = {5,4,6};
+
+Line Loop(5) = {-1,-3,-2,4};
+Plane Surface(6) = {5};
+
+Point(8) = {0,.5,1,1.0};
+Point(9) = {1,.5,1,1.0};
+Point(10) = {1,0,1,1.0};
+
+Line(7) = {6,9};
+Line(8) = {9,10};
+Line(9) = {10,2};
+Line(10) = {10,7};
+Line(11) = {7,1};
+Line(12) = {5,8};
+Line(13) = {8,7};
+Line(14) = {8,9};
+
+Line Loop(15) = {14,-7,-4,12};
+Ruled Surface(16) = {15};
+Line Loop(17) = {7,8,9,1};
+Ruled Surface(18) = {17};
+Line Loop(19) = {-10,-8,-14,13};
+Ruled Surface(20) = {19};
+Line Loop(21) = {-11,-13,-12,2};
+Ruled Surface(22) = {21};
+Line Loop(23) = {-9,10,11,3};
+Ruled Surface(24) = {23};
+
+Surface Loop(25) = {16,20,24,18,6,22};
+Complex Volume(26) = {25};
+
+Transfinite Line {7,9,11,12} = 5;
+Transfinite Line {3,10,14} = 10;
+Transfinite Line {4} = 10 Using Bump 1.5;
+Transfinite Line {-1,2} = 20 Using Power 1.6;
+Transfinite Line {8,13} = 20 ;
+
+Transfinite Surface {6} = {1,2,6,5};
+Transfinite Surface {20} = {7,10,9,8};
+Transfinite Surface {18} = {10,2,6,9};
+Transfinite Surface {22} = {7,1,5,8};
+Transfinite Surface {16} = {8,9,6,5};
+Transfinite Surface {24} = {7,10,2,1};
+
+Transfinite Volume {26} = {7,10,2,1,8,9,6,5};
+
+Recombine Surface {6,20,18,22,16,24};
+
+
+
+
+
+
+
diff --git a/examples/tt5.geo b/examples/tt5.geo
new file mode 100644
index 0000000000000000000000000000000000000000..175d08f926246ca213fcf86e7abe7f0d4a8160a5
--- /dev/null
+++ b/examples/tt5.geo
@@ -0,0 +1,25 @@
+Point(1) = {0.0,0.0,0.0,1.0};
+Point(2) = {1,0.0,0.0,1.0};
+Point(3) = {.5,.1,0.0,1.0};
+Point(4) = {.5,.2,0.0,1.0};
+Point(5) = {0,.5,0.0,1.0};
+Point(6) = {1,.55,0.0,1.0};
+Point(7) = {0,0,1,1.0};
+
+Line(1) = {2,6};
+Line(2) = {5,1};
+Spline(3) = {1,3,2};
+Spline(4) = {5,4,6};
+
+Point(8) = {0,.5,1,1.0};
+Point(9) = {1,.5,1,1.0};
+Point(10) = {1,0,1,1.0};
+
+Line(7) = {6,9};
+Line(8) = {9,10};
+Line(9) = {10,2};
+Line(10) = {10,7};
+Line(11) = {7,1};
+Line(12) = {5,8};
+Line(13) = {8,7};
+Line(14) = {8,9};
diff --git a/examples/wing.geo b/examples/wing.geo
new file mode 100644
index 0000000000000000000000000000000000000000..08a58cb40363c62a10ecd61f4797c6cda2bf354f
--- /dev/null
+++ b/examples/wing.geo
@@ -0,0 +1,1081 @@
+scale = 100 ;
+
+lc1 = 5.e-3 *scale ;
+lc2 = 1.e-2 *scale ;
+lc3 = 10 *scale ;
+
+/* l'aile */
+Point(3895) = {1.177410e-02*scale,-2.768003e-03*scale,0*scale,lc1};
+Point(3897) = {1.081196e-02*scale,-3.794565e-03*scale,0*scale,lc1};
+Point(3896) = {1.040081e-02*scale,-4.225326e-03*scale,0*scale,lc1};
+Point(3968) = {9.501183e-03*scale,-5.167856e-03*scale,0*scale,lc1};
+Point(3995) = {8.172335e-03*scale,-6.541147e-03*scale,0*scale,lc1};
+Point(4003) = {6.820756e-03*scale,-7.914438e-03*scale,0*scale,lc1};
+Point(3857) = {5.454371e-03*scale,-9.287729e-03*scale,0*scale,lc1};
+Point(3856) = {3.534352e-03*scale,-1.119762e-02*scale,0*scale,lc1};
+Point(3860) = {7.877699e-04*scale,-1.389559e-02*scale,0*scale,lc1};
+Point(3861) = {-1.958812e-03*scale,-1.658843e-02*scale,0*scale,lc1};
+Point(3863) = {-4.705394e-03*scale,-1.930092e-02*scale,0*scale,lc1};
+Point(3864) = {-7.451976e-03*scale,-2.206110e-02*scale,0*scale,lc1};
+Point(3865) = {-1.019856e-02*scale,-2.490134e-02*scale,0*scale,lc1};
+Point(3866) = {-1.294514e-02*scale,-2.785668e-02*scale,0*scale,lc1};
+Point(3867) = {-1.569172e-02*scale,-3.097311e-02*scale,0*scale,lc1};
+Point(3868) = {-1.819787e-02*scale,-3.400697e-02*scale,0*scale,lc1};
+Point(3869) = {-1.843830e-02*scale,-3.430929e-02*scale,0*scale,lc1};
+Point(3870) = {-2.032098e-02*scale,-3.675355e-02*scale,0*scale,lc1};
+Point(3871) = {-2.233602e-02*scale,-3.950013e-02*scale,0*scale,lc1};
+Point(3872) = {-2.428062e-02*scale,-4.224671e-02*scale,0*scale,lc1};
+Point(3977) = {-2.615522e-02*scale,-4.499330e-02*scale,0*scale,lc1};
+Point(3877) = {-2.795526e-02*scale,-4.773988e-02*scale,0*scale,lc1};
+Point(3876) = {-2.966457e-02*scale,-5.048646e-02*scale,0*scale,lc1};
+Point(3878) = {-3.128951e-02*scale,-5.323304e-02*scale,0*scale,lc1};
+Point(3934) = {-3.282722e-02*scale,-5.597962e-02*scale,0*scale,lc1};
+Point(3873) = {-3.427526e-02*scale,-5.872621e-02*scale,0*scale,lc1};
+Point(3874) = {-3.563187e-02*scale,-6.147279e-02*scale,0*scale,lc1};
+Point(3875) = {-3.689577e-02*scale,-6.421937e-02*scale,0*scale,lc1};
+Point(3935) = {-3.803475e-02*scale,-6.696595e-02*scale,0*scale,lc1};
+Point(3880) = {-3.906585e-02*scale,-6.971253e-02*scale,0*scale,lc1};
+Point(3879) = {-3.999980e-02*scale,-7.245912e-02*scale,0*scale,lc1};
+Point(3881) = {-4.084348e-02*scale,-7.520570e-02*scale,0*scale,lc1};
+Point(3936) = {-4.159737e-02*scale,-7.795228e-02*scale,0*scale,lc1};
+Point(3882) = {-4.219350e-02*scale,-8.069886e-02*scale,0*scale,lc1};
+Point(3883) = {-4.268262e-02*scale,-8.344544e-02*scale,0*scale,lc1};
+Point(3885) = {-4.302180e-02*scale,-8.619203e-02*scale,0*scale,lc1};
+Point(3884) = {-4.315754e-02*scale,-8.815942e-02*scale,0*scale,lc1};
+Point(1218) = {-4.315754e-02*scale,-8.893861e-02*scale,0*scale,lc1};
+Point(3933) = {-4.315754e-02*scale,-8.955185e-02*scale,0*scale,lc1};
+Point(3996) = {-4.314894e-02*scale,-9.031190e-02*scale,0*scale,lc1};
+Point(3989) = {-4.310538e-02*scale,-9.168519e-02*scale,0*scale,lc1};
+Point(3990) = {-4.298693e-02*scale,-9.305848e-02*scale,0*scale,lc1};
+Point(3978) = {-4.281442e-02*scale,-9.443177e-02*scale,0*scale,lc1};
+Point(3979) = {-4.254831e-02*scale,-9.580506e-02*scale,0*scale,lc1};
+Point(3974) = {-4.215142e-02*scale,-9.717835e-02*scale,0*scale,lc1};
+Point(3973) = {-4.166490e-02*scale,-9.855164e-02*scale,0*scale,lc1};
+Point(3963) = {-4.107412e-02*scale,-9.992494e-02*scale,0*scale,lc1};
+Point(3947) = {-4.041096e-02*scale,-1.011964e-01*scale,0*scale,lc1};
+Point(3948) = {-4.035707e-02*scale,-1.012982e-01*scale,0*scale,lc1};
+Point(3904) = {-3.903767e-02*scale,-1.033356e-01*scale,0*scale,lc1};
+Point(3903) = {-3.766438e-02*scale,-1.048133e-01*scale,0*scale,lc1};
+Point(3946) = {-3.629109e-02*scale,-1.058804e-01*scale,0*scale,lc1};
+Point(3902) = {-3.491780e-02*scale,-1.066897e-01*scale,0*scale,lc1};
+Point(3901) = {-3.354451e-02*scale,-1.073184e-01*scale,0*scale,lc1};
+Point(3900) = {-3.217121e-02*scale,-1.078168e-01*scale,0*scale,lc1};
+Point(3908) = {-3.079792e-02*scale,-1.081973e-01*scale,0*scale,lc1};
+Point(3907) = {-2.942463e-02*scale,-1.084688e-01*scale,0*scale,lc1};
+Point(3951) = {-2.805134e-02*scale,-1.086029e-01*scale,0*scale,lc1};
+Point(3950) = {-2.667805e-02*scale,-1.086423e-01*scale,0*scale,lc1};
+Point(3847) = {-2.580700e-02*scale,-1.086440e-01*scale,0*scale,lc1};
+Point(3949) = {-2.667805e-02*scale,-1.088853e-01*scale,0*scale,lc1};
+Point(3952) = {-2.805134e-02*scale,-1.092658e-01*scale,0*scale,lc1};
+Point(3905) = {-2.942463e-02*scale,-1.096463e-01*scale,0*scale,lc1};
+Point(3906) = {-3.079792e-02*scale,-1.100268e-01*scale,0*scale,lc1};
+Point(3909) = {-3.217121e-02*scale,-1.104020e-01*scale,0*scale,lc1};
+Point(3969) = {-3.354451e-02*scale,-1.107749e-01*scale,0*scale,lc1};
+Point(3970) = {-3.491780e-02*scale,-1.111477e-01*scale,0*scale,lc1};
+Point(3997) = {-3.629109e-02*scale,-1.115205e-01*scale,0*scale,lc1};
+Point(3998) = {-3.766438e-02*scale,-1.118690e-01*scale,0*scale,lc1};
+Point(4004) = {-3.903767e-02*scale,-1.122095e-01*scale,0*scale,lc1};
+Point(3959) = {-4.041096e-02*scale,-1.125499e-01*scale,0*scale,lc1};
+Point(3960) = {-4.315754e-02*scale,-1.131897e-01*scale,0*scale,lc1};
+Point(3972) = {-4.590412e-02*scale,-1.137699e-01*scale,0*scale,lc1};
+Point(3984) = {-4.865071e-02*scale,-1.143079e-01*scale,0*scale,lc1};
+Point(3988) = {-5.139729e-02*scale,-1.147970e-01*scale,0*scale,lc1};
+Point(3961) = {-5.414387e-02*scale,-1.152035e-01*scale,0*scale,lc1};
+Point(3962) = {-5.689045e-02*scale,-1.155501e-01*scale,0*scale,lc1};
+Point(3937) = {-5.963703e-02*scale,-1.157358e-01*scale,0*scale,lc1};
+Point(3938) = {-6.238362e-02*scale,-1.158519e-01*scale,0*scale,lc1};
+Point(3886) = {-6.513020e-02*scale,-1.158332e-01*scale,0*scale,lc1};
+Point(3887) = {-6.787678e-02*scale,-1.156607e-01*scale,0*scale,lc1};
+Point(3888) = {-7.062336e-02*scale,-1.152790e-01*scale,0*scale,lc1};
+Point(3993) = {-7.199665e-02*scale,-1.150098e-01*scale,0*scale,lc1};
+Point(3994) = {-7.336994e-02*scale,-1.146075e-01*scale,0*scale,lc1};
+Point(3971) = {-7.474324e-02*scale,-1.141776e-01*scale,0*scale,lc1};
+Point(3918) = {-7.611653e-02*scale,-1.135965e-01*scale,0*scale,lc1};
+Point(3919) = {-7.748982e-02*scale,-1.129165e-01*scale,0*scale,lc1};
+Point(3920) = {-7.886311e-02*scale,-1.121014e-01*scale,0*scale,lc1};
+Point(3956) = {-8.023640e-02*scale,-1.111186e-01*scale,0*scale,lc1};
+Point(3955) = {-8.047561e-02*scale,-1.109113e-01*scale,0*scale,lc1};
+Point(3965) = {-8.160969e-02*scale,-1.098434e-01*scale,0*scale,lc1};
+Point(3966) = {-8.189452e-02*scale,-1.095380e-01*scale,0*scale,lc1};
+Point(3910) = {-8.297356e-02*scale,-1.081647e-01*scale,0*scale,lc1};
+Point(3913) = {-8.376570e-02*scale,-1.067914e-01*scale,0*scale,lc1};
+Point(3912) = {-8.435627e-02*scale,-1.054263e-01*scale,0*scale,lc1};
+Point(3911) = {-8.435982e-02*scale,-1.054181e-01*scale,0*scale,lc1};
+Point(3914) = {-8.478803e-02*scale,-1.040448e-01*scale,0*scale,lc1};
+Point(3915) = {-8.503641e-02*scale,-1.026715e-01*scale,0*scale,lc1};
+Point(3916) = {-8.516945e-02*scale,-1.012982e-01*scale,0*scale,lc1};
+Point(3917) = {-8.522183e-02*scale,-9.992494e-02*scale,0*scale,lc1};
+Point(3953) = {-8.512327e-02*scale,-9.855164e-02*scale,0*scale,lc1};
+Point(3954) = {-8.495463e-02*scale,-9.717835e-02*scale,0*scale,lc1};
+Point(3964) = {-8.467545e-02*scale,-9.580506e-02*scale,0*scale,lc1};
+Point(3975) = {-8.433113e-02*scale,-9.443177e-02*scale,0*scale,lc1};
+Point(3992) = {-8.387660e-02*scale,-9.305848e-02*scale,0*scale,lc1};
+Point(3991) = {-8.341194e-02*scale,-9.168519e-02*scale,0*scale,lc1};
+Point(3999) = {-8.280629e-02*scale,-9.031190e-02*scale,0*scale,lc1};
+Point(3939) = {-8.220063e-02*scale,-8.893861e-02*scale,0*scale,lc1};
+Point(3967) = {-8.076693e-02*scale,-8.619203e-02*scale,0*scale,lc1};
+Point(3987) = {-7.916546e-02*scale,-8.344544e-02*scale,0*scale,lc1};
+Point(3985) = {-7.886311e-02*scale,-8.298081e-02*scale,0*scale,lc1};
+Point(3986) = {-7.737820e-02*scale,-8.069886e-02*scale,0*scale,lc1};
+Point(4002) = {-7.542111e-02*scale,-7.795228e-02*scale,0*scale,lc1};
+Point(3922) = {-7.335979e-02*scale,-7.520570e-02*scale,0*scale,lc1};
+Point(4005) = {-7.112105e-02*scale,-7.245912e-02*scale,0*scale,lc1};
+Point(3851) = {-6.873828e-02*scale,-6.971253e-02*scale,0*scale,lc1};
+Point(3850) = {-6.372231e-02*scale,-6.421937e-02*scale,0*scale,lc1};
+Point(3853) = {-5.963703e-02*scale,-6.001430e-02*scale,0*scale,lc1};
+Point(3852) = {-5.414387e-02*scale,-5.469298e-02*scale,0*scale,lc1};
+Point(3849) = {-4.865071e-02*scale,-4.961204e-02*scale,0*scale,lc1};
+Point(3848) = {-4.315754e-02*scale,-4.465740e-02*scale,0*scale,lc1};
+Point(3921) = {-3.766438e-02*scale,-3.985542e-02*scale,0*scale,lc1};
+Point(3983) = {-3.491780e-02*scale,-3.750843e-02*scale,0*scale,lc1};
+Point(3982) = {-3.217121e-02*scale,-3.519259e-02*scale,0*scale,lc1};
+Point(3976) = {-2.942463e-02*scale,-3.289435e-02*scale,0*scale,lc1};
+Point(3929) = {-2.744807e-02*scale,-3.126039e-02*scale,0*scale,lc1};
+Point(3958) = {-2.667805e-02*scale,-3.062383e-02*scale,0*scale,lc1};
+Point(3928) = {-2.411032e-02*scale,-2.851380e-02*scale,0*scale,lc1};
+Point(3957) = {-2.393147e-02*scale,-2.836765e-02*scale,0*scale,lc1};
+Point(3927) = {-2.118489e-02*scale,-2.612321e-02*scale,0*scale,lc1};
+Point(3926) = {-1.843830e-02*scale,-2.390843e-02*scale,0*scale,lc1};
+Point(3925) = {-1.569172e-02*scale,-2.170681e-02*scale,0*scale,lc1};
+Point(3924) = {-1.294514e-02*scale,-1.952576e-02*scale,0*scale,lc1};
+Point(3932) = {-1.040573e-02*scale,-1.752748e-02*scale,0*scale,lc1};
+Point(3931) = {-1.019856e-02*scale,-1.736495e-02*scale,0*scale,lc1};
+Point(3930) = {-7.451976e-03*scale,-1.521330e-02*scale,0*scale,lc1};
+Point(3923) = {-4.705394e-03*scale,-1.307794e-02*scale,0*scale,lc1};
+Point(3862) = {-1.958812e-03*scale,-1.095092e-02*scale,0*scale,lc1};
+Point(3859) = {1.960946e-04*scale,-9.287729e-03*scale,0*scale,lc1};
+Point(3858) = {7.877699e-04*scale,-8.831063e-03*scale,0*scale,lc1};
+Point(3855) = {3.534352e-03*scale,-6.728705e-03*scale,0*scale,lc1};
+Point(3854) = {6.280934e-03*scale,-4.633175e-03*scale,0*scale,lc1};
+Point(3945) = {7.386845e-03*scale,-3.794565e-03*scale,0*scale,lc1};
+Point(3944) = {7.654225e-03*scale,-3.591811e-03*scale,0*scale,lc1};
+Point(3899) = {9.027516e-03*scale,-2.550448e-03*scale,0*scale,lc1};
+Point(3898) = {1.040081e-02*scale,-1.509310e-03*scale,0*scale,lc1};
+Point(3894) = {1.177410e-02*scale,-4.686545e-04*scale,0*scale,lc1};
+Point(3890) = {1.282184e-02*scale,3.253082e-04*scale,0*scale,lc1};
+Point(3893) = {1.314739e-02*scale,5.720012e-04*scale,0*scale,lc1};
+Point(3941) = {1.463351e-02*scale,1.698599e-03*scale,0*scale,lc1};
+Point(4000) = {1.644012e-02*scale,3.071890e-03*scale,0*scale,lc1};
+Point(3980) = {1.824674e-02*scale,4.445181e-03*scale,0*scale,lc1};
+Point(3846) = {1.892400e-02*scale,4.960000e-03*scale,0*scale,lc1};
+Point(3981) = {1.843389e-02*scale,4.445181e-03*scale,0*scale,lc1};
+Point(4001) = {1.712649e-02*scale,3.071890e-03*scale,0*scale,lc1};
+Point(3942) = {1.584524e-02*scale,1.698599e-03*scale,0*scale,lc1};
+Point(3940) = {1.460138e-02*scale,3.253082e-04*scale,0*scale,lc1};
+Point(3889) = {1.452068e-02*scale,2.362167e-04*scale,0*scale,lc1};
+Point(3892) = {1.335131e-02*scale,-1.047983e-03*scale,0*scale,lc1};
+Point(3891) = {1.314739e-02*scale,-1.270371e-03*scale,0*scale,lc1};
+Point(3943) = {1.209204e-02*scale,-2.421274e-03*scale,0*scale,lc1};
+Point(4063) = {4.498368e-02*scale,-9.287729e-03*scale,0*scale,lc1};
+Point(4062) = {4.610574e-02*scale,-6.541147e-03*scale,0*scale,lc1};
+Point(4061) = {4.755089e-02*scale,-3.794565e-03*scale,0*scale,lc1};
+Point(4114) = {4.934166e-02*scale,-1.047983e-03*scale,0*scale,lc1};
+Point(4153) = {5.143154e-02*scale,1.698599e-03*scale,0*scale,lc1};
+Point(4178) = {5.390637e-02*scale,4.445181e-03*scale,0*scale,lc1};
+Point(4179) = {5.571941e-02*scale,6.252892e-03*scale,0*scale,lc1};
+Point(4191) = {5.846599e-02*scale,8.699713e-03*scale,0*scale,lc1};
+Point(4203) = {6.121257e-02*scale,1.103796e-02*scale,0*scale,lc1};
+Point(4109) = {6.350284e-02*scale,1.268493e-02*scale,0*scale,lc1};
+Point(4202) = {6.670574e-02*scale,1.498818e-02*scale,0*scale,lc1};
+Point(4199) = {7.170787e-02*scale,1.817809e-02*scale,0*scale,lc1};
+Point(4201) = {7.219890e-02*scale,1.846566e-02*scale,0*scale,lc1};
+Point(4200) = {7.769207e-02*scale,2.168274e-02*scale,0*scale,lc1};
+Point(4100) = {8.318523e-02*scale,2.447113e-02*scale,0*scale,lc1};
+Point(4099) = {9.417156e-02*scale,2.953992e-02*scale,0*scale,lc1};
+Point(4045) = {1.051579e-01*scale,3.374477e-02*scale,0*scale,lc1};
+Point(4044) = {1.161442e-01*scale,3.745387e-02*scale,0*scale,lc1};
+Point(4043) = {1.271305e-01*scale,4.084705e-02*scale,0*scale,lc1};
+Point(4147) = {1.381169e-01*scale,4.362166e-02*scale,0*scale,lc1};
+Point(4146) = {1.491032e-01*scale,4.590535e-02*scale,0*scale,lc1};
+Point(4180) = {1.600895e-01*scale,4.775547e-02*scale,0*scale,lc1};
+Point(4167) = {1.710759e-01*scale,4.909090e-02*scale,0*scale,lc1};
+Point(4166) = {1.820622e-01*scale,5.028654e-02*scale,0*scale,lc1};
+Point(4134) = {1.930485e-01*scale,5.118303e-02*scale,0*scale,lc1};
+Point(4133) = {2.040348e-01*scale,5.209637e-02*scale,0*scale,lc1};
+Point(4098) = {2.150212e-01*scale,5.304431e-02*scale,0*scale,lc1};
+Point(4097) = {2.260075e-01*scale,5.389186e-02*scale,0*scale,lc1};
+Point(4042) = {2.369938e-01*scale,5.466596e-02*scale,0*scale,lc1};
+Point(4041) = {2.479802e-01*scale,5.535583e-02*scale,0*scale,lc1};
+Point(4040) = {2.589665e-01*scale,5.602171e-02*scale,0*scale,lc1};
+Point(4095) = {2.699528e-01*scale,5.660820e-02*scale,0*scale,lc1};
+Point(4096) = {2.809391e-01*scale,5.717080e-02*scale,0*scale,lc1};
+Point(4132) = {2.919255e-01*scale,5.768210e-02*scale,0*scale,lc1};
+Point(4131) = {3.029118e-01*scale,5.816077e-02*scale,0*scale,lc1};
+Point(4165) = {3.138981e-01*scale,5.861410e-02*scale,0*scale,lc1};
+Point(4164) = {3.248844e-01*scale,5.902748e-02*scale,0*scale,lc1};
+Point(4163) = {3.358708e-01*scale,5.942876e-02*scale,0*scale,lc1};
+Point(4130) = {3.468571e-01*scale,5.978313e-02*scale,0*scale,lc1};
+Point(4129) = {3.578434e-01*scale,6.012088e-02*scale,0*scale,lc1};
+Point(4094) = {3.688298e-01*scale,6.041918e-02*scale,0*scale,lc1};
+Point(4093) = {3.798161e-01*scale,6.068571e-02*scale,0*scale,lc1};
+Point(4039) = {3.908024e-01*scale,6.092523e-02*scale,0*scale,lc1};
+Point(4038) = {4.017887e-01*scale,6.111444e-02*scale,0*scale,lc1};
+Point(4037) = {4.127751e-01*scale,6.128792e-02*scale,0*scale,lc1};
+Point(4092) = {4.237614e-01*scale,6.139510e-02*scale,0*scale,lc1};
+Point(4091) = {4.347477e-01*scale,6.148330e-02*scale,0*scale,lc1};
+Point(4128) = {4.457341e-01*scale,6.152051e-02*scale,0*scale,lc1};
+Point(4127) = {4.567204e-01*scale,6.152534e-02*scale,0*scale,lc1};
+Point(4162) = {4.677067e-01*scale,6.149964e-02*scale,0*scale,lc1};
+Point(4161) = {4.786930e-01*scale,6.143130e-02*scale,0*scale,lc1};
+Point(4183) = {4.896794e-01*scale,6.134928e-02*scale,0*scale,lc1};
+Point(4160) = {5.006657e-01*scale,6.120560e-02*scale,0*scale,lc1};
+Point(4159) = {5.116520e-01*scale,6.104561e-02*scale,0*scale,lc1};
+Point(4126) = {5.226384e-01*scale,6.083535e-02*scale,0*scale,lc1};
+Point(4125) = {5.336247e-01*scale,6.058889e-02*scale,0*scale,lc1};
+Point(4088) = {5.446110e-01*scale,6.030455e-02*scale,0*scale,lc1};
+Point(4087) = {5.555973e-01*scale,5.996460e-02*scale,0*scale,lc1};
+Point(4033) = {5.665837e-01*scale,5.960434e-02*scale,0*scale,lc1};
+Point(4032) = {5.775700e-01*scale,5.915575e-02*scale,0*scale,lc1};
+Point(4031) = {5.885563e-01*scale,5.867545e-02*scale,0*scale,lc1};
+Point(4086) = {5.995427e-01*scale,5.809113e-02*scale,0*scale,lc1};
+Point(4085) = {6.105290e-01*scale,5.746759e-02*scale,0*scale,lc1};
+Point(4124) = {6.215153e-01*scale,5.679937e-02*scale,0*scale,lc1};
+Point(4123) = {6.325016e-01*scale,5.616104e-02*scale,0*scale,lc1};
+Point(4158) = {6.434880e-01*scale,5.553466e-02*scale,0*scale,lc1};
+Point(4157) = {6.544743e-01*scale,5.490460e-02*scale,0*scale,lc1};
+Point(4156) = {6.654606e-01*scale,5.425221e-02*scale,0*scale,lc1};
+Point(4122) = {6.764469e-01*scale,5.351456e-02*scale,0*scale,lc1};
+Point(4121) = {6.874333e-01*scale,5.273401e-02*scale,0*scale,lc1};
+Point(4081) = {6.984196e-01*scale,5.190181e-02*scale,0*scale,lc1};
+Point(4080) = {7.094059e-01*scale,5.101347e-02*scale,0*scale,lc1};
+Point(4020) = {7.203923e-01*scale,5.010133e-02*scale,0*scale,lc1};
+Point(4019) = {7.313786e-01*scale,4.909498e-02*scale,0*scale,lc1};
+Point(4018) = {7.423649e-01*scale,4.806316e-02*scale,0*scale,lc1};
+Point(4143) = {7.533512e-01*scale,4.694984e-02*scale,0*scale,lc1};
+Point(4118) = {7.643376e-01*scale,4.579371e-02*scale,0*scale,lc1};
+Point(4022) = {7.753239e-01*scale,4.458624e-02*scale,0*scale,lc1};
+Point(4016) = {7.863102e-01*scale,4.330843e-02*scale,0*scale,lc1};
+Point(4015) = {7.972966e-01*scale,4.200167e-02*scale,0*scale,lc1};
+Point(4011) = {8.082829e-01*scale,4.058146e-02*scale,0*scale,lc1};
+Point(4010) = {8.192692e-01*scale,3.912968e-02*scale,0*scale,lc1};
+Point(4009) = {8.302555e-01*scale,3.758209e-02*scale,0*scale,lc1};
+Point(4219) = {8.357487e-01*scale,3.680830e-02*scale,0*scale,lc1};
+Point(4177) = {8.412419e-01*scale,3.598390e-02*scale,0*scale,lc1};
+Point(4176) = {8.467350e-01*scale,3.515767e-02*scale,0*scale,lc1};
+Point(4149) = {8.494816e-01*scale,3.474456e-02*scale,0*scale,lc1};
+Point(4059) = {8.522282e-01*scale,3.433145e-02*scale,0*scale,lc1};
+Point(4058) = {8.549748e-01*scale,3.391833e-02*scale,0*scale,lc1};
+Point(4055) = {8.577214e-01*scale,3.349214e-02*scale,0*scale,lc1};
+Point(4113) = {8.604679e-01*scale,3.306571e-02*scale,0*scale,lc1};
+Point(4110) = {8.632145e-01*scale,3.263928e-02*scale,0*scale,lc1};
+Point(4213) = {8.659611e-01*scale,3.221285e-02*scale,0*scale,lc1};
+Point(4210) = {8.687077e-01*scale,3.178643e-02*scale,0*scale,lc1};
+Point(4217) = {8.714543e-01*scale,3.136000e-02*scale,0*scale,lc1};
+Point(4006) = {8.740950e-01*scale,3.095000e-02*scale,0*scale,lc1};
+Point(4218) = {8.714543e-01*scale,3.095677e-02*scale,0*scale,lc1};
+Point(4211) = {8.687077e-01*scale,3.096380e-02*scale,0*scale,lc1};
+Point(4212) = {8.659611e-01*scale,3.097084e-02*scale,0*scale,lc1};
+Point(4111) = {8.632145e-01*scale,3.097787e-02*scale,0*scale,lc1};
+Point(4112) = {8.604679e-01*scale,3.098491e-02*scale,0*scale,lc1};
+Point(4056) = {8.577214e-01*scale,3.099195e-02*scale,0*scale,lc1};
+Point(4057) = {8.549748e-01*scale,3.099898e-02*scale,0*scale,lc1};
+Point(4060) = {8.522282e-01*scale,3.100602e-02*scale,0*scale,lc1};
+Point(4148) = {8.494816e-01*scale,3.101305e-02*scale,0*scale,lc1};
+Point(4150) = {8.467350e-01*scale,3.102009e-02*scale,0*scale,lc1};
+Point(4208) = {8.439885e-01*scale,3.102712e-02*scale,0*scale,lc1};
+Point(4209) = {8.412419e-01*scale,3.103416e-02*scale,0*scale,lc1};
+Point(4215) = {8.357487e-01*scale,3.104823e-02*scale,0*scale,lc1};
+Point(4216) = {8.302555e-01*scale,3.106230e-02*scale,0*scale,lc1};
+Point(4220) = {8.247624e-01*scale,3.107638e-02*scale,0*scale,lc1};
+Point(4012) = {8.192692e-01*scale,3.109045e-02*scale,0*scale,lc1};
+Point(4013) = {8.082829e-01*scale,3.111859e-02*scale,0*scale,lc1};
+Point(4014) = {7.972966e-01*scale,3.114674e-02*scale,0*scale,lc1};
+Point(4017) = {7.863102e-01*scale,3.117488e-02*scale,0*scale,lc1};
+Point(4021) = {7.753239e-01*scale,3.120302e-02*scale,0*scale,lc1};
+Point(4023) = {7.643376e-01*scale,3.123117e-02*scale,0*scale,lc1};
+Point(4117) = {7.533512e-01*scale,3.125931e-02*scale,0*scale,lc1};
+Point(4082) = {7.423649e-01*scale,3.128745e-02*scale,0*scale,lc1};
+Point(4083) = {7.313786e-01*scale,3.131560e-02*scale,0*scale,lc1};
+Point(4024) = {7.203923e-01*scale,3.134374e-02*scale,0*scale,lc1};
+Point(4025) = {7.094059e-01*scale,3.137188e-02*scale,0*scale,lc1};
+Point(4007) = {6.999910e-01*scale,3.139600e-02*scale,0*scale,lc1};
+Point(4026) = {6.999910e-01*scale,2.367126e-02*scale,0*scale,lc1};
+Point(4027) = {6.999910e-01*scale,1.268493e-02*scale,0*scale,lc1};
+Point(4028) = {6.999910e-01*scale,1.698599e-03*scale,0*scale,lc1};
+Point(4029) = {6.999910e-01*scale,-9.287729e-03*scale,0*scale,lc1};
+Point(4008) = {6.999910e-01*scale,-1.722400e-02*scale,0*scale,lc1};
+Point(4030) = {6.984196e-01*scale,-1.751626e-02*scale,0*scale,lc1};
+Point(4084) = {6.874333e-01*scale,-1.955960e-02*scale,0*scale,lc1};
+Point(4194) = {6.764469e-01*scale,-2.159776e-02*scale,0*scale,lc1};
+Point(4195) = {6.654606e-01*scale,-2.362865e-02*scale,0*scale,lc1};
+Point(4154) = {6.544743e-01*scale,-2.588904e-02*scale,0*scale,lc1};
+Point(4155) = {6.434880e-01*scale,-2.825320e-02*scale,0*scale,lc1};
+Point(4119) = {6.325016e-01*scale,-3.016078e-02*scale,0*scale,lc1};
+Point(4120) = {6.215153e-01*scale,-3.200586e-02*scale,0*scale,lc1};
+Point(4089) = {6.105290e-01*scale,-3.369569e-02*scale,0*scale,lc1};
+Point(4090) = {5.995427e-01*scale,-3.534073e-02*scale,0*scale,lc1};
+Point(4034) = {5.885563e-01*scale,-3.694183e-02*scale,0*scale,lc1};
+Point(4035) = {5.775700e-01*scale,-3.852074e-02*scale,0*scale,lc1};
+Point(4036) = {5.665837e-01*scale,-4.009157e-02*scale,0*scale,lc1};
+Point(4144) = {5.555973e-01*scale,-4.161619e-02*scale,0*scale,lc1};
+Point(4192) = {5.446110e-01*scale,-4.311363e-02*scale,0*scale,lc1};
+Point(4193) = {5.336247e-01*scale,-4.454372e-02*scale,0*scale,lc1};
+Point(4184) = {5.226384e-01*scale,-4.589904e-02*scale,0*scale,lc1};
+Point(4185) = {5.116520e-01*scale,-4.719211e-02*scale,0*scale,lc1};
+Point(4168) = {5.006657e-01*scale,-4.834107e-02*scale,0*scale,lc1};
+Point(4169) = {4.896794e-01*scale,-4.944199e-02*scale,0*scale,lc1};
+Point(4135) = {4.786930e-01*scale,-5.032590e-02*scale,0*scale,lc1};
+Point(4136) = {4.677067e-01*scale,-5.113121e-02*scale,0*scale,lc1};
+Point(4101) = {4.567204e-01*scale,-5.175527e-02*scale,0*scale,lc1};
+Point(4102) = {4.457341e-01*scale,-5.227269e-02*scale,0*scale,lc1};
+Point(4049) = {4.347477e-01*scale,-5.270239e-02*scale,0*scale,lc1};
+Point(4050) = {4.237614e-01*scale,-5.305741e-02*scale,0*scale,lc1};
+Point(4051) = {4.127751e-01*scale,-5.339040e-02*scale,0*scale,lc1};
+Point(4103) = {4.017887e-01*scale,-5.365720e-02*scale,0*scale,lc1};
+Point(4104) = {3.908024e-01*scale,-5.390137e-02*scale,0*scale,lc1};
+Point(4137) = {3.798161e-01*scale,-5.408775e-02*scale,0*scale,lc1};
+Point(4138) = {3.688298e-01*scale,-5.423035e-02*scale,0*scale,lc1};
+Point(4170) = {3.578434e-01*scale,-5.433335e-02*scale,0*scale,lc1};
+Point(4171) = {3.468571e-01*scale,-5.436941e-02*scale,0*scale,lc1};
+Point(4186) = {3.358708e-01*scale,-5.438425e-02*scale,0*scale,lc1};
+Point(4172) = {3.248844e-01*scale,-5.431051e-02*scale,0*scale,lc1};
+Point(4173) = {3.138981e-01*scale,-5.421116e-02*scale,0*scale,lc1};
+Point(4139) = {3.029118e-01*scale,-5.403703e-02*scale,0*scale,lc1};
+Point(4140) = {2.919255e-01*scale,-5.379680e-02*scale,0*scale,lc1};
+Point(4105) = {2.809391e-01*scale,-5.349015e-02*scale,0*scale,lc1};
+Point(4106) = {2.699528e-01*scale,-5.307623e-02*scale,0*scale,lc1};
+Point(4052) = {2.589665e-01*scale,-5.262516e-02*scale,0*scale,lc1};
+Point(4053) = {2.479802e-01*scale,-5.205332e-02*scale,0*scale,lc1};
+Point(4054) = {2.369938e-01*scale,-5.145659e-02*scale,0*scale,lc1};
+Point(4107) = {2.260075e-01*scale,-5.078306e-02*scale,0*scale,lc1};
+Point(4108) = {2.150212e-01*scale,-5.007146e-02*scale,0*scale,lc1};
+Point(4141) = {2.040348e-01*scale,-4.931867e-02*scale,0*scale,lc1};
+Point(4142) = {1.930485e-01*scale,-4.849150e-02*scale,0*scale,lc1};
+Point(4174) = {1.820622e-01*scale,-4.763665e-02*scale,0*scale,lc1};
+Point(4175) = {1.710759e-01*scale,-4.665625e-02*scale,0*scale,lc1};
+Point(4187) = {1.600895e-01*scale,-4.564614e-02*scale,0*scale,lc1};
+Point(4188) = {1.491032e-01*scale,-4.455428e-02*scale,0*scale,lc1};
+Point(4145) = {1.381169e-01*scale,-4.339482e-02*scale,0*scale,lc1};
+Point(4046) = {1.271305e-01*scale,-4.218155e-02*scale,0*scale,lc1};
+Point(4047) = {1.161442e-01*scale,-4.082776e-02*scale,0*scale,lc1};
+Point(4048) = {1.051579e-01*scale,-3.939290e-02*scale,0*scale,lc1};
+Point(4196) = {9.966472e-02*scale,-3.862964e-02*scale,0*scale,lc1};
+Point(4197) = {9.417156e-02*scale,-3.788513e-02*scale,0*scale,lc1};
+Point(4198) = {8.867839e-02*scale,-3.720163e-02*scale,0*scale,lc1};
+Point(4189) = {8.318523e-02*scale,-3.651554e-02*scale,0*scale,lc1};
+Point(4190) = {7.769207e-02*scale,-3.569174e-02*scale,0*scale,lc1};
+Point(4214) = {7.494548e-02*scale,-3.527985e-02*scale,0*scale,lc1};
+Point(4181) = {7.219890e-02*scale,-3.481687e-02*scale,0*scale,lc1};
+Point(4182) = {6.945232e-02*scale,-3.430639e-02*scale,0*scale,lc1};
+Point(4151) = {6.670574e-02*scale,-3.379591e-02*scale,0*scale,lc1};
+Point(4152) = {6.395916e-02*scale,-3.322033e-02*scale,0*scale,lc1};
+Point(4064) = {6.121257e-02*scale,-3.263264e-02*scale,0*scale,lc1};
+Point(4065) = {5.846599e-02*scale,-3.189105e-02*scale,0*scale,lc1};
+Point(4066) = {5.635416e-02*scale,-3.126039e-02*scale,0*scale,lc1};
+Point(4205) = {5.434612e-02*scale,-3.049426e-02*scale,0*scale,lc1};
+Point(4206) = {5.297283e-02*scale,-2.986940e-02*scale,0*scale,lc1};
+Point(4207) = {5.159954e-02*scale,-2.914883e-02*scale,0*scale,lc1};
+Point(4072) = {5.022625e-02*scale,-2.824438e-02*scale,0*scale,lc1};
+Point(4074) = {4.885296e-02*scale,-2.716087e-02*scale,0*scale,lc1};
+Point(4073) = {4.883074e-02*scale,-2.714051e-02*scale,0*scale,lc1};
+Point(4076) = {4.747966e-02*scale,-2.578824e-02*scale,0*scale,lc1};
+Point(4075) = {4.746129e-02*scale,-2.576722e-02*scale,0*scale,lc1};
+Point(4079) = {4.639274e-02*scale,-2.439393e-02*scale,0*scale,lc1};
+Point(4078) = {4.561283e-02*scale,-2.302064e-02*scale,0*scale,lc1};
+Point(4077) = {4.500573e-02*scale,-2.164735e-02*scale,0*scale,lc1};
+Point(4068) = {4.450243e-02*scale,-2.027406e-02*scale,0*scale,lc1};
+Point(4067) = {4.415104e-02*scale,-1.890077e-02*scale,0*scale,lc1};
+Point(4069) = {4.402927e-02*scale,-1.752748e-02*scale,0*scale,lc1};
+Point(4070) = {4.404617e-02*scale,-1.615418e-02*scale,0*scale,lc1};
+Point(4071) = {4.411753e-02*scale,-1.478089e-02*scale,0*scale,lc1};
+Point(4115) = {4.421802e-02*scale,-1.340760e-02*scale,0*scale,lc1};
+Point(4116) = {4.435615e-02*scale,-1.203431e-02*scale,0*scale,lc1};
+Point(4204) = {4.461695e-02*scale,-1.066102e-02*scale,0*scale,lc1};
+
+/* la boite */
+
+Point(11) = {4.552264e+01*scale,-2.254225e+01*scale,0*scale,lc3};
+Point(2233) = {4.552264e+01*scale,-1.129225e+01*scale,0*scale,lc3};
+Point(5) = {4.552264e+01*scale,-4.224671e-02*scale,0*scale,lc3};
+Point(2236) = {4.552264e+01*scale,1.120775e+01*scale,0*scale,lc3};
+Point(14) = {4.552264e+01*scale,2.245775e+01*scale,0*scale,lc3};
+Point(2) = {4.552264e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(15) = {2.302264e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(2301) = {1.177264e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(6) = {5.226384e-01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(2304) = {-1.072736e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(18) = {-2.197736e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(3) = {-4.447736e+01*scale,4.495775e+01*scale,0*scale,lc3};
+Point(19) = {-4.447736e+01*scale,2.245775e+01*scale,0*scale,lc3};
+Point(2240) = {-4.447736e+01*scale,1.120775e+01*scale,0*scale,lc3};
+Point(7) = {-4.447736e+01*scale,-4.224671e-02*scale,0*scale,lc3};
+Point(2243) = {-4.447736e+01*scale,-1.129225e+01*scale,0*scale,lc3};
+Point(22) = {-4.447736e+01*scale,-2.254225e+01*scale,0*scale,lc3};
+Point(4) = {-4.447736e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(23) = {-2.197736e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(2317) = {-1.072736e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(8) = {5.226384e-01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(2297) = {1.177264e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(10) = {2.302264e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+Point(1) = {4.552264e+01*scale,-4.504225e+01*scale,0*scale,lc3};
+
+/* le flap */
+
+Point(4298) = {1.125732e+00*scale,-1.356305e-01*scale,0*scale,lc2};
+Point(4297) = {1.128473e+00*scale,-1.383771e-01*scale,0*scale,lc2};
+Point(4222) = {1.130511e+00*scale,-1.404190e-01*scale,0*scale,lc2};
+Point(4250) = {1.130200e+00*scale,-1.411237e-01*scale,0*scale,lc2};
+Point(4252) = {1.128987e+00*scale,-1.438702e-01*scale,0*scale,lc2};
+Point(4221) = {1.128033e+00*scale,-1.460320e-01*scale,0*scale,lc2};
+Point(4251) = {1.126886e+00*scale,-1.450775e-01*scale,0*scale,lc2};
+Point(4299) = {1.124140e+00*scale,-1.427912e-01*scale,0*scale,lc2};
+Point(4335) = {1.121393e+00*scale,-1.405048e-01*scale,0*scale,lc2};
+Point(4337) = {1.118647e+00*scale,-1.382318e-01*scale,0*scale,lc2};
+Point(4267) = {1.115900e+00*scale,-1.359746e-01*scale,0*scale,lc2};
+Point(4294) = {1.115481e+00*scale,-1.356305e-01*scale,0*scale,lc2};
+Point(4269) = {1.110407e+00*scale,-1.315213e-01*scale,0*scale,lc2};
+Point(4233) = {1.104914e+00*scale,-1.272651e-01*scale,0*scale,lc2};
+Point(4234) = {1.099421e+00*scale,-1.231333e-01*scale,0*scale,lc2};
+Point(4273) = {1.093927e+00*scale,-1.190696e-01*scale,0*scale,lc2};
+Point(4293) = {1.088434e+00*scale,-1.150965e-01*scale,0*scale,lc2};
+Point(4314) = {1.082941e+00*scale,-1.112096e-01*scale,0*scale,lc2};
+Point(4317) = {1.077448e+00*scale,-1.073829e-01*scale,0*scale,lc2};
+Point(4318) = {1.071955e+00*scale,-1.037168e-01*scale,0*scale,lc2};
+Point(4274) = {1.066462e+00*scale,-1.001266e-01*scale,0*scale,lc2};
+Point(4235) = {1.060968e+00*scale,-9.664561e-02*scale,0*scale,lc2};
+Point(4236) = {1.055475e+00*scale,-9.329373e-02*scale,0*scale,lc2};
+Point(4237) = {1.049982e+00*scale,-8.999964e-02*scale,0*scale,lc2};
+Point(4301) = {1.044489e+00*scale,-8.685139e-02*scale,0*scale,lc2};
+Point(4319) = {1.038996e+00*scale,-8.375978e-02*scale,0*scale,lc2};
+Point(4321) = {1.033503e+00*scale,-8.073620e-02*scale,0*scale,lc2};
+Point(4320) = {1.033435e+00*scale,-8.069886e-02*scale,0*scale,lc2};
+Point(4322) = {1.028009e+00*scale,-7.778268e-02*scale,0*scale,lc2};
+Point(4347) = {1.022516e+00*scale,-7.485902e-02*scale,0*scale,lc2};
+Point(4323) = {1.017023e+00*scale,-7.206071e-02*scale,0*scale,lc2};
+Point(4324) = {1.011530e+00*scale,-6.928798e-02*scale,0*scale,lc2};
+Point(4325) = {1.006037e+00*scale,-6.656447e-02*scale,0*scale,lc2};
+Point(4276) = {1.000544e+00*scale,-6.390345e-02*scale,0*scale,lc2};
+
+Point(4238) = {9.950505e-01*scale,-6.128188e-02*scale,0*scale,lc2};
+Point(4240) = {9.895573e-01*scale,-5.875476e-02*scale,0*scale,lc2};
+Point(4239) = {9.894949e-01*scale,-5.872621e-02*scale,0*scale,lc2};
+Point(4241) = {9.840641e-01*scale,-5.625125e-02*scale,0*scale,lc2};
+Point(4277) = {9.785710e-01*scale,-5.382099e-02*scale,0*scale,lc2};
+Point(4326) = {9.730778e-01*scale,-5.141086e-02*scale,0*scale,lc2};
+Point(4327) = {9.675846e-01*scale,-4.903782e-02*scale,0*scale,lc2};
+Point(4328) = {9.620915e-01*scale,-4.670806e-02*scale,0*scale,lc2};
+Point(4350) = {9.565983e-01*scale,-4.440955e-02*scale,0*scale,lc2};
+Point(4348) = {9.511052e-01*scale,-4.217563e-02*scale,0*scale,lc2};
+Point(4349) = {9.456120e-01*scale,-3.995849e-02*scale,0*scale,lc2};
+Point(4332) = {9.401188e-01*scale,-3.778658e-02*scale,0*scale,lc2};
+Point(4333) = {9.346257e-01*scale,-3.563417e-02*scale,0*scale,lc2};
+Point(4334) = {9.291325e-01*scale,-3.354304e-02*scale,0*scale,lc2};
+Point(4278) = {9.236393e-01*scale,-3.147155e-02*scale,0*scale,lc2};
+Point(4247) = {9.181462e-01*scale,-2.942051e-02*scale,0*scale,lc2};
+Point(4248) = {9.126530e-01*scale,-2.741688e-02*scale,0*scale,lc2};
+Point(4249) = {9.071598e-01*scale,-2.541811e-02*scale,0*scale,lc2};
+Point(4282) = {9.016667e-01*scale,-2.339436e-02*scale,0*scale,lc2};
+Point(4283) = {8.961735e-01*scale,-2.121581e-02*scale,0*scale,lc2};
+Point(4341) = {8.934269e-01*scale,-2.008894e-02*scale,0*scale,lc2};
+Point(4342) = {8.906803e-01*scale,-1.868991e-02*scale,0*scale,lc2};
+Point(4343) = {8.879338e-01*scale,-1.729088e-02*scale,0*scale,lc2};
+Point(4289) = {8.851872e-01*scale,-1.539587e-02*scale,0*scale,lc2};
+Point(4290) = {8.824406e-01*scale,-1.328983e-02*scale,0*scale,lc2};
+Point(4286) = {8.796940e-01*scale,-1.068337e-02*scale,0*scale,lc2};
+Point(4255) = {8.785175e-01*scale,-9.287729e-03*scale,0*scale,lc2};
+Point(4257) = {8.763537e-01*scale,-6.541147e-03*scale,0*scale,lc2};
+Point(4256) = {8.745583e-01*scale,-3.794565e-03*scale,0*scale,lc2};
+Point(4346) = {8.737982e-01*scale,-2.421274e-03*scale,0*scale,lc2};
+Point(4288) = {8.731375e-01*scale,-1.047983e-03*scale,0*scale,lc2};
+Point(4287) = {8.725645e-01*scale,3.253082e-04*scale,0*scale,lc2};
+Point(4260) = {8.721474e-01*scale,1.698599e-03*scale,0*scale,lc2};
+Point(4259) = {8.718264e-01*scale,3.071890e-03*scale,0*scale,lc2};
+Point(4258) = {8.716296e-01*scale,4.445181e-03*scale,0*scale,lc2};
+Point(4262) = {8.715751e-01*scale,5.818472e-03*scale,0*scale,lc2};
+Point(4261) = {8.716587e-01*scale,7.191763e-03*scale,0*scale,lc2};
+Point(4264) = {8.718582e-01*scale,8.565054e-03*scale,0*scale,lc2};
+Point(4263) = {8.721688e-01*scale,9.938345e-03*scale,0*scale,lc2};
+Point(4265) = {8.726207e-01*scale,1.131164e-02*scale,0*scale,lc2};
+Point(4266) = {8.732553e-01*scale,1.268493e-02*scale,0*scale,lc2};
+Point(4303) = {8.741084e-01*scale,1.405822e-02*scale,0*scale,lc2};
+Point(4302) = {8.742009e-01*scale,1.417564e-02*scale,0*scale,lc2};
+Point(4304) = {8.752094e-01*scale,1.543151e-02*scale,0*scale,lc2};
+Point(4305) = {8.755741e-01*scale,1.580615e-02*scale,0*scale,lc2};
+Point(4306) = {8.765464e-01*scale,1.680480e-02*scale,0*scale,lc2};
+Point(4307) = {8.769474e-01*scale,1.712646e-02*scale,0*scale,lc2};
+Point(4308) = {8.783004e-01*scale,1.817809e-02*scale,0*scale,lc2};
+Point(4309) = {8.783207e-01*scale,1.819390e-02*scale,0*scale,lc2};
+Point(4345) = {8.796940e-01*scale,1.898483e-02*scale,0*scale,lc2};
+Point(4344) = {8.810673e-01*scale,1.969096e-02*scale,0*scale,lc2};
+Point(4254) = {8.824406e-01*scale,2.018966e-02*scale,0*scale,lc2};
+Point(4253) = {8.851872e-01*scale,2.092940e-02*scale,0*scale,lc2};
+Point(4285) = {8.879338e-01*scale,2.136484e-02*scale,0*scale,lc2};
+Point(4284) = {8.906803e-01*scale,2.153023e-02*scale,0*scale,lc2};
+Point(4340) = {8.934269e-01*scale,2.149455e-02*scale,0*scale,lc2};
+Point(4339) = {8.961735e-01*scale,2.136105e-02*scale,0*scale,lc2};
+Point(4338) = {8.989201e-01*scale,2.104930e-02*scale,0*scale,lc2};
+Point(4246) = {9.016667e-01*scale,2.064514e-02*scale,0*scale,lc2};
+Point(4245) = {9.071598e-01*scale,1.954695e-02*scale,0*scale,lc2};
+Point(4281) = {9.126530e-01*scale,1.818666e-02*scale,0*scale,lc2};
+Point(4280) = {9.181462e-01*scale,1.648801e-02*scale,0*scale,lc2};
+Point(4279) = {9.236393e-01*scale,1.459116e-02*scale,0*scale,lc2};
+Point(4244) = {9.291325e-01*scale,1.255534e-02*scale,0*scale,lc2};
+Point(4243) = {9.346257e-01*scale,1.024686e-02*scale,0*scale,lc2};
+Point(4242) = {9.401188e-01*scale,7.859173e-03*scale,0*scale,lc2};
+Point(4296) = {9.456120e-01*scale,5.245962e-03*scale,0*scale,lc2};
+Point(4295) = {9.511052e-01*scale,2.515401e-03*scale,0*scale,lc2};
+Point(4300) = {9.565983e-01*scale,-3.522322e-04*scale,0*scale,lc2};
+Point(4330) = {9.620915e-01*scale,-3.368852e-03*scale,0*scale,lc2};
+Point(4331) = {9.628545e-01*scale,-3.794565e-03*scale,0*scale,lc2};
+Point(4329) = {9.675846e-01*scale,-6.447130e-03*scale,0*scale,lc2};
+Point(4232) = {9.730778e-01*scale,-9.700323e-03*scale,0*scale,lc2};
+Point(4231) = {9.840641e-01*scale,-1.646639e-02*scale,0*scale,lc2};
+Point(4230) = {9.950505e-01*scale,-2.366260e-02*scale,0*scale,lc2};
+
+Point(4229) = {1.006037e+00*scale,-3.132299e-02*scale,0*scale,lc2};
+Point(4228) = {1.017023e+00*scale,-3.943289e-02*scale,0*scale,lc2};
+Point(4227) = {1.028009e+00*scale,-4.793142e-02*scale,0*scale,lc2};
+Point(4225) = {1.038996e+00*scale,-5.669110e-02*scale,0*scale,lc2};
+Point(4226) = {1.048275e+00*scale,-6.421937e-02*scale,0*scale,lc2};
+Point(4312) = {1.054944e+00*scale,-6.971253e-02*scale,0*scale,lc2};
+Point(4223) = {1.060968e+00*scale,-7.473580e-02*scale,0*scale,lc2};
+Point(4224) = {1.061523e+00*scale,-7.520570e-02*scale,0*scale,lc2};
+Point(4311) = {1.066462e+00*scale,-7.943817e-02*scale,0*scale,lc2};
+Point(4310) = {1.067933e+00*scale,-8.069886e-02*scale,0*scale,lc2};
+Point(4275) = {1.071955e+00*scale,-8.420612e-02*scale,0*scale,lc2};
+Point(4316) = {1.077448e+00*scale,-8.903994e-02*scale,0*scale,lc2};
+Point(4315) = {1.082941e+00*scale,-9.395896e-02*scale,0*scale,lc2};
+Point(4313) = {1.088434e+00*scale,-9.897945e-02*scale,0*scale,lc2};
+Point(4292) = {1.093927e+00*scale,-1.041032e-01*scale,0*scale,lc2};
+Point(4272) = {1.099421e+00*scale,-1.093858e-01*scale,0*scale,lc2};
+Point(4271) = {1.104914e+00*scale,-1.148004e-01*scale,0*scale,lc2};
+Point(4270) = {1.110407e+00*scale,-1.202740e-01*scale,0*scale,lc2};
+Point(4268) = {1.114765e+00*scale,-1.246442e-01*scale,0*scale,lc2};
+Point(4291) = {1.120249e+00*scale,-1.301373e-01*scale,0*scale,lc2};
+Point(4336) = {1.122990e+00*scale,-1.328839e-01*scale,0*scale,lc2};
+
+Line(1) = {3895,3897};
+Line(2) = {3897,3896};
+Line(3) = {3896,3968};
+Line(4) = {3968,3995};
+Line(5) = {3995,4003};
+Line(6) = {4003,3857};
+Line(7) = {3857,3856};
+Line(8) = {3856,3860};
+Line(9) = {3860,3861};
+Line(10) = {3861,3863};
+Line(11) = {3863,3864};
+Line(12) = {3864,3865};
+Line(13) = {3865,3866};
+Line(14) = {3866,3867};
+Line(15) = {3867,3868};
+Line(16) = {3868,3869};
+Line(17) = {3869,3870};
+Line(18) = {3870,3871};
+Line(19) = {3871,3872};
+Line(20) = {3872,3977};
+Line(21) = {3977,3877};
+Line(22) = {3877,3876};
+Line(23) = {3876,3878};
+Line(24) = {3878,3934};
+Line(25) = {3934,3873};
+Line(26) = {3873,3874};
+Line(27) = {3874,3875};
+Line(28) = {3875,3935};
+Line(29) = {3935,3880};
+Line(30) = {3880,3879};
+Line(31) = {3879,3881};
+Line(32) = {3881,3936};
+Line(33) = {3936,3882};
+Line(34) = {3882,3883};
+Line(35) = {3883,3885};
+Line(36) = {3885,3884};
+Line(37) = {3884,1218};
+Line(38) = {1218,3933};
+Line(39) = {3933,3996};
+Line(40) = {3996,3989};
+Line(41) = {3989,3990};
+Line(42) = {3990,3978};
+Line(43) = {3978,3979};
+Line(44) = {3979,3974};
+Line(45) = {3974,3973};
+Line(46) = {3973,3963};
+Line(47) = {3963,3947};
+Line(48) = {3947,3948};
+Line(49) = {3948,3904};
+Line(50) = {3904,3903};
+Line(51) = {3903,3946};
+Line(52) = {3946,3902};
+Line(53) = {3902,3901};
+Line(54) = {3901,3900};
+Line(55) = {3900,3908};
+Line(56) = {3908,3907};
+Line(57) = {3907,3951};
+Line(58) = {3951,3950};
+Line(59) = {3950,3847};
+Line(60) = {3847,3949};
+Line(61) = {3949,3952};
+Line(62) = {3952,3905};
+Line(63) = {3905,3906};
+Line(64) = {3906,3909};
+Line(65) = {3909,3969};
+Line(66) = {3969,3970};
+Line(67) = {3970,3997};
+Line(68) = {3997,3998};
+Line(69) = {3998,4004};
+Line(70) = {4004,3959};
+Line(71) = {3959,3960};
+Line(72) = {3960,3972};
+Line(73) = {3972,3984};
+Line(74) = {3984,3988};
+Line(75) = {3988,3961};
+Line(76) = {3961,3962};
+Line(77) = {3962,3937};
+Line(78) = {3937,3938};
+Line(79) = {3938,3886};
+Line(80) = {3886,3887};
+Line(81) = {3887,3888};
+Line(82) = {3888,3993};
+Line(83) = {3993,3994};
+Line(84) = {3994,3971};
+Line(85) = {3971,3918};
+Line(86) = {3918,3919};
+Line(87) = {3919,3920};
+Line(88) = {3920,3956};
+Line(89) = {3956,3955};
+Line(90) = {3955,3965};
+Line(91) = {3965,3966};
+Line(92) = {3966,3910};
+Line(93) = {3910,3913};
+Line(94) = {3913,3912};
+Line(95) = {3912,3911};
+Line(96) = {3911,3914};
+Line(97) = {3914,3915};
+Line(98) = {3915,3916};
+Line(99) = {3916,3917};
+Line(100) = {3917,3953};
+Line(101) = {3953,3954};
+Line(102) = {3954,3964};
+Line(103) = {3964,3975};
+Line(104) = {3975,3992};
+Line(105) = {3992,3991};
+Line(106) = {3991,3999};
+Line(107) = {3999,3939};
+Line(108) = {3939,3967};
+Line(109) = {3967,3987};
+Line(110) = {3987,3985};
+Line(111) = {3985,3986};
+Line(112) = {3986,4002};
+Line(113) = {4002,3922};
+Line(114) = {3922,4005};
+Line(115) = {4005,3851};
+Line(116) = {3851,3850};
+Line(117) = {3850,3853};
+Line(118) = {3853,3852};
+Line(119) = {3852,3849};
+Line(120) = {3849,3848};
+Line(121) = {3848,3921};
+Line(122) = {3921,3983};
+Line(123) = {3983,3982};
+Line(124) = {3982,3976};
+Line(125) = {3976,3929};
+Line(126) = {3929,3958};
+Line(127) = {3958,3928};
+Line(128) = {3928,3957};
+Line(129) = {3957,3927};
+Line(130) = {3927,3926};
+Line(131) = {3926,3925};
+Line(132) = {3925,3924};
+Line(133) = {3924,3932};
+Line(134) = {3932,3931};
+Line(135) = {3931,3930};
+Line(136) = {3930,3923};
+Line(137) = {3923,3862};
+Line(138) = {3862,3859};
+Line(139) = {3859,3858};
+Line(140) = {3858,3855};
+Line(141) = {3855,3854};
+Line(142) = {3854,3945};
+Line(143) = {3945,3944};
+Line(144) = {3944,3899};
+Line(145) = {3899,3898};
+Line(146) = {3898,3894};
+Line(147) = {3894,3890};
+Line(148) = {3890,3893};
+Line(149) = {3893,3941};
+Line(150) = {3941,4000};
+Line(151) = {4000,3980};
+Line(152) = {3980,3846};
+Line(153) = {3846,3981};
+Line(154) = {3981,4001};
+Line(155) = {4001,3942};
+Line(156) = {3942,3940};
+Line(157) = {3940,3889};
+Line(158) = {3889,3892};
+Line(159) = {3892,3891};
+Line(160) = {3891,3943};
+Line(161) = {3943,3895};
+Line(162) = {4063,4062};
+Line(163) = {4062,4061};
+Line(164) = {4061,4114};
+Line(165) = {4114,4153};
+Line(166) = {4153,4178};
+Line(167) = {4178,4179};
+Line(168) = {4179,4191};
+Line(169) = {4191,4203};
+Line(170) = {4203,4109};
+Line(171) = {4109,4202};
+Line(172) = {4202,4199};
+Line(173) = {4199,4201};
+Line(174) = {4201,4200};
+Line(175) = {4200,4100};
+Line(176) = {4100,4099};
+Line(177) = {4099,4045};
+Line(178) = {4045,4044};
+Line(179) = {4044,4043};
+Line(180) = {4043,4147};
+Line(181) = {4147,4146};
+Line(182) = {4146,4180};
+Line(183) = {4180,4167};
+Line(184) = {4167,4166};
+Line(185) = {4166,4134};
+Line(186) = {4134,4133};
+Line(187) = {4133,4098};
+Line(188) = {4098,4097};
+Line(189) = {4097,4042};
+Line(190) = {4042,4041};
+Line(191) = {4041,4040};
+Line(192) = {4040,4095};
+Line(193) = {4095,4096};
+Line(194) = {4096,4132};
+Line(195) = {4132,4131};
+Line(196) = {4131,4165};
+Line(197) = {4165,4164};
+Line(198) = {4164,4163};
+Line(199) = {4163,4130};
+Line(200) = {4130,4129};
+Line(201) = {4129,4094};
+Line(202) = {4094,4093};
+Line(203) = {4093,4039};
+Line(204) = {4039,4038};
+Line(205) = {4038,4037};
+Line(206) = {4037,4092};
+Line(207) = {4092,4091};
+Line(208) = {4091,4128};
+Line(209) = {4128,4127};
+Line(210) = {4127,4162};
+Line(211) = {4162,4161};
+Line(212) = {4161,4183};
+Line(213) = {4183,4160};
+Line(214) = {4160,4159};
+Line(215) = {4159,4126};
+Line(216) = {4126,4125};
+Line(217) = {4125,4088};
+Line(218) = {4088,4087};
+Line(219) = {4087,4033};
+Line(220) = {4033,4032};
+Line(221) = {4032,4031};
+Line(222) = {4031,4086};
+Line(223) = {4086,4085};
+Line(224) = {4085,4124};
+Line(225) = {4124,4123};
+Line(226) = {4123,4158};
+Line(227) = {4158,4157};
+Line(228) = {4157,4156};
+Line(229) = {4156,4122};
+Line(230) = {4122,4121};
+Line(231) = {4121,4081};
+Line(232) = {4081,4080};
+Line(233) = {4080,4020};
+Line(234) = {4020,4019};
+Line(235) = {4019,4018};
+Line(236) = {4018,4143};
+Line(237) = {4143,4118};
+Line(238) = {4118,4022};
+Line(239) = {4022,4016};
+Line(240) = {4016,4015};
+Line(241) = {4015,4011};
+Line(242) = {4011,4010};
+Line(243) = {4010,4009};
+Line(244) = {4009,4219};
+Line(245) = {4219,4177};
+Line(246) = {4177,4176};
+Line(247) = {4176,4149};
+Line(248) = {4149,4059};
+Line(249) = {4059,4058};
+Line(250) = {4058,4055};
+Line(251) = {4055,4113};
+Line(252) = {4113,4110};
+Line(253) = {4110,4213};
+Line(254) = {4213,4210};
+Line(255) = {4210,4217};
+Line(256) = {4217,4006};
+Line(257) = {4006,4218};
+Line(258) = {4218,4211};
+Line(259) = {4211,4212};
+Line(260) = {4212,4111};
+Line(261) = {4111,4112};
+Line(262) = {4112,4056};
+Line(263) = {4056,4057};
+Line(264) = {4057,4060};
+Line(265) = {4060,4148};
+Line(266) = {4148,4150};
+Line(267) = {4150,4208};
+Line(268) = {4208,4209};
+Line(269) = {4209,4215};
+Line(270) = {4215,4216};
+Line(271) = {4216,4220};
+Line(272) = {4220,4012};
+Line(273) = {4012,4013};
+Line(274) = {4013,4014};
+Line(275) = {4014,4017};
+Line(276) = {4017,4021};
+Line(277) = {4021,4023};
+Line(278) = {4023,4117};
+Line(279) = {4117,4082};
+Line(280) = {4082,4083};
+Line(281) = {4083,4024};
+Line(282) = {4024,4025};
+Line(283) = {4025,4007};
+Line(284) = {4007,4026};
+Line(285) = {4026,4027};
+Line(286) = {4027,4028};
+Line(287) = {4028,4029};
+Line(288) = {4029,4008};
+Line(289) = {4008,4030};
+Line(290) = {4030,4084};
+Line(291) = {4084,4194};
+Line(292) = {4194,4195};
+Line(293) = {4195,4154};
+Line(294) = {4154,4155};
+Line(295) = {4155,4119};
+Line(296) = {4119,4120};
+Line(297) = {4120,4089};
+Line(298) = {4089,4090};
+Line(299) = {4090,4034};
+Line(300) = {4034,4035};
+Line(301) = {4035,4036};
+Line(302) = {4036,4144};
+Line(303) = {4144,4192};
+Line(304) = {4192,4193};
+Line(305) = {4193,4184};
+Line(306) = {4184,4185};
+Line(307) = {4185,4168};
+Line(308) = {4168,4169};
+Line(309) = {4169,4135};
+Line(310) = {4135,4136};
+Line(311) = {4136,4101};
+Line(312) = {4101,4102};
+Line(313) = {4102,4049};
+Line(314) = {4049,4050};
+Line(315) = {4050,4051};
+Line(316) = {4051,4103};
+Line(317) = {4103,4104};
+Line(318) = {4104,4137};
+Line(319) = {4137,4138};
+Line(320) = {4138,4170};
+Line(321) = {4170,4171};
+Line(322) = {4171,4186};
+Line(323) = {4186,4172};
+Line(324) = {4172,4173};
+Line(325) = {4173,4139};
+Line(326) = {4139,4140};
+Line(327) = {4140,4105};
+Line(328) = {4105,4106};
+Line(329) = {4106,4052};
+Line(330) = {4052,4053};
+Line(331) = {4053,4054};
+Line(332) = {4054,4107};
+Line(333) = {4107,4108};
+Line(334) = {4108,4141};
+Line(335) = {4141,4142};
+Line(336) = {4142,4174};
+Line(337) = {4174,4175};
+Line(338) = {4175,4187};
+Line(339) = {4187,4188};
+Line(340) = {4188,4145};
+Line(341) = {4145,4046};
+Line(342) = {4046,4047};
+Line(343) = {4047,4048};
+Line(344) = {4048,4196};
+Line(345) = {4196,4197};
+Line(346) = {4197,4198};
+Line(347) = {4198,4189};
+Line(348) = {4189,4190};
+Line(349) = {4190,4214};
+Line(350) = {4214,4181};
+Line(351) = {4181,4182};
+Line(352) = {4182,4151};
+Line(353) = {4151,4152};
+Line(354) = {4152,4064};
+Line(355) = {4064,4065};
+Line(356) = {4065,4066};
+Line(357) = {4066,4205};
+Line(358) = {4205,4206};
+Line(359) = {4206,4207};
+Line(360) = {4207,4072};
+Line(361) = {4072,4074};
+Line(362) = {4074,4073};
+Line(363) = {4073,4076};
+Line(364) = {4076,4075};
+Line(365) = {4075,4079};
+Line(366) = {4079,4078};
+Line(367) = {4078,4077};
+Line(368) = {4077,4068};
+Line(369) = {4068,4067};
+Line(370) = {4067,4069};
+Line(371) = {4069,4070};
+Line(372) = {4070,4071};
+Line(373) = {4071,4115};
+Line(374) = {4115,4116};
+Line(375) = {4116,4204};
+Line(376) = {4204,4063};
+Line(377) = {11,2233};
+Line(378) = {2233,5};
+Line(379) = {5,2236};
+Line(380) = {2236,14};
+Line(381) = {14,2};
+Line(382) = {2,15};
+Line(383) = {15,2301};
+Line(384) = {2301,6};
+Line(385) = {6,2304};
+Line(386) = {2304,18};
+Line(387) = {18,3};
+Line(388) = {3,19};
+Line(389) = {19,2240};
+Line(390) = {2240,7};
+Line(391) = {7,2243};
+Line(392) = {2243,22};
+Line(393) = {22,4};
+Line(394) = {4,23};
+Line(395) = {23,2317};
+Line(396) = {2317,8};
+Line(397) = {8,2297};
+Line(398) = {2297,10};
+Line(399) = {10,1};
+Line(400) = {1,11};
+Line(401) = {4298,4297};
+Line(402) = {4297,4222};
+Line(403) = {4222,4250};
+Line(404) = {4250,4252};
+Line(405) = {4252,4221};
+Line(406) = {4221,4251};
+Line(407) = {4251,4299};
+Line(408) = {4299,4335};
+Line(409) = {4335,4337};
+Line(410) = {4337,4267};
+Line(411) = {4267,4294};
+Line(412) = {4294,4269};
+Line(413) = {4269,4233};
+Line(414) = {4233,4234};
+Line(415) = {4234,4273};
+Line(416) = {4273,4293};
+Line(417) = {4293,4314};
+Line(418) = {4314,4317};
+Line(419) = {4317,4318};
+Line(420) = {4318,4274};
+Line(421) = {4274,4235};
+Line(422) = {4235,4236};
+Line(423) = {4236,4237};
+Line(424) = {4237,4301};
+Line(425) = {4301,4319};
+Line(426) = {4319,4321};
+Line(427) = {4321,4320};
+Line(428) = {4320,4322};
+Line(429) = {4322,4347};
+Line(430) = {4347,4323};
+Line(431) = {4323,4324};
+Line(432) = {4324,4325};
+Line(433) = {4325,4276};
+Line(434) = {4276,4238};
+Line(435) = {4238,4240};
+Line(436) = {4240,4239};
+Line(437) = {4239,4241};
+Line(438) = {4241,4277};
+Line(439) = {4277,4326};
+Line(440) = {4326,4327};
+Line(441) = {4327,4328};
+Line(442) = {4328,4350};
+Line(443) = {4350,4348};
+Line(444) = {4348,4349};
+Line(445) = {4349,4332};
+Line(446) = {4332,4333};
+Line(447) = {4333,4334};
+Line(448) = {4334,4278};
+Line(449) = {4278,4247};
+Line(450) = {4247,4248};
+Line(451) = {4248,4249};
+Line(452) = {4249,4282};
+Line(453) = {4282,4283};
+Line(454) = {4283,4341};
+Line(455) = {4341,4342};
+Line(456) = {4342,4343};
+Line(457) = {4343,4289};
+Line(458) = {4289,4290};
+Line(459) = {4290,4286};
+Line(460) = {4286,4255};
+Line(461) = {4255,4257};
+Line(462) = {4257,4256};
+Line(463) = {4256,4346};
+Line(464) = {4346,4288};
+Line(465) = {4288,4287};
+Line(466) = {4287,4260};
+Line(467) = {4260,4259};
+Line(468) = {4259,4258};
+Line(469) = {4258,4262};
+Line(470) = {4262,4261};
+Line(471) = {4261,4264};
+Line(472) = {4264,4263};
+Line(473) = {4263,4265};
+Line(474) = {4265,4266};
+Line(475) = {4266,4303};
+Line(476) = {4303,4302};
+Line(477) = {4302,4304};
+Line(478) = {4304,4305};
+Line(479) = {4305,4306};
+Line(480) = {4306,4307};
+Line(481) = {4307,4308};
+Line(482) = {4308,4309};
+Line(483) = {4309,4345};
+Line(484) = {4345,4344};
+Line(485) = {4344,4254};
+Line(486) = {4254,4253};
+Line(487) = {4253,4285};
+Line(488) = {4285,4284};
+Line(489) = {4284,4340};
+Line(490) = {4340,4339};
+Line(491) = {4339,4338};
+Line(492) = {4338,4246};
+Line(493) = {4246,4245};
+Line(494) = {4245,4281};
+Line(495) = {4281,4280};
+Line(496) = {4280,4279};
+Line(497) = {4279,4244};
+Line(498) = {4244,4243};
+Line(499) = {4243,4242};
+Line(500) = {4242,4296};
+Line(501) = {4296,4295};
+Line(502) = {4295,4300};
+Line(503) = {4300,4330};
+Line(504) = {4330,4331};
+Line(505) = {4331,4329};
+Line(506) = {4329,4232};
+Line(507) = {4232,4231};
+Line(508) = {4231,4230};
+Line(509) = {4230,4229};
+Line(510) = {4229,4228};
+Line(511) = {4228,4227};
+Line(512) = {4227,4225};
+Line(513) = {4225,4226};
+Line(514) = {4226,4312};
+Line(515) = {4312,4223};
+Line(516) = {4223,4224};
+Line(517) = {4224,4311};
+Line(518) = {4311,4310};
+Line(519) = {4310,4275};
+Line(520) = {4275,4316};
+Line(521) = {4316,4315};
+Line(522) = {4315,4313};
+Line(523) = {4313,4292};
+Line(524) = {4292,4272};
+Line(525) = {4272,4271};
+Line(526) = {4271,4270};
+Line(527) = {4270,4268};
+Line(528) = {4268,4291};
+Line(529) = {4291,4336};
+Line(530) = {4336,4298};
+Line Loop(531) = {384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,377,378,379,380,381,382,383};
+Line Loop(532) = {316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315};
+Line Loop(533) = {446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445};
+Line Loop(534) = {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40};
+Plane Surface(535) = {531,532,534,533};
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c5ac5c361ae4c3839c4841910d05ea92f209a607
--- /dev/null
+++ b/lib/Makefile
@@ -0,0 +1,4 @@
+
+clean:
+	$(RM) $(RMFLAGS) *.a
+
diff --git a/utils/Makefile b/utils/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ef5b3ac5ec7ccde43d8cba88540605c9d1549d63
--- /dev/null
+++ b/utils/Makefile
@@ -0,0 +1,17 @@
+# $Id: Makefile,v 1.1.1.1 2000-11-23 09:22:48 geuzaine Exp $
+
+CC       = c++
+C_FLAGS  = -g
+
+RM       = rm
+RMFLAGS  = -f
+
+dxf2geo: dxf2geo.c message.c 
+	$(CC) $(C_FLAGS) -o ../bin/dxf2geo -I../DataStr\
+              dxf2geo.c message.c ../lib/libDataStr.a -lm
+
+clean:
+	$(RM) $(RMFLAGS) *.o
+
+depend:
+	true
diff --git a/utils/build_machines b/utils/build_machines
new file mode 100644
index 0000000000000000000000000000000000000000..b42871ea38e3a058bab20cce555fc7e7aa589088
--- /dev/null
+++ b/utils/build_machines
@@ -0,0 +1,13 @@
+TRU64   elap53.montefiore.ulg.ac.be
+Linux   elap21.montefiore.ulg.ac.be
+IRIX    elap20.montefiore.ulg.ac.be
+SunOS   montef01.montefiore.ulg.ac.be
+HP-UX   stokes.ltas.ulg.ac.be
+AIX     sp2s.ulg.ac.be
+
+
+Where to change the version number?
+1) Makfile
+2) utils/gmsh.spec (2 occurrences)
+3) doc/gmsh.1 (2 occurrences)
+
diff --git a/utils/dxf2geo.c b/utils/dxf2geo.c
new file mode 100644
index 0000000000000000000000000000000000000000..c0d5254fad9add8d44a9fd9a05e6090e8a9fe17e
--- /dev/null
+++ b/utils/dxf2geo.c
@@ -0,0 +1,439 @@
+/* $Id: dxf2geo.c,v 1.1.1.1 2000-11-23 09:22:48 geuzaine Exp $ */
+
+/* 
+   AutoCAD DXF to Gmsh GEO Data File Converter
+   
+   This is a hack from the DXF to DKB translator by Aaron A. Collins (8/13/90)
+
+   Christophe.Geuzaine@AdValvas.be
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "Tree.h"
+
+#define DEG2RAD    3.14159265359/180.
+#define BUFSIZE    2048
+#define GEOLINE    1
+#define GEOCIRCLE  2
+
+FILE   *infile, *outfile;
+char    inname[80], outname[80], curobj[80], linbuf[BUFSIZE];
+long    primitives = 0L, degenerates = 0L;
+int     groupcode, curcolor, ints[10], nump=1 , numc=1;
+float   curthick, xcoords[10], ycoords[10], zcoords[10], floats[10], angles[10];
+float   max_x, max_y, max_z, min_x, min_y, min_z ;
+float   THETOL, THEROT=0., THETRANSX=0., THETRANSY=0. ;
+Tree_T *Point_T, *Curve_T ;
+
+struct Point {
+  int num ;
+  float x,y,z ;
+} ;
+
+int fcmpPoint (const void *a, const void *b){
+  struct Point *q,*w;
+
+  q = (struct Point*)a;
+  w = (struct Point*)b;
+  
+  if(fabs(q->x - w->x) < THETOL &&
+     fabs(q->y - w->y) < THETOL &&
+     fabs(q->x - w->x) < THETOL) return 0;
+
+  if(q->x > w->x) return(1);
+  if(q->x < w->x) return(-1);
+  if(q->y > w->y) return(1);
+  if(q->y < w->y) return(-1);
+  if(q->z > w->z) return(1);
+  if(q->z < w->z) return(-1);
+}
+
+int addpoint(struct Point *p){
+  struct Point *pp ;
+
+  if((pp = (struct Point*)Tree_PQuery(Point_T, p)))
+    return pp->num ;
+
+  p->num = nump++ ;
+  Tree_Add(Point_T, p) ;
+  return p->num ;
+}
+
+void writepoint(void *a, void *b){
+  struct Point *p ;
+  float x, y ;
+
+  p = (struct Point *) a ;
+
+  x = p->x ;
+  y = p->y ;
+  
+  p->x = cos(-THEROT*DEG2RAD) * x + sin(-THEROT*DEG2RAD) * y ;
+  p->y = -sin(-THEROT*DEG2RAD) * x + cos(-THEROT*DEG2RAD) * y;
+
+  p->x += THETRANSX ;
+  p->y += THETRANSY ;
+
+  fprintf(outfile, "Point (%d) = {%g *u, %g *u, %g *u, lc} ;\n", 
+	  p->num, p->x, p->y, p->z) ;
+}
+
+struct Curve {
+  int num, type, a, b, c ;
+} ;
+
+int fcmpCurve (const void *a, const void *b){
+  struct Curve *q,*w;
+
+  q = (struct Curve*)a;
+  w = (struct Curve*)b;
+
+  if(q->num < w->num) return(-1);
+  return(1);
+}
+
+void addcurve(struct Curve *c){
+  c->num = numc++ ;
+  Tree_Add(Curve_T, c) ;
+}
+
+void writecurve(void *a, void *b){
+  struct Curve *c ;
+
+  c = (struct Curve *) a ;
+
+  switch(c->type){
+  case GEOLINE :
+    fprintf(outfile, "Line (%d) = {%d, %d} ;\n",
+	    c->num, c->a, c->b) ;
+    break ;
+  case GEOCIRCLE :
+    fprintf(outfile, "Circle (%d) = {%d, %d, %d} ;\n",
+	    c->num, c->a, c->b, c->c) ;
+    break ;
+  }
+}
+
+
+
+
+
+int checkdegen(int a, int b, int c){ /* check for degenerate triangle structure */
+  if ( (xcoords[a] == xcoords[b] &&
+	ycoords[a] == ycoords[b] &&
+	zcoords[a] == zcoords[b]) || 
+       (xcoords[b] == xcoords[c] &&
+	ycoords[b] == ycoords[c] &&
+	zcoords[b] == zcoords[c]) || 
+       (xcoords[a] == xcoords[c] &&
+	ycoords[a] == ycoords[c] &&
+	zcoords[a] == zcoords[c]) )
+    return(1);
+  return(0);
+}
+
+void addobj(void){ /* dump out current object we should have all info on */
+  struct Point   p, *pp ;
+  struct Curve   c ;
+  int            num[10];
+  float          tmp ;
+
+  if (strstr(curobj, "POINT")){
+    p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; addpoint(&p) ;
+  }
+  else if (strstr(curobj, "LINE") || strstr(curobj, "3DLINE")){
+    if (xcoords[0] == xcoords[1] && ycoords[0] == ycoords[1] && zcoords[0] == zcoords[1]){
+      degenerates++;
+      return;
+    }
+    p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ;
+    p.x = xcoords[1] ; p.y = ycoords[1] ; p.z = zcoords[1] ; num[1] = addpoint(&p) ;
+    c.type = GEOLINE ; c.a = num[0] ; c.b = num[1] ; addcurve(&c) ;
+  }
+  else if (strstr(curobj, "CIRCLE")){
+    p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ;
+    p.x = xcoords[0]-floats[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; 
+    num[1] = addpoint(&p) ;
+    p.x = xcoords[0]+floats[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; 
+    num[2] = addpoint(&p) ;
+    p.x = xcoords[0] ; p.y = ycoords[0]-floats[0] ; p.z = zcoords[0] ; 
+    num[3] = addpoint(&p) ;
+    p.x = xcoords[0] ; p.y = ycoords[0]+floats[0] ; p.z = zcoords[0] ;
+    num[4] = addpoint(&p) ;
+    c.type = GEOCIRCLE ; c.a = num[2] ; c.b = num[0] ; c.c = num[4]; addcurve(&c) ;
+    c.type = GEOCIRCLE ; c.a = num[4] ; c.b = num[0] ; c.c = num[1]; addcurve(&c) ;
+    c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[3]; addcurve(&c) ;
+    c.type = GEOCIRCLE ; c.a = num[3] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ;
+  }
+  else if (strstr(curobj, "ARC")){
+    p.x = xcoords[0] ; p.y = ycoords[0] ; p.z = zcoords[0] ; num[0] = addpoint(&p) ;
+
+    p.x = xcoords[0]+floats[0]*cos(angles[0]*DEG2RAD) ;
+    p.y = ycoords[0]+floats[0]*sin(angles[0]*DEG2RAD) ; 
+    p.z = zcoords[0] ; num[1] = addpoint(&p) ;
+
+    p.x = xcoords[0]+floats[0]*cos(angles[1]*DEG2RAD) ;
+    p.y = ycoords[0]+floats[0]*sin(angles[1]*DEG2RAD) ; 
+    p.z = zcoords[0] ; num[2] = addpoint(&p) ;
+
+    if((angles[1]-angles[0] > 0 && angles[1]-angles[0] < 180) ||
+       (angles[1]-angles[0] < 0 && angles[1]-angles[0] < -180)){
+      c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ;
+    }
+    else{
+      if(angles[1]-angles[0] > 0){
+	p.x = xcoords[0]+floats[0]*cos((angles[1]-angles[0])*0.5*DEG2RAD) ;
+	p.y = ycoords[0]+floats[0]*sin((angles[1]-angles[0])*0.5*DEG2RAD) ;
+      }
+      else{
+	p.x = xcoords[0]+floats[0]*cos((angles[0]-angles[1])*0.5*DEG2RAD) ;
+	p.y = ycoords[0]+floats[0]*sin((angles[0]-angles[1])*0.5*DEG2RAD) ;
+      }
+      p.z = zcoords[0] ; num[3] = addpoint(&p) ;
+      c.type = GEOCIRCLE ; c.a = num[1] ; c.b = num[0] ; c.c = num[3]; addcurve(&c) ;
+      c.type = GEOCIRCLE ; c.a = num[3] ; c.b = num[0] ; c.c = num[2]; addcurve(&c) ;
+    }
+  }
+  else if (strstr(curobj, "TRACE")){ /* 2 back-to-back triangles */
+    if (checkdegen(0, 1, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0, 1, 2 */
+    
+    if (checkdegen(0, 3, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0 3 2 */
+  }
+  else if (strstr(curobj, "SOLID")){ /* 1 or 2 triangles */
+    if (checkdegen(0, 1, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0, 1, 2 */
+
+    if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] && zcoords[2] == zcoords[3])
+      return; /* one triangle was enough... */
+    
+    if (checkdegen(0, 3, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0 3 2 */
+  }
+  else if (strstr(curobj, "TEXT")){ /* not implemented for now */
+  }
+  else if (strstr(curobj, "SHAPE")){ /* these look very hard */
+  }
+  else if (strstr(curobj, "BLOCK")){ /* these look very hard */
+  }
+  else if (strstr(curobj, "ENDBLK")){ /* these look very hard */
+  }
+  else if (strstr(curobj, "INSERT")){ /* these look very hard */
+  }
+  else if (strstr(curobj, "ATTDEF")){ /* not implemented for now */
+  }
+  else if (strstr(curobj, "ATTRIB")){ /* not implemented for now */
+  }
+  else if (strstr(curobj, "POLYLINE")){ /* these look fairly hard */
+  }
+  else if (strstr(curobj, "VERTEX")){ /* these look fairly hard */
+  }
+  else if (strstr(curobj, "SEQEND")){ /* these look fairly hard */
+  }
+  else if (strstr(curobj, "3DFACE")){ /* 1 or 2 triangles */
+    if (checkdegen(0, 1, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0 1 2 */
+    
+    if (xcoords[2] == xcoords[3] && ycoords[2] == ycoords[3] && zcoords[2] == zcoords[3])
+      return; /* one triangle was enough... */
+    
+    if (checkdegen(0, 3, 2)){
+      degenerates++;
+      return;
+    }
+    /* add triangle 0 3 2 */
+  }
+  else if (strstr(curobj, "DIMENSION")){  /* not implemented for now */
+  }
+
+}
+
+int getline(void){ /* read a group code and the next line from infile */
+  fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */
+  if (feof(infile))
+    return(1);
+  sscanf(linbuf, "%3d", &groupcode);  /* scan out group code */
+  fgets(linbuf, BUFSIZE, infile); /* get a line from .DXF */
+  if (feof(infile))
+    return(1);
+  return(0);
+}
+
+
+
+int main(int argc, char *argv[]){
+  char *index;
+  
+  printf("dxf2geo, an AutoCad DXF to Gmsh GEO file translator\n");
+  if (argc < 3){
+    printf("Usage: %s infile[.dxf] tol [rot] [xtrans] [ytrans]\n", argv[0]);
+    exit(1);
+  }
+
+  THETOL = atof(argv[2]) ;
+  if(argc > 3) THEROT = atof(argv[3]) ;
+  if(argc > 4) THETRANSX = atof(argv[4]) ;
+  if(argc > 5) THETRANSY = atof(argv[5]) ;
+
+  strcpy(inname, argv[1]); /* make copy we can mess with */
+  if (!strchr(inname, '.')) /* no dot present in filename? */
+    strcat(inname, ".dxf");
+  if (!(infile = fopen(inname, "r"))){
+    printf("Cannot open input file %s\n", inname);
+    exit(1);
+  }
+  strcpy(outname, inname);
+  index = strchr(outname, '.'); /* find the dot */
+  strcpy(index, ".geo"); /* make new ext. .geo... */
+
+  if (!(outfile = fopen(outname, "w"))){
+    printf("Cannot create output file %s\n", outname);
+    fclose(infile);
+    exit(1);
+  }
+  
+  curobj[0] = '\0'; /* not working on any object currently */
+  curcolor = 7; /* and it also doesn't have a color yet... */
+  max_x = max_y = max_z = -10000000.0; /* init bounding limits */
+  min_x = min_y = min_z =  10000000.0;
+
+  Point_T = Tree_Create(sizeof(struct Point), fcmpPoint) ;
+  Curve_T = Tree_Create(sizeof(struct Curve), fcmpCurve) ;
+  
+find: 
+  while (!feof(infile)){ /* run file up to the "ENTITIES" section */
+    if (getline()) goto stopit;
+    if (groupcode == 0){ /* file section mark */
+      if (strstr(linbuf, "EOF")) goto stopit;
+      if (strstr(linbuf, "SECTION")){
+	if (getline()) goto stopit;
+	if (groupcode != 2) continue;
+	if (strstr(linbuf, "ENTITIES")) break;
+      }
+    }
+  }
+
+  while (!feof(infile)){ /* scan ENTITIES section */
+    if (getline()) /* get a group code and a line */
+      break;
+    if (groupcode < 10){ /* cardinal group codes */
+      switch(groupcode){
+      case 0: /* start of entity, table, file sep */
+	if (strstr(linbuf, "EOF")){
+	  addobj(); /* dump object */
+	  goto stopit;
+	}
+	if (strstr(linbuf, "ENDSEC")){
+	  addobj(); /* dump object */
+	  goto find;
+	}
+	addobj(); /* dump old object */
+	curobj[0] = '\0'; /* reset object */
+	curcolor = 7;
+	strcpy(curobj, linbuf); /* get new */
+	break;
+      case 1: /* primary text value for entity (?)*/
+	break;
+      case 2: /* block name, attribute tag, etc */
+      case 3: /* other names */
+      case 4:
+	break;
+      case 5: /* entity handle (hex string) */
+	break;
+      case 6: /* line type name */
+	break;
+      case 7: /* text style name */
+	break;
+      case 8: /* layer name */
+	break;
+      case 9: /* variable name ID (only in header)*/
+	break;
+      }
+    }
+    else if (groupcode >= 10 && groupcode < 19){ /* Some X coord */
+      sscanf(linbuf, "%f", &(xcoords[groupcode-10]));
+      if (xcoords[groupcode-10] > max_x)
+	max_x = xcoords[groupcode-10];
+      if (xcoords[groupcode-10] < min_x)
+	min_x = xcoords[groupcode-10];
+    }
+    else if (groupcode >= 20 && groupcode < 29){ /* Some Y coord */
+      sscanf(linbuf, "%f", &(ycoords[groupcode-20]));
+      if (ycoords[groupcode-20] > max_y)
+	max_y = ycoords[groupcode-20];
+      if (ycoords[groupcode-20] < min_y)
+	min_y = ycoords[groupcode-20];
+    }
+    else if (groupcode >= 30 && groupcode < 38){ /* Some Z coord */
+      sscanf(linbuf, "%f", &(zcoords[groupcode-30]));
+      if (zcoords[groupcode-30] > max_z)
+	max_z = zcoords[groupcode-30];
+      if (zcoords[groupcode-30] < min_z)
+	min_z = zcoords[groupcode-30];
+    }
+    else if (groupcode == 38){ /* entity elevation if nonzero */
+    }
+    else if (groupcode == 39){ /* entity thickness if nonzero */
+    }
+    else if (groupcode >= 40 && groupcode < 49){ /* misc floats */
+      sscanf(linbuf, "%f", &(floats[groupcode-40]));
+    }
+    else if (groupcode == 49){ /* repeated value groups */
+    }
+    else if (groupcode >= 50 && groupcode < 59){ /* misc angles */
+      sscanf(linbuf, "%f", &(angles[groupcode-50]));
+    }
+    else if (groupcode == 62){ /* Color number */
+      sscanf(linbuf, "%6d", &curcolor);
+    }
+    else if (groupcode == 66){ /* "entities follow" flag */
+    }
+    else if (groupcode >= 70 && groupcode < 79){ /* misc ints */
+      sscanf(linbuf, "%f", &(ints[groupcode-70]));
+    }
+    else if (groupcode == 210 || groupcode == 220 || groupcode == 230){
+      /* X, Y, Z components of extrusion direction */
+    }
+  }
+  
+stopit: 
+  fclose(infile);
+  fprintf(outfile, "/* Converted from AutoCad DXF file: %s */\n", inname);
+  fprintf(outfile, "/* Tolerance %g: %d points / %d curves */\n\n", 
+	  THETOL, Tree_Nbr(Point_T), Tree_Nbr(Curve_T));
+  fprintf(outfile, "u = 1; \nlc = 1 ;\n\n");
+  Tree_Action(Point_T, writepoint);
+  fprintf(outfile, "\n");
+  Tree_Action(Curve_T, writecurve);
+  fprintf(outfile, "\n");
+  fflush(outfile);
+  fclose(outfile);
+  printf("bounding box [%g,%g] [%g,%g] [%g,%g]\n", 
+	 min_x, max_x, min_y, max_y, min_z, max_z);
+  printf("tolerance %g: %d points / %d curves / %d degenerate entities removed\n",
+	 THETOL, Tree_Nbr(Point_T), Tree_Nbr(Curve_T), degenerates);
+  Tree_Delete(Point_T) ;
+  Tree_Delete(Curve_T) ;
+  exit(0);
+  
+}
+
diff --git a/utils/endian.c b/utils/endian.c
new file mode 100644
index 0000000000000000000000000000000000000000..25ec8d9037fe1ba5d1a5634d3cc9d57d7fef0c48
--- /dev/null
+++ b/utils/endian.c
@@ -0,0 +1,21 @@
+
+/* Are we little or big endian?  From Harbison&Steele.  */
+
+main () {
+  union{
+    long l;
+    char c[sizeof (long)];
+  } u;
+
+  u.l = 1;
+  if (u.c[0] == 1)
+    printf ("LittleEndian\n");
+  else if (u.c[sizeof (long) - 1] == 1)
+    printf ("BigEndian\n");
+  else
+    printf ("unknownEndian");
+  
+  exit (u.c[sizeof (long) - 1] == 1);
+}
+
+
diff --git a/utils/gmsh.spec b/utils/gmsh.spec
new file mode 100644
index 0000000000000000000000000000000000000000..27b458734bbdcb31464df78da464e24ae4d342ea
--- /dev/null
+++ b/utils/gmsh.spec
@@ -0,0 +1,55 @@
+Summary: A 3D mesh generator with pre- and post-processing facilities
+Name: gmsh
+Version: 0.995
+Source: gmsh-0.995.tar.gz
+Release: 1
+Copyright: distributable
+Group: Applications/Engineering
+URL: http://www.geuz.org/gmsh/
+Packager: Christophe.Geuzaine@AdValvas.be
+Buildroot: /var/tmp/%{name}-buildroot
+Requires: Mesa >= 3.0 lesstif >= 0.90
+
+%description 
+Gmsh is an automatic three-dimensional mesh generator, primarily
+Delaunay, with pre- and post-processing facilities. Its primal goal is
+to provide a simple meshing tool for academic test cases with
+parametric input and up to date visualization capabilities.  One of
+the strengths of Gmsh is its ability to respect a characteristic
+length field for the generation of adapted meshes on lines, surfaces
+and volumes. Gmsh requires the Mesa and Lesstif libraries to be
+installed on your system.
+
+Install Gmsh if you need a simple 3D finite element mesh generator.
+
+%prep
+
+%setup -c -q
+
+%build
+make linux
+mv bin/gmsh-Linux bin/gmsh
+make utils
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/usr/bin
+mkdir -p $RPM_BUILD_ROOT/usr/man/man1
+
+install -m 755 bin/gmsh $RPM_BUILD_ROOT/usr/bin/gmsh
+install -m 755 bin/dxf2geo $RPM_BUILD_ROOT/usr/bin/dxf2geo
+install -m 644 doc/gmsh.1 $RPM_BUILD_ROOT/usr/man/man1/gmsh.1
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+%doc demos/ex* demos/view*
+/usr/bin/gmsh
+/usr/bin/dxf2geo
+/usr/man/man1/gmsh*
+
+%changelog
+* Sat Sep 23 2000 Christophe Geuzaine <Christophe.Geuzaine@AdValvas.be> 
+ - initial revision
diff --git a/utils/message.c b/utils/message.c
new file mode 100644
index 0000000000000000000000000000000000000000..9b12df3b8fa3211a07a6453ed2710ca4f7126d4e
--- /dev/null
+++ b/utils/message.c
@@ -0,0 +1,13 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+#include <stdarg.h>
+
+void Msg(int level, char *fmt, ...){
+  va_list  args;
+  va_start (args, fmt);
+  vfprintf(stderr, fmt, args); fprintf(stderr, "\n");
+  va_end (args);
+}
+
diff --git a/utils/modifs b/utils/modifs
new file mode 100644
index 0000000000000000000000000000000000000000..572ca5a9badba4c54daf04a6139d6766d886320e
--- /dev/null
+++ b/utils/modifs
@@ -0,0 +1,22 @@
+#! /bin/csh -f
+
+if ( "$#argv" < "1" ) then
+  echo  usage: modif number_of_days
+  exit
+endif
+
+find . \( -mtime -$1 -a ! -type d -a ! -name "*.o" -a ! -name "*.a" -a ! -name "*.bak" -a ! -name "*.tar*" -a ! -name "*~" -a ! -name "gmsh*" \)
+
+echo "archiver ? (y/n)"
+set caca = "$<"
+
+if ("$caca" == "y") then
+  set liste = `find . \( -mtime -$1 -a ! -type d -a ! -name "*.o" -a ! -name "*.a" -a ! -name "*.bak" -a ! -name "*.tar*" -a ! -name "*~" -a ! -name "gmsh*" \)`
+  set date = `date "+%d.%m.%y-%Hh%M"`
+  tar cvf modifs-gmsh-$date.tar $liste
+  gzip modifs-gmsh-$date.tar
+else 
+  echo "bye"
+endif
+
+
diff --git a/utils/replace b/utils/replace
new file mode 100644
index 0000000000000000000000000000000000000000..6186bebf0b62585e0ee5bd6717ccc1ae40c9e77c
--- /dev/null
+++ b/utils/replace
@@ -0,0 +1,8 @@
+#!/bin/bash -
+
+for A in  $*
+do
+sed "s/msh_include/msh_Include/g" $A > $A.XXX
+/bin/rm -f $A
+mv $A.XXX $A   
+done