From 392a55ba153dbc1ea9d51b61be5ea62f5ef2c11e Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Tue, 3 Sep 2013 20:10:28 +0000 Subject: [PATCH] * New version of Trevor Strickler's QuadTri patch (+ examples in benchmarks/extrude_quadtri) * First pass at SU2 mesh export --- Common/CreateFile.cpp | 7 + Common/GmshDefines.h | 13 +- Common/SmoothData.cpp | 46 + Common/SmoothData.h | 8 +- Fltk/graphicWindow.cpp | 4 + Geo/CMakeLists.txt | 2 +- Geo/ExtrudeParams.cpp | 26 + Geo/ExtrudeParams.h | 9 + Geo/GFaceCompound.cpp | 75 +- Geo/GModel.h | 7 +- Geo/GModelIO_GEO.cpp | 16 + Geo/GModelIO_MESH.cpp | 6 - Geo/Geo.cpp | 2289 ++++--- Geo/MElement.cpp | 10 + Geo/MElement.h | 1 + Geo/MVertex.cpp | 12 + Geo/MVertex.h | 1 + Mesh/BoundaryLayers.cpp | 199 +- Mesh/QuadTriExtruded2D.cpp | 296 +- Mesh/QuadTriExtruded2D.h | 4 +- Mesh/QuadTriExtruded3D.cpp | 376 +- Mesh/QuadTriUtils.cpp | 222 +- Mesh/QuadTriUtils.h | 8 + Mesh/meshGFaceExtruded.cpp | 69 +- Parser/Gmsh.l | 4 + Parser/Gmsh.tab.cpp | 5935 +++++++++-------- Parser/Gmsh.tab.hpp | 228 +- Parser/Gmsh.y | 57 +- Parser/Gmsh.yy.cpp | 1172 ++-- benchmarks/extrude_quadtri/3sidedruled.stl.gz | Bin 0 -> 113230 bytes benchmarks/extrude_quadtri/READMEQUADTRI.txt | 253 + .../TransfiniteQuadTriExample.geo | 162 + .../compound_extrude_annular_example.geo | 74 + .../compound_extrude_example.geo | 18 + .../compound_extrude_from_stl_example.geo | 18 + benchmarks/extrude_quadtri/nico_torus.geo | 79 + ...truded_square_torus_interfaced_example.geo | 113 + ...adtri_square_torus_compound_interfaced.geo | 96 + .../scaledBoundaryLayerTest.geo | 61 + benchmarks/extrude_quadtri/tunnel_test.geo | 169 + 40 files changed, 7135 insertions(+), 5010 deletions(-) create mode 100644 benchmarks/extrude_quadtri/3sidedruled.stl.gz create mode 100644 benchmarks/extrude_quadtri/READMEQUADTRI.txt create mode 100644 benchmarks/extrude_quadtri/TransfiniteQuadTriExample.geo create mode 100644 benchmarks/extrude_quadtri/compound_extrude_annular_example.geo create mode 100644 benchmarks/extrude_quadtri/compound_extrude_example.geo create mode 100644 benchmarks/extrude_quadtri/compound_extrude_from_stl_example.geo create mode 100644 benchmarks/extrude_quadtri/nico_torus.geo create mode 100644 benchmarks/extrude_quadtri/quadtri_extruded_square_torus_interfaced_example.geo create mode 100644 benchmarks/extrude_quadtri/quadtri_square_torus_compound_interfaced.geo create mode 100644 benchmarks/extrude_quadtri/scaledBoundaryLayerTest.geo create mode 100644 benchmarks/extrude_quadtri/tunnel_test.geo diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp index 89cf2a95ec..83d3a653fa 100644 --- a/Common/CreateFile.cpp +++ b/Common/CreateFile.cpp @@ -47,6 +47,7 @@ int GetFileFormatFromExtension(const std::string &ext) else if(ext == ".diff") return FORMAT_DIFF; else if(ext == ".inp") return FORMAT_INP; else if(ext == ".celum")return FORMAT_CELUM; + else if(ext == ".su2") return FORMAT_SU2; else if(ext == ".nas") return FORMAT_BDF; else if(ext == ".p3d") return FORMAT_P3D; else if(ext == ".wrl") return FORMAT_VRML; @@ -101,6 +102,7 @@ std::string GetDefaultFileName(int format) case FORMAT_DIFF: name += ".diff"; break; case FORMAT_INP: name += ".inp"; break; case FORMAT_CELUM:name += ".celum"; break; + case FORMAT_SU2: name += ".su2"; break; case FORMAT_P3D: name += ".p3d"; break; case FORMAT_VRML: name += ".wrl"; break; case FORMAT_PLY2: name += ".ply2"; break; @@ -318,6 +320,11 @@ void CreateOutputFile(const std::string &fileName, int format, bool redraw) (name, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.scalingFactor); break; + case FORMAT_SU2: + GModel::current()->writeSU2 + (name, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.scalingFactor); + break; + case FORMAT_P3D: GModel::current()->writeP3D (name, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.scalingFactor); diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h index 09cf319b19..16632e84c2 100644 --- a/Common/GmshDefines.h +++ b/Common/GmshDefines.h @@ -48,6 +48,7 @@ #define FORMAT_INP 39 #define FORMAT_PLY2 40 #define FORMAT_CELUM 41 +#define FORMAT_SU2 42 // Element types #define TYPE_PNT 1 @@ -243,11 +244,11 @@ #define MESH_UNSTRUCTURED 2 // QuadTri options (structured/unstructured coupling with pyramids) -#define NO_QUADTRI 0 -#define QUADTRI_DBL_1 1 -#define QUADTRI_DBL_1_RECOMB 2 -#define QUADTRI_SNGL_1 3 -#define QUADTRI_SNGL_1_RECOMB 4 -#define TRANSFINITE_QUADTRI_1 5 +#define NO_QUADTRI 0 +#define QUADTRI_ADDVERTS_1 1 +#define QUADTRI_ADDVERTS_1_RECOMB 2 +#define QUADTRI_NOVERTS_1 3 +#define QUADTRI_NOVERTS_1_RECOMB 4 +#define TRANSFINITE_QUADTRI_1 5 #endif diff --git a/Common/SmoothData.cpp b/Common/SmoothData.cpp index c81bbc5d7b..4e004b1b63 100644 --- a/Common/SmoothData.cpp +++ b/Common/SmoothData.cpp @@ -17,6 +17,8 @@ xyzv::xyzv(const xyzv &other) x = other.x; y = other.y; z = other.z; + scaleValue = other.scaleValue; // Added by Trevor Strickler 07/10/2013 + scale_numvals = other.scale_numvals; // Added by Trevor Strickler 07/10/2013 nbvals = other.nbvals; nboccurences = other.nboccurences; if(other.vals && other.nbvals) { @@ -32,6 +34,8 @@ xyzv &xyzv::operator = (const xyzv &other) x = other.x; y = other.y; z = other.z; + scaleValue = other.scaleValue; // Added by Trevor Strickler 07/10/2013 + scale_numvals = other.scale_numvals; // Added by Trevor Strickler 07/10/2013 nbvals = other.nbvals; nboccurences = other.nboccurences; if(other.vals && other.nbvals) { @@ -61,6 +65,21 @@ void xyzv::update(int n, double *v) nboccurences++; } +// Added by Trevor Strickler +void xyzv::scale_update(double scale_inp) +{ + if( fabs(1.0 - scale_inp) <= eps ) + scale_inp = 1.0; + if( scale_inp != 1.0 || scaleValue != 1.0 ){ + double x1 = (double)(scale_numvals) / (double)(scale_numvals + 1); + double x2 = 1.0 / (double)(scale_numvals + 1); + scaleValue = ( x1 * scaleValue + x2 * scale_inp); + } + if( fabs(1.0 - scaleValue) <= eps ) + scaleValue = 1.0; + scale_numvals++; +} + void smooth_data::add(double x, double y, double z, int n, double *vals) { xyzv xyz(x, y, z); @@ -77,6 +96,23 @@ void smooth_data::add(double x, double y, double z, int n, double *vals) } } +//added by Trevor Strickler +void smooth_data::add_scale(double x, double y, double z, double scale_val) +{ + xyzv xyz(x, y, z); + std::set<xyzv, lessthanxyzv>::const_iterator it = c.find(xyz); + if(it == c.end()){ + xyz.scale_update(scale_val); + c.insert(xyz); + } + else { + // we can do this because we know that it will not destroy the set + // ordering + xyzv *p = (xyzv *) & (*it); + p->scale_update(scale_val); + } +} + bool smooth_data::get(double x, double y, double z, int n, double *vals) { std::set<xyzv, lessthanxyzv>::const_iterator it = c.find(xyzv(x, y, z)); @@ -87,6 +123,16 @@ bool smooth_data::get(double x, double y, double z, int n, double *vals) return true; } +//added by Trevor Strickler +bool smooth_data::get_scale(double x, double y, double z, double *scale_val) +{ + std::set<xyzv, lessthanxyzv>::const_iterator it = c.find(xyzv(x, y, z)); + if(it == c.end()) + return false; + (*scale_val) = it->scaleValue; + return true; +} + void smooth_data::normalize() { std::set<xyzv, lessthanxyzv>::iterator it = c.begin(); diff --git a/Common/SmoothData.h b/Common/SmoothData.h index 864f1bd519..8e3071964a 100644 --- a/Common/SmoothData.h +++ b/Common/SmoothData.h @@ -16,15 +16,19 @@ struct xyzv { double x, y, z, *vals; int nbvals; int nboccurences; + double scaleValue; // Added by Trevor Strickler for scaling last element layer in quadtri boundary layer to make better quality interfaces + int scale_numvals; static double eps; xyzv(double xx, double yy, double zz) - : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurences(0) {} + : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurences(0), scaleValue(1.0), scale_numvals(0) {} // Trevor Strickler modified ~xyzv(){ if(vals) delete [] vals; } // these are needed for set<> operations since the default copy // constructor won't allocate *vals xyzv(const xyzv & other); xyzv & operator = (const xyzv &other); void update(int n, double *v); + void scale_update(double scale_val); // Trevor Strickler + }; struct lessthanxyzv { @@ -54,6 +58,8 @@ class smooth_data{ smooth_data() {} void add(double x, double y, double z, int n, double *vals); bool get(double x, double y, double z, int n, double *vals); + void add_scale(double x, double y, double z, double scale_val); // Trevor Strickler + bool get_scale(double x, double y, double z, double *scale_val); // Trevor Strickler void normalize(); bool exportview(std::string filename); }; diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp index 0defb96aa6..37ed3c25c9 100644 --- a/Fltk/graphicWindow.cpp +++ b/Fltk/graphicWindow.cpp @@ -272,6 +272,8 @@ static int _save_inp(const char *name){ return unvinpFileDialog (name, "Abaqus INP Options", FORMAT_INP); } static int _save_celum(const char *name){ return genericMeshFileDialog (name, "CELUM Options", FORMAT_CELUM, false, false); } +static int _save_su2(const char *name){ return genericMeshFileDialog + (name, "SU2 Options", FORMAT_SU2, false, false); } static int _save_med(const char *name){ return genericMeshFileDialog (name, "MED Options", FORMAT_MED, false, false); } static int _save_mesh(const char *name){ return genericMeshFileDialog @@ -335,6 +337,7 @@ static int _save_auto(const char *name) case FORMAT_DIFF : return _save_diff(name); case FORMAT_INP : return _save_inp(name); case FORMAT_CELUM: return _save_celum(name); + case FORMAT_SU2 : return _save_su2(name); case FORMAT_P3D : return _save_p3d(name); case FORMAT_IR3 : return _save_ir3(name); case FORMAT_STL : return _save_stl(name); @@ -392,6 +395,7 @@ static void file_save_as_cb(Fl_Widget *w, void *data) {"Mesh - VRML Surface" TT "*.wrl", _save_vrml}, {"Mesh - VTK" TT "*.vtk", _save_vtk}, {"Mesh - PLY2 Surface" TT "*.ply2", _save_ply2}, + {"Mesh - SU2" TT "*.su2", _save_su2}, {"Post-processing - Gmsh POS" TT "*.pos", _save_view_pos}, #if defined(HAVE_MED) {"Post-processing - MED" TT "*.rmed", _save_view_med}, diff --git a/Geo/CMakeLists.txt b/Geo/CMakeLists.txt index c9cea87f40..4f8685ff42 100644 --- a/Geo/CMakeLists.txt +++ b/Geo/CMakeLists.txt @@ -27,7 +27,7 @@ set(SRC GModelIO_PLY.cpp GModelIO_VRML.cpp GModelIO_UNV.cpp GModelIO_BDF.cpp GModelIO_IR3.cpp GModelIO_DIFF.cpp GModelIO_GEOM.cpp GModelIO_INP.cpp GModelIO_MAIL.cpp GModelIO_P3D.cpp GModelIO_SGEOM.cpp GModelIO_CELUM.cpp - GModelIO_ACTRAN.cpp + GModelIO_ACTRAN.cpp GModelIO_SU2.cpp ExtrudeParams.cpp Geo.cpp GeoStringInterface.cpp GeoInterpolation.cpp diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp index deb9899b04..6c4510a79d 100644 --- a/Geo/ExtrudeParams.cpp +++ b/Geo/ExtrudeParams.cpp @@ -10,6 +10,14 @@ smooth_data* ExtrudeParams::normals[2] = {0, 0}; std::vector<SPoint3> ExtrudeParams::normalsCoherence; +// Added by Trevor Strickler to scale last layer size locally +// If one section of the boundary layer index = 0 or 1 is not supposed to be +// scaled...that section's normals will have scaleFactor = 1.0 (exactly 1.0 to all sig figs) +// ...however, if that non-scaled +// section borders a scaled section, the boundary normals will extrude consistently (an +// average of scaled and non-scaled heights). +bool ExtrudeParams::calcLayerScaleFactor[2] = {0,0}; // Added by Trevor Strickler + static void Projette(double p[3], double mat[3][3]) { double X = p[0] * mat[0][0] + p[1] * mat[0][1] + p[2] * mat[0][2]; @@ -27,6 +35,8 @@ ExtrudeParams::ExtrudeParams(int ModeEx) mesh.ExtrudeMesh = false; mesh.Recombine = false; mesh.QuadToTri = NO_QUADTRI; + //added by Trevor Strickler 07/07/2013 (determines if a layer is scaled by source grid size (1) or not (0))...only meant for boundary layers + mesh.ScaleLast = false; mesh.ViewIndex = -1; mesh.BoundaryLayerIndex = 0; } @@ -53,6 +63,22 @@ void ExtrudeParams::Extrude(int iLayer, int iElemLayer, double &x, double &y, double &z) { double t = u(iLayer, iElemLayer); + // Trevor Strickler (this definitely relies on fixing lateral boundary extruded + // surfaces if mesh.ScaleLast is changed by ReplaceDuplicates. This is done in BoundaryLayers.cpp right now. + if( geo.Type == BOUNDARY_LAYER && calcLayerScaleFactor[mesh.BoundaryLayerIndex] && iLayer == mesh.NbLayer-1 && + mesh.BoundaryLayerIndex >= 0 && mesh.BoundaryLayerIndex <= 1 && normals[mesh.BoundaryLayerIndex] ){ + double scale = 1.0; + normals[mesh.BoundaryLayerIndex]->get_scale(x, y, z, &scale); + if( fabs(scale-1.0) <= xyzv::eps ) + scale = 1.0; + else{ + if( mesh.NbLayer == 1 ) + t = t * scale; + else + t = (t-mesh.hLayer[mesh.NbLayer-2])*scale + mesh.hLayer[mesh.NbLayer-2]; + } + } + Extrude(t, x, y, z); } diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h index e02f5ca8b4..03775f84cd 100644 --- a/Geo/ExtrudeParams.h +++ b/Geo/ExtrudeParams.h @@ -42,6 +42,8 @@ public : int NbLayer; std::vector<int> NbElmLayer; std::vector<double> hLayer; + //added by Trevor Strickler 07/07/2013 (determines if a layer is scaled by source grid size (1) or not (0))...only meant for boundary layers + bool ScaleLast; std::map<int, std::pair<double, std::vector<int> > > Holes; int ViewIndex, BoundaryLayerIndex; }mesh; @@ -54,6 +56,13 @@ public : }geo; // for boundary layers + // Added by Trevor Strickler to scale last layer size locally + // If one section of the boundary layer index = 0 or 1 is not supposed to be + // scaled...that section's normals will have scaleFactor = 1.0 (exactly 1.0 to all sig figs) + // ...however, if that non-scaled + // section borders a scaled section, the boundary normals will extrude consistently (an + // average of scaled and non-scaled heights). + static bool calcLayerScaleFactor[2]; // Trevor Strickler, to give a global awareness of whether last layer scaling is to be used. static smooth_data *normals[2]; static std::vector<SPoint3> normalsCoherence; }; diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp index 8d2044caf5..8993eef77a 100644 --- a/Geo/GFaceCompound.cpp +++ b/Geo/GFaceCompound.cpp @@ -1014,6 +1014,8 @@ void GFaceCompound::getBoundingEdges() getUniqueEdges(_unique); l_edges.clear(); + l_dirs.clear(); // added by Trevor Strickler + if(_U0.size()){ // in case the bounding edges are explicitely given @@ -1066,8 +1068,36 @@ void GFaceCompound::getBoundingEdges() } } } + + // Added by Trevor Strickler (fill in the l_dirs) + std::list<GEdge*>::iterator it_loop; + std::list<std::list<GEdge*> >::iterator it_interior; + l_edges.clear(); + + for( it_interior = _interior_loops.begin(); it_interior != _interior_loops.end(); it_interior++ ){ + for( it_loop = it_interior->begin(); it_loop != it_interior->end(); it_loop++ ){ + l_edges.push_back( (*it_loop) ); + std::list<GEdge*>::iterator it_loop_next = it_loop; + it_loop_next++; + if( it_loop_next == it_interior->end() ) + it_loop_next = it_interior->begin(); + GVertex *vB = (*it_loop)->getBeginVertex(); + GVertex *vE = (*it_loop)->getEndVertex(); + GVertex *vB_next = (*it_loop_next)->getBeginVertex(); + GVertex *vE_next = (*it_loop_next)->getEndVertex(); + if( vB == vB_next || vB == vE_next ) + l_dirs.push_back(-1); + else if( vE == vB_next || vE == vE_next ) + l_dirs.push_back(1); + else{ + l_dirs.push_back(0); + } + } + } + } + double GFaceCompound::getSizeH() const { SBoundingBox3d bb; @@ -1134,6 +1164,49 @@ void GFaceCompound::computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &l _unique.erase(it); bool found = false; +/* Mod by Trevor Strickler: In the old implementation, the iterator + itx was incremented twice per loop and _loops was not set up correctly. + The While Loop below replaces the old for loop. +*/ + for(int i = 0; i < 2; i++) { + std::set<GEdge*>::iterator itx = _unique.begin(); + while (itx != _unique.end() ){ + GVertex *v1 = (*itx)->getBeginVertex(); + GVertex *v2 = (*itx)->getEndVertex(); + + std::set<GEdge*>::iterator itp = itx; + itx++; + + if(v1 == vE ){ + _loop.push_back(*itp); + vE = v2; + i = -1; + _unique.erase(itp); + } + else if(v2 == vE){ + _loop.push_back(*itp); + vE = v1; + i=-1; + _unique.erase(itp); + } + } + + if(vB == vE) { + found = true; + break; + } + + if(_unique.empty()) break; + + // Mod by Trevor Strickler: had to wrap this in an if + // or else it was executed when i == -1, which is not good. + if( i != -1 ){ + GVertex *temp = vB; + vB = vE; + vE = temp; + } + } + /* This is the old version of above nested loops before modified by Trevor Strickler for(int i = 0; i < 2; i++) { for(std::set<GEdge*>::iterator itx = _unique.begin(); itx != _unique.end(); ++itx){ @@ -1170,7 +1243,7 @@ void GFaceCompound::computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &l GVertex *temp = vB; vB = vE; vE = temp; - } + }*/ if(found == true) break; diff --git a/Geo/GModel.h b/Geo/GModel.h index 51a83c6411..6a973115a8 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -358,11 +358,6 @@ class GModel // access a mesh element by coordinates (using an octree search) MElement *getMeshElementByCoord(SPoint3 &p, int dim=-1, bool strict=true); std::vector<MElement*> getMeshElementsByCoord(SPoint3 &p, int dim=-1, bool strict=true); - // inline std::vector<MElement*> getMeshElementsByCoords(std::vector<std::vector<double, std::allocator<double> >, int dim=-1, bool strict=true){ - // std::vector<MElement*> e; - // for (unsigned int i = 0;i<p.size();i++)e.push_back (getMeshElementByCoord (p[i],dim,strict)); - // return e; - // } // access a mesh element by tag, using the element cache MElement *getMeshElementByTag(int n); @@ -700,6 +695,8 @@ class GModel // CEA triangulation int writeMAIL(const std::string &name, bool saveAll, double scalingFactor); + // SU2 mesh file + int writeSU2(const std::string &name, bool saveAll, double scalingFactor); }; #endif diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp index 2293dd0073..3b8cf19978 100644 --- a/Geo/GModelIO_GEO.cpp +++ b/Geo/GModelIO_GEO.cpp @@ -212,6 +212,22 @@ int GModel::importGEOInternals() f->meshAttributes.recombineAngle = s->RecombineAngle; f->meshAttributes.method = s->Method; f->meshAttributes.extrude = s->Extrude; + // transfinite import Added by Trevor Strickler. This helps when experimenting + // to create compounds from transfinite surfs. Not having it does not break + // anything Gmsh *officially* does right now, but maybe it was left out by mistake??? and could + // cause problems later? + f->meshAttributes.transfiniteArrangement = s->Recombine_Dir; + f->meshAttributes.corners.clear(); + for(int i = 0; i < List_Nbr(s->TrsfPoints); i++){ + Vertex *corn; + List_Read(s->TrsfPoints, i, &corn); + GVertex *gv = f->model()->getVertexByTag(corn->Num); + if(gv) + f->meshAttributes.corners.push_back(gv); + else + Msg::Error("Unknown vertex %d in transfinite attributes", corn->Num); + } + add(f); if(s->EmbeddedCurves){ for(int i = 0; i < List_Nbr(s->EmbeddedCurves); i++){ diff --git a/Geo/GModelIO_MESH.cpp b/Geo/GModelIO_MESH.cpp index f23fd8b897..2fa3fc6df3 100644 --- a/Geo/GModelIO_MESH.cpp +++ b/Geo/GModelIO_MESH.cpp @@ -328,9 +328,3 @@ int GModel::writeMESH(const std::string &name, int elementTagType, fclose(fp); return 1; } - - - - - - diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp index 7eec90ad6e..21b92b5123 100644 --- a/Geo/Geo.cpp +++ b/Geo/Geo.cpp @@ -1018,8 +1018,12 @@ static Curve *DuplicateCurve(Curve *c, bool copyMeshingMethod) static void CopySurface(Surface *s, Surface *ss, bool copyMeshingMethod) { - ss->Typ = s->Typ; - if(copyMeshingMethod){ + // Trevor Strickler modified + if( s->Typ == MSH_SURF_COMPOUND ) + ss->Typ = MSH_SURF_REGL; + else + ss->Typ = s->Typ; + if(copyMeshingMethod){ ss->Method = s->Method; ss->Recombine = s->Recombine; ss->RecombineAngle = s->RecombineAngle; @@ -1273,33 +1277,6 @@ void DeleteShape(int Type, int Num) } } -static void ColorCurve(int ip, unsigned int col) -{ - Curve *c = FindCurve(ip); - if(!c) - return; - c->Color.type = 1; - c->Color.mesh = c->Color.geom = col; -} - -static void ColorSurface(int is, unsigned int col) -{ - Surface *s = FindSurface(is); - if(!s) - return; - s->Color.type = 1; - s->Color.mesh = s->Color.geom = col; -} - -static void ColorVolume(int iv, unsigned int col) -{ - Volume *v = FindVolume(iv); - if(!v) - return; - v->Color.type = 1; - v->Color.mesh = v->Color.geom = col; -} - void ColorShape(int Type, int Num, unsigned int Color, bool Recursive) { Curve *c; @@ -2113,1175 +2090,1419 @@ void BoundaryShapes(List_T *shapes, List_T *shapesBoundary, bool combined) } } -// Extrusion routines - -void ProtudeXYZ(double &x, double &y, double &z, ExtrudeParams *e) +// Added by Trevor Strickler for extruding unique compound surface edges +static List_T* GetCompoundUniqueEdges(Surface *ps) { - 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]; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, &v); - SetRotationMatrix(matrix, e->geo.axe, e->geo.angle); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, &v); + // Two parts: + // Part 1: create map of keys with values abs(c->Num) that map to integer counts of abs(c->num) in compound + // Part 2: Make the unique list - T[0] = -T[0]; - T[1] = -T[1]; - T[2] = -T[2]; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, &v); + std::vector<int> comp_surfs = ps->compound; + if( comp_surfs.size() == 0 || ps->Typ != MSH_SURF_COMPOUND ){ + Msg::Error("Surface %d is not compound", ps->Num); + return (List_T*)(0); + } - x = v.Pos.X; - y = v.Pos.Y; - z = v.Pos.Z; + int num_surfs = comp_surfs.size(); + List_T *bnd_c= List_Create(4, 1, sizeof(Curve*)); - List_Reset(ListOfTransformedPoints); -} + std::map<int, unsigned int> count_map; -int Extrude_ProtudePoint(int type, int ip, - double T0, double T1, double T2, - double A0, double A1, double A2, - double X0, double X1, double X2, double alpha, - Curve **pc, Curve **prc, int final, - ExtrudeParams *e) -{ - double matrix[4][4], T[3], Ax[3], d; - Vertex V, *pv, *newp, *chapeau; - Curve *c; - int i; + for( int i = 0; i < num_surfs; i++ ){ + Surface *s = FindSurface(std::abs(comp_surfs[i])); + if( !s ){ + Msg::Error("Unknown surface %d", std::abs(comp_surfs[i]) ); + return (List_T*)(0); + } + int num_in_surf = List_Nbr(s->Generatrices); + for( int m = 0; m < num_in_surf; m++ ){ + Curve *c=0; + List_Read(s->Generatrices, m, &c); - pv = &V; - pv->Num = ip; - *pc = *prc = NULL; - if(!Tree_Query(GModel::current()->getGEOInternals()->Points, &pv)) - return 0; + if( !c ){ + Msg::Error("Unknown curve"); + return (List_T*)(0); + } - Msg::Debug("Extrude Point %d", ip); + if( !FindCurve(-c->Num) ) { + Msg::Error("Unknown curve %d", -c->Num ); + return (List_T*)(0); + } - chapeau = DuplicateVertex(pv); + int abs_Num = std::abs(c->Num) ; - switch (type) { - case TRANSLATE: - T[0] = T0; - T[1] = T1; - T[2] = T2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - if(!comparePosition(&pv, &chapeau)) - return pv->Num; - c = Create_Curve(NEWLINE(), MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0., 1.); - c->Control_Points = List_Create(2, 1, sizeof(Vertex *)); - c->Extrude = new ExtrudeParams; - c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - if(e) - c->Extrude->mesh = e->mesh; - List_Add(c->Control_Points, &pv); - List_Add(c->Control_Points, &chapeau); - c->beg = pv; - c->end = chapeau; - break; - case BOUNDARY_LAYER: - chapeau->Typ = MSH_POINT_BND_LAYER; - if(e) chapeau->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - c = Create_Curve(NEWLINE(), MSH_SEGM_BND_LAYER, 1, NULL, NULL, -1, -1, 0., 1.); - c->Control_Points = List_Create(2, 1, sizeof(Vertex *)); - c->Extrude = new ExtrudeParams; - c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - if(e) c->Extrude->mesh = e->mesh; - List_Add(c->Control_Points, &pv); - List_Add(c->Control_Points, &chapeau); - c->beg = pv; - c->end = chapeau; - break; - case ROTATE: - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - if(!comparePosition(&pv, &chapeau)) - return pv->Num; - c = Create_Curve(NEWLINE(), MSH_SEGM_CIRC, 1, NULL, NULL, -1, -1, 0., 1.); - c->Control_Points = List_Create(3, 1, sizeof(Vertex *)); - c->Extrude = new ExtrudeParams; - c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - if(e) - c->Extrude->mesh = e->mesh; - List_Add(c->Control_Points, &pv); - // compute circle center - newp = DuplicateVertex(pv); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - norme(Ax); - T[0] = pv->Pos.X - X0; - T[1] = pv->Pos.Y - X1; - T[2] = pv->Pos.Z - X2; - prosca(T, Ax, &d); - newp->Pos.X = X0 + d * Ax[0]; - newp->Pos.Y = X1 + d * Ax[1]; - newp->Pos.Z = X2 + d * Ax[2]; - List_Add(c->Control_Points, &newp); - List_Add(c->Control_Points, &chapeau); - c->beg = pv; - c->end = chapeau; - break; - case TRANSLATE_ROTATE: - d = CTX::instance()->geom.extrudeSplinePoints; - d = d ? d : 1; - c = Create_Curve(NEWLINE(), MSH_SEGM_SPLN, 1, NULL, NULL, -1, -1, 0., 1.); - c->Control_Points = - List_Create(CTX::instance()->geom.extrudeSplinePoints + 1, 1, sizeof(Vertex *)); - c->Extrude = new ExtrudeParams; - c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - if(e) - c->Extrude->mesh = e->mesh; - List_Add(c->Control_Points, &pv); - c->beg = pv; - for(i = 0; i < CTX::instance()->geom.extrudeSplinePoints; i++) { - if(i) - chapeau = DuplicateVertex(chapeau); - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha / d); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - T[0] = T0 / d; - T[1] = T1 / d; - T[2] = T2 / d; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToPoint(matrix, chapeau); - List_Add(c->Control_Points, &chapeau); + if( count_map.find( abs_Num ) == count_map.end() ) + count_map[ abs_Num ] = 1; + else + count_map[ abs_Num ]++; } - c->end = chapeau; - break; -// case ANALYTICAL: -// -// break; - default: - Msg::Error("Unknown extrusion type"); - return pv->Num; } - End_Curve(c); - Tree_Add(GModel::current()->getGEOInternals()->Curves, &c); - CreateReversedCurve(c); - *pc = c; - *prc = FindCurve(-c->Num); - - List_Reset(ListOfTransformedPoints); - - if(CTX::instance()->geom.autoCoherence && final) - ReplaceAllDuplicates(); + // Now, create the list of uniques. Exclude any repeats of abs(c->num) of + // course. + for( int i = 0; i < num_surfs; i++ ){ + Surface *s = FindSurface(std::abs(comp_surfs[i])); + int num_in_surf = List_Nbr(s->Generatrices); + for( int m = 0; m < num_in_surf; m++ ){ + Curve *c; + List_Read(s->Generatrices, m, &c); + std::map<int, unsigned int>::iterator itmap = count_map.find(std::abs(c->Num)); + if( itmap != count_map.end() ){ + if( itmap->second == 1 ){ + List_Add(bnd_c, &c); + // for duplicates -- if coherence on, do not need. if coherence off, should not try to find them + /*bool unique_flag = true; + std::map<int, unsigned int>::iterator itmap2 = count_map.begin(); + + for( ; itmap2 != count_map.end(); itmap2++ ){ + Curve *c_tmp1 = FindCurve( itmap2->first ); + Curve *c_tmp2 = FindCurve( -itmap2->first ); + + if( itmap != itmap2 && + ( !compareTwoCurves( &c_tmp1, &c ) || + !compareTwoCurves( &c_tmp2, &c ) ) ){ + unique_flag = false; + break; + } + } + if( unique_flag ) + List_Add(bnd_c, &c); + */ + } + } + else{ // if not found the curve in the count_map + Msg::Error("A problem in finding unique curves in extrusion of compound surface %d", + std::abs(ps->Num) ); + return (List_T*)(0); + } + } + } - return chapeau->Num; + return bnd_c; } -int Extrude_ProtudeCurve(int type, int ic, - double T0, double T1, double T2, - double A0, double A1, double A2, - double X0, double X1, double X2, double alpha, - Surface **ps, int final, - ExtrudeParams *e) + +// Added by Trevor Strickler +// This function returns a pointer to an allocated List_T type that +// contains an ordered list of unique edges for a compound surface. +// The edges are grouped into loops if there is more than one loop. +// The order is in order around a loop. +// Only one problem: Sometimes holes can be selected as the first loop, +// though this should not create many real problems on a copied top surface. +static List_T* GetOrderedUniqueEdges( Surface *s ) { - double matrix[4][4], T[3], Ax[3]; - Curve *CurveBeg, *CurveEnd; - Curve *ReverseChapeau, *ReverseBeg, *ReverseEnd; - Curve *pc, *revpc, *chapeau; - Surface *s; + List_T* unique = GetCompoundUniqueEdges(s); - pc = FindCurve(ic); - revpc = FindCurve(-ic); - *ps = NULL; + // need to sort out the list into ordered, oriented loops before passing + // these into the gmsh geometry system. + // Have to get list of surface numbers + int numgen = List_Nbr(unique); + List_T *gen_nums = List_Create(numgen, 1, sizeof(int)); - if(!pc || !revpc){ - return 0; + for( int i = 0; i < numgen; i++ ){ + Curve *ctemp = 0; + List_Read(unique, i, &ctemp); + if( !ctemp ){ + Msg::Error("No such curve."); + return 0; + } + + List_Add(gen_nums, &(ctemp->Num)); } - if(!pc->beg || !pc->end){ - Msg::Error("Cannot extrude curve with no begin/end points"); - return 0; + sortEdgesInLoop(0,gen_nums,1); + + // put sorted list of curve pointers back into compnd_gen and generatrices + List_Reset(unique); + for( int i = 0; i < List_Nbr(gen_nums); i++ ){ + + Curve *ctemp = 0; + int j; + List_Read(gen_nums, i, &j); + if( !(ctemp = FindCurve(j)) ){ + Msg::Error("No such curve %d.", j); + return 0; + } + List_Add(unique, &ctemp); } - Msg::Debug("Extrude Curve %d", ic); + List_Delete(gen_nums); - chapeau = DuplicateCurve(pc, false); + return unique; - chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); - chapeau->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - chapeau->Extrude->geo.Source = pc->Num; - if(e) - chapeau->Extrude->mesh = e->mesh; +} - switch (type) { - case TRANSLATE: - T[0] = T0; - T[1] = T1; - T[2] = T2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - break; - case BOUNDARY_LAYER: - chapeau->Typ = MSH_SEGM_BND_LAYER; - if(chapeau->beg){ - chapeau->beg->Typ = MSH_POINT_BND_LAYER; - if(e) chapeau->beg->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - } - if(chapeau->end){ - chapeau->end->Typ = MSH_POINT_BND_LAYER; - if(e) chapeau->end->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - } - for(int i = 0; i < List_Nbr(chapeau->Control_Points); i++){ - Vertex *v; - List_Read(chapeau->Control_Points, i, &v); - if(e) v->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - } - revpc = FindCurve(-chapeau->Num); - if(revpc) revpc->Typ = MSH_SEGM_BND_LAYER; - break; - case ROTATE: - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - break; - case TRANSLATE_ROTATE: - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - T[0] = T0; - T[1] = T1; - T[2] = T2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToCurve(matrix, chapeau); - break; - default: - Msg::Error("Unknown extrusion type"); - return pc->Num; - } +// Duplicate removal - Extrude_ProtudePoint(type, pc->beg->Num, T0, T1, T2, - A0, A1, A2, X0, X1, X2, alpha, - &CurveBeg, &ReverseBeg, 0, e); - Extrude_ProtudePoint(type, pc->end->Num, T0, T1, T2, - A0, A1, A2, X0, X1, X2, alpha, - &CurveEnd, &ReverseEnd, 0, e); +static int compareTwoPoints(const void *a, const void *b) +{ - if(!CurveBeg && !CurveEnd){ - return pc->Num; - } + Vertex *q = *(Vertex **)a; + Vertex *w = *(Vertex **)b; - if(type == BOUNDARY_LAYER) - s = Create_Surface(NEWSURFACE(), MSH_SURF_BND_LAYER); - else if(!CurveBeg || !CurveEnd) - s = Create_Surface(NEWSURFACE(), MSH_SURF_TRIC); - else - s = Create_Surface(NEWSURFACE(), MSH_SURF_REGL); + if(q->Typ != w->Typ) + return q->Typ - w->Typ; - s->Generatrices = List_Create(4, 1, sizeof(Curve *)); - s->Extrude = new ExtrudeParams; - s->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - s->Extrude->geo.Source = pc->Num; - if(e) - s->Extrude->mesh = e->mesh; + if(q->boundaryLayerIndex != w->boundaryLayerIndex) + return q->boundaryLayerIndex - w->boundaryLayerIndex; - ReverseChapeau = FindCurve(-chapeau->Num); + return comparePosition(a, b); +} - if(!CurveBeg) { - List_Add(s->Generatrices, &pc); - List_Add(s->Generatrices, &CurveEnd); - List_Add(s->Generatrices, &ReverseChapeau); +static int compareTwoCurves(const void *a, const void *b) +{ + Curve *c1 = *(Curve **)a; + Curve *c2 = *(Curve **)b; + int comp; + + if(c1->Typ != c2->Typ){ + if((c1->Typ == MSH_SEGM_CIRC && c2->Typ == MSH_SEGM_CIRC_INV) || + (c1->Typ == MSH_SEGM_CIRC_INV && c2->Typ == MSH_SEGM_CIRC) || + (c1->Typ == MSH_SEGM_ELLI && c2->Typ == MSH_SEGM_ELLI_INV) || + (c1->Typ == MSH_SEGM_ELLI_INV && c2->Typ == MSH_SEGM_ELLI)){ + // this is still ok + } + else + return c1->Typ - c2->Typ; } - else if(!CurveEnd) { - List_Add(s->Generatrices, &ReverseChapeau); - List_Add(s->Generatrices, &ReverseBeg); - List_Add(s->Generatrices, &pc); + + if(List_Nbr(c1->Control_Points) != List_Nbr(c2->Control_Points)) + return List_Nbr(c1->Control_Points) - List_Nbr(c2->Control_Points); + + if(!List_Nbr(c1->Control_Points)){ + if(!c1->beg || !c2->beg) + return 1; + comp = compareVertex(&c1->beg, &c2->beg); + if(comp) + return comp; + if(!c1->end || !c2->end) + return 1; + comp = compareVertex(&c1->end, &c2->end); + if(comp) + return comp; } else { - List_Add(s->Generatrices, &pc); - List_Add(s->Generatrices, &CurveEnd); - List_Add(s->Generatrices, &ReverseChapeau); - List_Add(s->Generatrices, &ReverseBeg); + for(int i = 0; i < List_Nbr(c1->Control_Points); i++){ + Vertex *v1, *v2; + List_Read(c1->Control_Points, i, &v1); + List_Read(c2->Control_Points, i, &v2); + comp = compareVertex(&v1, &v2); + if(comp) + return comp; + } } + return 0; +} - End_Surface(s); - Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); +static int compareTwoSurfaces(const void *a, const void *b) +{ + Surface *s1 = *(Surface **)a; + Surface *s2 = *(Surface **)b; - List_Reset(ListOfTransformedPoints); + // checking types is the "right thing" to do (see e.g. compareTwoCurves) + // but it would break backward compatibility (see e.g. tutorial/t2.geo), + // so let's just do it for boundary layer surfaces for now: + if(s1->Typ == MSH_SURF_BND_LAYER || s2->Typ == MSH_SURF_BND_LAYER || + s1->Typ == MSH_SURF_COMPOUND || s2->Typ == MSH_SURF_COMPOUND ){ + if(s1->Typ != s2->Typ) return s1->Typ - s2->Typ; + } - *ps = s; + // if both surfaces have no generatrices, stay on the safe side and + // assume they are different + if(!List_Nbr(s1->Generatrices) && !List_Nbr(s2->Generatrices)) + return 1; - if(CTX::instance()->geom.autoCoherence && final) - ReplaceAllDuplicates(); + return compare2Lists(s1->Generatrices, s2->Generatrices, compareAbsCurve); +} - return chapeau->Num; +static void MaxNumPoint(void *a, void *b) +{ + Vertex *v = *(Vertex **)a; + GModel::current()->getGEOInternals()->MaxPointNum = + std::max(GModel::current()->getGEOInternals()->MaxPointNum, v->Num); } -int Extrude_ProtudeSurface(int type, int is, - double T0, double T1, double T2, - double A0, double A1, double A2, - double X0, double X1, double X2, double alpha, - Volume **pv, ExtrudeParams *e) +static void MaxNumCurve(void *a, void *b) { - double matrix[4][4], T[3], Ax[3]; - Curve *c, *c2; - int i; - Surface *s, *ps, *chapeau; + Curve *c = *(Curve **)a; + GModel::current()->getGEOInternals()->MaxLineNum = + std::max(GModel::current()->getGEOInternals()->MaxLineNum, c->Num); +} - *pv = NULL; +static void MaxNumSurface(void *a, void *b) +{ + Surface *s = *(Surface **)a; + GModel::current()->getGEOInternals()->MaxSurfaceNum = + std::max(GModel::current()->getGEOInternals()->MaxSurfaceNum, s->Num); +} - // 'is' can be negative, to signify that the surface orientation - // should be reversed. This orientation information is only used at - // the moment when creating boundary layers - if(!(ps = FindSurface(std::abs(is)))) - return 0; - Msg::Debug("Extrude Surface %d", is); +// Modified by Trevor Strickler +static void ReplaceDuplicatePoints(std::map<int, int> * v_report = 0) +{ + // FIXME: This routine is in fact logically wrong (the compareTwoPoints + // function used in the avl tree is not a appropriate comparison + // function). The fix is simple (use a multi dimensional tree, e.g., + // MVertexPositionSet), but fixing the routine would break backward + // compatibility with old .geo files. This will be fixed in the new abstract + // GModel CAD creation routines. + Vertex *v, *v2, **pv, **pv2; + Curve *c; + Surface *s; + Volume *vol; + Tree_T *points2delete = Tree_Create(sizeof(Vertex *), compareVertex); + Tree_T *allNonDuplicatedPoints = Tree_Create(sizeof(Vertex *), compareTwoPoints); - chapeau = DuplicateSurface(ps, false); - chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); - chapeau->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - chapeau->Extrude->geo.Source = is; // not ps->Num: we need the sign info - if(e) - chapeau->Extrude->mesh = e->mesh; + // Create unique points - for(i = 0; i < List_Nbr(chapeau->Generatrices); i++) { - List_Read(ps->Generatrices, i, &c2); - List_Read(chapeau->Generatrices, i, &c); - if(c->Num < 0){ - int nn = -c->Num; - if(!(c = FindCurve(nn))) { - Msg::Error("Unknown curve %d", nn); - return ps->Num; + int start = Tree_Nbr(GModel::current()->getGEOInternals()->Points); + + List_T *All = Tree2List(GModel::current()->getGEOInternals()->Points); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &v); + if(!Tree_Search(allNonDuplicatedPoints, &v)) { + Tree_Insert(allNonDuplicatedPoints, &v); + } + else { + Tree_Suppress(GModel::current()->getGEOInternals()->Points, &v); + Tree_Insert(points2delete, &v); + // Trevor Strickler + if(v_report){ + std::map<int, int>::iterator m_it = v_report->find(v->Num); + if( m_it != v_report->end() ){ + Vertex **v_rep = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, &v); + m_it->second = (*v_rep)->Num; + } } } - c->Extrude = new ExtrudeParams(COPIED_ENTITY); - c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - // don't take the abs(): the sign of c2->Num is important (used - // when copying the mesh in the extrusion routine) - c->Extrude->geo.Source = c2->Num; - if(e) - c->Extrude->mesh = e->mesh; } + List_Delete(All); - // FIXME: this is a really ugly hack for backward compatibility, so - // that we don't screw up the old .geo files too much. (Before - // version 1.54, we didn't always create new volumes during "Extrude - // Surface". Now we do, but with "CTX::instance()->geom.oldNewreg==1", this - // bumps the NEWREG() counter, and thus changes the whole automatic - // numbering sequence.) So we locally force oldNewreg to 0: in most - // cases, since we define points, curves, etc., before defining - // volumes, the NEWVOLUME() call below will return a fairly low - // number, that will not interfere with the other numbers... - int tmp = CTX::instance()->geom.oldNewreg; - CTX::instance()->geom.oldNewreg = 0; - Volume *v = Create_Volume(NEWVOLUME(), MSH_VOLUME); - CTX::instance()->geom.oldNewreg = tmp; + int end = Tree_Nbr(GModel::current()->getGEOInternals()->Points); - v->Extrude = new ExtrudeParams; - v->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); - v->Extrude->geo.Source = is; - if(e) - v->Extrude->mesh = e->mesh; - int ori = -1; - List_Add(v->Surfaces, &ps); - List_Add(v->SurfacesOrientations, &ori); - ori = 1; - List_Add(v->Surfaces, &chapeau); - List_Add(v->SurfacesOrientations, &ori); + if(start == end) { + Tree_Delete(points2delete); + Tree_Delete(allNonDuplicatedPoints); + return; + } - for(i = 0; i < List_Nbr(ps->Generatrices); i++) { - List_Read(ps->Generatrices, i, &c); - Extrude_ProtudeCurve(type, c->Num, T0, T1, T2, A0, A1, A2, X0, X1, X2, - alpha, &s, 0, e); - if(s){ - if(c->Num < 0) - ori = -1; - else - ori = 1; - List_Add(v->Surfaces, &s); - List_Add(v->SurfacesOrientations, &ori); - } + Msg::Debug("Removed %d duplicate points", start - end); + + if(CTX::instance()->geom.oldNewreg) { + GModel::current()->getGEOInternals()->MaxPointNum = 0; + Tree_Action(GModel::current()->getGEOInternals()->Points, MaxNumPoint); } - switch (type) { - case TRANSLATE: - T[0] = T0; - T[1] = T1; - T[2] = T2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - break; - case BOUNDARY_LAYER: - chapeau->Typ = MSH_SURF_BND_LAYER; - for(int i = 0; i < List_Nbr(chapeau->Generatrices); i++) { - List_Read(chapeau->Generatrices, i, &c); - c->Typ = MSH_SEGM_BND_LAYER; - c = FindCurve(-c->Num); - c->Typ = MSH_SEGM_BND_LAYER; - if(c->beg){ - c->beg->Typ = MSH_POINT_BND_LAYER; - if(e) c->beg->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - } - if(c->end){ - c->end->Typ = MSH_POINT_BND_LAYER; - if(e) c->end->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; - } - for(int i = 0; i < List_Nbr(c->Control_Points); i++){ - Vertex *v; - List_Read(c->Control_Points, i, &v); - if(e) v->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; + // Replace old points in curves + + All = Tree2List(GModel::current()->getGEOInternals()->Curves); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &c); + // replace begin/end points + if(!Tree_Query(allNonDuplicatedPoints, &c->beg)) + Msg::Error("Weird point %d in Coherence", c->beg->Num); + if(!Tree_Query(allNonDuplicatedPoints, &c->end)) + Msg::Error("Weird point %d in Coherence", c->end->Num); + // replace control points + for(int j = 0; j < List_Nbr(c->Control_Points); j++) { + pv = (Vertex **)List_Pointer(c->Control_Points, j); + if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) + Msg::Error("Weird point %d in Coherence", (*pv)->Num); + else + List_Write(c->Control_Points, j, pv2); + } + // replace extrusion sources + if(c->Extrude && c->Extrude->geo.Mode == EXTRUDED_ENTITY){ + v2 = FindPoint(std::abs(c->Extrude->geo.Source), points2delete); + if(v2){ + if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, &v2))) + Msg::Error("Weird point %d in Coherence", v2->Num); + else + c->Extrude->geo.Source = (*pv2)->Num; } } - break; - case ROTATE: - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - break; - case TRANSLATE_ROTATE: - T[0] = -X0; - T[1] = -X1; - T[2] = -X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - Ax[0] = A0; - Ax[1] = A1; - Ax[2] = A2; - SetRotationMatrix(matrix, Ax, alpha); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - T[0] = X0; - T[1] = X1; - T[2] = X2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - T[0] = T0; - T[1] = T1; - T[2] = T2; - SetTranslationMatrix(matrix, T); - List_Reset(ListOfTransformedPoints); - ApplyTransformationToSurface(matrix, chapeau); - break; - default: - Msg::Error("Unknown extrusion type"); - return ps->Num; } + List_Delete(All); - // this is done only for backward compatibility with the old - // numbering scheme - Tree_Suppress(GModel::current()->getGEOInternals()->Surfaces, &chapeau); - - chapeau->Num = NEWSURFACE(); - - GModel::current()->getGEOInternals()->MaxSurfaceNum = chapeau->Num; - Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &chapeau); + // Replace old points in surfaces - Tree_Add(GModel::current()->getGEOInternals()->Volumes, &v); + All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &s); + // replace transfinite corners + for(int j = 0; j < List_Nbr(s->TrsfPoints); j++){ + pv = (Vertex **)List_Pointer(s->TrsfPoints, j); + if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) + Msg::Error("Weird point %d in Coherence", (*pv)->Num); + else + List_Write(s->TrsfPoints, j, pv2); + } + } + List_Delete(All); - *pv = v; + // Replace old points in volumes - if(CTX::instance()->geom.autoCoherence) - ReplaceAllDuplicates(); + All = Tree2List(GModel::current()->getGEOInternals()->Volumes); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &vol); + // replace transfinite corners + for(int j = 0; j < List_Nbr(vol->TrsfPoints); j++){ + pv = (Vertex **)List_Pointer(vol->TrsfPoints, j); + if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) + Msg::Error("Weird point %d in Coherence", (*pv)->Num); + else + List_Write(vol->TrsfPoints, j, pv2); + } + } + List_Delete(All); - List_Reset(ListOfTransformedPoints); + // Replace old points in physical groups + for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ + PhysicalGroup *p = *(PhysicalGroup**)List_Pointer + (GModel::current()->getGEOInternals()->PhysicalGroups, i); + if(p->Typ == MSH_PHYSICAL_POINT){ + for(int j = 0; j < List_Nbr(p->Entities); j++){ + int num; + List_Read(p->Entities, j, &num); + v2 = FindPoint(std::abs(num), points2delete); + if(v2){ + if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, &v2))) + Msg::Error("Weird point %d in Coherence", v2->Num); + else + List_Write(p->Entities, j, &(*pv2)->Num); + } + } + } + } - return chapeau->Num; + Tree_Action(points2delete, Free_Vertex); + Tree_Delete(points2delete); + Tree_Delete(allNonDuplicatedPoints); } -void ExtrudeShape(int extrude_type, int shape_type, int shape_num, - double T0, double T1, double T2, - double A0, double A1, double A2, - double X0, double X1, double X2, double alpha, - ExtrudeParams *e, - List_T *list_out) -{ - Shape shape; - shape.Type = shape_type; - shape.Num = shape_num; - List_T *tmp = List_Create(1, 1, sizeof(Shape)); - List_Add(tmp, &shape); - ExtrudeShapes(extrude_type, tmp, - T0, T1, T2, - A0, A1, A2, - X0, X1, X2, alpha, - e, - list_out); - List_Delete(tmp); -} +//Modified by Trevor Strickler +static void ReplaceDuplicateCurves(std::map<int, int> * c_report = 0) -void ExtrudeShapes(int type, List_T *list_in, - double T0, double T1, double T2, - double A0, double A1, double A2, - double X0, double X1, double X2, double alpha, - ExtrudeParams *e, - List_T *list_out) { + Curve *c, *c2, **pc, **pc2; + Surface *s; + Tree_T *curves2delete = Tree_Create(sizeof(Curve *), compareCurve); + Tree_T *allNonDuplicatedCurves = Tree_Create(sizeof(Curve *), compareTwoCurves); - for(int i = 0; i < List_Nbr(list_in); i++){ - Shape shape; - List_Read(list_in, i, &shape); - switch(shape.Type){ - case MSH_POINT: - { - Curve *pc = 0, *prc = 0; - Shape top; - top.Num = Extrude_ProtudePoint(type, shape.Num, T0, T1, T2, - A0, A1, A2, X0, X1, X2, alpha, - &pc, &prc, 1, e); - top.Type = MSH_POINT; - List_Add(list_out, &top); - if(pc){ - Shape body; - body.Num = pc->Num; - body.Type = pc->Typ; - List_Add(list_out, &body); + // Create unique curves + + int start = Tree_Nbr(GModel::current()->getGEOInternals()->Curves); + + List_T *All = Tree2List(GModel::current()->getGEOInternals()->Curves); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &c); + if(c->Num > 0) { + if(!Tree_Search(allNonDuplicatedCurves, &c)) { + Tree_Insert(allNonDuplicatedCurves, &c); + if(!(c2 = FindCurve(-c->Num))) { + Msg::Error("Unknown curve %d", -c->Num); + List_Delete(All); + return; } + Tree_Insert(allNonDuplicatedCurves, &c2); } - break; - case MSH_SEGM_LINE: - case MSH_SEGM_SPLN: - case MSH_SEGM_BSPLN: - case MSH_SEGM_BEZIER: - case MSH_SEGM_CIRC: - case MSH_SEGM_CIRC_INV: - case MSH_SEGM_ELLI: - case MSH_SEGM_ELLI_INV: - case MSH_SEGM_NURBS: - { - Surface *ps = 0; - Shape top; - top.Num = Extrude_ProtudeCurve(type, shape.Num, T0, T1, T2, - A0, A1, A2, X0, X1, X2, alpha, - &ps, 1, e); - Curve *pc = FindCurve(top.Num); - top.Type = pc ? pc->Typ : 0; - List_Add(list_out, &top); - if(ps){ - Shape body; - body.Num = ps->Num; - body.Type = ps->Typ; - List_Add(list_out, &body); - if(CTX::instance()->geom.extrudeReturnLateral){ - for(int j = 0; j < List_Nbr(ps->Generatrices); j++){ - Curve *c; - List_Read(ps->Generatrices, j, &c); - if(abs(c->Num) != shape.Num && abs(c->Num) != top.Num){ - Shape side; - side.Num = c->Num; - side.Type = c->Typ; - List_Add(list_out, &side); - } - } - } + else { + Tree_Suppress(GModel::current()->getGEOInternals()->Curves, &c); + if(!(c2 = FindCurve(-c->Num))) { + Msg::Error("Unknown curve %d", -c->Num); + break; } + Tree_Suppress(GModel::current()->getGEOInternals()->Curves, &c2); + Tree_Insert(curves2delete, &c); + Tree_Insert(curves2delete, &c2); + // Trevor Strickler + if(c_report){ + std::map<int, int>::iterator m_it = c_report->find(c->Num); + if( m_it != c_report->end() ){ + Curve **c_rep = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c); + m_it->second = (*c_rep)->Num; + } + m_it = c_report->find(c2->Num); + if( m_it != c_report->end() ){ + Curve **c_rep_neg = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2); + m_it->second = (*c_rep_neg)->Num; + } + } } - break; - case MSH_SURF_REGL: - case MSH_SURF_TRIC: - case MSH_SURF_PLAN: - case MSH_SURF_DISCRETE: - case MSH_SURF_COMPOUND: - { - Volume *pv = 0; - Shape top; - top.Num = Extrude_ProtudeSurface(type, shape.Num, T0, T1, T2, - A0, A1, A2, X0, X1, X2, alpha, - &pv, e); - Surface *ps = FindSurface(top.Num); - top.Type = ps ? ps->Typ : 0; + } + } + List_Delete(All); - List_Add(list_out, &top); - if(pv){ - Shape body; - body.Num = pv->Num; - body.Type = pv->Typ; - List_Add(list_out, &body); - if(CTX::instance()->geom.extrudeReturnLateral){ - for(int j = 0; j < List_Nbr(pv->Surfaces); j++){ - Surface *s; - List_Read(pv->Surfaces, j, &s); - if(abs(s->Num) != shape.Num && abs(s->Num) != top.Num){ - Shape side; - side.Num = s->Num; - side.Type = s->Typ; - List_Add(list_out, &side); - } - } - } + int end = Tree_Nbr(GModel::current()->getGEOInternals()->Curves); + + if(start == end) { + Tree_Delete(curves2delete); + Tree_Delete(allNonDuplicatedCurves); + return; + } + + Msg::Debug("Removed %d duplicate curves", start - end); + + if(CTX::instance()->geom.oldNewreg) { + GModel::current()->getGEOInternals()->MaxLineNum = 0; + Tree_Action(GModel::current()->getGEOInternals()->Curves, MaxNumCurve); + } + + // Replace old curves in curves + + All = Tree2List(GModel::current()->getGEOInternals()->Curves); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &c); + // replace extrusion sources + if(c->Extrude && c->Extrude->geo.Mode == COPIED_ENTITY){ + c2 = FindCurve(std::abs(c->Extrude->geo.Source), curves2delete); + if(c2){ + if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) + Msg::Error("Weird curve %d in Coherence", c2->Num); + else + c->Extrude->geo.Source = (*pc2)->Num; + } + } + } + List_Delete(All); + + // Replace old curves in surfaces + + All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &s); + // replace bounding curves + for(int j = 0; j < List_Nbr(s->Generatrices); j++) { + pc = (Curve **)List_Pointer(s->Generatrices, j); + if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, pc))) + Msg::Error("Weird curve %d in Coherence", (*pc)->Num); + else { + List_Write(s->Generatrices, j, pc2); + // arghhh: check compareTwoCurves! + End_Curve(*pc2); + } + } + // replace extrusion sources + if(s->Extrude && s->Extrude->geo.Mode == EXTRUDED_ENTITY){ + c2 = FindCurve(std::abs(s->Extrude->geo.Source), curves2delete); + if(c2){ + if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) + Msg::Error("Weird curve %d in Coherence", c2->Num); + else + s->Extrude->geo.Source = (*pc2)->Num; + } + } + } + List_Delete(All); + + // Replace old curves in physical groups + for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ + PhysicalGroup *p = *(PhysicalGroup**)List_Pointer + (GModel::current()->getGEOInternals()->PhysicalGroups, i); + if(p->Typ == MSH_PHYSICAL_LINE){ + for(int j = 0; j < List_Nbr(p->Entities); j++){ + int num; + List_Read(p->Entities, j, &num); + c2 = FindCurve(std::abs(num), curves2delete); + if(c2){ + if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) + Msg::Error("Weird curve %d in Coherence", c2->Num); + else + List_Write(p->Entities, j, &(*pc2)->Num); + } + } + } + } + + Tree_Action(curves2delete, Free_Curve); + Tree_Delete(curves2delete); + Tree_Delete(allNonDuplicatedCurves); +} + +// Modified By Trevor Strickler +static void ReplaceDuplicateSurfaces(std::map<int, int> *s_report = 0) +{ + Surface *s, *s2, **ps, **ps2; + Volume *vol; + Tree_T *surfaces2delete = Tree_Create(sizeof(Surface *), compareSurface); + Tree_T *allNonDuplicatedSurfaces = Tree_Create(sizeof(Surface *), compareTwoSurfaces); + + // Create unique surfaces + + int start = Tree_Nbr(GModel::current()->getGEOInternals()->Surfaces); + + List_T *All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &s); + if(s->Num > 0) { + if(!Tree_Search(allNonDuplicatedSurfaces, &s)) { + Tree_Insert(allNonDuplicatedSurfaces, &s); + } + else { + Tree_Suppress(GModel::current()->getGEOInternals()->Surfaces, &s); + Tree_Insert(surfaces2delete, &s); + // Trevor Strickler + if(s_report){ + std::map<int, int>::iterator m_it = (*s_report).find(s->Num); + if( m_it != s_report->end() ){ + Surface **s_rep = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s); + m_it->second = (*s_rep)->Num; + } + } + } + } + } + List_Delete(All); + + int end = Tree_Nbr(GModel::current()->getGEOInternals()->Surfaces); + + if(start == end) { + Tree_Delete(surfaces2delete); + Tree_Delete(allNonDuplicatedSurfaces); + return; + } + + Msg::Debug("Removed %d duplicate surfaces", start - end); + + if(CTX::instance()->geom.oldNewreg) { + GModel::current()->getGEOInternals()->MaxSurfaceNum = 0; + Tree_Action(GModel::current()->getGEOInternals()->Surfaces, MaxNumSurface); + } + + // Replace old surfaces in surfaces + + All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &s); + // replace extrusion sources + if(s->Extrude && s->Extrude->geo.Mode == COPIED_ENTITY){ + s2 = FindSurface(std::abs(s->Extrude->geo.Source), surfaces2delete); + if(s2){ + if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) + Msg::Error("Weird surface %d in Coherence", s2->Num); + else + s->Extrude->geo.Source = (*ps2)->Num; + } + } + } + List_Delete(All); + + // Replace old surfaces in volumes + + All = Tree2List(GModel::current()->getGEOInternals()->Volumes); + for(int i = 0; i < List_Nbr(All); i++) { + List_Read(All, i, &vol); + // replace bounding surfaces + for(int j = 0; j < List_Nbr(vol->Surfaces); j++) { + ps = (Surface **)List_Pointer(vol->Surfaces, j); + if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, ps))) + Msg::Error("Weird surface %d in Coherence", (*ps)->Num); + else + List_Write(vol->Surfaces, j, ps2); + } + // replace extrusion sources + if(vol->Extrude && vol->Extrude->geo.Mode == EXTRUDED_ENTITY){ + s2 = FindSurface(std::abs(vol->Extrude->geo.Source), surfaces2delete); + if(s2){ + if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) + Msg::Error("Weird surface %d in Coherence", s2->Num); + else + vol->Extrude->geo.Source = (*ps2)->Num; + } + } + } + List_Delete(All); + + // Replace old surfaces in physical groups + for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ + PhysicalGroup *p = *(PhysicalGroup**)List_Pointer + (GModel::current()->getGEOInternals()->PhysicalGroups, i); + if(p->Typ == MSH_PHYSICAL_SURFACE){ + for(int j = 0; j < List_Nbr(p->Entities); j++){ + int num; + List_Read(p->Entities, j, &num); + s2 = FindSurface(std::abs(num), surfaces2delete); + if(s2){ + if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) + Msg::Error("Weird surface %d in Coherence", s2->Num); + else + List_Write(p->Entities, j, &(*ps2)->Num); } } - break; - default: - Msg::Error("Impossible to extrude entity %d (of type %d)", - shape.Num, shape.Type); - break; } } + Tree_Action(surfaces2delete, Free_Surface); + Tree_Delete(surfaces2delete); + Tree_Delete(allNonDuplicatedSurfaces); } -// Duplicate removal - -static int compareTwoPoints(const void *a, const void *b) +// Trevor Strickler added argument to return select changed shape nums +// this is needed to set chapeau correctly in situations where chapeau gets replaced! +// report has a default argument of zero. +static void ReplaceAllDuplicates(std::vector<std::map<int, int> > &report) { + std::map<int, int> *vertex_report = 0; + std::map<int, int> *curve_report = 0; + std::map<int, int> *surface_report = 0; + if( report.size() >=1 && report[0].size() ) + vertex_report = &(report[0]); + if( report.size() >=2 && report[1].size() ) + curve_report = &(report[1]); + if( report.size() >= 3 && report[2].size() ) + surface_report = &(report[2]); - Vertex *q = *(Vertex **)a; - Vertex *w = *(Vertex **)b; - - if(q->Typ != w->Typ) - return q->Typ - w->Typ; + ReplaceDuplicatePoints(vertex_report); + ReplaceDuplicateCurves(curve_report); + ReplaceDuplicateSurfaces(surface_report); +} - if(q->boundaryLayerIndex != w->boundaryLayerIndex) - return q->boundaryLayerIndex - w->boundaryLayerIndex; - return comparePosition(a, b); +// overloaded ReplaceAllDuplicates to keep old functionality with no danger of +// default pointer argument = 0 +void ReplaceAllDuplicates() +{ + std::vector<std::map<int,int> > report; + report.clear(); + ReplaceAllDuplicates(report); } -static int compareTwoCurves(const void *a, const void *b) + +// Extrusion routines + +void ProtudeXYZ(double &x, double &y, double &z, ExtrudeParams *e) { - Curve *c1 = *(Curve **)a; - Curve *c2 = *(Curve **)b; - int comp; + double matrix[4][4]; + double T[3]; + Vertex v(x, y, z); - if(c1->Typ != c2->Typ){ - if((c1->Typ == MSH_SEGM_CIRC && c2->Typ == MSH_SEGM_CIRC_INV) || - (c1->Typ == MSH_SEGM_CIRC_INV && c2->Typ == MSH_SEGM_CIRC) || - (c1->Typ == MSH_SEGM_ELLI && c2->Typ == MSH_SEGM_ELLI_INV) || - (c1->Typ == MSH_SEGM_ELLI_INV && c2->Typ == MSH_SEGM_ELLI)){ - // this is still ok - } - else - return c1->Typ - c2->Typ; - } + T[0] = -e->geo.pt[0]; + T[1] = -e->geo.pt[1]; + T[2] = -e->geo.pt[2]; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, &v); - if(List_Nbr(c1->Control_Points) != List_Nbr(c2->Control_Points)) - return List_Nbr(c1->Control_Points) - List_Nbr(c2->Control_Points); + SetRotationMatrix(matrix, e->geo.axe, e->geo.angle); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, &v); - if(!List_Nbr(c1->Control_Points)){ - if(!c1->beg || !c2->beg) - return 1; - comp = compareVertex(&c1->beg, &c2->beg); - if(comp) - return comp; - if(!c1->end || !c2->end) - return 1; - comp = compareVertex(&c1->end, &c2->end); - if(comp) - return comp; - } - else { - for(int i = 0; i < List_Nbr(c1->Control_Points); i++){ - Vertex *v1, *v2; - List_Read(c1->Control_Points, i, &v1); - List_Read(c2->Control_Points, i, &v2); - comp = compareVertex(&v1, &v2); - if(comp) - return comp; - } - } - return 0; + T[0] = -T[0]; + T[1] = -T[1]; + T[2] = -T[2]; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, &v); + + x = v.Pos.X; + y = v.Pos.Y; + z = v.Pos.Z; + + List_Reset(ListOfTransformedPoints); } -static int compareTwoSurfaces(const void *a, const void *b) +int Extrude_ProtudePoint(int type, int ip, + double T0, double T1, double T2, + double A0, double A1, double A2, + double X0, double X1, double X2, double alpha, + Curve **pc, Curve **prc, int final, + ExtrudeParams *e) { - Surface *s1 = *(Surface **)a; - Surface *s2 = *(Surface **)b; + double matrix[4][4], T[3], Ax[3], d; + Vertex V, *pv, *newp, *chapeau; + Curve *c; + int i; - // checking types is the "right thing" to do (see e.g. compareTwoCurves) - // but it would break backward compatibility (see e.g. tutorial/t2.geo), - // so let's just do it for boundary layer surfaces for now: - if(s1->Typ == MSH_SURF_BND_LAYER || s2->Typ == MSH_SURF_BND_LAYER || - s1->Typ == MSH_SURF_COMPOUND || s2->Typ == MSH_SURF_COMPOUND ){ - if(s1->Typ != s2->Typ) return s1->Typ - s2->Typ; - } + pv = &V; + pv->Num = ip; + *pc = *prc = NULL; + if(!Tree_Query(GModel::current()->getGEOInternals()->Points, &pv)) + return 0; - // if both surfaces have no generatrices, stay on the safe side and - // assume they are different - if(!List_Nbr(s1->Generatrices) && !List_Nbr(s2->Generatrices)) - return 1; + Msg::Debug("Extrude Point %d", ip); + + chapeau = DuplicateVertex(pv); + + switch (type) { + case TRANSLATE: + T[0] = T0; + T[1] = T1; + T[2] = T2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + if(!comparePosition(&pv, &chapeau)) + return pv->Num; + c = Create_Curve(NEWLINE(), MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0., 1.); + c->Control_Points = List_Create(2, 1, sizeof(Vertex *)); + c->Extrude = new ExtrudeParams; + c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + if(e) + c->Extrude->mesh = e->mesh; + List_Add(c->Control_Points, &pv); + List_Add(c->Control_Points, &chapeau); + c->beg = pv; + c->end = chapeau; + break; + case BOUNDARY_LAYER: + chapeau->Typ = MSH_POINT_BND_LAYER; + if(e) chapeau->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; + c = Create_Curve(NEWLINE(), MSH_SEGM_BND_LAYER, 1, NULL, NULL, -1, -1, 0., 1.); + c->Control_Points = List_Create(2, 1, sizeof(Vertex *)); + c->Extrude = new ExtrudeParams; + c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + if(e) c->Extrude->mesh = e->mesh; + List_Add(c->Control_Points, &pv); + List_Add(c->Control_Points, &chapeau); + c->beg = pv; + c->end = chapeau; + break; + case ROTATE: + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + if(!comparePosition(&pv, &chapeau)) + return pv->Num; + c = Create_Curve(NEWLINE(), MSH_SEGM_CIRC, 1, NULL, NULL, -1, -1, 0., 1.); + c->Control_Points = List_Create(3, 1, sizeof(Vertex *)); + c->Extrude = new ExtrudeParams; + c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + if(e) + c->Extrude->mesh = e->mesh; + List_Add(c->Control_Points, &pv); + // compute circle center + newp = DuplicateVertex(pv); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + norme(Ax); + T[0] = pv->Pos.X - X0; + T[1] = pv->Pos.Y - X1; + T[2] = pv->Pos.Z - X2; + prosca(T, Ax, &d); + newp->Pos.X = X0 + d * Ax[0]; + newp->Pos.Y = X1 + d * Ax[1]; + newp->Pos.Z = X2 + d * Ax[2]; + List_Add(c->Control_Points, &newp); + List_Add(c->Control_Points, &chapeau); + c->beg = pv; + c->end = chapeau; + break; + case TRANSLATE_ROTATE: + d = CTX::instance()->geom.extrudeSplinePoints; + d = d ? d : 1; + c = Create_Curve(NEWLINE(), MSH_SEGM_SPLN, 1, NULL, NULL, -1, -1, 0., 1.); + c->Control_Points = + List_Create(CTX::instance()->geom.extrudeSplinePoints + 1, 1, sizeof(Vertex *)); + c->Extrude = new ExtrudeParams; + c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + if(e) + c->Extrude->mesh = e->mesh; + List_Add(c->Control_Points, &pv); + c->beg = pv; + for(i = 0; i < CTX::instance()->geom.extrudeSplinePoints; i++) { + if(i) + chapeau = DuplicateVertex(chapeau); + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha / d); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + T[0] = T0 / d; + T[1] = T1 / d; + T[2] = T2 / d; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToPoint(matrix, chapeau); + List_Add(c->Control_Points, &chapeau); + } + c->end = chapeau; + break; +// case ANALYTICAL: +// +// break; + default: + Msg::Error("Unknown extrusion type"); + return pv->Num; + } - return compare2Lists(s1->Generatrices, s2->Generatrices, compareAbsCurve); -} + End_Curve(c); + Tree_Add(GModel::current()->getGEOInternals()->Curves, &c); + CreateReversedCurve(c); + *pc = c; + *prc = FindCurve(-c->Num); -static void MaxNumPoint(void *a, void *b) -{ - Vertex *v = *(Vertex **)a; - GModel::current()->getGEOInternals()->MaxPointNum = - std::max(GModel::current()->getGEOInternals()->MaxPointNum, v->Num); -} + List_Reset(ListOfTransformedPoints); -static void MaxNumCurve(void *a, void *b) -{ - Curve *c = *(Curve **)a; - GModel::current()->getGEOInternals()->MaxLineNum = - std::max(GModel::current()->getGEOInternals()->MaxLineNum, c->Num); -} + int chap_num = chapeau->Num; -static void MaxNumSurface(void *a, void *b) -{ - Surface *s = *(Surface **)a; - GModel::current()->getGEOInternals()->MaxSurfaceNum = - std::max(GModel::current()->getGEOInternals()->MaxSurfaceNum, s->Num); + if(CTX::instance()->geom.autoCoherence && final){ + // Trevor Strickler added to fix replaced Chapeau + std::vector<std::map<int, int> > report(3); + report[0][chapeau->Num] = chap_num; + ReplaceAllDuplicates(report); + std::map<int, int>::iterator m_it = (report[0]).find(chap_num); + if( m_it != (report[0]).end() ) + chap_num = (report[0])[chap_num]; + else + chap_num = 0; + } + return chap_num; } -static void ReplaceDuplicatePoints() +int Extrude_ProtudeCurve(int type, int ic, + double T0, double T1, double T2, + double A0, double A1, double A2, + double X0, double X1, double X2, double alpha, + Surface **ps, int final, + ExtrudeParams *e) { - // FIXME: This routine is in fact logically wrong (the compareTwoPoints - // function used in the avl tree is not a appropriate comparison - // function). The fix is simple (use a multi dimensional tree, e.g., - // MVertexPositionSet), but fixing the routine would break backward - // compatibility with old .geo files. This will be fixed in the new abstract - // GModel CAD creation routines. - Vertex *v, *v2, **pv, **pv2; - Curve *c; + double matrix[4][4], T[3], Ax[3]; + Curve *CurveBeg, *CurveEnd; + Curve *ReverseChapeau, *ReverseBeg, *ReverseEnd; + Curve *pc, *revpc, *chapeau; Surface *s; - Volume *vol; - Tree_T *points2delete = Tree_Create(sizeof(Vertex *), compareVertex); - Tree_T *allNonDuplicatedPoints = Tree_Create(sizeof(Vertex *), compareTwoPoints); - // Create unique points - - int start = Tree_Nbr(GModel::current()->getGEOInternals()->Points); + pc = FindCurve(ic); + revpc = FindCurve(-ic); + *ps = NULL; - List_T *All = Tree2List(GModel::current()->getGEOInternals()->Points); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &v); - if(!Tree_Search(allNonDuplicatedPoints, &v)) { - Tree_Insert(allNonDuplicatedPoints, &v); - } - else { - Tree_Suppress(GModel::current()->getGEOInternals()->Points, &v); - Tree_Insert(points2delete, &v); - } + if(!pc || !revpc){ + return 0; } - List_Delete(All); - - int end = Tree_Nbr(GModel::current()->getGEOInternals()->Points); - if(start == end) { - Tree_Delete(points2delete); - Tree_Delete(allNonDuplicatedPoints); - return; + if(!pc->beg || !pc->end){ + Msg::Error("Cannot extrude curve with no begin/end points"); + return 0; } - Msg::Debug("Removed %d duplicate points", start - end); + Msg::Debug("Extrude Curve %d", ic); - if(CTX::instance()->geom.oldNewreg) { - GModel::current()->getGEOInternals()->MaxPointNum = 0; - Tree_Action(GModel::current()->getGEOInternals()->Points, MaxNumPoint); - } + chapeau = DuplicateCurve(pc, false); - // Replace old points in curves + chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); + chapeau->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + chapeau->Extrude->geo.Source = pc->Num; + if(e) + chapeau->Extrude->mesh = e->mesh; - All = Tree2List(GModel::current()->getGEOInternals()->Curves); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &c); - // replace begin/end points - if(!Tree_Query(allNonDuplicatedPoints, &c->beg)) - Msg::Error("Weird point %d in Coherence", c->beg->Num); - if(!Tree_Query(allNonDuplicatedPoints, &c->end)) - Msg::Error("Weird point %d in Coherence", c->end->Num); - // replace control points - for(int j = 0; j < List_Nbr(c->Control_Points); j++) { - pv = (Vertex **)List_Pointer(c->Control_Points, j); - if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) - Msg::Error("Weird point %d in Coherence", (*pv)->Num); - else - List_Write(c->Control_Points, j, pv2); + switch (type) { + case TRANSLATE: + T[0] = T0; + T[1] = T1; + T[2] = T2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + break; + case BOUNDARY_LAYER: + chapeau->Typ = MSH_SEGM_BND_LAYER; + if(chapeau->beg){ + chapeau->beg->Typ = MSH_POINT_BND_LAYER; + if(e) chapeau->beg->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; } - // replace extrusion sources - if(c->Extrude && c->Extrude->geo.Mode == EXTRUDED_ENTITY){ - v2 = FindPoint(std::abs(c->Extrude->geo.Source), points2delete); - if(v2){ - if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, &v2))) - Msg::Error("Weird point %d in Coherence", v2->Num); - else - c->Extrude->geo.Source = (*pv2)->Num; - } + if(chapeau->end){ + chapeau->end->Typ = MSH_POINT_BND_LAYER; + if(e) chapeau->end->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; } - } - List_Delete(All); - - // Replace old points in surfaces - - All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &s); - // replace transfinite corners - for(int j = 0; j < List_Nbr(s->TrsfPoints); j++){ - pv = (Vertex **)List_Pointer(s->TrsfPoints, j); - if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) - Msg::Error("Weird point %d in Coherence", (*pv)->Num); - else - List_Write(s->TrsfPoints, j, pv2); + for(int i = 0; i < List_Nbr(chapeau->Control_Points); i++){ + Vertex *v; + List_Read(chapeau->Control_Points, i, &v); + if(e) v->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; } + revpc = FindCurve(-chapeau->Num); + if(revpc) revpc->Typ = MSH_SEGM_BND_LAYER; + break; + case ROTATE: + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + break; + case TRANSLATE_ROTATE: + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + T[0] = T0; + T[1] = T1; + T[2] = T2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToCurve(matrix, chapeau); + break; + default: + Msg::Error("Unknown extrusion type"); + return pc->Num; } - List_Delete(All); - // Replace old points in volumes + Extrude_ProtudePoint(type, pc->beg->Num, T0, T1, T2, + A0, A1, A2, X0, X1, X2, alpha, + &CurveBeg, &ReverseBeg, 0, e); + Extrude_ProtudePoint(type, pc->end->Num, T0, T1, T2, + A0, A1, A2, X0, X1, X2, alpha, + &CurveEnd, &ReverseEnd, 0, e); - All = Tree2List(GModel::current()->getGEOInternals()->Volumes); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &vol); - // replace transfinite corners - for(int j = 0; j < List_Nbr(vol->TrsfPoints); j++){ - pv = (Vertex **)List_Pointer(vol->TrsfPoints, j); - if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, pv))) - Msg::Error("Weird point %d in Coherence", (*pv)->Num); - else - List_Write(vol->TrsfPoints, j, pv2); - } + if(!CurveBeg && !CurveEnd){ + return pc->Num; } - List_Delete(All); - // Replace old points in physical groups - for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ - PhysicalGroup *p = *(PhysicalGroup**)List_Pointer - (GModel::current()->getGEOInternals()->PhysicalGroups, i); - if(p->Typ == MSH_PHYSICAL_POINT){ - for(int j = 0; j < List_Nbr(p->Entities); j++){ - int num; - List_Read(p->Entities, j, &num); - v2 = FindPoint(std::abs(num), points2delete); - if(v2){ - if(!(pv2 = (Vertex **)Tree_PQuery(allNonDuplicatedPoints, &v2))) - Msg::Error("Weird point %d in Coherence", v2->Num); - else - List_Write(p->Entities, j, &(*pv2)->Num); - } - } - } + if(type == BOUNDARY_LAYER) + s = Create_Surface(NEWSURFACE(), MSH_SURF_BND_LAYER); + else if(!CurveBeg || !CurveEnd) + s = Create_Surface(NEWSURFACE(), MSH_SURF_TRIC); + else + s = Create_Surface(NEWSURFACE(), MSH_SURF_REGL); + + s->Generatrices = List_Create(4, 1, sizeof(Curve *)); + s->Extrude = new ExtrudeParams; + s->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + s->Extrude->geo.Source = pc->Num; + if(e) + s->Extrude->mesh = e->mesh; + + ReverseChapeau = FindCurve(-chapeau->Num); + + if(!CurveBeg) { + List_Add(s->Generatrices, &pc); + List_Add(s->Generatrices, &CurveEnd); + List_Add(s->Generatrices, &ReverseChapeau); + } + else if(!CurveEnd) { + List_Add(s->Generatrices, &ReverseChapeau); + List_Add(s->Generatrices, &ReverseBeg); + List_Add(s->Generatrices, &pc); + } + else { + List_Add(s->Generatrices, &pc); + List_Add(s->Generatrices, &CurveEnd); + List_Add(s->Generatrices, &ReverseChapeau); + List_Add(s->Generatrices, &ReverseBeg); } - Tree_Action(points2delete, Free_Vertex); - Tree_Delete(points2delete); - Tree_Delete(allNonDuplicatedPoints); -} + End_Surface(s); + Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); -static void ReplaceDuplicateCurves() -{ - Curve *c, *c2, **pc, **pc2; - Surface *s; - Tree_T *curves2delete = Tree_Create(sizeof(Curve *), compareCurve); - Tree_T *allNonDuplicatedCurves = Tree_Create(sizeof(Curve *), compareTwoCurves); + List_Reset(ListOfTransformedPoints); - // Create unique curves + *ps = s; - int start = Tree_Nbr(GModel::current()->getGEOInternals()->Curves); + int chap_num = chapeau->Num; - List_T *All = Tree2List(GModel::current()->getGEOInternals()->Curves); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &c); - if(c->Num > 0) { - if(!Tree_Search(allNonDuplicatedCurves, &c)) { - Tree_Insert(allNonDuplicatedCurves, &c); - if(!(c2 = FindCurve(-c->Num))) { - Msg::Error("Unknown curve %d", -c->Num); - List_Delete(All); - return; - } - Tree_Insert(allNonDuplicatedCurves, &c2); - } - else { - Tree_Suppress(GModel::current()->getGEOInternals()->Curves, &c); - if(!(c2 = FindCurve(-c->Num))) { - Msg::Error("Unknown curve %d", -c->Num); - break; - } - Tree_Suppress(GModel::current()->getGEOInternals()->Curves, &c2); - Tree_Insert(curves2delete, &c); - Tree_Insert(curves2delete, &c2); - } - } + if(CTX::instance()->geom.autoCoherence && final){ + // Trevor Strickler added to fix replaced Chapeau + std::vector<std::map<int, int> > report(3); + (report[1])[chap_num] = chap_num; + ReplaceAllDuplicates(report); + std::map<int, int>::iterator m_it = (report[1]).find(chap_num); + if( m_it != (report[1]).end() ) + chap_num = (report[1])[chap_num]; + else + chap_num = 0; } - List_Delete(All); - int end = Tree_Nbr(GModel::current()->getGEOInternals()->Curves); + return chap_num; +} - if(start == end) { - Tree_Delete(curves2delete); - Tree_Delete(allNonDuplicatedCurves); - return; - } - Msg::Debug("Removed %d duplicate curves", start - end); +int Extrude_ProtudeSurface(int type, int is, + double T0, double T1, double T2, + double A0, double A1, double A2, + double X0, double X1, double X2, double alpha, + Volume **pv, ExtrudeParams *e) +{ + double matrix[4][4], T[3], Ax[3]; + Curve *c, *c2; + int i; + Surface *s, *ps, *chapeau; - if(CTX::instance()->geom.oldNewreg) { - GModel::current()->getGEOInternals()->MaxLineNum = 0; - Tree_Action(GModel::current()->getGEOInternals()->Curves, MaxNumCurve); - } + *pv = NULL; - // Replace old curves in curves + // 'is' can be negative, to signify that the surface orientation + // should be reversed. This orientation information is only used at + // the moment when creating boundary layers + if(!(ps = FindSurface(std::abs(is)))) + return 0; - All = Tree2List(GModel::current()->getGEOInternals()->Curves); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &c); - // replace extrusion sources - if(c->Extrude && c->Extrude->geo.Mode == COPIED_ENTITY){ - c2 = FindCurve(std::abs(c->Extrude->geo.Source), curves2delete); - if(c2){ - if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) - Msg::Error("Weird curve %d in Coherence", c2->Num); - else - c->Extrude->geo.Source = (*pc2)->Num; + Msg::Debug("Extrude Surface %d", is); + + chapeau = DuplicateSurface(ps, false); + chapeau->Extrude = new ExtrudeParams(COPIED_ENTITY); + chapeau->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + chapeau->Extrude->geo.Source = is; // not ps->Num: we need the sign info + if(e) + chapeau->Extrude->mesh = e->mesh; + + for(i = 0; i < List_Nbr(chapeau->Generatrices); i++) { + List_Read(ps->Generatrices, i, &c2); + List_Read(chapeau->Generatrices, i, &c); + if(c->Num < 0){ + int nn = -c->Num; + if(!(c = FindCurve(nn))) { + Msg::Error("Unknown curve %d", nn); + return ps->Num; } } + c->Extrude = new ExtrudeParams(COPIED_ENTITY); + c->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + // don't take the abs(): the sign of c2->Num is important (used + // when copying the mesh in the extrusion routine) + c->Extrude->geo.Source = c2->Num; + if(e) + c->Extrude->mesh = e->mesh; } - List_Delete(All); - // Replace old curves in surfaces + // FIXME: this is a really ugly hack for backward compatibility, so + // that we don't screw up the old .geo files too much. (Before + // version 1.54, we didn't always create new volumes during "Extrude + // Surface". Now we do, but with "CTX::instance()->geom.oldNewreg==1", this + // bumps the NEWREG() counter, and thus changes the whole automatic + // numbering sequence.) So we locally force oldNewreg to 0: in most + // cases, since we define points, curves, etc., before defining + // volumes, the NEWVOLUME() call below will return a fairly low + // number, that will not interfere with the other numbers... + int tmp = CTX::instance()->geom.oldNewreg; + CTX::instance()->geom.oldNewreg = 0; + Volume *v = Create_Volume(NEWVOLUME(), MSH_VOLUME); + CTX::instance()->geom.oldNewreg = tmp; - All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &s); - // replace bounding curves - for(int j = 0; j < List_Nbr(s->Generatrices); j++) { - pc = (Curve **)List_Pointer(s->Generatrices, j); - if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, pc))) - Msg::Error("Weird curve %d in Coherence", (*pc)->Num); - else { - List_Write(s->Generatrices, j, pc2); - // arghhh: check compareTwoCurves! - End_Curve(*pc2); - } - } - // replace extrusion sources - if(s->Extrude && s->Extrude->geo.Mode == EXTRUDED_ENTITY){ - c2 = FindCurve(std::abs(s->Extrude->geo.Source), curves2delete); - if(c2){ - if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) - Msg::Error("Weird curve %d in Coherence", c2->Num); - else - s->Extrude->geo.Source = (*pc2)->Num; - } + v->Extrude = new ExtrudeParams; + v->Extrude->fill(type, T0, T1, T2, A0, A1, A2, X0, X1, X2, alpha); + v->Extrude->geo.Source = is; + if(e) + v->Extrude->mesh = e->mesh; + int ori = -1; + List_Add(v->Surfaces, &ps); + List_Add(v->SurfacesOrientations, &ori); + ori = 1; + List_Add(v->Surfaces, &chapeau); + List_Add(v->SurfacesOrientations, &ori); + + for(i = 0; i < List_Nbr(ps->Generatrices); i++) { + List_Read(ps->Generatrices, i, &c); + Extrude_ProtudeCurve(type, c->Num, T0, T1, T2, A0, A1, A2, X0, X1, X2, + alpha, &s, 0, e); + if(s){ + if(c->Num < 0) + ori = -1; + else + ori = 1; + List_Add(v->Surfaces, &s); + List_Add(v->SurfacesOrientations, &ori); } } - List_Delete(All); - // Replace old curves in physical groups - for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ - PhysicalGroup *p = *(PhysicalGroup**)List_Pointer - (GModel::current()->getGEOInternals()->PhysicalGroups, i); - if(p->Typ == MSH_PHYSICAL_LINE){ - for(int j = 0; j < List_Nbr(p->Entities); j++){ - int num; - List_Read(p->Entities, j, &num); - c2 = FindCurve(std::abs(num), curves2delete); - if(c2){ - if(!(pc2 = (Curve **)Tree_PQuery(allNonDuplicatedCurves, &c2))) - Msg::Error("Weird curve %d in Coherence", c2->Num); - else - List_Write(p->Entities, j, &(*pc2)->Num); - } + switch (type) { + case TRANSLATE: + T[0] = T0; + T[1] = T1; + T[2] = T2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + break; + case BOUNDARY_LAYER: + chapeau->Typ = MSH_SURF_BND_LAYER; + for(int i = 0; i < List_Nbr(chapeau->Generatrices); i++) { + List_Read(chapeau->Generatrices, i, &c); + c->Typ = MSH_SEGM_BND_LAYER; + c = FindCurve(-c->Num); + c->Typ = MSH_SEGM_BND_LAYER; + if(c->beg){ + c->beg->Typ = MSH_POINT_BND_LAYER; + if(e) c->beg->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; + } + if(c->end){ + c->end->Typ = MSH_POINT_BND_LAYER; + if(e) c->end->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; + } + for(int i = 0; i < List_Nbr(c->Control_Points); i++){ + Vertex *v; + List_Read(c->Control_Points, i, &v); + if(e) v->boundaryLayerIndex = e->mesh.BoundaryLayerIndex; } } + break; + case ROTATE: + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + break; + case TRANSLATE_ROTATE: + T[0] = -X0; + T[1] = -X1; + T[2] = -X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + Ax[0] = A0; + Ax[1] = A1; + Ax[2] = A2; + SetRotationMatrix(matrix, Ax, alpha); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + T[0] = X0; + T[1] = X1; + T[2] = X2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + T[0] = T0; + T[1] = T1; + T[2] = T2; + SetTranslationMatrix(matrix, T); + List_Reset(ListOfTransformedPoints); + ApplyTransformationToSurface(matrix, chapeau); + break; + default: + Msg::Error("Unknown extrusion type"); + return ps->Num; } - Tree_Action(curves2delete, Free_Curve); - Tree_Delete(curves2delete); - Tree_Delete(allNonDuplicatedCurves); -} + // this is done only for backward compatibility with the old + // numbering scheme + Tree_Suppress(GModel::current()->getGEOInternals()->Surfaces, &chapeau); -static void ReplaceDuplicateSurfaces() -{ - Surface *s, *s2, **ps, **ps2; - Volume *vol; - Tree_T *surfaces2delete = Tree_Create(sizeof(Surface *), compareSurface); - Tree_T *allNonDuplicatedSurfaces = Tree_Create(sizeof(Surface *), compareTwoSurfaces); + chapeau->Num = NEWSURFACE(); - // Create unique surfaces + GModel::current()->getGEOInternals()->MaxSurfaceNum = chapeau->Num; + Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &chapeau); - int start = Tree_Nbr(GModel::current()->getGEOInternals()->Surfaces); + Tree_Add(GModel::current()->getGEOInternals()->Volumes, &v); - List_T *All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &s); - if(s->Num > 0) { - if(!Tree_Search(allNonDuplicatedSurfaces, &s)) { - Tree_Insert(allNonDuplicatedSurfaces, &s); - } - else { - Tree_Suppress(GModel::current()->getGEOInternals()->Surfaces, &s); - Tree_Insert(surfaces2delete, &s); - } - } - } - List_Delete(All); + *pv = v; - int end = Tree_Nbr(GModel::current()->getGEOInternals()->Surfaces); + int chap_num = chapeau->Num; - if(start == end) { - Tree_Delete(surfaces2delete); - Tree_Delete(allNonDuplicatedSurfaces); - return; + if(CTX::instance()->geom.autoCoherence){ + // Trevor Strickler added to fix replaced Chapeau + std::vector<std::map<int, int> > report(3); + (report[2])[chap_num] = chap_num; + ReplaceAllDuplicates(report); + std::map<int, int>::iterator m_it = (report[2]).find(chap_num); + if( m_it != (report[2]).end() ) + chap_num = (report[2])[chap_num]; + else + chap_num = 0; } - Msg::Debug("Removed %d duplicate surfaces", start - end); + List_Reset(ListOfTransformedPoints); - if(CTX::instance()->geom.oldNewreg) { - GModel::current()->getGEOInternals()->MaxSurfaceNum = 0; - Tree_Action(GModel::current()->getGEOInternals()->Surfaces, MaxNumSurface); - } - // Replace old surfaces in surfaces + return chap_num; +} - All = Tree2List(GModel::current()->getGEOInternals()->Surfaces); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &s); - // replace extrusion sources - if(s->Extrude && s->Extrude->geo.Mode == COPIED_ENTITY){ - s2 = FindSurface(std::abs(s->Extrude->geo.Source), surfaces2delete); - if(s2){ - if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) - Msg::Error("Weird surface %d in Coherence", s2->Num); - else - s->Extrude->geo.Source = (*ps2)->Num; - } - } - } - List_Delete(All); +void ExtrudeShape(int extrude_type, int shape_type, int shape_num, + double T0, double T1, double T2, + double A0, double A1, double A2, + double X0, double X1, double X2, double alpha, + ExtrudeParams *e, + List_T *list_out) +{ + Shape shape; + shape.Type = shape_type; + shape.Num = shape_num; + List_T *tmp = List_Create(1, 1, sizeof(Shape)); + List_Add(tmp, &shape); + ExtrudeShapes(extrude_type, tmp, + T0, T1, T2, + A0, A1, A2, + X0, X1, X2, alpha, + e, + list_out); + List_Delete(tmp); +} - // Replace old surfaces in volumes +void ExtrudeShapes(int type, List_T *list_in, + double T0, double T1, double T2, + double A0, double A1, double A2, + double X0, double X1, double X2, double alpha, + ExtrudeParams *e, + List_T *list_out) +{ - All = Tree2List(GModel::current()->getGEOInternals()->Volumes); - for(int i = 0; i < List_Nbr(All); i++) { - List_Read(All, i, &vol); - // replace bounding surfaces - for(int j = 0; j < List_Nbr(vol->Surfaces); j++) { - ps = (Surface **)List_Pointer(vol->Surfaces, j); - if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, ps))) - Msg::Error("Weird surface %d in Coherence", (*ps)->Num); - else - List_Write(vol->Surfaces, j, ps2); - } - // replace extrusion sources - if(vol->Extrude && vol->Extrude->geo.Mode == EXTRUDED_ENTITY){ - s2 = FindSurface(std::abs(vol->Extrude->geo.Source), surfaces2delete); - if(s2){ - if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) - Msg::Error("Weird surface %d in Coherence", s2->Num); - else - vol->Extrude->geo.Source = (*ps2)->Num; + for(int i = 0; i < List_Nbr(list_in); i++){ + Shape shape; + List_Read(list_in, i, &shape); + switch(shape.Type){ + case MSH_POINT: + { + Curve *pc = 0, *prc = 0; + Shape top; + top.Num = Extrude_ProtudePoint(type, shape.Num, T0, T1, T2, + A0, A1, A2, X0, X1, X2, alpha, + &pc, &prc, 1, e); + top.Type = MSH_POINT; + List_Add(list_out, &top); + if(pc){ + Shape body; + body.Num = pc->Num; + body.Type = pc->Typ; + List_Add(list_out, &body); + } } - } - } - List_Delete(All); + break; + case MSH_SEGM_LINE: + case MSH_SEGM_SPLN: + case MSH_SEGM_BSPLN: + case MSH_SEGM_BEZIER: + case MSH_SEGM_CIRC: + case MSH_SEGM_CIRC_INV: + case MSH_SEGM_ELLI: + case MSH_SEGM_ELLI_INV: + case MSH_SEGM_NURBS: + { + Surface *ps = 0; + Shape top; + top.Num = Extrude_ProtudeCurve(type, shape.Num, T0, T1, T2, + A0, A1, A2, X0, X1, X2, alpha, + &ps, 1, e); + Curve *pc = FindCurve(top.Num); + top.Type = pc ? pc->Typ : 0; + List_Add(list_out, &top); + if(ps){ + Shape body; + body.Num = ps->Num; + body.Type = ps->Typ; + List_Add(list_out, &body); + if(CTX::instance()->geom.extrudeReturnLateral){ + for(int j = 0; j < List_Nbr(ps->Generatrices); j++){ + Curve *c; + List_Read(ps->Generatrices, j, &c); + if(abs(c->Num) != shape.Num && abs(c->Num) != top.Num){ + Shape side; + side.Num = c->Num; + side.Type = c->Typ; + List_Add(list_out, &side); + } + } + } + } + } + break; + case MSH_SURF_REGL: + case MSH_SURF_TRIC: + case MSH_SURF_PLAN: + case MSH_SURF_DISCRETE: + case MSH_SURF_COMPOUND: + { + // if statement by Trevor Strickler + if( shape.Type == MSH_SURF_COMPOUND ){ + if( !(e && e->mesh.ExtrudeMesh) ){ + Msg::Error("Impossible to extrude compound entity %d without also extruding mesh!", + abs(shape.Num) ); + break; + } + } - // Replace old surfaces in physical groups - for(int i = 0; i < List_Nbr(GModel::current()->getGEOInternals()->PhysicalGroups); i++){ - PhysicalGroup *p = *(PhysicalGroup**)List_Pointer - (GModel::current()->getGEOInternals()->PhysicalGroups, i); - if(p->Typ == MSH_PHYSICAL_SURFACE){ - for(int j = 0; j < List_Nbr(p->Entities); j++){ - int num; - List_Read(p->Entities, j, &num); - s2 = FindSurface(std::abs(num), surfaces2delete); - if(s2){ - if(!(ps2 = (Surface **)Tree_PQuery(allNonDuplicatedSurfaces, &s2))) - Msg::Error("Weird surface %d in Coherence", s2->Num); - else - List_Write(p->Entities, j, &(*ps2)->Num); + Volume *pv = 0; + Shape top; + top.Num = Extrude_ProtudeSurface(type, shape.Num, T0, T1, T2, + A0, A1, A2, X0, X1, X2, alpha, + &pv, e); + Surface *ps = FindSurface(top.Num); + top.Type = ps ? ps->Typ : 0; + + List_Add(list_out, &top); + if(pv){ + Shape body; + body.Num = pv->Num; + body.Type = pv->Typ; + List_Add(list_out, &body); + if(CTX::instance()->geom.extrudeReturnLateral){ + for(int j = 0; j < List_Nbr(pv->Surfaces); j++){ + Surface *s; + List_Read(pv->Surfaces, j, &s); + if(abs(s->Num) != shape.Num && abs(s->Num) != top.Num){ + Shape side; + side.Num = s->Num; + side.Type = s->Typ; + List_Add(list_out, &side); + } + } + } } } + break; + default: + Msg::Error("Impossible to extrude entity %d (of type %d)", + shape.Num, shape.Type); + break; } } - Tree_Action(surfaces2delete, Free_Surface); - Tree_Delete(surfaces2delete); - Tree_Delete(allNonDuplicatedSurfaces); -} - -void ReplaceAllDuplicates() -{ - ReplaceDuplicatePoints(); - ReplaceDuplicateCurves(); - ReplaceDuplicateSurfaces(); } // Projection of a point on a surface @@ -3662,6 +3883,14 @@ void setSurfaceGeneratrices(Surface *s, List_T *loops) s->Generatrices = List_Create(4, 4, sizeof(Curve *)); List_Delete(s->GeneratricesByTag); s->GeneratricesByTag = List_Create(4, 4, sizeof(int)); + //trevor strickler + if(s->Typ == MSH_SURF_COMPOUND){ + s->Generatrices = GetOrderedUniqueEdges(s); + if(!List_Nbr(s->Generatrices)){ + Msg::Error("Could not make generatrices list for compound surface %d.",s->Num); + return; + } + } for(int i = 0; i < nbLoop; i++) { int iLoop; List_Read(loops, i, &iLoop); diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index a1474e1c00..4f1452d22c 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -1169,6 +1169,16 @@ void MElement::writeINP(FILE *fp, int num) fprintf(fp, "\n"); } +void MElement::writeSU2(FILE *fp, int num) +{ + setVolumePositive(); + fprintf(fp, "%d ", getTypeForVTK()); + for(int i = 0; i < getNumVertices(); i++) + fprintf(fp, "%d ", getVertexVTK(i)->getIndex() - 1); + if(num >= 0) fprintf(fp, "%d\n", num); + else fprintf(fp, "\n"); +} + int MElement::getInfoMSH(const int typeMSH, const char **const name) { switch(typeMSH){ diff --git a/Geo/MElement.h b/Geo/MElement.h index 9b7bfb9f9d..9cef0e28a7 100644 --- a/Geo/MElement.h +++ b/Geo/MElement.h @@ -343,6 +343,7 @@ class MElement virtual void writeDIFF(FILE *fp, int num, bool binary=false, int physical_property=1); virtual void writeINP(FILE *fp, int num); + virtual void writeSU2(FILE *fp, int num); // info for specific IO formats (returning 0 means that the element // is not implemented in that format) diff --git a/Geo/MVertex.cpp b/Geo/MVertex.cpp index d06aa37af5..4238a82429 100644 --- a/Geo/MVertex.cpp +++ b/Geo/MVertex.cpp @@ -337,6 +337,18 @@ void MVertex::writeDIFF(FILE *fp, bool binary, double scalingFactor) _index, x() * scalingFactor, y() * scalingFactor, z() * scalingFactor); } +void MVertex::writeSU2(FILE *fp, int dim, double scalingFactor) +{ + if(_index < 0) return; // negative index vertices are never saved + + if(dim == 2) + fprintf(fp, "%.16g %.16g %d\n", x() * scalingFactor, y() * scalingFactor, + _index - 1); + else + fprintf(fp, "%.16g %.16g %.16g %d\n", x() * scalingFactor, y() * scalingFactor, + z() * scalingFactor, _index - 1); +} + std::set<MVertex*, MVertexLessThanLexicographic>::iterator MVertex::linearSearch(std::set<MVertex*, MVertexLessThanLexicographic> &pos) { diff --git a/Geo/MVertex.h b/Geo/MVertex.h index c35064a948..70038b6f43 100644 --- a/Geo/MVertex.h +++ b/Geo/MVertex.h @@ -117,6 +117,7 @@ class MVertex{ void writeBDF(FILE *fp, int format=0, double scalingFactor=1.0); void writeINP(FILE *fp, double scalingFactor=1.0); void writeDIFF(FILE *fp, bool binary, double scalingFactor=1.0); + void writeSU2(FILE *fp, int dim, double scalingFactor=1.0); }; class MEdgeVertex : public MVertex{ diff --git a/Mesh/BoundaryLayers.cpp b/Mesh/BoundaryLayers.cpp index 6459d2f685..5e5864bb19 100644 --- a/Mesh/BoundaryLayers.cpp +++ b/Mesh/BoundaryLayers.cpp @@ -13,6 +13,8 @@ #include "meshGFace.h" #include "GmshMessage.h" #include "Field.h" +// added by Trevor Strickler +#include "GFaceCompound.h" #if defined(HAVE_POST) #include "PView.h" @@ -22,9 +24,24 @@ class OctreePost{ int dummy; }; #endif +// by Trevor Strickler +static double GetAveEdgeLength(std::vector<MVertex*> &elem_verts) +{ + double ave = 0.0; + int size = elem_verts.size(); + if(!size) + return 0.0; + for( int i = 0; i < size-1; i++ ) + ave += elem_verts[i]->distance(elem_verts[i+1]); + ave += elem_verts[0]->distance(elem_verts[size-1]); + ave /= size; + return ave; +} + +// Trevor Strickler modified this function template<class T> static void addExtrudeNormals(std::vector<T*> &elements, int invert, - OctreePost *octree, bool gouraud, int index) + OctreePost *octree, bool gouraud, int index, bool skipScaleCalc) { if(index < 0 || index > 1){ Msg::Error("Boundary layer index should be 0 or 1"); @@ -32,10 +49,29 @@ static void addExtrudeNormals(std::vector<T*> &elements, int invert, } if(octree && !gouraud){ // get extrusion direction from post-processing view + // Trevor Strickler modified this section heavily std::set<MVertex*> verts; - for(unsigned int i = 0; i < elements.size(); i++) - for(int j = 0; j < elements[i]->getNumVertices(); j++) - verts.insert(elements[i]->getVertex(j)); + for(unsigned int i = 0; i < elements.size(); i++){ + if( !ExtrudeParams::calcLayerScaleFactor[index] ) // Trevor Strickler + for(int j = 0; j < elements[i]->getNumVertices(); j++) + verts.insert(elements[i]->getVertex(j)); + else{ // Trevor Strickler + std::vector<MVertex*> elem_verts; + double aveLength = 0.0; + elements[i]->getVertices(elem_verts); + if( skipScaleCalc ) + aveLength = 1.0; + else + aveLength = GetAveEdgeLength(elem_verts); + for(unsigned int j = 0; j < elem_verts.size(); j++){ + verts.insert(elem_verts[j]); + // Added by Trevor Strickler: if scaleLastLayer selection, but not doing gouraud, then still scale the last layer... + // This might create weird behavior for the unprepared.... + if( aveLength != 0.0 ) + ExtrudeParams::normals[index]->add_scale(elem_verts[j]->x(), elem_verts[j]->y(), elem_verts[j]->z(), aveLength); + } + } + } for(std::set<MVertex*>::iterator it = verts.begin(); it != verts.end(); it++){ MVertex *v = *it; double nn[3] = {0., 0., 0.}; @@ -55,9 +91,24 @@ static void addExtrudeNormals(std::vector<T*> &elements, int invert, n = crossprod(ele->getEdge(0).tangent(), SVector3(0., 0., 1.)); if(invert) n *= -1.; double nn[3] = {n[0], n[1], n[2]}; - for(int k = 0; k < ele->getNumVertices(); k++){ - MVertex *v = ele->getVertex(k); - ExtrudeParams::normals[index]->add(v->x(), v->y(), v->z(), 3, nn); + if( !ExtrudeParams::calcLayerScaleFactor[index] ) // Trevor Strickler + for(int k = 0; k < ele->getNumVertices(); k++){ + MVertex *v = ele->getVertex(k); + ExtrudeParams::normals[index]->add(v->x(), v->y(), v->z(), 3, nn); + } + else{ // Trevor Strickler + std::vector<MVertex*> elem_verts; + double aveLength = 0.0; + elements[i]->getVertices(elem_verts); + if( skipScaleCalc ) + aveLength = 1.0; + else + aveLength = GetAveEdgeLength(elem_verts); + for(unsigned int j = 0; j < elem_verts.size(); j++){ + ExtrudeParams::normals[index]->add(elem_verts[j]->x(), elem_verts[j]->y(), elem_verts[j]->z(), 3, nn); + if( aveLength != 0.0 ) + ExtrudeParams::normals[index]->add_scale(elem_verts[j]->x(), elem_verts[j]->y(), elem_verts[j]->z(), aveLength); + } } } } @@ -65,9 +116,15 @@ static void addExtrudeNormals(std::vector<T*> &elements, int invert, typedef std::set<std::pair<bool, std::pair<int, int> > > infoset; +// Trevor Strickler Modified this function +//skipScaleCalcMap maps an entity tag to a flag telling whether to skip the +// scale calc when extruding only that entity. The flag is false when an extrusion +// is not scaleLast when in a boundary layer that has at least one scaleLast region. +// Effectively, this makes the vertices on the boundary between a scaled and not +// scaled region 'average' between being scaled and not scaled. template<class T> static void addExtrudeNormals(std::set<T*> &entities, - std::map<int, infoset> &infos) + std::map<int, infoset> &infos, std::map<int, bool> &skipScaleCalcMap) { bool normalize = true, special3dbox = false, extrudeField=false; std::vector<OctreePost*> octrees; @@ -103,11 +160,16 @@ static void addExtrudeNormals(std::set<T*> &entities, Msg::Error("Unknown View[%d]: using normals instead", view); } #endif + // Trevor Strickler + bool skipScaleCalc = true; + std::map<int, bool>::iterator itskip = skipScaleCalcMap.find(ge->tag()); + if( itskip != skipScaleCalcMap.end() ) + skipScaleCalc = skipScaleCalcMap[ge->tag()]; if(ge->dim() == 1) - addExtrudeNormals(((GEdge*)ge)->lines, invert, octree, gouraud, index); + addExtrudeNormals(((GEdge*)ge)->lines, invert, octree, gouraud, index, skipScaleCalc ); else if(ge->dim() == 2){ - addExtrudeNormals(((GFace*)ge)->triangles, invert, octree, gouraud, index); - addExtrudeNormals(((GFace*)ge)->quadrangles, invert, octree, gouraud, index); + addExtrudeNormals(((GFace*)ge)->triangles, invert, octree, gouraud, index, skipScaleCalc ); + addExtrudeNormals(((GFace*)ge)->quadrangles, invert, octree, gouraud, index, skipScaleCalc ); } if(!gouraud) normalize = false; } @@ -183,6 +245,71 @@ static void checkDepends(GModel *m, GFace *f, std::set<GFace*> &dep) dep.insert(from); checkDepends(m, from, dep); } + + // Added by Trevor Strickler for compound face extrusion + if( f->geomType() == GEntity::CompoundSurface ){ + std::list<GFace*> compounds = ((GFaceCompound*)(f))->getCompounds(); + std::list<GFace*>::iterator itgf = compounds.begin(); + for( ; itgf != compounds.end(); itgf++ ){ + if( !(*itgf) ){ + Msg::Error("Unknown compound face in boundary layer source face %d.", f->tag() ); + return; + } + dep.insert( *itgf ); + checkDepends(m, *itgf, dep); + } + } + +} + +// Trevor Strickler +static unsigned int FixErasedExtrScaleFlags(GModel *m, std::map<int, bool> &faceSkipScaleCalc, std::map<int, bool> &edgeSkipScaleCalc) +{ + unsigned int num_changed = 0; + std::set<GRegion *, GEntityLessThan>::iterator itreg; + // fix all extruded faces bordering ScaleLast regions + for( itreg = m->firstRegion(); itreg != m->lastRegion(); itreg++ ){ + ExtrudeParams *r_ep = (*itreg)->meshAttributes.extrude; + if(!r_ep || !r_ep->mesh.ExtrudeMesh || r_ep->geo.Mode != EXTRUDED_ENTITY + || !r_ep->mesh.ScaleLast ) + continue; + std::list<GFace *> reg_faces = (*itreg)->faces(); + std::list<GFace *>::iterator itface; + for( itface = reg_faces.begin(); itface != reg_faces.end(); itface++ ){ + if( m->getFaceByTag( std::abs(r_ep->geo.Source) ) != (*itface) ){ + ExtrudeParams *f_ep = (*itface)->meshAttributes.extrude; + if(f_ep && f_ep->mesh.ExtrudeMesh && !f_ep->mesh.ScaleLast){ + num_changed++; + f_ep->mesh.ScaleLast = true; + faceSkipScaleCalc[(*itface)->tag()] = false; + } + } + } + } + // fix all extruded curves bordering ScaleLast faces...the previous loop should + // have fixed any replaced extruded faces. if a face is not bordering a region, + // then it would not have been replaced except by a pointless degenerate extrusion + // right on it...which makes no sense anyway. + // So... just loop through faces. + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){ + ExtrudeParams *f_ep = (*it)->meshAttributes.extrude; + if(!f_ep || !f_ep->mesh.ExtrudeMesh || !f_ep->mesh.ScaleLast ) + continue; + std::list<GEdge *> f_edges = (*it)->edges(); + std::list<GEdge *>::iterator itedge; + for( itedge = f_edges.begin(); itedge != f_edges.end(); itedge++ ){ + if( m->getEdgeByTag( std::abs(f_ep->geo.Source) ) != (*itedge) ){ + ExtrudeParams *e_ep = (*itedge)->meshAttributes.extrude; + if( e_ep && e_ep->mesh.ExtrudeMesh && !e_ep->mesh.ScaleLast ){ + num_changed++; + e_ep->mesh.ScaleLast = true; + edgeSkipScaleCalc[(*itedge)->tag()] = false; + } + } + } + } + + return num_changed; } int Mesh2DWithBoundaryLayers(GModel *m) @@ -190,7 +317,10 @@ int Mesh2DWithBoundaryLayers(GModel *m) std::set<GFace*> sourceFaces, otherFaces; std::set<GEdge*> sourceEdges, otherEdges; std::map<int, infoset> sourceFaceInfo, sourceEdgeInfo; - + std::map<int, bool> faceSkipScaleCalc, edgeSkipScaleCalc; // Trevor Strickler + ExtrudeParams::calcLayerScaleFactor[0] = 0; // Trevor Strickler + ExtrudeParams::calcLayerScaleFactor[1] = 0; // Trevor Strickler + // 2D boundary layers for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++){ GEdge *ge = *it; @@ -208,6 +338,18 @@ int Mesh2DWithBoundaryLayers(GModel *m) (ep->mesh.BoundaryLayerIndex, ep->mesh.ViewIndex)); sourceEdgeInfo[from->tag()].insert(tags); sourceEdges.insert(from); + // Trevor Strickler + // Added by Trevor Strickler to scale last layer size locally + // Do not worry if one section of the boundary layer index = 0 or 1 is not supposed to be + // scaled...that section's normals will have scaleFactor = 1.0 (exactly 1.0 to all sig figs) + // ...however, if that non-scaled + // section borders a scaled section, the boundary normals will extrude scaled. + if( !ep->mesh.ScaleLast ) + edgeSkipScaleCalc[from->tag()] = true; + else{ + edgeSkipScaleCalc[from->tag()] = false; + ExtrudeParams::calcLayerScaleFactor[ep->mesh.BoundaryLayerIndex] = true; + } } } } @@ -229,14 +371,43 @@ int Mesh2DWithBoundaryLayers(GModel *m) (ep->mesh.BoundaryLayerIndex, ep->mesh.ViewIndex)); sourceFaceInfo[from->tag()].insert(tags); sourceFaces.insert(from); + // Trevor Strickler + // Added by Trevor Strickler to scale last layer size locally + // Do not worry if one section of the boundary layer index = 0 or 1 is not supposed to be + // scaled...that section's normals will have scaleFactor = 1.0 (exactly 1.0 to all sig figs) + // ...however, if that non-scaled + // section borders a scaled section, the boundary normals will extrude scaled + if( !ep->mesh.ScaleLast ) + faceSkipScaleCalc[from->tag()] = true; + else{ + faceSkipScaleCalc[from->tag()] = false; + ExtrudeParams::calcLayerScaleFactor[ep->mesh.BoundaryLayerIndex] = true; + } std::list<GEdge*> e = from->edges(); sourceEdges.insert(e.begin(), e.end()); + // by Trevor Strickler + for( std::list<GEdge*>::iterator ite = e.begin(); ite != e.end(); ite++ ){ + if( edgeSkipScaleCalc.find( (*ite)->tag() ) == edgeSkipScaleCalc.end() ) + edgeSkipScaleCalc[ (*ite)->tag() ] = true; // a default + if( ep->mesh.ScaleLast ) + edgeSkipScaleCalc[(*ite)->tag()] = false; + } } } } if(sourceEdges.empty() && sourceFaces.empty()) return 0; + // from Trevor Strickler -- Just in case ReplaceDuplicates() erases the ExtrudeParams::mesh.scaleLast + // flag, should check all bounding regions of this curve to see if scaleLast is set. + // if so, reset it in the extrudeParams (maybe this could be done in the TreeUtils.... + // but I do not want to change the code too much and create a bug. + // The developers should decide that. + if( ExtrudeParams::calcLayerScaleFactor[0] || ExtrudeParams::calcLayerScaleFactor[1] ){ + unsigned int num_changed = FixErasedExtrScaleFlags(m, faceSkipScaleCalc, edgeSkipScaleCalc); + if( num_changed ) + Msg::Warning("%d entities were changed from ScaleLast = false to ScaleLast = true", num_changed); + } // compute mesh dependencies in source faces (so we can e.g. create // a boundary layer on an extruded mesh) std::set<GFace*> sourceFacesDependencies; @@ -275,9 +446,9 @@ int Mesh2DWithBoundaryLayers(GModel *m) ExtrudeParams::normals[i] = new smooth_data(); } if(sourceFaces.empty()) - addExtrudeNormals(sourceEdges, sourceEdgeInfo); + addExtrudeNormals(sourceEdges, sourceEdgeInfo, edgeSkipScaleCalc); else - addExtrudeNormals(sourceFaces, sourceFaceInfo); + addExtrudeNormals(sourceFaces, sourceFaceInfo, faceSkipScaleCalc); // set the position of boundary layer points using the smooth normal // field diff --git a/Mesh/QuadTriExtruded2D.cpp b/Mesh/QuadTriExtruded2D.cpp index 079890013b..04e610d157 100644 --- a/Mesh/QuadTriExtruded2D.cpp +++ b/Mesh/QuadTriExtruded2D.cpp @@ -36,12 +36,14 @@ GNU General Public License for more details. // By Geuzaine, Remacle... static void addTriangle(MVertex* v1, MVertex* v2, MVertex* v3, - GFace *to, MElement* source) + GFace *to) { MTriangle* newTri = new MTriangle(v1, v2, v3); to->triangles.push_back(newTri); } + + // The function that tests whether a 2D surface is a lateral of a valid QuadToTri // region and whether there are conflicts. If surface is not part of valid QuadToTri region // or if there are QuadToTri conflicts, return 0. Note that RemoveDuplicateSurfaces() @@ -126,17 +128,19 @@ int IsValidQuadToTriLateral(GFace *face, int *tri_quad_flag, bool *detectQuadToT bool detect_conflict = false; - // Set the tri_quad_flag that lets extrudeMesh override ep->Recombine; + // Set the tri_quad_flag that lets ExtrudeMesh override ep->Recombine; // tri_quad_values: 0 = no override, 1 = mesh as quads, 2 = mesh as triangles. // if this face is a free surface: if( adjacent_regions.size() == 1 ){ - if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_SNGL_1_RECOMB || - lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB ) + if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_NOVERTS_1_RECOMB || + lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_ADDVERTS_1_RECOMB ){ (*tri_quad_flag) = 1; - else if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_SNGL_1 || - lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_DBL_1 ) + } + if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_NOVERTS_1 || + lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_ADDVERTS_1 ){ (*tri_quad_flag) = 2; + } else (*tri_quad_flag) = 0; } @@ -161,11 +165,11 @@ int IsValidQuadToTriLateral(GFace *face, int *tri_quad_flag, bool *detectQuadToT // neighboring extrusion. else if( adj_ep && adj_ep->mesh.ExtrudeMesh && model->getFaceByTag( std::abs( adj_ep->geo.Source ) ) == face ){ - if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_SNGL_1_RECOMB || - lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB ) + if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_NOVERTS_1_RECOMB || + lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_ADDVERTS_1_RECOMB ) (*tri_quad_flag) = 1; - else if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_SNGL_1 || - lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_DBL_1 ) + else if( lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_NOVERTS_1 || + lateral_regions[0]->meshAttributes.extrude->mesh.QuadToTri == QUADTRI_ADDVERTS_1 ) (*tri_quad_flag) = 2; else (*tri_quad_flag) = 0; @@ -178,15 +182,11 @@ int IsValidQuadToTriLateral(GFace *face, int *tri_quad_flag, bool *detectQuadToT else if( (adj_ep && !adj_ep->mesh.QuadToTri && !adj_ep->mesh.Recombine) || (ep && !ep->mesh.QuadToTri && !ep->mesh.Recombine) ) (*tri_quad_flag) = 2; - // if both are quadToTri and either are quadToTri recomblaterals, recombine - else if( ep->mesh.QuadToTri == QUADTRI_SNGL_1_RECOMB || - (adj_ep && adj_ep->mesh.QuadToTri == QUADTRI_SNGL_1_RECOMB) ) - (*tri_quad_flag) = 1; - else if( ep->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB || - (adj_ep && adj_ep->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB) ) + // if both are quadToTri ALWAYS try to recombine + else if( ep->mesh.QuadToTri && adj_ep && adj_ep->mesh.QuadToTri ) (*tri_quad_flag) = 1; else - (*tri_quad_flag) = 2; + (*tri_quad_flag) = 0; } // any other adjacent surface, just default to the QuadToTri region's non-QuadToTri // default recombination method. Any mistakes at this point are not this feature's. @@ -210,8 +210,11 @@ int IsValidQuadToTriLateral(GFace *face, int *tri_quad_flag, bool *detectQuadToT // The function that tests whether a surface is a QuadToTri top surface and whether // there are conflicts. If surface is not a top for a valid QuadToTri region or if -// there are QuadToTri conflicts, return 0. Note that RemoveDuplicateSurfaces() -// makes this DIFFICULT. Also, the type of QuadToTri interface is placed into the +// there are QuadToTri conflicts, return 0. +// if the surface turns out to be the source of a toroidal loop extrusion (which will then +// NOT have geo.Mode == COPIED_ENTITY), return 2 (this will require special meshing considerations). +// Note that RemoveDuplicateSurfaces() makes this DIFFICULT. +// Also, the type of QuadToTri interface is placed into the // pointer argument quadToTri. . // Added 2010-12-09. int IsValidQuadToTriTop(GFace *face, int *quadToTri, bool *detectQuadToTriTop) @@ -219,8 +222,13 @@ int IsValidQuadToTriTop(GFace *face, int *quadToTri, bool *detectQuadToTriTop) (*quadToTri) = NO_QUADTRI; (*detectQuadToTriTop) = false; + int is_toroidal_quadtri = 0; + GModel *model = face->model(); + // First thing is first: determine if this is a toroidal quadtri extrusion. if so, can skip the rest + + // It seems the member pointers to neighboring regions for extruded top faces are not set. // For now, have to loop through // ALL the regions to see if the presently considered face belongs to the region. @@ -228,109 +236,128 @@ int IsValidQuadToTriTop(GFace *face, int *quadToTri, bool *detectQuadToTriTop) // whether the face is a top face of the region (including whether the region is even extruded). // After that information is determined, function can test for QuadToTri neighbor conflicts. - std::vector<GRegion *> top_regions; - std::vector<GRegion *> adjacent_regions; - std::vector<GRegion *> all_regions; - int numRegions = 0; - int numTopRegions = 0; - - std::set<GRegion *, GEntityLessThan>::iterator itreg; - for( itreg = model->firstRegion(); itreg != model->lastRegion(); itreg++ ) - all_regions.push_back( (*itreg) ); + - for(unsigned int i_reg = 0; i_reg < all_regions.size(); i_reg++ ){ - - // save time - if( numRegions >= 2 ) - break; - - GRegion *region = all_regions[i_reg]; - - // is region in the current model's regions or is it deleted? - if( !FindVolume( ( region->tag() ) ) ) - continue; - - // does face belong to region? - std::list<GFace *> region_faces = std::list<GFace *>( region->faces() ); - if( std::find( region_faces.begin(), region_faces.end(), face ) != - region_faces.end() ){ - adjacent_regions.push_back(region); - numRegions++; + + // first determine if this is toroidal quadtotri + is_toroidal_quadtri = IsInToroidalQuadToTri(face); + + if( is_toroidal_quadtri ) + (*detectQuadToTriTop) = true; + else{ + std::vector<GRegion *> top_regions; + std::vector<GRegion *> adjacent_regions; + std::vector<GRegion *> all_regions; + int numRegions = 0; + int numTopRegions = 0; + std::set<GRegion *, GEntityLessThan>::iterator itreg; + + for( itreg = model->firstRegion(); itreg != model->lastRegion(); itreg++ ) + all_regions.push_back( (*itreg) ); + + for(unsigned int i_reg = 0; i_reg < all_regions.size(); i_reg++ ){ + + // save time + if( numRegions >= 2 ) + break; + + GRegion *region = all_regions[i_reg]; + + // is region in the current model's regions or is it deleted? + if( !FindVolume( ( region->tag() ) ) ) + continue; + + // does face belong to region? + std::list<GFace *> region_faces = std::list<GFace *>( region->faces() ); + if( std::find( region_faces.begin(), region_faces.end(), face ) != + region_faces.end() ){ + adjacent_regions.push_back(region); + numRegions++; + } + else + continue; + + // is region a structured extruded? + if( !(region->meshAttributes.extrude && region->meshAttributes.extrude->mesh.ExtrudeMesh && + region->meshAttributes.extrude->geo.Mode == EXTRUDED_ENTITY) ) + continue; + + // Test whether the face is a top for the region + if( IsSurfaceATopForRegion(region, face) ){ + top_regions.push_back(region); + numTopRegions++; + if( region->meshAttributes.extrude->mesh.QuadToTri ) + (*detectQuadToTriTop) = true; + } + } - else - continue; + + // MAIN test of whether this is even a quadToTri extrusion lateral + // the only return 0 path that is NOT an error + if( !(*detectQuadToTriTop) ) + return 0; - // is region extruded? - if( !region->meshAttributes.extrude ) - continue; - if( region->meshAttributes.extrude->geo.Mode != EXTRUDED_ENTITY ) - continue; + ExtrudeParams *ep = face->meshAttributes.extrude; - // Test whether the face is a top for the region - if( IsSurfaceATopForRegion(region, face) ){ - top_regions.push_back(region); - numTopRegions++; - if( region->meshAttributes.extrude->mesh.QuadToTri ) - (*detectQuadToTriTop) = true; + if(!ep && !is_toroidal_quadtri){ + Msg::Error("In IsValidQuadToTriTop(), no extrude info for surface %d.", + face->tag() ); + return 0; } - } - - // MAIN test of whether this is even a quadToTri extrusion lateral - // the only return 0 path that is NOT an error - if( !(*detectQuadToTriTop) ) - return 0; - - - - ExtrudeParams *ep = face->meshAttributes.extrude; + if( ep->geo.Mode != COPIED_ENTITY ){ + Msg::Error("In IsValidQuadToTriTop(), surface %d is not copied from source.", + face->tag() ); + return 0; + } - if(!ep){ - Msg::Error("In IsValidQuadToTriTop(), no extrude info for surface %d.", - face->tag() ); - return 0; - } + if( ep->mesh.QuadToTri == 0){ + Msg::Error("In IsValidQuadToTriTop(), surface %d was determined to be the top surface " + "for a QuadToTri extrusion, but does not have QuadToTri parameters set within itself.", + face->tag() ); + return 0; + } - if( ep->geo.Mode != COPIED_ENTITY){ - Msg::Error("In IsValidQuadToTriTop(), surface %d is not copied from source.", - face->tag() ); - return 0; - } + GFace *face_source = model->getFaceByTag(std::abs(ep->geo.Source)); + if(!face_source){ + Msg::Error("In IsValidQuadToTriTop(), unknown source face number %d.", + face->meshAttributes.extrude->geo.Source); + return 0; + } - if( ep->mesh.QuadToTri == 0){ - Msg::Error("In IsValidQuadToTriTop(), surface %d was determined to be the top surface " - "for a QuadToTri extrusion, but does not have QuadToTri parameters set within itself.", - face->tag() ); - return 0; - } + if(numRegions > 2){ + Msg::Error("In IsValidQuadToTriTop(), too many regions adjacent to surface %d.", + face->tag() ); + return 0; + } - GFace *face_source = model->getFaceByTag(std::abs(ep->geo.Source)); - if(!face_source){ - Msg::Error("In IsValidQuadToTriTop(), unknown source face number %d.", - face->meshAttributes.extrude->geo.Source); - return 0; - } - if(numRegions > 2){ - Msg::Error("In IsValidQuadToTriTop(), too many regions adjacent to surface %d.", - face->tag() ); - return 0; - } + if( top_regions.size() ){ + (*quadToTri) = top_regions[0]->meshAttributes.extrude->mesh.QuadToTri; + } + // Make sure that face is the top for only one region. if not, then there will likely + // be conflicts (two regions extruded into each other). + if( top_regions.size() > 1 ){ + Msg::Error("In IsValidQuadToTriTop(), QuadToTri top surface %d identified as top " + "surface for more than one region. Likely conflict.", face->tag() ); + return 0; + } - if( top_regions.size() ){ - (*quadToTri) = top_regions[0]->meshAttributes.extrude->mesh.QuadToTri; - } + } // end of else that executes if NOT toroidal extrusion - // Make sure that face is the top for only one region. if not, then there will likely - // be conflicts (two regions extruded into each other). - if( top_regions.size() > 1 ){ - Msg::Error("In IsValidQuadToTriTop(), QuadToTri top surface %d identified as top " - "surface for more than one region. Likely conflict.", face->tag() ); + + // this is technically redundant...but if changes are made, it's good to keep this here at the end for safety + if( !(*detectQuadToTriTop) ) return 0; - } - return 1; + if( !is_toroidal_quadtri ) + return 1; + else if( is_toroidal_quadtri == 1 ) + { return 2;} // for toroidal extrusion + else + return 3; + } @@ -394,8 +421,6 @@ static int MeshQuadToTriTopUnstructured(GFace *from, GFace *to, return 0; } - // make the element - MElement *element = from->quadrangles[i]; // draw other diagonals to minimize difference in average edge length with diagonal length, in quadrature @@ -410,12 +435,12 @@ static int MeshQuadToTriTopUnstructured(GFace *from, GFace *to, double d2 = verts[1]->distance(verts[3]); if(fabs(d1*d1-mag_sq_ave) <= fabs(d2*d2-mag_sq_ave) ){ - addTriangle(verts[0],verts[1],verts[2],to,element); - addTriangle(verts[0],verts[2],verts[3],to,element); + addTriangle(verts[0],verts[1],verts[2],to); + addTriangle(verts[0],verts[2],verts[3],to); } else{ - addTriangle(verts[1],verts[2],verts[3],to,element); - addTriangle(verts[1],verts[3],verts[0],to,element); + addTriangle(verts[1],verts[2],verts[3],to); + addTriangle(verts[1],verts[3],verts[0],to); } } @@ -429,10 +454,10 @@ static int MeshQuadToTriTopUnstructured(GFace *from, GFace *to, // 'GFace *to' is the top surface to mesh, 'from' is the source surface, 'pos' is a std::set // of vertex positions for the top surface. int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, - MVertexLessThanLexicographic> &pos) + MVertexLessThanLexicographic> &pos ) { if( !to->meshAttributes.extrude || !to->meshAttributes.extrude->mesh.QuadToTri ) - return 0; + return 0; // if the source is all triangles, then just let this function is not needed. Return 1. if( from->triangles.size() && !from->quadrangles.size() ) @@ -442,30 +467,26 @@ int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, if( !from->triangles.size() && !from->quadrangles.size() ) return 0; + ExtrudeParams *ep = to->meshAttributes.extrude; if( !ep || !ep->mesh.ExtrudeMesh || !(ep->geo.Mode == COPIED_ENTITY) ){ Msg::Error("In MeshQuadToTriTopSurface(), incomplete or no " - "extrude information for top face %d.", to->tag() ); + "extrude information for top face %d.", to->tag() ); return 0; } - - // number of extrusion layers - int num_layers = 0; - for( int p = 0; p < ep->mesh.NbLayer; p++ ) - num_layers += ep->mesh.NbElmLayer[p]; - - // is this a valid double layer extrusion? - bool is_dbl = false; - if( num_layers >= 2 && ( ep->mesh.QuadToTri == QUADTRI_DBL_1 || ep->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB ) ) - is_dbl = true; - - // IF this is a SINGLE layer quadToTri, mesh the surfaces according to this modified + + // is this a quadtri extrusion with added vertices? + bool is_addverts = false; + if( ep && (ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1 || ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1_RECOMB) ) + is_addverts = true; + + // execute this section if + // IF this is a 'no new vertices' quadToTri, mesh the surfaces according to this modified // least point value method: if a 3 boundary point quad, draw diagonals from middle corner toward // interior. If a a 2- or 1- point boundary quad, draw toward lowest pointer number NOT on boundary. // All interior quad, draw diagonal to vertex with lowest pointer number. - if( !is_dbl ){ - + if( !is_addverts ){ std::set<MVertex*, MVertexLessThanLexicographic> pos_src_edge; QuadToTriInsertFaceEdgeVertices(from, pos_src_edge); std::set<MVertex*, MVertexLessThanLexicographic>::iterator itp; @@ -540,17 +561,17 @@ int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, low_index = getIndexForLowestVertexPointer(verts); addTriangle( verts[low_index],verts[(low_index+1)%verts.size()], - verts[(low_index+2)%verts.size()],to,element); + verts[(low_index+2)%verts.size()],to); addTriangle( verts[low_index],verts[(low_index+2)%verts.size()], - verts[(low_index+3)%verts.size()],to,element); + verts[(low_index+3)%verts.size()],to); } return 1; } - // AFTER THIS POINT IN FUNCTION, CODE IS ALL FOR DOUBLE LAYER EXTRUSIONS (Less restrictive). + // AFTER THIS POINT IN FUNCTION, CODE IS ALL FOR 'ADD INTERNAL VERTEX' EXTRUSIONS (Less restrictive). - // if double layer and unstructured, can try to make the top mesh a little neater + // if source face is unstructured, can try to make the top mesh a little neater GFace *root_source = findRootSourceFaceForFace( from ); ExtrudeParams *ep_src = root_source->meshAttributes.extrude; bool struct_root = false; @@ -562,7 +583,7 @@ int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, if( !struct_root && MeshQuadToTriTopUnstructured(from, to, pos) ) return 1; - // And top surface for a structured double layer can be meshed quite easily + // And top surface for the 'added internal vertex' method can be meshed quite easily else{ std::set<MVertex *, MVertexLessThanLexicographic >::iterator itp; // loop through each element source quadrangle and extrude @@ -597,10 +618,9 @@ int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, return 0; } - // make the element - MElement *element = from->quadrangles[i]; - addTriangle( verts[0],verts[2], verts[3],to,element); - addTriangle( verts[0],verts[1], verts[2],to,element); + // make the elements + addTriangle( verts[0],verts[2], verts[3],to); + addTriangle( verts[0],verts[1], verts[2],to); } return 1; } diff --git a/Mesh/QuadTriExtruded2D.h b/Mesh/QuadTriExtruded2D.h index 131a21bde3..329a842cfe 100644 --- a/Mesh/QuadTriExtruded2D.h +++ b/Mesh/QuadTriExtruded2D.h @@ -53,6 +53,8 @@ GNU General Public License for more details. #include <math.h> #include "QuadTriUtils.h" + + // The function that tests whether a 2D surface is a lateral of a valid QuadToTri // region and whether there are conflicts. If surface is not part of valid QuadToTri region // or if there are QuadToTri conflicts, return 0. Note that RemoveDuplicateSurfaces() @@ -78,6 +80,6 @@ int IsValidQuadToTriTop(GFace *face, int *quadToTri, bool *detectQuadToTriTop); // 'GFace *to' is the top surface to mesh, 'from' is the source surface, 'pos' is a std::set // of vertex positions for the top surface. int MeshQuadToTriTopSurface( GFace *from, GFace *to, std::set<MVertex*, - MVertexLessThanLexicographic> &pos); + MVertexLessThanLexicographic> &pos ); #endif diff --git a/Mesh/QuadTriExtruded3D.cpp b/Mesh/QuadTriExtruded3D.cpp index 079b83291e..acb2ddc6ec 100644 --- a/Mesh/QuadTriExtruded3D.cpp +++ b/Mesh/QuadTriExtruded3D.cpp @@ -270,7 +270,10 @@ bool IsValidQuadToTriRegion(GRegion *region, bool *allNonGlobalSharedLaterals) region->tag() ); return false; } - + + bool is_toroidal = IsInToroidalQuadToTri(reg_source); + GFace *root = findRootSourceFaceForFace(reg_source); + // Find a source surface. Then find a COPIED_ENTITY that is the top surface. // Then determine if all the laterals are either all quad or all triangle. // If shared laterals are all static (quad or non subdivide triangles), @@ -278,15 +281,18 @@ bool IsValidQuadToTriRegion(GRegion *region, bool *allNonGlobalSharedLaterals) // If any lateral is unstructured, error. bool foundTop = false, foundSource = false, - foundNoStruct = false; + foundNoStruct = false, foundRoot = false; std::list<GFace *> faces = region->faces(); std::list<GFace *>::iterator it = faces.begin(); (*allNonGlobalSharedLaterals) = true; + for( it = faces.begin(); it != faces.end(); it++ ){ ExtrudeParams *face_tmp_ep = (*it)->meshAttributes.extrude; + if( (*it) == root ) + foundRoot = true; if( (*it) == reg_source ) foundSource = true; else if( face_tmp_ep && face_tmp_ep->geo.Mode == @@ -303,6 +309,7 @@ bool IsValidQuadToTriRegion(GRegion *region, bool *allNonGlobalSharedLaterals) else if( top_source_tmp == reg_source && !IsSurfaceALateralForRegion(region, *it) ) foundTop = true; + } // This is a check to see if there are lateral surface triangles that need to be edged globally in subdivide operation else if( IsSurfaceALateralForRegion(region, *it) ){ @@ -317,11 +324,15 @@ bool IsValidQuadToTriRegion(GRegion *region, bool *allNonGlobalSharedLaterals) (*allNonGlobalSharedLaterals) = false; } } - else + else if( !is_toroidal ) foundNoStruct = true; } + // if didn't find the copied entity, maybe this is toroidal and the top has been replaced + if( is_toroidal && !foundTop && foundRoot && root != reg_source ) + foundTop = true; + // test for errors bool detectConflict = false; if( !foundTop ){ @@ -2377,34 +2388,46 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, return false; } - // Find a source surface, find a COPIED_ENTITY that is the top surface, + // Find a source surface, find a COPIED_ENTITY that is the top surface, or if toroidal, find what is now the top - bool foundSource = false, foundTop = false; + bool foundSource = false, foundTop = false, foundRoot = false; GFace *reg_top = NULL; + GFace *root_face = NULL; std::list<GFace *> faces = gr->faces(); std::list<GFace *>::iterator it = faces.begin(); + // top faces in toroidal quadtri need special treatment + bool is_toroidal = IsInToroidalQuadToTri(reg_source); + if( is_toroidal ) + root_face = findRootSourceFaceForFace(reg_source); + for( it = faces.begin(); it != faces.end(); it++ ){ ExtrudeParams *face_tmp_ep = (*it)->meshAttributes.extrude; + if( (*it) == root_face ) + foundRoot = true; if( (*it) == reg_source ) foundSource = true; else if( face_tmp_ep && face_tmp_ep->geo.Mode == - COPIED_ENTITY ){ + COPIED_ENTITY ){ GFace *top_source_tmp = model->getFaceByTag( - std::abs( face_tmp_ep->geo.Source ) ); + std::abs( face_tmp_ep->geo.Source ) ); if( !top_source_tmp ){ - Msg::Error("In QuadToTriGetRegionDiags(), could not find source face " - "%d for copied surface %d of region %d.", - std::abs( face_tmp_ep->geo.Source ), - (*it)->tag(), gr->tag() ); + Msg::Error("In QuadToTriGetRegionDiags(), could not find source face " + "%d for copied surface %d of region %d.", + std::abs( face_tmp_ep->geo.Source ), + (*it)->tag(), gr->tag() ); } else if( top_source_tmp == reg_source ){ - foundTop = true; - reg_top = (*it); + foundTop = true; + reg_top = (*it); } } } + if( !foundTop && is_toroidal && foundRoot && root_face != reg_source ){ + foundTop = true; + reg_top = root_face; + } if( !foundTop ) Msg::Warning("In QuadToTriGetRegionDiags(), could not find top face " "for region %d.", gr->tag() ); @@ -2427,14 +2450,29 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, IsSurfaceALateralForRegion(gr, *it) ){ // take care of forbidden edges - for( unsigned int i = 0; i < (*it)->quadrangles.size(); i++){ - std::vector<MVertex*> v; - (*it)->quadrangles[i]->getVertices(v); - createForbidden(v, forbidden_edges ); - } - - // at this point, if there are no triangles or if there are quads, continue - if( !(*it)->triangles.size() || (*it)->quadrangles.size() ) + // test whether this surface is a lateral bounded by two quadtri regions. + // if so, and the other is not already meshed, + // then don't make these forbidden. This is worked out in a + // lateral remesh later + std::vector<GRegion *> adj_regions; + int numNeighbors = 0; + numNeighbors = GetNeighborRegionsOfFace((*it), adj_regions); + int ind_notcurrent = adj_regions[0] == gr ? 1 : 0; + if( !( numNeighbors == 2 && adj_regions[0]->meshAttributes.extrude && adj_regions[1]->meshAttributes.extrude && + adj_regions[0]->meshAttributes.extrude->mesh.ExtrudeMesh && adj_regions[1]->meshAttributes.extrude->mesh.ExtrudeMesh && + adj_regions[0]->meshAttributes.extrude->geo.Mode == EXTRUDED_ENTITY && adj_regions[1]->meshAttributes.extrude->geo.Mode == EXTRUDED_ENTITY && + adj_regions[0]->meshAttributes.extrude->mesh.QuadToTri && adj_regions[1]->meshAttributes.extrude->mesh.QuadToTri && + IsSurfaceALateralForRegion(adj_regions[ind_notcurrent], *it) && + !adj_regions[ind_notcurrent]->getNumMeshElements() ) ){ + for( unsigned int i = 0; i < (*it)->quadrangles.size(); i++){ + std::vector<MVertex*> v; + (*it)->quadrangles[i]->getVertices(v); + createForbidden(v, forbidden_edges ); + } + } + + // at this point, if there are no triangles, continue + if( !(*it)->triangles.size() ) continue; ExtrudeParams *face_ep_tmp = (*it)->meshAttributes.extrude; @@ -2552,9 +2590,9 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, else createEdge( verts[diag.first+add], verts[diag.second-add], lat_tri_diags ); } - else - Msg::Error("In QuadToTriGetRegionDiags(), failed to find a diagonal on unrecombined lateral surface %d.", (*it)->tag() ); - + else if( !(*it)->quadrangles.size() ) + Msg::Error("In QuadToTriGetRegionDiags(), failed to find a diagonal in lateral surface %d.", (*it)->tag() ); + index_guess += 2; /* @@ -2582,18 +2620,19 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, else createEdge( elemEdge_tmp.first, elemEdge_tmp.second, lat_tri_diags ); */ - + } } } - } + } } - // Insert diagonals of the COPIED top surface into quadToTri_edges; + + // Insert diagonals of the top surface into quadToTri_edges; unsigned int index_guess = reg_source->triangles.size(); - if( reg_top->quadrangles.size() ){ + if( reg_top->quadrangles.size() && !is_toroidal ){ Msg::Error("In QuadToTriGetRegionDiags(), top surface of region " - "%d has quads.", gr->tag() ); + "%d has quads in a non-toroidal QuadToTri extrusion.", gr->tag() ); return false; } @@ -2605,16 +2644,19 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, std::vector<MVertex *> verts; get2DExtrudedVertices( elem, ep, j_top, k_top, pos, verts ); if( verts.size() != 4 ) break; - - // Find diagonal: - std::pair<int,int> diag(0,0); - diag = FindDiagonalEdgeIndices( verts, reg_top, false, index_guess ); - if( diag.first || diag.second ) - createEdge( verts[diag.first], verts[diag.second], quadToTri_edges ); + if( !is_toroidal ){ + // Find diagonal: + std::pair<int,int> diag(0,0); + diag = FindDiagonalEdgeIndices( verts, reg_top, false, index_guess ); + if( diag.first || diag.second ) + createEdge( verts[diag.first], verts[diag.second], quadToTri_edges ); + else + Msg::Error("In QuadToTriGetRegionDiags(), failed to find a diagonal on top surface %d, but should have.", reg_top->tag() ); + index_guess += 2; + } else - Msg::Error("In QuadToTriGetRegionDiags(), failed to find a diagonal on top surface %d.", reg_top->tag() ); + createForbidden(verts, forbidden_edges); - index_guess += 2; } return true; } @@ -2623,7 +2665,7 @@ static bool QuadToTriGetRegionDiags(GRegion *gr, // For use in QuadToTriEdgeGenerator: Controls BRUTE FORCE edging of elements with ALL vertices // on a lateral boundary surface. // Added 04/08/2011 -static int makeEdgesForElemsWithAllVertsOnBnd( GRegion *gr, bool is_dbl, +static int makeEdgesForElemsWithAllVertsOnBnd( GRegion *gr, bool is_addverts, CategorizedSourceElements &cat_src_elems, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::set<std::pair<MVertex*, MVertex*> > &lat_tri_diags, @@ -2672,8 +2714,8 @@ static int makeEdgesForElemsWithAllVertsOnBnd( GRegion *gr, bool is_dbl, // can afford temporary copies since these sets should be relatively small for all cases. std::set<unsigned int> tri_tmp, quad_tmp; tri_tmp = cat_src_elems.three_bnd_pt_tri; - // if is_dbl, then don't track the quads - if( !is_dbl ) + // if is_addverts, then don't track the quads + if( !is_addverts ) quad_tmp = cat_src_elems.four_bnd_pt_quad; while( tri_tmp.size() || quad_tmp.size() ){ @@ -2869,7 +2911,7 @@ static int makeEdgesForElemsWithAllVertsOnBnd( GRegion *gr, bool is_dbl, // For use in QuadToTriEdgeGenerator: Does the edging of prisms with some but not all vertices // on a lateral boundary surface. // Added 04/08/2011 -static int makeEdgesForOtherBndPrisms( GRegion *gr, bool is_dbl, CategorizedSourceElements &cat_src_elems, +static int makeEdgesForOtherBndPrisms( GRegion *gr, bool is_addverts, CategorizedSourceElements &cat_src_elems, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::set<std::pair<MVertex*, MVertex*> > &lat_tri_diags, std::set<std::pair<MVertex*, MVertex*> > &forbidden_edges, @@ -2996,7 +3038,7 @@ static int makeEdgesForOtherBndPrisms( GRegion *gr, bool is_dbl, CategorizedSour // For use in QuadToTriEdgeGenerator: Does the edging of hexahedra with some but not all vertices // on a lateral boundary surface. // Added 04/08/2011 -static int makeEdgesForOtherBndHexa( GRegion *gr, bool is_dbl, CategorizedSourceElements &cat_src_elems, +static int makeEdgesForOtherBndHexa( GRegion *gr, bool is_addverts, CategorizedSourceElements &cat_src_elems, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::set<std::pair<MVertex*, MVertex*> > &lat_tri_diags, std::set<std::pair<MVertex*, MVertex*> > &forbidden_edges, @@ -3320,7 +3362,7 @@ static int makeEdgesForOtherBndHexa( GRegion *gr, bool is_dbl, CategorizedSource // a pivot vertex of a hexahedral element that has ONE SOURCE vertex on a lateral boundary surface. // See inside function for a definition of the "pivot vertex." // Added 04/08/2011 - static int makeEdgesForElemsTouchPivotVert( GRegion *gr, bool is_dbl, CategorizedSourceElements &cat_src_elems, + static int makeEdgesForElemsTouchPivotVert( GRegion *gr, bool is_addverts, CategorizedSourceElements &cat_src_elems, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::set<std::pair<MVertex*, MVertex*> > &lat_tri_diags, std::set<std::pair<MVertex*, MVertex*> > &forbidden_edges, @@ -3546,7 +3588,7 @@ static int makeEdgesForOtherBndHexa( GRegion *gr, bool is_dbl, CategorizedSource // For use in QuadToTriEdgeGenerator: Does the lateral edging of internal elements in the top extrusion // layer by lowest vertex pointer value in TOP FACE. // Added 04/08/2011 -static int makeEdgesInternalTopLayer( GRegion *gr, bool is_dbl, CategorizedSourceElements &cat_src_elems, +static int makeEdgesInternalTopLayer( GRegion *gr, bool is_addverts, CategorizedSourceElements &cat_src_elems, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { @@ -3660,15 +3702,16 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem return 0; } + // number of extrusion layers int num_layers = 0; for( int p = 0; p < ep->mesh.NbLayer; p++ ) num_layers += ep->mesh.NbElmLayer[p]; - // is this a valid double layer extrusion? - bool is_dbl = false; - if( num_layers >= 2 && ( ep->mesh.QuadToTri == QUADTRI_DBL_1 || ep->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB ) ) - is_dbl = true; + // is this a valid 'add internal vertex' extrusion? + bool is_addverts = false; + if( ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1 || ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1_RECOMB ) + is_addverts = true; // now find and verify the source and the top of region @@ -3680,20 +3723,32 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem return 0; } + // need for toroidal loop extrusions...top layer treated specially + bool is_toroidal = IsInToroidalQuadToTri(reg_source); + + std::list<GFace *> reg_faces = gr->faces(); std::list<GFace *>::iterator itf = reg_faces.begin(); - // find top surface of extrusion + // find top surface of extrusion and first root dependency of source GFace *reg_top = NULL; + GFace *root = findRootSourceFaceForFace(reg_source); + bool foundRoot = false; for( itf = reg_faces.begin(); itf != reg_faces.end(); itf++ ){ ExtrudeParams *face_ep = (*itf)->meshAttributes.extrude; if( face_ep && face_ep->geo.Mode == COPIED_ENTITY && reg_source == model->getFaceByTag( std::abs(face_ep->geo.Source) ) ){ reg_top = (*itf); - break; } + if( (*itf) == root ) + foundRoot = true; + if( reg_top && (foundRoot || !is_toroidal) ) + break; + } - + + if( is_toroidal && !reg_top && foundRoot && root != reg_source ) + reg_top = root; if( !reg_top ){ Msg::Error("In QuadToTriEdgeGenerator(), invalid top surface for region " "%d.", gr->tag() ); @@ -3755,9 +3810,9 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem } }*/ - // if this is a double layer extrusion, don't need adjustable lateral edges, so + // if this is an' add internal vertex' extrusion, don't need adjustable lateral edges, so // put all lat_tri_diags into quadToTri_edges - if( is_dbl) + if( is_addverts) quadToTri_edges.insert(lat_tri_diags.begin(), lat_tri_diags.end()); // If there are no lat_tri_diags and no quads, there is nothing left to do @@ -3765,14 +3820,14 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem return 1; - // can return now if this is a double layer extrusion...nothing left to do - if( is_dbl ) + // can return now if this is an 'add internal vertex' extrusion...nothing left to do + if( is_addverts ) return 1; // BRUTE FORCE diagonalization of elements with all vertices on a lateral boundary of region: // This has to be done for all cases with such elements if - if( !makeEdgesForElemsWithAllVertsOnBnd( gr, is_dbl, cat_src_elems, quadToTri_edges, + if( !makeEdgesForElemsWithAllVertsOnBnd( gr, is_addverts, cat_src_elems, quadToTri_edges, lat_tri_diags, forbidden_edges, problems, pos ) ){ Msg::Error("In QuadToTriEdgeGenerator(), failed to make edges for the elements in region %d " "with all vertices on a lateral boundary", gr->tag() ); @@ -3783,7 +3838,7 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem // Extrude source triangles that are on the source boundary edges and find any diagonals - if( !makeEdgesForOtherBndPrisms( gr, is_dbl, cat_src_elems, quadToTri_edges, + if( !makeEdgesForOtherBndPrisms( gr, is_addverts, cat_src_elems, quadToTri_edges, lat_tri_diags, forbidden_edges, problems, pos ) ){ Msg::Error("In QuadToTriEdgeGenerator(), failed to make edges for the prism extrusions in region %d with " "source triangles having some but not all vertices on the boundary", gr->tag() ); @@ -3799,7 +3854,7 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem // Edge creation for extruded quadrangles with some but not all vertices on a boundary. - if( !makeEdgesForOtherBndHexa( gr, is_dbl, cat_src_elems, quadToTri_edges, + if( !makeEdgesForOtherBndHexa( gr, is_addverts, cat_src_elems, quadToTri_edges, lat_tri_diags, forbidden_edges, problems, pos ) ){ Msg::Error("In QuadToTriEdgeGenerator(), failed to make edges for the hexahedral extrusions in region %d with " "source quads having some but not all vertices on the boundary", gr->tag() ); @@ -3810,7 +3865,7 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem // Find diagonals for elements touching a "pivot vertex" of a hexa element that has // a source quad with only one vertex on a lateral boundary (see inside makeEdgesForOtherBndHexa() and // makeEdgesForElemsTouchingPivotVert() for details of "pivot vertex". - if( !makeEdgesForElemsTouchPivotVert( gr, is_dbl, cat_src_elems, quadToTri_edges, + if( !makeEdgesForElemsTouchPivotVert( gr, is_addverts, cat_src_elems, quadToTri_edges, lat_tri_diags, forbidden_edges, pos ) ){ Msg::Error("In QuadToTriEdgeGenerator(), failed to make edges for " "the elements in region %d touching a \'pivot vertex\' of a " @@ -3820,7 +3875,7 @@ int QuadToTriEdgeGenerator(GRegion *gr, CategorizedSourceElements &cat_src_elem // Mesh internal elements in the top layer (just add lateral diagonals for the // Do this by lowest pointer in top surface - if( !makeEdgesInternalTopLayer( gr, is_dbl, cat_src_elems, quadToTri_edges, pos ) ){ + if( !is_toroidal && !makeEdgesInternalTopLayer( gr, is_addverts, cat_src_elems, quadToTri_edges, pos ) ){ Msg::Error("In QuadToTriEdgeGenerator(), failed to make internal edges " "in top extrusion layer of region %d.", gr->tag() ); return 0; @@ -3857,14 +3912,19 @@ static bool QuadToTriLateralRemesh( GRegion *gr, std::set<std::pair<MVertex*,MVe // If shared laterals are all static (quad or non subdivide triangles), // set the allStaticSharedLaterals argument to true. // If any lateral is unstructured, error. - - bool foundTop = false; + + bool is_toroidal = IsInToroidalQuadToTri(reg_source); + GFace *root = findRootSourceFaceForFace(reg_source); + + bool foundTop = false, foundRoot = false; GFace *reg_top = NULL; std::list<GFace *> faces = gr->faces(); std::list<GFace *>::iterator it = faces.begin(); for( it = faces.begin(); it != faces.end(); it++ ){ ExtrudeParams *face_tmp_ep = (*it)->meshAttributes.extrude; + if( (*it) == root ) + foundRoot = true; if( face_tmp_ep && face_tmp_ep->geo.Mode == COPIED_ENTITY ){ GFace *top_source_tmp = model->getFaceByTag( @@ -3882,6 +3942,10 @@ static bool QuadToTriLateralRemesh( GRegion *gr, std::set<std::pair<MVertex*,MVe } } + // if didn't find the copied entity, maybe this is toroidal and the top has been replaced + if( is_toroidal && !foundTop && foundRoot && root != reg_source ) + foundTop = true; + if( !foundTop ) Msg::Warning("In QuadToTriLateralRemesh(), could not find top face " "for region %d.", gr->tag() ); @@ -3891,11 +3955,9 @@ static bool QuadToTriLateralRemesh( GRegion *gr, std::set<std::pair<MVertex*,MVe // now loop through faces again, remeshing all laterals that need it. for( it = faces.begin(); it != faces.end(); it++ ){ if( (*it) != reg_top && (*it) != reg_source && - IsSurfaceALateralForRegion(gr, *it) - && - (*it)->triangles.size() && !(*it)->quadrangles.size() ){ + IsSurfaceALateralForRegion(gr, *it) ){ - // *** JUST REMESH EVERY TRIANGLE SURFACE AGAIN TO BE SURE *** + // *** JUST REMESH EVERY SURFACE AGAIN TO BE SURE *** for(unsigned int i = 0; i < (*it)->triangles.size(); i++) delete (*it)->triangles[i]; @@ -3911,10 +3973,10 @@ static bool QuadToTriLateralRemesh( GRegion *gr, std::set<std::pair<MVertex*,MVe // Adds the face- or body-center vertices needed for some QuadToTri elements -static bool addFaceOrBodyCenteredVertices( GRegion *to, CategorizedSourceElements &c, +static bool addBodyCenteredVertices( GRegion *to, CategorizedSourceElements &c, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, - bool is_dbl, unsigned int lat_tri_diags_size, + bool is_addverts, unsigned int lat_tri_diags_size, std::set<MVertex *, MVertexLessThanLexicographic> &pos ) { @@ -3927,42 +3989,31 @@ static bool addFaceOrBodyCenteredVertices( GRegion *to, CategorizedSourceElement if( !from ) return false; - // need these for double layer extrusion purposes - int j_second_from_top, k_second_from_top; - if( ep->mesh.NbElmLayer[ep->mesh.NbLayer-1] > 1 ){ - j_second_from_top = ep->mesh.NbLayer-1; - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-2; - } - else{ - j_second_from_top = std::max(ep->mesh.NbLayer-2, 0); - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-1; - } - // find number of layers; unsigned int num_layer = 0; for( int p = 0; p < ep->mesh.NbLayer; p++ ) num_layer += ep->mesh.NbElmLayer[p]; - // If !is_dbl, make the body centered internal vertices for all "problem" elements - // If is_dbl, make face-centered verts where needed - // create reserve capacity for the temp vector of new vertices: unsigned int cap_add = 0; - if( !is_dbl ){ + if( !is_addverts ){ std::map<MElement *, std::set< std::pair<unsigned int, unsigned int> > >::iterator itmap; for( itmap = problems.begin(); itmap != problems.end(); itmap++ ) cap_add += itmap->second.size(); - to->mesh_vertices.reserve(to->mesh_vertices.size()+cap_add); } else{ unsigned int NbBndElems = c.four_bnd_pt_quad.size() + c.three_bnd_pt_tri.size() + c.other_bnd_quad.size() + c.other_bnd_tri.size(); unsigned int NbSourceElems = from->triangles.size() + from->quadrangles.size(); - cap_add = NbSourceElems + NbBndElems * ( num_layer-2 > 0 ? num_layer-2 : 0 ); + if( findRootSourceFaceForFace(from) == from ) // if extruded back on the source in a ring + cap_add = NbBndElems * num_layer; + else + cap_add = NbSourceElems + NbBndElems * (num_layer-1); } + to->mesh_vertices.reserve(to->mesh_vertices.size()+cap_add); - // first the !is_dbl case - if( problems.size() && !is_dbl ){ + // first the !is_addverts case + if( problems.size() && !is_addverts ){ std::map<MElement *, std::set< std::pair<unsigned int, unsigned int> > >::iterator itmap; for( itmap = problems.begin(); itmap != problems.end(); itmap++ ){ MElement *elem = itmap->first; @@ -3977,10 +4028,10 @@ static bool addFaceOrBodyCenteredVertices( GRegion *to, CategorizedSourceElement } } - if( !is_dbl ) + if( !is_addverts ) return 1; - // The rest of the function works for is_dbl, double layer quadToTri extrusion + // The rest of the function works for is_addverts //Holds the new vertices...put them in to->mesh_vertices only at the end @@ -4034,7 +4085,7 @@ static bool addFaceOrBodyCenteredVertices( GRegion *to, CategorizedSourceElement else if( edgeExists( verts3D[p+elem_size], verts3D[(p+1)%elem_size], quadToTri_edges ) ) found_diags = true; } - // triangle extrusions don't need face centered verts if NO diags found + // triangle extrusions don't need body centered verts if NO diags found // or if not on lateral boundary if( !t && ( !found_diags || s==2 ) ) continue; @@ -4044,19 +4095,17 @@ static bool addFaceOrBodyCenteredVertices( GRegion *to, CategorizedSourceElement j_start = 0; k_start = 0; } - else{ // only non quads not extruded into degen hexa should execute this - j_start = j_second_from_top; - k_start = k_second_from_top; + else{ // only non-bnd quads or columns with no lateral diags and not extruded into degen hexa should execute this + j_start = ep->mesh.NbLayer-1; + k_start = ep->mesh.NbElmLayer[j_start]-1; } - std::vector<MVertex*> v_face; + std::vector<MVertex*> verts; for( int j = j_start; j < ep->mesh.NbLayer; j++ ){ - int k_start_tmp = (j == j_start) ? k_start : 0; - int k_stop = (j == ep->mesh.NbLayer-1) - ? ep->mesh.NbElmLayer[j]-1 : ep->mesh.NbElmLayer[j]; - for( int k = k_start_tmp; k < k_stop; k++ ){ - v_face.resize(0); - get2DExtrudedVertices( elem, ep, j, k+1, pos, v_face); - QtMakeCentroidVertex(v_face, &v_tmp, to, pos); + int k_stop = ep->mesh.NbElmLayer[j]; + for( int k = k_start; k < k_stop; k++ ){ + verts.resize(0); + getExtrudedVertices(elem, ep, j, k, pos, verts); + QtMakeCentroidVertex(verts, &v_tmp, to, pos); } } } @@ -4101,7 +4150,7 @@ static void MeshWithInternalVertex( GRegion *to, MElement *source, std::vector<M std::vector<double> centroid = QtFindVertsCentroid(v); MVertex tmp(centroid[0], centroid[1], centroid[2], 0, -1); - // it's too dangerous to use the 'new' command in here even with face-centered vertices. + // it's too dangerous to use the 'new' command in here even with body-centered vertices. std::set<MVertex*, MVertexLessThanLexicographic>::iterator itp; itp = pos.find(&tmp); @@ -4168,7 +4217,7 @@ static void MeshWithInternalVertex( GRegion *to, MElement *source, std::vector<M // Can pick top or bottom faces to have the vertex, or both, based on the top_flag and bottom_flag args. // created here in the code // Added 2010-04-05 -static void MeshWithFaceCenteredVertex( GRegion *to, MElement *source, std::vector<MVertex *> v, std::vector<int> n1, +/*static void MeshWithFaceCenteredVertex( GRegion *to, MElement *source, std::vector<MVertex *> v, std::vector<int> n1, std::vector<int> n2, bool bottom_flag, bool top_flag, std::set<MVertex *, MVertexLessThanLexicographic> &pos ) { @@ -4307,6 +4356,8 @@ static void MeshWithFaceCenteredVertex( GRegion *to, MElement *source, std::vect } +*/ + // Construct the elements that subdivide a prism (or degenerated prism) in a QuadToTri interface; // Added 2010-01-24 @@ -4315,7 +4366,7 @@ static inline void QuadToTriPriPyrTet(std::vector<MVertex*> &v, GRegion *to, int std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems_new, - unsigned int lat_tri_diags_size, bool bnd_elem, bool is_dbl, bool diag_search, + unsigned int lat_tri_diags_size, bool bnd_elem, bool is_addverts, bool diag_search, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { int dup[3]; @@ -4324,25 +4375,8 @@ static inline void QuadToTriPriPyrTet(std::vector<MVertex*> &v, GRegion *to, int if(v[i] == v[i + 3]) dup[m++] = i; - - ExtrudeParams *ep = to->meshAttributes.extrude; - - // need these for double layer extrusion purposes - /*unsigned int j_second_from_top = 0, k_second_from_top = 0; - if( ep ){ - if( ep->mesh.NbElmLayer[ep->mesh.NbLayer-1] > 1 ){ - j_second_from_top = ep->mesh.NbLayer-1; - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-2; - } - else{ - j_second_from_top = std::max(ep->mesh.NbLayer-2, 0); - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-1; - } - }*/ - - bool is_problem = false; - if( !is_dbl ){ + if( !is_addverts ){ std::pair<unsigned int, unsigned int> jk_pair (j,k); std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > >::iterator itprob; itprob = problems.find(source); @@ -4385,19 +4419,14 @@ static inline void QuadToTriPriPyrTet(std::vector<MVertex*> &v, GRegion *to, int } } - // mesh double layer - // is this prism part of a QuadToTri Double Layer extrusion and does it need to be extruded as such? - if( is_dbl && bnd_elem && found_diags ){ - if( j==0 && k==0 ) - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 0, 1, pos ); - else if( j >= ep->mesh.NbLayer-1 && k >= ep->mesh.NbElmLayer[ep->mesh.NbLayer-1]-1 ) - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 1, 0, pos ); - else - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 1, 1, pos ); + // mesh with added internal body centered vertex + // is this prism part of a QuadToTri internal vertex extrusion and does it need to be extruded as such? + if( is_addverts && bnd_elem && found_diags ){ + MeshWithInternalVertex( to, source, v, n1, n2, pos ); return; } - // The rest are for single layer extrusions or degenerate prisms: + // The rest are for 'no new vertex' extrusions or degenerate prisms: // tetrahedron @@ -4479,7 +4508,7 @@ static inline bool createTwoPtDegenHexElems( std::vector<MVertex*> &v, GRegion * std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems_new, - unsigned int lat_tri_diags_size, bool bnd_elem, bool is_dbl, bool found_diags, + unsigned int lat_tri_diags_size, bool bnd_elem, bool is_addverts, bool found_diags, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { @@ -4577,7 +4606,7 @@ static inline bool createOnePtDegenHexElems( std::vector<MVertex*> &v, GRegion * std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems_new, - unsigned int lat_tri_diags_size, bool bnd_elem, bool is_dbl, bool found_diags, + unsigned int lat_tri_diags_size, bool bnd_elem, bool is_addverts, bool found_diags, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { @@ -4818,7 +4847,7 @@ static inline bool createFullHexElems( std::vector<MVertex*> &v, GRegion *to, Ex std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems_new, - unsigned int lat_tri_diags_size, bool bnd_elem, bool is_dbl, bool found_diags, + unsigned int lat_tri_diags_size, bool bnd_elem, bool is_addverts, bool found_diags, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { @@ -5216,7 +5245,7 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, std::set<std::pair<MVertex*, MVertex*> > &quadToTri_edges, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > &problems_new, - unsigned int lat_tri_diags_size, bool bnd_elem, bool is_dbl, bool diag_search, + unsigned int lat_tri_diags_size, bool bnd_elem, bool is_addverts, bool diag_search, std::set<MVertex*, MVertexLessThanLexicographic> &pos ) { @@ -5229,7 +5258,7 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, bool is_problem = false; // is element marked as needing internal vertex? - if( !is_dbl ){ + if( !is_addverts ){ std::pair<unsigned int, unsigned int> jk_pair (j,k); std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > >::iterator itprob; itprob = problems.find(source); @@ -5241,20 +5270,7 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, ExtrudeParams *ep = to->meshAttributes.extrude; - // need these for double layer extrusion purposes - int j_second_from_top = 0, k_second_from_top = 0; - if( ep ){ - if( ep->mesh.NbElmLayer[ep->mesh.NbLayer-1] > 1 ){ - j_second_from_top = ep->mesh.NbLayer-1; - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-2; - } - else{ - j_second_from_top = std::max(ep->mesh.NbLayer-2, 0); - k_second_from_top = ep->mesh.NbElmLayer[j_second_from_top]-1; - } - } - - + // variables to hold of each faces's diagonal vertex nodes bool found_diags = false; std::vector<int> n1, n2; @@ -5297,33 +5313,26 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, } - // Divide by double layer extrusion method? - if( is_dbl && ( found_diags || j > j_second_from_top || - (j==j_second_from_top && k >= k_second_from_top) || m==1 ) ){ - if( (j==0 && k==0) || - (j==j_second_from_top && k==k_second_from_top && ( !bnd_elem || !found_diags ) && m != 1) ) - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 0, 1, pos ); - else if( j == ep->mesh.NbLayer-1 && k == ep->mesh.NbElmLayer[j]-1 ) - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 1, 0, pos ); - else - MeshWithFaceCenteredVertex( to, source, v, n1, n2, 1, 1, pos ); + // Divide by new internal vertex extrusion method? + if( is_addverts && ( found_diags || m==1 ) ){ + MeshWithInternalVertex( to, source, v, n1, n2, pos ); return; } - // The of the possibilites are for a single layer extrusion + // The of the possibilites are for a 'no new vertex' extrusion // PRISM else if( m == 2 && !is_problem ){ if( createTwoPtDegenHexElems( v, to, ep, j, k, dup, source, n1, n2, quadToTri_edges, problems, - problems_new, lat_tri_diags_size, bnd_elem, is_dbl, found_diags, pos ) ) + problems_new, lat_tri_diags_size, bnd_elem, is_addverts, found_diags, pos ) ) return; } // DEGENERATE HEXAHEDRON else if( m == 1 && !is_problem ){ if( createOnePtDegenHexElems( v, to, ep, j, k, dup, source, n1, n2, quadToTri_edges, problems, - problems_new, lat_tri_diags_size, bnd_elem, is_dbl, found_diags, pos ) ) + problems_new, lat_tri_diags_size, bnd_elem, is_addverts, found_diags, pos ) ) return; } @@ -5331,7 +5340,7 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, // FULL HEXAHEDRON else if( !is_problem ){ if( createFullHexElems( v, to, ep, j, k, dup, source, n1, n2, quadToTri_edges, problems, - problems_new, lat_tri_diags_size, bnd_elem, is_dbl, found_diags, pos ) ) + problems_new, lat_tri_diags_size, bnd_elem, is_addverts, found_diags, pos ) ) return; } @@ -5359,7 +5368,7 @@ static inline void QuadToTriHexPri(std::vector<MVertex*> &v, GRegion *to, int j, // in the element vectors in the region 'to' // *** STILL EXPERIMENTAL -- It *kind* of works to limit memory footprint of vectors. /* -static void reserveQuadToTriCapacityForRegion( GRegion *to, GFace *from, bool is_dbl, unsigned int num_layers, +static void reserveQuadToTriCapacityForRegion( GRegion *to, GFace *from, bool is_addverts, unsigned int num_layers, unsigned int lat_tri_diags_size, CategorizedSourceElements *c, std::map<MElement*, std::set<std::pair<unsigned int, unsigned int> > > *problems ) @@ -5386,7 +5395,7 @@ static void reserveQuadToTriCapacityForRegion( GRegion *to, GFace *from, bool i // in case !ep->Recombine is ever allowed... if( !ep->mesh.Recombine ) to->tetrahedra.reserve( num_layers*(3*num_tri + 6*num_quad + 8*num_prob_tri + 12*num_prob_quad) ); - else if( !is_dbl ){ + else if( !is_addverts ){ //to->tetrahedra.reserve( (6*num_quad + 3*num_tri +2*lat_tri_diags_size + 8*num_prob_tri + 12*num_prob_quad) ); to->prisms.reserve( num_tri*num_layers ); to->hexahedra.reserve( num_quad*(num_layers-1) ); @@ -5403,7 +5412,7 @@ static void reserveQuadToTriCapacityForRegion( GRegion *to, GFace *from, bool i */ // displays for the user a list of the body centered vertices created for problem elements. -static void listBodyCenteredVertices( GRegion *to, bool is_dbl, +static void listBodyCenteredVertices( GRegion *to, bool is_addverts, std::map<MElement *, std::set<std::pair<unsigned int,unsigned int> > > *problems, std::map<MElement *, std::set<std::pair<unsigned int,unsigned int> > > *problems_new, std::set<MVertex*, MVertexLessThanLexicographic> *pos ) @@ -5425,7 +5434,7 @@ static void listBodyCenteredVertices( GRegion *to, bool is_dbl, for( itmap = problems_new->begin(); itmap!= problems_new->end(); itmap++ ) (*problems)[itmap->first].insert( itmap->second.begin(), itmap->second.end() ); - if( is_dbl ){ + if( is_addverts ){ it_begin = problems_new->begin(); it_end = problems_new->end(); } @@ -5442,14 +5451,14 @@ static void listBodyCenteredVertices( GRegion *to, bool is_dbl, if( int_verts_count ){ if( int_verts_count == 1 ) - Msg::Error("QuadToTri meshed %d element in region %d " + Msg::Warning("QuadToTri meshed %d element in region %d " "with a body-centered internal vertex.", int_verts_count, to->tag() ); else - Msg::Error("QuadToTri meshed %d elements in region %d " + Msg::Warning("QuadToTri meshed %d elements in region %d " "with body-centered internal vertices.", int_verts_count, to->tag() ); - Msg::Error("( Mesh *should* still conformal, but the user should be aware of these internal vertices. )" ); + Msg::Warning("( Mesh *should* still conformal, but the user should be aware of these internal vertices. )" ); unsigned int int_verts_count2 = 0; @@ -5463,7 +5472,7 @@ static void listBodyCenteredVertices( GRegion *to, bool is_dbl, // find centroid std::vector<double> centroid = QtFindVertsCentroid(verts); int_verts_count2++; - Msg::Error("Internal Vertex %d at (x,y,z) = (%g, %g, %g).", int_verts_count2, + Msg::Warning("Internal Vertex %d at (x,y,z) = (%g, %g, %g).", int_verts_count2, centroid[0], centroid[1], centroid[2] ); } } @@ -5501,14 +5510,14 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el for( int j = 0; j < ep->mesh.NbLayer; j++ ) num_layers += ep->mesh.NbElmLayer[j]; - // Is this a valid double layer extrusion? - bool is_dbl = false; - if( num_layers >= 2 && ( ep->mesh.QuadToTri == QUADTRI_DBL_1 || ep->mesh.QuadToTri == QUADTRI_DBL_1_RECOMB ) ) - is_dbl = true; + // Is this a valid 'add internal vertex' extrusion? + bool is_addverts = false; + if( ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1 || ep->mesh.QuadToTri == QUADTRI_ADDVERTS_1_RECOMB ) + is_addverts = true; // Find where top divided layer starts /*int j_top_start = 0, k_top_start = 0; - if( is_dbl ){ // second from top + if( is_addverts ){ // second from top if( ep->mesh.NbElmLayer[ep->mesh.NbLayer-1] > 1 ){ j_top_start = ep->mesh.NbLayer-1; k_top_start = ep->mesh.NbElmLayer[j_top_start]-2; @@ -5541,7 +5550,7 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el // Make the extra vertices needed for Some QuadToTri elements - if( !addFaceOrBodyCenteredVertices( to, cat_src_elems, quadToTri_edges, problems, is_dbl, + if( !addBodyCenteredVertices( to, cat_src_elems, quadToTri_edges, problems, is_addverts, lat_tri_diags_size, pos ) ){ Msg::Error("QuadToTriCreateElements() could not add face or body vertices for QuadToTri region %d.", to->tag() ); return false; @@ -5549,7 +5558,7 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el // reserve enough capacity for all possible elements, try to find combination of simplicity and memory efficiency. // *** EXPERIMENTAL *** - //reserveQuadToTriCapacityForRegion( to, from, is_dbl, num_layers, lat_tri_diags_size, &cat_src_elems, &problems ); + //reserveQuadToTriCapacityForRegion( to, from, is_addverts, num_layers, lat_tri_diags_size, &cat_src_elems, &problems ); // create elements: @@ -5584,7 +5593,7 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el if( getExtrudedVertices(elem, ep, j, k, pos, verts) == 6 ){ QuadToTriPriPyrTet( verts, to, j, k, elem, quadToTri_edges, problems, problems_new, lat_tri_diags_size, - bnd_elem, is_dbl, 1, pos ); + bnd_elem, is_addverts, 1, pos ); } } } @@ -5631,7 +5640,7 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el if(getExtrudedVertices(elem, ep, j, k, pos, verts) == 8 ){ QuadToTriHexPri(verts, to, j, k, elem, quadToTri_edges, problems, problems_new, lat_tri_diags_size, - bnd_elem, is_dbl, 1, pos); + bnd_elem, is_addverts, 1, pos); } } } @@ -5646,7 +5655,7 @@ bool QuadToTriCreateElements(GRegion *to, CategorizedSourceElements &cat_src_el } // List for the user any elements with internal vertices: - listBodyCenteredVertices( to, is_dbl, &problems, &problems_new, &pos ); + listBodyCenteredVertices( to, is_addverts, &problems, &problems_new, &pos ); // Now revert any elements that have positive volume. @@ -5728,6 +5737,7 @@ int meshQuadToTriRegion( GRegion *gr, std::set<MVertex*, MVertexLessThanLexicogr std::set<std::pair<MVertex*, MVertex*> > lat_tri_diags; std::map<MElement*, std::set<std::pair<unsigned int,unsigned int> > > problems; + // first thing is first // data structure for boundary status-categorized source elements, // (member data containers defined in .h file) CategorizedSourceElements cat_src_elems( gr ); diff --git a/Mesh/QuadTriUtils.cpp b/Mesh/QuadTriUtils.cpp index 91b9f72db1..2154a6a2e1 100644 --- a/Mesh/QuadTriUtils.cpp +++ b/Mesh/QuadTriUtils.cpp @@ -31,7 +31,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ****************************************************************************************************/ - +#include <stdlib.h> #include "QuadTriUtils.h" @@ -59,6 +59,218 @@ ExtrusionElementMap::addExtrudedElemVector(MElement* source, std::vector<MElemen }*/ + +// By Geuzaine, Remacle... +static void addTriangle(MVertex* v1, MVertex* v2, MVertex* v3, + GFace *to) +{ + MTriangle* newTri = new MTriangle(v1, v2, v3); + to->triangles.push_back(newTri); +} + +// this determines if a face is a non-lateral face in a structured toroidal volume extrusion with at +// least one QuadToTri region... +int IsInToroidalQuadToTri(GFace *face) +{ + if( !face ) + return false; + + GModel *model = face->model(); + + bool is_toroidal = false, is_quadtri = false, is_noaddverts = false; + + // Find the root face first...then step back through extrusions as far as can find + // another structured region. If there is a single quadtri region, and this is a torus that + // extrudes back onto the root source surface, then return true. + GFace *root_face = 0; + root_face = findRootSourceFaceForFace(face); + unsigned int numRegions = 0; + std::vector<GRegion*> adj_extruded_reg; + + //find the two regions adjacent to the root face. If this is a structured torus, then both regions + // should be structured extrusions and BOTH should have the same root face + std::set<GRegion *, GEntityLessThan>::iterator itreg; + for( itreg = model->firstRegion(); itreg != model->lastRegion(); itreg++ ){ + // save time + if( numRegions >= 2 ) + break; + + GRegion *region = (*itreg); + + // is region in the current model's regions or is it deleted? + if( !FindVolume( ( region->tag() ) ) ) + continue; + + // does face belong to region and if so is it a structured extrusion? + std::list<GFace *> region_faces = std::list<GFace *>( region->faces() ); + if( std::find( region_faces.begin(), region_faces.end(), root_face ) != + region_faces.end() && region->meshAttributes.extrude && + region->meshAttributes.extrude->mesh.ExtrudeMesh && + region->meshAttributes.extrude->geo.Mode == EXTRUDED_ENTITY ){ + + adj_extruded_reg.push_back(region); + numRegions++; + } + else + continue; + } + // if there are two structured extruded regions adjacent to the root face, + // then find the one that is NOT extruded from the root directly. Then follow this + // face as far as possible back to the source. + + GRegion *last_region = 0; + GFace *last_reg_source = 0; + bool found_first = 0, found_last = 0; + if( numRegions == 2 ){ + for( int ind = 0; ind <= 1; ind++ ){ + ExtrudeParams *adj_ep = adj_extruded_reg[ind]->meshAttributes.extrude; + GFace *reg_source = 0; + + if( adj_ep && adj_ep->mesh.ExtrudeMesh ){ + reg_source = model->getFaceByTag(std::abs( adj_ep->geo.Source ) ); + if( adj_ep->mesh.QuadToTri ){ + is_quadtri = true; + if( adj_ep->mesh.QuadToTri == QUADTRI_NOVERTS_1 || + adj_ep->mesh.QuadToTri == QUADTRI_NOVERTS_1_RECOMB ) + is_noaddverts = true; + } + } + if( reg_source ){ + if( reg_source != root_face ){ + last_region = adj_extruded_reg[ind]; + last_reg_source = reg_source; + found_last = true; + } + else{ + found_first = true; + } + } + else{ + Msg::Error("In IsInToroidalQuadToTri(), could not find source face of region %d", + adj_extruded_reg[ind]->tag() ); + return 0; + } + } + } + + //walk back around to beginning if possible + if( last_region && found_first && found_last ){ + GFace *iter_face = last_reg_source; + GFace *iter_source_face = 0; + bool done = false; + unsigned int maxiter = model->getNumFaces() + 2; + unsigned int counter = 0; + while( !done && counter <= maxiter ){ + counter++; + if( iter_face ){ + ExtrudeParams *iter_eps = iter_face->meshAttributes.extrude; + if( iter_eps && iter_eps->mesh.ExtrudeMesh && + iter_eps->geo.Mode == COPIED_ENTITY ){ + if( iter_eps->mesh.QuadToTri ) + is_quadtri = true; + iter_source_face = model->getFaceByTag(std::abs( iter_eps->geo.Source )); + if( iter_source_face ){ + if( iter_source_face == root_face ){ + is_toroidal = true; + done = true; + } + else + iter_face = iter_source_face; + } + else{ + Msg::Error("In IsInToroidalQuadToTri(), could not find source face of face %d", + iter_face->tag() ); + return 0; + } + } + else // if we found a source face not extruded as part of structured source (ie, not copied) + return 0; + } + else{ + Msg::Error("In IsInToroidalQuadToTri(), could not find a face..."); + return 0; + } + } + } + + // now return + if( is_toroidal && is_quadtri ){ + if( !is_noaddverts ) + return 1; + else + return 2; + } + else + return 0; +} + +// replace boundary quads in a source surface for toroidal quadtri extrusion +void ReplaceBndQuadsInFace(GFace *face) +{ + ExtrudeParams *ep = face->meshAttributes.extrude; + bool is_struct = false; + if( (ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY) || + face->meshAttributes.method == MESH_TRANSFINITE ) + is_struct = true; + GFace *root_face = findRootSourceFaceForFace( face ); + if( root_face == face ){ + std::set<MVertex*, MVertexLessThanLexicographic> pos_src_edge; + QuadToTriInsertFaceEdgeVertices(face, pos_src_edge); + std::vector<MQuadrangle*> quads2; + //loop through source quads, if on boundary, delete them + for(unsigned int i = 0; i < face->quadrangles.size(); i++){ + std::vector<MVertex*> verts; + int num_verts = face->quadrangles[i]->getNumVertices(); + bool on_edge = false; + + for( int j = 0; j < num_verts; j++ ) + verts.push_back(face->quadrangles[i]->getVertex(j)); + + for( int j = 0; j < num_verts; j++ ){ + if( pos_src_edge.find( verts[j] ) != pos_src_edge.end() ){ + on_edge = true; + break; + } + } + if( on_edge ){ + delete face->quadrangles[i]; + if( is_struct ){ + addTriangle( verts[0],verts[2], verts[3],face); + addTriangle( verts[0],verts[1], verts[2],face); + } + else{ + // draw other diagonals to minimize difference in average edge length with diagonal length, in quadrature + + double mag_sq_ave = 0.0; + for( int p = 0; p < 4; p++ ){ + int d_leg = verts[p]->distance(verts[(p+1)%4]); + mag_sq_ave += d_leg*d_leg; + } + mag_sq_ave /= 4.0; + + double d1 = verts[0]->distance(verts[2]); + double d2 = verts[1]->distance(verts[3]); + + if(fabs(d1*d1-mag_sq_ave) <= fabs(d2*d2-mag_sq_ave) ){ + addTriangle(verts[0],verts[1],verts[2],face); + addTriangle(verts[0],verts[2],verts[3],face); + } + else{ + addTriangle(verts[1],verts[2],verts[3],face); + addTriangle(verts[1],verts[3],verts[0],face); + } + } + } + else + quads2.push_back(face->quadrangles[i]); + } + face->quadrangles.clear(); + face->quadrangles = quads2; + } + +} + + // Insert all vertices on a region's source edge, including corners, // into pos_src_edge set. // Added 2010-01-09 @@ -405,7 +617,8 @@ std::pair<int, int> FindDiagonalEdgeIndices( std::vector<MVertex*> verts, for( int s = 0; s < s_max; s++ ){ if( s != 0 && !wrong_guess ){ wrong_guess = true; - Msg::Error("FindDiagonalEdgeIndices() encountered unexpected surface configuration."); + if( !face->quadrangles.size() ) + Msg::Error("FindDiagonalEdgeIndices() encountered unexpected surface configuration."); } int v_count0 = 0, v_count1 = 0; elem_tmp = (MElement*)(face->triangles[(s+index_guess)%s_max]); @@ -432,7 +645,8 @@ std::pair<int, int> FindDiagonalEdgeIndices( std::vector<MVertex*> verts, } } - Msg::Error("In FindDiagonalEdge(), could not " + if( !face->quadrangles.size() ) + Msg::Error("In FindDiagonalEdgeIndices(), could not " "find a diagonal on surface %d.", face->tag() ); return std::pair<int,int>(0,0); @@ -463,7 +677,6 @@ int GetNeighborRegionsOfFace(GFace *face, std::vector<GRegion *> &neighbors) regions_count = 0; // pedantic search - std::vector<GRegion *> all_regions; std::set<GRegion *, GEntityLessThan>::iterator itreg; for( itreg = model->firstRegion(); itreg != model->lastRegion(); itreg++ ){ std::list<GFace *> reg_faces = (*itreg)->faces(); @@ -593,7 +806,6 @@ int IsSurfaceALateralForRegion(GRegion *region, GFace *face) return 1; // if code executes here, passed all tests } - // Function to determine if a face is a top surface for a region. It returns 1 // if the face is COPIED_ENTITY with source = region's source and if face belongs to region. // Otherwise, return 0 (NOTE: ReplaceDuplicateSurfaces() can remove a top surface diff --git a/Mesh/QuadTriUtils.h b/Mesh/QuadTriUtils.h index b7a139ad36..19645f9d63 100644 --- a/Mesh/QuadTriUtils.h +++ b/Mesh/QuadTriUtils.h @@ -35,6 +35,7 @@ GNU General Public License for more details. #if !defined(_QUADTRIUTILS_H_) #define _QUADTRIUTILS_H_ +#include <stdlib.h> #include "ExtrudeParams.h" #include "Geo.h" #include "GEntity.h" @@ -106,6 +107,13 @@ struct CategorizedSourceElements{ CategorizedSourceElements( GRegion *gr ); }; +// this determines if a face is a non-lateral face in a structured toroidal volume extrusion with at +// least one QuadToTri region... +int IsInToroidalQuadToTri(GFace *face); + +// replace boundary quads in a source surface for toroidal quadtri extrusion +void ReplaceBndQuadsInFace(GFace *face); + // This is a member function for the element map in ExtrudeParams. // This allows insertion of a whole vector at once. diff --git a/Mesh/meshGFaceExtruded.cpp b/Mesh/meshGFaceExtruded.cpp index b76f14543c..b065a0aa81 100644 --- a/Mesh/meshGFaceExtruded.cpp +++ b/Mesh/meshGFaceExtruded.cpp @@ -39,7 +39,23 @@ static void createQuaTri(std::vector<MVertex*> &v, GFace *to, else{ // Trevor Strickler added the tri_quad_flag stuff here. if((ep->mesh.Recombine && tri_quad_flag != 2) || tri_quad_flag == 1){ - addQuadrangle(v[0], v[1], v[3], v[2], to); + if(!constrainedEdges) + addQuadrangle(v[0], v[1], v[3], v[2], to); + else{ + std::pair<MVertex*, MVertex*> p1(std::min(v[1], v[2]), std::max(v[1], v[2])); + std::pair<MVertex*, MVertex*> p2(std::min(v[0], v[3]), std::max(v[0], v[3])); + if(constrainedEdges->count(p1)){ + addTriangle(v[2], v[1], v[0], to); + addTriangle(v[2], v[3], v[1], to); + } + else if(constrainedEdges->count(p2)){ + addTriangle(v[2], v[3], v[0], to); + addTriangle(v[0], v[3], v[1], to); + } + else + addQuadrangle(v[0], v[1], v[3], v[2], to); + } + } else if(!constrainedEdges){ addTriangle(v[0], v[1], v[3], to); @@ -88,6 +104,7 @@ static void extrudeMesh(GEdge *from, GFace *to, } } + // Trevor Strickler // figure out whether to recombine this surface or not in the event // of quadToTri region neighbors (if QuadToTri, tri_quad_flag is an // int flag that lets createQuadTri() override the surface's @@ -153,7 +170,33 @@ static void copyMesh(GFace *from, GFace *to, pos.insert(newv); } - // create elements + // if performing QuadToTri mesh, cannot simply copy the mesh from + // the source. The vertices and triangles can be copied directly + // though. First, of course, do some checks and make sure this is a + // valid QuadToTri top surface before engaging in QuadToTri meshing. + int quadToTri= NO_QUADTRI; + bool detectQuadToTriTop = false; + int quadToTri_valid = IsValidQuadToTriTop(to, &quadToTri, &detectQuadToTriTop); + bool is_toroidal = quadToTri_valid >= 2 ? true : false; + bool is_noaddverts = quadToTri_valid == 3 ? true : false; + if( detectQuadToTriTop && !quadToTri_valid && !is_toroidal ){ + Msg::Error("In MeshGFaceExtrudedSurface::copyMesh(), Mesh of QuadToTri top " + "surface %d likely has errors.", to->tag()); + } + + // if this is toroidal No New Vertices QuadToTri, then replace the root dependency face's boundary + // quads with triangles for better meshing. + if( is_toroidal && is_noaddverts ){ + GFace *root = findRootSourceFaceForFace( from ); + if( root == from ){ + ReplaceBndQuadsInFace( root ); + Msg::Warning("To facilitate QuadToTri interface on surface %d, source surface %d was re-meshed " + "with all triangles on boundary. To avoid this, use QuadTriAddVerts instead of " + "QuadTriNoNewVerts.", to->tag(), root->tag()); + } + } + + // create triangle elements std::set<MVertex*, MVertexLessThanLexicographic>::iterator itp; for(unsigned int i = 0; i < from->triangles.size(); i++){ std::vector<MVertex*> verts; @@ -177,23 +220,17 @@ static void copyMesh(GFace *from, GFace *to, addTriangle(verts[0], verts[1], verts[2], to); } - // if performing QuadToTri mesh, cannot simply copy the mesh from - // the source. The vertices and triangles can be copied directly - // though. First, of course, do some checks and make sure this is a - // valid QuadToTri top surface before engaging in QuadToTri meshing. - int quadToTri= NO_QUADTRI; - bool detectQuadToTriTop = false; - bool quadToTri_valid = IsValidQuadToTriTop(to, &quadToTri, &detectQuadToTriTop); - if(detectQuadToTriTop){ - if(!quadToTri_valid) - Msg::Error("In MeshGFaceExtrudedSurface::copyMesh(), Mesh of QuadToTri top " - "surface %d likely has errors.", to->tag()); - if(!MeshQuadToTriTopSurface(from, to, pos)) + // Add triangles for divided quads for QuadTri -- Trevor Strickler + // if quadtotri and not part of a toroidal extrusion, mesh the top surface accordingly + if( detectQuadToTriTop && !is_toroidal ){ + if( !MeshQuadToTriTopSurface(from, to, pos)) Msg::Error("In MeshExtrudedSurface()::copyMesh(), mesh of QuadToTri top " - "surface %d failed.", to->tag() ); + "surface %d failed.", to->tag() ); return; - } + } + + // create quadrangle elements if NOT QuadToTri and NOT toroidal for(unsigned int i = 0; i < from->quadrangles.size(); i++){ std::vector<MVertex*> verts; for(int j = 0; j < 4; j++){ diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l index d952de3f3f..5d3b1e72b4 100644 --- a/Parser/Gmsh.l +++ b/Parser/Gmsh.l @@ -187,6 +187,9 @@ PolarSphere return tPolarSphere; Printf return tPrintf; Plugin return tPlugin; +Quad[tT]ri[aA]dd[vV]erts return tQuadTriAddVerts; +Quad[tT]ri[nN]o[nN]ew[vV]erts return tQuadTriNoNewVerts; + Quad[tT]ri[dD]bl return tQuadTriDbl; Quad[tT]ri[sS]ngl return tQuadTriSngl; @@ -200,6 +203,7 @@ RefineMesh return tRefineMesh; Return return tReturn; Reverse return tReverse; +ScaleLastLayer return tScaleLast; Smoother return tSmoother; SetOrder return tSetOrder; Sqrt return tSqrt; diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp index a3f5813eaf..83eafabd28 100644 --- a/Parser/Gmsh.tab.cpp +++ b/Parser/Gmsh.tab.cpp @@ -170,61 +170,64 @@ tMeshAlgorithm = 351, tReverse = 352, tLayers = 353, - tHole = 354, - tAlias = 355, - tAliasWithOptions = 356, - tQuadTriDbl = 357, - tQuadTriSngl = 358, - tRecombLaterals = 359, - tTransfQuadTri = 360, - tText2D = 361, - tText3D = 362, - tInterpolationScheme = 363, - tTime = 364, - tCombine = 365, - tBSpline = 366, - tBezier = 367, - tNurbs = 368, - tNurbsOrder = 369, - tNurbsKnots = 370, - tColor = 371, - tColorTable = 372, - tFor = 373, - tIn = 374, - tEndFor = 375, - tIf = 376, - tEndIf = 377, - tExit = 378, - tAbort = 379, - tField = 380, - tReturn = 381, - tCall = 382, - tFunction = 383, - tShow = 384, - tHide = 385, - tGetValue = 386, - tGetEnv = 387, - tGetString = 388, - tHomology = 389, - tCohomology = 390, - tBetti = 391, - tSetOrder = 392, - tGMSH_MAJOR_VERSION = 393, - tGMSH_MINOR_VERSION = 394, - tGMSH_PATCH_VERSION = 395, - tAFFECTDIVIDE = 396, - tAFFECTTIMES = 397, - tAFFECTMINUS = 398, - tAFFECTPLUS = 399, - tOR = 400, - tAND = 401, - tNOTEQUAL = 402, - tEQUAL = 403, - tGREATEROREQUAL = 404, - tLESSOREQUAL = 405, - UNARYPREC = 406, - tMINUSMINUS = 407, - tPLUSPLUS = 408 + tScaleLast = 354, + tHole = 355, + tAlias = 356, + tAliasWithOptions = 357, + tQuadTriAddVerts = 358, + tQuadTriNoNewVerts = 359, + tQuadTriSngl = 360, + tQuadTriDbl = 361, + tRecombLaterals = 362, + tTransfQuadTri = 363, + tText2D = 364, + tText3D = 365, + tInterpolationScheme = 366, + tTime = 367, + tCombine = 368, + tBSpline = 369, + tBezier = 370, + tNurbs = 371, + tNurbsOrder = 372, + tNurbsKnots = 373, + tColor = 374, + tColorTable = 375, + tFor = 376, + tIn = 377, + tEndFor = 378, + tIf = 379, + tEndIf = 380, + tExit = 381, + tAbort = 382, + tField = 383, + tReturn = 384, + tCall = 385, + tFunction = 386, + tShow = 387, + tHide = 388, + tGetValue = 389, + tGetEnv = 390, + tGetString = 391, + tHomology = 392, + tCohomology = 393, + tBetti = 394, + tSetOrder = 395, + tGMSH_MAJOR_VERSION = 396, + tGMSH_MINOR_VERSION = 397, + tGMSH_PATCH_VERSION = 398, + tAFFECTDIVIDE = 399, + tAFFECTTIMES = 400, + tAFFECTMINUS = 401, + tAFFECTPLUS = 402, + tOR = 403, + tAND = 404, + tNOTEQUAL = 405, + tEQUAL = 406, + tGREATEROREQUAL = 407, + tLESSOREQUAL = 408, + UNARYPREC = 409, + tMINUSMINUS = 410, + tPLUSPLUS = 411 }; #endif /* Tokens. */ @@ -324,61 +327,64 @@ #define tMeshAlgorithm 351 #define tReverse 352 #define tLayers 353 -#define tHole 354 -#define tAlias 355 -#define tAliasWithOptions 356 -#define tQuadTriDbl 357 -#define tQuadTriSngl 358 -#define tRecombLaterals 359 -#define tTransfQuadTri 360 -#define tText2D 361 -#define tText3D 362 -#define tInterpolationScheme 363 -#define tTime 364 -#define tCombine 365 -#define tBSpline 366 -#define tBezier 367 -#define tNurbs 368 -#define tNurbsOrder 369 -#define tNurbsKnots 370 -#define tColor 371 -#define tColorTable 372 -#define tFor 373 -#define tIn 374 -#define tEndFor 375 -#define tIf 376 -#define tEndIf 377 -#define tExit 378 -#define tAbort 379 -#define tField 380 -#define tReturn 381 -#define tCall 382 -#define tFunction 383 -#define tShow 384 -#define tHide 385 -#define tGetValue 386 -#define tGetEnv 387 -#define tGetString 388 -#define tHomology 389 -#define tCohomology 390 -#define tBetti 391 -#define tSetOrder 392 -#define tGMSH_MAJOR_VERSION 393 -#define tGMSH_MINOR_VERSION 394 -#define tGMSH_PATCH_VERSION 395 -#define tAFFECTDIVIDE 396 -#define tAFFECTTIMES 397 -#define tAFFECTMINUS 398 -#define tAFFECTPLUS 399 -#define tOR 400 -#define tAND 401 -#define tNOTEQUAL 402 -#define tEQUAL 403 -#define tGREATEROREQUAL 404 -#define tLESSOREQUAL 405 -#define UNARYPREC 406 -#define tMINUSMINUS 407 -#define tPLUSPLUS 408 +#define tScaleLast 354 +#define tHole 355 +#define tAlias 356 +#define tAliasWithOptions 357 +#define tQuadTriAddVerts 358 +#define tQuadTriNoNewVerts 359 +#define tQuadTriSngl 360 +#define tQuadTriDbl 361 +#define tRecombLaterals 362 +#define tTransfQuadTri 363 +#define tText2D 364 +#define tText3D 365 +#define tInterpolationScheme 366 +#define tTime 367 +#define tCombine 368 +#define tBSpline 369 +#define tBezier 370 +#define tNurbs 371 +#define tNurbsOrder 372 +#define tNurbsKnots 373 +#define tColor 374 +#define tColorTable 375 +#define tFor 376 +#define tIn 377 +#define tEndFor 378 +#define tIf 379 +#define tEndIf 380 +#define tExit 381 +#define tAbort 382 +#define tField 383 +#define tReturn 384 +#define tCall 385 +#define tFunction 386 +#define tShow 387 +#define tHide 388 +#define tGetValue 389 +#define tGetEnv 390 +#define tGetString 391 +#define tHomology 392 +#define tCohomology 393 +#define tBetti 394 +#define tSetOrder 395 +#define tGMSH_MAJOR_VERSION 396 +#define tGMSH_MINOR_VERSION 397 +#define tGMSH_PATCH_VERSION 398 +#define tAFFECTDIVIDE 399 +#define tAFFECTTIMES 400 +#define tAFFECTMINUS 401 +#define tAFFECTPLUS 402 +#define tOR 403 +#define tAND 404 +#define tNOTEQUAL 405 +#define tEQUAL 406 +#define tGREATEROREQUAL 407 +#define tLESSOREQUAL 408 +#define UNARYPREC 409 +#define tMINUSMINUS 410 +#define tPLUSPLUS 411 @@ -508,7 +514,7 @@ typedef union YYSTYPE List_T *l; } /* Line 193 of yacc.c. */ -#line 512 "Gmsh.tab.cpp" +#line 518 "Gmsh.tab.cpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -521,7 +527,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 525 "Gmsh.tab.cpp" +#line 531 "Gmsh.tab.cpp" #ifdef short # undef short @@ -736,20 +742,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 5 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 8505 +#define YYLAST 8716 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 174 +#define YYNTOKENS 177 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 91 /* YYNRULES -- Number of rules. */ -#define YYNRULES 462 +#define YYNRULES 467 /* YYNRULES -- Number of states. */ -#define YYNSTATES 1612 +#define YYNSTATES 1622 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 408 +#define YYMAXUTOK 411 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -760,16 +766,16 @@ static const yytype_uint8 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, 159, 2, 169, 2, 158, 2, 2, - 164, 165, 156, 154, 170, 155, 168, 157, 2, 2, + 2, 2, 2, 162, 2, 172, 2, 161, 2, 2, + 167, 168, 159, 157, 173, 158, 171, 160, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 150, 2, 151, 145, 2, 2, 2, 2, 2, 2, + 153, 2, 154, 148, 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, 166, 2, 167, 163, 2, 2, 2, 2, 2, + 2, 169, 2, 170, 166, 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, 171, 2, 172, 173, 2, 2, 2, + 2, 2, 2, 174, 2, 175, 176, 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, @@ -797,7 +803,8 @@ static const yytype_uint8 yytranslate[] = 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, - 146, 147, 148, 149, 152, 153, 160, 161, 162 + 145, 146, 147, 149, 150, 151, 152, 155, 156, 163, + 164, 165 }; #if YYDEBUG @@ -831,295 +838,296 @@ static const yytype_uint16 yyprhs[] = 1351, 1352, 1359, 1368, 1377, 1386, 1399, 1412, 1425, 1440, 1455, 1470, 1471, 1484, 1485, 1498, 1499, 1512, 1513, 1530, 1531, 1548, 1549, 1566, 1567, 1586, 1587, 1606, 1607, 1626, - 1628, 1631, 1637, 1645, 1655, 1658, 1661, 1665, 1668, 1672, - 1682, 1689, 1690, 1694, 1695, 1697, 1698, 1701, 1702, 1705, - 1713, 1720, 1729, 1735, 1739, 1747, 1753, 1758, 1765, 1772, - 1785, 1796, 1807, 1818, 1829, 1840, 1845, 1850, 1853, 1857, - 1864, 1866, 1868, 1870, 1873, 1879, 1887, 1898, 1900, 1904, - 1907, 1910, 1913, 1917, 1921, 1925, 1929, 1933, 1937, 1941, - 1945, 1949, 1953, 1957, 1961, 1965, 1969, 1975, 1980, 1985, - 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2032, 2037, - 2042, 2047, 2052, 2057, 2062, 2069, 2076, 2083, 2088, 2093, - 2098, 2103, 2108, 2113, 2118, 2123, 2128, 2133, 2138, 2145, - 2150, 2155, 2160, 2165, 2170, 2175, 2182, 2189, 2196, 2201, - 2203, 2205, 2207, 2209, 2211, 2213, 2215, 2217, 2219, 2221, - 2227, 2232, 2237, 2240, 2246, 2250, 2257, 2262, 2270, 2277, - 2284, 2291, 2296, 2298, 2301, 2304, 2308, 2312, 2324, 2334, - 2342, 2350, 2352, 2356, 2358, 2360, 2363, 2367, 2372, 2378, - 2380, 2382, 2385, 2389, 2393, 2399, 2404, 2407, 2410, 2413, - 2416, 2422, 2428, 2434, 2440, 2442, 2444, 2448, 2452, 2457, - 2464, 2471, 2473, 2475, 2479, 2483, 2493, 2501, 2503, 2509, - 2513, 2520, 2522, 2526, 2528, 2530, 2534, 2541, 2543, 2545, - 2550, 2557, 2564, 2569, 2574, 2583, 2588, 2593, 2598, 2603, - 2610, 2617, 2619 + 1628, 1631, 1637, 1645, 1655, 1658, 1661, 1664, 1668, 1671, + 1675, 1678, 1682, 1685, 1689, 1699, 1706, 1707, 1711, 1712, + 1714, 1715, 1718, 1719, 1722, 1730, 1737, 1746, 1752, 1756, + 1764, 1770, 1775, 1782, 1789, 1802, 1813, 1824, 1835, 1846, + 1857, 1862, 1867, 1870, 1874, 1881, 1883, 1885, 1887, 1890, + 1896, 1904, 1915, 1917, 1921, 1924, 1927, 1930, 1934, 1938, + 1942, 1946, 1950, 1954, 1958, 1962, 1966, 1970, 1974, 1978, + 1982, 1986, 1992, 1997, 2002, 2007, 2012, 2017, 2022, 2027, + 2032, 2037, 2042, 2049, 2054, 2059, 2064, 2069, 2074, 2079, + 2086, 2093, 2100, 2105, 2110, 2115, 2120, 2125, 2130, 2135, + 2140, 2145, 2150, 2155, 2162, 2167, 2172, 2177, 2182, 2187, + 2192, 2199, 2206, 2213, 2218, 2220, 2222, 2224, 2226, 2228, + 2230, 2232, 2234, 2236, 2238, 2244, 2249, 2254, 2257, 2263, + 2267, 2274, 2279, 2287, 2294, 2301, 2308, 2313, 2315, 2318, + 2321, 2325, 2329, 2341, 2351, 2359, 2367, 2369, 2373, 2375, + 2377, 2380, 2384, 2389, 2395, 2397, 2399, 2402, 2406, 2410, + 2416, 2421, 2424, 2427, 2430, 2433, 2439, 2445, 2451, 2457, + 2459, 2461, 2465, 2469, 2474, 2481, 2488, 2490, 2492, 2496, + 2500, 2510, 2518, 2520, 2526, 2530, 2537, 2539, 2543, 2545, + 2547, 2551, 2558, 2560, 2562, 2567, 2574, 2581, 2586, 2591, + 2600, 2605, 2610, 2615, 2620, 2627, 2634, 2636 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 175, 0, -1, 176, -1, 1, 6, -1, -1, 176, - 177, -1, 180, -1, 179, -1, 198, -1, 212, -1, - 217, -1, 221, -1, 222, -1, 223, -1, 226, -1, - 246, -1, 247, -1, 225, -1, 224, -1, 220, -1, - 249, -1, 151, -1, 151, 151, -1, 36, 164, 262, - 165, 6, -1, 37, 164, 262, 165, 6, -1, 36, - 164, 262, 165, 178, 262, 6, -1, 36, 164, 262, - 170, 258, 165, 6, -1, 37, 164, 262, 170, 258, - 165, 6, -1, 36, 164, 262, 170, 258, 165, 178, - 262, 6, -1, 4, 262, 171, 181, 172, 6, -1, - 100, 4, 166, 250, 167, 6, -1, 101, 4, 166, - 250, 167, 6, -1, -1, 181, 184, -1, 181, 188, - -1, 181, 191, -1, 181, 193, -1, 181, 194, -1, - 250, -1, 182, 170, 250, -1, 250, -1, 183, 170, - 250, -1, -1, -1, 4, 185, 164, 182, 165, 186, - 171, 183, 172, 6, -1, 262, -1, 187, 170, 262, - -1, -1, 106, 164, 250, 170, 250, 170, 250, 165, - 189, 171, 187, 172, 6, -1, 262, -1, 190, 170, - 262, -1, -1, 107, 164, 250, 170, 250, 170, 250, - 170, 250, 165, 192, 171, 190, 172, 6, -1, 108, - 171, 254, 172, 171, 254, 172, 6, -1, 108, 171, - 254, 172, 171, 254, 172, 171, 254, 172, 171, 254, - 172, 6, -1, -1, 109, 195, 171, 183, 172, 6, - -1, 7, -1, 144, -1, 143, -1, 142, -1, 141, - -1, 162, -1, 161, -1, 56, 166, 200, 167, 6, - -1, 57, 166, 203, 167, 6, -1, 4, 196, 255, - 6, -1, 4, 166, 167, 196, 255, 6, -1, 4, - 166, 250, 167, 196, 250, 6, -1, 4, 164, 250, - 165, 196, 250, 6, -1, 4, 166, 171, 258, 172, - 167, 196, 255, 6, -1, 4, 164, 171, 258, 172, - 165, 196, 255, 6, -1, 4, 197, 6, -1, 4, - 166, 250, 167, 197, 6, -1, 4, 7, 263, 6, - -1, 4, 168, 4, 7, 263, 6, -1, 4, 166, - 250, 167, 168, 4, 7, 263, 6, -1, 4, 168, - 4, 196, 250, 6, -1, 4, 166, 250, 167, 168, - 4, 196, 250, 6, -1, 4, 168, 4, 197, 6, - -1, 4, 166, 250, 167, 168, 4, 197, 6, -1, - 4, 168, 116, 168, 4, 7, 259, 6, -1, 4, - 166, 250, 167, 168, 116, 168, 4, 7, 259, 6, - -1, 4, 168, 117, 7, 260, 6, -1, 4, 166, - 250, 167, 168, 117, 7, 260, 6, -1, 4, 125, - 7, 250, 6, -1, 125, 166, 250, 167, 7, 4, - 6, -1, 125, 166, 250, 167, 168, 4, 7, 250, - 6, -1, 125, 166, 250, 167, 168, 4, 7, 263, - 6, -1, 125, 166, 250, 167, 168, 4, 7, 171, - 258, 172, 6, -1, 125, 166, 250, 167, 168, 4, - 6, -1, 81, 164, 4, 165, 168, 4, 7, 250, - 6, -1, 81, 164, 4, 165, 168, 4, 7, 263, - 6, -1, -1, 170, -1, -1, 200, 199, 4, -1, - 200, 199, 4, 7, 250, -1, -1, 200, 199, 4, - 7, 171, 250, 201, 205, 172, -1, 200, 199, 4, - 7, 263, -1, -1, 200, 199, 4, 7, 171, 263, - 202, 207, 172, -1, -1, 203, 199, 262, -1, 250, - 7, 263, -1, 204, 170, 250, 7, 263, -1, -1, - 205, 206, -1, 170, 4, 255, -1, 170, 4, 171, - 204, 172, -1, 170, 4, 263, -1, -1, 207, 208, - -1, 170, 4, 250, -1, 170, 4, 263, -1, 170, - 4, 171, 264, 172, -1, 250, -1, 263, -1, -1, - 119, 62, 171, 250, 172, -1, -1, 73, 252, -1, - 58, 164, 250, 165, 7, 252, 6, -1, -1, 77, - 58, 213, 164, 209, 165, 7, 255, 6, -1, 67, - 68, 255, 7, 250, 6, -1, 61, 164, 250, 165, - 7, 255, 6, -1, 82, 61, 255, 6, -1, 65, - 164, 250, 165, 7, 255, 6, -1, 59, 164, 250, - 165, 7, 255, 211, 6, -1, 60, 164, 250, 165, - 7, 255, 211, 6, -1, 111, 164, 250, 165, 7, - 255, 6, -1, 112, 164, 250, 165, 7, 255, 6, - -1, 113, 164, 250, 165, 7, 255, 115, 255, 114, - 250, 6, -1, 61, 4, 164, 250, 165, 7, 255, - 6, -1, 78, 61, 164, 250, 165, 7, 255, 6, - -1, -1, 77, 61, 214, 164, 209, 165, 7, 255, - 6, -1, 73, 64, 164, 250, 165, 7, 255, 6, - -1, 74, 64, 164, 250, 165, 7, 255, 210, 6, - -1, 12, 13, 6, -1, 13, 64, 250, 6, -1, - 69, 64, 164, 250, 165, 7, 5, 5, 5, 6, - -1, 62, 164, 250, 165, 7, 255, 6, -1, 63, - 164, 250, 165, 7, 255, 6, -1, 64, 4, 164, - 250, 165, 7, 255, 6, -1, 78, 64, 164, 250, - 165, 7, 255, 6, -1, 78, 64, 164, 250, 165, - 7, 255, 4, 171, 254, 172, 6, -1, -1, 77, - 64, 215, 164, 209, 165, 7, 255, 6, -1, 76, - 66, 164, 250, 165, 7, 255, 6, -1, 66, 164, - 250, 165, 7, 255, 6, -1, 78, 66, 164, 250, - 165, 7, 255, 6, -1, -1, 77, 66, 216, 164, - 209, 165, 7, 255, 6, -1, 85, 252, 171, 218, - 172, -1, 84, 171, 252, 170, 252, 170, 250, 172, - 171, 218, 172, -1, 86, 252, 171, 218, 172, -1, - 87, 171, 252, 170, 250, 172, 171, 218, 172, -1, - 87, 171, 252, 170, 252, 172, 171, 218, 172, -1, - 4, 171, 218, 172, -1, 95, 61, 171, 258, 172, - 64, 171, 250, 172, -1, 92, 61, 164, 250, 165, - 171, 258, 172, 6, -1, 219, -1, 217, -1, -1, - 219, 212, -1, 219, 58, 171, 258, 172, 6, -1, - 219, 61, 171, 258, 172, 6, -1, 219, 64, 171, - 258, 172, 6, -1, 219, 66, 171, 258, 172, 6, - -1, 89, 73, 164, 250, 165, 7, 255, 6, -1, - 89, 58, 164, 250, 165, 7, 171, 254, 172, 6, - -1, 89, 73, 164, 250, 165, 7, 171, 252, 170, - 252, 170, 258, 172, 6, -1, 89, 73, 164, 250, - 165, 7, 171, 252, 170, 252, 170, 252, 170, 258, - 172, 6, -1, 89, 62, 164, 250, 165, 7, 171, - 252, 170, 258, 172, 6, -1, 89, 4, 164, 250, - 165, 7, 255, 6, -1, 89, 4, 164, 250, 165, - 7, 5, 6, -1, 89, 4, 171, 250, 172, 6, - -1, 89, 4, 164, 250, 165, 7, 171, 252, 170, - 252, 170, 258, 172, 6, -1, 93, 171, 219, 172, - -1, 93, 125, 166, 250, 167, 6, -1, 93, 4, - 166, 250, 167, 6, -1, 93, 4, 6, -1, 93, - 4, 4, 6, -1, 116, 259, 171, 219, 172, -1, - 83, 116, 259, 171, 219, 172, -1, 129, 5, 6, - -1, 130, 5, 6, -1, 129, 171, 219, 172, -1, - 83, 129, 171, 219, 172, -1, 130, 171, 219, 172, - -1, 83, 130, 171, 219, 172, -1, 4, 263, 6, - -1, 4, 4, 166, 250, 167, 262, 6, -1, 4, - 4, 4, 166, 250, 167, 6, -1, 4, 250, 6, - -1, 81, 164, 4, 165, 168, 4, 6, -1, 110, - 4, 6, -1, 123, 6, -1, 124, 6, -1, 52, - 6, -1, 47, 6, -1, 47, 171, 250, 170, 250, - 170, 250, 170, 250, 170, 250, 170, 250, 172, 6, + 178, 0, -1, 179, -1, 1, 6, -1, -1, 179, + 180, -1, 183, -1, 182, -1, 201, -1, 215, -1, + 220, -1, 224, -1, 225, -1, 226, -1, 229, -1, + 249, -1, 250, -1, 228, -1, 227, -1, 223, -1, + 252, -1, 154, -1, 154, 154, -1, 36, 167, 265, + 168, 6, -1, 37, 167, 265, 168, 6, -1, 36, + 167, 265, 168, 181, 265, 6, -1, 36, 167, 265, + 173, 261, 168, 6, -1, 37, 167, 265, 173, 261, + 168, 6, -1, 36, 167, 265, 173, 261, 168, 181, + 265, 6, -1, 4, 265, 174, 184, 175, 6, -1, + 101, 4, 169, 253, 170, 6, -1, 102, 4, 169, + 253, 170, 6, -1, -1, 184, 187, -1, 184, 191, + -1, 184, 194, -1, 184, 196, -1, 184, 197, -1, + 253, -1, 185, 173, 253, -1, 253, -1, 186, 173, + 253, -1, -1, -1, 4, 188, 167, 185, 168, 189, + 174, 186, 175, 6, -1, 265, -1, 190, 173, 265, + -1, -1, 109, 167, 253, 173, 253, 173, 253, 168, + 192, 174, 190, 175, 6, -1, 265, -1, 193, 173, + 265, -1, -1, 110, 167, 253, 173, 253, 173, 253, + 173, 253, 168, 195, 174, 193, 175, 6, -1, 111, + 174, 257, 175, 174, 257, 175, 6, -1, 111, 174, + 257, 175, 174, 257, 175, 174, 257, 175, 174, 257, + 175, 6, -1, -1, 112, 198, 174, 186, 175, 6, + -1, 7, -1, 147, -1, 146, -1, 145, -1, 144, + -1, 165, -1, 164, -1, 56, 169, 203, 170, 6, + -1, 57, 169, 206, 170, 6, -1, 4, 199, 258, + 6, -1, 4, 169, 170, 199, 258, 6, -1, 4, + 169, 253, 170, 199, 253, 6, -1, 4, 167, 253, + 168, 199, 253, 6, -1, 4, 169, 174, 261, 175, + 170, 199, 258, 6, -1, 4, 167, 174, 261, 175, + 168, 199, 258, 6, -1, 4, 200, 6, -1, 4, + 169, 253, 170, 200, 6, -1, 4, 7, 266, 6, + -1, 4, 171, 4, 7, 266, 6, -1, 4, 169, + 253, 170, 171, 4, 7, 266, 6, -1, 4, 171, + 4, 199, 253, 6, -1, 4, 169, 253, 170, 171, + 4, 199, 253, 6, -1, 4, 171, 4, 200, 6, + -1, 4, 169, 253, 170, 171, 4, 200, 6, -1, + 4, 171, 119, 171, 4, 7, 262, 6, -1, 4, + 169, 253, 170, 171, 119, 171, 4, 7, 262, 6, + -1, 4, 171, 120, 7, 263, 6, -1, 4, 169, + 253, 170, 171, 120, 7, 263, 6, -1, 4, 128, + 7, 253, 6, -1, 128, 169, 253, 170, 7, 4, + 6, -1, 128, 169, 253, 170, 171, 4, 7, 253, + 6, -1, 128, 169, 253, 170, 171, 4, 7, 266, + 6, -1, 128, 169, 253, 170, 171, 4, 7, 174, + 261, 175, 6, -1, 128, 169, 253, 170, 171, 4, + 6, -1, 81, 167, 4, 168, 171, 4, 7, 253, + 6, -1, 81, 167, 4, 168, 171, 4, 7, 266, + 6, -1, -1, 173, -1, -1, 203, 202, 4, -1, + 203, 202, 4, 7, 253, -1, -1, 203, 202, 4, + 7, 174, 253, 204, 208, 175, -1, 203, 202, 4, + 7, 266, -1, -1, 203, 202, 4, 7, 174, 266, + 205, 210, 175, -1, -1, 206, 202, 265, -1, 253, + 7, 266, -1, 207, 173, 253, 7, 266, -1, -1, + 208, 209, -1, 173, 4, 258, -1, 173, 4, 174, + 207, 175, -1, 173, 4, 266, -1, -1, 210, 211, + -1, 173, 4, 253, -1, 173, 4, 266, -1, 173, + 4, 174, 267, 175, -1, 253, -1, 266, -1, -1, + 122, 62, 174, 253, 175, -1, -1, 73, 255, -1, + 58, 167, 253, 168, 7, 255, 6, -1, -1, 77, + 58, 216, 167, 212, 168, 7, 258, 6, -1, 67, + 68, 258, 7, 253, 6, -1, 61, 167, 253, 168, + 7, 258, 6, -1, 82, 61, 258, 6, -1, 65, + 167, 253, 168, 7, 258, 6, -1, 59, 167, 253, + 168, 7, 258, 214, 6, -1, 60, 167, 253, 168, + 7, 258, 214, 6, -1, 114, 167, 253, 168, 7, + 258, 6, -1, 115, 167, 253, 168, 7, 258, 6, + -1, 116, 167, 253, 168, 7, 258, 118, 258, 117, + 253, 6, -1, 61, 4, 167, 253, 168, 7, 258, + 6, -1, 78, 61, 167, 253, 168, 7, 258, 6, + -1, -1, 77, 61, 217, 167, 212, 168, 7, 258, + 6, -1, 73, 64, 167, 253, 168, 7, 258, 6, + -1, 74, 64, 167, 253, 168, 7, 258, 213, 6, + -1, 12, 13, 6, -1, 13, 64, 253, 6, -1, + 69, 64, 167, 253, 168, 7, 5, 5, 5, 6, + -1, 62, 167, 253, 168, 7, 258, 6, -1, 63, + 167, 253, 168, 7, 258, 6, -1, 64, 4, 167, + 253, 168, 7, 258, 6, -1, 78, 64, 167, 253, + 168, 7, 258, 6, -1, 78, 64, 167, 253, 168, + 7, 258, 4, 174, 257, 175, 6, -1, -1, 77, + 64, 218, 167, 212, 168, 7, 258, 6, -1, 76, + 66, 167, 253, 168, 7, 258, 6, -1, 66, 167, + 253, 168, 7, 258, 6, -1, 78, 66, 167, 253, + 168, 7, 258, 6, -1, -1, 77, 66, 219, 167, + 212, 168, 7, 258, 6, -1, 85, 255, 174, 221, + 175, -1, 84, 174, 255, 173, 255, 173, 253, 175, + 174, 221, 175, -1, 86, 255, 174, 221, 175, -1, + 87, 174, 255, 173, 253, 175, 174, 221, 175, -1, + 87, 174, 255, 173, 255, 175, 174, 221, 175, -1, + 4, 174, 221, 175, -1, 95, 61, 174, 261, 175, + 64, 174, 253, 175, -1, 92, 61, 167, 253, 168, + 174, 261, 175, 6, -1, 222, -1, 220, -1, -1, + 222, 215, -1, 222, 58, 174, 261, 175, 6, -1, + 222, 61, 174, 261, 175, 6, -1, 222, 64, 174, + 261, 175, 6, -1, 222, 66, 174, 261, 175, 6, + -1, 89, 73, 167, 253, 168, 7, 258, 6, -1, + 89, 58, 167, 253, 168, 7, 174, 257, 175, 6, + -1, 89, 73, 167, 253, 168, 7, 174, 255, 173, + 255, 173, 261, 175, 6, -1, 89, 73, 167, 253, + 168, 7, 174, 255, 173, 255, 173, 255, 173, 261, + 175, 6, -1, 89, 62, 167, 253, 168, 7, 174, + 255, 173, 261, 175, 6, -1, 89, 4, 167, 253, + 168, 7, 258, 6, -1, 89, 4, 167, 253, 168, + 7, 5, 6, -1, 89, 4, 174, 253, 175, 6, + -1, 89, 4, 167, 253, 168, 7, 174, 255, 173, + 255, 173, 261, 175, 6, -1, 93, 174, 222, 175, + -1, 93, 128, 169, 253, 170, 6, -1, 93, 4, + 169, 253, 170, 6, -1, 93, 4, 6, -1, 93, + 4, 4, 6, -1, 119, 262, 174, 222, 175, -1, + 83, 119, 262, 174, 222, 175, -1, 132, 5, 6, + -1, 133, 5, 6, -1, 132, 174, 222, 175, -1, + 83, 132, 174, 222, 175, -1, 133, 174, 222, 175, + -1, 83, 133, 174, 222, 175, -1, 4, 266, 6, + -1, 4, 4, 169, 253, 170, 265, 6, -1, 4, + 4, 4, 169, 253, 170, 6, -1, 4, 253, 6, + -1, 81, 167, 4, 168, 171, 4, 6, -1, 113, + 4, 6, -1, 126, 6, -1, 127, 6, -1, 52, + 6, -1, 47, 6, -1, 47, 174, 253, 173, 253, + 173, 253, 173, 253, 173, 253, 173, 253, 175, 6, -1, 48, 6, -1, 53, 6, -1, 54, 6, -1, - 71, 6, -1, 72, 171, 258, 172, 171, 258, 172, - 171, 254, 172, 171, 250, 170, 250, 172, 6, -1, - 137, 250, 6, -1, 118, 164, 250, 8, 250, 165, - -1, 118, 164, 250, 8, 250, 8, 250, 165, -1, - 118, 4, 119, 171, 250, 8, 250, 172, -1, 118, - 4, 119, 171, 250, 8, 250, 8, 250, 172, -1, - 120, -1, 128, 4, -1, 126, -1, 127, 4, 6, - -1, 121, 164, 250, 165, -1, 122, -1, 88, 252, - 171, 219, 172, -1, 88, 171, 252, 170, 252, 170, - 250, 172, 171, 219, 172, -1, 88, 171, 252, 170, - 252, 170, 252, 170, 250, 172, 171, 219, 172, -1, - -1, 88, 252, 171, 219, 227, 240, 172, -1, -1, - 88, 171, 252, 170, 252, 170, 250, 172, 171, 219, - 228, 240, 172, -1, -1, 88, 171, 252, 170, 252, - 170, 252, 170, 250, 172, 171, 219, 229, 240, 172, - -1, -1, 88, 171, 219, 230, 240, 172, -1, 88, - 58, 171, 250, 170, 252, 172, 6, -1, 88, 61, - 171, 250, 170, 252, 172, 6, -1, 88, 64, 171, - 250, 170, 252, 172, 6, -1, 88, 58, 171, 250, - 170, 252, 170, 252, 170, 250, 172, 6, -1, 88, - 61, 171, 250, 170, 252, 170, 252, 170, 250, 172, - 6, -1, 88, 64, 171, 250, 170, 252, 170, 252, - 170, 250, 172, 6, -1, 88, 58, 171, 250, 170, - 252, 170, 252, 170, 252, 170, 250, 172, 6, -1, - 88, 61, 171, 250, 170, 252, 170, 252, 170, 252, - 170, 250, 172, 6, -1, 88, 64, 171, 250, 170, - 252, 170, 252, 170, 252, 170, 250, 172, 6, -1, - -1, 88, 58, 171, 250, 170, 252, 172, 231, 171, - 240, 172, 6, -1, -1, 88, 61, 171, 250, 170, - 252, 172, 232, 171, 240, 172, 6, -1, -1, 88, - 64, 171, 250, 170, 252, 172, 233, 171, 240, 172, - 6, -1, -1, 88, 58, 171, 250, 170, 252, 170, - 252, 170, 250, 172, 234, 171, 240, 172, 6, -1, - -1, 88, 61, 171, 250, 170, 252, 170, 252, 170, - 250, 172, 235, 171, 240, 172, 6, -1, -1, 88, - 64, 171, 250, 170, 252, 170, 252, 170, 250, 172, - 236, 171, 240, 172, 6, -1, -1, 88, 58, 171, - 250, 170, 252, 170, 252, 170, 252, 170, 250, 172, - 237, 171, 240, 172, 6, -1, -1, 88, 61, 171, - 250, 170, 252, 170, 252, 170, 252, 170, 250, 172, - 238, 171, 240, 172, 6, -1, -1, 88, 64, 171, - 250, 170, 252, 170, 252, 170, 252, 170, 250, 172, - 239, 171, 240, 172, 6, -1, 241, -1, 240, 241, - -1, 98, 171, 250, 172, 6, -1, 98, 171, 255, - 170, 255, 172, 6, -1, 98, 171, 255, 170, 255, - 170, 255, 172, 6, -1, 90, 6, -1, 102, 6, - -1, 102, 104, 6, -1, 103, 6, -1, 103, 104, - 6, -1, 99, 164, 250, 165, 7, 255, 80, 250, - 6, -1, 80, 4, 166, 250, 167, 6, -1, -1, - 80, 4, 250, -1, -1, 4, -1, -1, 7, 255, - -1, -1, 7, 250, -1, 75, 61, 256, 7, 250, - 242, 6, -1, 75, 64, 256, 244, 243, 6, -1, - 70, 64, 171, 250, 172, 7, 255, 6, -1, 75, - 66, 256, 244, 6, -1, 105, 256, 6, -1, 96, - 64, 171, 258, 172, 250, 6, -1, 90, 64, 256, - 245, 6, -1, 90, 66, 256, 6, -1, 91, 64, - 255, 7, 250, 6, -1, 79, 61, 255, 7, 255, - 6, -1, 79, 64, 250, 171, 258, 172, 7, 250, - 171, 258, 172, 6, -1, 58, 171, 258, 172, 119, - 64, 171, 250, 172, 6, -1, 61, 171, 258, 172, - 119, 64, 171, 250, 172, 6, -1, 58, 171, 258, - 172, 119, 66, 171, 250, 172, 6, -1, 61, 171, - 258, 172, 119, 66, 171, 250, 172, 6, -1, 64, - 171, 258, 172, 119, 66, 171, 250, 172, 6, -1, - 97, 64, 256, 6, -1, 97, 61, 256, 6, -1, - 94, 6, -1, 94, 4, 6, -1, 94, 58, 171, - 258, 172, 6, -1, 134, -1, 135, -1, 136, -1, - 248, 6, -1, 248, 171, 255, 172, 6, -1, 248, - 171, 255, 170, 255, 172, 6, -1, 248, 164, 255, - 165, 171, 255, 170, 255, 172, 6, -1, 251, -1, - 164, 250, 165, -1, 155, 250, -1, 154, 250, -1, - 159, 250, -1, 250, 155, 250, -1, 250, 154, 250, - -1, 250, 156, 250, -1, 250, 157, 250, -1, 250, - 158, 250, -1, 250, 163, 250, -1, 250, 150, 250, - -1, 250, 151, 250, -1, 250, 153, 250, -1, 250, - 152, 250, -1, 250, 149, 250, -1, 250, 148, 250, - -1, 250, 147, 250, -1, 250, 146, 250, -1, 250, - 145, 250, 8, 250, -1, 14, 164, 250, 165, -1, - 15, 164, 250, 165, -1, 16, 164, 250, 165, -1, - 17, 164, 250, 165, -1, 18, 164, 250, 165, -1, - 19, 164, 250, 165, -1, 20, 164, 250, 165, -1, - 21, 164, 250, 165, -1, 22, 164, 250, 165, -1, - 24, 164, 250, 165, -1, 25, 164, 250, 170, 250, - 165, -1, 26, 164, 250, 165, -1, 27, 164, 250, - 165, -1, 28, 164, 250, 165, -1, 29, 164, 250, - 165, -1, 30, 164, 250, 165, -1, 31, 164, 250, - 165, -1, 32, 164, 250, 170, 250, 165, -1, 33, - 164, 250, 170, 250, 165, -1, 34, 164, 250, 170, - 250, 165, -1, 23, 164, 250, 165, -1, 14, 166, - 250, 167, -1, 15, 166, 250, 167, -1, 16, 166, - 250, 167, -1, 17, 166, 250, 167, -1, 18, 166, - 250, 167, -1, 19, 166, 250, 167, -1, 20, 166, - 250, 167, -1, 21, 166, 250, 167, -1, 22, 166, - 250, 167, -1, 24, 166, 250, 167, -1, 25, 166, - 250, 170, 250, 167, -1, 26, 166, 250, 167, -1, - 27, 166, 250, 167, -1, 28, 166, 250, 167, -1, - 29, 166, 250, 167, -1, 30, 166, 250, 167, -1, - 31, 166, 250, 167, -1, 32, 166, 250, 170, 250, - 167, -1, 33, 166, 250, 170, 250, 167, -1, 34, - 166, 250, 170, 250, 167, -1, 23, 166, 250, 167, - -1, 3, -1, 9, -1, 10, -1, 11, -1, 138, - -1, 139, -1, 140, -1, 50, -1, 51, -1, 4, - -1, 4, 173, 171, 250, 172, -1, 4, 166, 250, - 167, -1, 169, 4, 166, 167, -1, 4, 197, -1, - 4, 166, 250, 167, 197, -1, 4, 168, 4, -1, - 4, 166, 250, 167, 168, 4, -1, 4, 168, 4, - 197, -1, 4, 166, 250, 167, 168, 4, 197, -1, - 131, 164, 262, 170, 250, 165, -1, 44, 164, 262, - 170, 262, 165, -1, 45, 164, 262, 170, 262, 165, - -1, 46, 164, 264, 165, -1, 253, -1, 155, 252, - -1, 154, 252, -1, 252, 155, 252, -1, 252, 154, - 252, -1, 171, 250, 170, 250, 170, 250, 170, 250, - 170, 250, 172, -1, 171, 250, 170, 250, 170, 250, - 170, 250, 172, -1, 171, 250, 170, 250, 170, 250, - 172, -1, 164, 250, 170, 250, 170, 250, 165, -1, - 255, -1, 254, 170, 255, -1, 250, -1, 257, -1, - 171, 172, -1, 171, 258, 172, -1, 155, 171, 258, - 172, -1, 250, 156, 171, 258, 172, -1, 255, -1, - 5, -1, 155, 257, -1, 250, 156, 257, -1, 250, - 8, 250, -1, 250, 8, 250, 8, 250, -1, 58, - 171, 250, 172, -1, 58, 5, -1, 61, 5, -1, - 64, 5, -1, 66, 5, -1, 77, 58, 171, 258, - 172, -1, 77, 61, 171, 258, 172, -1, 77, 64, - 171, 258, 172, -1, 77, 66, 171, 258, 172, -1, - 217, -1, 226, -1, 4, 166, 167, -1, 4, 164, - 165, -1, 35, 166, 4, 167, -1, 4, 166, 171, - 258, 172, 167, -1, 4, 164, 171, 258, 172, 165, - -1, 250, -1, 257, -1, 258, 170, 250, -1, 258, - 170, 257, -1, 171, 250, 170, 250, 170, 250, 170, - 250, 172, -1, 171, 250, 170, 250, 170, 250, 172, - -1, 4, -1, 4, 168, 116, 168, 4, -1, 171, - 261, 172, -1, 4, 166, 250, 167, 168, 117, -1, - 259, -1, 261, 170, 259, -1, 263, -1, 4, -1, - 4, 168, 4, -1, 4, 166, 250, 167, 168, 4, - -1, 5, -1, 49, -1, 132, 164, 262, 165, -1, - 133, 164, 262, 170, 262, 165, -1, 40, 164, 262, - 170, 262, 165, -1, 41, 164, 262, 165, -1, 42, - 164, 262, 165, -1, 43, 164, 262, 170, 262, 170, - 262, 165, -1, 38, 164, 264, 165, -1, 38, 166, - 264, 167, -1, 39, 164, 262, 165, -1, 39, 166, - 262, 167, -1, 39, 164, 262, 170, 258, 165, -1, - 39, 166, 262, 170, 258, 167, -1, 262, -1, 264, - 170, 262, -1 + 71, 6, -1, 72, 174, 261, 175, 174, 261, 175, + 174, 257, 175, 174, 253, 173, 253, 175, 6, -1, + 140, 253, 6, -1, 121, 167, 253, 8, 253, 168, + -1, 121, 167, 253, 8, 253, 8, 253, 168, -1, + 121, 4, 122, 174, 253, 8, 253, 175, -1, 121, + 4, 122, 174, 253, 8, 253, 8, 253, 175, -1, + 123, -1, 131, 4, -1, 129, -1, 130, 4, 6, + -1, 124, 167, 253, 168, -1, 125, -1, 88, 255, + 174, 222, 175, -1, 88, 174, 255, 173, 255, 173, + 253, 175, 174, 222, 175, -1, 88, 174, 255, 173, + 255, 173, 255, 173, 253, 175, 174, 222, 175, -1, + -1, 88, 255, 174, 222, 230, 243, 175, -1, -1, + 88, 174, 255, 173, 255, 173, 253, 175, 174, 222, + 231, 243, 175, -1, -1, 88, 174, 255, 173, 255, + 173, 255, 173, 253, 175, 174, 222, 232, 243, 175, + -1, -1, 88, 174, 222, 233, 243, 175, -1, 88, + 58, 174, 253, 173, 255, 175, 6, -1, 88, 61, + 174, 253, 173, 255, 175, 6, -1, 88, 64, 174, + 253, 173, 255, 175, 6, -1, 88, 58, 174, 253, + 173, 255, 173, 255, 173, 253, 175, 6, -1, 88, + 61, 174, 253, 173, 255, 173, 255, 173, 253, 175, + 6, -1, 88, 64, 174, 253, 173, 255, 173, 255, + 173, 253, 175, 6, -1, 88, 58, 174, 253, 173, + 255, 173, 255, 173, 255, 173, 253, 175, 6, -1, + 88, 61, 174, 253, 173, 255, 173, 255, 173, 255, + 173, 253, 175, 6, -1, 88, 64, 174, 253, 173, + 255, 173, 255, 173, 255, 173, 253, 175, 6, -1, + -1, 88, 58, 174, 253, 173, 255, 175, 234, 174, + 243, 175, 6, -1, -1, 88, 61, 174, 253, 173, + 255, 175, 235, 174, 243, 175, 6, -1, -1, 88, + 64, 174, 253, 173, 255, 175, 236, 174, 243, 175, + 6, -1, -1, 88, 58, 174, 253, 173, 255, 173, + 255, 173, 253, 175, 237, 174, 243, 175, 6, -1, + -1, 88, 61, 174, 253, 173, 255, 173, 255, 173, + 253, 175, 238, 174, 243, 175, 6, -1, -1, 88, + 64, 174, 253, 173, 255, 173, 255, 173, 253, 175, + 239, 174, 243, 175, 6, -1, -1, 88, 58, 174, + 253, 173, 255, 173, 255, 173, 255, 173, 253, 175, + 240, 174, 243, 175, 6, -1, -1, 88, 61, 174, + 253, 173, 255, 173, 255, 173, 255, 173, 253, 175, + 241, 174, 243, 175, 6, -1, -1, 88, 64, 174, + 253, 173, 255, 173, 255, 173, 255, 173, 253, 175, + 242, 174, 243, 175, 6, -1, 244, -1, 243, 244, + -1, 98, 174, 253, 175, 6, -1, 98, 174, 258, + 173, 258, 175, 6, -1, 98, 174, 258, 173, 258, + 173, 258, 175, 6, -1, 99, 6, -1, 90, 6, + -1, 105, 6, -1, 105, 107, 6, -1, 106, 6, + -1, 106, 107, 6, -1, 103, 6, -1, 103, 107, + 6, -1, 104, 6, -1, 104, 107, 6, -1, 100, + 167, 253, 168, 7, 258, 80, 253, 6, -1, 80, + 4, 169, 253, 170, 6, -1, -1, 80, 4, 253, + -1, -1, 4, -1, -1, 7, 258, -1, -1, 7, + 253, -1, 75, 61, 259, 7, 253, 245, 6, -1, + 75, 64, 259, 247, 246, 6, -1, 70, 64, 174, + 253, 175, 7, 258, 6, -1, 75, 66, 259, 247, + 6, -1, 108, 259, 6, -1, 96, 64, 174, 261, + 175, 253, 6, -1, 90, 64, 259, 248, 6, -1, + 90, 66, 259, 6, -1, 91, 64, 258, 7, 253, + 6, -1, 79, 61, 258, 7, 258, 6, -1, 79, + 64, 253, 174, 261, 175, 7, 253, 174, 261, 175, + 6, -1, 58, 174, 261, 175, 122, 64, 174, 253, + 175, 6, -1, 61, 174, 261, 175, 122, 64, 174, + 253, 175, 6, -1, 58, 174, 261, 175, 122, 66, + 174, 253, 175, 6, -1, 61, 174, 261, 175, 122, + 66, 174, 253, 175, 6, -1, 64, 174, 261, 175, + 122, 66, 174, 253, 175, 6, -1, 97, 64, 259, + 6, -1, 97, 61, 259, 6, -1, 94, 6, -1, + 94, 4, 6, -1, 94, 58, 174, 261, 175, 6, + -1, 137, -1, 138, -1, 139, -1, 251, 6, -1, + 251, 174, 258, 175, 6, -1, 251, 174, 258, 173, + 258, 175, 6, -1, 251, 167, 258, 168, 174, 258, + 173, 258, 175, 6, -1, 254, -1, 167, 253, 168, + -1, 158, 253, -1, 157, 253, -1, 162, 253, -1, + 253, 158, 253, -1, 253, 157, 253, -1, 253, 159, + 253, -1, 253, 160, 253, -1, 253, 161, 253, -1, + 253, 166, 253, -1, 253, 153, 253, -1, 253, 154, + 253, -1, 253, 156, 253, -1, 253, 155, 253, -1, + 253, 152, 253, -1, 253, 151, 253, -1, 253, 150, + 253, -1, 253, 149, 253, -1, 253, 148, 253, 8, + 253, -1, 14, 167, 253, 168, -1, 15, 167, 253, + 168, -1, 16, 167, 253, 168, -1, 17, 167, 253, + 168, -1, 18, 167, 253, 168, -1, 19, 167, 253, + 168, -1, 20, 167, 253, 168, -1, 21, 167, 253, + 168, -1, 22, 167, 253, 168, -1, 24, 167, 253, + 168, -1, 25, 167, 253, 173, 253, 168, -1, 26, + 167, 253, 168, -1, 27, 167, 253, 168, -1, 28, + 167, 253, 168, -1, 29, 167, 253, 168, -1, 30, + 167, 253, 168, -1, 31, 167, 253, 168, -1, 32, + 167, 253, 173, 253, 168, -1, 33, 167, 253, 173, + 253, 168, -1, 34, 167, 253, 173, 253, 168, -1, + 23, 167, 253, 168, -1, 14, 169, 253, 170, -1, + 15, 169, 253, 170, -1, 16, 169, 253, 170, -1, + 17, 169, 253, 170, -1, 18, 169, 253, 170, -1, + 19, 169, 253, 170, -1, 20, 169, 253, 170, -1, + 21, 169, 253, 170, -1, 22, 169, 253, 170, -1, + 24, 169, 253, 170, -1, 25, 169, 253, 173, 253, + 170, -1, 26, 169, 253, 170, -1, 27, 169, 253, + 170, -1, 28, 169, 253, 170, -1, 29, 169, 253, + 170, -1, 30, 169, 253, 170, -1, 31, 169, 253, + 170, -1, 32, 169, 253, 173, 253, 170, -1, 33, + 169, 253, 173, 253, 170, -1, 34, 169, 253, 173, + 253, 170, -1, 23, 169, 253, 170, -1, 3, -1, + 9, -1, 10, -1, 11, -1, 141, -1, 142, -1, + 143, -1, 50, -1, 51, -1, 4, -1, 4, 176, + 174, 253, 175, -1, 4, 169, 253, 170, -1, 172, + 4, 169, 170, -1, 4, 200, -1, 4, 169, 253, + 170, 200, -1, 4, 171, 4, -1, 4, 169, 253, + 170, 171, 4, -1, 4, 171, 4, 200, -1, 4, + 169, 253, 170, 171, 4, 200, -1, 134, 167, 265, + 173, 253, 168, -1, 44, 167, 265, 173, 265, 168, + -1, 45, 167, 265, 173, 265, 168, -1, 46, 167, + 267, 168, -1, 256, -1, 158, 255, -1, 157, 255, + -1, 255, 158, 255, -1, 255, 157, 255, -1, 174, + 253, 173, 253, 173, 253, 173, 253, 173, 253, 175, + -1, 174, 253, 173, 253, 173, 253, 173, 253, 175, + -1, 174, 253, 173, 253, 173, 253, 175, -1, 167, + 253, 173, 253, 173, 253, 168, -1, 258, -1, 257, + 173, 258, -1, 253, -1, 260, -1, 174, 175, -1, + 174, 261, 175, -1, 158, 174, 261, 175, -1, 253, + 159, 174, 261, 175, -1, 258, -1, 5, -1, 158, + 260, -1, 253, 159, 260, -1, 253, 8, 253, -1, + 253, 8, 253, 8, 253, -1, 58, 174, 253, 175, + -1, 58, 5, -1, 61, 5, -1, 64, 5, -1, + 66, 5, -1, 77, 58, 174, 261, 175, -1, 77, + 61, 174, 261, 175, -1, 77, 64, 174, 261, 175, + -1, 77, 66, 174, 261, 175, -1, 220, -1, 229, + -1, 4, 169, 170, -1, 4, 167, 168, -1, 35, + 169, 4, 170, -1, 4, 169, 174, 261, 175, 170, + -1, 4, 167, 174, 261, 175, 168, -1, 253, -1, + 260, -1, 261, 173, 253, -1, 261, 173, 260, -1, + 174, 253, 173, 253, 173, 253, 173, 253, 175, -1, + 174, 253, 173, 253, 173, 253, 175, -1, 4, -1, + 4, 171, 119, 171, 4, -1, 174, 264, 175, -1, + 4, 169, 253, 170, 171, 120, -1, 262, -1, 264, + 173, 262, -1, 266, -1, 4, -1, 4, 171, 4, + -1, 4, 169, 253, 170, 171, 4, -1, 5, -1, + 49, -1, 135, 167, 265, 168, -1, 136, 167, 265, + 173, 265, 168, -1, 40, 167, 265, 173, 265, 168, + -1, 41, 167, 265, 168, -1, 42, 167, 265, 168, + -1, 43, 167, 265, 173, 265, 173, 265, 168, -1, + 38, 167, 267, 168, -1, 38, 169, 267, 170, -1, + 39, 167, 265, 168, -1, 39, 169, 265, 170, -1, + 39, 167, 265, 173, 261, 168, -1, 39, 169, 265, + 173, 261, 170, -1, 265, -1, 267, 173, 265, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -1139,39 +1147,39 @@ static const yytype_uint16 yyrline[] = 1282, 1297, 1307, 1308, 1313, 1321, 1330, 1348, 1352, 1363, 1366, 1379, 1382, 1392, 1416, 1415, 1435, 1457, 1475, 1496, 1514, 1544, 1574, 1592, 1610, 1636, 1654, 1673, 1672, 1695, - 1713, 1752, 1758, 1764, 1771, 1796, 1821, 1838, 1855, 1887, - 1886, 1910, 1928, 1945, 1962, 1961, 1987, 1992, 1997, 2002, - 2007, 2012, 2035, 2041, 2052, 2053, 2058, 2061, 2065, 2088, - 2111, 2134, 2162, 2183, 2209, 2230, 2252, 2272, 2384, 2403, - 2441, 2550, 2559, 2565, 2580, 2608, 2625, 2634, 2648, 2654, - 2660, 2669, 2678, 2687, 2701, 2746, 2763, 2778, 2797, 2809, - 2833, 2837, 2842, 2849, 2855, 2860, 2866, 2870, 2874, 2879, - 2934, 2947, 2964, 2981, 3002, 3023, 3058, 3066, 3072, 3079, - 3083, 3092, 3100, 3108, 3117, 3116, 3130, 3129, 3143, 3142, - 3156, 3155, 3168, 3175, 3182, 3189, 3196, 3203, 3210, 3217, - 3224, 3232, 3231, 3244, 3243, 3256, 3255, 3268, 3267, 3280, - 3279, 3292, 3291, 3304, 3303, 3316, 3315, 3328, 3327, 3343, - 3346, 3352, 3364, 3384, 3407, 3411, 3415, 3419, 3423, 3427, - 3446, 3459, 3462, 3478, 3481, 3498, 3501, 3507, 3510, 3517, - 3573, 3643, 3648, 3715, 3751, 3759, 3802, 3841, 3861, 3888, - 3928, 3951, 3974, 3978, 3982, 4005, 4044, 4089, 4093, 4103, - 4138, 4139, 4140, 4144, 4150, 4162, 4180, 4208, 4209, 4210, - 4211, 4212, 4213, 4214, 4215, 4216, 4223, 4224, 4225, 4226, - 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, - 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, - 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4257, 4258, - 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, - 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4286, - 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4298, 4319, - 4338, 4356, 4368, 4385, 4406, 4411, 4416, 4426, 4436, 4441, - 4450, 4455, 4482, 4486, 4490, 4494, 4498, 4505, 4509, 4513, - 4517, 4524, 4529, 4536, 4541, 4545, 4550, 4554, 4562, 4573, - 4577, 4589, 4597, 4605, 4612, 4622, 4642, 4646, 4650, 4654, - 4658, 4687, 4716, 4745, 4774, 4784, 4794, 4807, 4819, 4831, - 4850, 4871, 4876, 4880, 4884, 4896, 4900, 4912, 4919, 4929, - 4933, 4948, 4953, 4960, 4964, 4977, 4985, 4996, 5000, 5008, - 5016, 5024, 5032, 5046, 5060, 5072, 5089, 5105, 5110, 5114, - 5134, 5156, 5161 + 1713, 1752, 1758, 1764, 1771, 1796, 1821, 1838, 1857, 1892, + 1891, 1915, 1933, 1950, 1967, 1966, 1992, 1997, 2002, 2007, + 2012, 2017, 2040, 2046, 2057, 2058, 2063, 2066, 2070, 2093, + 2116, 2139, 2167, 2188, 2214, 2235, 2257, 2277, 2389, 2408, + 2446, 2555, 2564, 2570, 2585, 2613, 2630, 2639, 2653, 2659, + 2665, 2674, 2683, 2692, 2706, 2751, 2768, 2783, 2802, 2814, + 2838, 2842, 2847, 2854, 2860, 2865, 2871, 2875, 2879, 2884, + 2939, 2952, 2969, 2986, 3007, 3028, 3063, 3071, 3077, 3084, + 3088, 3097, 3105, 3113, 3122, 3121, 3136, 3135, 3150, 3149, + 3164, 3163, 3177, 3184, 3191, 3198, 3205, 3212, 3219, 3226, + 3233, 3241, 3240, 3254, 3253, 3267, 3266, 3280, 3279, 3293, + 3292, 3306, 3305, 3319, 3318, 3332, 3331, 3345, 3344, 3361, + 3364, 3370, 3382, 3402, 3426, 3431, 3435, 3439, 3443, 3447, + 3451, 3455, 3459, 3463, 3467, 3486, 3499, 3502, 3518, 3521, + 3538, 3541, 3547, 3550, 3557, 3613, 3683, 3688, 3755, 3791, + 3799, 3842, 3881, 3901, 3928, 3968, 3991, 4014, 4018, 4022, + 4045, 4084, 4129, 4133, 4143, 4178, 4179, 4180, 4184, 4190, + 4202, 4220, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, + 4256, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, + 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, + 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, + 4292, 4293, 4294, 4297, 4298, 4299, 4300, 4301, 4302, 4303, + 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, + 4314, 4315, 4316, 4317, 4326, 4327, 4328, 4329, 4330, 4331, + 4332, 4333, 4334, 4338, 4359, 4378, 4396, 4408, 4425, 4446, + 4451, 4456, 4466, 4476, 4481, 4490, 4495, 4522, 4526, 4530, + 4534, 4538, 4545, 4549, 4553, 4557, 4564, 4569, 4576, 4581, + 4585, 4590, 4594, 4602, 4613, 4617, 4629, 4637, 4645, 4652, + 4662, 4682, 4686, 4690, 4694, 4698, 4727, 4756, 4785, 4814, + 4824, 4834, 4847, 4859, 4871, 4890, 4911, 4916, 4920, 4924, + 4936, 4940, 4952, 4959, 4969, 4973, 4988, 4993, 5000, 5004, + 5017, 5025, 5036, 5040, 5048, 5056, 5064, 5072, 5086, 5100, + 5112, 5129, 5145, 5150, 5154, 5174, 5196, 5201 }; #endif @@ -1197,8 +1205,9 @@ static const char *const yytname[] = "tUsing", "tPlugin", "tDegenerated", "tRecursive", "tRotate", "tTranslate", "tSymmetry", "tDilate", "tExtrude", "tLevelset", "tRecombine", "tSmoother", "tSplit", "tDelete", "tCoherence", - "tIntersect", "tMeshAlgorithm", "tReverse", "tLayers", "tHole", "tAlias", - "tAliasWithOptions", "tQuadTriDbl", "tQuadTriSngl", "tRecombLaterals", + "tIntersect", "tMeshAlgorithm", "tReverse", "tLayers", "tScaleLast", + "tHole", "tAlias", "tAliasWithOptions", "tQuadTriAddVerts", + "tQuadTriNoNewVerts", "tQuadTriSngl", "tQuadTriDbl", "tRecombLaterals", "tTransfQuadTri", "tText2D", "tText3D", "tInterpolationScheme", "tTime", "tCombine", "tBSpline", "tBezier", "tNurbs", "tNurbsOrder", "tNurbsKnots", "tColor", "tColorTable", "tFor", "tIn", "tEndFor", "tIf", @@ -1251,63 +1260,63 @@ static const yytype_uint16 yytoknum[] = 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, 63, 400, 401, 402, 403, - 60, 62, 404, 405, 43, 45, 42, 47, 37, 33, - 406, 407, 408, 94, 40, 41, 91, 93, 46, 35, - 44, 123, 125, 126 + 395, 396, 397, 398, 399, 400, 401, 402, 63, 403, + 404, 405, 406, 60, 62, 407, 408, 43, 45, 42, + 47, 37, 33, 409, 410, 411, 94, 40, 41, 91, + 93, 46, 35, 44, 123, 125, 126 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 174, 175, 175, 176, 176, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 178, 178, 179, 179, 179, 179, 179, 179, 180, - 180, 180, 181, 181, 181, 181, 181, 181, 182, 182, - 183, 183, 185, 186, 184, 187, 187, 189, 188, 190, - 190, 192, 191, 193, 193, 195, 194, 196, 196, 196, - 196, 196, 197, 197, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 199, 199, 200, 200, 200, 201, 200, - 200, 202, 200, 203, 203, 204, 204, 205, 205, 206, - 206, 206, 207, 207, 208, 208, 208, 209, 209, 210, - 210, 211, 211, 212, 213, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 214, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, - 212, 212, 212, 212, 216, 212, 217, 217, 217, 217, - 217, 217, 217, 217, 218, 218, 219, 219, 219, 219, - 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 221, 221, 221, 221, 221, 222, 222, 223, 223, - 223, 223, 223, 223, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 224, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 226, 226, 226, 227, 226, 228, 226, 229, 226, - 230, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 231, 226, 232, 226, 233, 226, 234, 226, 235, - 226, 236, 226, 237, 226, 238, 226, 239, 226, 240, - 240, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, - 248, 248, 248, 249, 249, 249, 249, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 252, 252, 252, 252, 252, 253, 253, 253, - 253, 254, 254, 255, 255, 255, 255, 255, 255, 256, - 256, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 258, 258, 258, 258, 259, 259, 259, 259, 260, - 260, 261, 261, 262, 262, 262, 262, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 264, 264 + 0, 177, 178, 178, 179, 179, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 181, 181, 182, 182, 182, 182, 182, 182, 183, + 183, 183, 184, 184, 184, 184, 184, 184, 185, 185, + 186, 186, 188, 189, 187, 190, 190, 192, 191, 193, + 193, 195, 194, 196, 196, 198, 197, 199, 199, 199, + 199, 199, 200, 200, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 202, 202, 203, 203, 203, 204, 203, + 203, 205, 203, 206, 206, 207, 207, 208, 208, 209, + 209, 209, 210, 210, 211, 211, 211, 212, 212, 213, + 213, 214, 214, 215, 216, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 217, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 215, 218, + 215, 215, 215, 215, 219, 215, 220, 220, 220, 220, + 220, 220, 220, 220, 221, 221, 222, 222, 222, 222, + 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 224, 224, 224, 224, 224, 225, 225, 226, 226, + 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 229, 229, 229, 230, 229, 231, 229, 232, 229, + 233, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 234, 229, 235, 229, 236, 229, 237, 229, 238, + 229, 239, 229, 240, 229, 241, 229, 242, 229, 243, + 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 245, 245, 246, 246, + 247, 247, 248, 248, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, + 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, + 255, 255, 256, 256, 256, 256, 257, 257, 258, 258, + 258, 258, 258, 258, 259, 259, 260, 260, 260, 260, + 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, + 260, 260, 260, 260, 260, 260, 261, 261, 261, 261, + 262, 262, 262, 262, 263, 263, 264, 264, 265, 265, + 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 267, 267 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1339,27 +1348,27 @@ static const yytype_uint8 yyr2[] = 0, 6, 8, 8, 8, 12, 12, 12, 14, 14, 14, 0, 12, 0, 12, 0, 12, 0, 16, 0, 16, 0, 16, 0, 18, 0, 18, 0, 18, 1, - 2, 5, 7, 9, 2, 2, 3, 2, 3, 9, - 6, 0, 3, 0, 1, 0, 2, 0, 2, 7, - 6, 8, 5, 3, 7, 5, 4, 6, 6, 12, - 10, 10, 10, 10, 10, 4, 4, 2, 3, 6, - 1, 1, 1, 2, 5, 7, 10, 1, 3, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, - 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, - 4, 4, 4, 4, 4, 6, 6, 6, 4, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 4, 4, 2, 5, 3, 6, 4, 7, 6, 6, - 6, 4, 1, 2, 2, 3, 3, 11, 9, 7, - 7, 1, 3, 1, 1, 2, 3, 4, 5, 1, - 1, 2, 3, 3, 5, 4, 2, 2, 2, 2, - 5, 5, 5, 5, 1, 1, 3, 3, 4, 6, - 6, 1, 1, 3, 3, 9, 7, 1, 5, 3, - 6, 1, 3, 1, 1, 3, 6, 1, 1, 4, - 6, 6, 4, 4, 8, 4, 4, 4, 4, 6, - 6, 1, 3 + 2, 5, 7, 9, 2, 2, 2, 3, 2, 3, + 2, 3, 2, 3, 9, 6, 0, 3, 0, 1, + 0, 2, 0, 2, 7, 6, 8, 5, 3, 7, + 5, 4, 6, 6, 12, 10, 10, 10, 10, 10, + 4, 4, 2, 3, 6, 1, 1, 1, 2, 5, + 7, 10, 1, 3, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 6, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, + 6, 6, 6, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 5, 4, 4, 2, 5, 3, + 6, 4, 7, 6, 6, 6, 4, 1, 2, 2, + 3, 3, 11, 9, 7, 7, 1, 3, 1, 1, + 2, 3, 4, 5, 1, 1, 2, 3, 3, 5, + 4, 2, 2, 2, 2, 5, 5, 5, 5, 1, + 1, 3, 3, 4, 6, 6, 1, 1, 3, 3, + 9, 7, 1, 5, 3, 6, 1, 3, 1, 1, + 3, 6, 1, 1, 4, 6, 6, 4, 4, 8, + 4, 4, 4, 4, 6, 6, 1, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1374,154 +1383,155 @@ static const yytype_uint16 yydefact[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 220, 0, 0, - 0, 217, 0, 0, 0, 0, 300, 301, 302, 0, + 0, 217, 0, 0, 0, 0, 305, 306, 307, 0, 5, 7, 6, 8, 9, 10, 19, 11, 12, 13, - 18, 17, 14, 15, 16, 0, 20, 369, 378, 447, - 57, 370, 371, 372, 0, 0, 0, 0, 0, 0, + 18, 17, 14, 15, 16, 0, 20, 374, 383, 452, + 57, 375, 376, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 448, 376, 377, 0, 0, 0, - 0, 373, 374, 375, 61, 60, 59, 58, 0, 0, + 0, 0, 0, 0, 453, 381, 382, 0, 0, 0, + 0, 378, 379, 380, 61, 60, 59, 58, 0, 0, 0, 63, 62, 0, 0, 0, 0, 166, 0, 0, - 0, 307, 0, 443, 0, 0, 0, 0, 203, 0, + 0, 312, 0, 448, 0, 0, 0, 0, 203, 0, 205, 202, 206, 207, 95, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 124, 137, 149, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 392, 0, 0, 0, 0, 0, 166, 0, 0, 0, + 397, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, - 297, 0, 0, 0, 0, 0, 0, 0, 378, 410, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 424, - 425, 403, 409, 0, 404, 0, 0, 0, 0, 437, + 302, 0, 0, 0, 0, 0, 0, 0, 383, 415, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, + 430, 408, 414, 0, 409, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 200, 201, 0, 0, 216, - 0, 166, 0, 166, 378, 0, 303, 0, 0, 0, - 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, + 0, 166, 0, 166, 383, 0, 308, 0, 0, 0, + 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 310, 309, 311, 0, 0, 0, 0, 0, + 0, 0, 315, 314, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 0, 164, 0, 72, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 194, 141, 0, - 444, 0, 443, 0, 0, 93, 93, 0, 0, 431, - 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 449, 0, 448, 0, 0, 93, 93, 0, 0, 436, + 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 275, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 166, 166, 0, 394, 393, + 280, 280, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166, 166, 0, 399, 398, 0, 0, 0, 0, 166, 166, 0, 0, 0, 0, 0, 0, 0, 230, 0, 166, 0, 0, 0, 0, - 0, 277, 0, 0, 0, 0, 184, 0, 0, 0, - 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 416, 0, 417, 418, 419, 0, 0, 0, - 0, 0, 309, 411, 0, 405, 0, 0, 0, 283, + 0, 282, 0, 0, 0, 0, 184, 0, 0, 0, + 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 421, 0, 422, 423, 424, 0, 0, 0, + 0, 0, 314, 416, 0, 410, 0, 0, 0, 288, 199, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 218, 188, 0, 189, 0, 0, 210, 0, 0, - 0, 0, 384, 0, 74, 0, 0, 0, 0, 0, + 0, 0, 389, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 461, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 308, 57, 0, 0, 0, 57, + 0, 0, 0, 0, 313, 57, 0, 0, 0, 57, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, - 167, 66, 0, 325, 324, 323, 322, 318, 319, 321, - 320, 313, 312, 314, 315, 316, 317, 0, 142, 0, + 167, 66, 0, 330, 329, 328, 327, 323, 324, 326, + 325, 318, 317, 319, 320, 321, 322, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 273, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 166, 0, - 0, 0, 0, 0, 396, 395, 0, 0, 0, 0, + 0, 0, 0, 0, 401, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, - 0, 0, 0, 286, 0, 0, 185, 0, 0, 181, - 0, 0, 0, 296, 295, 0, 0, 427, 0, 426, - 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, - 308, 406, 413, 0, 314, 412, 0, 0, 0, 0, + 0, 0, 0, 291, 0, 0, 185, 0, 0, 181, + 0, 0, 0, 301, 300, 0, 0, 432, 0, 431, + 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, + 313, 411, 418, 0, 319, 417, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 190, 192, 0, 0, - 0, 0, 380, 386, 0, 327, 348, 328, 349, 329, - 350, 330, 351, 331, 352, 332, 353, 333, 354, 334, - 355, 335, 356, 347, 368, 336, 357, 0, 0, 338, - 359, 339, 360, 340, 361, 341, 362, 342, 363, 343, - 364, 0, 0, 0, 0, 0, 0, 455, 0, 456, - 457, 0, 458, 0, 0, 452, 453, 0, 0, 0, - 391, 85, 0, 449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 79, 0, 0, 0, 0, 381, + 0, 0, 385, 391, 0, 332, 353, 333, 354, 334, + 355, 335, 356, 336, 357, 337, 358, 338, 359, 339, + 360, 340, 361, 352, 373, 341, 362, 0, 0, 343, + 364, 344, 365, 345, 366, 346, 367, 347, 368, 348, + 369, 0, 0, 0, 0, 0, 0, 460, 0, 461, + 462, 0, 463, 0, 0, 457, 458, 0, 0, 0, + 396, 85, 0, 454, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 42, 0, 0, 0, 55, - 0, 33, 34, 35, 36, 37, 0, 445, 23, 21, + 0, 33, 34, 35, 36, 37, 0, 450, 23, 21, 0, 0, 24, 0, 0, 64, 96, 65, 104, 0, - 433, 434, 0, 0, 0, 0, 0, 0, 0, 0, + 438, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 271, 276, 274, 0, 282, 0, 0, 117, 118, 0, + 276, 281, 279, 0, 287, 0, 0, 117, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 193, 0, 0, 0, 156, 158, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, - 221, 0, 0, 0, 0, 0, 0, 278, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 380, 428, 415, 0, 0, 0, 0, 407, 0, 0, - 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, - 0, 0, 304, 0, 0, 383, 0, 379, 0, 0, - 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, - 0, 0, 0, 73, 75, 77, 0, 0, 441, 0, - 83, 0, 0, 0, 0, 326, 0, 0, 0, 0, - 0, 29, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 121, 121, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, - 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, - 0, 288, 0, 0, 187, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 0, 0, 265, 0, 267, - 0, 231, 260, 0, 0, 0, 179, 0, 0, 0, - 287, 0, 183, 182, 299, 0, 0, 30, 31, 0, - 0, 0, 420, 421, 422, 423, 414, 408, 0, 0, - 0, 438, 0, 0, 0, 211, 0, 0, 0, 0, - 196, 385, 195, 337, 358, 344, 365, 345, 366, 346, - 367, 459, 460, 451, 0, 389, 390, 388, 450, 0, - 69, 0, 57, 0, 0, 0, 0, 68, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 401, 0, 0, 25, 26, 0, 27, 0, 0, 97, - 100, 123, 0, 0, 0, 0, 0, 0, 127, 0, - 0, 144, 145, 0, 0, 129, 152, 0, 0, 0, - 0, 119, 0, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 0, 0, 0, 0, 166, 166, - 0, 241, 0, 243, 0, 245, 0, 403, 0, 0, - 266, 268, 0, 0, 225, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 430, 429, 385, 132, 133, - 0, 0, 0, 0, 86, 90, 0, 0, 305, 387, + 0, 259, 0, 221, 0, 0, 0, 0, 0, 0, + 283, 290, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 385, 433, 420, 0, 0, 0, 0, + 412, 0, 0, 0, 0, 0, 0, 0, 186, 0, + 0, 0, 0, 0, 0, 309, 0, 0, 388, 0, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 467, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 67, 0, 0, 0, 0, 0, 73, 75, 77, 0, + 0, 446, 0, 83, 0, 0, 0, 0, 331, 0, + 0, 0, 0, 0, 29, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, + 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, + 0, 0, 0, 0, 293, 0, 0, 187, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 265, 0, 264, + 0, 270, 0, 272, 0, 266, 0, 268, 0, 231, + 260, 0, 0, 0, 179, 0, 0, 0, 292, 0, + 183, 182, 304, 0, 0, 30, 31, 0, 0, 0, + 425, 426, 427, 428, 419, 413, 0, 0, 0, 443, + 0, 0, 0, 211, 0, 0, 0, 0, 196, 390, + 195, 342, 363, 349, 370, 350, 371, 351, 372, 464, + 465, 456, 0, 394, 395, 393, 455, 0, 69, 0, + 57, 0, 0, 0, 0, 68, 0, 0, 0, 444, + 0, 0, 0, 0, 0, 0, 0, 0, 406, 0, + 0, 25, 26, 0, 27, 0, 0, 97, 100, 123, + 0, 0, 0, 0, 0, 0, 127, 0, 0, 144, + 145, 0, 0, 129, 152, 0, 0, 0, 0, 119, + 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 0, 0, 0, 0, 166, 166, 0, 241, + 0, 243, 0, 245, 0, 408, 0, 0, 271, 273, + 267, 269, 0, 0, 225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 289, 435, 434, 390, 132, 133, + 0, 0, 0, 0, 86, 90, 0, 0, 310, 392, 0, 0, 0, 0, 0, 80, 0, 0, 81, 0, - 442, 168, 169, 170, 171, 0, 38, 0, 0, 0, - 0, 0, 40, 446, 0, 0, 98, 101, 0, 0, - 122, 130, 131, 135, 0, 0, 146, 0, 0, 281, - 0, 139, 0, 0, 272, 151, 0, 0, 0, 0, - 136, 0, 147, 153, 0, 0, 0, 0, 400, 0, - 399, 0, 0, 0, 232, 0, 0, 233, 0, 0, + 447, 168, 169, 170, 171, 0, 38, 0, 0, 0, + 0, 0, 40, 451, 0, 0, 98, 101, 0, 0, + 122, 130, 131, 135, 0, 0, 146, 0, 0, 286, + 0, 139, 0, 0, 277, 151, 0, 0, 0, 0, + 136, 0, 147, 153, 0, 0, 0, 0, 405, 0, + 404, 0, 0, 0, 232, 0, 0, 233, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 177, 0, 0, 0, 172, 0, 0, 0, 0, - 436, 0, 213, 212, 0, 0, 0, 0, 454, 71, + 441, 0, 213, 212, 0, 0, 0, 0, 459, 71, 70, 76, 78, 0, 84, 0, 43, 0, 0, 0, - 402, 0, 0, 0, 28, 0, 107, 112, 0, 0, + 407, 0, 0, 0, 28, 0, 107, 112, 0, 0, 0, 0, 0, 0, 0, 0, 140, 125, 138, 150, 155, 0, 0, 91, 92, 166, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 166, 0, 0, 0, 0, 0, 163, 162, 0, 0, 0, - 0, 87, 88, 0, 0, 440, 0, 39, 0, 0, - 0, 41, 56, 0, 0, 0, 290, 292, 291, 293, - 294, 143, 0, 0, 0, 0, 0, 0, 398, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 270, 0, - 0, 0, 226, 0, 0, 173, 0, 0, 0, 435, - 214, 0, 306, 82, 0, 0, 0, 0, 0, 0, + 0, 87, 88, 0, 0, 445, 0, 39, 0, 0, + 0, 41, 56, 0, 0, 0, 295, 297, 296, 298, + 299, 143, 0, 0, 0, 0, 0, 0, 403, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 226, 0, 0, 173, 0, 0, 0, 440, + 214, 0, 311, 82, 0, 0, 0, 0, 0, 0, 99, 108, 0, 102, 113, 0, 0, 0, 0, 157, 0, 247, 0, 0, 249, 0, 0, 251, 0, 0, 0, 262, 0, 222, 0, 166, 0, 0, 0, 134, 89, 0, 47, 0, 53, 0, 0, 0, 0, 0, - 120, 148, 289, 397, 235, 0, 0, 242, 236, 0, + 120, 148, 294, 402, 235, 0, 0, 242, 236, 0, 0, 244, 237, 0, 0, 246, 0, 0, 0, 228, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 109, 111, 0, 114, 115, 0, 0, 253, 0, 255, - 0, 257, 263, 269, 227, 223, 0, 0, 0, 0, - 44, 0, 51, 0, 0, 0, 431, 0, 0, 0, + 0, 257, 263, 274, 227, 223, 0, 0, 0, 0, + 44, 0, 51, 0, 0, 0, 436, 0, 0, 0, 238, 0, 0, 239, 0, 0, 240, 0, 0, 180, 0, 174, 0, 45, 0, 0, 204, 0, 110, 0, 116, 0, 0, 0, 0, 0, 0, 0, 229, 0, @@ -1534,531 +1544,511 @@ static const yytype_uint16 yydefact[] = /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 2, 3, 80, 840, 81, 82, 617, 1245, 1251, - 831, 996, 1396, 1562, 832, 1515, 1596, 833, 1564, 834, - 835, 1000, 158, 293, 83, 628, 395, 1346, 1347, 396, - 1545, 1404, 1451, 1405, 1454, 876, 1273, 1155, 600, 423, + -1, 2, 3, 80, 840, 81, 82, 617, 1255, 1261, + 831, 999, 1406, 1572, 832, 1525, 1606, 833, 1574, 834, + 835, 1003, 158, 293, 83, 628, 395, 1356, 1357, 396, + 1555, 1414, 1461, 1415, 1464, 876, 1283, 1163, 600, 423, 424, 425, 426, 259, 366, 367, 86, 87, 88, 89, - 90, 91, 260, 911, 1474, 1536, 683, 1295, 1298, 1301, - 1495, 1499, 1503, 1551, 1554, 1557, 907, 908, 1031, 873, + 90, 91, 260, 914, 1484, 1546, 683, 1305, 1308, 1311, + 1505, 1509, 1513, 1561, 1564, 1567, 910, 911, 1034, 873, 654, 692, 93, 94, 95, 96, 261, 161, 439, 220, - 1139, 262, 263, 264, 496, 271, 818, 989, 567, 392, + 1147, 262, 263, 264, 496, 271, 818, 992, 567, 392, 568 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -1204 +#define YYPACT_NINF -1208 static const yytype_int16 yypact[] = { - 4748, 20, 62, 4843, -1204, -1204, 2459, 124, -17, -130, - -9, -3, 143, 160, 198, 228, 100, 109, -82, 51, - 95, 9, 117, 137, 21, 149, 167, 239, 299, 308, - 373, 238, 350, 360, 244, 379, 548, 472, 210, 274, - 388, -16, 315, 82, 82, 341, 297, 34, -21, 456, - 406, 19, 40, 478, 465, 432, 559, 569, 2659, 594, - 392, 440, 463, 23, 37, -1204, 473, -1204, 607, 613, - 491, -1204, 659, 665, 13, 27, -1204, -1204, -1204, 1418, - -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, -1204, 36, -1204, -1204, 8, -1204, - 662, -1204, -1204, -1204, 190, 296, 309, 403, 430, 457, - 467, 508, 528, 551, 552, 571, 593, 617, 623, 636, - 637, 640, 641, 646, 647, 650, 672, 512, 529, 543, - 570, 612, 616, 622, -1204, -1204, -1204, 751, 626, 651, - 654, -1204, -1204, -1204, -1204, -1204, -1204, -1204, 1418, 1418, - 1418, -1204, -1204, 4240, 2405, 47, 767, 355, 3000, 840, - 1015, -1204, 684, 850, 870, 1418, 475, 475, -1204, 1418, - -1204, -1204, -1204, -1204, -1204, -1204, 1418, 4447, 1418, 1418, - 669, 1418, 4447, 1418, 1418, 713, 4447, 1418, 1418, 3000, - 716, 714, -1204, 4447, 773, 789, 2659, 2659, 2659, 794, - -1204, -1204, -1204, -1204, 795, 813, 814, 3000, 1418, 927, - 3000, 23, 757, 819, 82, 82, 82, 1418, 1418, -115, - -1204, -97, 82, 820, 833, 836, 4284, -78, -62, 834, - 837, 848, 2659, 2659, 3000, 868, 25, 778, -1204, 1011, - -1204, 845, 851, 874, 2659, 2659, 880, 888, 138, -1204, - 894, 28, 1031, 1067, 1075, 600, 3163, 1418, 371, -1204, - -1204, 169, -1204, 1055, -1204, 1059, 1418, 1418, 1418, 898, - 1418, 928, 984, 1418, 1418, -1204, -1204, 1418, 1080, -1204, - 1103, -1204, 1104, -1204, 303, 1184, -1204, 3000, 3000, 947, - 1418, 1116, 950, -1204, 1127, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 475, 475, 475, - 475, 475, 475, 475, 475, 475, 475, 475, 1418, 475, - 475, 475, 977, 977, 977, 4447, 7187, 136, 4447, 6428, - 209, 976, 1145, 987, 1004, -1204, 1023, 3899, 1170, -1204, - -1204, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, -1204, -1204, -1204, 1348, - 673, -71, -1204, 41, 5700, 468, 479, 7208, 4447, 575, - -1204, 670, 7229, 7250, 1418, 7271, 680, 7292, 7313, 1418, - 681, 7334, 7355, 1192, 1418, 1418, 699, 1418, 1418, 1195, - 1212, 1212, 1418, 1058, 1062, 1071, 1078, 1418, 1418, 1418, - 1232, 5620, 1081, 1241, 1090, -1204, -1204, 88, -1204, -1204, - 5726, 5752, 82, 82, 355, 355, 113, 1418, 1418, 1418, - 4284, 4284, 1418, 3899, 187, -1204, 1418, 1418, 1418, 1418, - 1418, 1245, 1256, 1276, 1418, 1278, -1204, 1418, 1418, 488, - -1204, 4447, 4447, 4447, 1297, 1298, 1418, 1418, 80, 4071, - 1301, 1306, -1204, 1418, -1204, -1204, -1204, 1142, 1144, 1146, - 1147, 4447, 977, -1204, 7376, -1204, 702, 1418, 3326, -1204, - -1204, 7397, 7418, 7439, 1196, 5778, -1204, 1148, 4511, 7460, - 6451, -1204, -1204, 2035, -1204, 2119, 1418, -1204, 1157, 703, - 1418, 6474, 265, 1418, -1204, 7481, 6497, 7502, 6520, 7523, - 6543, 7544, 6566, 7565, 6589, 7586, 6612, 7607, 6635, 7628, - 6658, 7649, 6681, 7670, 6704, 7691, 6727, 5804, 5830, 7712, - 6750, 7733, 6773, 7754, 6796, 7775, 6819, 7796, 6842, 7817, - 6865, 5856, 5882, 5908, 5934, 5960, 5986, -1204, 213, 480, - 255, 481, 1155, 1161, 1163, 1173, 1174, 1175, 263, 1518, - 1176, 1183, 1179, 771, 136, -1204, 3000, 775, 205, 662, - 1418, 1344, 1347, 24, 1185, -1204, 67, 11, 26, 83, - -1204, -1204, 4530, 1123, 1139, 830, 830, 592, 592, 592, - 592, 106, 106, 977, 977, 977, 977, 33, -1204, 1418, - 1349, 3, 4447, 1350, 4447, 1418, 1351, -1204, 1356, 1355, - 475, 1358, 4447, 4447, 1236, 1359, 1360, 7838, 1361, 1243, - 1362, 1363, 7859, 1244, 1364, 1371, 1418, 7880, 4892, 1208, - 7901, 7922, 1418, 3000, 1376, 1375, 7943, 4604, 4604, 4604, - 4604, 7964, 7985, 8006, 3000, 4447, 1215, -1204, -1204, 2887, - 3040, 82, 1418, 1418, -1204, -1204, 1213, 1214, 4284, 6012, - 6038, 6064, 5674, -30, 82, 3203, 8027, 4920, 8048, 8069, - 8090, 1418, 1381, -1204, 1418, 8111, -1204, 6888, 6911, -1204, - 824, 827, 853, -1204, -1204, 6934, 6957, -1204, 4447, -1204, - 4447, 6980, -91, 1221, 4948, 4447, 4447, 4447, 4447, 856, - -1204, -1204, 4551, 4447, 977, -1204, 1382, 1384, 1387, 1227, - 1418, 3366, 1418, 1418, -1204, 15, -1204, -1204, 1225, 3000, - 1392, 7003, 449, -1204, 4976, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, -1204, -1204, -1204, 1418, 1418, -1204, - -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, 1418, 1418, 1418, 1418, 1418, 1418, -1204, 475, -1204, - -1204, 4447, -1204, 4447, 475, -1204, -1204, 475, 475, 475, - -1204, -1204, 1418, -1204, 475, 1234, 1418, 1394, 1235, 93, - 1418, 1397, 1399, 1736, -1204, 1400, 1251, 23, 1403, -1204, - 4447, 4447, 4447, 4447, 1418, -1204, 1246, 1254, 1249, -1204, - 1417, -1204, -1204, -1204, -1204, -1204, 7026, -1204, -1204, 1273, - 475, 362, -1204, 372, 6090, -1204, 1419, -1204, -1204, 82, - 575, -1204, 779, 3000, 3000, 1423, 3000, 963, 3000, 3000, - 1424, 1388, 3000, 3000, 1789, 1446, 1448, 4447, 1449, 1450, - 674, -1204, -1204, 1453, -1204, 1454, 1260, 8342, -1204, 1295, - 1300, 1302, 1459, 1463, 1464, 1466, 861, 1469, 3529, -1204, - -1204, 214, 6116, 6142, -1204, -1204, 5004, -119, 82, 82, - 82, 1470, 1471, 1304, 1312, 46, 49, -15, -1204, 253, - -1204, -30, 1472, 1474, 1477, 1478, 1479, 8342, -1204, 2202, - 1307, 1475, 1481, 1482, 1426, 1418, 1485, 1501, 865, 899, - 424, -1204, -1204, 903, 906, 907, 911, -1204, 1418, 915, - 3000, 3000, 3000, 1504, 6168, -1204, 4571, 533, 1505, 1506, - 3000, 1340, -1204, 1508, 1513, -1204, 1509, -1204, 8132, 7049, - 8153, 7072, 8174, 7095, 8195, 7118, -1204, 455, 501, 1353, - 1352, 1354, 1365, 8216, 1366, 136, 2488, -1204, 136, 269, - 1357, 1514, 2610, -1204, -1204, -1204, 23, 1418, -1204, 920, - -1204, 921, 924, 925, 930, 8342, 1369, 1418, 1418, 3000, - 1367, -1204, 1368, -1204, 1517, 57, 1520, 1418, 3815, 48, - 1370, 1372, 1447, 1447, 3000, 1521, 1373, 1374, 1522, 1528, - 3000, 1377, 1531, 1533, -1204, 1535, 3000, 934, 3000, 3000, - 1538, 1540, -1204, 3000, 1543, 1544, 1545, 1547, 3000, 3000, - 3000, -1204, 1548, 745, -1204, 1418, 1418, 1418, 1389, 1390, - -106, -69, -64, 1393, -1204, 3000, 1418, -1204, 1541, -1204, - 1556, -1204, -1204, 4284, 542, 2837, -1204, 1395, 1396, 3489, - -1204, 4447, -1204, -1204, -1204, 1398, 3603, -1204, -1204, 1405, - 1401, 1559, -1204, -1204, -1204, -1204, 8342, -1204, 1565, 1569, - 1465, -1204, 1418, 1418, 1418, -1204, 1573, 790, 1411, 1577, - -1204, 397, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, 475, -1204, -1204, -1204, -1204, 3000, - -1204, 3000, 662, 1418, 1578, 1561, 24, -1204, 1579, 7141, - 23, -1204, 1580, 1584, 1585, 1586, 1418, 6194, 6220, 946, - -1204, 1418, 1589, -1204, -1204, 475, -1204, 6246, 4604, 8342, - -1204, -1204, 1418, 1418, 82, 1590, 1594, 1595, -1204, 1418, - 1418, -1204, -1204, 1596, 1418, -1204, -1204, 1598, 1602, 1433, - 1603, 1476, 1418, -1204, 1604, 3000, 3000, 3000, 3000, 1605, - 1141, 1606, 1418, -1204, 4604, 5032, 8237, 2630, 355, 355, - 82, 1607, 82, 1608, 82, 1609, 1418, 72, 1451, 8258, - -1204, -1204, 5060, 264, -1204, 1610, 101, 1611, 3000, 82, - 101, 1612, 978, 1418, -1204, -1204, -1204, -91, -1204, -1204, - 3000, 4836, 140, 8279, -1204, -1204, 3864, 3000, -1204, -1204, - 1457, 1613, 1617, 1618, 3624, -1204, 1619, 1621, -1204, 1460, - -1204, -1204, -1204, -1204, -1204, 464, 8342, 1418, 1418, 3000, - 1458, 979, 8342, -1204, 1624, 1418, 8342, -1204, 5088, 5116, - 340, -1204, -1204, -1204, 5144, 5172, -1204, 5200, 1628, -1204, - 3000, -1204, 1572, 1629, 8342, -1204, 1633, 1634, 1635, 1636, - -1204, 1473, -1204, -1204, 5647, 3778, 1637, 1480, -1204, 1418, - -1204, 1483, 1484, 327, -1204, 1486, 329, -1204, 1487, 349, - -1204, 1488, 7164, 1639, 3000, 1641, 1489, 1418, -1204, 3652, - 351, -1204, 1010, 353, 390, -1204, 1643, 5228, 1536, 1418, - -1204, 1418, -1204, -1204, 4447, 3981, 1646, 1507, -1204, -1204, - -1204, -1204, -1204, 23, -1204, 1560, -1204, 1418, 6272, 6298, - -1204, 3000, 1418, 1647, -1204, 6324, -1204, -1204, 1655, 1672, - 1674, 1676, 1680, 1681, 1013, 1519, -1204, -1204, -1204, -1204, - -1204, 3000, 4447, -1204, -1204, 355, 4864, -1204, -1204, 4284, - -30, 4284, -30, 4284, -30, 1683, -1204, 1014, 3000, -1204, - 5256, 82, 1685, 4447, 82, -1204, -1204, 1418, 5284, 5312, - 1021, -1204, -1204, 1686, 1688, -1204, 1524, 8342, 1418, 1418, - 1024, 8342, -1204, 1418, 1028, 1033, -1204, -1204, -1204, -1204, - -1204, -1204, 1525, 1418, 1036, 1037, 1526, 1418, -1204, 5340, - 417, 663, 5368, 421, 764, 5396, 423, 780, -1204, 3000, - 1693, 1620, 4111, 1530, 425, -1204, 1042, 435, 4193, -1204, - -1204, 1696, -1204, -1204, 1418, 8300, 6350, 1, 6376, 1699, - -1204, -1204, 1701, -1204, -1204, 1418, 5424, 1702, 1703, -1204, - 5452, 1704, 1418, 1705, 1706, 1418, 1707, 1709, 1418, 1710, - 1546, -1204, 1418, -1204, -30, -1204, 4447, 1711, 3652, -1204, - -1204, 1048, -1204, 1418, -1204, 3000, 1418, 2235, 4027, 6402, - -1204, -1204, -1204, -1204, -1204, 1549, 5480, -1204, -1204, 1550, - 5508, -1204, -1204, 1551, 5536, -1204, 1713, 4212, 852, 4324, - 1060, -1204, 448, 1061, 1717, 1553, 8321, 1064, 5564, 371, - -1204, -1204, 475, 8342, -1204, 1418, -30, 1719, -30, 1720, - -30, 1722, -1204, -1204, -1204, -1204, -30, 1723, 4447, 1724, - -1204, 475, -1204, 1562, 1725, 1068, 4400, 1087, 5592, 858, - -1204, 1563, 912, -1204, 1564, 954, -1204, 1566, 1025, -1204, - 1088, -1204, 1095, -1204, 1567, 3000, -1204, 1418, -1204, 662, - -1204, 1730, 1734, -30, 1735, -30, 1739, -30, -1204, 1740, - 475, 1741, 475, 1096, 4419, -1204, -1204, -1204, 1032, -1204, - 1039, -1204, 1056, -1204, -1204, -1204, 1128, -1204, 1742, 662, - 1743, 1746, 1747, 475, 1748, -1204, -1204, -1204, -1204, -1204, - -1204, -1204 + 4862, 4, 76, 4961, -1208, -1208, 2615, 7, -22, -82, + -78, 22, 205, 212, 240, 250, -59, 118, -129, 99, + 103, 5, 124, 130, 9, 161, 165, 252, 327, 355, + 407, 248, 366, 378, 265, 372, 214, 308, 95, 302, + 416, -70, 312, 63, 63, 315, 218, 36, 143, 435, + 439, 8, 33, 444, 442, 101, 567, 579, 2787, 582, + 452, 458, 466, 11, 30, -1208, 470, -1208, 600, 603, + 471, -1208, 652, 667, 16, 17, -1208, -1208, -1208, 4672, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, -1208, -1208, -1208, 19, -1208, -1208, 2, -1208, + 762, -1208, -1208, -1208, 259, 436, 453, 461, 469, 474, + 490, 493, 494, 503, 511, 534, 543, 544, 575, 587, + 594, 595, 601, 605, 609, 610, 614, 512, 515, 516, + 519, 520, 528, 539, -1208, -1208, -1208, 700, 563, 564, + 572, -1208, -1208, -1208, -1208, -1208, -1208, -1208, 4672, 4672, + 4672, -1208, -1208, 4258, 97, 20, 739, 472, 3119, 752, + 568, -1208, 573, 759, 763, 4672, 419, 419, -1208, 4672, + -1208, -1208, -1208, -1208, -1208, -1208, 4672, 4468, 4672, 4672, + 623, 4672, 4468, 4672, 4672, 627, 4468, 4672, 4672, 3119, + 632, 648, -1208, 4468, 642, 647, 2787, 2787, 2787, 656, + -1208, -1208, -1208, -1208, 680, 681, 684, 3119, 4672, 785, + 3119, 11, 653, 663, 63, 63, 63, 4672, 4672, 84, + -1208, 91, 63, 678, 694, 713, 4424, 94, 3, 721, + 729, 732, 2787, 2787, 3119, 733, 26, 650, -1208, 866, + -1208, 736, 743, 756, 2787, 2787, 696, 734, 581, -1208, + 754, 18, 913, 926, 931, 502, 3285, 4672, 2233, -1208, + -1208, 1675, -1208, 965, -1208, 969, 4672, 4672, 4672, 809, + 4672, 814, 861, 4672, 4672, -1208, -1208, 4672, 985, -1208, + 998, -1208, 1006, -1208, 533, 1020, -1208, 3119, 3119, 827, + 4672, 1013, 847, -1208, 1019, 4672, 4672, 4672, 4672, 4672, + 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, + 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, + 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, + 4672, 4672, 4672, 4672, 4672, 4672, 4672, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 4672, 419, + 419, 419, 898, 898, 898, 4468, 7395, 80, 4468, 6636, + 177, 897, 1058, 917, 935, -1208, 907, 5047, 1067, -1208, + -1208, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, 4672, + 4672, 4672, 4672, 4672, 4672, 4672, -1208, -1208, -1208, 1154, + 615, -102, -1208, 113, 5908, -71, 49, 7416, 4468, 3904, + -1208, 612, 7437, 7458, 4672, 7479, 622, 7500, 7521, 4672, + 640, 7542, 7563, 1084, 4672, 4672, 645, 4672, 4672, 1098, + 1103, 1103, 4672, 944, 945, 947, 948, 4672, 4672, 4672, + 1110, 5828, 950, 1113, 946, -1208, -1208, -83, -1208, -1208, + 5934, 5960, 63, 63, 472, 472, 71, 4672, 4672, 4672, + 4424, 4424, 4672, 5047, 104, -1208, 4672, 4672, 4672, 4672, + 4672, 1114, 1116, 1117, 4672, 1121, -1208, 4672, 4672, 900, + -1208, 4468, 4468, 4468, 1122, 1123, 4672, 4672, -127, 4208, + 1131, 1137, -1208, 4672, -1208, -1208, -1208, 968, 970, 972, + 978, 4468, 898, -1208, 7584, -1208, 660, 4672, 3451, -1208, + -1208, 7605, 7626, 7647, 1024, 5986, -1208, 983, 4576, 7668, + 6659, -1208, -1208, 1603, -1208, 1805, 4672, -1208, 991, 665, + 4672, 6682, 153, 4672, -1208, 7689, 6705, 7710, 6728, 7731, + 6751, 7752, 6774, 7773, 6797, 7794, 6820, 7815, 6843, 7836, + 6866, 7857, 6889, 7878, 6912, 7899, 6935, 6012, 6038, 7920, + 6958, 7941, 6981, 7962, 7004, 7983, 7027, 8004, 7050, 8025, + 7073, 6064, 6090, 6116, 6142, 6168, 6194, -1208, 117, 90, + 210, 190, 989, 993, 996, 1009, 1011, 1012, 211, 1774, + 1017, 1023, 1021, 670, 80, -1208, 3119, 671, 148, 762, + 4672, 1160, 1188, 14, 1025, -1208, 38, 13, 15, 41, + -1208, -1208, 4595, 2046, 1866, 701, 701, 421, 421, 421, + 421, 457, 457, 898, 898, 898, 898, 23, -1208, 4672, + 1189, 27, 4468, 1192, 4468, 4672, 1194, -1208, 1197, 1196, + 419, 1198, 4468, 4468, 1081, 1199, 1202, 8046, 1203, 1082, + 1204, 1205, 8067, 1091, 1207, 1208, 4672, 8088, 5100, 1042, + 8109, 8130, 4672, 3119, 1216, 1218, 8151, 4628, 4628, 4628, + 4628, 8172, 8193, 8214, 3119, 4468, 1051, -1208, -1208, 1836, + 1926, 63, 4672, 4672, -1208, -1208, 1054, 1055, 4424, 6220, + 6246, 6272, 5882, 349, 63, 2650, 8235, 5128, 8256, 8277, + 8298, 4672, 1220, -1208, 4672, 8319, -1208, 7096, 7119, -1208, + 691, 698, 705, -1208, -1208, 7142, 7165, -1208, 4468, -1208, + 4468, 7188, -27, 1062, 5156, 4468, 4468, 4468, 4468, 706, + -1208, -1208, 4699, 4468, 898, -1208, 1226, 1227, 1228, 1065, + 4672, 2827, 4672, 4672, -1208, 29, -1208, -1208, 1064, 3119, + 1233, 7211, 39, -1208, 5184, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, 4672, 4672, -1208, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, 4672, 4672, 4672, 4672, 4672, 4672, -1208, 419, -1208, + -1208, 4468, -1208, 4468, 419, -1208, -1208, 419, 419, 419, + -1208, -1208, 4672, -1208, 419, 1074, 4672, 1237, 1075, 31, + 4672, 1238, 1241, 2004, -1208, 1242, 1079, 11, 1244, -1208, + 4468, 4468, 4468, 4468, 4672, -1208, 1085, 1086, 1080, -1208, + 1250, -1208, -1208, -1208, -1208, -1208, 7234, -1208, -1208, 1104, + 419, 229, -1208, 264, 6298, -1208, 1254, -1208, -1208, 63, + 3904, -1208, 744, 3119, 3119, 1257, 3119, 819, 3119, 3119, + 1261, 1206, 3119, 3119, 2181, 1262, 1266, 4468, 1267, 1269, + 4984, -1208, -1208, 1265, -1208, 1275, 1119, 8550, -1208, 1124, + 1125, 1126, 1282, 1283, 1284, 1289, 711, 1293, 2993, -1208, + -1208, 116, 6324, 6350, -1208, -1208, 5212, -12, 63, 63, + 63, 1294, 1295, 1142, 1315, 1132, 42, 45, 46, 47, + 398, -1208, 157, -1208, 349, 1316, 1318, 1319, 1321, 1339, + 8550, -1208, 2263, 1148, 1343, 1350, 1351, 1296, 4672, 1353, + 1365, 718, 719, -68, -1208, -1208, 731, 741, 749, 753, + -1208, 4672, 766, 3119, 3119, 3119, 1368, 6376, -1208, 4730, + 894, 1370, 1376, 3119, 1201, -1208, 1375, 1378, -1208, 1377, + -1208, 8340, 7257, 8361, 7280, 8382, 7303, 8403, 7326, -1208, + 297, 236, 1219, 1213, 1222, 1223, 8424, 1224, 80, 2420, + -1208, 80, 243, 1217, 1386, 2519, -1208, -1208, -1208, 11, + 4672, -1208, 769, -1208, 770, 773, 778, 782, 8550, 1229, + 4672, 4672, 3119, 1221, -1208, 1230, -1208, 1388, 40, 1392, + 4672, 3949, 44, 1225, 1231, 1330, 1330, 3119, 1400, 1234, + 1236, 1405, 1407, 3119, 1240, 1410, 1411, -1208, 1413, 3119, + 797, 3119, 3119, 1415, 1414, -1208, 3119, 1416, 1418, 1422, + 1423, 3119, 3119, 3119, -1208, 1424, 162, -1208, 4672, 4672, + 4672, 1248, 1260, -103, -89, 59, 1272, -1208, 3119, -1208, + 4672, -1208, 1429, -1208, 1430, -1208, 1432, -1208, 1436, -1208, + -1208, 4424, 726, 2953, -1208, 1270, 1271, 3617, -1208, 4468, + -1208, -1208, -1208, 1273, 2539, -1208, -1208, 1278, 1279, 1444, + -1208, -1208, -1208, -1208, 8550, -1208, 1445, 1446, 1332, -1208, + 4672, 4672, 4672, -1208, 1448, 374, 1286, 1455, -1208, 484, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, 419, -1208, -1208, -1208, -1208, 3119, -1208, 3119, + 762, 4672, 1456, 1459, 14, -1208, 1458, 7349, 11, -1208, + 1460, 1462, 1463, 1466, 4672, 6402, 6428, 806, -1208, 4672, + 1461, -1208, -1208, 419, -1208, 6454, 4628, 8550, -1208, -1208, + 4672, 4672, 63, 1467, 1470, 1471, -1208, 4672, 4672, -1208, + -1208, 1481, 4672, -1208, -1208, 1494, 1495, 1326, 1497, 1382, + 4672, -1208, 1499, 3119, 3119, 3119, 3119, 1504, 988, 1509, + 4672, -1208, 4628, 5240, 8445, 5016, 472, 472, 63, 1511, + 63, 1513, 63, 1529, 4672, 150, 1364, 8466, -1208, -1208, + -1208, -1208, 5268, 204, -1208, 1533, 2052, 1537, 3119, 63, + 2052, 1538, 822, 4672, -1208, -1208, -1208, -27, -1208, -1208, + 3119, 5044, 198, 8487, -1208, -1208, 3998, 3119, -1208, -1208, + 1379, 1543, 1544, 1547, 3399, -1208, 1549, 1548, -1208, 1387, + -1208, -1208, -1208, -1208, -1208, 299, 8550, 4672, 4672, 3119, + 1383, 832, 8550, -1208, 1553, 4672, 8550, -1208, 5296, 5324, + 324, -1208, -1208, -1208, 5352, 5380, -1208, 5408, 1556, -1208, + 3119, -1208, 1501, 1559, 8550, -1208, 1562, 1567, 1573, 1574, + -1208, 1417, -1208, -1208, 5855, 3418, 1575, 1419, -1208, 4672, + -1208, 1412, 1420, 254, -1208, 1425, 258, -1208, 1427, 260, + -1208, 1428, 7372, 1576, 3119, 1578, 1431, 4672, -1208, 3783, + 263, -1208, 836, 283, 293, -1208, 1582, 5436, 1473, 4672, + -1208, 4672, -1208, -1208, 4468, 3574, 1586, 1433, -1208, -1208, + -1208, -1208, -1208, 11, -1208, 1474, -1208, 4672, 6480, 6506, + -1208, 3119, 4672, 1591, -1208, 6532, -1208, -1208, 1597, 1600, + 1605, 1606, 1607, 1611, 845, 1435, -1208, -1208, -1208, -1208, + -1208, 3119, 4468, -1208, -1208, 472, 5072, -1208, -1208, 4424, + 349, 4424, 349, 4424, 349, 1612, -1208, 849, 3119, -1208, + 5464, 63, 1613, 4468, 63, -1208, -1208, 4672, 5492, 5520, + 855, -1208, -1208, 1614, 1615, -1208, 1449, 8550, 4672, 4672, + 856, 8550, -1208, 4672, 859, 860, -1208, -1208, -1208, -1208, + -1208, -1208, 1450, 4672, 883, 884, 1447, 4672, -1208, 5548, + 322, 990, 5576, 335, 1033, 5604, 404, 1050, -1208, 3119, + 1621, 1551, 3159, 1454, 412, -1208, 888, 454, 3731, -1208, + -1208, 1623, -1208, -1208, 4672, 8508, 6558, 25, 6584, 1630, + -1208, -1208, 1632, -1208, -1208, 4672, 5632, 1633, 1637, -1208, + 5660, 1639, 4672, 1640, 1642, 4672, 1643, 1644, 4672, 1645, + 1477, -1208, 4672, -1208, 349, -1208, 4468, 1647, 3783, -1208, + -1208, 896, -1208, 4672, -1208, 3119, 4672, 2449, 4164, 6610, + -1208, -1208, -1208, -1208, -1208, 1480, 5688, -1208, -1208, 1482, + 5716, -1208, -1208, 1483, 5744, -1208, 1649, 3750, 1180, 3325, + 899, -1208, 456, 903, 1652, 1485, 8529, 904, 5772, 2233, + -1208, -1208, 419, 8550, -1208, 4672, 349, 1654, 349, 1667, + 349, 1668, -1208, -1208, -1208, -1208, 349, 1669, 4468, 1672, + -1208, 419, -1208, 1510, 1680, 908, 1181, 912, 5800, 1264, + -1208, 1514, 1380, -1208, 1516, 1391, -1208, 1520, 1408, -1208, + 924, -1208, 925, -1208, 1522, 3119, -1208, 4672, -1208, 762, + -1208, 1681, 1691, 349, 1692, 349, 1694, 349, -1208, 1698, + 419, 1700, 419, 928, 1372, -1208, -1208, -1208, 1472, -1208, + 1663, -1208, 1868, -1208, -1208, -1208, 929, -1208, 1701, 762, + 1702, 1703, 1705, 419, 1706, -1208, -1208, -1208, -1208, -1208, + -1208, -1208 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1204, -1204, -1204, -1204, 752, -1204, -1204, -1204, -1204, 316, - -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -336, 0, -1204, 1311, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, -1204, 50, -1204, 746, 1758, -1204, - -1204, -1204, -1204, -1, -425, -222, -1204, -1204, -1204, -1204, - -1204, -1204, 1759, -1204, -1204, -1204, -1204, -1204, -1204, -1204, - -1204, -1204, -1204, -1204, -1204, -1204, -900, -893, -1204, -1204, - 1343, -1204, -1204, -1204, -1204, -1204, 591, -1204, 35, -1204, - -1203, 967, 132, 1134, 1511, -201, 639, -1204, -6, -5, - -330 + -1208, -1208, -1208, -1208, 708, -1208, -1208, -1208, -1208, 266, + -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, -331, 54, -1208, 1325, -1208, -1208, -1208, -1208, + -1208, -1208, -1208, -1208, -1208, -149, -1208, 709, 1723, -1208, + -1208, -1208, -1208, 0, -437, -222, -1208, -1208, -1208, -1208, + -1208, -1208, 1724, -1208, -1208, -1208, -1208, -1208, -1208, -1208, + -1208, -1208, -1208, -1208, -1208, -1208, -631, -827, -1208, -1208, + 1307, -1208, -1208, -1208, -1208, -1208, 217, -1208, 21, -1208, + -1207, 779, -140, 1069, 635, -209, 596, -1208, -6, -5, + -333 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -447 +#define YYTABLE_NINF -452 static const yytype_int16 yytable[] = { - 162, 163, 85, 168, 453, 1312, 159, 1484, 569, 838, - 434, 1064, 289, 180, 1062, 180, 469, 578, 280, 676, - 677, 586, 948, 236, 590, 185, 4, 269, 816, 465, - 185, 466, 282, 482, 166, 442, 443, 825, 228, 442, - 443, 272, 286, 232, 239, 233, 240, 165, 442, 443, - 901, 360, 1057, 1049, 1151, 1059, 444, 442, 443, 513, - 902, 515, 5, 1144, 1190, 901, 1191, 1354, 903, 904, - 151, 152, 905, 906, 445, 902, 442, 443, 219, 221, - 497, 227, 176, 903, 904, 442, 443, 905, 906, 177, - 442, 443, 229, 455, 621, 294, 230, 979, 241, 622, - 211, 1192, 456, 1193, 97, 248, 1194, 231, 1195, 457, - 101, 102, 103, 212, 213, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 250, 164, 1400, 826, - 827, 828, 829, 585, 237, 131, 132, 133, 1321, 170, - 1058, 135, 136, 1060, 839, 167, 365, 1061, 1414, 251, - 391, 393, 252, 361, 362, 253, 171, 254, 169, 151, - 152, 1062, 1485, 181, 290, 181, 291, 497, 255, -444, - 182, 292, 821, 949, 281, 42, 43, 44, 45, 46, - 238, 467, 186, 50, 270, 817, 53, 822, 283, 483, - 287, 273, 442, 443, 172, 830, 623, 288, 839, 980, - 981, 624, 585, 669, 670, 178, 589, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 498, 383, - 384, 176, 138, 685, 173, 385, 215, 216, 820, 141, - 142, 143, 442, 443, 1303, 707, 217, 188, 806, 437, - 438, 708, 810, 218, 823, 450, 1309, 446, 671, 179, - 150, 454, 382, 383, 384, 452, 174, 442, 443, 385, - 156, 207, 218, 495, 208, 175, 1122, 144, 145, 146, - 147, 183, 1517, 678, 731, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 151, - 152, 184, 478, 385, 479, 196, 480, 189, 197, 157, - 198, 292, 1322, 187, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 498, 383, 384, 419, 420, - 421, 188, 385, 570, 571, 572, 573, 574, 575, 576, - 577, 442, 443, 580, 581, 582, 144, 145, 146, 147, - 144, 145, 146, 147, 295, 223, 296, 684, 224, 364, - 591, 225, 1583, 190, 461, 462, 151, 152, 442, 443, - 151, 152, 191, 809, 97, 248, 474, 475, 787, 192, - 101, 102, 103, 788, 1045, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 250, 442, 443, 193, - 144, 145, 146, 147, 194, 131, 132, 133, 442, 443, - 790, 135, 136, 1063, 195, 791, 151, 152, 800, 251, - 151, 152, 252, 788, 1307, 253, -445, 254, 209, 42, - 43, 44, 45, 365, 365, 199, 888, 50, 255, 210, - 53, 215, 216, 390, 99, 42, 43, 44, 45, 46, - 297, 217, 298, 50, 151, 152, 53, 235, 226, 516, - 1421, 480, 1424, 299, 1427, 300, 292, 674, 675, 390, - 99, 442, 443, 442, 443, 438, 214, 125, 126, 127, - 128, 129, 130, 244, 442, 443, 245, 1369, 134, 1371, - 7, 8, 138, 442, 443, 442, 443, 442, 443, 141, - 142, 143, 222, 125, 126, 127, 128, 129, 130, 1373, - 234, 1381, 743, 1383, 134, 148, 398, 1005, 1062, 243, - 150, 1062, 633, 204, 1062, 257, 205, 1006, 206, 242, - 156, 1094, 633, 495, 442, 443, 596, 19, 20, 597, - 22, 23, 598, 25, 599, 27, 266, 28, 151, 152, - 1384, 32, 33, 246, 35, 36, 37, 301, -446, 302, - 40, 442, 443, 247, 1508, 442, 443, 442, 443, 442, - 443, 139, 140, 497, 812, 151, 152, 1462, 811, 442, - 443, 1465, 1081, 1468, 303, 1476, 304, 160, 265, 60, - 61, 62, 442, 443, 267, 1478, 200, 139, 140, 201, - 151, 152, 202, 275, 203, 1062, 988, 954, 1538, 276, - 1111, 305, 901, 306, 848, 633, 1549, 268, 1552, 1336, - 1555, 307, 902, 308, 1337, 626, 1558, 274, 627, 1119, - 903, 904, 1121, 1123, 905, 906, 629, 789, 792, 627, - 788, 793, 878, 878, 878, 878, 1062, 277, 487, 1062, - 699, 488, 1062, 278, 489, 1062, 490, 99, 1112, 279, - 285, 633, 309, 1588, 310, 1590, 341, 1592, 371, 372, + 162, 163, 434, 85, 453, 569, 289, 676, 677, 180, + 4, 1322, 236, 185, 578, 269, 469, 180, 816, 185, + 164, 280, 282, 482, 360, 286, 586, 825, 168, 590, + 465, 1494, 466, 838, 272, 982, 951, 239, 176, 240, + 228, 707, 165, 390, 99, 177, 1152, 708, 1061, 211, + 1159, 1063, 1065, 1067, 442, 443, 419, 420, 421, 513, + 159, 515, 212, 213, 219, 221, 621, 227, 442, 443, + 1198, 622, 1199, 1364, 442, 443, 5, 125, 126, 127, + 128, 129, 130, 1070, 1200, 166, 1201, 585, 134, 167, + 671, 241, 461, 462, 229, 294, 151, 152, 230, 626, + 97, 284, 627, 1089, 474, 475, 101, 102, 103, 231, + 174, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 826, 827, 828, 829, 237, 151, 152, 361, + 362, 131, 132, 133, 1410, 442, 443, 135, 136, 1062, + 983, 984, 1064, 1066, 1068, 585, 207, 365, 497, 208, + 391, 393, 244, 1052, 1424, 245, 151, 152, 1191, 1192, + 456, 290, 181, 291, 139, 140, -449, 457, 292, 182, + 181, 839, 238, 186, 589, 270, 287, 821, 817, 822, + 281, 283, 483, 288, 839, 467, 169, 273, 830, 1495, + 952, 442, 443, 151, 152, 176, 1331, 232, 188, 233, + 957, 170, 820, 669, 670, 823, 442, 443, 171, 629, + 215, 216, 627, 160, 144, 145, 146, 147, 442, 443, + 217, 138, 1202, 685, 1203, 437, 438, 218, 141, 142, + 143, 442, 443, 446, 678, 1070, 172, 454, 442, 443, + 1130, 442, 443, 806, 148, 149, 173, 810, 444, 150, + 789, 442, 443, 788, 257, 445, 178, 357, 455, 156, + 179, 358, 200, 442, 443, 201, 223, 684, 202, 224, + 203, 623, 225, 1072, 731, 787, 624, 175, 1527, 1048, + 788, 183, 144, 145, 146, 147, 285, 184, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 498, + 383, 384, 151, 152, 442, 443, 385, 151, 152, 809, + 189, 144, 145, 146, 147, 1313, 196, -450, 187, 197, + 1071, 198, 188, 570, 571, 572, 573, 574, 575, 576, + 577, 151, 152, 580, 581, 582, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 792, 442, 443, 793, 385, 352, 353, 354, 1593, 204, + 356, 359, 205, 1332, 206, 215, 216, 1317, 790, 800, + 1235, 1236, 389, 791, 788, 217, 394, 144, 145, 146, + 147, 190, 226, 397, 399, 402, 403, 1008, 405, 399, + 407, 408, 633, 399, 411, 412, 1120, 151, 152, 633, + 399, 442, 443, 192, 591, 442, 443, 442, 443, 191, + 442, 443, 193, 390, 99, 431, 295, 1379, 296, 901, + 194, 1381, 1009, 1383, 440, 441, 1391, 633, 199, 902, + 442, 443, 195, 441, 365, 365, 888, 903, 904, 905, + 442, 443, 906, 907, 908, 909, 1393, 125, 126, 127, + 128, 129, 130, 674, 675, 1119, 1394, 1346, 134, 209, + 633, 438, 1347, 492, 494, 399, 364, 210, 901, 442, + 443, 442, 443, 501, 502, 503, 214, 505, 902, 222, + 508, 509, 442, 443, 510, 1472, 903, 904, 905, 234, + 235, 906, 907, 908, 909, 242, 243, 521, 1475, 879, + 880, 881, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 139, 140, 42, 43, 44, 45, + 487, 442, 443, 488, 50, 579, 489, 53, 490, 442, + 443, 246, 399, 1069, 370, 399, 743, 1478, 380, 381, + 382, 383, 384, 247, 812, 1486, 265, 385, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 297, 1070, 298, 275, 1070, 991, 276, + 1070, 442, 443, 442, 443, 492, 382, 383, 384, 266, + 299, 637, 300, 385, 848, 267, 642, 1488, 301, 1548, + 302, 647, 648, 268, 650, 651, 303, 274, 304, 656, + 277, 305, 811, 306, 661, 662, 663, 1127, 151, 152, + 1129, 1131, 878, 878, 878, 878, 278, 307, -451, 308, + 309, 311, 310, 312, 679, 680, 681, 352, 353, 682, + 313, 279, 314, 686, 687, 688, 689, 690, 315, 341, + 316, 695, 342, 343, 697, 698, 344, 345, 399, 399, + 399, 1070, 891, 705, 706, 346, 711, 151, 152, 897, + 714, 317, 516, 318, 480, 912, 347, 348, 399, 292, + 319, 321, 320, 322, 722, 724, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 349, 350, 1070, 711, 385, 1070, 959, 741, 1070, 351, + 744, 1070, 323, 363, 324, 151, 152, 386, 478, 1431, + 479, 1434, 480, 1437, 325, 157, 326, 292, 369, 1301, + 1302, 327, 329, 328, 330, 387, 743, 99, 331, 388, + 332, 1070, 333, 1070, 334, 1070, 335, 337, 336, 338, + 1136, 339, 969, 340, 619, 633, 620, 634, 972, 432, + 404, 973, 974, 975, 409, 633, 958, 639, 977, 414, + 125, 126, 127, 128, 129, 130, 901, 813, 1013, 417, + 1014, 134, 401, 633, 418, 643, 902, 406, 633, 468, + 649, 410, 415, 422, 903, 904, 905, 435, 416, 906, + 907, 908, 909, 633, 1007, 721, 836, 436, 739, 399, + 740, 399, 844, 633, 633, 805, 808, 427, 428, 724, + 850, 429, 447, 1518, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 864, 633, 476, 926, 385, 448, 870, + 1012, 633, 470, 927, 877, 877, 877, 877, 633, 633, + 928, 940, 399, 1019, 633, 1020, 1045, 449, 458, 892, + 893, 633, 633, 1087, 1088, 896, 459, 139, 140, 460, + 464, 1214, 1102, 477, 633, 1559, 1090, 1562, 920, 1565, + 471, 922, 7, 8, 633, 1568, 1091, 472, 484, 1053, + 1054, 1055, 633, 481, 1092, 399, 633, 399, 1093, 1250, + 473, 485, 399, 399, 399, 399, 486, 368, 1426, 633, + 399, 1095, 1138, 633, 1139, 1140, 633, 947, 1141, 949, + 950, 633, 1598, 1142, 1600, 633, 1602, 1143, 596, 19, + 20, 597, 22, 23, 598, 25, 599, 27, 413, 28, + 633, 499, 1177, 32, 33, 500, 35, 36, 37, 1259, + 504, 1260, 40, 507, 961, 962, 430, 958, 506, 433, + 583, 511, 1291, 587, 1292, 633, 520, 1326, 963, 964, + 965, 966, 967, 968, 512, 1352, 1158, 1353, 399, 1259, + 399, 1392, 514, 463, 60, 61, 62, 522, 1259, 976, + 1422, 523, 1439, 979, 1440, 524, 517, 985, 633, 1259, + 1451, 1457, 1459, 1462, 1460, 1463, 1132, 399, 399, 399, + 399, 998, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 1259, 633, 1467, 1468, + 385, 633, 1103, 1487, 385, 593, 518, 519, 592, 1352, + 901, 1524, 633, 601, 1547, 699, 633, 1259, 1549, 1553, + 902, 1577, 595, 1578, 399, 788, 594, 1580, 903, 904, + 905, 646, 1213, 906, 907, 908, 909, 633, 1590, 1589, + 1591, 1259, 1613, 1608, 1614, 652, 700, 701, 702, 157, + 653, 657, 658, 901, 659, 660, 1240, 664, 666, 667, + 668, 691, 693, 902, 694, 1243, 719, 696, 703, 704, + 901, 903, 904, 905, 1404, 712, 906, 907, 908, 909, + 902, 713, 715, 729, 716, 1084, 717, 1264, 903, 904, + 905, 1267, 718, 906, 907, 908, 909, 732, 1094, 738, + 618, 795, 794, 1239, 796, 1473, 814, 1442, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 311, 342, 312, 1062, 385, 1062, 1095, 1062, - 125, 126, 127, 128, 129, 130, 891, 343, 879, 880, - 881, 134, 743, 897, 1204, 313, 315, 314, 316, 909, - 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 632, 383, 384, 344, 317, 956, 318, 385, 352, - 353, 354, 955, 901, 356, 359, 380, 381, 382, 383, - 384, 1183, 1184, 902, 1030, 385, 389, 319, 348, 320, - 394, 903, 904, 1291, 1292, 905, 906, 397, 399, 402, - 403, 363, 405, 399, 407, 408, 345, 399, 411, 412, - 346, 321, 966, 322, 399, 1128, 347, 323, 969, 324, - 349, 970, 971, 972, 139, 140, 1225, 1226, 974, 431, - 325, 327, 326, 328, 329, 331, 330, 332, 440, 441, - 333, 335, 334, 336, 337, 350, 338, 441, 351, 371, + 383, 384, 797, 1270, 798, 799, 385, 1296, 1579, 497, + 802, 803, 815, 837, 804, 819, 365, 365, 842, 1557, + 845, 846, 847, 852, 857, 849, 853, 1137, 1476, 854, + 856, 858, 859, 861, 862, 863, 867, 1145, 1146, 1303, + 872, 1306, 887, 1309, 874, 1479, 921, 1155, 1157, 894, + 895, 1336, 934, 943, 944, 945, 946, 1320, 953, 955, + 1323, 1324, 978, 980, 986, 981, 400, 987, 990, 989, + 993, 400, 1000, 1001, 1002, 400, 1004, 841, 1006, 843, + 901, 1011, 400, 1519, 1017, 1193, 1194, 1195, 1023, 1028, + 902, 1035, 1024, 1029, 1031, 1205, 1032, 1207, 903, 904, + 905, 1239, 1036, 906, 907, 908, 909, 1037, 1212, 1041, + 1042, 1043, 1038, 1039, 1040, 1044, 399, 1046, 1056, 1060, + 886, 1057, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 1058, 1231, 1232, 1233, + 385, 1059, 1079, 1073, 1074, 493, 1075, 400, 1076, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 404, 1004, 1463, 339, 385, 340, 619, - 633, 620, 634, 1010, 901, 1011, 369, 492, 494, 399, - 633, 633, 639, 643, 902, 386, 387, 501, 502, 503, - 901, 505, 903, 904, 508, 509, 905, 906, 510, 633, - 902, 649, 633, 739, 721, 740, 388, 409, 903, 904, - 414, 521, 905, 906, 1009, 415, 525, 526, 527, 528, - 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, - 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, - 559, 560, 561, 562, 563, 564, 565, 566, 435, 1240, - 955, 432, 901, 1050, 1051, 1052, 1466, 417, 901, 579, - 1416, 633, 902, 805, 468, 633, 399, 808, 902, 399, - 903, 904, 1469, 418, 905, 906, 903, 904, 422, 427, - 905, 906, 602, 603, 604, 605, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 428, 429, 1124, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 492, - 436, 447, 901, 385, 633, 637, 923, 633, 458, 924, - 642, 459, 902, 1150, 448, 647, 648, 449, 650, 651, - 903, 904, 460, 656, 905, 906, 471, 470, 661, 662, - 663, 370, 472, 633, 1534, 925, 633, 1016, 937, 1017, - 1572, 633, 464, 1042, 901, 633, 484, 1079, 679, 680, - 681, 352, 353, 682, 902, 473, 476, 686, 687, 688, - 689, 690, 903, 904, 477, 695, 905, 906, 697, 698, - 481, 499, 399, 399, 399, 500, 504, 705, 706, 633, - 711, 1080, 485, 633, 714, 1082, 633, 633, 1083, 1084, - 486, 633, 399, 1085, 1574, 633, 511, 1087, 722, 724, - 1130, 633, 1131, 1132, 633, 633, 1133, 1134, 1203, 506, - 633, 1229, 1135, 507, 633, 901, 1169, 711, 1230, 512, - 514, 741, 901, 520, 744, 902, 1249, 1233, 1250, 901, - 522, 523, 902, 903, 904, 368, 1576, 905, 906, 902, - 903, 904, 1394, 524, 905, 906, 901, 903, 904, 1254, - 385, 905, 906, 1257, 592, 1281, 902, 1282, 633, 1342, - 1316, 1343, 593, 594, 903, 904, 413, 1432, 905, 906, + 632, 383, 384, 931, 901, 932, 1077, 385, 1244, 1080, + 936, 937, 938, 939, 902, 1544, 1081, 1082, 942, 1085, + 1083, 1256, 903, 904, 905, 807, 1262, 906, 907, 908, + 909, 1086, 1099, 1266, 1104, 365, 1107, 1268, 1269, 1609, + 1105, 1108, 1109, 1110, 1274, 1275, 1122, 1121, 1133, 1277, + 1123, 1124, 1126, 1134, 1151, 1149, 1144, 1284, 1154, 1160, + 1430, 1150, 1433, 1162, 1436, 1161, 1166, 1294, 1167, 1295, + 1168, 1169, 1444, 1170, 1172, 1447, 1173, 1174, 1175, 1180, + 1181, 1312, 1196, 1183, 400, 1184, 970, 400, 971, 1185, + 1186, 1190, 871, 399, 1197, 1208, 1209, 399, 1210, 1582, + 1327, 1204, 1211, 885, 1218, 1219, 1225, 1223, 1227, 1226, + 1230, 1228, 1229, 1335, 1234, 994, 995, 996, 997, 1237, + 901, 1238, 1245, 1246, 1248, 1263, 1251, 493, 1252, 1253, + 902, 901, 1254, 1271, 1348, 1349, 1272, 1273, 903, 904, + 905, 902, 1355, 906, 907, 908, 909, 1276, 901, 903, + 904, 905, 1531, 1534, 906, 907, 908, 909, 902, 1278, + 1280, 1279, 1030, 1281, 1282, 1285, 903, 904, 905, 1522, + 1290, 906, 907, 908, 909, 1293, 1376, 1304, 954, 1307, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 430, 157, 601, 433, 385, 1286, - 1249, 813, 1382, 1249, 1429, 1412, 1430, 365, 365, 1260, - 517, 633, 1547, 1441, 1249, 595, 1447, 1578, 1449, 646, - 1450, 463, 652, 1452, 1600, 1453, 1249, 633, 1457, 1458, - 836, 1601, 633, 399, 1477, 399, 844, 1229, 1342, 653, - 1514, 1326, 657, 724, 850, 1293, 658, 1296, 1602, 1299, - 633, 633, 1537, 1539, 1249, 659, 1543, 864, 1567, 664, - 1568, 1310, 660, 870, 1313, 1314, 666, 667, 877, 877, - 877, 877, 691, 1509, 518, 519, 399, 788, 633, 1570, - 1579, 668, 693, 892, 893, 1580, 1249, 1581, 1598, 896, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 917, 694, 696, 919, 385, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 1603, 399, - 1604, 399, 385, 703, 704, 712, 399, 399, 399, 399, - 713, 400, 729, 715, 399, 716, 400, 717, 718, 732, - 400, 944, 738, 946, 947, 794, 795, 400, 796, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 797, 798, 799, 802, 385, 803, 804, - 814, 815, 819, 837, 618, 852, 842, 845, 958, 959, - 846, 847, 857, 861, 365, 849, 853, 854, 856, 858, - 859, 862, 960, 961, 962, 963, 964, 965, 863, 867, - 872, 874, 399, 887, 399, 894, 895, 918, 931, 940, - 493, 941, 400, 973, 942, 943, 950, 976, 952, 975, - 977, 982, 978, 983, 1420, 984, 1423, 986, 1426, 990, - 997, 399, 399, 399, 399, 995, 1434, 987, 998, 1437, - 999, 97, 284, 1001, 1003, 1034, 1008, 101, 102, 103, - 1014, 1020, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 1025, 1021, 1026, 1028, 1029, 399, 1032, - 1035, 1033, 131, 132, 133, 1036, 1038, 1037, 135, 136, - 1039, 1040, 1041, 1043, 1053, 1055, 1056, 1054, 1071, 1065, - 1066, 1072, 1521, 1524, 1067, 1068, 1069, 1073, 1074, 400, - 1075, 1077, 400, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 1078, 1091, 1096, - 1097, 385, 1099, 1512, 1100, 1102, 1076, 1101, 1113, 1115, - 1154, 1126, 1114, 1143, 801, 1125, 1146, 1158, 1161, 1086, - 1116, 1118, 493, 1136, 1162, 1563, 1142, 1165, 1141, 1166, - 1167, 1152, 1172, 1153, 1159, 1160, 1173, 1200, 1164, 138, - 1175, 1176, 1177, 807, 1178, 1182, 141, 142, 143, 1196, - 1188, 1189, 1201, 1217, 1585, 1236, 1208, 1209, 1216, 1213, - 1215, 1218, 148, 149, 1594, 1219, 1597, 150, 1129, 1224, - 1220, 1227, 257, 1228, 1235, 1238, 1241, 156, 1137, 1138, - 1242, 1243, 1244, 1253, 1606, 1272, 1261, 1610, 1147, 1149, - 1262, 1263, 1266, 1268, 1270, 400, 400, 400, 1269, 1271, - 1275, 1280, 1283, 1294, 1297, 1300, 1308, 1311, 1315, 1329, - 871, 1304, 1328, 1330, 1331, 400, 1333, 1334, 1335, 1341, - 1344, 885, 725, 1353, 1355, 1356, 1185, 1186, 1187, 1357, - 1358, 1359, 1360, 1364, 1361, 1376, 1197, 1199, 1378, 1385, - 1387, 1365, 1392, 1402, 1202, 1367, 1368, 1370, 1372, 1374, - 1379, 1406, 399, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 1395, 1407, 1393, - 1408, 385, 1409, 1221, 1222, 1223, 1410, 1411, 401, 1428, - 1413, 1435, 1442, 406, 1443, 1444, 1455, 410, 1459, 1471, - 1472, 1475, 1480, 1487, 416, 1488, 951, 630, 1491, 1492, - 1494, 1497, 1498, 1501, 1234, 1502, 1505, 1511, 1506, 1532, - 1526, 1528, 1530, 1540, 1541, 1550, 1553, 1246, 1556, 1559, - 1561, 1566, 1252, 1565, 1573, 1575, 1586, 1577, 1582, 1256, - 1587, 1589, 985, 1258, 1259, 1591, 1593, 1595, 1605, 1607, - 1264, 1265, 1608, 1609, 1611, 1267, 400, 1145, 400, 1156, - 1481, 84, 92, 1274, 655, 1237, 725, 851, 0, 0, - 0, 0, 0, 1284, 0, 1285, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1302, 0, 0, - 0, 0, 0, 0, 0, 1024, 0, 399, 0, 400, - 0, 399, 0, 0, 1317, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1325, 0, 0, - 1012, 1013, 0, 1015, 0, 1018, 1019, 0, 0, 1022, - 1023, 0, 0, 0, 0, 0, 0, 0, 1338, 1339, - 0, 0, 400, 0, 400, 0, 1345, 0, 0, 400, - 400, 400, 400, 0, 0, 0, 0, 400, 0, 0, - 0, 0, 0, 0, 0, 0, 583, 0, 0, 587, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1366, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 1380, 385, - 492, 0, 0, 0, 0, 0, 0, 1088, 1089, 1090, - 1388, 0, 1389, 0, 0, 399, 0, 1098, 0, 0, - 0, 0, 0, 0, 0, 400, 0, 400, 1397, 0, - 0, 0, 0, 1401, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 399, 400, 400, 400, 400, 0, 0, - 1419, 0, 1422, 0, 1425, 0, 1140, 0, 0, 0, - 0, 0, 0, 0, 399, 0, 0, 0, 1438, 0, - 0, 1157, 700, 701, 702, 0, 0, 1163, 0, 1445, - 1446, 0, 0, 1168, 1448, 1170, 1171, 0, 0, 0, - 1174, 400, 719, 0, 1456, 1179, 1180, 1181, 1460, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1207, 0, 0, 1252, 1211, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1489, 7, 8, 0, - 0, 0, 0, 1496, 0, 0, 1500, 0, 0, 1504, - 0, 0, 0, 1507, 0, 0, 0, 399, 0, 399, - 0, 0, 0, 0, 1516, 0, 0, 1518, 0, 1523, - 0, 0, 0, 0, 0, 0, 1231, 0, 1232, 0, - 0, 0, 0, 596, 19, 20, 597, 22, 23, 598, + 381, 382, 383, 384, 1390, 1310, 492, 1314, 385, 1318, + 400, 400, 400, 1321, 1325, 1573, 1398, 1338, 1399, 1339, + 1340, 399, 901, 1341, 1344, 1584, 1343, 1351, 1345, 1354, + 400, 1363, 902, 1365, 1407, 1366, 1586, 725, 1367, 1411, + 903, 904, 905, 1368, 1595, 906, 907, 908, 909, 1369, + 1370, 1374, 1386, 1588, 1604, 1388, 1607, 1377, 1395, 399, + 1397, 1371, 1402, 1375, 1405, 1378, 1429, 1412, 1432, 1380, + 1435, 1382, 1384, 1416, 1616, 1389, 1417, 1620, 1403, 1423, + 399, 1418, 1419, 1420, 1448, 7, 8, 1421, 1438, 1445, + 1452, 1453, 1469, 1454, 1465, 1455, 1456, 1481, 1485, 1490, + 1458, 1482, 1015, 1016, 1497, 1018, 1498, 1021, 1022, 1501, + 1466, 1025, 1026, 1502, 1470, 1504, 1507, 1610, 1508, 1511, + 1512, 1515, 1516, 1521, 1536, 1542, 1538, 1540, 1550, 1551, + 1560, 596, 19, 20, 597, 22, 23, 598, 25, 599, + 27, 1262, 28, 1563, 1566, 1569, 32, 33, 1571, 35, + 36, 37, 1499, 497, 1575, 40, 1576, 1596, 1583, 1506, + 1585, 400, 1510, 400, 1587, 1514, 1592, 1597, 1599, 1517, + 1601, 725, 851, 399, 1603, 399, 1605, 1615, 1617, 1618, + 1526, 1619, 1621, 1528, 1222, 1533, 1153, 60, 61, 62, + 1491, 630, 1096, 1097, 1098, 1164, 84, 92, 655, 0, + 1247, 0, 1106, 0, 400, 0, 0, 0, 0, 0, + 0, 0, 0, 901, 0, 0, 1556, 0, 0, 0, + 0, 0, 1558, 902, 0, 0, 0, 0, 0, 0, + 0, 903, 904, 905, 0, 399, 906, 907, 908, 909, + 0, 0, 0, 0, 0, 0, 0, 400, 736, 400, + 801, 1148, 0, 0, 400, 400, 400, 400, 0, 0, + 0, 0, 400, 0, 1594, 0, 1165, 0, 0, 0, + 0, 0, 1171, 0, 0, 0, 0, 0, 1176, 0, + 1178, 1179, 0, 0, 0, 1182, 0, 7, 8, 0, + 1187, 1188, 1189, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 498, 383, 384, 1206, 1611, 0, + 0, 385, 0, 0, 0, 0, 0, 0, 7, 8, + 0, 0, 1217, 0, 0, 0, 1221, 0, 0, 0, + 400, 0, 400, 596, 19, 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, 0, 0, 0, 32, 33, - 1546, 35, 36, 37, 0, 0, 1548, 40, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 7, 8, 841, 0, 843, 0, 0, 0, 0, - 0, 0, 1276, 1277, 1278, 1279, 60, 61, 62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1584, 0, + 0, 35, 36, 37, 0, 0, 0, 40, 0, 400, + 400, 400, 400, 0, 596, 19, 20, 597, 22, 23, + 598, 25, 599, 27, 0, 28, 1241, 0, 1242, 32, + 33, 0, 35, 36, 37, 0, 0, 0, 40, 60, + 61, 62, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 400, 0, 7, 8, + 385, 0, 0, 0, 0, 0, 0, 0, 901, 0, + 60, 61, 62, 0, 0, 0, 0, 0, 902, 0, + 0, 0, 1286, 1287, 1288, 1289, 903, 904, 905, 1400, + 0, 906, 907, 908, 909, 0, 0, 0, 0, 0, + 737, 0, 0, 0, 596, 19, 20, 597, 22, 23, + 598, 25, 599, 27, 0, 28, 0, 1148, 0, 32, + 33, 0, 35, 36, 37, 0, 0, 1425, 40, 1328, + 988, 889, 0, 0, 0, 0, 1337, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 1446, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 1350, 0, + 60, 61, 62, 1612, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 248, 0, 0, 1148, + 0, 101, 102, 103, 0, 0, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 250, 0, 0, + 0, 0, 0, 1387, 0, 0, 131, 132, 133, 0, + 0, 890, 135, 136, 0, 0, 0, 0, 0, 0, + 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, + 0, 1520, 0, 1523, 0, 0, 0, 0, 0, 255, + 1148, 0, 0, 0, 0, 0, 42, 43, 44, 45, + 46, 0, 0, 0, 50, 0, 0, 53, 400, 0, + 1148, 0, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 1441, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1570, 0, 0, 138, 1027, 0, 0, + 0, 0, 0, 141, 142, 143, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 450, + 1319, 0, 385, 0, 150, 0, 0, 0, 1480, 452, + 0, 0, 0, 0, 156, 0, 218, 495, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 248, 0, 0, + 0, 0, 101, 102, 103, 0, 0, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 250, 1078, + 0, 0, 0, 0, 1148, 0, 1530, 131, 132, 133, + 0, 0, 0, 135, 136, 400, 0, 0, 0, 400, + 0, 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1140, 886, 596, 19, 20, - 597, 22, 23, 598, 25, 599, 27, 1318, 28, 0, - 0, 0, 32, 33, 1327, 35, 36, 37, 0, 0, - 0, 40, 0, 0, 0, 400, 0, 736, 1070, 0, - 0, 0, 0, 0, 0, 0, 1340, 0, 0, 928, - 0, 929, 0, 0, 0, 0, 933, 934, 935, 936, - 60, 61, 62, 0, 939, 0, 0, 1140, 97, 248, - 99, 0, 0, 0, 101, 102, 103, 0, 0, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 250, 1377, 0, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 0, 0, 134, 135, 136, 0, 0, 0, - 0, 737, 0, 251, 0, 0, 252, 0, 0, 253, - 0, 254, 967, 0, 968, 0, 0, 0, 1140, 0, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 42, - 43, 44, 45, 46, 0, 0, 0, 50, 1140, 0, - 53, 991, 992, 993, 994, 0, 0, 0, 0, 0, - 400, 0, 0, 0, 400, 1431, 0, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 138, 139, 140, 0, - 0, 0, 0, 141, 142, 143, 0, 0, 1027, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, - 256, 0, 0, 0, 150, 0, 1470, 0, 0, 257, - 0, 0, 0, 0, 156, 0, 1519, 0, 97, 284, - 0, 0, 0, 0, 101, 102, 103, 0, 0, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 0, 0, 493, 0, 0, 0, 0, 0, 131, - 132, 133, 1140, 0, 1520, 135, 136, 0, 400, 0, - 0, 0, 97, 98, 99, 0, 100, 0, 101, 102, - 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 1120, 0, 400, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 0, 0, 134, 135, - 136, 0, 0, 0, 0, 0, 0, 400, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, + 45, 46, 0, 0, 0, 50, 0, 0, 53, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, + 0, 0, 0, 0, 1148, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, + 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, + 148, 398, 0, 0, 0, 150, 0, 0, 0, 0, + 257, 0, 0, 400, 0, 156, 0, 0, 495, 0, + 0, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 0, 1128, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1140, 0, 0, 0, 138, 0, 0, 0, - 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, - 149, 0, 0, 0, 150, 0, 0, 0, 0, 257, - 0, 0, 357, 0, 156, 0, 358, 0, 0, 0, - 0, 0, 1212, 0, 137, 0, 0, 0, 0, 0, - 138, 139, 140, 0, 0, 0, 0, 141, 142, 143, - 144, 145, 146, 147, 0, 0, 0, 0, 0, 0, - 400, 0, 400, 148, 149, 0, 1127, 0, 150, 0, - 151, 152, 0, 153, 0, 154, 0, 155, 156, 0, - 157, 0, 0, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 400, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 248, 249, 0, 0, 0, 101, 102, + 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 248, 99, 0, 0, 0, 101, 102, 103, 0, 400, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 131, 132, 133, 0, 0, 0, 135, + 121, 122, 123, 124, 250, 0, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 0, 0, 134, 135, 136, 0, 0, 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0, 0, 1135, 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, 45, 46, 0, 0, - 0, 50, 0, 0, 53, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 138, 0, 0, 385, 0, 0, 0, 141, 142, 143, - 1289, 0, 1290, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 256, 0, 0, 0, 150, 0, - 0, 0, 0, 257, 0, 0, 0, 0, 156, 0, - 258, 0, 0, 0, 0, 1390, 0, 0, 0, 0, - 97, 248, 1205, 0, 0, 0, 101, 102, 103, 0, + 0, 50, 0, 0, 53, 1224, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 400, 0, 400, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 138, 139, 140, 385, 0, 0, 0, + 141, 142, 143, 0, 0, 0, 0, 0, 400, 0, + 0, 0, 0, 0, 0, 0, 148, 256, 0, 0, + 0, 150, 0, 0, 0, 0, 257, 400, 97, 98, + 99, 156, 100, 1529, 101, 102, 103, 0, 0, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 7, 8, 134, 135, 136, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 0, 0, 0, 0, 385, 0, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 0, 0, 0, 0, 385, 0, 0, 596, 19, + 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, + 0, 0, 0, 32, 33, 0, 35, 36, 37, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 137, 0, 0, 0, 0, 0, 138, + 139, 140, 0, 0, 0, 0, 141, 142, 143, 144, + 145, 146, 147, 0, 60, 61, 62, 0, 0, 0, + 0, 0, 148, 149, 0, 0, 0, 150, 0, 151, + 152, 0, 153, 0, 154, 0, 155, 156, 0, 157, + 97, 248, 249, 0, 0, 0, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 250, 1415, 0, 0, 0, 0, 0, 0, - 0, 131, 132, 133, 0, 0, 0, 135, 136, 0, - 0, 0, 0, 0, 1436, 251, 0, 0, 252, 7, - 8, 253, 0, 254, 0, 0, 0, 0, 0, 0, + 123, 124, 250, 0, 0, 913, 0, 0, 0, 0, + 0, 131, 132, 133, 0, 0, 0, 135, 136, 7, + 8, 0, 0, 0, 0, 251, 0, 0, 252, 0, + 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, 45, 46, 0, 0, 0, 50, - 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 596, 19, 20, 597, 22, + 0, 0, 53, 0, 0, 596, 19, 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, 0, 0, 0, - 32, 33, 0, 35, 36, 37, 0, 0, 138, 40, - 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1510, 0, 1513, - 0, 148, 256, 0, 0, 0, 150, 0, 60, 61, - 62, 257, 0, 97, 248, 0, 156, 0, 1206, 101, - 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 131, 132, 133, 0, 0, 1560, - 135, 136, 7, 8, 0, 0, 0, 0, 251, 889, - 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 0, 0, 0, 42, 43, 44, 45, 46, 0, - 0, 0, 50, 0, 0, 53, 0, 0, 596, 19, - 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, - 0, 0, 0, 32, 33, 0, 35, 36, 37, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, + 32, 33, 0, 35, 36, 37, 0, 0, 0, 40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 148, 256, 0, 0, 0, 150, - 0, 0, 0, 0, 257, 0, 97, 248, 0, 156, + 0, 0, 0, 0, 257, 0, 97, 248, 1215, 156, 0, 258, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 250, 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, 133, - 0, 0, 890, 135, 136, 7, 8, 0, 0, 0, + 0, 0, 948, 135, 136, 7, 8, 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, @@ -2066,854 +2056,875 @@ static const yytype_int16 yytable[] = 0, 596, 19, 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, 0, 0, 0, 32, 33, 0, 35, 36, 37, 0, 0, 0, 40, 0, 0, 0, 0, - 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, - 0, 141, 142, 143, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 60, 61, 62, 148, 398, 0, - 0, 0, 150, 0, 0, 0, 0, 257, 0, 97, - 248, 0, 156, 0, 491, 101, 102, 103, 0, 0, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 250, 0, 0, 0, 0, 0, 0, 0, 0, - 131, 132, 133, 0, 0, 910, 135, 136, 7, 8, - 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, - 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, - 42, 43, 44, 45, 46, 0, 0, 0, 50, 0, - 0, 53, 0, 0, 596, 19, 20, 597, 22, 23, - 598, 25, 599, 27, 0, 28, 0, 0, 0, 32, - 33, 0, 35, 36, 37, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, - 148, 398, 0, 0, 0, 150, 0, 0, 0, 0, - 257, 0, 97, 248, 0, 156, 0, 723, 101, 102, + 148, 256, 0, 0, 0, 150, 0, 0, 0, 0, + 257, 0, 97, 248, 0, 156, 0, 1216, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 131, 132, 133, 0, 0, 945, 135, + 0, 0, 0, 131, 132, 133, 0, 0, 1047, 135, 136, 7, 8, 0, 0, 0, 0, 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, 45, 46, 0, 0, 0, 50, 0, 0, 53, 0, 0, 596, 19, 20, 597, 22, 23, 598, 25, 599, 27, 0, 28, 0, - 0, 0, 32, 33, 0, 35, 36, 37, 0, 1214, + 0, 0, 32, 33, 0, 35, 36, 37, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, - 138, 0, 0, 0, 0, 0, 0, 141, 142, 143, - 1332, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 60, 61, 62, 148, 256, 0, 0, 0, 150, 0, - 0, 0, 0, 257, 0, 97, 248, 0, 156, 0, - 1210, 101, 102, 103, 0, 0, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 131, 132, 133, 0, - 0, 1044, 135, 136, 0, 0, 0, 0, 0, 0, - 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 0, 0, 0, 42, 43, 44, 45, - 46, 0, 0, 0, 50, 0, 0, 53, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 0, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 138, 1363, 0, 0, 385, 0, 0, + 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 450, 1309, 0, 0, - 0, 150, 0, 0, 0, 0, 452, 0, 97, 284, - 99, 156, 0, 218, 101, 102, 103, 0, 0, 104, + 0, 0, 0, 60, 61, 62, 148, 256, 0, 0, + 0, 150, 0, 0, 0, 0, 257, 0, 97, 248, + 0, 156, 0, 258, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 0, 0, 134, 135, 136, 97, 284, 99, - 0, 0, 0, 101, 102, 103, 0, 0, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, - 0, 0, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 7, 8, 134, 135, 136, 0, 0, 0, 0, - 0, 0, 0, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 138, 139, 140, 0, - 0, 0, 0, 141, 142, 143, 0, 596, 19, 20, - 597, 22, 23, 598, 25, 599, 27, 0, 28, 148, - 149, 0, 32, 33, 150, 35, 36, 37, 0, 257, - 0, 40, 0, 0, 156, 0, 1148, 1391, 0, 0, - 0, 0, 0, 0, 0, 138, 139, 140, 0, 0, - 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, - 60, 61, 62, 0, 0, 0, 0, 0, 148, 149, - 0, 0, 0, 150, 0, 0, 0, 0, 257, 0, - 97, 284, 99, 156, 0, 1324, 101, 102, 103, 0, - 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 0, 0, 0, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 97, 284, 134, 135, 136, 0, + 250, 0, 0, 0, 0, 0, 0, 0, 0, 131, + 132, 133, 0, 0, 1483, 135, 136, 7, 8, 0, + 0, 0, 0, 251, 0, 0, 252, 0, 0, 253, + 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 42, + 43, 44, 45, 46, 0, 0, 0, 50, 0, 0, + 53, 0, 0, 596, 19, 20, 597, 22, 23, 598, + 25, 599, 27, 0, 28, 0, 0, 0, 32, 33, + 0, 35, 36, 37, 0, 1342, 0, 40, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, + 0, 0, 0, 0, 1373, 0, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 61, 62, 148, 398, 0, 0, 0, 150, 0, 0, + 0, 0, 257, 0, 97, 248, 0, 156, 0, 491, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 0, 0, 0, 0, + 119, 120, 121, 122, 123, 124, 250, 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, 133, 0, 0, - 0, 135, 136, 7, 8, 0, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 138, 139, - 140, 0, 0, 0, 0, 141, 142, 143, 0, 596, - 19, 20, 597, 22, 23, 598, 25, 599, 27, 0, - 28, 148, 149, 0, 32, 33, 150, 35, 36, 37, - 0, 257, 0, 40, 0, 0, 156, 0, 1522, 1479, - 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, - 142, 143, 0, 0, 0, 0, 0, 0, 1533, 0, - 0, 0, 60, 61, 62, 148, 149, 0, 0, 0, - 150, 0, 0, 0, 0, 257, 0, 0, 709, 0, - 156, 0, 710, 97, 284, 0, 0, 0, 0, 101, - 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 0, 0, 0, 0, 0, - 0, 0, 0, 1473, 131, 132, 133, 97, 284, 0, - 135, 136, 0, 101, 102, 103, 0, 0, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, - 133, 0, 0, 0, 135, 136, 7, 8, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 371, 372, 373, + 1545, 135, 136, 0, 0, 0, 0, 0, 0, 251, + 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 42, 43, 44, 45, 46, + 0, 0, 0, 50, 0, 0, 53, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 138, 0, 0, 0, 385, 0, 0, 141, 142, - 143, 0, 596, 19, 20, 597, 22, 23, 598, 25, - 599, 27, 0, 28, 148, 149, 0, 32, 33, 150, - 35, 36, 37, 0, 257, 0, 40, 1569, 497, 156, - 0, 355, 0, 0, 0, 138, 0, 0, 0, 0, - 0, 0, 141, 142, 143, 0, 1599, 0, 0, 0, - 0, 0, 0, 0, 0, 60, 61, 62, 450, 451, - 0, 0, 0, 150, 0, 0, 0, 0, 452, 0, - 97, 248, 0, 156, 0, 218, 101, 102, 103, 0, + 384, 0, 0, 0, 0, 385, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 1401, 0, 0, 0, 385, 138, 0, 0, 0, 0, + 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 148, 398, + 0, 0, 0, 150, 0, 0, 0, 0, 257, 0, + 97, 248, 0, 156, 0, 723, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 250, 0, 0, 0, 0, 0, 0, 0, - 0, 131, 132, 133, 0, 0, 1535, 135, 136, 0, + 0, 131, 132, 133, 0, 0, 0, 135, 136, 0, 0, 0, 0, 0, 0, 251, 0, 0, 252, 0, - 0, 253, 0, 254, 0, 0, 0, 0, 0, 733, + 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, - 0, 42, 43, 44, 45, 46, 0, 0, 824, 50, - 0, 0, 53, 0, 0, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 632, 383, 384, 938, - 0, 0, 0, 385, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 138, 1093, - 0, 0, 385, 0, 0, 141, 142, 143, 0, 0, + 0, 42, 43, 44, 45, 46, 0, 0, 0, 50, + 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 1489, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 0, 0, 0, 1543, 0, 141, 142, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 256, 0, 0, 0, 150, + 0, 0, 0, 0, 257, 0, 97, 248, 0, 156, + 0, 1220, 101, 102, 103, 0, 0, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 250, 0, + 0, 0, 0, 0, 0, 0, 0, 131, 132, 133, + 0, 0, 0, 135, 136, 0, 0, 0, 0, 0, + 0, 251, 0, 0, 252, 0, 0, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 148, 398, 0, 0, 0, 150, 97, 284, 99, - 0, 257, 0, 101, 102, 103, 156, 0, 104, 105, + 255, 0, 0, 0, 0, 0, 0, 42, 43, 44, + 45, 46, 0, 0, 0, 50, 0, 0, 53, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 0, 0, 0, 0, 385, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 497, 0, 0, 0, 385, 138, 0, 0, + 0, 0, 0, 0, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 450, 1319, 0, 0, 0, 150, 0, 0, 0, 0, + 452, 0, 97, 284, 99, 156, 0, 218, 101, 102, + 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 0, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 0, 0, 134, 135, + 136, 97, 284, 99, 0, 0, 0, 101, 102, 103, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 0, 0, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 0, 0, 134, 135, 136, + 0, 0, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 632, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 139, 140, 0, 0, 0, 0, + 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 148, 149, 0, 0, + 0, 150, 0, 0, 0, 0, 257, 0, 0, 0, + 0, 156, 0, 1156, 0, 0, 0, 0, 0, 0, + 0, 0, 138, 139, 140, 0, 0, 0, 0, 141, + 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 149, 0, 0, 0, + 150, 0, 0, 0, 0, 257, 0, 97, 284, 99, + 156, 0, 1334, 101, 102, 103, 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, 0, 0, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 0, 0, 134, 135, 136, 371, 372, 373, 374, + 133, 97, 284, 134, 135, 136, 0, 101, 102, 103, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 131, 132, 133, 0, 0, 0, 135, 136, + 0, 97, 284, 0, 0, 0, 0, 101, 102, 103, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 0, 0, 0, 0, 0, 138, 139, + 140, 0, 131, 132, 133, 141, 142, 143, 135, 136, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 148, 149, 0, 0, 0, 150, 0, 0, 0, + 0, 257, 0, 0, 0, 0, 156, 0, 1532, 0, + 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, + 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 149, 0, 0, 0, + 150, 0, 0, 0, 0, 257, 0, 0, 709, 0, + 156, 0, 710, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 138, 0, 0, 0, 0, 0, 0, 141, + 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 149, 0, 0, 0, + 150, 0, 0, 0, 0, 257, 0, 97, 284, 0, + 156, 0, 355, 101, 102, 103, 0, 0, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, + 133, 97, 248, 0, 135, 136, 0, 101, 102, 103, + 0, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 250, 0, 0, 0, 0, 0, 0, + 0, 0, 131, 132, 133, 0, 0, 0, 135, 136, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 252, + 0, 0, 253, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 0, 0, 42, 43, 44, 45, 46, 0, 138, 0, + 50, 0, 0, 53, 0, 141, 142, 143, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 450, 451, 0, 733, 0, 150, 0, 0, 0, + 0, 452, 0, 0, 0, 0, 156, 0, 218, 0, + 0, 0, 138, 824, 0, 0, 0, 0, 0, 141, + 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 398, 0, 0, 0, + 150, 97, 284, 99, 0, 257, 0, 101, 102, 103, + 156, 0, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 0, 0, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 97, 284, 134, 135, 136, + 0, 101, 102, 103, 0, 0, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 941, 0, 0, + 0, 0, 0, 0, 0, 0, 131, 132, 133, 0, + 0, 0, 135, 136, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 1101, 0, + 0, 0, 385, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, + 0, 385, 138, 139, 140, 0, 0, 0, 0, 141, + 142, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 149, 0, 0, 0, + 150, 0, 0, 0, 0, 257, 0, 0, 0, 0, + 156, 0, 0, 0, 0, 0, 138, 0, 0, 0, + 0, 0, 0, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, + 149, 0, 0, 0, 150, 0, 0, 0, 0, 257, + 0, 0, 0, 0, 156, 0, 0, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 0, -4, 1, 0, 385, -4, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, 0, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, 0, 0, -4, -4, -4, 0, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, 0, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + 0, 0, 0, -4, -4, 6, 0, 0, 0, 0, + -4, 0, 0, 7, 8, -4, -4, -4, -4, 0, + 0, -4, 0, -4, 0, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, 0, 9, 10, -4, + -4, -4, -4, 0, 0, 0, 0, 0, 11, 12, + 0, 0, 0, 13, 14, 15, 0, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 7, + 8, 0, 56, 57, 1033, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 59, 60, 61, 62, 0, 0, + 63, 0, 64, 0, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 0, 0, 0, 76, 77, + 78, 79, 0, 0, 0, 596, 19, 20, 597, 22, + 23, 598, 25, 599, 27, 0, 28, 0, 0, 0, + 32, 33, 0, 35, 36, 37, 0, 0, 0, 40, + 0, 0, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 60, 61, 62, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 1299, + 0, 1300, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 1329, 0, 1330, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 1427, 0, 1428, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 866, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 371, 372, 373, 374, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 0, 916, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 935, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 960, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 0, 0, 1051, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 1297, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 371, 372, 373, 374, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 0, 1316, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 1358, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 1359, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 0, 0, 1360, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 1361, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 138, 139, 140, 0, 0, - 0, 0, 141, 142, 143, 0, 0, 0, -4, 1, - 0, 0, -4, 0, 0, 0, 0, 0, 148, 149, - -4, -4, 0, 150, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -4, -4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -4, -4, 0, 0, 0, - -4, -4, -4, 0, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, 0, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, 0, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, 0, 6, -4, -4, - 0, 0, 0, -4, 0, 7, 8, 0, -4, -4, - -4, -4, 0, 0, -4, 0, -4, 0, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, 9, - 10, 0, -4, -4, -4, -4, 0, 0, 0, 0, - 11, 12, 0, 0, 0, 13, 14, 15, 0, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 0, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 0, 0, 56, 57, 0, 0, 0, 58, 0, - 0, 0, 0, 59, 60, 61, 62, 0, 0, 63, - 0, 64, 0, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 0, 0, 0, 76, 77, 78, - 79, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 1319, 0, 1320, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 1417, 0, 1418, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 866, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 913, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 932, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 0, 0, 957, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 0, 1048, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 1287, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 1306, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 1348, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 0, 0, 1349, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 0, 1350, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 1351, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 1352, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 1386, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 0, 0, 1433, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 0, 1439, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 1440, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 1461, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 1464, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 0, 0, 1467, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 0, 1490, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 1493, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 1527, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, - 1529, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 0, 0, 1531, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 0, 0, 1544, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 0, 0, 1571, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 0, 665, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 0, 1362, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 1396, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 0, 0, 0, 0, 0, 0, 1362, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 720, - 0, 0, 0, 0, 672, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 625, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 672, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 673, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 730, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 767, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 768, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 781, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 782, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 783, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 784, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 785, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 786, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 898, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 899, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 900, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 1007, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 1046, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 1047, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 1092, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 1247, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 1248, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 1255, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 1398, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 1443, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 0, 0, 1449, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 1450, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 0, 1471, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 1474, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 1477, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 0, 0, 1500, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 1503, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 0, 1537, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 1539, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 0, 0, 1541, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 0, 0, 1554, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 0, 0, 1581, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 0, 665, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, 1399, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 0, 0, 0, 1403, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, - 1483, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 0, 0, 0, 1486, 371, 372, 373, + 0, 385, 0, 0, 0, 0, 0, 0, 0, 1372, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 720, 0, 0, 0, 0, 672, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 625, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 672, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 673, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 730, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 767, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 768, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 781, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 782, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 783, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 784, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 785, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 786, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 898, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 899, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 900, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 1010, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 1049, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 1050, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 1100, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 1257, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 1258, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 1265, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 1408, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 0, 0, 0, 1409, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 0, 0, 0, 1413, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, + 0, 1493, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, + 385, 0, 0, 0, 0, 0, 0, 1496, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, + 0, 0, 0, 1535, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 0, 385, 0, 0, 0, 588, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 0, - 0, 0, 1525, 371, 372, 373, 374, 375, 376, 377, + 384, 0, 0, 0, 0, 385, 0, 0, 0, 735, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, + 0, 0, 742, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 588, 371, 372, 373, 374, + 0, 385, 0, 0, 0, 746, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 0, 0, 735, 371, + 0, 0, 0, 0, 385, 0, 0, 0, 748, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 742, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 750, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 0, 0, 746, 371, 372, 373, 374, 375, + 385, 0, 0, 0, 752, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 748, 371, 372, + 0, 0, 0, 385, 0, 0, 0, 754, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, - 750, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 756, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 752, 371, 372, 373, 374, 375, 376, + 0, 0, 0, 758, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 0, 0, 754, 371, 372, 373, + 0, 0, 385, 0, 0, 0, 760, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 756, + 384, 0, 0, 0, 0, 385, 0, 0, 0, 762, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 0, 0, 758, 371, 372, 373, 374, 375, 376, 377, + 0, 0, 764, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 760, 371, 372, 373, 374, + 0, 385, 0, 0, 0, 766, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 0, 0, 762, 371, + 0, 0, 0, 0, 385, 0, 0, 0, 770, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 764, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 772, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 0, 0, 766, 371, 372, 373, 374, 375, + 385, 0, 0, 0, 774, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 770, 371, 372, + 0, 0, 0, 385, 0, 0, 0, 776, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, - 772, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 778, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 774, 371, 372, 373, 374, 375, 376, + 0, 0, 0, 780, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 0, 0, 776, 371, 372, 373, + 0, 0, 385, 0, 0, 0, 924, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 778, + 384, 0, 0, 0, 0, 385, 0, 0, 0, 925, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 0, 0, 780, 371, 372, 373, 374, 375, 376, 377, + 0, 0, 929, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 921, 371, 372, 373, 374, + 0, 385, 0, 0, 0, 930, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 0, 0, 922, 371, + 0, 0, 0, 0, 385, 0, 0, 0, 933, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 926, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 956, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 0, 0, 927, 371, 372, 373, 374, 375, + 385, 0, 0, 0, 1005, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 0, 0, 930, 371, 372, + 0, 0, 0, 385, 0, 0, 0, 1112, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, 0, - 953, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 1114, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 0, 0, 1002, 371, 372, 373, 374, 375, 376, + 0, 0, 0, 1116, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 0, 0, 1104, 371, 372, 373, + 0, 0, 385, 0, 0, 0, 1118, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 0, 0, 1106, + 384, 0, 0, 0, 0, 385, 0, 0, 0, 1249, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 0, 0, 1108, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 0, 0, 1110, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 0, 0, 1239, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 0, - 0, 1375, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 584, 371, 372, 373, 374, 375, 376, 377, + 0, 0, 1385, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 631, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 584, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 635, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 631, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 636, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 635, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 638, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 636, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 640, 371, 372, + 384, 0, 0, 0, 0, 385, 0, 638, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 641, 371, + 383, 384, 0, 0, 0, 0, 385, 0, 640, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 644, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 641, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 645, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 644, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 720, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 645, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 726, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 720, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 727, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 726, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 728, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 727, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 734, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 728, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 745, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 734, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 747, 371, 372, + 384, 0, 0, 0, 0, 385, 0, 745, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 749, 371, + 383, 384, 0, 0, 0, 0, 385, 0, 747, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 751, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 749, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 753, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 751, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 755, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 753, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 757, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 755, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 759, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 757, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 761, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 759, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 763, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 761, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 765, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 763, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 769, 371, 372, + 384, 0, 0, 0, 0, 385, 0, 765, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 771, 371, + 383, 384, 0, 0, 0, 0, 385, 0, 769, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 773, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 771, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 775, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 773, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 777, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 775, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 779, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 777, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 855, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 779, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 860, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 855, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 865, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 860, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 868, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 865, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 869, 371, 372, + 384, 0, 0, 0, 0, 385, 0, 868, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 875, 371, + 383, 384, 0, 0, 0, 0, 385, 0, 869, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 882, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 875, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 883, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 882, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, - 0, 884, 371, 372, 373, 374, 375, 376, 377, 378, + 0, 883, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 912, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 884, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 914, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 915, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 915, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 917, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 916, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 918, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 920, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 919, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385, 0, 1103, 371, 372, + 384, 0, 0, 0, 0, 385, 0, 923, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 0, 0, 0, 0, 385, 0, 1105, 371, + 383, 384, 0, 0, 0, 0, 385, 0, 1111, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 0, 0, 0, 0, 385, 0, 1107, + 382, 383, 384, 0, 0, 0, 0, 385, 0, 1113, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, - 1109, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 1115, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, 385, 0, 1117, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, 0, - 385, 0, 1288, 371, 372, 373, 374, 375, 376, 377, + 385, 0, 1125, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, - 0, 385, 0, 1305, 371, 372, 373, 374, 375, 376, + 0, 385, 0, 1298, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, 0, - 0, 0, 385, 0, 1323, 371, 372, 373, 374, 375, + 0, 0, 385, 0, 1315, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 0, - 0, 0, 0, 385, 0, 1482, 371, 372, 373, 374, + 0, 0, 0, 385, 0, 1333, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 0, 0, 0, 0, 385, 0, 1542, 371, 372, 373, + 0, 0, 0, 0, 385, 0, 1492, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 0, 0, 0, 0, 385 + 384, 0, 0, 0, 0, 385, 0, 1552, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 0, 385 }; static const yytype_int16 yycheck[] = { - 6, 6, 3, 6, 226, 1208, 6, 6, 338, 6, - 211, 911, 4, 4, 907, 4, 238, 347, 5, 444, - 445, 357, 7, 4, 360, 4, 6, 4, 4, 4, - 4, 6, 5, 5, 164, 154, 155, 4, 4, 154, - 155, 4, 6, 64, 4, 66, 6, 64, 154, 155, - 80, 4, 6, 172, 6, 6, 171, 154, 155, 281, - 90, 283, 0, 6, 170, 80, 172, 1270, 98, 99, - 161, 162, 102, 103, 171, 90, 154, 155, 43, 44, - 8, 46, 164, 98, 99, 154, 155, 102, 103, 171, - 154, 155, 58, 171, 165, 100, 62, 4, 58, 170, - 116, 170, 164, 172, 3, 4, 170, 73, 172, 171, - 9, 10, 11, 129, 130, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 13, 1341, 106, - 107, 108, 109, 7, 125, 44, 45, 46, 8, 6, - 104, 50, 51, 104, 151, 164, 157, 172, 1361, 58, - 166, 167, 61, 116, 117, 64, 6, 66, 171, 161, - 162, 1064, 171, 164, 166, 164, 168, 8, 77, 171, - 171, 173, 171, 168, 171, 84, 85, 86, 87, 88, - 171, 166, 171, 92, 171, 171, 95, 171, 171, 171, - 164, 164, 154, 155, 6, 172, 165, 171, 151, 116, - 117, 170, 7, 435, 436, 164, 7, 145, 146, 147, + 6, 6, 211, 3, 226, 338, 4, 444, 445, 4, + 6, 1218, 4, 4, 347, 4, 238, 4, 4, 4, + 13, 5, 5, 5, 4, 6, 357, 4, 6, 360, + 4, 6, 6, 6, 4, 4, 7, 4, 167, 6, + 4, 168, 64, 4, 5, 174, 6, 174, 6, 119, + 6, 6, 6, 6, 157, 158, 196, 197, 198, 281, + 6, 283, 132, 133, 43, 44, 168, 46, 157, 158, + 173, 173, 175, 1280, 157, 158, 0, 38, 39, 40, + 41, 42, 43, 910, 173, 167, 175, 7, 49, 167, + 173, 58, 232, 233, 58, 100, 164, 165, 62, 170, + 3, 4, 173, 171, 244, 245, 9, 10, 11, 73, + 169, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 109, 110, 111, 112, 128, 164, 165, 119, + 120, 44, 45, 46, 1351, 157, 158, 50, 51, 107, + 119, 120, 107, 107, 107, 7, 61, 157, 8, 64, + 166, 167, 61, 175, 1371, 64, 164, 165, 6, 7, + 167, 169, 167, 171, 135, 136, 174, 174, 176, 174, + 167, 154, 174, 174, 7, 174, 167, 174, 174, 174, + 174, 174, 174, 174, 154, 169, 174, 167, 175, 174, + 171, 157, 158, 164, 165, 167, 8, 64, 167, 66, + 171, 6, 174, 435, 436, 174, 157, 158, 6, 170, + 157, 158, 173, 6, 144, 145, 146, 147, 157, 158, + 167, 134, 173, 455, 175, 214, 215, 174, 141, 142, + 143, 157, 158, 222, 173, 1072, 6, 226, 157, 158, + 7, 157, 158, 584, 157, 158, 6, 588, 174, 162, + 170, 157, 158, 173, 167, 174, 167, 170, 174, 172, + 167, 174, 58, 157, 158, 61, 58, 173, 64, 61, + 66, 168, 64, 914, 506, 168, 173, 169, 1495, 173, + 173, 167, 144, 145, 146, 147, 79, 167, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 164, 165, 157, 158, 166, 164, 165, 171, + 68, 144, 145, 146, 147, 175, 61, 174, 167, 64, + 173, 66, 167, 339, 340, 341, 342, 343, 344, 345, + 346, 164, 165, 349, 350, 351, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 170, 157, 158, 173, 166, 148, 149, 150, 1575, 61, + 153, 154, 64, 175, 66, 157, 158, 173, 168, 168, + 6, 7, 165, 173, 173, 167, 169, 144, 145, 146, + 147, 64, 174, 176, 177, 178, 179, 168, 181, 182, + 183, 184, 173, 186, 187, 188, 170, 164, 165, 173, + 193, 157, 158, 6, 360, 157, 158, 157, 158, 64, + 157, 158, 174, 4, 5, 208, 167, 173, 169, 80, + 64, 173, 168, 173, 217, 218, 173, 173, 66, 90, + 157, 158, 64, 226, 444, 445, 668, 98, 99, 100, + 157, 158, 103, 104, 105, 106, 173, 38, 39, 40, + 41, 42, 43, 442, 443, 168, 173, 168, 49, 167, + 173, 450, 173, 256, 257, 258, 4, 61, 80, 157, + 158, 157, 158, 266, 267, 268, 174, 270, 90, 174, + 273, 274, 157, 158, 277, 173, 98, 99, 100, 64, + 61, 103, 104, 105, 106, 61, 64, 290, 173, 658, + 659, 660, 295, 296, 297, 298, 299, 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, 135, 136, 84, 85, 86, 87, + 58, 157, 158, 61, 92, 348, 64, 95, 66, 157, + 158, 4, 355, 175, 6, 358, 522, 173, 157, 158, + 159, 160, 161, 4, 589, 173, 4, 166, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 167, 1431, 169, 6, 1434, 817, 6, + 1437, 157, 158, 157, 158, 398, 159, 160, 161, 167, + 167, 404, 169, 166, 630, 167, 409, 173, 167, 173, + 169, 414, 415, 167, 417, 418, 167, 167, 169, 422, + 169, 167, 588, 169, 427, 428, 429, 978, 164, 165, + 981, 982, 657, 658, 659, 660, 4, 167, 174, 169, + 167, 167, 169, 169, 447, 448, 449, 450, 451, 452, + 167, 4, 169, 456, 457, 458, 459, 460, 167, 167, + 169, 464, 167, 167, 467, 468, 167, 167, 471, 472, + 473, 1518, 671, 476, 477, 167, 479, 164, 165, 678, + 483, 167, 169, 169, 171, 684, 167, 7, 491, 176, + 167, 167, 169, 169, 497, 498, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 167, 167, 1559, 516, 166, 1562, 742, 520, 1565, 167, + 523, 1568, 167, 4, 169, 164, 165, 174, 167, 1380, + 169, 1382, 171, 1384, 167, 174, 169, 176, 6, 1196, + 1197, 167, 167, 169, 169, 6, 712, 5, 167, 6, + 169, 1598, 167, 1600, 169, 1602, 167, 167, 169, 169, + 989, 167, 788, 169, 169, 173, 171, 175, 794, 4, + 167, 797, 798, 799, 167, 173, 742, 175, 804, 167, + 38, 39, 40, 41, 42, 43, 80, 590, 64, 167, + 66, 49, 177, 173, 167, 175, 90, 182, 173, 169, + 175, 186, 174, 167, 98, 99, 100, 174, 193, 103, + 104, 105, 106, 173, 840, 175, 619, 174, 173, 622, + 175, 624, 625, 173, 173, 175, 175, 167, 167, 632, + 633, 167, 174, 1484, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 646, 173, 169, 175, 166, 174, 652, + 849, 173, 6, 175, 657, 658, 659, 660, 173, 173, + 175, 175, 665, 64, 173, 66, 175, 174, 167, 672, + 673, 173, 173, 175, 175, 678, 167, 135, 136, 167, + 167, 175, 8, 169, 173, 1536, 175, 1538, 691, 1540, + 174, 694, 12, 13, 173, 1546, 175, 174, 5, 898, + 899, 900, 173, 169, 175, 708, 173, 710, 175, 1138, + 174, 5, 715, 716, 717, 718, 5, 158, 1375, 173, + 723, 175, 173, 173, 175, 175, 173, 730, 175, 732, + 733, 173, 1583, 175, 1585, 173, 1587, 175, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 189, 69, + 173, 6, 175, 73, 74, 6, 76, 77, 78, 173, + 171, 175, 82, 122, 767, 768, 207, 933, 174, 210, + 355, 6, 4, 358, 6, 173, 169, 175, 781, 782, + 783, 784, 785, 786, 6, 173, 1011, 175, 791, 173, + 793, 175, 6, 234, 114, 115, 116, 4, 173, 802, + 175, 174, 173, 806, 175, 6, 6, 810, 173, 173, + 175, 175, 173, 173, 175, 175, 982, 820, 821, 822, + 823, 824, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 173, 173, 175, 175, + 166, 173, 168, 175, 166, 7, 287, 288, 171, 173, + 80, 175, 173, 6, 175, 175, 173, 173, 175, 175, + 90, 173, 175, 175, 867, 173, 169, 175, 98, 99, + 100, 7, 1071, 103, 104, 105, 106, 173, 173, 175, + 175, 173, 173, 175, 175, 7, 471, 472, 473, 174, + 7, 167, 167, 80, 167, 167, 1122, 7, 168, 6, + 174, 7, 6, 90, 7, 1130, 491, 6, 6, 6, + 80, 98, 99, 100, 1343, 4, 103, 104, 105, 106, + 90, 4, 174, 119, 174, 928, 174, 1153, 98, 99, + 100, 1156, 174, 103, 104, 105, 106, 174, 941, 168, + 6, 168, 173, 1109, 168, 175, 6, 1389, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 173, 1162, 173, 173, 166, 1192, 7, 8, + 173, 168, 4, 4, 173, 170, 1196, 1197, 6, 1532, + 6, 4, 6, 122, 122, 7, 7, 990, 175, 7, + 7, 7, 7, 122, 7, 7, 174, 1000, 1001, 1198, + 4, 1200, 171, 1202, 6, 175, 6, 1010, 1011, 175, + 175, 1236, 170, 7, 7, 7, 171, 1216, 174, 6, + 1219, 1220, 168, 6, 6, 170, 177, 6, 169, 7, + 6, 182, 167, 167, 174, 186, 6, 622, 154, 624, + 80, 7, 193, 1485, 7, 1048, 1049, 1050, 7, 7, + 90, 6, 66, 7, 7, 1058, 7, 1060, 98, 99, + 100, 1227, 7, 103, 104, 105, 106, 168, 1071, 7, + 7, 7, 168, 168, 168, 6, 1079, 4, 4, 167, + 665, 6, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 174, 1100, 1101, 1102, + 166, 6, 174, 7, 6, 256, 7, 258, 7, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 708, 80, 710, 7, 166, 1131, 6, + 715, 716, 717, 718, 90, 175, 6, 6, 723, 6, + 64, 1144, 98, 99, 100, 586, 1149, 103, 104, 105, + 106, 6, 4, 1156, 4, 1375, 175, 1160, 1161, 7, + 4, 6, 4, 6, 1167, 1168, 173, 168, 171, 1172, + 168, 168, 168, 7, 6, 174, 167, 1180, 6, 174, + 1379, 171, 1381, 73, 1383, 174, 6, 1190, 174, 1192, + 174, 6, 1391, 6, 174, 1394, 6, 6, 5, 4, + 6, 1204, 174, 7, 355, 7, 791, 358, 793, 7, + 7, 7, 653, 1216, 174, 6, 6, 1220, 6, 175, + 1223, 169, 6, 664, 174, 174, 168, 174, 4, 170, + 118, 6, 6, 1236, 6, 820, 821, 822, 823, 173, + 80, 6, 6, 4, 6, 4, 6, 398, 6, 6, + 90, 80, 6, 6, 1257, 1258, 6, 6, 98, 99, + 100, 90, 1265, 103, 104, 105, 106, 6, 80, 98, + 99, 100, 1497, 1498, 103, 104, 105, 106, 90, 5, + 174, 6, 867, 6, 122, 6, 98, 99, 100, 1488, + 6, 103, 104, 105, 106, 6, 1299, 6, 739, 6, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 164, 131, 455, 6, 163, 154, 155, 171, 138, - 139, 140, 154, 155, 172, 165, 164, 164, 584, 214, - 215, 171, 588, 171, 171, 154, 155, 222, 170, 164, - 159, 226, 156, 157, 158, 164, 166, 154, 155, 163, - 169, 61, 171, 172, 64, 166, 7, 141, 142, 143, - 144, 164, 1485, 170, 506, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 161, - 162, 164, 164, 163, 166, 61, 168, 68, 64, 171, - 66, 173, 172, 164, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 196, 197, - 198, 164, 163, 339, 340, 341, 342, 343, 344, 345, - 346, 154, 155, 349, 350, 351, 141, 142, 143, 144, - 141, 142, 143, 144, 164, 58, 166, 170, 61, 4, - 360, 64, 1565, 64, 232, 233, 161, 162, 154, 155, - 161, 162, 64, 168, 3, 4, 244, 245, 165, 6, - 9, 10, 11, 170, 170, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 154, 155, 171, - 141, 142, 143, 144, 64, 44, 45, 46, 154, 155, - 165, 50, 51, 170, 64, 170, 161, 162, 165, 58, - 161, 162, 61, 170, 170, 64, 171, 66, 164, 84, - 85, 86, 87, 444, 445, 66, 668, 92, 77, 61, - 95, 154, 155, 4, 5, 84, 85, 86, 87, 88, - 164, 164, 166, 92, 161, 162, 95, 61, 171, 166, - 1370, 168, 1372, 164, 1374, 166, 173, 442, 443, 4, - 5, 154, 155, 154, 155, 450, 171, 38, 39, 40, - 41, 42, 43, 61, 154, 155, 64, 170, 49, 170, - 12, 13, 131, 154, 155, 154, 155, 154, 155, 138, - 139, 140, 171, 38, 39, 40, 41, 42, 43, 170, - 64, 170, 522, 170, 49, 154, 155, 165, 1421, 64, - 159, 1424, 170, 61, 1427, 164, 64, 165, 66, 61, - 169, 8, 170, 172, 154, 155, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 164, 69, 161, 162, - 170, 73, 74, 4, 76, 77, 78, 164, 171, 166, - 82, 154, 155, 4, 1474, 154, 155, 154, 155, 154, - 155, 132, 133, 8, 589, 161, 162, 170, 588, 154, - 155, 170, 168, 170, 164, 170, 166, 6, 4, 111, - 112, 113, 154, 155, 164, 170, 58, 132, 133, 61, - 161, 162, 64, 6, 66, 1508, 817, 168, 170, 6, - 165, 164, 80, 166, 630, 170, 1526, 164, 1528, 165, - 1530, 164, 90, 166, 170, 167, 1536, 164, 170, 975, - 98, 99, 978, 979, 102, 103, 167, 167, 167, 170, - 170, 170, 657, 658, 659, 660, 1549, 166, 58, 1552, - 172, 61, 1555, 4, 64, 1558, 66, 5, 167, 4, - 79, 170, 164, 1573, 166, 1575, 164, 1577, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 164, 164, 166, 1588, 163, 1590, 165, 1592, - 38, 39, 40, 41, 42, 43, 671, 164, 658, 659, - 660, 49, 712, 678, 172, 164, 164, 166, 166, 684, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 164, 164, 742, 166, 163, 148, - 149, 150, 742, 80, 153, 154, 154, 155, 156, 157, - 158, 6, 7, 90, 80, 163, 165, 164, 7, 166, - 169, 98, 99, 1188, 1189, 102, 103, 176, 177, 178, - 179, 4, 181, 182, 183, 184, 164, 186, 187, 188, - 164, 164, 788, 166, 193, 986, 164, 164, 794, 166, - 164, 797, 798, 799, 132, 133, 6, 7, 804, 208, - 164, 164, 166, 166, 164, 164, 166, 166, 217, 218, - 164, 164, 166, 166, 164, 164, 166, 226, 164, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 164, 840, 172, 164, 163, 166, 166, - 170, 168, 172, 64, 80, 66, 6, 256, 257, 258, - 170, 170, 172, 172, 90, 171, 6, 266, 267, 268, - 80, 270, 98, 99, 273, 274, 102, 103, 277, 170, - 90, 172, 170, 170, 172, 172, 6, 164, 98, 99, - 164, 290, 102, 103, 849, 171, 295, 296, 297, 298, - 299, 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, 171, 1130, - 930, 4, 80, 898, 899, 900, 172, 164, 80, 348, - 1365, 170, 90, 172, 166, 170, 355, 172, 90, 358, - 98, 99, 172, 164, 102, 103, 98, 99, 164, 164, - 102, 103, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 164, 164, 979, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 398, - 171, 171, 80, 163, 170, 404, 172, 170, 164, 172, - 409, 164, 90, 1008, 171, 414, 415, 171, 417, 418, - 98, 99, 164, 422, 102, 103, 171, 6, 427, 428, - 429, 6, 171, 170, 172, 172, 170, 64, 172, 66, - 172, 170, 164, 172, 80, 170, 5, 172, 447, 448, - 449, 450, 451, 452, 90, 171, 166, 456, 457, 458, - 459, 460, 98, 99, 166, 464, 102, 103, 467, 468, - 166, 6, 471, 472, 473, 6, 168, 476, 477, 170, - 479, 172, 5, 170, 483, 172, 170, 170, 172, 172, - 5, 170, 491, 172, 172, 170, 6, 172, 497, 498, - 170, 170, 172, 172, 170, 170, 172, 172, 1063, 171, - 170, 1101, 172, 119, 170, 80, 172, 516, 1114, 6, - 6, 520, 80, 166, 523, 90, 170, 1122, 172, 80, - 4, 171, 90, 98, 99, 158, 172, 102, 103, 90, - 98, 99, 1333, 6, 102, 103, 80, 98, 99, 1145, - 163, 102, 103, 1148, 168, 4, 90, 6, 170, 170, - 172, 172, 7, 166, 98, 99, 189, 1379, 102, 103, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 207, 171, 6, 210, 163, 1184, - 170, 590, 172, 170, 170, 172, 172, 1188, 1189, 1154, - 6, 170, 1522, 172, 170, 172, 172, 172, 170, 7, - 172, 234, 7, 170, 172, 172, 170, 170, 172, 172, - 619, 172, 170, 622, 172, 624, 625, 1217, 170, 7, - 172, 1226, 164, 632, 633, 1190, 164, 1192, 172, 1194, - 170, 170, 172, 172, 170, 164, 172, 646, 170, 7, - 172, 1206, 164, 652, 1209, 1210, 165, 6, 657, 658, - 659, 660, 7, 1475, 287, 288, 665, 170, 170, 172, - 172, 171, 6, 672, 673, 170, 170, 172, 172, 678, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 691, 7, 6, 694, 163, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 170, 708, - 172, 710, 163, 6, 6, 4, 715, 716, 717, 718, - 4, 177, 116, 171, 723, 171, 182, 171, 171, 171, - 186, 730, 165, 732, 733, 170, 165, 193, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 170, 170, 170, 170, 163, 165, 170, - 6, 4, 167, 4, 6, 119, 6, 6, 767, 768, - 4, 6, 119, 119, 1365, 7, 7, 7, 7, 7, - 7, 7, 781, 782, 783, 784, 785, 786, 7, 171, - 4, 6, 791, 168, 793, 172, 172, 6, 167, 7, - 256, 7, 258, 802, 7, 168, 171, 806, 6, 165, - 6, 810, 167, 6, 1369, 6, 1371, 7, 1373, 6, - 164, 820, 821, 822, 823, 824, 1381, 166, 164, 1384, - 171, 3, 4, 6, 151, 165, 7, 9, 10, 11, - 7, 7, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 7, 66, 7, 7, 7, 867, 6, - 165, 7, 44, 45, 46, 165, 7, 165, 50, 51, - 7, 7, 6, 4, 4, 171, 164, 6, 171, 7, - 6, 6, 1487, 1488, 7, 7, 7, 6, 6, 355, - 64, 6, 358, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 6, 4, 4, - 4, 163, 172, 1478, 6, 6, 925, 4, 165, 165, - 73, 7, 170, 6, 6, 168, 6, 6, 6, 938, - 165, 165, 398, 164, 6, 1541, 168, 6, 171, 6, - 5, 171, 4, 171, 171, 171, 6, 6, 171, 131, - 7, 7, 7, 586, 7, 7, 138, 139, 140, 166, - 171, 171, 6, 4, 1569, 4, 171, 171, 167, 171, - 165, 6, 154, 155, 1580, 6, 1582, 159, 987, 6, - 115, 170, 164, 6, 6, 6, 6, 169, 997, 998, - 6, 6, 6, 4, 1599, 119, 6, 1603, 1007, 1008, - 6, 6, 6, 5, 171, 471, 472, 473, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 653, 170, 165, 6, 6, 491, 7, 6, 168, 171, - 6, 664, 498, 5, 62, 6, 1045, 1046, 1047, 6, - 6, 6, 6, 6, 171, 6, 1055, 1056, 7, 6, - 114, 171, 6, 6, 1063, 172, 172, 171, 171, 171, - 171, 6, 1071, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 117, 6, 172, - 6, 163, 6, 1092, 1093, 1094, 6, 6, 177, 6, - 171, 6, 6, 182, 6, 171, 171, 186, 172, 6, - 80, 171, 6, 4, 193, 4, 739, 396, 6, 6, - 6, 6, 6, 6, 1123, 6, 6, 6, 172, 6, - 171, 171, 171, 6, 171, 6, 6, 1136, 6, 6, - 6, 6, 1141, 171, 171, 171, 6, 171, 171, 1148, - 6, 6, 6, 1152, 1153, 6, 6, 6, 6, 6, - 1159, 1160, 6, 6, 6, 1164, 622, 1005, 624, 1013, - 1444, 3, 3, 1172, 421, 1126, 632, 633, -1, -1, - -1, -1, -1, 1182, -1, 1184, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1196, -1, -1, - -1, -1, -1, -1, -1, 6, -1, 1206, -1, 665, - -1, 1210, -1, -1, 1213, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1226, -1, -1, - 853, 854, -1, 856, -1, 858, 859, -1, -1, 862, - 863, -1, -1, -1, -1, -1, -1, -1, 1247, 1248, - -1, -1, 708, -1, 710, -1, 1255, -1, -1, 715, - 716, 717, 718, -1, -1, -1, -1, 723, -1, -1, - -1, -1, -1, -1, -1, -1, 355, -1, -1, 358, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1289, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, 1307, 163, - 1309, -1, -1, -1, -1, -1, -1, 940, 941, 942, - 1319, -1, 1321, -1, -1, 1324, -1, 950, -1, -1, - -1, -1, -1, -1, -1, 791, -1, 793, 1337, -1, - -1, -1, -1, 1342, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, 1362, 820, 821, 822, 823, -1, -1, - 1369, -1, 1371, -1, 1373, -1, 999, -1, -1, -1, - -1, -1, -1, -1, 1383, -1, -1, -1, 1387, -1, - -1, 1014, 471, 472, 473, -1, -1, 1020, -1, 1398, - 1399, -1, -1, 1026, 1403, 1028, 1029, -1, -1, -1, - 1033, 867, 491, -1, 1413, 1038, 1039, 1040, 1417, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1055, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1065, -1, -1, 1444, 1069, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1455, 12, 13, -1, - -1, -1, -1, 1462, -1, -1, 1465, -1, -1, 1468, - -1, -1, -1, 1472, -1, -1, -1, 1476, -1, 1478, - -1, -1, -1, -1, 1483, -1, -1, 1486, -1, 1488, - -1, -1, -1, -1, -1, -1, 1119, -1, 1121, -1, - -1, -1, -1, 58, 59, 60, 61, 62, 63, 64, + 158, 159, 160, 161, 1317, 6, 1319, 173, 166, 6, + 471, 472, 473, 6, 6, 1551, 1329, 168, 1331, 6, + 6, 1334, 80, 6, 6, 175, 7, 174, 171, 6, + 491, 5, 90, 62, 1347, 6, 175, 498, 6, 1352, + 98, 99, 100, 6, 1579, 103, 104, 105, 106, 6, + 6, 6, 6, 175, 1590, 7, 1592, 175, 6, 1372, + 117, 174, 6, 174, 120, 175, 1379, 6, 1381, 174, + 1383, 174, 174, 6, 1609, 174, 6, 1613, 175, 174, + 1393, 6, 6, 6, 1397, 12, 13, 6, 6, 6, + 6, 6, 175, 174, 174, 1408, 1409, 6, 174, 6, + 1413, 80, 853, 854, 4, 856, 4, 858, 859, 6, + 1423, 862, 863, 6, 1427, 6, 6, 175, 6, 6, + 6, 6, 175, 6, 174, 6, 174, 174, 6, 174, + 6, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 1454, 69, 6, 6, 6, 73, 74, 6, 76, + 77, 78, 1465, 8, 174, 82, 6, 6, 174, 1472, + 174, 622, 1475, 624, 174, 1478, 174, 6, 6, 1482, + 6, 632, 633, 1486, 6, 1488, 6, 6, 6, 6, + 1493, 6, 6, 1496, 1079, 1498, 1008, 114, 115, 116, + 1454, 396, 943, 944, 945, 1016, 3, 3, 421, -1, + 1134, -1, 953, -1, 665, -1, -1, -1, -1, -1, + -1, -1, -1, 80, -1, -1, 1529, -1, -1, -1, + -1, -1, 1535, 90, -1, -1, -1, -1, -1, -1, + -1, 98, 99, 100, -1, 1548, 103, 104, 105, 106, + -1, -1, -1, -1, -1, -1, -1, 708, 175, 710, + 6, 1002, -1, -1, 715, 716, 717, 718, -1, -1, + -1, -1, 723, -1, 1577, -1, 1017, -1, -1, -1, + -1, -1, 1023, -1, -1, -1, -1, -1, 1029, -1, + 1031, 1032, -1, -1, -1, 1036, -1, 12, 13, -1, + 1041, 1042, 1043, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 1058, 175, -1, + -1, 166, -1, -1, -1, -1, -1, -1, 12, 13, + -1, -1, 1073, -1, -1, -1, 1077, -1, -1, -1, + 791, -1, 793, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, 73, 74, - 1519, 76, 77, 78, -1, -1, 1525, 82, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1538, - -1, 12, 13, 622, -1, 624, -1, -1, -1, -1, - -1, -1, 1175, 1176, 1177, 1178, 111, 112, 113, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1567, -1, + -1, 76, 77, 78, -1, -1, -1, 82, -1, 820, + 821, 822, 823, -1, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, -1, 69, 1127, -1, 1129, 73, + 74, -1, 76, 77, 78, -1, -1, -1, 82, 114, + 115, 116, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 867, -1, 12, 13, + 166, -1, -1, -1, -1, -1, -1, -1, 80, -1, + 114, 115, 116, -1, -1, -1, -1, -1, 90, -1, + -1, -1, 1183, 1184, 1185, 1186, 98, 99, 100, 1334, + -1, 103, 104, 105, 106, -1, -1, -1, -1, -1, + 175, -1, -1, -1, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, -1, 69, -1, 1218, -1, 73, + 74, -1, 76, 77, 78, -1, -1, 1372, 82, 1230, + 6, 175, -1, -1, -1, -1, 1237, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 1393, -1, + -1, -1, 166, -1, -1, -1, -1, -1, 1259, -1, + 114, 115, 116, 175, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3, 4, -1, -1, 1280, + -1, 9, 10, 11, -1, -1, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, + -1, -1, -1, 1314, -1, -1, 44, 45, 46, -1, + -1, 175, 50, 51, -1, -1, -1, -1, -1, -1, + 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, + -1, 1486, -1, 1488, -1, -1, -1, -1, -1, 77, + 1351, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, -1, -1, -1, 92, -1, -1, 95, 1079, -1, + 1371, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 1388, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1548, -1, -1, 134, 6, -1, -1, + -1, -1, -1, 141, 142, 143, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 157, + 158, -1, 166, -1, 162, -1, -1, -1, 1439, 167, + -1, -1, -1, -1, 172, -1, 174, 175, -1, -1, + -1, -1, -1, -1, -1, -1, 3, 4, -1, -1, + -1, -1, 9, 10, 11, -1, -1, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 6, + -1, -1, -1, -1, 1495, -1, 1497, 44, 45, 46, + -1, -1, -1, 50, 51, 1216, -1, -1, -1, 1220, + -1, 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1208, 665, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 1220, 69, -1, - -1, -1, 73, 74, 1227, 76, 77, 78, -1, -1, - -1, 82, -1, -1, -1, 1071, -1, 172, 6, -1, - -1, -1, -1, -1, -1, -1, 1249, -1, -1, 708, - -1, 710, -1, -1, -1, -1, 715, 716, 717, 718, - 111, 112, 113, -1, 723, -1, -1, 1270, 3, 4, - 5, -1, -1, -1, 9, 10, 11, -1, -1, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 1304, -1, 38, 39, 40, 41, 42, 43, 44, - 45, 46, -1, -1, 49, 50, 51, -1, -1, -1, - -1, 172, -1, 58, -1, -1, 61, -1, -1, 64, - -1, 66, 791, -1, 793, -1, -1, -1, 1341, -1, - -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, -1, -1, -1, 92, 1361, -1, - 95, 820, 821, 822, 823, -1, -1, -1, -1, -1, - 1206, -1, -1, -1, 1210, 1378, -1, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, 131, 132, 133, -1, - -1, -1, -1, 138, 139, 140, -1, -1, 867, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 154, - 155, -1, -1, -1, 159, -1, 1429, -1, -1, 164, - -1, -1, -1, -1, 169, -1, 171, -1, 3, 4, - -1, -1, -1, -1, 9, 10, 11, -1, -1, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - -1, -1, -1, 1309, -1, -1, -1, -1, -1, 44, - 45, 46, 1485, -1, 1487, 50, 51, -1, 1324, -1, - -1, -1, 3, 4, 5, -1, 7, -1, 9, 10, - 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 6, -1, 1362, 38, 39, 40, - 41, 42, 43, 44, 45, 46, -1, -1, 49, 50, - 51, -1, -1, -1, -1, -1, -1, 1383, -1, -1, + 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, -1, -1, -1, 92, -1, -1, 95, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, -1, -1, -1, 166, -1, -1, + -1, -1, -1, -1, 1575, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 134, -1, -1, + -1, -1, -1, -1, 141, 142, 143, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1319, -1, + 157, 158, -1, -1, -1, 162, -1, -1, -1, -1, + 167, -1, -1, 1334, -1, 172, -1, -1, 175, -1, + -1, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 6, -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1565, -1, -1, -1, 131, -1, -1, -1, - -1, -1, -1, 138, 139, 140, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 154, - 155, -1, -1, -1, 159, -1, -1, -1, -1, 164, - -1, -1, 167, -1, 169, -1, 171, -1, -1, -1, - -1, -1, 1071, -1, 125, -1, -1, -1, -1, -1, - 131, 132, 133, -1, -1, -1, -1, 138, 139, 140, - 141, 142, 143, 144, -1, -1, -1, -1, -1, -1, - 1476, -1, 1478, 154, 155, -1, 6, -1, 159, -1, - 161, 162, -1, 164, -1, 166, -1, 168, 169, -1, - 171, -1, -1, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 1519, -1, -1, -1, -1, -1, -1, + -1, 1372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, -1, -1, -1, 9, 10, - 11, -1, 1538, 14, 15, 16, 17, 18, 19, 20, + 11, -1, 1393, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, -1, -1, 44, 45, 46, -1, -1, -1, 50, + 31, 32, 33, 34, 35, -1, -1, 38, 39, 40, + 41, 42, 43, 44, 45, 46, -1, -1, 49, 50, 51, -1, -1, -1, -1, -1, -1, 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, + -1, -1, -1, -1, -1, 6, 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, -1, -1, - -1, 92, -1, -1, 95, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - 131, -1, -1, 163, -1, -1, -1, 138, 139, 140, - 170, -1, 172, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 154, 155, -1, -1, -1, 159, -1, - -1, -1, -1, 164, -1, -1, -1, -1, 169, -1, - 171, -1, -1, -1, -1, 1324, -1, -1, -1, -1, + -1, 92, -1, -1, 95, 6, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1486, -1, 1488, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 134, 135, 136, 166, -1, -1, -1, + 141, 142, 143, -1, -1, -1, -1, -1, 1529, -1, + -1, -1, -1, -1, -1, -1, 157, 158, -1, -1, + -1, 162, -1, -1, -1, -1, 167, 1548, 3, 4, + 5, 172, 7, 174, 9, 10, 11, -1, -1, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + -1, -1, -1, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 12, 13, 49, 50, 51, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, -1, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, + -1, -1, -1, 73, 74, -1, 76, 77, 78, -1, + -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 128, -1, -1, -1, -1, -1, 134, + 135, 136, -1, -1, -1, -1, 141, 142, 143, 144, + 145, 146, 147, -1, 114, 115, 116, -1, -1, -1, + -1, -1, 157, 158, -1, -1, -1, 162, -1, 164, + 165, -1, 167, -1, 169, -1, 171, 172, -1, 174, 3, 4, 5, -1, -1, -1, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 1362, -1, -1, -1, -1, -1, -1, - -1, 44, 45, 46, -1, -1, -1, 50, 51, -1, - -1, -1, -1, -1, 1383, 58, -1, -1, 61, 12, - 13, 64, -1, 66, -1, -1, -1, -1, -1, -1, + 33, 34, 35, -1, -1, 175, -1, -1, -1, -1, + -1, 44, 45, 46, -1, -1, -1, 50, 51, 12, + 13, -1, -1, -1, -1, 58, -1, -1, 61, -1, + -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, -1, -1, -1, 92, - -1, -1, 95, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 58, 59, 60, 61, 62, + -1, -1, 95, -1, -1, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, - 73, 74, -1, 76, 77, 78, -1, -1, 131, 82, - -1, -1, -1, -1, -1, 138, 139, 140, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1476, -1, 1478, - -1, 154, 155, -1, -1, -1, 159, -1, 111, 112, - 113, 164, -1, 3, 4, -1, 169, -1, 171, 9, - 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, - -1, -1, -1, -1, 44, 45, 46, -1, -1, 1538, - 50, 51, 12, 13, -1, -1, -1, -1, 58, 172, - -1, 61, -1, -1, 64, -1, 66, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, - -1, -1, -1, -1, 84, 85, 86, 87, 88, -1, - -1, -1, 92, -1, -1, 95, -1, -1, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, - -1, -1, -1, 73, 74, -1, 76, 77, 78, -1, - -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, - -1, 131, -1, -1, -1, -1, -1, -1, 138, 139, - 140, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 111, 112, 113, 154, 155, -1, -1, -1, 159, - -1, -1, -1, -1, 164, -1, 3, 4, -1, 169, - -1, 171, 9, 10, 11, -1, -1, 14, 15, 16, + 73, 74, -1, 76, 77, 78, -1, -1, -1, 82, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 134, -1, -1, -1, -1, -1, -1, 141, 142, + 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 114, 115, 116, 157, 158, -1, -1, -1, 162, + -1, -1, -1, -1, 167, -1, 3, 4, 5, 172, + -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, 46, - -1, -1, 172, 50, 51, 12, 13, -1, -1, -1, + -1, -1, 175, 50, 51, 12, 13, -1, -1, -1, -1, 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, @@ -2921,696 +2932,739 @@ static const yytype_int16 yycheck[] = -1, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, 73, 74, -1, 76, 77, 78, -1, -1, -1, 82, -1, -1, -1, -1, - -1, -1, -1, -1, 131, -1, -1, -1, -1, -1, - -1, 138, 139, 140, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 111, 112, 113, 154, 155, -1, - -1, -1, 159, -1, -1, -1, -1, 164, -1, 3, - 4, -1, 169, -1, 171, 9, 10, 11, -1, -1, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, 46, -1, -1, 172, 50, 51, 12, 13, - -1, -1, -1, -1, 58, -1, -1, 61, -1, -1, - 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, - 84, 85, 86, 87, 88, -1, -1, -1, 92, -1, - -1, 95, -1, -1, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, -1, 69, -1, -1, -1, 73, - 74, -1, 76, 77, 78, -1, -1, -1, 82, -1, - -1, -1, -1, -1, -1, -1, -1, 131, -1, -1, - -1, -1, -1, -1, 138, 139, 140, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 111, 112, 113, - 154, 155, -1, -1, -1, 159, -1, -1, -1, -1, - 164, -1, 3, 4, -1, 169, -1, 171, 9, 10, + -1, -1, -1, -1, -1, -1, -1, 134, -1, -1, + -1, -1, -1, -1, 141, 142, 143, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 114, 115, 116, + 157, 158, -1, -1, -1, 162, -1, -1, -1, -1, + 167, -1, 3, 4, -1, 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, -1, -1, 44, 45, 46, -1, -1, 172, 50, + -1, -1, -1, 44, 45, 46, -1, -1, 175, 50, 51, 12, 13, -1, -1, -1, -1, 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, -1, -1, -1, 92, -1, -1, 95, -1, -1, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, 69, -1, - -1, -1, 73, 74, -1, 76, 77, 78, -1, 6, + -1, -1, 73, 74, -1, 76, 77, 78, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, - 131, -1, -1, -1, -1, -1, -1, 138, 139, 140, - 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 111, 112, 113, 154, 155, -1, -1, -1, 159, -1, - -1, -1, -1, 164, -1, 3, 4, -1, 169, -1, - 171, 9, 10, 11, -1, -1, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, - -1, -1, -1, -1, -1, -1, 44, 45, 46, -1, - -1, 172, 50, 51, -1, -1, -1, -1, -1, -1, - 58, -1, -1, 61, -1, -1, 64, -1, 66, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, - -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, - 88, -1, -1, -1, 92, -1, -1, 95, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, -1, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 131, 6, -1, -1, 163, -1, -1, - 138, 139, 140, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 154, 155, -1, -1, - -1, 159, -1, -1, -1, -1, 164, -1, 3, 4, - 5, 169, -1, 171, 9, 10, 11, -1, -1, 14, + -1, -1, -1, 134, -1, -1, -1, -1, -1, -1, + 141, 142, 143, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 114, 115, 116, 157, 158, -1, -1, + -1, 162, -1, -1, -1, -1, 167, -1, 3, 4, + -1, 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - -1, -1, -1, 38, 39, 40, 41, 42, 43, 44, - 45, 46, -1, -1, 49, 50, 51, 3, 4, 5, - -1, -1, -1, 9, 10, 11, -1, -1, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, - -1, -1, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 12, 13, 49, 50, 51, -1, -1, -1, -1, - -1, -1, -1, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, 131, 132, 133, -1, - -1, -1, -1, 138, 139, 140, -1, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, -1, 69, 154, - 155, -1, 73, 74, 159, 76, 77, 78, -1, 164, - -1, 82, -1, -1, 169, -1, 171, 6, -1, -1, - -1, -1, -1, -1, -1, 131, 132, 133, -1, -1, - -1, -1, 138, 139, 140, -1, -1, -1, -1, -1, - 111, 112, 113, -1, -1, -1, -1, -1, 154, 155, - -1, -1, -1, 159, -1, -1, -1, -1, 164, -1, - 3, 4, 5, 169, -1, 171, 9, 10, 11, -1, - -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, -1, -1, -1, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 3, 4, 49, 50, 51, -1, + 35, -1, -1, -1, -1, -1, -1, -1, -1, 44, + 45, 46, -1, -1, 175, 50, 51, 12, 13, -1, + -1, -1, -1, 58, -1, -1, 61, -1, -1, 64, + -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, + 85, 86, 87, 88, -1, -1, -1, 92, -1, -1, + 95, -1, -1, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, -1, 69, -1, -1, -1, 73, 74, + -1, 76, 77, 78, -1, 6, -1, 82, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 134, + -1, -1, -1, -1, 6, -1, 141, 142, 143, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, + 115, 116, 157, 158, -1, -1, -1, 162, -1, -1, + -1, -1, 167, -1, 3, 4, -1, 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, 46, -1, -1, - -1, 50, 51, 12, 13, -1, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 131, 132, - 133, -1, -1, -1, -1, 138, 139, 140, -1, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, - 69, 154, 155, -1, 73, 74, 159, 76, 77, 78, - -1, 164, -1, 82, -1, -1, 169, -1, 171, 6, - -1, -1, 131, -1, -1, -1, -1, -1, -1, 138, - 139, 140, -1, -1, -1, -1, -1, -1, 6, -1, - -1, -1, 111, 112, 113, 154, 155, -1, -1, -1, - 159, -1, -1, -1, -1, 164, -1, -1, 167, -1, - 169, -1, 171, 3, 4, -1, -1, -1, -1, 9, - 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, - -1, -1, -1, 172, 44, 45, 46, 3, 4, -1, - 50, 51, -1, 9, 10, 11, -1, -1, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, - 46, -1, -1, -1, 50, 51, 12, 13, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 131, -1, -1, -1, 163, -1, -1, 138, 139, - 140, -1, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, -1, 69, 154, 155, -1, 73, 74, 159, - 76, 77, 78, -1, 164, -1, 82, 7, 8, 169, - -1, 171, -1, -1, -1, 131, -1, -1, -1, -1, - -1, -1, 138, 139, 140, -1, 7, -1, -1, -1, - -1, -1, -1, -1, -1, 111, 112, 113, 154, 155, - -1, -1, -1, 159, -1, -1, -1, -1, 164, -1, - 3, 4, -1, 169, -1, 171, 9, 10, 11, -1, + 175, 50, 51, -1, -1, -1, -1, -1, -1, 58, + -1, -1, 61, -1, -1, 64, -1, 66, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + -1, -1, -1, 92, -1, -1, 95, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 6, -1, -1, -1, 166, 134, -1, -1, -1, -1, + -1, -1, 141, 142, 143, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 157, 158, + -1, -1, -1, 162, -1, -1, -1, -1, 167, -1, + 3, 4, -1, 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, - -1, 44, 45, 46, -1, -1, 172, 50, 51, -1, + -1, 44, 45, 46, -1, -1, -1, 50, 51, -1, -1, -1, -1, -1, -1, 58, -1, -1, 61, -1, - -1, 64, -1, 66, -1, -1, -1, -1, -1, 8, + -1, 64, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, -1, -1, 8, 92, - -1, -1, 95, -1, -1, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 8, - -1, -1, -1, 163, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 131, 8, - -1, -1, 163, -1, -1, 138, 139, 140, -1, -1, + -1, 84, 85, 86, 87, 88, -1, -1, -1, 92, + -1, -1, 95, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 6, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 134, -1, -1, -1, -1, 6, -1, 141, 142, + 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 157, 158, -1, -1, -1, 162, + -1, -1, -1, -1, 167, -1, 3, 4, -1, 172, + -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, 46, + -1, -1, -1, 50, 51, -1, -1, -1, -1, -1, + -1, 58, -1, -1, 61, -1, -1, 64, -1, 66, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 77, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, -1, -1, -1, 92, -1, -1, 95, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, -1, -1, -1, 166, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 8, -1, -1, -1, 166, 134, -1, -1, + -1, -1, -1, -1, 141, 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 154, 155, -1, -1, -1, 159, 3, 4, 5, - -1, 164, -1, 9, 10, 11, 169, -1, 14, 15, + 157, 158, -1, -1, -1, 162, -1, -1, -1, -1, + 167, -1, 3, 4, 5, 172, -1, 174, 9, 10, + 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, -1, -1, -1, 38, 39, 40, + 41, 42, 43, 44, 45, 46, -1, -1, 49, 50, + 51, 3, 4, 5, -1, -1, -1, 9, 10, 11, + -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, -1, 38, 39, 40, 41, + 42, 43, 44, 45, 46, -1, -1, 49, 50, 51, + -1, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 134, 135, 136, -1, -1, -1, -1, + 141, 142, 143, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 157, 158, -1, -1, + -1, 162, -1, -1, -1, -1, 167, -1, -1, -1, + -1, 172, -1, 174, -1, -1, -1, -1, -1, -1, + -1, -1, 134, 135, 136, -1, -1, -1, -1, 141, + 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, 158, -1, -1, -1, + 162, -1, -1, -1, -1, 167, -1, 3, 4, 5, + 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, 38, 39, 40, 41, 42, 43, 44, 45, - 46, -1, -1, 49, 50, 51, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, 131, 132, 133, -1, -1, - -1, -1, 138, 139, 140, -1, -1, -1, 0, 1, - -1, -1, 4, -1, -1, -1, -1, -1, 154, 155, - 12, 13, -1, 159, -1, -1, -1, -1, 164, -1, - -1, -1, -1, 169, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 36, 37, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 47, 48, -1, -1, -1, - 52, 53, 54, -1, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, -1, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, -1, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, -1, 4, 100, 101, - -1, -1, -1, 105, -1, 12, 13, -1, 110, 111, - 112, 113, -1, -1, 116, -1, 118, -1, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 36, - 37, -1, 134, 135, 136, 137, -1, -1, -1, -1, - 47, 48, -1, -1, -1, 52, 53, 54, -1, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, -1, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, -1, -1, 100, 101, -1, -1, -1, 105, -1, - -1, -1, -1, 110, 111, 112, 113, -1, -1, 116, - -1, 118, -1, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, -1, -1, -1, 134, 135, 136, - 137, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, -1, 172, 145, 146, 147, + 46, 3, 4, 49, 50, 51, -1, 9, 10, 11, + -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, 46, -1, -1, -1, 50, 51, + -1, 3, 4, -1, -1, -1, -1, 9, 10, 11, + -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, 134, 135, + 136, -1, 44, 45, 46, 141, 142, 143, 50, 51, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, 158, -1, -1, -1, 162, -1, -1, -1, + -1, 167, -1, -1, -1, -1, 172, -1, 174, -1, + -1, -1, 134, -1, -1, -1, -1, -1, -1, 141, + 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, 158, -1, -1, -1, + 162, -1, -1, -1, -1, 167, -1, -1, 170, -1, + 172, -1, 174, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 134, -1, -1, -1, -1, -1, -1, 141, + 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, 158, -1, -1, -1, + 162, -1, -1, -1, -1, 167, -1, 3, 4, -1, + 172, -1, 174, 9, 10, 11, -1, -1, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + 46, 3, 4, -1, 50, 51, -1, 9, 10, 11, + -1, -1, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, 46, -1, -1, -1, 50, 51, + -1, -1, -1, -1, -1, -1, 58, -1, -1, 61, + -1, -1, 64, -1, 66, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, -1, 134, -1, + 92, -1, -1, 95, -1, 141, 142, 143, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, 158, -1, 8, -1, 162, -1, -1, -1, + -1, 167, -1, -1, -1, -1, 172, -1, 174, -1, + -1, -1, 134, 8, -1, -1, -1, -1, -1, 141, + 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, 158, -1, -1, -1, + 162, 3, 4, 5, -1, 167, -1, 9, 10, 11, + 172, -1, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, -1, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 3, 4, 49, 50, 51, + -1, 9, 10, 11, -1, -1, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 8, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, 46, -1, + -1, -1, 50, 51, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 8, -1, + -1, -1, 166, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, 134, 135, 136, -1, -1, -1, -1, 141, + 142, 143, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, 158, -1, -1, -1, + 162, -1, -1, -1, -1, 167, -1, -1, -1, -1, + 172, -1, -1, -1, -1, -1, 134, -1, -1, -1, + -1, -1, -1, 141, 142, 143, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 157, + 158, -1, -1, -1, 162, -1, -1, -1, -1, 167, + -1, -1, -1, -1, 172, -1, -1, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 0, 1, -1, 166, 4, -1, -1, -1, + -1, -1, -1, -1, 12, 13, -1, -1, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 36, 37, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, + 48, -1, -1, -1, 52, 53, 54, -1, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + -1, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, -1, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + -1, -1, -1, 101, 102, 4, -1, -1, -1, -1, + 108, -1, -1, 12, 13, 113, 114, 115, 116, -1, + -1, 119, -1, 121, -1, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, -1, 36, 37, 137, + 138, 139, 140, -1, -1, -1, -1, -1, 47, 48, + -1, -1, -1, 52, 53, 54, -1, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, -1, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 12, + 13, -1, 101, 102, 80, -1, -1, -1, -1, 108, + -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, + 119, -1, 121, -1, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, -1, 137, 138, + 139, 140, -1, -1, -1, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, -1, 69, -1, -1, -1, + 73, 74, -1, 76, 77, 78, -1, -1, -1, 82, + -1, -1, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 114, 115, 116, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, -1, 172, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, - 172, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, -1, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, -1, -1, 172, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, -1, 172, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, - 172, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, -1, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, -1, -1, 172, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, -1, 172, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, - 172, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, -1, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, -1, -1, 172, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, -1, 172, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, - 172, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, -1, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, -1, -1, 172, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, -1, 172, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, -1, -1, - 172, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, -1, -1, 172, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, -1, -1, 172, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, -1, -1, 172, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - -1, 171, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, -1, -1, -1, -1, -1, -1, 171, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, -1, 174, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, -1, -1, -1, -1, -1, -1, 174, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, 170, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, 170, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, 170, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, 170, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, -1, -1, -1, 170, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, -1, -1, -1, 170, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, -1, -1, -1, - 170, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, -1, -1, -1, 170, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 170, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, 167, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, -1, -1, 167, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, 167, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, -1, -1, 167, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, 167, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, -1, -1, - 167, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, 167, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, -1, -1, 167, 145, 146, 147, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, 173, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, + -1, 173, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, -1, -1, -1, 173, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, 173, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, 167, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - -1, -1, 167, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, 167, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, -1, -1, 167, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, 167, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, -1, -1, 167, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, 167, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, -1, -1, - 167, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, 167, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, -1, -1, 167, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, -1, + -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, 167, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - -1, -1, 167, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, 167, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, -1, -1, 167, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, 167, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, -1, -1, 167, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, -1, -1, 167, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, -1, -1, - 167, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, -1, -1, 167, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, -1, -1, 167, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, -1, + -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, -1, -1, 167, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - -1, -1, 167, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, -1, -1, 167, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, -1, -1, 167, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, -1, - -1, 167, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, -1, + -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, -1, -1, + 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, 165, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - 165, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, 165, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + -1, -1, 170, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, 165, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - 165, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, 165, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, 165, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - 165, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, 165, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, 165, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - 165, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, 165, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163, -1, 165, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, -1, -1, -1, -1, 163, -1, 165, 145, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, -1, -1, -1, -1, 163, -1, 165, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, -1, -1, -1, -1, 163, -1, - 165, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, -1, -1, -1, -1, 163, - -1, 165, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, -1, -1, -1, -1, - 163, -1, 165, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, -1, -1, -1, - -1, 163, -1, 165, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, -1, -1, - -1, -1, 163, -1, 165, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, -1, - -1, -1, -1, 163, -1, 165, 145, 146, 147, 148, + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - -1, -1, -1, -1, 163, -1, 165, 145, 146, 147, + 159, 160, 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, -1, -1, -1, -1, 163 + 158, 159, 160, 161, -1, -1, -1, -1, 166, -1, + 168, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, -1, -1, -1, 166, + -1, 168, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, -1, -1, -1, + 166, -1, 168, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, + -1, 166, -1, 168, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, -1, + -1, -1, 166, -1, 168, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + -1, -1, -1, 166, -1, 168, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, -1, -1, -1, 166, -1, 168, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, -1, -1, -1, 166, -1, 168, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, -1, -1, -1, 166 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 1, 175, 176, 6, 0, 4, 12, 13, 36, + 0, 1, 178, 179, 6, 0, 4, 12, 13, 36, 37, 47, 48, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 100, 101, 105, 110, - 111, 112, 113, 116, 118, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 134, 135, 136, 137, - 177, 179, 180, 198, 212, 217, 220, 221, 222, 223, - 224, 225, 226, 246, 247, 248, 249, 3, 4, 5, + 92, 93, 94, 95, 96, 97, 101, 102, 108, 113, + 114, 115, 116, 119, 121, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 137, 138, 139, 140, + 180, 182, 183, 201, 215, 220, 223, 224, 225, 226, + 227, 228, 229, 249, 250, 251, 252, 3, 4, 5, 7, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 49, 50, 51, 125, 131, 132, - 133, 138, 139, 140, 141, 142, 143, 144, 154, 155, - 159, 161, 162, 164, 166, 168, 169, 171, 196, 197, - 250, 251, 262, 263, 13, 64, 164, 164, 6, 171, - 6, 6, 6, 6, 166, 166, 164, 171, 164, 164, - 4, 164, 171, 164, 164, 4, 171, 164, 164, 68, - 64, 64, 6, 171, 64, 64, 61, 64, 66, 66, - 58, 61, 64, 66, 61, 64, 66, 61, 64, 164, - 61, 116, 129, 130, 171, 154, 155, 164, 171, 252, - 253, 252, 171, 58, 61, 64, 171, 252, 4, 58, - 62, 73, 64, 66, 64, 61, 4, 125, 171, 4, + 43, 44, 45, 46, 49, 50, 51, 128, 134, 135, + 136, 141, 142, 143, 144, 145, 146, 147, 157, 158, + 162, 164, 165, 167, 169, 171, 172, 174, 199, 200, + 253, 254, 265, 266, 13, 64, 167, 167, 6, 174, + 6, 6, 6, 6, 169, 169, 167, 174, 167, 167, + 4, 167, 174, 167, 167, 4, 174, 167, 167, 68, + 64, 64, 6, 174, 64, 64, 61, 64, 66, 66, + 58, 61, 64, 66, 61, 64, 66, 61, 64, 167, + 61, 119, 132, 133, 174, 157, 158, 167, 174, 255, + 256, 255, 174, 58, 61, 64, 174, 255, 4, 58, + 62, 73, 64, 66, 64, 61, 4, 128, 174, 4, 6, 58, 61, 64, 61, 64, 4, 4, 4, 5, - 35, 58, 61, 64, 66, 77, 155, 164, 171, 217, - 226, 250, 255, 256, 257, 4, 164, 164, 164, 4, - 171, 259, 4, 164, 164, 6, 6, 166, 4, 4, - 5, 171, 5, 171, 4, 250, 6, 164, 171, 4, - 166, 168, 173, 197, 263, 164, 166, 164, 166, 164, - 166, 164, 166, 164, 166, 164, 166, 164, 166, 164, - 166, 164, 166, 164, 166, 164, 166, 164, 166, 164, - 166, 164, 166, 164, 166, 164, 166, 164, 166, 164, - 166, 164, 166, 164, 166, 164, 166, 164, 166, 164, - 166, 164, 164, 164, 164, 164, 164, 164, 7, 164, - 164, 164, 250, 250, 250, 171, 250, 167, 171, 250, - 4, 116, 117, 4, 4, 217, 218, 219, 255, 6, - 6, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 163, 171, 6, 6, 250, - 4, 262, 263, 262, 250, 200, 203, 250, 155, 250, - 257, 258, 250, 250, 164, 250, 258, 250, 250, 164, - 258, 250, 250, 255, 164, 171, 258, 164, 164, 256, - 256, 256, 164, 213, 214, 215, 216, 164, 164, 164, - 255, 250, 4, 255, 259, 171, 171, 252, 252, 252, - 250, 250, 154, 155, 171, 171, 252, 171, 171, 171, - 154, 155, 164, 219, 252, 171, 164, 171, 164, 164, - 164, 256, 256, 255, 164, 4, 6, 166, 166, 219, - 6, 171, 171, 171, 256, 256, 166, 166, 164, 166, - 168, 166, 5, 171, 5, 5, 5, 58, 61, 64, - 66, 171, 250, 257, 250, 172, 258, 8, 156, 6, - 6, 250, 250, 250, 168, 250, 171, 119, 250, 250, - 250, 6, 6, 219, 6, 219, 166, 6, 255, 255, - 166, 250, 4, 171, 6, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 262, 264, 264, - 262, 262, 262, 262, 262, 262, 262, 262, 264, 250, - 262, 262, 262, 258, 165, 7, 196, 258, 167, 7, - 196, 197, 168, 7, 166, 172, 58, 61, 64, 66, - 212, 6, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 181, 6, 166, - 168, 165, 170, 165, 170, 170, 167, 170, 199, 167, - 199, 165, 156, 170, 172, 165, 165, 250, 165, 172, - 165, 165, 250, 172, 165, 165, 7, 250, 250, 172, - 250, 250, 7, 7, 244, 244, 250, 164, 164, 164, - 164, 250, 250, 250, 7, 171, 165, 6, 171, 219, - 219, 170, 170, 170, 252, 252, 218, 218, 170, 250, - 250, 250, 250, 230, 170, 219, 250, 250, 250, 250, - 250, 7, 245, 6, 7, 250, 6, 250, 250, 172, - 258, 258, 258, 6, 6, 250, 250, 165, 171, 167, - 171, 250, 4, 4, 250, 171, 171, 171, 171, 258, - 165, 172, 250, 171, 250, 257, 165, 165, 165, 116, - 170, 219, 171, 8, 165, 167, 172, 172, 165, 170, - 172, 250, 167, 197, 250, 165, 167, 165, 167, 165, - 167, 165, 167, 165, 167, 165, 167, 165, 167, 165, - 167, 165, 167, 165, 167, 165, 167, 170, 170, 165, - 167, 165, 167, 165, 167, 165, 167, 165, 167, 165, - 167, 170, 170, 170, 170, 170, 170, 165, 170, 167, - 165, 170, 167, 170, 170, 165, 165, 170, 170, 170, - 165, 6, 170, 165, 170, 172, 196, 255, 172, 168, - 196, 197, 263, 250, 6, 4, 4, 171, 260, 167, - 171, 171, 171, 171, 8, 4, 106, 107, 108, 109, - 172, 184, 188, 191, 193, 194, 250, 4, 6, 151, - 178, 258, 6, 258, 250, 6, 4, 6, 262, 7, - 250, 257, 119, 7, 7, 165, 7, 119, 7, 7, - 165, 119, 7, 7, 250, 165, 172, 171, 165, 165, - 250, 255, 4, 243, 6, 165, 209, 250, 263, 209, - 209, 209, 165, 165, 165, 255, 258, 168, 219, 172, - 172, 252, 250, 250, 172, 172, 250, 252, 170, 170, - 170, 80, 90, 98, 99, 102, 103, 240, 241, 252, - 172, 227, 165, 172, 165, 165, 165, 250, 6, 250, - 165, 167, 167, 172, 172, 172, 167, 167, 258, 258, - 167, 167, 172, 258, 258, 258, 258, 172, 8, 258, - 7, 7, 7, 168, 250, 172, 250, 250, 7, 168, - 171, 255, 6, 167, 168, 197, 262, 172, 250, 250, - 250, 250, 250, 250, 250, 250, 262, 258, 258, 262, - 262, 262, 262, 250, 262, 165, 250, 6, 167, 4, - 116, 117, 250, 6, 6, 6, 7, 166, 259, 261, - 6, 258, 258, 258, 258, 250, 185, 164, 164, 171, - 195, 6, 167, 151, 262, 165, 165, 170, 7, 252, - 64, 66, 255, 255, 7, 255, 64, 66, 255, 255, - 7, 66, 255, 255, 6, 7, 7, 258, 7, 7, - 80, 242, 6, 7, 165, 165, 165, 165, 7, 7, - 7, 6, 172, 4, 172, 170, 170, 170, 172, 172, - 252, 252, 252, 4, 6, 171, 164, 6, 104, 6, - 104, 172, 241, 170, 240, 7, 6, 7, 7, 7, - 6, 171, 6, 6, 6, 64, 250, 6, 6, 172, - 172, 168, 172, 172, 172, 172, 250, 172, 255, 255, - 255, 4, 170, 8, 8, 165, 4, 4, 255, 172, - 6, 4, 6, 165, 167, 165, 167, 165, 167, 165, - 167, 165, 167, 165, 170, 165, 165, 165, 165, 196, - 6, 196, 7, 196, 197, 168, 7, 6, 259, 250, - 170, 172, 172, 172, 172, 172, 164, 250, 250, 254, - 255, 171, 168, 6, 6, 178, 6, 250, 171, 250, - 263, 6, 171, 171, 73, 211, 211, 255, 6, 171, - 171, 6, 6, 255, 171, 6, 6, 5, 255, 172, - 255, 255, 4, 6, 255, 7, 7, 7, 7, 255, - 255, 255, 7, 6, 7, 250, 250, 250, 171, 171, - 170, 172, 170, 172, 170, 172, 166, 250, 255, 250, - 6, 6, 250, 252, 172, 5, 171, 255, 171, 171, - 171, 255, 258, 171, 6, 165, 167, 4, 6, 6, - 115, 250, 250, 250, 6, 6, 7, 170, 6, 197, - 262, 255, 255, 263, 250, 6, 4, 260, 6, 167, - 259, 6, 6, 6, 6, 182, 250, 170, 170, 170, - 172, 183, 250, 4, 262, 170, 250, 263, 250, 250, - 252, 6, 6, 6, 250, 250, 6, 250, 5, 6, - 171, 6, 119, 210, 250, 6, 255, 255, 255, 255, - 6, 4, 6, 6, 250, 250, 263, 172, 165, 170, - 172, 218, 218, 252, 6, 231, 252, 6, 232, 252, - 6, 233, 250, 172, 170, 165, 172, 170, 6, 155, - 252, 6, 254, 252, 252, 6, 172, 250, 255, 170, - 172, 8, 172, 165, 171, 250, 263, 255, 165, 6, - 6, 6, 6, 7, 6, 168, 165, 170, 250, 250, - 255, 171, 170, 172, 6, 250, 201, 202, 172, 172, - 172, 172, 172, 5, 254, 62, 6, 6, 6, 6, - 6, 171, 171, 6, 6, 171, 250, 172, 172, 170, - 171, 170, 171, 170, 171, 167, 6, 255, 7, 171, - 250, 170, 172, 170, 170, 6, 172, 114, 250, 250, - 258, 6, 6, 172, 259, 117, 186, 250, 170, 170, - 254, 250, 6, 170, 205, 207, 6, 6, 6, 6, - 6, 6, 172, 171, 254, 258, 218, 170, 172, 250, - 252, 240, 250, 252, 240, 250, 252, 240, 6, 170, - 172, 255, 219, 172, 252, 6, 258, 252, 250, 172, - 172, 172, 6, 6, 171, 250, 250, 172, 250, 170, - 172, 206, 170, 172, 208, 171, 250, 172, 172, 172, - 250, 172, 170, 172, 172, 170, 172, 172, 170, 172, - 255, 6, 80, 172, 228, 171, 170, 172, 170, 6, - 6, 183, 165, 170, 6, 171, 170, 4, 4, 250, - 172, 6, 6, 172, 6, 234, 250, 6, 6, 235, - 250, 6, 6, 236, 250, 6, 172, 250, 240, 219, - 258, 6, 252, 258, 172, 189, 250, 254, 250, 171, - 255, 263, 171, 250, 263, 170, 171, 172, 171, 172, - 171, 172, 6, 6, 172, 172, 229, 172, 170, 172, - 6, 171, 165, 172, 172, 204, 250, 264, 250, 240, - 6, 237, 240, 6, 238, 240, 6, 239, 240, 6, - 258, 6, 187, 262, 192, 171, 6, 170, 172, 7, - 172, 172, 172, 171, 172, 171, 172, 171, 172, 172, - 170, 172, 171, 254, 250, 263, 6, 6, 240, 6, - 240, 6, 240, 6, 262, 6, 190, 262, 172, 7, - 172, 172, 172, 170, 172, 6, 263, 6, 6, 6, - 262, 6 + 35, 58, 61, 64, 66, 77, 158, 167, 174, 220, + 229, 253, 258, 259, 260, 4, 167, 167, 167, 4, + 174, 262, 4, 167, 167, 6, 6, 169, 4, 4, + 5, 174, 5, 174, 4, 253, 6, 167, 174, 4, + 169, 171, 176, 200, 266, 167, 169, 167, 169, 167, + 169, 167, 169, 167, 169, 167, 169, 167, 169, 167, + 169, 167, 169, 167, 169, 167, 169, 167, 169, 167, + 169, 167, 169, 167, 169, 167, 169, 167, 169, 167, + 169, 167, 169, 167, 169, 167, 169, 167, 169, 167, + 169, 167, 167, 167, 167, 167, 167, 167, 7, 167, + 167, 167, 253, 253, 253, 174, 253, 170, 174, 253, + 4, 119, 120, 4, 4, 220, 221, 222, 258, 6, + 6, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 166, 174, 6, 6, 253, + 4, 265, 266, 265, 253, 203, 206, 253, 158, 253, + 260, 261, 253, 253, 167, 253, 261, 253, 253, 167, + 261, 253, 253, 258, 167, 174, 261, 167, 167, 259, + 259, 259, 167, 216, 217, 218, 219, 167, 167, 167, + 258, 253, 4, 258, 262, 174, 174, 255, 255, 255, + 253, 253, 157, 158, 174, 174, 255, 174, 174, 174, + 157, 158, 167, 222, 255, 174, 167, 174, 167, 167, + 167, 259, 259, 258, 167, 4, 6, 169, 169, 222, + 6, 174, 174, 174, 259, 259, 169, 169, 167, 169, + 171, 169, 5, 174, 5, 5, 5, 58, 61, 64, + 66, 174, 253, 260, 253, 175, 261, 8, 159, 6, + 6, 253, 253, 253, 171, 253, 174, 122, 253, 253, + 253, 6, 6, 222, 6, 222, 169, 6, 258, 258, + 169, 253, 4, 174, 6, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 265, 267, 267, + 265, 265, 265, 265, 265, 265, 265, 265, 267, 253, + 265, 265, 265, 261, 168, 7, 199, 261, 170, 7, + 199, 200, 171, 7, 169, 175, 58, 61, 64, 66, + 215, 6, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 184, 6, 169, + 171, 168, 173, 168, 173, 173, 170, 173, 202, 170, + 202, 168, 159, 173, 175, 168, 168, 253, 168, 175, + 168, 168, 253, 175, 168, 168, 7, 253, 253, 175, + 253, 253, 7, 7, 247, 247, 253, 167, 167, 167, + 167, 253, 253, 253, 7, 174, 168, 6, 174, 222, + 222, 173, 173, 173, 255, 255, 221, 221, 173, 253, + 253, 253, 253, 233, 173, 222, 253, 253, 253, 253, + 253, 7, 248, 6, 7, 253, 6, 253, 253, 175, + 261, 261, 261, 6, 6, 253, 253, 168, 174, 170, + 174, 253, 4, 4, 253, 174, 174, 174, 174, 261, + 168, 175, 253, 174, 253, 260, 168, 168, 168, 119, + 173, 222, 174, 8, 168, 170, 175, 175, 168, 173, + 175, 253, 170, 200, 253, 168, 170, 168, 170, 168, + 170, 168, 170, 168, 170, 168, 170, 168, 170, 168, + 170, 168, 170, 168, 170, 168, 170, 173, 173, 168, + 170, 168, 170, 168, 170, 168, 170, 168, 170, 168, + 170, 173, 173, 173, 173, 173, 173, 168, 173, 170, + 168, 173, 170, 173, 173, 168, 168, 173, 173, 173, + 168, 6, 173, 168, 173, 175, 199, 258, 175, 171, + 199, 200, 266, 253, 6, 4, 4, 174, 263, 170, + 174, 174, 174, 174, 8, 4, 109, 110, 111, 112, + 175, 187, 191, 194, 196, 197, 253, 4, 6, 154, + 181, 261, 6, 261, 253, 6, 4, 6, 265, 7, + 253, 260, 122, 7, 7, 168, 7, 122, 7, 7, + 168, 122, 7, 7, 253, 168, 175, 174, 168, 168, + 253, 258, 4, 246, 6, 168, 212, 253, 266, 212, + 212, 212, 168, 168, 168, 258, 261, 171, 222, 175, + 175, 255, 253, 253, 175, 175, 253, 255, 173, 173, + 173, 80, 90, 98, 99, 100, 103, 104, 105, 106, + 243, 244, 255, 175, 230, 168, 175, 168, 168, 168, + 253, 6, 253, 168, 170, 170, 175, 175, 175, 170, + 170, 261, 261, 170, 170, 175, 261, 261, 261, 261, + 175, 8, 261, 7, 7, 7, 171, 253, 175, 253, + 253, 7, 171, 174, 258, 6, 170, 171, 200, 265, + 175, 253, 253, 253, 253, 253, 253, 253, 253, 265, + 261, 261, 265, 265, 265, 265, 253, 265, 168, 253, + 6, 170, 4, 119, 120, 253, 6, 6, 6, 7, + 169, 262, 264, 6, 261, 261, 261, 261, 253, 188, + 167, 167, 174, 198, 6, 170, 154, 265, 168, 168, + 173, 7, 255, 64, 66, 258, 258, 7, 258, 64, + 66, 258, 258, 7, 66, 258, 258, 6, 7, 7, + 261, 7, 7, 80, 245, 6, 7, 168, 168, 168, + 168, 7, 7, 7, 6, 175, 4, 175, 173, 173, + 173, 175, 175, 255, 255, 255, 4, 6, 174, 6, + 167, 6, 107, 6, 107, 6, 107, 6, 107, 175, + 244, 173, 243, 7, 6, 7, 7, 7, 6, 174, + 6, 6, 6, 64, 253, 6, 6, 175, 175, 171, + 175, 175, 175, 175, 253, 175, 258, 258, 258, 4, + 173, 8, 8, 168, 4, 4, 258, 175, 6, 4, + 6, 168, 170, 168, 170, 168, 170, 168, 170, 168, + 170, 168, 173, 168, 168, 168, 168, 199, 6, 199, + 7, 199, 200, 171, 7, 6, 262, 253, 173, 175, + 175, 175, 175, 175, 167, 253, 253, 257, 258, 174, + 171, 6, 6, 181, 6, 253, 174, 253, 266, 6, + 174, 174, 73, 214, 214, 258, 6, 174, 174, 6, + 6, 258, 174, 6, 6, 5, 258, 175, 258, 258, + 4, 6, 258, 7, 7, 7, 7, 258, 258, 258, + 7, 6, 7, 253, 253, 253, 174, 174, 173, 175, + 173, 175, 173, 175, 169, 253, 258, 253, 6, 6, + 6, 6, 253, 255, 175, 5, 174, 258, 174, 174, + 174, 258, 261, 174, 6, 168, 170, 4, 6, 6, + 118, 253, 253, 253, 6, 6, 7, 173, 6, 200, + 265, 258, 258, 266, 253, 6, 4, 263, 6, 170, + 262, 6, 6, 6, 6, 185, 253, 173, 173, 173, + 175, 186, 253, 4, 265, 173, 253, 266, 253, 253, + 255, 6, 6, 6, 253, 253, 6, 253, 5, 6, + 174, 6, 122, 213, 253, 6, 258, 258, 258, 258, + 6, 4, 6, 6, 253, 253, 266, 175, 168, 173, + 175, 221, 221, 255, 6, 234, 255, 6, 235, 255, + 6, 236, 253, 175, 173, 168, 175, 173, 6, 158, + 255, 6, 257, 255, 255, 6, 175, 253, 258, 173, + 175, 8, 175, 168, 174, 253, 266, 258, 168, 6, + 6, 6, 6, 7, 6, 171, 168, 173, 253, 253, + 258, 174, 173, 175, 6, 253, 204, 205, 175, 175, + 175, 175, 175, 5, 257, 62, 6, 6, 6, 6, + 6, 174, 174, 6, 6, 174, 253, 175, 175, 173, + 174, 173, 174, 173, 174, 170, 6, 258, 7, 174, + 253, 173, 175, 173, 173, 6, 175, 117, 253, 253, + 261, 6, 6, 175, 262, 120, 189, 253, 173, 173, + 257, 253, 6, 173, 208, 210, 6, 6, 6, 6, + 6, 6, 175, 174, 257, 261, 221, 173, 175, 253, + 255, 243, 253, 255, 243, 253, 255, 243, 6, 173, + 175, 258, 222, 175, 255, 6, 261, 255, 253, 175, + 175, 175, 6, 6, 174, 253, 253, 175, 253, 173, + 175, 209, 173, 175, 211, 174, 253, 175, 175, 175, + 253, 175, 173, 175, 175, 173, 175, 175, 173, 175, + 258, 6, 80, 175, 231, 174, 173, 175, 173, 6, + 6, 186, 168, 173, 6, 174, 173, 4, 4, 253, + 175, 6, 6, 175, 6, 237, 253, 6, 6, 238, + 253, 6, 6, 239, 253, 6, 175, 253, 243, 222, + 261, 6, 255, 261, 175, 192, 253, 257, 253, 174, + 258, 266, 174, 253, 266, 173, 174, 175, 174, 175, + 174, 175, 6, 6, 175, 175, 232, 175, 173, 175, + 6, 174, 168, 175, 175, 207, 253, 267, 253, 243, + 6, 240, 243, 6, 241, 243, 6, 242, 243, 6, + 261, 6, 190, 265, 195, 174, 6, 173, 175, 7, + 175, 175, 175, 174, 175, 174, 175, 174, 175, 175, + 173, 175, 174, 257, 253, 266, 6, 6, 243, 6, + 243, 6, 243, 6, 265, 6, 193, 265, 175, 7, + 175, 175, 175, 173, 175, 6, 266, 6, 6, 6, + 265, 6 }; #define yyerrok (yyerrstatus = 0) @@ -6352,6 +6406,8 @@ yyreduce: for(int i = 0; i < List_Nbr((yyvsp[(7) - (8)].l)); i++){ s->compound.push_back((int)*(double*)List_Pointer((yyvsp[(7) - (8)].l), i)); } + // Added by Trevor Strickler + setSurfaceGeneratrices(s, (List_T*) 0 ); Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); } List_Delete((yyvsp[(7) - (8)].l)); @@ -6361,7 +6417,7 @@ yyreduce: break; case 148: -#line 1857 "Gmsh.y" +#line 1859 "Gmsh.y" { int num = (int)(yyvsp[(4) - (12)].d); if(FindSurface(num)){ @@ -6381,6 +6437,9 @@ yyreduce: s->compoundBoundary[i].push_back((int)*(double*)List_Pointer(l, j)); } } + // Added by Trevor Strickler + setSurfaceGeneratrices(s, (List_T*) 0 ); + Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); } List_Delete((yyvsp[(7) - (12)].l)); @@ -6394,14 +6453,14 @@ yyreduce: break; case 149: -#line 1887 "Gmsh.y" +#line 1892 "Gmsh.y" { curPhysDim = 2; ;} break; case 150: -#line 1891 "Gmsh.y" +#line 1896 "Gmsh.y" { int num = (int)(yyvsp[(5) - (9)].i); if(FindPhysicalGroup(num, MSH_PHYSICAL_SURFACE)){ @@ -6420,7 +6479,7 @@ yyreduce: break; case 151: -#line 1911 "Gmsh.y" +#line 1916 "Gmsh.y" { yymsg(0, "'Complex Volume' command is deprecated: use 'Volume' instead"); int num = (int)(yyvsp[(4) - (8)].d); @@ -6441,7 +6500,7 @@ yyreduce: break; case 152: -#line 1929 "Gmsh.y" +#line 1934 "Gmsh.y" { int num = (int)(yyvsp[(3) - (7)].d); if(FindVolume(num)){ @@ -6461,7 +6520,7 @@ yyreduce: break; case 153: -#line 1946 "Gmsh.y" +#line 1951 "Gmsh.y" { int num = (int)(yyvsp[(4) - (8)].d); if(FindVolume(num)){ @@ -6480,14 +6539,14 @@ yyreduce: break; case 154: -#line 1962 "Gmsh.y" +#line 1967 "Gmsh.y" { curPhysDim = 3; ;} break; case 155: -#line 1966 "Gmsh.y" +#line 1971 "Gmsh.y" { int num = (int)(yyvsp[(5) - (9)].i); if(FindPhysicalGroup(num, MSH_PHYSICAL_VOLUME)){ @@ -6506,7 +6565,7 @@ yyreduce: break; case 156: -#line 1988 "Gmsh.y" +#line 1993 "Gmsh.y" { TranslateShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(4) - (5)].l)); (yyval.l) = (yyvsp[(4) - (5)].l); @@ -6514,7 +6573,7 @@ yyreduce: break; case 157: -#line 1993 "Gmsh.y" +#line 1998 "Gmsh.y" { RotateShapes((yyvsp[(3) - (11)].v)[0], (yyvsp[(3) - (11)].v)[1], (yyvsp[(3) - (11)].v)[2], (yyvsp[(5) - (11)].v)[0], (yyvsp[(5) - (11)].v)[1], (yyvsp[(5) - (11)].v)[2], (yyvsp[(7) - (11)].d), (yyvsp[(10) - (11)].l)); (yyval.l) = (yyvsp[(10) - (11)].l); @@ -6522,7 +6581,7 @@ yyreduce: break; case 158: -#line 1998 "Gmsh.y" +#line 2003 "Gmsh.y" { SymmetryShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(2) - (5)].v)[3], (yyvsp[(4) - (5)].l)); (yyval.l) = (yyvsp[(4) - (5)].l); @@ -6530,7 +6589,7 @@ yyreduce: break; case 159: -#line 2003 "Gmsh.y" +#line 2008 "Gmsh.y" { DilatShapes((yyvsp[(3) - (9)].v)[0], (yyvsp[(3) - (9)].v)[1], (yyvsp[(3) - (9)].v)[2], (yyvsp[(5) - (9)].d), (yyvsp[(5) - (9)].d), (yyvsp[(5) - (9)].d), (yyvsp[(8) - (9)].l)); (yyval.l) = (yyvsp[(8) - (9)].l); @@ -6538,7 +6597,7 @@ yyreduce: break; case 160: -#line 2008 "Gmsh.y" +#line 2013 "Gmsh.y" { DilatShapes((yyvsp[(3) - (9)].v)[0], (yyvsp[(3) - (9)].v)[1], (yyvsp[(3) - (9)].v)[2], (yyvsp[(5) - (9)].v)[0], (yyvsp[(5) - (9)].v)[1], (yyvsp[(5) - (9)].v)[2], (yyvsp[(8) - (9)].l)); (yyval.l) = (yyvsp[(8) - (9)].l); @@ -6546,7 +6605,7 @@ yyreduce: break; case 161: -#line 2013 "Gmsh.y" +#line 2018 "Gmsh.y" { (yyval.l) = List_Create(3, 3, sizeof(Shape)); if(!strcmp((yyvsp[(1) - (4)].c), "Duplicata")){ @@ -6572,7 +6631,7 @@ yyreduce: break; case 162: -#line 2036 "Gmsh.y" +#line 2041 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); IntersectCurvesWithSurface((yyvsp[(4) - (9)].l), (int)(yyvsp[(8) - (9)].d), (yyval.l)); @@ -6581,7 +6640,7 @@ yyreduce: break; case 163: -#line 2042 "Gmsh.y" +#line 2047 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape*)); List_T *tmp = ListOfDouble2ListOfInt((yyvsp[(7) - (9)].l)); @@ -6592,31 +6651,31 @@ yyreduce: break; case 164: -#line 2052 "Gmsh.y" +#line 2057 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; case 165: -#line 2053 "Gmsh.y" +#line 2058 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; case 166: -#line 2058 "Gmsh.y" +#line 2063 "Gmsh.y" { (yyval.l) = List_Create(3, 3, sizeof(Shape)); ;} break; case 167: -#line 2062 "Gmsh.y" +#line 2067 "Gmsh.y" { List_Add((yyval.l), &(yyvsp[(2) - (2)].s)); ;} break; case 168: -#line 2066 "Gmsh.y" +#line 2071 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){ double d; @@ -6642,7 +6701,7 @@ yyreduce: break; case 169: -#line 2089 "Gmsh.y" +#line 2094 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){ double d; @@ -6668,7 +6727,7 @@ yyreduce: break; case 170: -#line 2112 "Gmsh.y" +#line 2117 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){ double d; @@ -6694,7 +6753,7 @@ yyreduce: break; case 171: -#line 2135 "Gmsh.y" +#line 2140 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){ double d; @@ -6720,7 +6779,7 @@ yyreduce: break; case 172: -#line 2163 "Gmsh.y" +#line 2168 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(List_Nbr((yyvsp[(7) - (8)].l)) == 4){ @@ -6744,7 +6803,7 @@ yyreduce: break; case 173: -#line 2184 "Gmsh.y" +#line 2189 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) int t = (int)(yyvsp[(4) - (10)].d); @@ -6773,7 +6832,7 @@ yyreduce: break; case 174: -#line 2211 "Gmsh.y" +#line 2216 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(List_Nbr((yyvsp[(12) - (14)].l)) == 0){ @@ -6796,7 +6855,7 @@ yyreduce: break; case 175: -#line 2232 "Gmsh.y" +#line 2237 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(List_Nbr((yyvsp[(14) - (16)].l)) == 0){ @@ -6820,7 +6879,7 @@ yyreduce: break; case 176: -#line 2253 "Gmsh.y" +#line 2258 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(List_Nbr((yyvsp[(10) - (12)].l)) == 1){ @@ -6843,7 +6902,7 @@ yyreduce: break; case 177: -#line 2273 "Gmsh.y" +#line 2278 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(!strcmp((yyvsp[(2) - (8)].c), "Union")){ @@ -6958,7 +7017,7 @@ yyreduce: break; case 178: -#line 2385 "Gmsh.y" +#line 2390 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(!strcmp((yyvsp[(2) - (8)].c), "MathEval")){ @@ -6980,7 +7039,7 @@ yyreduce: break; case 179: -#line 2404 "Gmsh.y" +#line 2409 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(!strcmp((yyvsp[(2) - (6)].c), "CutMesh")){ @@ -7021,7 +7080,7 @@ yyreduce: break; case 180: -#line 2443 "Gmsh.y" +#line 2448 "Gmsh.y" { #if defined(HAVE_DINTEGRATION) if(!strcmp((yyvsp[(2) - (14)].c), "Cylinder") && List_Nbr((yyvsp[(12) - (14)].l)) == 1){ @@ -7127,7 +7186,7 @@ yyreduce: break; case 181: -#line 2551 "Gmsh.y" +#line 2556 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ Shape TheShape; @@ -7139,7 +7198,7 @@ yyreduce: break; case 182: -#line 2560 "Gmsh.y" +#line 2565 "Gmsh.y" { #if defined(HAVE_MESH) GModel::current()->getFields()->deleteField((int)(yyvsp[(4) - (6)].d)); @@ -7148,7 +7207,7 @@ yyreduce: break; case 183: -#line 2566 "Gmsh.y" +#line 2571 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (6)].c), "View")){ @@ -7166,7 +7225,7 @@ yyreduce: break; case 184: -#line 2581 "Gmsh.y" +#line 2586 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){ ClearProject(); @@ -7197,7 +7256,7 @@ yyreduce: break; case 185: -#line 2609 "Gmsh.y" +#line 2614 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){ @@ -7212,7 +7271,7 @@ yyreduce: break; case 186: -#line 2626 "Gmsh.y" +#line 2631 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ Shape TheShape; @@ -7224,7 +7283,7 @@ yyreduce: break; case 187: -#line 2635 "Gmsh.y" +#line 2640 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(5) - (6)].l)); i++){ Shape TheShape; @@ -7236,7 +7295,7 @@ yyreduce: break; case 188: -#line 2649 "Gmsh.y" +#line 2654 "Gmsh.y" { for(int i = 0; i < 4; i++) VisibilityShape((yyvsp[(2) - (3)].c), i, 1, false); @@ -7245,7 +7304,7 @@ yyreduce: break; case 189: -#line 2655 "Gmsh.y" +#line 2660 "Gmsh.y" { for(int i = 0; i < 4; i++) VisibilityShape((yyvsp[(2) - (3)].c), i, 0, false); @@ -7254,7 +7313,7 @@ yyreduce: break; case 190: -#line 2661 "Gmsh.y" +#line 2666 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ Shape TheShape; @@ -7266,7 +7325,7 @@ yyreduce: break; case 191: -#line 2670 "Gmsh.y" +#line 2675 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ Shape TheShape; @@ -7278,7 +7337,7 @@ yyreduce: break; case 192: -#line 2679 "Gmsh.y" +#line 2684 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ Shape TheShape; @@ -7290,7 +7349,7 @@ yyreduce: break; case 193: -#line 2688 "Gmsh.y" +#line 2693 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ Shape TheShape; @@ -7302,7 +7361,7 @@ yyreduce: break; case 194: -#line 2702 "Gmsh.y" +#line 2707 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (3)].c), "Include")){ std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c)); @@ -7350,7 +7409,7 @@ yyreduce: break; case 195: -#line 2747 "Gmsh.y" +#line 2752 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){ @@ -7370,7 +7429,7 @@ yyreduce: break; case 196: -#line 2764 "Gmsh.y" +#line 2769 "Gmsh.y" { #if defined(HAVE_POST) && defined(HAVE_MESH) if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh") && !strcmp((yyvsp[(3) - (7)].c), "View")){ @@ -7388,7 +7447,7 @@ yyreduce: break; case 197: -#line 2779 "Gmsh.y" +#line 2784 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){ SleepInSeconds((yyvsp[(2) - (3)].d)); @@ -7410,7 +7469,7 @@ yyreduce: break; case 198: -#line 2798 "Gmsh.y" +#line 2803 "Gmsh.y" { #if defined(HAVE_PLUGINS) try { @@ -7425,7 +7484,7 @@ yyreduce: break; case 199: -#line 2810 "Gmsh.y" +#line 2815 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews")) @@ -7452,14 +7511,14 @@ yyreduce: break; case 200: -#line 2834 "Gmsh.y" +#line 2839 "Gmsh.y" { Msg::Exit(0); ;} break; case 201: -#line 2838 "Gmsh.y" +#line 2843 "Gmsh.y" { gmsh_yyerrorstate = 999; // this will be checked when yyparse returns YYABORT; @@ -7467,7 +7526,7 @@ yyreduce: break; case 202: -#line 2843 "Gmsh.y" +#line 2848 "Gmsh.y" { // FIXME: this is a hack to force a transfer from the old DB to // the new DB. This will become unnecessary if/when we fill the @@ -7477,7 +7536,7 @@ yyreduce: break; case 203: -#line 2850 "Gmsh.y" +#line 2855 "Gmsh.y" { CTX::instance()->forcedBBox = 0; GModel::current()->importGEOInternals(); @@ -7486,7 +7545,7 @@ yyreduce: break; case 204: -#line 2856 "Gmsh.y" +#line 2861 "Gmsh.y" { CTX::instance()->forcedBBox = 1; SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d)); @@ -7494,7 +7553,7 @@ yyreduce: break; case 205: -#line 2861 "Gmsh.y" +#line 2866 "Gmsh.y" { #if defined(HAVE_OPENGL) drawContext::global()->draw(); @@ -7503,21 +7562,21 @@ yyreduce: break; case 206: -#line 2867 "Gmsh.y" +#line 2872 "Gmsh.y" { GModel::current()->createTopologyFromMesh(); ;} break; case 207: -#line 2871 "Gmsh.y" +#line 2876 "Gmsh.y" { GModel::current()->createTopologyFromMesh(1); ;} break; case 208: -#line 2875 "Gmsh.y" +#line 2880 "Gmsh.y" { GModel::current()->importGEOInternals(); GModel::current()->refineMesh(CTX::instance()->mesh.secondOrderLinear); @@ -7525,7 +7584,7 @@ yyreduce: break; case 209: -#line 2881 "Gmsh.y" +#line 2886 "Gmsh.y" { int lock = CTX::instance()->lock; CTX::instance()->lock = 0; @@ -7582,7 +7641,7 @@ yyreduce: break; case 210: -#line 2935 "Gmsh.y" +#line 2940 "Gmsh.y" { #if defined(HAVE_MESH) SetOrderN(GModel::current(), (yyvsp[(2) - (3)].d), CTX::instance()->mesh.secondOrderLinear, @@ -7593,7 +7652,7 @@ yyreduce: break; case 211: -#line 2948 "Gmsh.y" +#line 2953 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d); @@ -7613,7 +7672,7 @@ yyreduce: break; case 212: -#line 2965 "Gmsh.y" +#line 2970 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d); @@ -7633,7 +7692,7 @@ yyreduce: break; case 213: -#line 2982 "Gmsh.y" +#line 2987 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d); @@ -7657,7 +7716,7 @@ yyreduce: break; case 214: -#line 3003 "Gmsh.y" +#line 3008 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d); @@ -7681,7 +7740,7 @@ yyreduce: break; case 215: -#line 3024 "Gmsh.y" +#line 3029 "Gmsh.y" { if(ImbricatedLoop <= 0){ yymsg(0, "Invalid For/EndFor loop"); @@ -7719,7 +7778,7 @@ yyreduce: break; case 216: -#line 3059 "Gmsh.y" +#line 3064 "Gmsh.y" { if(!FunctionManager::Instance()->createFunction ((yyvsp[(2) - (2)].c), gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -7730,7 +7789,7 @@ yyreduce: break; case 217: -#line 3067 "Gmsh.y" +#line 3072 "Gmsh.y" { if(!FunctionManager::Instance()->leaveFunction (&gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -7739,7 +7798,7 @@ yyreduce: break; case 218: -#line 3073 "Gmsh.y" +#line 3078 "Gmsh.y" { if(!FunctionManager::Instance()->enterFunction ((yyvsp[(2) - (3)].c), &gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -7749,20 +7808,20 @@ yyreduce: break; case 219: -#line 3080 "Gmsh.y" +#line 3085 "Gmsh.y" { if(!(yyvsp[(3) - (4)].d)) skip_until("If", "EndIf"); ;} break; case 220: -#line 3084 "Gmsh.y" +#line 3089 "Gmsh.y" { ;} break; case 221: -#line 3093 "Gmsh.y" +#line 3098 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (5)].l), @@ -7773,7 +7832,7 @@ yyreduce: break; case 222: -#line 3101 "Gmsh.y" +#line 3106 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(ROTATE, (yyvsp[(10) - (11)].l), @@ -7784,7 +7843,7 @@ yyreduce: break; case 223: -#line 3109 "Gmsh.y" +#line 3114 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (13)].l), @@ -7795,15 +7854,16 @@ yyreduce: break; case 224: -#line 3117 "Gmsh.y" +#line 3122 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 225: -#line 3122 "Gmsh.y" +#line 3128 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (7)].l), @@ -7814,15 +7874,16 @@ yyreduce: break; case 226: -#line 3130 "Gmsh.y" +#line 3136 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 227: -#line 3135 "Gmsh.y" +#line 3142 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(ROTATE, (yyvsp[(10) - (13)].l), @@ -7833,15 +7894,16 @@ yyreduce: break; case 228: -#line 3143 "Gmsh.y" +#line 3150 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 229: -#line 3148 "Gmsh.y" +#line 3156 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (15)].l), @@ -7852,15 +7914,16 @@ yyreduce: break; case 230: -#line 3156 "Gmsh.y" +#line 3164 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 231: -#line 3161 "Gmsh.y" +#line 3170 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShapes(BOUNDARY_LAYER, (yyvsp[(3) - (6)].l), 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., @@ -7870,7 +7933,7 @@ yyreduce: break; case 232: -#line 3169 "Gmsh.y" +#line 3178 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (8)].d), @@ -7880,7 +7943,7 @@ yyreduce: break; case 233: -#line 3176 "Gmsh.y" +#line 3185 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (8)].d), @@ -7890,7 +7953,7 @@ yyreduce: break; case 234: -#line 3183 "Gmsh.y" +#line 3192 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (8)].d), @@ -7900,7 +7963,7 @@ yyreduce: break; case 235: -#line 3190 "Gmsh.y" +#line 3199 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), @@ -7910,7 +7973,7 @@ yyreduce: break; case 236: -#line 3197 "Gmsh.y" +#line 3206 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), @@ -7920,7 +7983,7 @@ yyreduce: break; case 237: -#line 3204 "Gmsh.y" +#line 3213 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), @@ -7930,7 +7993,7 @@ yyreduce: break; case 238: -#line 3211 "Gmsh.y" +#line 3220 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (14)].d), @@ -7940,7 +8003,7 @@ yyreduce: break; case 239: -#line 3218 "Gmsh.y" +#line 3227 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (14)].d), @@ -7950,7 +8013,7 @@ yyreduce: break; case 240: -#line 3225 "Gmsh.y" +#line 3234 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (14)].d), @@ -7960,15 +8023,16 @@ yyreduce: break; case 241: -#line 3232 "Gmsh.y" +#line 3241 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 242: -#line 3237 "Gmsh.y" +#line 3247 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), @@ -7978,15 +8042,16 @@ yyreduce: break; case 243: -#line 3244 "Gmsh.y" +#line 3254 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 244: -#line 3249 "Gmsh.y" +#line 3260 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), @@ -7996,15 +8061,16 @@ yyreduce: break; case 245: -#line 3256 "Gmsh.y" +#line 3267 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 246: -#line 3261 "Gmsh.y" +#line 3273 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), @@ -8014,15 +8080,16 @@ yyreduce: break; case 247: -#line 3268 "Gmsh.y" +#line 3280 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 248: -#line 3273 "Gmsh.y" +#line 3286 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (16)].d), @@ -8032,15 +8099,16 @@ yyreduce: break; case 249: -#line 3280 "Gmsh.y" +#line 3293 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 250: -#line 3285 "Gmsh.y" +#line 3299 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (16)].d), @@ -8050,15 +8118,16 @@ yyreduce: break; case 251: -#line 3292 "Gmsh.y" +#line 3306 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 252: -#line 3297 "Gmsh.y" +#line 3312 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (16)].d), @@ -8068,15 +8137,16 @@ yyreduce: break; case 253: -#line 3304 "Gmsh.y" +#line 3319 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 254: -#line 3309 "Gmsh.y" +#line 3325 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (18)].d), @@ -8086,15 +8156,16 @@ yyreduce: break; case 255: -#line 3316 "Gmsh.y" +#line 3332 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 256: -#line 3321 "Gmsh.y" +#line 3338 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (18)].d), @@ -8104,15 +8175,16 @@ yyreduce: break; case 257: -#line 3328 "Gmsh.y" +#line 3345 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; ;} break; case 258: -#line 3333 "Gmsh.y" +#line 3351 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (18)].d), @@ -8122,19 +8194,19 @@ yyreduce: break; case 259: -#line 3344 "Gmsh.y" +#line 3362 "Gmsh.y" { ;} break; case 260: -#line 3347 "Gmsh.y" +#line 3365 "Gmsh.y" { ;} break; case 261: -#line 3353 "Gmsh.y" +#line 3371 "Gmsh.y" { int n = (int)fabs((yyvsp[(3) - (5)].d)); if(n){ // we accept n==0 to easily disable layers @@ -8149,7 +8221,7 @@ yyreduce: break; case 262: -#line 3365 "Gmsh.y" +#line 3383 "Gmsh.y" { extr.mesh.ExtrudeMesh = true; extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l)); @@ -8172,7 +8244,7 @@ yyreduce: break; case 263: -#line 3385 "Gmsh.y" +#line 3403 "Gmsh.y" { yymsg(0, "Explicit region numbers in layers are deprecated"); extr.mesh.ExtrudeMesh = true; @@ -8198,42 +8270,77 @@ yyreduce: break; case 264: -#line 3408 "Gmsh.y" +#line 3427 "Gmsh.y" { - extr.mesh.Recombine = true; + extr.mesh.ScaleLast = true; ;} break; case 265: -#line 3412 "Gmsh.y" +#line 3432 "Gmsh.y" { - extr.mesh.QuadToTri = QUADTRI_DBL_1; + extr.mesh.Recombine = true; ;} break; case 266: -#line 3416 "Gmsh.y" +#line 3436 "Gmsh.y" { - extr.mesh.QuadToTri = QUADTRI_DBL_1_RECOMB; + yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead."); ;} break; case 267: -#line 3420 "Gmsh.y" +#line 3440 "Gmsh.y" { - extr.mesh.QuadToTri = QUADTRI_SNGL_1; + yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead."); ;} break; case 268: -#line 3424 "Gmsh.y" +#line 3444 "Gmsh.y" { - extr.mesh.QuadToTri = QUADTRI_SNGL_1_RECOMB; + yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices."); ;} break; case 269: -#line 3428 "Gmsh.y" +#line 3448 "Gmsh.y" + { + yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices."); + ;} + break; + + case 270: +#line 3452 "Gmsh.y" + { + extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1; + ;} + break; + + case 271: +#line 3456 "Gmsh.y" + { + extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB; + ;} + break; + + case 272: +#line 3460 "Gmsh.y" + { + extr.mesh.QuadToTri = QUADTRI_NOVERTS_1; + ;} + break; + + case 273: +#line 3464 "Gmsh.y" + { + extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB; + ;} + break; + + case 274: +#line 3468 "Gmsh.y" { int num = (int)(yyvsp[(3) - (9)].d); if(FindSurface(num)){ @@ -8254,8 +8361,8 @@ yyreduce: ;} break; - case 270: -#line 3447 "Gmsh.y" + case 275: +#line 3487 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (6)].c), "Index")) extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d); @@ -8265,15 +8372,15 @@ yyreduce: ;} break; - case 271: -#line 3459 "Gmsh.y" + case 276: +#line 3499 "Gmsh.y" { (yyval.v)[0] = (yyval.v)[1] = 1.; ;} break; - case 272: -#line 3463 "Gmsh.y" + case 277: +#line 3503 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power")) (yyval.v)[0] = 1.; @@ -8288,15 +8395,15 @@ yyreduce: ;} break; - case 273: -#line 3478 "Gmsh.y" + case 278: +#line 3518 "Gmsh.y" { (yyval.i) = -1; // left ;} break; - case 274: -#line 3482 "Gmsh.y" + case 279: +#line 3522 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (1)].c), "Right")) (yyval.i) = 1; @@ -8312,36 +8419,36 @@ yyreduce: ;} break; - case 275: -#line 3498 "Gmsh.y" + case 280: +#line 3538 "Gmsh.y" { (yyval.l) = List_Create(1, 1, sizeof(double)); ;} break; - case 276: -#line 3502 "Gmsh.y" + case 281: +#line 3542 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (2)].l); ;} break; - case 277: -#line 3507 "Gmsh.y" + case 282: +#line 3547 "Gmsh.y" { (yyval.i) = 45; ;} break; - case 278: -#line 3511 "Gmsh.y" + case 283: +#line 3551 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(2) - (2)].d); ;} break; - case 279: -#line 3518 "Gmsh.y" + case 284: +#line 3558 "Gmsh.y" { int type = (int)(yyvsp[(6) - (7)].v)[0]; double coef = fabs((yyvsp[(6) - (7)].v)[1]); @@ -8399,8 +8506,8 @@ yyreduce: ;} break; - case 280: -#line 3574 "Gmsh.y" + case 285: +#line 3614 "Gmsh.y" { int k = List_Nbr((yyvsp[(4) - (6)].l)); if(k != 0 && k != 3 && k != 4){ @@ -8472,16 +8579,16 @@ yyreduce: ;} break; - case 281: -#line 3644 "Gmsh.y" + case 286: +#line 3684 "Gmsh.y" { yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)"); List_Delete((yyvsp[(7) - (8)].l)); ;} break; - case 282: -#line 3649 "Gmsh.y" + case 287: +#line 3689 "Gmsh.y" { int k = List_Nbr((yyvsp[(4) - (5)].l)); if(k != 0 && k != 6 && k != 8){ @@ -8550,8 +8657,8 @@ yyreduce: ;} break; - case 283: -#line 3716 "Gmsh.y" + case 288: +#line 3756 "Gmsh.y" { if(!(yyvsp[(2) - (3)].l)){ List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes); @@ -8589,8 +8696,8 @@ yyreduce: ;} break; - case 284: -#line 3752 "Gmsh.y" + case 289: +#line 3792 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (7)].l)); i++){ double d; @@ -8600,8 +8707,8 @@ yyreduce: ;} break; - case 285: -#line 3760 "Gmsh.y" + case 290: +#line 3800 "Gmsh.y" { if(!(yyvsp[(3) - (5)].l)){ List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces); @@ -8646,8 +8753,8 @@ yyreduce: ;} break; - case 286: -#line 3803 "Gmsh.y" + case 291: +#line 3843 "Gmsh.y" { if(!(yyvsp[(3) - (4)].l)){ List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes); @@ -8688,8 +8795,8 @@ yyreduce: ;} break; - case 287: -#line 3842 "Gmsh.y" + case 292: +#line 3882 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){ double d; @@ -8711,8 +8818,8 @@ yyreduce: ;} break; - case 288: -#line 3862 "Gmsh.y" + case 293: +#line 3902 "Gmsh.y" { if(List_Nbr((yyvsp[(5) - (6)].l)) != List_Nbr((yyvsp[(3) - (6)].l))){ yymsg(0, "Number of master (%d) different from number of slave (%d) lines", @@ -8741,8 +8848,8 @@ yyreduce: ;} break; - case 289: -#line 3890 "Gmsh.y" + case 294: +#line 3930 "Gmsh.y" { if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){ yymsg(0, "Number of master surface edges (%d) different from number of " @@ -8783,8 +8890,8 @@ yyreduce: ;} break; - case 290: -#line 3929 "Gmsh.y" + case 295: +#line 3969 "Gmsh.y" { Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d)); if(s){ @@ -8809,8 +8916,8 @@ yyreduce: ;} break; - case 291: -#line 3952 "Gmsh.y" + case 296: +#line 3992 "Gmsh.y" { Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d)); if(s){ @@ -8835,22 +8942,22 @@ yyreduce: ;} break; - case 292: -#line 3975 "Gmsh.y" + case 297: +#line 4015 "Gmsh.y" { Msg::Error("Point in Volume not implemented yet"); ;} break; - case 293: -#line 3979 "Gmsh.y" + case 298: +#line 4019 "Gmsh.y" { Msg::Error("Line in Volume not implemented yet"); ;} break; - case 294: -#line 3983 "Gmsh.y" + case 299: +#line 4023 "Gmsh.y" { Volume *v = FindVolume((int)(yyvsp[(8) - (10)].d)); if(v){ @@ -8875,8 +8982,8 @@ yyreduce: ;} break; - case 295: -#line 4006 "Gmsh.y" + case 300: +#line 4046 "Gmsh.y" { if(!(yyvsp[(3) - (4)].l)){ List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces); @@ -8917,8 +9024,8 @@ yyreduce: ;} break; - case 296: -#line 4045 "Gmsh.y" + case 301: +#line 4085 "Gmsh.y" { if(!(yyvsp[(3) - (4)].l)){ List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves); @@ -8959,15 +9066,15 @@ yyreduce: ;} break; - case 297: -#line 4090 "Gmsh.y" + case 302: +#line 4130 "Gmsh.y" { ReplaceAllDuplicates(); ;} break; - case 298: -#line 4094 "Gmsh.y" + case 303: +#line 4134 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Geometry")) ReplaceAllDuplicates(); @@ -8979,8 +9086,8 @@ yyreduce: ;} break; - case 299: -#line 4104 "Gmsh.y" + case 304: +#line 4144 "Gmsh.y" { if(List_Nbr((yyvsp[(4) - (6)].l)) >= 2){ double d; @@ -9012,23 +9119,23 @@ yyreduce: ;} break; - case 300: -#line 4138 "Gmsh.y" + case 305: +#line 4178 "Gmsh.y" { (yyval.c) = (char*)"Homology"; ;} break; - case 301: -#line 4139 "Gmsh.y" + case 306: +#line 4179 "Gmsh.y" { (yyval.c) = (char*)"Cohomology"; ;} break; - case 302: -#line 4140 "Gmsh.y" + case 307: +#line 4180 "Gmsh.y" { (yyval.c) = (char*)"Betti"; ;} break; - case 303: -#line 4145 "Gmsh.y" + case 308: +#line 4185 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < 4; i++) dim.push_back(i); @@ -9036,8 +9143,8 @@ yyreduce: ;} break; - case 304: -#line 4151 "Gmsh.y" + case 309: +#line 4191 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){ @@ -9051,8 +9158,8 @@ yyreduce: ;} break; - case 305: -#line 4163 "Gmsh.y" + case 310: +#line 4203 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){ @@ -9072,8 +9179,8 @@ yyreduce: ;} break; - case 306: -#line 4181 "Gmsh.y" + case 311: +#line 4221 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){ @@ -9098,48 +9205,48 @@ yyreduce: ;} break; - case 307: -#line 4208 "Gmsh.y" + case 312: +#line 4248 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (1)].d); ;} break; - case 308: -#line 4209 "Gmsh.y" + case 313: +#line 4249 "Gmsh.y" { (yyval.d) = (yyvsp[(2) - (3)].d); ;} break; - case 309: -#line 4210 "Gmsh.y" + case 314: +#line 4250 "Gmsh.y" { (yyval.d) = -(yyvsp[(2) - (2)].d); ;} break; - case 310: -#line 4211 "Gmsh.y" + case 315: +#line 4251 "Gmsh.y" { (yyval.d) = (yyvsp[(2) - (2)].d); ;} break; - case 311: -#line 4212 "Gmsh.y" + case 316: +#line 4252 "Gmsh.y" { (yyval.d) = !(yyvsp[(2) - (2)].d); ;} break; - case 312: -#line 4213 "Gmsh.y" + case 317: +#line 4253 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d); ;} break; - case 313: -#line 4214 "Gmsh.y" + case 318: +#line 4254 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d); ;} break; - case 314: -#line 4215 "Gmsh.y" + case 319: +#line 4255 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d); ;} break; - case 315: -#line 4217 "Gmsh.y" + case 320: +#line 4257 "Gmsh.y" { if(!(yyvsp[(3) - (3)].d)) yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d)); @@ -9148,318 +9255,318 @@ yyreduce: ;} break; - case 316: -#line 4223 "Gmsh.y" + case 321: +#line 4263 "Gmsh.y" { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d); ;} break; - case 317: -#line 4224 "Gmsh.y" + case 322: +#line 4264 "Gmsh.y" { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d)); ;} break; - case 318: -#line 4225 "Gmsh.y" + case 323: +#line 4265 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d); ;} break; - case 319: -#line 4226 "Gmsh.y" + case 324: +#line 4266 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d); ;} break; - case 320: -#line 4227 "Gmsh.y" + case 325: +#line 4267 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d); ;} break; - case 321: -#line 4228 "Gmsh.y" + case 326: +#line 4268 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d); ;} break; - case 322: -#line 4229 "Gmsh.y" + case 327: +#line 4269 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d); ;} break; - case 323: -#line 4230 "Gmsh.y" + case 328: +#line 4270 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d); ;} break; - case 324: -#line 4231 "Gmsh.y" + case 329: +#line 4271 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d); ;} break; - case 325: -#line 4232 "Gmsh.y" + case 330: +#line 4272 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d); ;} break; - case 326: -#line 4233 "Gmsh.y" + case 331: +#line 4273 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;} break; - case 327: -#line 4234 "Gmsh.y" + case 332: +#line 4274 "Gmsh.y" { (yyval.d) = exp((yyvsp[(3) - (4)].d)); ;} break; - case 328: -#line 4235 "Gmsh.y" + case 333: +#line 4275 "Gmsh.y" { (yyval.d) = log((yyvsp[(3) - (4)].d)); ;} break; - case 329: -#line 4236 "Gmsh.y" + case 334: +#line 4276 "Gmsh.y" { (yyval.d) = log10((yyvsp[(3) - (4)].d)); ;} break; - case 330: -#line 4237 "Gmsh.y" + case 335: +#line 4277 "Gmsh.y" { (yyval.d) = sqrt((yyvsp[(3) - (4)].d)); ;} break; - case 331: -#line 4238 "Gmsh.y" + case 336: +#line 4278 "Gmsh.y" { (yyval.d) = sin((yyvsp[(3) - (4)].d)); ;} break; - case 332: -#line 4239 "Gmsh.y" + case 337: +#line 4279 "Gmsh.y" { (yyval.d) = asin((yyvsp[(3) - (4)].d)); ;} break; - case 333: -#line 4240 "Gmsh.y" + case 338: +#line 4280 "Gmsh.y" { (yyval.d) = cos((yyvsp[(3) - (4)].d)); ;} break; - case 334: -#line 4241 "Gmsh.y" + case 339: +#line 4281 "Gmsh.y" { (yyval.d) = acos((yyvsp[(3) - (4)].d)); ;} break; - case 335: -#line 4242 "Gmsh.y" + case 340: +#line 4282 "Gmsh.y" { (yyval.d) = tan((yyvsp[(3) - (4)].d)); ;} break; - case 336: -#line 4243 "Gmsh.y" + case 341: +#line 4283 "Gmsh.y" { (yyval.d) = atan((yyvsp[(3) - (4)].d)); ;} break; - case 337: -#line 4244 "Gmsh.y" + case 342: +#line 4284 "Gmsh.y" { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;} break; - case 338: -#line 4245 "Gmsh.y" + case 343: +#line 4285 "Gmsh.y" { (yyval.d) = sinh((yyvsp[(3) - (4)].d)); ;} break; - case 339: -#line 4246 "Gmsh.y" + case 344: +#line 4286 "Gmsh.y" { (yyval.d) = cosh((yyvsp[(3) - (4)].d)); ;} break; - case 340: -#line 4247 "Gmsh.y" + case 345: +#line 4287 "Gmsh.y" { (yyval.d) = tanh((yyvsp[(3) - (4)].d)); ;} break; - case 341: -#line 4248 "Gmsh.y" + case 346: +#line 4288 "Gmsh.y" { (yyval.d) = fabs((yyvsp[(3) - (4)].d)); ;} break; - case 342: -#line 4249 "Gmsh.y" + case 347: +#line 4289 "Gmsh.y" { (yyval.d) = floor((yyvsp[(3) - (4)].d)); ;} break; - case 343: -#line 4250 "Gmsh.y" + case 348: +#line 4290 "Gmsh.y" { (yyval.d) = ceil((yyvsp[(3) - (4)].d)); ;} break; - case 344: -#line 4251 "Gmsh.y" + case 349: +#line 4291 "Gmsh.y" { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; - case 345: -#line 4252 "Gmsh.y" + case 350: +#line 4292 "Gmsh.y" { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; - case 346: -#line 4253 "Gmsh.y" + case 351: +#line 4293 "Gmsh.y" { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;} break; - case 347: -#line 4254 "Gmsh.y" + case 352: +#line 4294 "Gmsh.y" { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;} break; - case 348: -#line 4257 "Gmsh.y" + case 353: +#line 4297 "Gmsh.y" { (yyval.d) = exp((yyvsp[(3) - (4)].d)); ;} break; - case 349: -#line 4258 "Gmsh.y" + case 354: +#line 4298 "Gmsh.y" { (yyval.d) = log((yyvsp[(3) - (4)].d)); ;} break; - case 350: -#line 4259 "Gmsh.y" + case 355: +#line 4299 "Gmsh.y" { (yyval.d) = log10((yyvsp[(3) - (4)].d)); ;} break; - case 351: -#line 4260 "Gmsh.y" + case 356: +#line 4300 "Gmsh.y" { (yyval.d) = sqrt((yyvsp[(3) - (4)].d)); ;} break; - case 352: -#line 4261 "Gmsh.y" + case 357: +#line 4301 "Gmsh.y" { (yyval.d) = sin((yyvsp[(3) - (4)].d)); ;} break; - case 353: -#line 4262 "Gmsh.y" + case 358: +#line 4302 "Gmsh.y" { (yyval.d) = asin((yyvsp[(3) - (4)].d)); ;} break; - case 354: -#line 4263 "Gmsh.y" + case 359: +#line 4303 "Gmsh.y" { (yyval.d) = cos((yyvsp[(3) - (4)].d)); ;} break; - case 355: -#line 4264 "Gmsh.y" + case 360: +#line 4304 "Gmsh.y" { (yyval.d) = acos((yyvsp[(3) - (4)].d)); ;} break; - case 356: -#line 4265 "Gmsh.y" + case 361: +#line 4305 "Gmsh.y" { (yyval.d) = tan((yyvsp[(3) - (4)].d)); ;} break; - case 357: -#line 4266 "Gmsh.y" + case 362: +#line 4306 "Gmsh.y" { (yyval.d) = atan((yyvsp[(3) - (4)].d)); ;} break; - case 358: -#line 4267 "Gmsh.y" + case 363: +#line 4307 "Gmsh.y" { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;} break; - case 359: -#line 4268 "Gmsh.y" + case 364: +#line 4308 "Gmsh.y" { (yyval.d) = sinh((yyvsp[(3) - (4)].d)); ;} break; - case 360: -#line 4269 "Gmsh.y" + case 365: +#line 4309 "Gmsh.y" { (yyval.d) = cosh((yyvsp[(3) - (4)].d)); ;} break; - case 361: -#line 4270 "Gmsh.y" + case 366: +#line 4310 "Gmsh.y" { (yyval.d) = tanh((yyvsp[(3) - (4)].d)); ;} break; - case 362: -#line 4271 "Gmsh.y" + case 367: +#line 4311 "Gmsh.y" { (yyval.d) = fabs((yyvsp[(3) - (4)].d)); ;} break; - case 363: -#line 4272 "Gmsh.y" + case 368: +#line 4312 "Gmsh.y" { (yyval.d) = floor((yyvsp[(3) - (4)].d)); ;} break; - case 364: -#line 4273 "Gmsh.y" + case 369: +#line 4313 "Gmsh.y" { (yyval.d) = ceil((yyvsp[(3) - (4)].d)); ;} break; - case 365: -#line 4274 "Gmsh.y" + case 370: +#line 4314 "Gmsh.y" { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; - case 366: -#line 4275 "Gmsh.y" + case 371: +#line 4315 "Gmsh.y" { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; - case 367: -#line 4276 "Gmsh.y" + case 372: +#line 4316 "Gmsh.y" { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;} break; - case 368: -#line 4277 "Gmsh.y" + case 373: +#line 4317 "Gmsh.y" { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;} break; - case 369: -#line 4286 "Gmsh.y" + case 374: +#line 4326 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (1)].d); ;} break; - case 370: -#line 4287 "Gmsh.y" + case 375: +#line 4327 "Gmsh.y" { (yyval.d) = 3.141592653589793; ;} break; - case 371: -#line 4288 "Gmsh.y" + case 376: +#line 4328 "Gmsh.y" { (yyval.d) = Msg::GetCommRank(); ;} break; - case 372: -#line 4289 "Gmsh.y" + case 377: +#line 4329 "Gmsh.y" { (yyval.d) = Msg::GetCommSize(); ;} break; - case 373: -#line 4290 "Gmsh.y" + case 378: +#line 4330 "Gmsh.y" { (yyval.d) = GetGmshMajorVersion(); ;} break; - case 374: -#line 4291 "Gmsh.y" + case 379: +#line 4331 "Gmsh.y" { (yyval.d) = GetGmshMinorVersion(); ;} break; - case 375: -#line 4292 "Gmsh.y" + case 380: +#line 4332 "Gmsh.y" { (yyval.d) = GetGmshPatchVersion(); ;} break; - case 376: -#line 4293 "Gmsh.y" + case 381: +#line 4333 "Gmsh.y" { (yyval.d) = Cpu(); ;} break; - case 377: -#line 4294 "Gmsh.y" + case 382: +#line 4334 "Gmsh.y" { (yyval.d) = GetMemoryUsage()/1024./1024.; ;} break; - case 378: -#line 4299 "Gmsh.y" + case 383: +#line 4339 "Gmsh.y" { if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){ yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c)); @@ -9478,8 +9585,8 @@ yyreduce: ;} break; - case 379: -#line 4320 "Gmsh.y" + case 384: +#line 4360 "Gmsh.y" { char tmpstring[1024]; sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ; @@ -9500,8 +9607,8 @@ yyreduce: ;} break; - case 380: -#line 4339 "Gmsh.y" + case 385: +#line 4379 "Gmsh.y" { int index = (int)(yyvsp[(3) - (4)].d); if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){ @@ -9521,8 +9628,8 @@ yyreduce: ;} break; - case 381: -#line 4357 "Gmsh.y" + case 386: +#line 4397 "Gmsh.y" { if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){ yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c)); @@ -9536,8 +9643,8 @@ yyreduce: ;} break; - case 382: -#line 4369 "Gmsh.y" + case 387: +#line 4409 "Gmsh.y" { if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){ yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c)); @@ -9556,8 +9663,8 @@ yyreduce: ;} break; - case 383: -#line 4386 "Gmsh.y" + case 388: +#line 4426 "Gmsh.y" { int index = (int)(yyvsp[(3) - (5)].d); if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){ @@ -9577,24 +9684,24 @@ yyreduce: ;} break; - case 384: -#line 4407 "Gmsh.y" + case 389: +#line 4447 "Gmsh.y" { NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d)); Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c)); ;} break; - case 385: -#line 4412 "Gmsh.y" + case 390: +#line 4452 "Gmsh.y" { NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d)); Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c)); ;} break; - case 386: -#line 4417 "Gmsh.y" + case 391: +#line 4457 "Gmsh.y" { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){ @@ -9606,8 +9713,8 @@ yyreduce: ;} break; - case 387: -#line 4427 "Gmsh.y" + case 392: +#line 4467 "Gmsh.y" { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){ @@ -9619,16 +9726,16 @@ yyreduce: ;} break; - case 388: -#line 4437 "Gmsh.y" + case 393: +#line 4477 "Gmsh.y" { (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d)); Free((yyvsp[(3) - (6)].c)); ;} break; - case 389: -#line 4442 "Gmsh.y" + case 394: +#line 4482 "Gmsh.y" { std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c)); if(s.find(substr) != std::string::npos) @@ -9639,16 +9746,16 @@ yyreduce: ;} break; - case 390: -#line 4451 "Gmsh.y" + case 395: +#line 4491 "Gmsh.y" { (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c)); Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c)); ;} break; - case 391: -#line 4456 "Gmsh.y" + case 396: +#line 4496 "Gmsh.y" { int align = 0, font = 0, fontsize = CTX::instance()->glFontSize; if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){ @@ -9674,116 +9781,116 @@ yyreduce: ;} break; - case 392: -#line 4483 "Gmsh.y" + case 397: +#line 4523 "Gmsh.y" { memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double)); ;} break; - case 393: -#line 4487 "Gmsh.y" + case 398: +#line 4527 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i]; ;} break; - case 394: -#line 4491 "Gmsh.y" + case 399: +#line 4531 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i]; ;} break; - case 395: -#line 4495 "Gmsh.y" + case 400: +#line 4535 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i]; ;} break; - case 396: -#line 4499 "Gmsh.y" + case 401: +#line 4539 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i]; ;} break; - case 397: -#line 4506 "Gmsh.y" + case 402: +#line 4546 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (11)].d); (yyval.v)[1] = (yyvsp[(4) - (11)].d); (yyval.v)[2] = (yyvsp[(6) - (11)].d); (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d); ;} break; - case 398: -#line 4510 "Gmsh.y" + case 403: +#line 4550 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (9)].d); (yyval.v)[1] = (yyvsp[(4) - (9)].d); (yyval.v)[2] = (yyvsp[(6) - (9)].d); (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0; ;} break; - case 399: -#line 4514 "Gmsh.y" + case 404: +#line 4554 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (7)].d); (yyval.v)[1] = (yyvsp[(4) - (7)].d); (yyval.v)[2] = (yyvsp[(6) - (7)].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; ;} break; - case 400: -#line 4518 "Gmsh.y" + case 405: +#line 4558 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (7)].d); (yyval.v)[1] = (yyvsp[(4) - (7)].d); (yyval.v)[2] = (yyvsp[(6) - (7)].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; ;} break; - case 401: -#line 4525 "Gmsh.y" + case 406: +#line 4565 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(List_T*)); List_Add((yyval.l), &((yyvsp[(1) - (1)].l))); ;} break; - case 402: -#line 4530 "Gmsh.y" + case 407: +#line 4570 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].l))); ;} break; - case 403: -#line 4537 "Gmsh.y" + case 408: +#line 4577 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[(1) - (1)].d))); ;} break; - case 404: -#line 4542 "Gmsh.y" + case 409: +#line 4582 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 405: -#line 4546 "Gmsh.y" + case 410: +#line 4586 "Gmsh.y" { // creates an empty list (yyval.l) = List_Create(2, 1, sizeof(double)); ;} break; - case 406: -#line 4551 "Gmsh.y" + case 411: +#line 4591 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (3)].l); ;} break; - case 407: -#line 4555 "Gmsh.y" + case 412: +#line 4595 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (4)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -9793,8 +9900,8 @@ yyreduce: ;} break; - case 408: -#line 4563 "Gmsh.y" + case 413: +#line 4603 "Gmsh.y" { (yyval.l) = (yyvsp[(4) - (5)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -9804,15 +9911,15 @@ yyreduce: ;} break; - case 409: -#line 4574 "Gmsh.y" + case 414: +#line 4614 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 410: -#line 4578 "Gmsh.y" + case 415: +#line 4618 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all")) (yyval.l) = 0; @@ -9823,8 +9930,8 @@ yyreduce: ;} break; - case 411: -#line 4590 "Gmsh.y" + case 416: +#line 4630 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (2)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -9834,8 +9941,8 @@ yyreduce: ;} break; - case 412: -#line 4598 "Gmsh.y" + case 417: +#line 4638 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (3)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -9845,8 +9952,8 @@ yyreduce: ;} break; - case 413: -#line 4606 "Gmsh.y" + case 418: +#line 4646 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d)); @@ -9855,8 +9962,8 @@ yyreduce: ;} break; - case 414: -#line 4613 "Gmsh.y" + case 419: +#line 4653 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!(yyvsp[(5) - (5)].d)){ //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0) @@ -9868,8 +9975,8 @@ yyreduce: ;} break; - case 415: -#line 4623 "Gmsh.y" + case 420: +#line 4663 "Gmsh.y" { // Returns the coordinates of a point and fills a list with it. // This allows to ensure e.g. that relative point positions are @@ -9891,36 +9998,36 @@ yyreduce: ;} break; - case 416: -#line 4643 "Gmsh.y" + case 421: +#line 4683 "Gmsh.y" { (yyval.l) = GetAllEntityNumbers(0); ;} break; - case 417: -#line 4647 "Gmsh.y" + case 422: +#line 4687 "Gmsh.y" { (yyval.l) = GetAllEntityNumbers(1); ;} break; - case 418: -#line 4651 "Gmsh.y" + case 423: +#line 4691 "Gmsh.y" { (yyval.l) = GetAllEntityNumbers(2); ;} break; - case 419: -#line 4655 "Gmsh.y" + case 424: +#line 4695 "Gmsh.y" { (yyval.l) = GetAllEntityNumbers(3); ;} break; - case 420: -#line 4659 "Gmsh.y" + case 425: +#line 4699 "Gmsh.y" { (yyval.l) = List_Create(10, 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ @@ -9951,8 +10058,8 @@ yyreduce: ;} break; - case 421: -#line 4688 "Gmsh.y" + case 426: +#line 4728 "Gmsh.y" { (yyval.l) = List_Create(10, 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ @@ -9983,8 +10090,8 @@ yyreduce: ;} break; - case 422: -#line 4717 "Gmsh.y" + case 427: +#line 4757 "Gmsh.y" { (yyval.l) = List_Create(10, 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ @@ -10015,8 +10122,8 @@ yyreduce: ;} break; - case 423: -#line 4746 "Gmsh.y" + case 428: +#line 4786 "Gmsh.y" { (yyval.l) = List_Create(10, 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){ @@ -10047,8 +10154,8 @@ yyreduce: ;} break; - case 424: -#line 4775 "Gmsh.y" + case 429: +#line 4815 "Gmsh.y" { (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){ @@ -10060,8 +10167,8 @@ yyreduce: ;} break; - case 425: -#line 4785 "Gmsh.y" + case 430: +#line 4825 "Gmsh.y" { (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){ @@ -10073,8 +10180,8 @@ yyreduce: ;} break; - case 426: -#line 4795 "Gmsh.y" + case 431: +#line 4835 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c))) @@ -10088,8 +10195,8 @@ yyreduce: ;} break; - case 427: -#line 4808 "Gmsh.y" + case 432: +#line 4848 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c))) @@ -10103,8 +10210,8 @@ yyreduce: ;} break; - case 428: -#line 4820 "Gmsh.y" + case 433: +#line 4860 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c))) @@ -10118,8 +10225,8 @@ yyreduce: ;} break; - case 429: -#line 4832 "Gmsh.y" + case 434: +#line 4872 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c))) @@ -10139,8 +10246,8 @@ yyreduce: ;} break; - case 430: -#line 4851 "Gmsh.y" + case 435: +#line 4891 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c))) @@ -10160,30 +10267,30 @@ yyreduce: ;} break; - case 431: -#line 4872 "Gmsh.y" + case 436: +#line 4912 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[(1) - (1)].d))); ;} break; - case 432: -#line 4877 "Gmsh.y" + case 437: +#line 4917 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 433: -#line 4881 "Gmsh.y" + case 438: +#line 4921 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].d))); ;} break; - case 434: -#line 4885 "Gmsh.y" + case 439: +#line 4925 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){ double d; @@ -10194,22 +10301,22 @@ yyreduce: ;} break; - case 435: -#line 4897 "Gmsh.y" + case 440: +#line 4937 "Gmsh.y" { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d)); ;} break; - case 436: -#line 4901 "Gmsh.y" + case 441: +#line 4941 "Gmsh.y" { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255); ;} break; - case 437: -#line 4913 "Gmsh.y" + case 442: +#line 4953 "Gmsh.y" { int flag; (yyval.u) = GetColorForString(-1, (yyvsp[(1) - (1)].c), &flag); @@ -10218,8 +10325,8 @@ yyreduce: ;} break; - case 438: -#line 4920 "Gmsh.y" + case 443: +#line 4960 "Gmsh.y" { unsigned int val = 0; ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val); @@ -10228,15 +10335,15 @@ yyreduce: ;} break; - case 439: -#line 4930 "Gmsh.y" + case 444: +#line 4970 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (3)].l); ;} break; - case 440: -#line 4934 "Gmsh.y" + case 445: +#line 4974 "Gmsh.y" { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d)); @@ -10250,30 +10357,30 @@ yyreduce: ;} break; - case 441: -#line 4949 "Gmsh.y" + case 446: +#line 4989 "Gmsh.y" { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); List_Add((yyval.l), &((yyvsp[(1) - (1)].u))); ;} break; - case 442: -#line 4954 "Gmsh.y" + case 447: +#line 4994 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].u))); ;} break; - case 443: -#line 4961 "Gmsh.y" + case 448: +#line 5001 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 444: -#line 4965 "Gmsh.y" + case 449: +#line 5005 "Gmsh.y" { if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){ yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c)); @@ -10288,8 +10395,8 @@ yyreduce: ;} break; - case 445: -#line 4978 "Gmsh.y" + case 450: +#line 5018 "Gmsh.y" { std::string out; StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out); @@ -10299,8 +10406,8 @@ yyreduce: ;} break; - case 446: -#line 4986 "Gmsh.y" + case 451: +#line 5026 "Gmsh.y" { std::string out; StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out); @@ -10310,15 +10417,15 @@ yyreduce: ;} break; - case 447: -#line 4997 "Gmsh.y" + case 452: +#line 5037 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 448: -#line 5001 "Gmsh.y" + case 453: +#line 5041 "Gmsh.y" { (yyval.c) = (char *)Malloc(32 * sizeof(char)); time_t now; @@ -10328,8 +10435,8 @@ yyreduce: ;} break; - case 449: -#line 5009 "Gmsh.y" + case 454: +#line 5049 "Gmsh.y" { const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c)); if(!env) env = ""; @@ -10339,8 +10446,8 @@ yyreduce: ;} break; - case 450: -#line 5017 "Gmsh.y" + case 455: +#line 5057 "Gmsh.y" { std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -10350,8 +10457,8 @@ yyreduce: ;} break; - case 451: -#line 5025 "Gmsh.y" + case 456: +#line 5065 "Gmsh.y" { (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char)); strcpy((yyval.c), (yyvsp[(3) - (6)].c)); @@ -10361,8 +10468,8 @@ yyreduce: ;} break; - case 452: -#line 5033 "Gmsh.y" + case 457: +#line 5073 "Gmsh.y" { (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char)); int i; @@ -10378,8 +10485,8 @@ yyreduce: ;} break; - case 453: -#line 5047 "Gmsh.y" + case 458: +#line 5087 "Gmsh.y" { (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char)); int i; @@ -10395,8 +10502,8 @@ yyreduce: ;} break; - case 454: -#line 5061 "Gmsh.y" + case 459: +#line 5101 "Gmsh.y" { std::string input = (yyvsp[(3) - (8)].c); std::string substr_old = (yyvsp[(5) - (8)].c); @@ -10410,8 +10517,8 @@ yyreduce: ;} break; - case 455: -#line 5073 "Gmsh.y" + case 460: +#line 5113 "Gmsh.y" { int size = 0; for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++) @@ -10429,8 +10536,8 @@ yyreduce: ;} break; - case 456: -#line 5090 "Gmsh.y" + case 461: +#line 5130 "Gmsh.y" { int size = 0; for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++) @@ -10448,22 +10555,22 @@ yyreduce: ;} break; - case 457: -#line 5106 "Gmsh.y" + case 462: +#line 5146 "Gmsh.y" { (yyval.c) = (yyvsp[(3) - (4)].c); ;} break; - case 458: -#line 5111 "Gmsh.y" + case 463: +#line 5151 "Gmsh.y" { (yyval.c) = (yyvsp[(3) - (4)].c); ;} break; - case 459: -#line 5115 "Gmsh.y" + case 464: +#line 5155 "Gmsh.y" { char tmpstring[5000]; int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring); @@ -10484,8 +10591,8 @@ yyreduce: ;} break; - case 460: -#line 5135 "Gmsh.y" + case 465: +#line 5175 "Gmsh.y" { char tmpstring[5000]; int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring); @@ -10506,22 +10613,22 @@ yyreduce: ;} break; - case 461: -#line 5157 "Gmsh.y" + case 466: +#line 5197 "Gmsh.y" { (yyval.l) = List_Create(20,20,sizeof(char*)); List_Add((yyval.l), &((yyvsp[(1) - (1)].c))); ;} break; - case 462: -#line 5162 "Gmsh.y" + case 467: +#line 5202 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;} break; /* Line 1267 of yacc.c. */ -#line 10525 "Gmsh.tab.cpp" +#line 10632 "Gmsh.tab.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -10735,7 +10842,7 @@ yyreturn: } -#line 5165 "Gmsh.y" +#line 5205 "Gmsh.y" int PrintListOfDouble(char *format, List_T *list, char *buffer) diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp index bae21f58ff..7b06aead30 100644 --- a/Parser/Gmsh.tab.hpp +++ b/Parser/Gmsh.tab.hpp @@ -135,61 +135,64 @@ tMeshAlgorithm = 351, tReverse = 352, tLayers = 353, - tHole = 354, - tAlias = 355, - tAliasWithOptions = 356, - tQuadTriDbl = 357, - tQuadTriSngl = 358, - tRecombLaterals = 359, - tTransfQuadTri = 360, - tText2D = 361, - tText3D = 362, - tInterpolationScheme = 363, - tTime = 364, - tCombine = 365, - tBSpline = 366, - tBezier = 367, - tNurbs = 368, - tNurbsOrder = 369, - tNurbsKnots = 370, - tColor = 371, - tColorTable = 372, - tFor = 373, - tIn = 374, - tEndFor = 375, - tIf = 376, - tEndIf = 377, - tExit = 378, - tAbort = 379, - tField = 380, - tReturn = 381, - tCall = 382, - tFunction = 383, - tShow = 384, - tHide = 385, - tGetValue = 386, - tGetEnv = 387, - tGetString = 388, - tHomology = 389, - tCohomology = 390, - tBetti = 391, - tSetOrder = 392, - tGMSH_MAJOR_VERSION = 393, - tGMSH_MINOR_VERSION = 394, - tGMSH_PATCH_VERSION = 395, - tAFFECTDIVIDE = 396, - tAFFECTTIMES = 397, - tAFFECTMINUS = 398, - tAFFECTPLUS = 399, - tOR = 400, - tAND = 401, - tNOTEQUAL = 402, - tEQUAL = 403, - tGREATEROREQUAL = 404, - tLESSOREQUAL = 405, - UNARYPREC = 406, - tMINUSMINUS = 407, - tPLUSPLUS = 408 + tScaleLast = 354, + tHole = 355, + tAlias = 356, + tAliasWithOptions = 357, + tQuadTriAddVerts = 358, + tQuadTriNoNewVerts = 359, + tQuadTriSngl = 360, + tQuadTriDbl = 361, + tRecombLaterals = 362, + tTransfQuadTri = 363, + tText2D = 364, + tText3D = 365, + tInterpolationScheme = 366, + tTime = 367, + tCombine = 368, + tBSpline = 369, + tBezier = 370, + tNurbs = 371, + tNurbsOrder = 372, + tNurbsKnots = 373, + tColor = 374, + tColorTable = 375, + tFor = 376, + tIn = 377, + tEndFor = 378, + tIf = 379, + tEndIf = 380, + tExit = 381, + tAbort = 382, + tField = 383, + tReturn = 384, + tCall = 385, + tFunction = 386, + tShow = 387, + tHide = 388, + tGetValue = 389, + tGetEnv = 390, + tGetString = 391, + tHomology = 392, + tCohomology = 393, + tBetti = 394, + tSetOrder = 395, + tGMSH_MAJOR_VERSION = 396, + tGMSH_MINOR_VERSION = 397, + tGMSH_PATCH_VERSION = 398, + tAFFECTDIVIDE = 399, + tAFFECTTIMES = 400, + tAFFECTMINUS = 401, + tAFFECTPLUS = 402, + tOR = 403, + tAND = 404, + tNOTEQUAL = 405, + tEQUAL = 406, + tGREATEROREQUAL = 407, + tLESSOREQUAL = 408, + UNARYPREC = 409, + tMINUSMINUS = 410, + tPLUSPLUS = 411 }; #endif /* Tokens. */ @@ -289,61 +292,64 @@ #define tMeshAlgorithm 351 #define tReverse 352 #define tLayers 353 -#define tHole 354 -#define tAlias 355 -#define tAliasWithOptions 356 -#define tQuadTriDbl 357 -#define tQuadTriSngl 358 -#define tRecombLaterals 359 -#define tTransfQuadTri 360 -#define tText2D 361 -#define tText3D 362 -#define tInterpolationScheme 363 -#define tTime 364 -#define tCombine 365 -#define tBSpline 366 -#define tBezier 367 -#define tNurbs 368 -#define tNurbsOrder 369 -#define tNurbsKnots 370 -#define tColor 371 -#define tColorTable 372 -#define tFor 373 -#define tIn 374 -#define tEndFor 375 -#define tIf 376 -#define tEndIf 377 -#define tExit 378 -#define tAbort 379 -#define tField 380 -#define tReturn 381 -#define tCall 382 -#define tFunction 383 -#define tShow 384 -#define tHide 385 -#define tGetValue 386 -#define tGetEnv 387 -#define tGetString 388 -#define tHomology 389 -#define tCohomology 390 -#define tBetti 391 -#define tSetOrder 392 -#define tGMSH_MAJOR_VERSION 393 -#define tGMSH_MINOR_VERSION 394 -#define tGMSH_PATCH_VERSION 395 -#define tAFFECTDIVIDE 396 -#define tAFFECTTIMES 397 -#define tAFFECTMINUS 398 -#define tAFFECTPLUS 399 -#define tOR 400 -#define tAND 401 -#define tNOTEQUAL 402 -#define tEQUAL 403 -#define tGREATEROREQUAL 404 -#define tLESSOREQUAL 405 -#define UNARYPREC 406 -#define tMINUSMINUS 407 -#define tPLUSPLUS 408 +#define tScaleLast 354 +#define tHole 355 +#define tAlias 356 +#define tAliasWithOptions 357 +#define tQuadTriAddVerts 358 +#define tQuadTriNoNewVerts 359 +#define tQuadTriSngl 360 +#define tQuadTriDbl 361 +#define tRecombLaterals 362 +#define tTransfQuadTri 363 +#define tText2D 364 +#define tText3D 365 +#define tInterpolationScheme 366 +#define tTime 367 +#define tCombine 368 +#define tBSpline 369 +#define tBezier 370 +#define tNurbs 371 +#define tNurbsOrder 372 +#define tNurbsKnots 373 +#define tColor 374 +#define tColorTable 375 +#define tFor 376 +#define tIn 377 +#define tEndFor 378 +#define tIf 379 +#define tEndIf 380 +#define tExit 381 +#define tAbort 382 +#define tField 383 +#define tReturn 384 +#define tCall 385 +#define tFunction 386 +#define tShow 387 +#define tHide 388 +#define tGetValue 389 +#define tGetEnv 390 +#define tGetString 391 +#define tHomology 392 +#define tCohomology 393 +#define tBetti 394 +#define tSetOrder 395 +#define tGMSH_MAJOR_VERSION 396 +#define tGMSH_MINOR_VERSION 397 +#define tGMSH_PATCH_VERSION 398 +#define tAFFECTDIVIDE 399 +#define tAFFECTTIMES 400 +#define tAFFECTMINUS 401 +#define tAFFECTPLUS 402 +#define tOR 403 +#define tAND 404 +#define tNOTEQUAL 405 +#define tEQUAL 406 +#define tGREATEROREQUAL 407 +#define tLESSOREQUAL 408 +#define UNARYPREC 409 +#define tMINUSMINUS 410 +#define tPLUSPLUS 411 @@ -361,7 +367,7 @@ typedef union YYSTYPE List_T *l; } /* Line 1529 of yacc.c. */ -#line 365 "Gmsh.tab.hpp" +#line 371 "Gmsh.tab.hpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y index b00180bbba..90ebb82c38 100644 --- a/Parser/Gmsh.y +++ b/Parser/Gmsh.y @@ -120,8 +120,9 @@ struct doubleXstring{ %token tRotate tTranslate tSymmetry tDilate tExtrude tLevelset %token tRecombine tSmoother tSplit tDelete tCoherence %token tIntersect tMeshAlgorithm tReverse -%token tLayers tHole tAlias tAliasWithOptions -%token tQuadTriDbl tQuadTriSngl tRecombLaterals tTransfQuadTri +%token tLayers tScaleLast tHole tAlias tAliasWithOptions +%token tQuadTriAddVerts tQuadTriNoNewVerts tQuadTriSngl tQuadTriDbl +%token tRecombLaterals tTransfQuadTri %token tText2D tText3D tInterpolationScheme tTime tCombine %token tBSpline tBezier tNurbs tNurbsOrder tNurbsKnots %token tColor tColorTable tFor tIn tEndFor tIf tEndIf tExit tAbort @@ -1846,6 +1847,8 @@ Shape : for(int i = 0; i < List_Nbr($7); i++){ s->compound.push_back((int)*(double*)List_Pointer($7, i)); } + // Added by Trevor Strickler + setSurfaceGeneratrices(s, (List_T*) 0 ); Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); } List_Delete($7); @@ -1873,6 +1876,9 @@ Shape : s->compoundBoundary[i].push_back((int)*(double*)List_Pointer(l, j)); } } + // Added by Trevor Strickler + setSurfaceGeneratrices(s, (List_T*) 0 ); + Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s); } List_Delete($7); @@ -3117,6 +3123,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } ExtrudeParameters '}' { @@ -3130,6 +3137,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } ExtrudeParameters '}' { @@ -3143,6 +3151,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } ExtrudeParameters '}' { @@ -3156,6 +3165,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } ExtrudeParameters '}' { @@ -3232,6 +3242,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3244,6 +3255,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3256,6 +3268,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3268,6 +3281,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3280,6 +3294,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3292,6 +3307,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3304,6 +3320,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3316,6 +3333,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3328,6 +3346,7 @@ Extrude : { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; + extr.mesh.ScaleLast = false; } '{' ExtrudeParameters '}' tEND { @@ -3404,25 +3423,47 @@ ExtrudeParameter : List_Delete($5); List_Delete($7); } +//Added by Trevor Strickler 07/07/2013 + | tScaleLast tEND + { + extr.mesh.ScaleLast = true; + } + | tRecombine tEND { extr.mesh.Recombine = true; } + | tQuadTriSngl tEND + { + yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead."); + } + | tQuadTriSngl tRecombLaterals tEND + { + yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead."); + } | tQuadTriDbl tEND { - extr.mesh.QuadToTri = QUADTRI_DBL_1; + yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices."); } | tQuadTriDbl tRecombLaterals tEND { - extr.mesh.QuadToTri = QUADTRI_DBL_1_RECOMB; + yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices."); } - | tQuadTriSngl tEND + | tQuadTriAddVerts tEND { - extr.mesh.QuadToTri = QUADTRI_SNGL_1; + extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1; } - | tQuadTriSngl tRecombLaterals tEND + | tQuadTriAddVerts tRecombLaterals tEND + { + extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB; + } + | tQuadTriNoNewVerts tEND + { + extr.mesh.QuadToTri = QUADTRI_NOVERTS_1; + } + | tQuadTriNoNewVerts tRecombLaterals tEND { - extr.mesh.QuadToTri = QUADTRI_SNGL_1_RECOMB; + extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB; } | tHole '(' FExpr ')' tAFFECT ListOfDouble tUsing FExpr tEND { diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp index fd17a133c6..88951d2c2f 100644 --- a/Parser/Gmsh.yy.cpp +++ b/Parser/Gmsh.yy.cpp @@ -380,8 +380,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 174 -#define YY_END_OF_BUFFER 175 +#define YY_NUM_RULES 177 +#define YY_END_OF_BUFFER 178 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -389,97 +389,100 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[806] = +static yyconst flex_int16_t yy_accept[837] = { 0, - 0, 0, 175, 173, 1, 1, 173, 5, 173, 6, - 173, 173, 173, 173, 173, 168, 21, 2, 173, 16, - 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 173, 28, 24, 19, 25, 17, - 26, 18, 0, 170, 3, 4, 20, 169, 168, 0, - 29, 27, 30, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - - 172, 97, 96, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 117, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 155, 156, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 23, 22, 0, 169, 0, - 0, 171, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 53, 64, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 70, 172, 172, 172, 172, - 172, 84, 172, 172, 172, 172, 172, 172, 172, 172, - - 172, 172, 172, 172, 172, 172, 172, 104, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 138, 172, 172, 172, 172, 172, 144, 172, - 172, 172, 172, 163, 172, 172, 172, 172, 172, 172, - 172, 0, 170, 0, 0, 169, 172, 32, 172, 172, - 172, 172, 172, 37, 39, 172, 172, 172, 172, 61, - 172, 47, 172, 172, 172, 172, 172, 172, 172, 172, - 52, 172, 172, 172, 172, 172, 69, 172, 172, 172, - 172, 172, 79, 172, 80, 172, 172, 83, 172, 172, - - 172, 172, 172, 92, 93, 172, 172, 172, 172, 172, - 172, 172, 172, 102, 103, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 131, 172, 172, 172, 172, 172, 172, 172, 172, - 152, 139, 172, 172, 172, 172, 137, 172, 172, 172, - 172, 172, 172, 172, 158, 162, 172, 172, 172, 172, - 172, 172, 10, 15, 9, 8, 172, 12, 14, 0, - 169, 31, 172, 35, 172, 172, 172, 41, 172, 43, - 172, 172, 172, 172, 172, 172, 172, 56, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 76, - - 78, 172, 172, 81, 82, 172, 172, 172, 172, 172, - 172, 95, 172, 172, 100, 172, 172, 172, 105, 172, - 172, 172, 172, 172, 113, 114, 172, 172, 172, 118, - 172, 119, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 130, 172, 172, 172, 172, 142, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 164, 172, 172, - 166, 172, 11, 172, 13, 172, 172, 34, 38, 40, - 172, 44, 172, 172, 172, 48, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 66, 68, 172, 172, - 75, 172, 172, 172, 172, 172, 86, 172, 172, 172, - - 172, 172, 106, 101, 172, 172, 172, 112, 172, 109, - 172, 172, 172, 123, 172, 122, 172, 172, 172, 172, - 133, 172, 129, 172, 172, 140, 141, 172, 146, 151, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 167, 7, 172, 172, 42, 45, 172, 172, 172, - 172, 172, 172, 51, 55, 172, 172, 172, 172, 172, - 72, 172, 172, 172, 73, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 134, 172, 172, - 145, 150, 172, 172, 172, 143, 172, 172, 172, 172, - - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 58, 172, 172, 172, 172, 71, 74, 172, 85, - 172, 172, 172, 172, 88, 94, 172, 172, 107, 110, - 111, 172, 172, 115, 116, 172, 172, 172, 172, 172, - 172, 172, 136, 135, 172, 172, 172, 153, 172, 172, - 172, 172, 172, 172, 33, 172, 172, 172, 172, 49, - 172, 172, 172, 172, 172, 172, 77, 172, 172, 172, - 87, 172, 98, 172, 172, 172, 172, 172, 172, 126, - 128, 172, 148, 172, 172, 154, 172, 172, 172, 161, - 172, 172, 172, 60, 172, 50, 57, 172, 172, 172, - - 172, 172, 172, 172, 172, 172, 120, 172, 124, 172, - 172, 132, 172, 147, 172, 172, 172, 172, 172, 46, - 172, 59, 172, 172, 67, 172, 172, 172, 172, 172, - 121, 125, 172, 149, 172, 172, 159, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 108, - 172, 172, 160, 172, 172, 54, 62, 65, 172, 172, - 172, 172, 127, 157, 172, 172, 172, 172, 172, 172, - 172, 172, 36, 172, 172, 172, 172, 172, 165, 172, - 172, 172, 172, 172, 172, 89, 90, 91, 172, 172, - - 172, 172, 99, 63, 0 + 0, 0, 178, 176, 1, 1, 176, 5, 176, 6, + 176, 176, 176, 176, 176, 171, 21, 2, 176, 16, + 176, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 176, 28, 24, 19, 25, 17, + 26, 18, 0, 173, 3, 4, 20, 172, 171, 0, + 29, 27, 30, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + + 175, 97, 96, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 117, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 158, 159, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 23, 22, 0, 172, + 0, 0, 174, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 53, 64, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 70, 175, 175, 175, + 175, 175, 84, 175, 175, 175, 175, 175, 175, 175, + + 175, 175, 175, 175, 175, 175, 175, 175, 104, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 141, 175, 175, 175, 175, 175, + 147, 175, 175, 175, 175, 166, 175, 175, 175, 175, + 175, 175, 175, 0, 173, 0, 0, 172, 175, 32, + 175, 175, 175, 175, 175, 37, 39, 175, 175, 175, + 175, 61, 175, 47, 175, 175, 175, 175, 175, 175, + 175, 175, 52, 175, 175, 175, 175, 175, 69, 175, + 175, 175, 175, 175, 79, 175, 80, 175, 175, 83, + + 175, 175, 175, 175, 175, 92, 93, 175, 175, 175, + 175, 175, 175, 175, 175, 102, 103, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 133, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 155, 142, 175, 175, 175, 175, 140, + 175, 175, 175, 175, 175, 175, 175, 161, 165, 175, + 175, 175, 175, 175, 175, 10, 15, 9, 8, 175, + 12, 14, 0, 172, 31, 175, 35, 175, 175, 175, + 41, 175, 43, 175, 175, 175, 175, 175, 175, 175, + 56, 175, 175, 175, 175, 175, 175, 175, 175, 175, + + 175, 175, 76, 78, 175, 175, 81, 82, 175, 175, + 175, 175, 175, 175, 95, 175, 175, 100, 175, 175, + 175, 105, 175, 175, 175, 175, 175, 113, 114, 175, + 175, 175, 118, 175, 119, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 132, 175, 175, 175, 175, 175, + 145, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 167, 175, 175, 169, 175, 11, 175, 13, 175, + 175, 34, 38, 40, 175, 44, 175, 175, 175, 48, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 66, 68, 175, 175, 75, 175, 175, 175, 175, 175, + + 86, 175, 175, 175, 175, 175, 106, 101, 175, 175, + 175, 112, 175, 109, 175, 175, 175, 123, 175, 122, + 175, 175, 175, 175, 135, 175, 131, 175, 175, 175, + 143, 144, 175, 149, 154, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 170, 7, 175, 175, + 42, 45, 175, 175, 175, 175, 175, 175, 51, 55, + 175, 175, 175, 175, 175, 72, 175, 175, 175, 73, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 136, 175, 175, 175, 148, 153, 175, 175, + + 175, 146, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 58, 175, 175, + 175, 175, 71, 74, 175, 85, 175, 175, 175, 175, + 88, 94, 175, 175, 107, 110, 111, 175, 175, 115, + 116, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 139, 138, 175, 175, 175, 156, 175, 175, 175, + 175, 175, 175, 33, 175, 175, 175, 175, 49, 175, + 175, 175, 175, 175, 175, 77, 175, 175, 175, 87, + 175, 98, 175, 175, 175, 175, 175, 175, 175, 175, + 128, 130, 175, 175, 151, 175, 175, 157, 175, 175, + + 175, 164, 175, 175, 175, 60, 175, 50, 57, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 120, 175, + 175, 126, 175, 175, 175, 134, 175, 175, 150, 175, + 175, 175, 175, 175, 46, 175, 59, 175, 175, 67, + 175, 175, 175, 175, 175, 121, 175, 175, 127, 175, + 175, 152, 175, 175, 162, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 108, 175, 175, 175, 175, 175, 163, 175, 175, 54, + 62, 65, 175, 175, 175, 175, 175, 175, 129, 137, + + 160, 175, 175, 175, 175, 175, 175, 175, 124, 175, + 175, 36, 175, 175, 175, 175, 175, 175, 168, 175, + 175, 175, 175, 175, 125, 175, 89, 90, 91, 175, + 175, 175, 175, 99, 63, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -526,193 +529,199 @@ static yyconst flex_int32_t yy_meta[74] = 2, 2, 1 } ; -static yyconst flex_int16_t yy_base[807] = +static yyconst flex_int16_t yy_base[838] = { 0, - 0, 0, 933, 934, 934, 934, 911, 934, 925, 934, - 909, 65, 66, 64, 76, 78, 934, 934, 908, 907, - 906, 49, 49, 56, 67, 68, 81, 50, 80, 97, - 0, 866, 97, 108, 858, 860, 107, 856, 118, 121, - 159, 56, 861, 869, 847, 934, 934, 934, 934, 934, - 934, 934, 908, 181, 934, 934, 934, 186, 201, 226, - 934, 934, 934, 0, 857, 856, 868, 859, 864, 857, - 864, 849, 37, 843, 86, 853, 860, 843, 166, 839, - 853, 128, 846, 855, 844, 850, 836, 849, 188, 849, - 845, 835, 834, 830, 833, 851, 825, 839, 24, 827, - - 846, 0, 821, 825, 814, 96, 62, 830, 852, 102, - 831, 817, 829, 815, 814, 806, 0, 58, 133, 820, - 827, 814, 179, 807, 814, 805, 809, 809, 807, 191, - 803, 802, 801, 145, 0, 0, 829, 803, 792, 810, - 812, 808, 802, 799, 787, 934, 934, 247, 252, 261, - 267, 272, 791, 789, 791, 804, 168, 791, 790, 791, - 782, 791, 786, 787, 785, 785, 778, 791, 82, 779, - 157, 775, 783, 0, 789, 780, 783, 782, 785, 763, - 775, 206, 769, 771, 762, 0, 763, 761, 767, 763, - 772, 0, 772, 791, 264, 768, 767, 757, 756, 789, - - 763, 748, 761, 758, 759, 758, 743, 794, 760, 745, - 750, 737, 754, 750, 753, 744, 734, 738, 743, 736, - 747, 734, 742, 741, 111, 735, 723, 737, 740, 735, - 749, 716, 729, 722, 730, 725, 724, 713, 269, 725, - 718, 726, 748, 719, 707, 724, 711, 718, 709, 701, - 248, 304, 309, 318, 323, 328, 701, 0, 700, 700, - 703, 707, 714, 0, 746, 704, 703, 706, 706, 0, - 689, 0, 707, 696, 689, 693, 687, 694, 190, 698, - 0, 682, 687, 686, 679, 678, 0, 681, 681, 688, - 676, 683, 0, 671, 0, 686, 672, 0, 669, 687, - - 673, 666, 683, 0, 0, 672, 663, 688, 663, 661, - 661, 658, 665, 0, 0, 709, 218, 657, 697, 661, - 653, 653, 657, 654, 658, 661, 656, 645, 646, 643, - 230, 0, 649, 643, 646, 641, 640, 637, 651, 637, - 0, 0, 634, 635, 233, 638, 0, 244, 641, 632, - 643, 646, 641, 657, 0, 0, 668, 619, 624, 635, - 633, 627, 0, 0, 627, 0, 632, 625, 0, 333, - 338, 0, 647, 636, 615, 619, 618, 0, 617, 0, - 612, 619, 616, 623, 620, 619, 609, 627, 608, 615, - 599, 609, 612, 611, 610, 609, 608, 249, 595, 0, - - 0, 607, 606, 0, 0, 600, 321, 587, 590, 595, - 591, 0, 613, 585, 0, 584, 593, 582, 0, 598, - 589, 573, 585, 581, 0, 0, 589, 589, 589, 0, - 578, 0, 596, 583, 571, 585, 568, 580, 571, 565, - 577, 0, 577, 572, 574, 573, 0, 558, 557, 560, - 561, 568, 164, 569, 552, 556, 550, 0, 237, 559, - 0, 562, 0, 559, 0, 560, 555, 0, 0, 595, - 557, 0, 548, 549, 540, 0, 545, 546, 555, 550, - 531, 540, 539, 556, 572, 532, 0, 0, 305, 539, - 0, 538, 541, 531, 335, 568, 0, 534, 522, 534, - - 550, 534, 0, 0, 533, 524, 511, 0, 528, 0, - 515, 524, 531, 0, 516, 0, 521, 326, 520, 540, - 0, 522, 0, 521, 520, 0, 0, 518, 0, 0, - 519, 516, 520, 509, 514, 501, 513, 497, 323, 514, - 501, 0, 0, 495, 493, 0, 0, 504, 517, 504, - 505, 493, 504, 0, 0, 501, 503, 489, 488, 500, - 0, 482, 496, 497, 0, 484, 511, 506, 499, 480, - 487, 467, 503, 486, 469, 477, 481, 471, 467, 480, - 471, 473, 337, 479, 466, 457, 472, 0, 459, 458, - 0, 0, 465, 454, 471, 0, 447, 465, 452, 448, - - 454, 447, 460, 456, 455, 485, 447, 443, 454, 451, - 446, 0, 437, 440, 441, 434, 0, 0, 439, 0, - 461, 460, 471, 441, 0, 0, 471, 427, 0, 0, - 0, 428, 435, 0, 0, 438, 440, 428, 421, 434, - 433, 419, 0, 0, 413, 426, 431, 0, 422, 423, - 430, 421, 424, 450, 0, 437, 412, 413, 415, 0, - 399, 417, 416, 406, 401, 413, 0, 424, 423, 432, - 0, 419, 0, 404, 409, 394, 399, 402, 403, 0, - 0, 399, 0, 385, 400, 0, 402, 399, 383, 0, - 387, 385, 376, 0, 380, 0, 0, 379, 385, 376, - - 390, 393, 392, 391, 406, 370, 0, 383, 0, 38, - 60, 0, 95, 0, 87, 323, 178, 192, 207, 0, - 234, 0, 241, 263, 0, 285, 286, 320, 330, 313, - 0, 0, 321, 0, 304, 307, 0, 307, 317, 318, - 321, 316, 350, 353, 354, 347, 326, 329, 338, 335, - 326, 332, 344, 324, 330, 357, 358, 359, 353, 0, - 336, 338, 0, 356, 345, 0, 370, 0, 366, 367, - 368, 369, 0, 0, 351, 347, 352, 383, 384, 385, - 392, 352, 0, 389, 383, 384, 385, 393, 0, 363, - 389, 390, 391, 401, 371, 0, 0, 0, 395, 379, - - 405, 368, 0, 0, 934, 432 + 0, 0, 969, 970, 970, 970, 947, 970, 961, 970, + 945, 65, 66, 64, 76, 78, 970, 970, 944, 943, + 942, 49, 49, 56, 67, 68, 81, 50, 80, 97, + 0, 902, 97, 108, 894, 896, 107, 892, 118, 125, + 158, 56, 897, 905, 883, 970, 970, 970, 970, 970, + 970, 970, 944, 184, 970, 970, 970, 199, 214, 229, + 970, 970, 970, 0, 893, 892, 904, 895, 900, 893, + 900, 885, 37, 879, 86, 889, 896, 879, 194, 875, + 889, 149, 882, 891, 880, 886, 872, 885, 116, 885, + 881, 871, 870, 866, 869, 887, 861, 875, 24, 863, + + 882, 0, 857, 861, 850, 96, 62, 866, 888, 102, + 867, 853, 865, 851, 850, 842, 0, 58, 137, 856, + 863, 850, 155, 843, 850, 859, 840, 844, 844, 842, + 192, 838, 837, 836, 158, 0, 0, 864, 838, 827, + 845, 847, 843, 837, 834, 822, 970, 970, 248, 254, + 263, 269, 274, 826, 824, 826, 839, 267, 826, 825, + 826, 817, 826, 821, 822, 820, 820, 813, 826, 82, + 814, 171, 810, 818, 0, 824, 815, 818, 817, 820, + 798, 810, 155, 804, 806, 797, 0, 798, 796, 802, + 798, 807, 0, 807, 826, 266, 803, 802, 792, 791, + + 824, 798, 783, 796, 793, 794, 793, 778, 829, 795, + 780, 785, 772, 789, 785, 788, 779, 769, 773, 778, + 771, 782, 769, 777, 776, 173, 770, 758, 772, 775, + 770, 763, 783, 750, 763, 756, 764, 759, 758, 747, + 273, 759, 752, 760, 782, 753, 741, 758, 745, 752, + 743, 735, 262, 318, 323, 332, 337, 342, 735, 0, + 734, 734, 737, 741, 748, 0, 780, 738, 737, 740, + 740, 0, 723, 0, 741, 730, 723, 727, 721, 728, + 174, 732, 0, 716, 721, 720, 713, 712, 0, 715, + 715, 722, 710, 717, 0, 705, 0, 720, 706, 0, + + 703, 721, 707, 700, 717, 0, 0, 706, 697, 722, + 697, 695, 695, 692, 699, 0, 0, 743, 234, 691, + 731, 695, 687, 687, 691, 688, 692, 695, 690, 679, + 680, 677, 182, 0, 683, 677, 680, 675, 674, 671, + 685, 683, 670, 0, 0, 667, 668, 194, 671, 0, + 246, 674, 665, 676, 679, 674, 690, 0, 0, 701, + 652, 657, 668, 666, 660, 0, 0, 660, 0, 665, + 658, 0, 347, 352, 0, 680, 669, 648, 652, 651, + 0, 650, 0, 645, 652, 649, 656, 653, 652, 642, + 660, 641, 648, 632, 642, 645, 644, 643, 642, 641, + + 230, 628, 0, 0, 640, 639, 0, 0, 633, 262, + 620, 623, 628, 624, 0, 646, 618, 0, 617, 626, + 615, 0, 631, 622, 606, 618, 614, 0, 0, 622, + 622, 622, 0, 611, 0, 629, 616, 604, 618, 601, + 613, 604, 598, 610, 0, 627, 609, 604, 606, 605, + 0, 590, 589, 592, 593, 600, 132, 601, 584, 588, + 582, 0, 151, 591, 0, 594, 0, 591, 0, 592, + 587, 0, 0, 627, 589, 0, 580, 581, 572, 0, + 577, 578, 587, 582, 563, 572, 571, 588, 604, 564, + 0, 0, 247, 571, 0, 570, 573, 563, 291, 600, + + 0, 566, 554, 566, 582, 566, 0, 0, 565, 556, + 543, 0, 560, 0, 547, 556, 563, 0, 548, 0, + 553, 336, 552, 572, 0, 554, 0, 557, 552, 551, + 0, 0, 549, 0, 0, 550, 547, 551, 540, 545, + 532, 544, 528, 265, 545, 532, 0, 0, 526, 524, + 0, 0, 535, 548, 535, 536, 524, 535, 0, 0, + 532, 534, 520, 519, 531, 0, 513, 527, 528, 0, + 515, 542, 537, 530, 511, 518, 498, 534, 517, 500, + 508, 512, 502, 498, 511, 502, 504, 348, 510, 497, + 488, 503, 0, 489, 489, 488, 0, 0, 495, 484, + + 501, 0, 477, 495, 482, 478, 484, 477, 490, 486, + 485, 515, 477, 473, 484, 481, 476, 0, 467, 470, + 471, 464, 0, 0, 469, 0, 491, 490, 501, 471, + 0, 0, 501, 457, 0, 0, 0, 458, 465, 0, + 0, 468, 468, 469, 456, 456, 449, 462, 461, 447, + 445, 0, 0, 440, 453, 458, 0, 449, 450, 457, + 448, 451, 477, 0, 464, 439, 440, 442, 0, 426, + 444, 443, 433, 428, 440, 0, 451, 450, 459, 0, + 446, 0, 431, 436, 421, 433, 425, 283, 428, 429, + 0, 0, 425, 445, 0, 410, 425, 0, 427, 424, + + 408, 0, 412, 410, 401, 0, 31, 0, 0, 59, + 89, 88, 125, 190, 255, 269, 286, 252, 0, 271, + 329, 0, 273, 271, 280, 0, 324, 323, 0, 309, + 335, 326, 319, 314, 0, 315, 0, 321, 335, 0, + 341, 342, 343, 351, 335, 0, 339, 324, 0, 347, + 327, 0, 334, 338, 0, 338, 348, 349, 352, 347, + 382, 383, 384, 376, 355, 351, 372, 359, 366, 367, + 364, 355, 361, 373, 353, 359, 386, 387, 388, 382, + 0, 364, 379, 367, 369, 369, 0, 387, 376, 0, + 401, 0, 397, 398, 400, 401, 378, 380, 0, 0, + + 0, 385, 381, 386, 417, 418, 419, 426, 0, 386, + 387, 0, 424, 418, 419, 420, 428, 394, 0, 399, + 425, 426, 427, 437, 0, 407, 0, 0, 0, 431, + 415, 441, 404, 0, 0, 970, 468 } ; -static yyconst flex_int16_t yy_def[807] = +static yyconst flex_int16_t yy_def[838] = { 0, - 805, 1, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 805, 805, 805, 805, 805, - 805, 805, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 805, 805, 805, 805, 805, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 805, - 805, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - - 806, 806, 806, 806, 0, 805 + 836, 1, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 836, 836, 836, 836, + 836, 836, 836, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 836, 836, 836, 836, 836, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 836, 836, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 0, 836 } ; -static yyconst flex_int16_t yy_nxt[1008] = +static yyconst flex_int16_t yy_nxt[1044] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 17, 18, 19, @@ -722,112 +731,116 @@ static yyconst flex_int16_t yy_nxt[1008] = 31, 31, 31, 31, 31, 31, 31, 31, 31, 44, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 45, 49, 53, 51, 54, 54, 54, 54, - 54, 197, 198, 55, 96, 50, 52, 56, 58, 72, - 59, 59, 59, 59, 59, 732, 57, 65, 66, 67, - - 73, 97, 161, 75, 60, 218, 68, 76, 162, 74, - 77, 78, 69, 70, 71, 142, 79, 80, 82, 81, - 143, 206, 83, 733, 219, 85, 207, 86, 90, 60, - 84, 87, 101, 275, 88, 98, 91, 89, 92, 93, - 99, 94, 276, 164, 105, 109, 734, 95, 106, 102, - 100, 165, 107, 735, 114, 204, 103, 108, 115, 110, - 210, 116, 117, 205, 118, 122, 211, 119, 111, 123, - 120, 333, 126, 135, 136, 127, 128, 334, 124, 129, - 176, 177, 130, 131, 125, 178, 132, 133, 220, 137, - 221, 134, 261, 54, 54, 54, 54, 54, 149, 149, - - 149, 149, 149, 241, 242, 278, 138, 148, 262, 263, - 139, 58, 150, 59, 59, 59, 59, 59, 279, 140, - 169, 533, 141, 170, 171, 534, 172, 60, 225, 737, - 173, 226, 148, 289, 151, 151, 290, 150, 152, 152, - 152, 152, 152, 185, 227, 235, 228, 390, 236, 186, - 391, 738, 60, 187, 237, 252, 252, 420, 421, 253, - 253, 253, 253, 253, 149, 149, 149, 149, 149, 255, - 255, 435, 739, 256, 256, 256, 256, 256, 254, 152, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 539, - 301, 449, 446, 348, 540, 435, 349, 363, 447, 740, - - 364, 741, 450, 254, 302, 365, 350, 303, 351, 366, - 742, 367, 368, 489, 490, 369, 253, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 370, 370, 743, 744, - 371, 371, 371, 371, 371, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 256, 371, 371, 371, 371, 371, - 371, 371, 371, 371, 371, 495, 561, 567, 496, 584, - 562, 600, 637, 745, 736, 568, 746, 747, 748, 749, - 750, 751, 752, 753, 754, 755, 756, 638, 601, 757, - 758, 585, 759, 584, 760, 600, 761, 637, 736, 762, - 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, - - 773, 638, 774, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, - 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, - 802, 803, 804, 64, 731, 730, 729, 728, 727, 726, - 725, 724, 723, 722, 721, 720, 719, 718, 717, 716, - 715, 714, 713, 712, 711, 710, 709, 708, 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, 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, 599, 598, 597, 596, 595, 594, 593, 592, - 591, 590, 589, 588, 587, 586, 583, 582, 581, 580, - 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, - 569, 566, 565, 564, 563, 560, 559, 558, 557, 556, - - 555, 554, 553, 552, 551, 550, 549, 548, 547, 546, - 545, 544, 543, 542, 541, 538, 537, 536, 535, 532, - 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, - 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, - 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, - 501, 500, 499, 498, 497, 494, 493, 492, 491, 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, 448, 445, 444, - - 443, 442, 441, 440, 439, 438, 437, 436, 434, 433, - 432, 431, 430, 429, 428, 427, 426, 425, 424, 423, - 422, 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, 393, 392, 389, - 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, - 378, 377, 376, 375, 374, 373, 372, 362, 361, 360, - 359, 358, 357, 356, 355, 354, 353, 352, 347, 346, - 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, - 335, 332, 331, 330, 329, 328, 327, 326, 325, 324, - - 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, - 313, 312, 311, 310, 309, 308, 307, 306, 305, 304, - 300, 299, 298, 297, 296, 295, 294, 293, 292, 291, - 288, 287, 286, 285, 284, 283, 282, 281, 280, 277, - 274, 273, 272, 271, 270, 269, 268, 267, 266, 265, - 264, 260, 259, 258, 257, 251, 250, 249, 248, 247, - 246, 245, 244, 243, 240, 239, 238, 234, 233, 232, - 231, 230, 229, 224, 223, 222, 217, 216, 215, 214, - 213, 212, 209, 208, 203, 202, 201, 200, 199, 196, - 195, 194, 193, 192, 191, 190, 189, 188, 184, 183, - - 182, 181, 180, 179, 175, 174, 168, 167, 166, 163, - 160, 159, 158, 157, 156, 155, 154, 153, 147, 146, - 145, 144, 121, 113, 112, 104, 63, 62, 61, 48, - 47, 46, 805, 3, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - - 805, 805, 805, 805, 805, 805, 805 + 54, 198, 199, 55, 96, 50, 52, 56, 58, 72, + 59, 59, 59, 59, 59, 736, 57, 65, 66, 67, + + 73, 97, 162, 75, 60, 219, 68, 76, 163, 74, + 77, 78, 69, 70, 71, 143, 79, 80, 82, 81, + 144, 207, 83, 737, 220, 85, 208, 86, 90, 60, + 84, 87, 101, 277, 88, 98, 91, 89, 92, 93, + 99, 94, 278, 165, 105, 109, 738, 95, 106, 102, + 100, 166, 107, 739, 114, 205, 103, 108, 115, 110, + 211, 116, 117, 206, 118, 122, 212, 119, 111, 123, + 120, 186, 136, 137, 126, 740, 127, 187, 124, 128, + 129, 188, 291, 130, 125, 292, 131, 132, 138, 538, + 133, 134, 221, 539, 222, 135, 54, 54, 54, 54, + + 54, 177, 178, 544, 226, 139, 179, 227, 545, 140, + 149, 150, 150, 150, 150, 150, 243, 244, 141, 280, + 228, 142, 229, 438, 58, 151, 59, 59, 59, 59, + 59, 393, 281, 335, 394, 149, 741, 152, 152, 336, + 60, 153, 153, 153, 153, 153, 237, 438, 170, 238, + 151, 171, 172, 450, 173, 239, 254, 254, 174, 451, + 255, 255, 255, 255, 255, 60, 150, 150, 150, 150, + 150, 257, 257, 423, 424, 258, 258, 258, 258, 258, + 256, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 263, 303, 453, 493, 494, 499, 351, 566, 500, + + 352, 742, 567, 606, 454, 256, 304, 264, 265, 305, + 353, 366, 354, 572, 367, 743, 744, 745, 723, 368, + 607, 573, 746, 369, 748, 370, 371, 606, 749, 372, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 373, 373, 723, 750, 374, 374, 374, 374, 374, 258, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 589, + 643, 751, 747, 644, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 645, 761, 762, 763, 764, 646, 765, + 766, 590, 767, 589, 768, 643, 747, 769, 644, 770, + + 754, 771, 772, 773, 774, 775, 776, 645, 777, 778, + 779, 780, 646, 781, 782, 783, 784, 785, 786, 787, + 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, + 798, 799, 800, 801, 802, 803, 804, 805, 806, 783, + 807, 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, 64, + 735, 734, 733, 732, 731, 730, 729, 728, 727, 726, + 725, 724, 722, 721, 720, 719, 718, 717, 716, 715, + 714, 713, 712, 711, 710, 709, 708, 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, 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, 605, 604, 603, 602, 601, 600, 599, + + 598, 597, 596, 595, 594, 593, 592, 591, 588, 587, + 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, + 576, 575, 574, 571, 570, 569, 568, 565, 564, 563, + 562, 561, 560, 559, 558, 557, 556, 555, 554, 553, + 552, 551, 550, 549, 548, 547, 546, 543, 542, 541, + 540, 537, 536, 535, 534, 533, 532, 531, 530, 529, + 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, + 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, + 508, 507, 506, 505, 504, 503, 502, 501, 498, 497, + 496, 495, 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, + 452, 449, 448, 447, 446, 445, 444, 443, 442, 441, + 440, 439, 437, 436, 435, 434, 433, 432, 431, 430, + 429, 428, 427, 426, 425, 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, 392, 391, 390, 389, 388, 387, 386, + 385, 384, 383, 382, 381, 380, 379, 378, 377, 376, + + 375, 365, 364, 363, 362, 361, 360, 359, 358, 357, + 356, 355, 350, 349, 348, 347, 346, 345, 344, 343, + 342, 341, 340, 339, 338, 337, 334, 333, 332, 331, + 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, + 320, 319, 318, 317, 316, 315, 314, 313, 312, 311, + 310, 309, 308, 307, 306, 302, 301, 300, 299, 298, + 297, 296, 295, 294, 293, 290, 289, 288, 287, 286, + 285, 284, 283, 282, 279, 276, 275, 274, 273, 272, + 271, 270, 269, 268, 267, 266, 262, 261, 260, 259, + 253, 252, 251, 250, 249, 248, 247, 246, 245, 242, + + 241, 240, 236, 235, 234, 233, 232, 231, 230, 225, + 224, 223, 218, 217, 216, 215, 214, 213, 210, 209, + 204, 203, 202, 201, 200, 197, 196, 195, 194, 193, + 192, 191, 190, 189, 185, 184, 183, 182, 181, 180, + 176, 175, 169, 168, 167, 164, 161, 160, 159, 158, + 157, 156, 155, 154, 148, 147, 146, 145, 121, 113, + 112, 104, 63, 62, 61, 48, 47, 46, 836, 3, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836 } ; -static yyconst flex_int16_t yy_chk[1008] = +static yyconst flex_int16_t yy_chk[1044] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -838,108 +851,112 @@ static yyconst flex_int16_t yy_chk[1008] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 14, 13, 14, 14, 14, 14, 14, 99, 99, 15, 28, 12, 13, 15, 16, 23, - 16, 16, 16, 16, 16, 710, 15, 22, 22, 22, + 16, 16, 16, 16, 16, 707, 15, 22, 22, 22, 23, 28, 73, 24, 16, 118, 22, 24, 73, 23, 24, 24, 22, 22, 22, 42, 24, 24, 25, 24, - 42, 107, 25, 711, 118, 26, 107, 26, 27, 16, - 25, 26, 30, 169, 26, 29, 27, 26, 27, 27, - 29, 27, 169, 75, 33, 34, 713, 27, 33, 30, - 29, 75, 33, 715, 37, 106, 30, 33, 37, 34, + 42, 107, 25, 710, 118, 26, 107, 26, 27, 16, + 25, 26, 30, 170, 26, 29, 27, 26, 27, 27, + 29, 27, 170, 75, 33, 34, 711, 27, 33, 30, + 29, 75, 33, 712, 37, 106, 30, 33, 37, 34, 110, 37, 37, 106, 37, 39, 110, 37, 34, 39, - 37, 225, 40, 41, 41, 40, 40, 225, 39, 40, - 82, 82, 40, 40, 39, 82, 40, 40, 119, 41, - 119, 40, 157, 54, 54, 54, 54, 54, 58, 58, - - 58, 58, 58, 134, 134, 171, 41, 54, 157, 157, - 41, 59, 58, 59, 59, 59, 59, 59, 171, 41, - 79, 453, 41, 79, 79, 453, 79, 59, 123, 717, - 79, 123, 54, 182, 60, 60, 182, 58, 60, 60, - 60, 60, 60, 89, 123, 130, 123, 279, 130, 89, - 279, 718, 59, 89, 130, 148, 148, 317, 317, 148, - 148, 148, 148, 148, 149, 149, 149, 149, 149, 150, - 150, 331, 719, 150, 150, 150, 150, 150, 149, 151, - 151, 151, 151, 151, 152, 152, 152, 152, 152, 459, - 195, 348, 345, 239, 459, 331, 239, 251, 345, 721, - - 251, 723, 348, 149, 195, 251, 239, 195, 239, 251, - 724, 251, 251, 398, 398, 251, 252, 252, 252, 252, - 252, 253, 253, 253, 253, 253, 254, 254, 726, 727, + 37, 89, 41, 41, 40, 713, 40, 89, 39, 40, + 40, 89, 183, 40, 39, 183, 40, 40, 41, 457, + 40, 40, 119, 457, 119, 40, 54, 54, 54, 54, + + 54, 82, 82, 463, 123, 41, 82, 123, 463, 41, + 54, 58, 58, 58, 58, 58, 135, 135, 41, 172, + 123, 41, 123, 333, 59, 58, 59, 59, 59, 59, + 59, 281, 172, 226, 281, 54, 714, 60, 60, 226, + 59, 60, 60, 60, 60, 60, 131, 333, 79, 131, + 58, 79, 79, 348, 79, 131, 149, 149, 79, 348, + 149, 149, 149, 149, 149, 59, 150, 150, 150, 150, + 150, 151, 151, 319, 319, 151, 151, 151, 151, 151, + 150, 152, 152, 152, 152, 152, 153, 153, 153, 153, + 153, 158, 196, 351, 401, 401, 410, 241, 493, 410, + + 241, 715, 493, 544, 351, 150, 196, 158, 158, 196, + 241, 253, 241, 499, 253, 716, 717, 718, 688, 253, + 544, 499, 720, 253, 723, 253, 253, 544, 724, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, - 256, 256, 256, 256, 256, 370, 370, 370, 370, 370, - 371, 371, 371, 371, 371, 407, 489, 495, 407, 518, - 489, 539, 583, 728, 716, 495, 729, 730, 733, 735, - 736, 738, 739, 740, 741, 742, 743, 583, 539, 744, - 745, 518, 746, 518, 747, 539, 748, 583, 716, 749, - 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, - - 761, 583, 762, 764, 765, 767, 769, 770, 771, 772, - 775, 776, 777, 778, 779, 780, 781, 782, 784, 785, - 786, 787, 788, 790, 791, 792, 793, 794, 795, 799, - 800, 801, 802, 806, 708, 706, 705, 704, 703, 702, - 701, 700, 699, 698, 695, 693, 692, 691, 689, 688, - 687, 685, 684, 682, 679, 678, 677, 676, 675, 674, - 672, 670, 669, 668, 666, 665, 664, 663, 662, 661, - 659, 658, 657, 656, 654, 653, 652, 651, 650, 649, - 647, 646, 645, 642, 641, 640, 639, 638, 637, 636, - 633, 632, 628, 627, 624, 623, 622, 621, 619, 616, - - 615, 614, 613, 611, 610, 609, 608, 607, 606, 605, - 604, 603, 602, 601, 600, 599, 598, 597, 595, 594, - 593, 590, 589, 587, 586, 585, 584, 582, 581, 580, - 579, 578, 577, 576, 575, 574, 573, 572, 571, 570, - 569, 568, 567, 566, 564, 563, 562, 560, 559, 558, - 557, 556, 553, 552, 551, 550, 549, 548, 545, 544, - 541, 540, 538, 537, 536, 535, 534, 533, 532, 531, - 528, 525, 524, 522, 520, 519, 517, 515, 513, 512, - 511, 509, 507, 506, 505, 502, 501, 500, 499, 498, - 496, 494, 493, 492, 490, 486, 485, 484, 483, 482, - - 481, 480, 479, 478, 477, 475, 474, 473, 471, 470, - 467, 466, 464, 462, 460, 457, 456, 455, 454, 452, - 451, 450, 449, 448, 446, 445, 444, 443, 441, 440, - 439, 438, 437, 436, 435, 434, 433, 431, 429, 428, - 427, 424, 423, 422, 421, 420, 418, 417, 416, 414, - 413, 411, 410, 409, 408, 406, 403, 402, 399, 397, - 396, 395, 394, 393, 392, 391, 390, 389, 388, 387, - 386, 385, 384, 383, 382, 381, 379, 377, 376, 375, - 374, 373, 368, 367, 365, 362, 361, 360, 359, 358, - 357, 354, 353, 352, 351, 350, 349, 346, 344, 343, - - 340, 339, 338, 337, 336, 335, 334, 333, 330, 329, - 328, 327, 326, 325, 324, 323, 322, 321, 320, 319, - 318, 316, 313, 312, 311, 310, 309, 308, 307, 306, - 303, 302, 301, 300, 299, 297, 296, 294, 292, 291, - 290, 289, 288, 286, 285, 284, 283, 282, 280, 278, - 277, 276, 275, 274, 273, 271, 269, 268, 267, 266, - 265, 263, 262, 261, 260, 259, 257, 250, 249, 248, - 247, 246, 245, 244, 243, 242, 241, 240, 238, 237, - 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, - 226, 224, 223, 222, 221, 220, 219, 218, 217, 216, - - 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, - 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, - 194, 193, 191, 190, 189, 188, 187, 185, 184, 183, - 181, 180, 179, 178, 177, 176, 175, 173, 172, 170, - 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, - 158, 156, 155, 154, 153, 145, 144, 143, 142, 141, - 140, 139, 138, 137, 133, 132, 131, 129, 128, 127, - 126, 125, 124, 122, 121, 120, 116, 115, 114, 113, - 112, 111, 109, 108, 105, 104, 103, 101, 100, 98, - 97, 96, 95, 94, 93, 92, 91, 90, 88, 87, - - 86, 85, 84, 83, 81, 80, 78, 77, 76, 74, - 72, 71, 70, 69, 68, 67, 66, 65, 53, 45, - 44, 43, 38, 36, 35, 32, 21, 20, 19, 11, - 9, 7, 3, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, - - 805, 805, 805, 805, 805, 805, 805 + 256, 256, 688, 725, 256, 256, 256, 256, 256, 257, + 257, 257, 257, 257, 258, 258, 258, 258, 258, 373, + 373, 373, 373, 373, 374, 374, 374, 374, 374, 522, + 588, 727, 721, 588, 728, 730, 731, 732, 733, 734, + 736, 738, 739, 588, 741, 742, 743, 744, 588, 745, + 747, 522, 748, 522, 750, 588, 721, 751, 588, 753, + + 731, 754, 756, 757, 758, 759, 760, 588, 761, 762, + 763, 764, 588, 765, 766, 767, 768, 769, 770, 771, + 772, 773, 774, 775, 776, 777, 778, 779, 780, 782, + 783, 784, 785, 786, 788, 789, 791, 793, 794, 767, + 795, 796, 797, 798, 802, 803, 804, 805, 806, 807, + 808, 810, 811, 813, 814, 815, 816, 817, 818, 820, + 821, 822, 823, 824, 826, 830, 831, 832, 833, 837, + 705, 704, 703, 701, 700, 699, 697, 696, 694, 693, + 690, 689, 687, 686, 685, 684, 683, 681, 679, 678, + 677, 675, 674, 673, 672, 671, 670, 668, 667, 666, + + 665, 663, 662, 661, 660, 659, 658, 656, 655, 654, + 651, 650, 649, 648, 647, 646, 645, 644, 643, 642, + 639, 638, 634, 633, 630, 629, 628, 627, 625, 622, + 621, 620, 619, 617, 616, 615, 614, 613, 612, 611, + 610, 609, 608, 607, 606, 605, 604, 603, 601, 600, + 599, 596, 595, 594, 592, 591, 590, 589, 587, 586, + 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, + 575, 574, 573, 572, 571, 569, 568, 567, 565, 564, + 563, 562, 561, 558, 557, 556, 555, 554, 553, 550, + 549, 546, 545, 543, 542, 541, 540, 539, 538, 537, + + 536, 533, 530, 529, 528, 526, 524, 523, 521, 519, + 517, 516, 515, 513, 511, 510, 509, 506, 505, 504, + 503, 502, 500, 498, 497, 496, 494, 490, 489, 488, + 487, 486, 485, 484, 483, 482, 481, 479, 478, 477, + 475, 474, 471, 470, 468, 466, 464, 461, 460, 459, + 458, 456, 455, 454, 453, 452, 450, 449, 448, 447, + 446, 444, 443, 442, 441, 440, 439, 438, 437, 436, + 434, 432, 431, 430, 427, 426, 425, 424, 423, 421, + 420, 419, 417, 416, 414, 413, 412, 411, 409, 406, + 405, 402, 400, 399, 398, 397, 396, 395, 394, 393, + + 392, 391, 390, 389, 388, 387, 386, 385, 384, 382, + 380, 379, 378, 377, 376, 371, 370, 368, 365, 364, + 363, 362, 361, 360, 357, 356, 355, 354, 353, 352, + 349, 347, 346, 343, 342, 341, 340, 339, 338, 337, + 336, 335, 332, 331, 330, 329, 328, 327, 326, 325, + 324, 323, 322, 321, 320, 318, 315, 314, 313, 312, + 311, 310, 309, 308, 305, 304, 303, 302, 301, 299, + 298, 296, 294, 293, 292, 291, 290, 288, 287, 286, + 285, 284, 282, 280, 279, 278, 277, 276, 275, 273, + 271, 270, 269, 268, 267, 265, 264, 263, 262, 261, + + 259, 252, 251, 250, 249, 248, 247, 246, 245, 244, + 243, 242, 240, 239, 238, 237, 236, 235, 234, 233, + 232, 231, 230, 229, 228, 227, 225, 224, 223, 222, + 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, + 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, + 201, 200, 199, 198, 197, 195, 194, 192, 191, 190, + 189, 188, 186, 185, 184, 182, 181, 180, 179, 178, + 177, 176, 174, 173, 171, 169, 168, 167, 166, 165, + 164, 163, 162, 161, 160, 159, 157, 156, 155, 154, + 146, 145, 144, 143, 142, 141, 140, 139, 138, 134, + + 133, 132, 130, 129, 128, 127, 126, 125, 124, 122, + 121, 120, 116, 115, 114, 113, 112, 111, 109, 108, + 105, 104, 103, 101, 100, 98, 97, 96, 95, 94, + 93, 92, 91, 90, 88, 87, 86, 85, 84, 83, + 81, 80, 78, 77, 76, 74, 72, 71, 70, 69, + 68, 67, 66, 65, 53, 45, 44, 43, 38, 36, + 35, 32, 21, 20, 19, 11, 9, 7, 3, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836 } ; static yy_state_type yy_last_accepting_state; @@ -996,7 +1013,7 @@ void skipline(void); #define YY_NO_UNISTD_H #endif -#line 1000 "Gmsh.yy.cpp" +#line 1017 "Gmsh.yy.cpp" #define INITIAL 0 @@ -1181,7 +1198,7 @@ YY_DECL #line 49 "Gmsh.l" -#line 1185 "Gmsh.yy.cpp" +#line 1202 "Gmsh.yy.cpp" if ( !(yy_init) ) { @@ -1234,13 +1251,13 @@ yy_match: 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 >= 806 ) + if ( yy_current_state >= 837 ) 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] != 934 ); + while ( yy_base[yy_current_state] != 970 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1883,250 +1900,265 @@ return tPlugin; case 124: YY_RULE_SETUP #line 190 "Gmsh.l" -return tQuadTriDbl; +return tQuadTriAddVerts; YY_BREAK case 125: YY_RULE_SETUP #line 191 "Gmsh.l" -return tQuadTriSngl; +return tQuadTriNoNewVerts; YY_BREAK case 126: YY_RULE_SETUP #line 193 "Gmsh.l" -return tRecombine; +return tQuadTriDbl; YY_BREAK case 127: YY_RULE_SETUP #line 194 "Gmsh.l" -return tRecombLaterals; +return tQuadTriSngl; YY_BREAK case 128: YY_RULE_SETUP -#line 195 "Gmsh.l" -return tRecursive; +#line 196 "Gmsh.l" +return tRecombine; YY_BREAK case 129: YY_RULE_SETUP -#line 196 "Gmsh.l" -return tRotate; +#line 197 "Gmsh.l" +return tRecombLaterals; YY_BREAK case 130: YY_RULE_SETUP -#line 197 "Gmsh.l" -return tRuled; +#line 198 "Gmsh.l" +return tRecursive; YY_BREAK case 131: YY_RULE_SETUP -#line 198 "Gmsh.l" -return tRand; +#line 199 "Gmsh.l" +return tRotate; YY_BREAK case 132: YY_RULE_SETUP -#line 199 "Gmsh.l" -return tRefineMesh; +#line 200 "Gmsh.l" +return tRuled; YY_BREAK case 133: YY_RULE_SETUP -#line 200 "Gmsh.l" -return tReturn; +#line 201 "Gmsh.l" +return tRand; YY_BREAK case 134: YY_RULE_SETUP -#line 201 "Gmsh.l" -return tReverse; +#line 202 "Gmsh.l" +return tRefineMesh; YY_BREAK case 135: YY_RULE_SETUP #line 203 "Gmsh.l" -return tSmoother; +return tReturn; YY_BREAK case 136: YY_RULE_SETUP #line 204 "Gmsh.l" -return tSetOrder; +return tReverse; YY_BREAK case 137: YY_RULE_SETUP -#line 205 "Gmsh.l" -return tSqrt; +#line 206 "Gmsh.l" +return tScaleLast; YY_BREAK case 138: YY_RULE_SETUP -#line 206 "Gmsh.l" -return tSin; +#line 207 "Gmsh.l" +return tSmoother; YY_BREAK case 139: YY_RULE_SETUP -#line 207 "Gmsh.l" -return tSinh; +#line 208 "Gmsh.l" +return tSetOrder; YY_BREAK case 140: YY_RULE_SETUP -#line 208 "Gmsh.l" -return tSphere; +#line 209 "Gmsh.l" +return tSqrt; YY_BREAK case 141: YY_RULE_SETUP -#line 209 "Gmsh.l" -return tSpline; +#line 210 "Gmsh.l" +return tSin; YY_BREAK case 142: YY_RULE_SETUP -#line 210 "Gmsh.l" -return tSplit; +#line 211 "Gmsh.l" +return tSinh; YY_BREAK case 143: YY_RULE_SETUP -#line 211 "Gmsh.l" -return tSurface; +#line 212 "Gmsh.l" +return tSphere; YY_BREAK case 144: YY_RULE_SETUP -#line 212 "Gmsh.l" -return tStr; +#line 213 "Gmsh.l" +return tSpline; YY_BREAK case 145: YY_RULE_SETUP -#line 213 "Gmsh.l" -return tSprintf; +#line 214 "Gmsh.l" +return tSplit; YY_BREAK case 146: YY_RULE_SETUP -#line 214 "Gmsh.l" -return tStrCat; +#line 215 "Gmsh.l" +return tSurface; YY_BREAK case 147: YY_RULE_SETUP -#line 215 "Gmsh.l" -return tStrReplace; +#line 216 "Gmsh.l" +return tStr; YY_BREAK case 148: YY_RULE_SETUP -#line 216 "Gmsh.l" -return tStrPrefix; +#line 217 "Gmsh.l" +return tSprintf; YY_BREAK case 149: YY_RULE_SETUP -#line 217 "Gmsh.l" -return tStrRelative; +#line 218 "Gmsh.l" +return tStrCat; YY_BREAK case 150: YY_RULE_SETUP -#line 218 "Gmsh.l" -return tStrFind; +#line 219 "Gmsh.l" +return tStrReplace; YY_BREAK case 151: YY_RULE_SETUP -#line 219 "Gmsh.l" -return tStrCmp; +#line 220 "Gmsh.l" +return tStrPrefix; YY_BREAK case 152: YY_RULE_SETUP -#line 220 "Gmsh.l" -return tShow; +#line 221 "Gmsh.l" +return tStrRelative; YY_BREAK case 153: YY_RULE_SETUP -#line 221 "Gmsh.l" -return tSymmetry; +#line 222 "Gmsh.l" +return tStrFind; YY_BREAK case 154: YY_RULE_SETUP -#line 222 "Gmsh.l" -return tSyncModel; +#line 223 "Gmsh.l" +return tStrCmp; YY_BREAK case 155: YY_RULE_SETUP #line 224 "Gmsh.l" -return tText2D; +return tShow; YY_BREAK case 156: YY_RULE_SETUP #line 225 "Gmsh.l" -return tText3D; +return tSymmetry; YY_BREAK case 157: YY_RULE_SETUP #line 226 "Gmsh.l" -return tTextAttributes; +return tSyncModel; YY_BREAK case 158: YY_RULE_SETUP -#line 227 "Gmsh.l" -return tTime; +#line 228 "Gmsh.l" +return tText2D; YY_BREAK case 159: YY_RULE_SETUP -#line 228 "Gmsh.l" -return tTransfinite; +#line 229 "Gmsh.l" +return tText3D; YY_BREAK case 160: YY_RULE_SETUP -#line 229 "Gmsh.l" -return tTransfQuadTri; +#line 230 "Gmsh.l" +return tTextAttributes; YY_BREAK case 161: YY_RULE_SETUP -#line 230 "Gmsh.l" -return tTranslate; +#line 231 "Gmsh.l" +return tTime; YY_BREAK case 162: YY_RULE_SETUP -#line 231 "Gmsh.l" -return tTanh; +#line 232 "Gmsh.l" +return tTransfinite; YY_BREAK case 163: YY_RULE_SETUP -#line 232 "Gmsh.l" -return tTan; +#line 233 "Gmsh.l" +return tTransfQuadTri; YY_BREAK case 164: YY_RULE_SETUP -#line 233 "Gmsh.l" -return tToday; +#line 234 "Gmsh.l" +return tTranslate; YY_BREAK case 165: YY_RULE_SETUP #line 235 "Gmsh.l" -return tUndefineConstant; +return tTanh; YY_BREAK case 166: YY_RULE_SETUP #line 236 "Gmsh.l" -return tUsing; +return tTan; YY_BREAK case 167: YY_RULE_SETUP -#line 238 "Gmsh.l" -return tVolume; +#line 237 "Gmsh.l" +return tToday; YY_BREAK case 168: -#line 241 "Gmsh.l" +YY_RULE_SETUP +#line 239 "Gmsh.l" +return tUndefineConstant; + YY_BREAK case 169: -#line 242 "Gmsh.l" +YY_RULE_SETUP +#line 240 "Gmsh.l" +return tUsing; + YY_BREAK case 170: -#line 243 "Gmsh.l" +YY_RULE_SETUP +#line 242 "Gmsh.l" +return tVolume; + YY_BREAK case 171: +#line 245 "Gmsh.l" +case 172: +#line 246 "Gmsh.l" +case 173: +#line 247 "Gmsh.l" +case 174: YY_RULE_SETUP -#line 243 "Gmsh.l" +#line 247 "Gmsh.l" { gmsh_yylval.d = atof((char *)gmsh_yytext); return tDOUBLE; } YY_BREAK -case 172: +case 175: YY_RULE_SETUP -#line 245 "Gmsh.l" +#line 249 "Gmsh.l" { gmsh_yylval.c = strsave((char*)gmsh_yytext); return tSTRING; } YY_BREAK -case 173: +case 176: YY_RULE_SETUP -#line 247 "Gmsh.l" +#line 251 "Gmsh.l" return gmsh_yytext[0]; YY_BREAK -case 174: +case 177: YY_RULE_SETUP -#line 249 "Gmsh.l" +#line 253 "Gmsh.l" ECHO; YY_BREAK -#line 2130 "Gmsh.yy.cpp" +#line 2162 "Gmsh.yy.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -2418,7 +2450,7 @@ static int yy_get_next_buffer (void) 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 >= 806 ) + if ( yy_current_state >= 837 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2446,11 +2478,11 @@ static int yy_get_next_buffer (void) 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 >= 806 ) + if ( yy_current_state >= 837 ) 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 == 805); + yy_is_jam = (yy_current_state == 836); return yy_is_jam ? 0 : yy_current_state; } @@ -3123,7 +3155,7 @@ void gmsh_yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 249 "Gmsh.l" +#line 253 "Gmsh.l" diff --git a/benchmarks/extrude_quadtri/3sidedruled.stl.gz b/benchmarks/extrude_quadtri/3sidedruled.stl.gz new file mode 100644 index 0000000000000000000000000000000000000000..421c8ef4715ded22274283e07a305838245a0178 GIT binary patch literal 113230 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%0D>y?9CuD@kAT?>p2-4<6BsbO|v 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 literal 0 HcmV?d00001 diff --git a/benchmarks/extrude_quadtri/READMEQUADTRI.txt b/benchmarks/extrude_quadtri/READMEQUADTRI.txt new file mode 100644 index 0000000000..6298e81b3f --- /dev/null +++ b/benchmarks/extrude_quadtri/READMEQUADTRI.txt @@ -0,0 +1,253 @@ +INFORMATION FOR QUADTRI PATCH VERSION 2.0 (August 23, 2013) + +All new code is written by Trevor S. Strickler +<trevor.strickler@gmail.com> + +Trevor S. Strickler hereby transfers copyright of QuadTri files to +Christophe Geuzaine and J.-F. Remacle with the understanding that +his contribution shall be cited appropriately. + +All code reused from Gmsh is Copyright (C) 1997-2013 C. Geuzaine, +J.-F. Remacle + +Gmsh is available at: www.geuz.org/gmsh + +See licensing information below. + + +CONTENTS: + +1. Copyright and Licensing + +2. Introduction + +3. How QuadTri works. + a. For Transfinite Volumes. + b. For Structured Extrusions. + +4. Invoking QuadTri. + a. For Transfinite Volumes. + b. For Structured Extrusions. + +5. How to modify Gmsh to use QuadTri. + + +COPYRIGHT AND LICENSING +----------------------- + +QuadTri was written by Trevor S. Strickler +<trevor.strickler@gmail.com>. It is written as an addition to the +meshing code Gmsh, which is copyrighted by C. Geuzaine and J.-F. +Remacle and distributed under the GNU Public License version 2 with +an exception. QuadTri is released under the GNU Public License +Version 2 with the SAME exceptions as for the current release of Gmsh +as of August 23, 2013. See LICENSE.txt for more information. + +Trevor S. Strickler hereby transfers copyright of QuadTri files to +Christophe Geuzaine and J.-F. Remacle with the understanding that +his contribution shall be cited appropriately. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License, Version 2, +as published by the Free Software Foundation, or (at your option) +any later version, with or without the exception given in the +LICENSE.txt file supplied with this code and with Gmsh. + +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. + + +INTRODUCTION +---------------------------- + +The Quadrangle-to-Triangle (QuadToTri) interface allows the user to connect +structured regions containing quadrangle-bounded mesh elements (hexahedra, +prisms, or pyramids) to regions that contain tetrahedra. The QuadToTri +feature may be applied to both structured extrusions and tranfinite regions. + + +HOW QUADTRI WORKS +----------------- + +The QuadToTri algorithms create a conformal interface between structured +regions that contain quadrangle-bounded mesh elements and tetrahedral regions +by subdividing elements in the quadrangle-containing region. First, on the +boundaries that the quad-containing region shares with a tetrahedral region, +all 2D quadrangle elements are divided into triangles. Then, the 3D volume +elements in the quad-containing region that touch these triangles are +subdivided into pyramids, tetrahedra, or prisms as necessary for the mesh to +remain conformal. + +a. FOR TRANSFINITE VOLUMES: + +The QuadTri algorithm for transfinite volumes is very simple. +A transfinite region with any combination of recombined and +un-recombined transfinite boundary surfaces is valid when meshed with +Transfinite QuadTri. Any mesh elements in a QuadToTri transfinite region +that are adjacent to unrecombined, 2D boundary surface elements will +be divided with a body-centered internal vertex, conformal to the +surface mesh. This method works for both 5- and 6-sided transfinite +regions. + + +b. STRUCTURED EXTRUSIONS: + +QuadToTri may also be applied to structured extrusions. +The QuadToTri algorithms for structured extrusions ( from here on referred to +as 'QuadTriExtruded') work for any structured, extruded region. Source surfaces +may be structured or unstructured; the sources may also be all quadrangles, +all triangles, or mixed. Recently, the ability was added to apply QuadToTri to +a region extruded in a toroidal loop in which the 'top' surface coincides with +the source. The user also has the option to keep free lateral boundaries +recombined (where possible) and only divide the top surface into triangles. + +There are two variations of QuadToTri for structured extrusions: the +'Add Vertices' method (method 1), and the 'No New Vertices' method (method 2). + +Method 1 (No New Vertices): In 2D, this method subdivides the quadrangles +on the following boundary surfaces of an extruded, structured region: the top +surface of the extruded region, the boundaries that the region shares with +tetrahedral regions, and free lateral boundaries if the user has selected to +do so. In 3D, the method attempts to subdivide 3D elements in the region that +touch the boundary surface triangles WITHOUT adding any additional vertices. +This subdivision is accomplished by creating pyramids, prisms, or tetrahedra +such that the mesh remains valid. In some cases, due to certain lateral +boundary conditions, it may not be possible make a valid element subdivision +without adding additional vertices. In this case, an internal vertex is +created at the vertex-based centroid of the element. The element is then +divided using that vertex. When an internal vertex is created in the 'No New +Vertices' method, the user is alerted by a warning message sent for each +instance--however, the mesh will still be valid and conformal. + +Method 2: (Add Vertices) In 2D, as in method 1, this method subdivides the +quadrangles on the following boundary surfaces of an extruded, structured +region: the top surface of the extruded region, the boundaries the region +shares with tetrahedral regions, and free lateral boundaries if the user has +selected to do so. In 3D, body-centered vertices are added at the centroids +of any 3D elements in the region that are adjacent to the subdivided 2D +boundaries. The elements are then subdivided using the internal vertex into +pyramids, prisms, or tetrahedra such that the mesh remains valid. + +There are advantages and disadvantages to each of these two methods: + +The 'No New Vertices' method creates the least number of mesh elements, +but the quality of the elements is sometimes slightly worse than for the +'Add Vertices' method when hexahedra are being divided. Also, in rare +instances, the 'No New Vertices' method may be unable to divide an element +without adding a body-centered vertex; however, this is rare and *should* +only be possible when the source surface has 2D elements with all vertices +on a boundary AND if there are both recombined and unrecombined lateral +surfaces in the extrusion--but even then it is unlikely. Even if a new +vertex is created by the 'No New Vertices' method, the mesh will still be +conformal--but some users may not want an irregular vertex pattern in their +structured extrusions. + + +Recommendations: For considerations of element quality, use 'No New Vertices' +when only prisms are being divided (ie, when the extrusion source is a +surface with all triangles). Use 'Add New Vertices' whenever hexahedra are +involved, or when the user does not care if new vertices are added to the +mesh. + +If the user has a quad-containing, structured mesh to interface to +a tetrahedral region but would also like the structured mesh to remain +unchanged, interface regions may be built around the primary structured +region and those regions may have QuadToTri applied in order to create the +interface. + + +As a last note on QuadTriExtruded: The algorithms are 'smart' about the +boundary requirements of neighboring regions and will resolve lateral surface +mesh conflicts where ever necessary. The default behavior is to divide +free lateral boundaries into triangles when possible. Alternatively, the user +may choose to have as many laterals as possible remain as quadrangles. +However, regardless of user preference, the algorithms will do what they +have to do to maintain conformal meshes on the laterals. In other words, do +not worry about conformality with lateral neighbors--QuadTriExtruded will not +divide a lateral surface that must remain meshed as quadrangles, and it will +not recombine a lateral surface that must remain as triangles. However, NOTE: +the 'top' surface of a structured region is always divided by +QuadTriExtruded. Also, laterals between two QuadTriExtruded regions are +always recombined as quadrangles. + + + +INVOKING QUADTRI +---------------- + +a. FOR TRANSFINITE VOLUMES: + +The transfinite QuadTri algorithm may be applied by using the following +command: + +TransfQuadTri { expression-list } | "*"; + +Where 'expression-list' is a list of volume numbers to apply QuadTri to. +"*" is used to apply TransfQuadTri to all existing volumes. A transfinite +volume with any combination of recombined and un-recombined transfinite boundary +surfaces is valid when meshed with TransfQuadTri. When applied to +non-Transfinite volumes, TransfQuadTri has NO effect on those volumes. + + + +b. FOR STRUCTURED EXTRUSIONS: + +QuadTri for structured extrusions (QuadTriExtruded) is invoked by using +the appropriate keywords in the 'extrude-list layers' part of an 'Extrude' +command for structured meshes. (see Gmsh manual for description of the +'Extrude' command for structured meshes). Note that the QuadTriExtruded +commands only have an effect for the extrusion of a surface to create a +region, AND only if the 'Recombine' option is used (there is no point +in applying QuadTriExtruded to a fully subdivided region). + +The keywords (note that only the first letter must be capitalized): + + QuadTriNoNewVerts; (for 'No New Vertices' method) + QuadTriAddVerts; (for 'Add Vertices' method) + +Permissible variants (shown here as regular expressions (regexp) ): + + Quad[tT]ri[nN]o[nN]ew[vV]erts; + Quad[tT]ri[aA]dd[vV]erts; + +Optionally, for each of the two QuadTriExtruded methods, the user may choose +to keep free lateral surfaces of the region recombined (where possible) by +using: + + QuadTriNoNewVerts Recomblaterals; + QuadTriAddVerts Recomblaterals; + + +Examples of Usage: + +'No New Vertices' method, recombine laterals: + + Extrude {0.0, 0.0, 1.0} {Surface {surf_num}; Layers {10}; Recombine; + QuadTriNoNewVerts Recomblaterals; }; + +'Add Vertices' method not using the recombine laterals option: + + Extrude {0.0, 0.0, 1.0} {Surface {surf_num}; Layers {10}; QuadTriAddVerts; + Recombine; }; + +Let it be repeated: If the QuadTriExtruded region shares a lateral with another +region, QuadTriExtruded will only divide (or not divide) that surface in a way +that does not create conflicts between the regions, regardless of +whether Recomblaterals was used or not. In other words, do not worry +about conformality with lateral neighbors--QuadTriExtruded will not divide +a lateral surface that must remain quadrangles, nor will it recombine +a lateral surface that must remain triangles. + + +HOW TO MODIFY GMSH TO USE QUADTRI +--------------------------------------- + +One may simply copy the files distributed with the QuadTri patch +directly into the appropriate Gmsh directories (replacing any old copies with +the patched versions) and the changes to the source will be complete. The +user can then compile the source as for the regular Gmsh version. Be careful +not to get the /Mesh/CMakeLists.txt file confused with the CMakeLists.txt +file in other directories!!!! + diff --git a/benchmarks/extrude_quadtri/TransfiniteQuadTriExample.geo b/benchmarks/extrude_quadtri/TransfiniteQuadTriExample.geo new file mode 100644 index 0000000000..74f1dff5d9 --- /dev/null +++ b/benchmarks/extrude_quadtri/TransfiniteQuadTriExample.geo @@ -0,0 +1,162 @@ +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.OldRuledSurface=1; + + +length1 = 1.0; +outer_length = 2.0; + +interface_width = 0.07; + +transf1 = 15; +transf2 = 2; +transf_outer = 30; + +Point (newp) = {0.0, 0.0, 0.0}; +Point (newp) = {length1, 0.0, 0.0}; +Point (newp) = {length1, length1, 0.0}; +Point (newp) = {0.0, length1, 0.0}; + +source_pts[] = {newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {source_pts[0], source_pts[1]}; +Line (newl) = {source_pts[1], source_pts[2]}; +Line (newl) = {source_pts[2], source_pts[3]}; +Line (newl) = {source_pts[3], source_pts[0]}; + +source_lines[] = {newl-4, newl-3, newl-2, newl-1}; +Transfinite Line {source_lines[]} = transf1; +Line Loop (newll) = {source_lines[]}; +source_loop = newll-1; + +Ruled Surface (news) = {source_loop}; +source_surf = news-1; +Transfinite Surface {source_surf}; +Recombine Surface {source_surf}; + +vol1[] = Extrude { 0.0, 0.0, 1.0 } { Surface{source_surf}; }; + + +lines1[] = Boundary { Surface{ vol1[{0,2,3,4,5}] }; }; +Transfinite Line { lines1[] } = transf1; + +Transfinite Surface { vol1[{0,2:5}] }; +Recombine Surface { vol1[{0,2:5}] }; +Transfinite Volume { vol1[1] }; +Recombine Volume { vol1[1] }; + +// transfinite QuadTri volumes start here + +vol2[] = Extrude { 0.0, 0.0, -interface_width } { Surface{source_surf}; }; +lines2[] = Boundary { Surface{ vol2[{0,2,3,4,5}] }; }; +Transfinite Line { lines2[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol2[0]};} } = transf1; + +Transfinite Surface { vol2[{0,2:5}] }; +//Recombine Surface { vol2[{2:5}] }; +Transfinite Volume { vol2[1] }; +Recombine Volume { vol2[1] }; + +vol3[] = Extrude { 0.0, 0.0, interface_width } { Surface{vol1[0]}; }; +lines3[] = Boundary { Surface{ vol3[{0,2,3,4,5}] }; }; +Transfinite Line { lines3[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol3[0]};} } = transf1; + +Transfinite Surface { vol3[{0,2:5}] }; +//Recombine Surface { vol3[{2:5}] }; +Transfinite Volume { vol3[1] }; +Recombine Volume { vol3[1] }; + +vol4[] = Extrude { 0.0, -interface_width, 0.0 } { Surface{vol1[2]}; }; +lines4[] = Boundary { Surface{ vol4[{0,2,3,4,5}] }; }; +Transfinite Line { lines4[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol4[0]};} } = transf1; + +Transfinite Surface { vol4[{0,2:5}] }; +//Recombine Surface { vol4[{2:5}] }; +Transfinite Volume { vol4[1] }; +Recombine Volume { vol4[1] }; + +vol5[] = Extrude { 0.0, interface_width, 0.0 } { Surface{vol1[4]}; }; +lines5[] = Boundary { Surface{ vol5[{0,2,3,4,5}] }; }; +Transfinite Line { lines5[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol5[0]};} } = transf1; + +Transfinite Surface { vol5[{0,2:5}] }; +//Recombine Surface { vol5[{2:5}] }; +Transfinite Volume { vol5[1] }; +Recombine Volume { vol5[1] }; + +vol6[] = Extrude { interface_width, 0.0, 0.0 } { Surface{vol1[3]}; }; +lines6[] = Boundary { Surface{ vol6[{0,2,3,4,5}] }; }; +Transfinite Line { lines6[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol6[0]};} } = transf1; + +Transfinite Surface { vol6[{0,2:5}] }; +//Recombine Surface { vol6[{2:5}] }; +Transfinite Volume { vol6[1] }; +Recombine Volume { vol6[1] }; + +vol7[] = Extrude { -interface_width, 0.0, 0.0 } { Surface{vol1[5]}; }; +lines7[] = Boundary { Surface{ vol7[{0,2,3,4,5}] }; }; +Transfinite Line { lines7[] } = transf2; +// have to correct some of the previous tranfinite lines: +Transfinite Line { lines1[], Boundary{Surface{vol7[0]};} } = transf1; + +Transfinite Surface { vol7[{0,2:5}] }; +//Recombine Surface { vol7[{2:5}] }; +Transfinite Volume { vol7[1] }; +Recombine Volume { vol7[1] }; + +//Here is the application of Transfinite QuadTri +TransfQuadTri { vol2[1], vol3[1], vol4[1], vol5[1], vol6[1], vol7[1] }; + + +// outer volume +Point (newp) = {-(outer_length-length1)/2.0, -(outer_length-length1)/2.0, -(outer_length-length1)/2.0}; +Point (newp) = {(outer_length+length1)/2.0, -(outer_length-length1)/2.0, -(outer_length-length1)/2.0}; +Point (newp) = {(outer_length+length1)/2.0, (outer_length+length1)/2.0, -(outer_length-length1)/2.0}; +Point (newp) = {-(outer_length-length1)/2.0, (outer_length+length1)/2.0, -(outer_length-length1)/2.0}; + +outer_pts[] = {newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {outer_pts[0], outer_pts[1]}; +Line (newl) = {outer_pts[1], outer_pts[2]}; +Line (newl) = {outer_pts[2], outer_pts[3]}; +Line (newl) = {outer_pts[3], outer_pts[0]}; + +outer_source_lines[] = {newl-4, newl-3, newl-2, newl-1}; +Transfinite Line {outer_source_lines[]} = transf_outer; + +Line Loop (newll) = {outer_source_lines[]}; + +Ruled Surface (news) = {newll-1}; +outer_source = news-1; + +outer_vol[] = Extrude { 0.0, 0.0, outer_length } { Surface { outer_source }; }; +Delete { Volume {outer_vol[1]}; } +Transfinite Line { Boundary{ Surface{ outer_vol[{0,2:5}] }; } } = transf_outer; + +Surface Loop (newsl) = {outer_source, outer_vol[{0,2:5}]}; +outer_surf_loop = newsl-1; + +Surface Loop (newsl) = { vol2[{0,2:5}], vol3[{0,2:5}], vol4[{0,2:5}], vol5[{0,2:5}], vol6[{0,2:5}], + vol7[{0,2:5}] }; +inner_surf_loop = newsl-1; + +Volume (newv) = { outer_surf_loop, inner_surf_loop }; + +Characteristic Length { Boundary{ Line{ Boundary{ Surface{outer_vol[{0,2:5}] }; } }; } } = outer_length / transf_outer ; +Characteristic Length { Boundary{ Line{ Boundary{ Surface{vol1[{0,2:5}], vol2[{0,2:5}], vol3[{0,2:5}], vol4[{0,2:5}], + vol5[{0,2:5}], vol6[{0,2:5}], vol7[{0,2:5}] }; } }; } } = length1 / transf1 ; + diff --git a/benchmarks/extrude_quadtri/compound_extrude_annular_example.geo b/benchmarks/extrude_quadtri/compound_extrude_annular_example.geo new file mode 100644 index 0000000000..f05c7a39ec --- /dev/null +++ b/benchmarks/extrude_quadtri/compound_extrude_annular_example.geo @@ -0,0 +1,74 @@ +// an annulus in 4 parts to test extruding compound surface with a hole + + +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.AutoCoherence = 1; +Geometry.OldRuledSurface=1; + + +// center +Point (newp) = {0, 0, 0}; +circle_center = newp-1; + +//inner circle +Point (newp) = {1, 0, -.2}; +inner_point1 = newp-1; +Point (newp) = {-1, 0, 0}; +Point (newp) = {0, 1, 0 }; +Point (newp) = {0, -1, 0}; + + +//outer circle +Point (newp) = {2, 0, -.2}; +outer_point1 = newp-1; +Point (newp) = {-2, 0, 0}; +Point (newp) = {0, 2, 0 }; +Point (newp) = {0, -2, 0}; + +//inner circle lines +Circle (newl) = {inner_point1, circle_center, inner_point1+2}; +inner_line1 = newl-1; +Circle (newl) = {inner_point1+2, circle_center, inner_point1+1}; +Circle (newl) = {inner_point1+1, circle_center, inner_point1+3}; +Circle (newl) = {inner_point1+3, circle_center, inner_point1}; + +//outer circle lines +Circle (newl) = {outer_point1, circle_center, outer_point1+2}; +outer_line1 = newl-1; +Circle (newl) = {outer_point1+2, circle_center, outer_point1+1}; +Circle (newl) = {outer_point1+1, circle_center, outer_point1+3}; +Circle (newl) = {outer_point1+3, circle_center, outer_point1}; + +//cross lines +Line (newl) = {inner_point1, outer_point1}; +cross_line1 = newl-1; +Line (newl) = {inner_point1+2, outer_point1+2}; +Line (newl) = {inner_point1+1, outer_point1+1}; +Line (newl) = {inner_point1+3, outer_point1+3}; + + +// Transfinite Lines +Transfinite Line {outer_line1, outer_line1+1, outer_line1+2,outer_line1+3} = 10; +Transfinite Line {inner_line1, inner_line1+1, inner_line1+2,inner_line1+3} = 6; +Transfinite Line {cross_line1, cross_line1+1, cross_line1+2, cross_line1+3} = 5; + +// line loops and surfaces +Line Loop (newll) = {cross_line1, outer_line1, -(cross_line1+1), -inner_line1}; +lineloop1=newll-1; +Line Loop (newll) = {cross_line1+1, outer_line1+1, -(cross_line1+2), -(inner_line1+1)}; +Line Loop (newll) = {cross_line1+2, outer_line1+2, -(cross_line1+3), -(inner_line1+2)}; +Line Loop (newll) = {cross_line1+3, outer_line1+3, -cross_line1, -(inner_line1+3)}; +Ruled Surface (news) = lineloop1; +Ruled Surface (news) = lineloop1+1; +Ruled Surface (news) = lineloop1+2; +Ruled Surface (news) = lineloop1+3; +ind_surfaces = {news-3, news-4, news-2, news-1}; +Compound Surface (news) = {ind_surfaces[]}; +//Hide {Surface{ind_surfaces[]};} +Extrude {0, 0 , 1} {Surface{news-1}; Layers{{5},{1}};Recombine; } diff --git a/benchmarks/extrude_quadtri/compound_extrude_example.geo b/benchmarks/extrude_quadtri/compound_extrude_example.geo new file mode 100644 index 0000000000..bf39ba9ac0 --- /dev/null +++ b/benchmarks/extrude_quadtri/compound_extrude_example.geo @@ -0,0 +1,18 @@ +// Example of compoud surface extrusion from .msh file + +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Geometry.AutoCoherence = 1; +Geometry.OldRuledSurface=1; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; + +Merge "3sidedruled.stl"; + +CreateTopology; + +Compound Surface (news) = {1}; + +Hide {Surface{1};} + +Extrude { Surface{-(news-1)}; Layers{{1},{0.001}}; Recombine; } diff --git a/benchmarks/extrude_quadtri/compound_extrude_from_stl_example.geo b/benchmarks/extrude_quadtri/compound_extrude_from_stl_example.geo new file mode 100644 index 0000000000..bf39ba9ac0 --- /dev/null +++ b/benchmarks/extrude_quadtri/compound_extrude_from_stl_example.geo @@ -0,0 +1,18 @@ +// Example of compoud surface extrusion from .msh file + +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Geometry.AutoCoherence = 1; +Geometry.OldRuledSurface=1; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; + +Merge "3sidedruled.stl"; + +CreateTopology; + +Compound Surface (news) = {1}; + +Hide {Surface{1};} + +Extrude { Surface{-(news-1)}; Layers{{1},{0.001}}; Recombine; } diff --git a/benchmarks/extrude_quadtri/nico_torus.geo b/benchmarks/extrude_quadtri/nico_torus.geo new file mode 100644 index 0000000000..e5fcdd3ecb --- /dev/null +++ b/benchmarks/extrude_quadtri/nico_torus.geo @@ -0,0 +1,79 @@ +// This file was originally written by Nico Schloemer, +// Citation: http://geuz.org/pipermail/gmsh/2012/007576.html + +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.AutoCoherence = 1; +Geometry.OldRuledSurface=1; + +Function Torus + // Given a zshift and two radii irad and orad, and a zshift, this + // creates a torus parallel to the x-y-plane. + // The points: + tp1 = newp; + Point(tp1) = {0,orad,zshift,lcar}; + tp2 = newp; + Point(tp2) = {0,irad+orad,zshift,lcar}; + tp3 = newp; + Point(tp3) = {0,orad,zshift+irad,lcar}; + tp4 = newp; + Point(tp4) = {0,orad,zshift-irad,lcar}; + tp5 = newp; + Point(tp5) = {0,-irad+orad,zshift,lcar}; + // One cirle: + tc1 = newreg; + Circle(tc1) = {tp2,tp1,tp3}; + tc2 = newreg; + Circle(tc2) = {tp3,tp1,tp5}; + tc3 = newreg; + Circle(tc3) = {tp5,tp1,tp4}; + tc4 = newreg; + Circle(tc4) = {tp4,tp1,tp2}; + // The extrusion to the torus: + tll1 = newreg; + Line Loop(tll1) = {tc1,tc2,tc3,tc4}; + ts1 = newreg; + Plane Surface(ts1) = {tll1}; + // Gmsh cannot rotate beyond PI, so split the extrusion up in three parts. + ts2[] = Extrude {{0,0,1}, {0,0,0}, 2*Pi/3}{Surface{ts1};}; + ts3[] = Extrude {{0,0,1}, {0,0,0}, 2*Pi/3}{Surface{ts2[0]};}; + ts4[] = Extrude {{0,0,1}, {0,0,0}, 2*Pi/3}{Surface{ts3[0]};}; + + // Delete the unneeded entities. + Delete { + Volume{1}; + Volume{2}; + Volume{3}; + Surface{ts1}; + Surface{ts2[0]}; + Surface{ts3[0]}; + } + + // Define outer surface. + // We then store the surface loops identification numbers in a list + // for later reference (we will need these to define the final + // volume). + theloops[t] = newreg; + Surface Loop(theloops[t]) = {ts2[2], ts2[3], ts2[4], ts2[5], + ts3[2], ts3[3], ts3[4], ts3[5], + ts4[2], ts4[3], ts4[4], ts4[5]}; +// 71, ts4[3], ts4[4], ts4[5]}; + + thetorus = newreg; + Volume(thetorus) = {theloops[t]}; + + Physical Volume(Sprintf("coil %g", t)) = thetorus; +Return + +// Actual creation starts here. +t = 1; +lcar = 0.05; +orad = 0.5; +irad = 0.15; +zshift = 0.04; +Call Torus; \ No newline at end of file diff --git a/benchmarks/extrude_quadtri/quadtri_extruded_square_torus_interfaced_example.geo b/benchmarks/extrude_quadtri/quadtri_extruded_square_torus_interfaced_example.geo new file mode 100644 index 0000000000..2dcec7e609 --- /dev/null +++ b/benchmarks/extrude_quadtri/quadtri_extruded_square_torus_interfaced_example.geo @@ -0,0 +1,113 @@ +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.AutoCoherence = 1; + Geometry.OldRuledSurface=1; + + +r = .70; +a = .4; +b = 0.1; +big = 2.5; +big_transf = 12; + +Point (newp) = { r-a/2.0, -a/2, 0.0}; +Point (newp) = { r-a/2.0, a/2, 0.0}; +Point (newp) = { r+a/2.0, -a/2, 0.0}; +Point (newp) = { r+a/2.0, a/2, 0.0}; +Point (newp) = { r-a/2.0-b, -a/2-b, 0.0 }; +Point (newp) = { r-a/2.0-b, a/2+b, 0.0 }; +Point (newp) = { r+a/2.0+b, a/2+b, 0.0 }; +Point (newp) = { r+a/2.0+b, -a/2-b, 0.0 }; + +list_points[] = {newp-8, newp-7, newp-6, newp-5, newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {list_points[0], list_points[1]}; +Line (newl) = {list_points[1], list_points[3]}; +Line (newl) = {list_points[3], list_points[2]}; +Line (newl) = {list_points[2], list_points[0]}; + +Line (newl) = {list_points[4], list_points[5]}; +Line (newl) = {list_points[5], list_points[6]}; +Line (newl) = {list_points[6], list_points[7]}; +Line (newl) = {list_points[7], list_points[4]}; + + +list_lines_sq[] = {newl-8, newl-7, newl-6, newl-5}; +list_lines_outer[] = {newl-4, newl-3, newl-2, newl-1}; + + +Transfinite Line { list_lines_sq[], list_lines_outer[]} = 10; + +Line Loop (newll) = {list_lines_sq[]}; +Ruled Surface (news) = newll-1; +Transfinite Surface {news-1} = {1, 2, 4, 3}; +Recombine Surface {news-1}; +surf1 = news-1; + +Line Loop (newll) = {list_lines_outer[]}; +Ruled Surface (news) = {newll-1,-(newll-3)}; +//Transfinite Surface {news-1} = {1, 2, 4, 3}; +Recombine Surface {news-1}; +surf2 = news-1; + +Mesh.Smoothing = 100; + +first[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {surf1}; Layers{20}; Recombine; }; + +second[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {first[0]};Layers{20}; Recombine;}; + +third[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {second[0]};Layers{20}; Recombine;}; + +fourth[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {third[0]}; Layers{20}; Recombine; }; + + +outer_first[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {surf2}; Layers{20}; Recombine; QuadTriAddVerts;}; +quadtri_laterals[] += outer_first[{2:5}]; + +outer_second[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_first[0]};Layers{20}; Recombine;QuadTriAddVerts;}; +quadtri_laterals[] += outer_second[{2:5}]; + +outer_third[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_second[0]};Layers{20}; Recombine;QuadTriAddVerts;}; +quadtri_laterals[] += outer_third[{2:5}]; + +outer_fourth[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_third[0]}; Layers{20}; Recombine; QuadTriAddVerts;}; +quadtri_laterals[] += outer_fourth[{2:5}]; + + +//outer big unstructured volume +Point (newp) = {-big/2, -big/2, -big/2}; +Point (newp) = {big/2, -big/2, -big/2}; +Point (newp) = {big/2, big/2, -big/2}; +Point (newp) = {-big/2, big/2, -big/2}; +unstr_source_pts[] = { newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {unstr_source_pts[0], unstr_source_pts[1]}; +Line (newl) = {unstr_source_pts[1], unstr_source_pts[2]}; +Line (newl) = {unstr_source_pts[2], unstr_source_pts[3]}; +Line (newl) = {unstr_source_pts[3], unstr_source_pts[0]}; +unstr_source_lines[] = { newl-4, newl-3, newl-2, newl-1}; + +Line Loop (newll) = {unstr_source_lines[]}; + +Ruled Surface (news) = {newll-1}; +unstr_source = news-1; + +unstr_extr[] = Extrude {0.0, 0.0, big} { Surface{unstr_source}; }; + +Transfinite Line {Boundary{Boundary{Volume{unstr_extr[1]};}}} = big_transf; +Characteristic Length { Boundary{Boundary{Boundary{Volume{unstr_extr[1]};}}}} = .001; + +outer_big_bnd_surfs[] = Boundary{Volume{unstr_extr[1]};}; +Delete{ Volume{unstr_extr[1]};} + +Surface Loop (newsl) = {outer_big_bnd_surfs[]}; +Surface Loop (newsl) = {quadtri_laterals[]}; +Volume (newv) = { newsl-2, -(newsl-1) }; +unstr_vol = newv-1; + + diff --git a/benchmarks/extrude_quadtri/quadtri_square_torus_compound_interfaced.geo b/benchmarks/extrude_quadtri/quadtri_square_torus_compound_interfaced.geo new file mode 100644 index 0000000000..6819b69074 --- /dev/null +++ b/benchmarks/extrude_quadtri/quadtri_square_torus_compound_interfaced.geo @@ -0,0 +1,96 @@ +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.AutoCoherence = 1; + Geometry.OldRuledSurface=1; + + +r = .70; +a = .4; +b = 0.1; + +Point (newp) = { r-a/2.0, -a/2, 0.0}; +Point (newp) = { r-a/2.0, a/2, 0.0}; +Point (newp) = { r+a/2.0, a/2, 0.0}; +Point (newp) = { r+a/2.0, -a/2, 0.0}; +Point (newp) = { r-a/2.0-b, -a/2-b, 0.0 }; +Point (newp) = { r-a/2.0-b, a/2+b, 0.0 }; +Point (newp) = { r+a/2.0+b, a/2+b, 0.0 }; +Point (newp) = { r+a/2.0+b, -a/2-b, 0.0 }; + +list_points[] = {newp-8, newp-7, newp-6, newp-5, newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {list_points[0], list_points[1]}; +Line (newl) = {list_points[1], list_points[2]}; +Line (newl) = {list_points[2], list_points[3]}; +Line (newl) = {list_points[3], list_points[0]}; + +Line (newl) = {list_points[4], list_points[5]}; +Line (newl) = {list_points[5], list_points[6]}; +Line (newl) = {list_points[6], list_points[7]}; +Line (newl) = {list_points[7], list_points[4]}; + + +list_lines_sq[] = {newl-8, newl-7, newl-6, newl-5}; +list_lines_outer[] = {newl-4, newl-3, newl-2, newl-1}; + +Line (newl) = {list_points[0], list_points[4]}; +Line (newl) = {list_points[1], list_points[5]}; +Line (newl) = {list_points[2], list_points[6]}; +Line (newl) = {list_points[3], list_points[7]}; + +cross_lines[] = {newl-4, newl-3, newl-2, newl-1}; + +Transfinite Line { list_lines_sq[], list_lines_outer[]} = 10; +Transfinite Line { cross_lines[] } = 4; + +Line Loop (newll) = { list_lines_sq[] }; +Ruled Surface (news) = newll-1; +surf0 = news-1; +Transfinite Surface {news-1}; +Recombine Surface {news-1}; + +Line Loop (newll) = {list_lines_sq[0], cross_lines[1], -list_lines_outer[0], -cross_lines[0]}; +Ruled Surface (news) = newll-1; +surf1 = news-1; + +Line Loop (newll) = {list_lines_sq[1], cross_lines[2], -list_lines_outer[1], -cross_lines[1]}; +Ruled Surface (news) = newll-1; +surf2 = news-1; + +Line Loop (newll) = {list_lines_sq[2], cross_lines[3], -list_lines_outer[2], -cross_lines[2]}; +Ruled Surface (news) = newll-1; +surf3 = news-1; + +Line Loop (newll) = {list_lines_sq[3], cross_lines[0], -list_lines_outer[3], -cross_lines[3]}; +Ruled Surface (news) = newll-1; +surf4 = news-1; + + +Compound Surface (news) = {surf1, surf2, surf3, surf4} Boundary {{list_lines_outer[]},{list_lines_sq[]}}; +//Recombine Surface {news-1}; +surfc = news-1; +Hide {Surface {surf1, surf2, surf3, surf4};} +Mesh.Smoothing = 100; + + +first[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {surf0}; Layers{20}; Recombine;}; + +second[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {first[0]};Layers{20}; Recombine;}; + +third[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {second[0]};Layers{20}; Recombine;}; + +fourth[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {third[0]}; Layers{20}; Recombine;}; + + +outer_first[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {surfc}; Layers{20}; Recombine; QuadTriNoNewVerts;}; + +outer_second[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_first[0]};Layers{20}; Recombine; QuadTriNoNewVerts RecombLaterals;}; + +outer_third[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_second[0]};Layers{20}; Recombine; QuadTriAddVerts; }; + +outer_fourth[] = Extrude { {0, 1, 0}, {0, 0, 0}, Pi/2 }{ Surface {outer_third[0]}; Layers{20}; Recombine; QuadTriAddVerts RecombLaterals;}; diff --git a/benchmarks/extrude_quadtri/scaledBoundaryLayerTest.geo b/benchmarks/extrude_quadtri/scaledBoundaryLayerTest.geo new file mode 100644 index 0000000000..a1181e8c52 --- /dev/null +++ b/benchmarks/extrude_quadtri/scaledBoundaryLayerTest.geo @@ -0,0 +1,61 @@ +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.RecombinationAlgorithm = 0; +Mesh.RemeshAlgorithm = 1; +Mesh.Algorithm=6; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +Geometry.AutoCoherence = 1; +Geometry.OldRuledSurface=1; + + +curve_radius = .50; + +Point(newp) = { 0.0, 0.0, 0.0}; +Point(newp) = { 1.0, 0.0, 0.20}; +Point(newp) = { 2.0, 0.0, 0.0}; +Point(newp) = { 1.0, 1.0, 0.20}; +Point(newp) = { 2.0, 1.0, 0.0}; +Point(newp) = { 0.0, 1.0, 0.0}; + +Point(newp) = { 1.0, 0.5, -curve_radius}; + +Line (newl) = { 1, 2 }; +Line (newl) = { 2, 3 }; +Circle (newl) = { 2, 7, 4 }; +Line (newl) = { 4, 6 }; +Line (newl) = { 5, 4 }; +Line (newl) = { 3, 5 }; +Line (newl) = { 6, 1 }; + +Transfinite Line { 3 } = 20; +Transfinite Line { 1 } = 10 Using Progression 0.8; +Transfinite Line { 2 } = 10 Using Progression 1/.8; +Transfinite Line { 4, 5, 6, 7 } = 10; + +Line Loop (newll) = {1, 3,4,7}; +Line Loop (newll) = {2, 6, 5,-3}; + +Ruled Surface (news) = { 8 }; +Ruled Surface (news) = { 9 }; +Recombine Surface {news-2, news-1}; + +Extrude { Surface { 10}; Layers{{1,1},{0.05,1.2}}; Recombine; Using Index[0]; ScaleLastLayer; QuadTriAddVerts;} +Extrude { Surface { 11}; Layers{{1,1},{0.05,1.2}}; Recombine; Using Index[0]; ScaleLastLayer; QuadTriAddVerts;} + + +// A third surface to show that when not connected to the previous two surfaces, a surface in the same boundary layer +// can be meshed normally without ScaleLastLayer and still be valid. +Point (newp) = { -1, 0, 0 }; +Point (newp) = { -1, 1 ,0}; +Point (newp) = { -2, 1, 0}; +Point (newp) = { -2, 0, 0}; +Line (newl) = { newp-4, newp-3}; +Line (newl) = { newp-3, newp-2}; +Line (newl) = { newp-2, newp-1}; +Line (newl) = { newp-1, newp-4}; + +Line Loop (newll) = {newl-4, newl-3, newl-2, newl-1}; +Ruled Surface (news) = newll-1; + +Extrude { Surface { news-1}; Layers{{1},{.5}}; Recombine; Using Index[0];QuadTriNoNewVerts RecombLaterals;} diff --git a/benchmarks/extrude_quadtri/tunnel_test.geo b/benchmarks/extrude_quadtri/tunnel_test.geo new file mode 100644 index 0000000000..7287c31a73 --- /dev/null +++ b/benchmarks/extrude_quadtri/tunnel_test.geo @@ -0,0 +1,169 @@ + +/*********************************************** + * * + * tunnel_test.geo * + * by Trevor Strickler * + * <trevor.strickler.gmail.com> * + * * + ***********************************************/ + +//set options +Geometry.Surfaces=1; +Mesh.SurfaceFaces=1; +Mesh.Algorithm=5; // mesh algorithm +Mesh.Algorithm3D=4; // mesh algorithm +General.InitialModule=2; //start in Mesh mode. +pi=Pi; + + +// geometric parameters +width = 1.0; +height = 1.0; +length = 3.0; +patch_width = 0.3; +patch_length = 0.3; +patch_height = height - 0.3; + +num_trans_face_1 = 10; +num_trans_length = 20; +num_trans_patch = 5; + +Point (newp) = { -width / 2.0, -height / 2.0, 0.0 }; +Point (newp) = { width / 2.0, -height / 2.0, 0.0 }; +Point (newp) = { width / 2.0, height / 2.0, 0.0 }; +Point (newp) = { -width / 2.0, height / 2.0, 0.0 }; + +face_1_corners[] = {newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {face_1_corners[0], face_1_corners[1]}; +Line (newl) = {face_1_corners[1], face_1_corners[2]}; +Line (newl) = {face_1_corners[2], face_1_corners[3]}; +Line (newl) = {face_1_corners[3], face_1_corners[0]}; + +face_1_lines[] = {newl-4, newl-3, newl-2, newl-1}; +Transfinite Line {face_1_lines[]} = num_trans_face_1; + +Line Loop (newll) = {face_1_lines[]}; +face_1_line_loop = newll-1; + +Plane Surface (news) = face_1_line_loop; +face_1_surface = news-1; +Transfinite Surface (face_1_surface) Left; + +Recombine Surface (face_1_surface); + +extrude_1[] = Extrude { 0.0, 0.0, -0.3 } { Surface{ face_1_surface }; Layers{3}; QuadTriAddVerts RecombLaterals; Recombine; }; + +top_lines_extr_1[] = Boundary{ Surface{ extrude_1[0] }; }; + +top_points_extr_1[] += Boundary{ Line{ top_lines_extr_1[0] }; }; +top_points_extr_1[] += Boundary{ Line{ top_lines_extr_1[1] }; }; +top_points_extr_1[] += Boundary{ Line{ top_lines_extr_1[2] }; }; +top_points_extr_1[] += Boundary{ Line{ top_lines_extr_1[3] }; }; + +Characteristic Length {top_points_extr_1[]} = length / (6 + num_trans_length); + +Point (newp) = { -width / 2, -height / 2, -length }; +Point (newp) = { width / 2, -height / 2, -length }; +Point (newp) = { width / 2, height / 2, -length }; +Point (newp) = { -width / 2, height / 2, -length }; + +face_2_corners[] = {newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {face_2_corners[0], face_2_corners[1]}; +Line (newl) = {face_2_corners[1], face_2_corners[2]}; +Line (newl) = {face_2_corners[2], face_2_corners[3]}; +Line (newl) = {face_2_corners[3], face_2_corners[0]}; + +face_2_lines[] = {newl-4, newl-3, newl-2, newl-1}; + +Transfinite Line {face_2_lines[]} = num_trans_face_1; + +Line Loop (newll) = {face_2_lines[]}; +face_2_line_loop = newll-1; + +Plane Surface (news) = face_2_line_loop; +face_2_surface = news-1; +Transfinite Surface (face_2_surface) Left; + +Recombine Surface (face_2_surface); + +extrude_2[] = Extrude { 0.0, 0.0, 0.3 } { Surface{ face_2_surface }; Layers{3}; QuadTriAddVerts RecombLaterals; Recombine;}; + +top_lines_extr_2[] = Boundary{ Surface{ extrude_2[0] }; }; + +top_points_extr_2[] += Boundary{ Line{ top_lines_extr_2[0] }; }; +top_points_extr_2[] += Boundary{ Line{ top_lines_extr_2[1] }; }; +top_points_extr_2[] += Boundary{ Line{ top_lines_extr_2[2] }; }; +top_points_extr_2[] += Boundary{ Line{ top_lines_extr_2[3] }; }; + +Characteristic Length {top_points_extr_2[]} = length / (6 + num_trans_length); + +Line (newl) = {top_points_extr_1[0], top_points_extr_2[0]}; +Line (newl) = {top_points_extr_1[1], top_points_extr_2[1]}; +Line (newl) = {top_points_extr_1[3], top_points_extr_2[3]}; +Line (newl) = {14, 28}; + +length_lines[] = {newl-4, newl-3, newl-2, newl-1}; +Transfinite Line { length_lines[] } = num_trans_length; + +// create the little square patch at bottom lateral surface +Point (newp) = {-patch_width / 2.0, -height / 2.0, -length / 2.0 + patch_length / 2.0 }; +Point (newp) = { patch_width / 2.0, -height / 2.0, -length / 2.0 + patch_length / 2.0 }; +Point (newp) = { patch_width / 2.0, -height / 2.0, -length / 2.0 - patch_length / 2.0 }; +Point (newp) = {-patch_width / 2.0, -height / 2.0, -length / 2.0 - patch_length / 2.0 }; + +patch_points[] = {newp-4, newp-3, newp-2, newp-1}; + +Line (newl) = {patch_points[0], patch_points[1]}; +Line (newl) = {patch_points[1], patch_points[2]}; +Line (newl) = {patch_points[2], patch_points[3]}; +Line (newl) = {patch_points[3], patch_points[0]}; + +patch_lines[] = {newl-4, newl-3, newl-2, newl-1}; + +Transfinite Line {patch_lines[]} = num_trans_patch; + +Line Loop (newll) = {patch_lines[]}; +patch_loop = newll-1; +Plane Surface (news) = patch_loop; +patch_surface = news-1; +Transfinite Surface (patch_surface); +Recombine Surface patch_surface; + +extrude_patch[] = Extrude { 0.0, patch_height, 0.0 } { Surface { patch_surface }; + Layers{ {1,2,2,2,1}, {0.125, 0.375, 0.625, 0.875, 1.0}}; + QuadTriAddVerts; Recombine; }; + +//now mesh surfaces along length + +Line Loop (newll) = {length_lines[0], top_lines_extr_2[0], -length_lines[1], -top_lines_extr_1[0]}; +Line Loop (newll) = {length_lines[1], top_lines_extr_2[1], -length_lines[2], -top_lines_extr_1[1]}; +Line Loop (newll) = {length_lines[2], top_lines_extr_2[2], -length_lines[3], -top_lines_extr_1[2]}; +Line Loop (newll) = {length_lines[3], top_lines_extr_2[3], -length_lines[0], -top_lines_extr_1[3]}; + +length_loops[] = {newll-4, newll-3, newll-2, newll-1}; + +Plane Surface (news) = {length_loops[0], patch_loop}; +Plane Surface (news) = length_loops[1]; +Plane Surface (news) = length_loops[2]; +Plane Surface (news) = length_loops[3]; + +lateral_surfaces[] = { news-4, news-3, news-2, news-1 }; +Transfinite Surface { news-3, news-2, news-1}; + +// Create volume ( a little messy ) + +Surface Loop (newsl) = { -lateral_surfaces[], extrude_1[0], extrude_2[0], extrude_patch[{0,2:5}] }; + +//Volume (newv) = newsl-1; +//volume = newv-1; + +// create physicals +Physical Surface ("inlet") = {face_1_surface}; +Physical Surface ("outlet") = {face_2_surface}; +Physical Surface ("laterals") = { lateral_surfaces[], extrude_1[{2:5}], extrude_2[{2:5}], patch_surface }; +Physical Volume ("volume") = {extrude_1[1], extrude_2[1], extrude_patch[1]}; + +Mesh.CharacteristicLengthMax = length / (8+num_trans_length); + -- GitLab