ROOT logo
// $Id: GTSurf.cxx 2530 2011-09-27 19:32:01Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "GTSurf.h"
#include <Glasses/LegendreCoefs.h>
#include "GTSurf.c7"

#include <GTS/GTS.h>
#include <GTS/GTSBoolOpHelper.h>

#include <TMath.h>
#include <TRandom3.h>
#include <TTree.h>

namespace { using namespace GTS; }

//______________________________________________________________________________
//
// Wrapper over GTS surface.


ClassImp(GTSurf);

void GTSurf::_init()
{
  // Override settings from ZGlass
  bUseDispList = true;

  mColor.rgba(1, 1, 1, 1);
  mPointColor.rgba(1, 0, 0, 1);
  bRnrPoints = false;

  pSurf = 0;
  mVerts = mEdges = mFaces = 0;

  mPostBoolOp = PBM_AsFractions;
  mPostBoolArea      = 1e-8;
  mPostBoolPerimeter = 1e-8;
  mPostBoolLength    = 1e-1;
}

/**************************************************************************/

void GTSurf::ReplaceSurface(GTS::GtsSurface* new_surf)
{
  using namespace GTS;

  GLensReadHolder _lck(this);
  if (pSurf)
  {
    gts_object_destroy(GTS_OBJECT(pSurf));
  }
  pSurf = new_surf;
  mStampReqTring = Stamp(FID());
}

GTS::GtsSurface* GTSurf::CopySurface()
{
  GLensReadHolder _lck(this);

  if (pSurf == 0) return 0;

  GTS::GtsSurface* s = GTS::MakeDefaultSurface();
  GTS::gts_surface_copy(s, pSurf);

  return s;
}

GTS::GtsSurface* GTSurf::DisownSurface()
{
  GLensReadHolder _lck(this);

  GTS::GtsSurface* s = pSurf;
  pSurf = 0;
  mStampReqTring = Stamp(FID());

  return s;
}


//==============================================================================

namespace
{
  struct projected_area_sum_arg
  {
    HPointD dir;
    double  sum;

    projected_area_sum_arg(double x, double y, double z) : dir(x,y,z), sum(0) {}
  };

  void projected_area_sum(GtsFace* f, projected_area_sum_arg* arg)
  {
    // This is summing *twice* the area of each triangle.

    HPointD p;
    gts_triangle_normal(&f->triangle, &p.x, &p.y, &p.z);
    arg->sum += TMath::Abs(arg->dir.Dot(p));
  }
}

Double_t GTSurf::GetArea() const
{
  if (!pSurf) return 0;
  return gts_surface_area(pSurf);
}

Double_t GTSurf::GetXYArea() const
{
  if (!pSurf) return 0;

  projected_area_sum_arg arg(0, 0, 1);
  gts_surface_foreach_face(pSurf, (GtsFunc) projected_area_sum, &arg);
  return arg.sum / 4;
}

Double_t GTSurf::GetVolume() const
{
  if (!pSurf) return 0;
  return gts_surface_volume(pSurf);
}


//==============================================================================

void GTSurf::Load(const TString& file)
{
  static const Exc_t _eh("GTSurf::Load ");

  using namespace GTS;

  TString file_name = file.IsNull() ? mFile : file;

  FILE* fp = fopen(file_name, "r");
  if (!fp)
  {
    ISerr(_eh + GForm("Can not open file '%s'", file_name.Data()));
    return;
  }

  GtsSurface *s   = MakeDefaultSurface();
  GtsFile    *gsf = gts_file_new(fp);
  if (gts_surface_read(s, gsf) != 0)
  {
    ISerr(_eh + GForm("gts_surface_read failed."));
    gts_object_destroy(GTS_OBJECT(s));
    gts_file_destroy(gsf);
    fclose(fp);
    return;
  }
  gts_file_destroy(gsf);
  fclose(fp);

  ReplaceSurface(s);
}

void GTSurf::Save(const TString& file)
{
  static const Exc_t _eh("GTSurf::Save ");

  using namespace GTS;

  if (pSurf == 0) {
    ISerr(_eh + "Surface is null.");
    return;
  }

  TString file_name = file.IsNull() ? mFile : file;

  FILE* fp = fopen(file_name, "w");
  if (!fp) {
    ISerr(_eh + GForm("Can not open file '%s'.", file_name.Data()));
    return;
  }
  gts_surface_write(pSurf, fp);
  fclose(fp);
}


//==============================================================================

namespace
{
  void copy_stats(SRange& d, GTS::GtsRange& s)
  {
    d.SetMin(s.min);  d.SetMax(s.max);
    d.SetSumX(s.sum); d.SetSumX2(s.sum2);
    d.SetN(s.n);
  }
}

void GTSurf::CalcStats()
{
  using namespace GTS;

  if (pSurf == 0) return;

  mVerts = gts_surface_vertex_number(pSurf);
  mEdges = gts_surface_edge_number(pSurf);
  mFaces = gts_surface_face_number(pSurf);

  GtsSurfaceQualityStats stats;
  gts_surface_quality_stats(pSurf, &stats);
  copy_stats(mFaceQuality, stats.face_quality);
  copy_stats(mFaceArea,    stats.face_area);
  copy_stats(mEdgeLength,  stats.edge_length);
  copy_stats(mEdgeAngle,   stats.edge_angle);

  Stamp(FID());
}

void GTSurf::PrintStats()
{
  if (pSurf) {
    GTS::gts_surface_print_stats(pSurf, stdout);
  }
}

/**************************************************************************/

void GTSurf::Destroy()
{
  using namespace GTS;

  if (pSurf == 0) return;

  gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = 0;
  mStampReqTring = Stamp(FID());
}

void GTSurf::Invert()
{
  using namespace GTS;

  if (pSurf) 
  {
    InvertSurface(pSurf);
    mStampReqTring = Stamp(FID());
  }
}

/**************************************************************************/

namespace
{
  void vertex_scaler(GtsVertex* v, Double_t* s)
  {
    v->p.x *= s[0]; v->p.y *= s[1]; v->p.z *= s[2];
  }
}

void GTSurf::Rescale(Double_t s)
{
  using namespace GTS;

  if (pSurf)
  {
    Double_t sxyz[3] = { s, s, s };
    gts_surface_foreach_vertex(pSurf, (GtsFunc)vertex_scaler, &sxyz);
    mStampReqTring = Stamp(FID());
  }
}

void GTSurf::RescaleXYZ(Double_t sx, Double_t sy, Double_t sz)
{
  using namespace GTS;

  if (pSurf)
  {
    Double_t sxyz[3] = { sx, sy, sz };
    gts_surface_foreach_vertex(pSurf, (GtsFunc)vertex_scaler, &sxyz);
    mStampReqTring = Stamp(FID());
  }
}

void GTSurf::TransformAndResetTrans()
{
  if (pSurf)
    GTS::TransformSurfaceVertices(pSurf, &mTrans);
  UnitTrans();
}

void GTSurf::RotateAndResetRot()
{
  if (pSurf)
    GTS::RotateSurfaceVertices(pSurf, &mTrans);
  UnitRot();
}


//==============================================================================

namespace
{
  GtsVertex* mid_edge_splitter(GtsEdge *e, GtsVertexClass *k, gpointer /*d*/)
  {
    GtsPoint &a = e->segment.v1->p, &b = e->segment.v2->p;
    return gts_vertex_new(k, a.x + 0.5*(b.x - a.x),
			  a.y + 0.5*(b.y - a.y),
			  a.z + 0.5*(b.z - a.z));
  }
}

void GTSurf::Tessellate(UInt_t order, Bool_t mid_edge)
{
  if (pSurf == 0) return;

  while (order--)
  {
    gts_surface_tessellate(pSurf, mid_edge ? mid_edge_splitter : 0, 0);
  }
  mStampReqTring = Stamp(FID());
}

//==============================================================================

void GTSurf::Merge(GTSurf* a, GTSurf* b)
{
  // Merge surfaces a and b into current surface.
  // a or b can be null.
  // Vertices of a and b are transformed into local coordinate system.

  static const Exc_t _eh("GTSurf::Merge ");

  GTS::BoolOpHelper boh(this, a, b, _eh);
  boh.MakeMerge();
  ReplaceSurface(boh.TakeResult());
}

void GTSurf::Union(GTSurf* a, GTSurf* b)
{
  // Merge union of a and b into this surface.
  // Vertices of a and b are transformed into local coordinate system.

  static const Exc_t _eh("GTSurf::Union ");

  GTS::BoolOpHelper boh(this, a, b, _eh);
  boh.BuildInter(_eh);
  boh.MakeUnion();
  ReplaceSurface(boh.TakeResult());
}

void GTSurf::Intersection(GTSurf* a, GTSurf* b)
{
  // Merge intersection of a and b into this surface.
  // Vertices of a and b are transformed into local coordinate system.

  static const Exc_t _eh("GTSurf::Intersection ");

  GTS::BoolOpHelper boh(this, a, b, _eh);
  boh.BuildInter(_eh);
  boh.MakeIntersection();
  ReplaceSurface(boh.TakeResult());
}

void GTSurf::Difference(GTSurf* a, GTSurf* b)
{
  // Merge difference of a and b into this surface.
  // Vertices of a and b are transformed into local coordinate system.

  static const Exc_t _eh("GTSurf::Difference ");

  GTS::BoolOpHelper boh(this, a, b, _eh);
  boh.BuildInter(_eh);
  boh.MakeDifference();
  ReplaceSurface(boh.TakeResult());
}

//==============================================================================

void GTSurf::GenerateSphere(UInt_t order)
{
  if (pSurf)
    gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = MakeDefaultSurface();

  gts_surface_generate_sphere(pSurf, order);

  mStampReqTring = Stamp(FID());
}

void GTSurf::GenerateTriangle(Double_t s)
{
  if (pSurf)
    gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = MakeDefaultSurface();

  const Double_t sqrt3 = TMath::Sqrt(3);
  GtsVertex * v[3];
  v[0] = gts_vertex_new(pSurf->vertex_class, -s*0.5, -s*sqrt3/6, 0);
  v[1] = gts_vertex_new(pSurf->vertex_class,  s*0.5, -s*sqrt3/6, 0);
  v[2] = gts_vertex_new(pSurf->vertex_class,  0,      s*sqrt3/3, 0);

  GtsEdge * e[3];
  e[0] = gts_edge_new(pSurf->edge_class, v[0], v[1]);
  e[1] = gts_edge_new(pSurf->edge_class, v[1], v[2]);
  e[2] = gts_edge_new(pSurf->edge_class, v[2], v[0]);

  GtsFace * f = gts_face_new(pSurf->face_class, e[0], e[1], e[2]);
  gts_surface_add_face(pSurf, f);

  mStampReqTring = Stamp(FID());
}

namespace
{
  void lcme_filler(GTS::GtsVertex* v, LegendreCoefs::MultiEval* me)
  {
    me->AddPoint(v->p.x, v->p.y, v->p.z, v);
  }
}

void GTSurf::GenerateSphereThetaConst(UInt_t order)
{
  if (pSurf)
    gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = MakeDefaultSurface();

  gts_surface_generate_sphere(pSurf, 1);
  Double_t quater_len = 1.051462 / 4;

  for (UInt_t cgo = 1; cgo < order; ++cgo)
  {
    gts_surface_tessellate(pSurf, 0, 0);

    LegendreCoefs::MultiEval me;
    me.Init(gts_surface_vertex_number(pSurf));
    gts_surface_foreach_vertex(pSurf, (GtsFunc) lcme_filler, &me);
    me.Sort();

    quater_len *= 0.5;

    Double_t dtheta_max = 2.0 * TMath::ATan(quater_len);
    Double_t theta0 = TMath::ACos(me.fMVec[me.fIdcs[0]]);
    Double_t z_sum  = me.fMVec[me.fIdcs[0]];
    Int_t    i0 = 0, i = 1;

    while (i < me.fN)
    {
      Int_t    ii    = me.fIdcs[i];
      Double_t theta = TMath::ACos(me.fMVec[ii]);
      if (i + 1 >= me.fN) ++i;
      if (theta > theta0 + dtheta_max || i >= me.fN)
      {
	if (i - i0 > 1)
	{
	  Double_t z = z_sum / (i - i0);
	  for (Int_t j = i0; j < i; ++j)
	  {
	    Int_t jj = me.fIdcs[j];
	    GTS::GtsVertex *v = (GTS::GtsVertex*) me.fUserData[jj];
	    v->p.z = me.fPhis[jj] > 0 ? z : -z;
	    Double_t fac = v->p.x*v->p.x + v->p.y*v->p.y;
	    if (fac > 1e-18)
	    {
	      fac = sqrt((1.0 - z*z) / fac);
	      v->p.x *= fac;
	      v->p.y *= fac;
	    }
	    else
	    {
	      v->p.z = v->p.z > 0 ? 1.0 : -1.0;
	    }
	  }
	}
	theta0 = theta;
	z_sum  = me.fMVec[ii];
	i0     = i;
      }
      else
      {
	z_sum += me.fMVec[ii];
      }
      ++i;
    }
  }

  mStampReqTring = Stamp(FID());
}


//==============================================================================
// Legendrification
//==============================================================================

namespace
{
  void legendre_vertex_adder(GTS::GtsVertex* v, LegendreCoefs::Evaluator* e)
  {
    HPointD  vec(v->p.x, v->p.y, v->p.z);
    vec *= 1.0 + e->Eval(vec) / vec.Mag();
    v->p.x = vec.x; v->p.y = vec.y; v->p.z = vec.z;
  }

  void legendre_vertex_scaler(GTS::GtsVertex* v, LegendreCoefs::Evaluator* e)
  {
    HPointD  vec(v->p.x, v->p.y, v->p.z);
    vec *= 1.0 + e->Eval(vec);
    v->p.x = vec.x; v->p.y = vec.y; v->p.z = vec.z;
  }
}

void GTSurf::LegendrofyAdd(LegendreCoefs* lc, Double_t scale, Int_t l_max)
{
  static const Exc_t _eh("GTSurf::LegendrofyAdd ");

  if (pSurf == 0) throw _eh + "member pSurf is 0.";
  if (lc    == 0) throw _eh + "argument lc is 0.";

  LegendreCoefs::Evaluator eval(lc, scale, l_max);

  GTS::gts_surface_foreach_vertex(pSurf,
				  (GTS::GtsFunc) legendre_vertex_adder,
				  &eval);

  mStampReqTring = Stamp(FID());
}

void GTSurf::LegendrofyScale(LegendreCoefs* lc, Double_t scale, Int_t l_max)
{
  static const Exc_t _eh("GTSurf::LegendrofyScale ");

  if (pSurf == 0) throw _eh + "member pSurf is 0.";
  if (lc    == 0) throw _eh + "argument lc is 0.";

  LegendreCoefs::Evaluator eval(lc, scale, l_max);

  GTS::gts_surface_foreach_vertex(pSurf,
				  (GTS::GtsFunc) legendre_vertex_scaler,
				  &eval);

  mStampReqTring = Stamp(FID());
}

void GTSurf::LegendrofyScaleRandom(Int_t l_max, Double_t abs_scale, Double_t pow_scale)
{
  // Single-shopping wrapper -- creates a dummy LegendreCoefs lens without
  // enlightening it.

  static const Exc_t _eh("GTSurf::LegendrofyScaleRandom ");

  if (pSurf == 0) throw _eh + "member pSurf is 0.";

  auto_ptr<LegendreCoefs> lc(new LegendreCoefs);
  lc->InitRandom(l_max, abs_scale, pow_scale);
  lc->SetCoef(0, 0, 0);

  LegendreCoefs::Evaluator eval(lc.get());

  GTS::gts_surface_foreach_vertex(pSurf,
				  (GTS::GtsFunc) legendre_vertex_scaler,
				  &eval);

  mStampReqTring = Stamp(FID());
}

//------------------------------------------------------------------------------
// Legendrification, the Multi way
//------------------------------------------------------------------------------

void GTSurf::legendrofy_multi_common(LegendreCoefs* lc, LegendreCoefs::MultiEval& me, const Exc_t eh)
{
  if (pSurf == 0) throw eh + "member pSurf is 0.";
  if (lc    == 0) throw eh + "argument lc is 0.";

  me.Init(gts_surface_vertex_number(pSurf));
  gts_surface_foreach_vertex(pSurf, (GtsFunc) lcme_filler, &me);
  me.Sort();
}

void GTSurf::LegendrofyAddMulti(LegendreCoefs* lc, Double_t scale, Int_t l_max)
{
  static const Exc_t _eh("GTSurf::LegendrofyAddMulti ");

  LegendreCoefs::MultiEval me;

  legendrofy_multi_common(lc, me, _eh);

  lc->EvalMulti(me, l_max);

  for (Int_t i = 0; i < me.fN; ++i)
  {
    GTS::GtsVertex *v = (GTS::GtsVertex*) me.fUserData[i];
    HPointD  vec(v->p.x, v->p.y, v->p.z);
    vec *= 1.0 + scale * me.fMVec[i] / vec.Mag();
    v->p.x = vec.x; v->p.y = vec.y; v->p.z = vec.z;
  }

  mStampReqTring = Stamp(FID());
}

void GTSurf::LegendrofyScaleMulti(LegendreCoefs* lc, Double_t scale, Int_t l_max)
{
  static const Exc_t _eh("GTSurf::LegendrofyScaleMulti ");

  LegendreCoefs::MultiEval me;

  legendrofy_multi_common(lc, me, _eh);

  lc->EvalMulti(me, l_max);

  for (Int_t i = 0; i < me.fN; ++i)
  {
    GTS::GtsVertex *v = (GTS::GtsVertex*) me.fUserData[i];
    HPointD  vec(v->p.x, v->p.y, v->p.z);
    vec *= 1.0 + scale * me.fMVec[i];
    v->p.x = vec.x; v->p.y = vec.y; v->p.z = vec.z;
  }

  mStampReqTring = Stamp(FID());
}

void GTSurf::LegendrofyScaleRandomMulti(Int_t l_max, Double_t abs_scale, Double_t pow_scale)
{
  static const Exc_t _eh("GTSurf::LegendrofyRandomMulti ");

  auto_ptr<LegendreCoefs> lc(new LegendreCoefs);
  lc->InitRandom(l_max, abs_scale, pow_scale);
  lc->SetCoef(0, 0, 0);

  LegendreCoefs::MultiEval me;

  legendrofy_multi_common(lc.get(), me, _eh);

  lc->EvalMulti(me, l_max);

  for (Int_t i = 0; i < me.fN; ++i)
  {
    GTS::GtsVertex *v = (GTS::GtsVertex*) me.fUserData[i];
    const Double_t fac = 1.0 + me.fMVec[i];
    v->p.x *= fac; v->p.y *= fac; v->p.z *= fac;
  }

  mStampReqTring = Stamp(FID());
}


//==============================================================================
// Triangle exporter
//==============================================================================

namespace
{
  struct extring_arg
  {
    map<GtsVertex*, int> m_map;
    int                  m_count;
    FILE*                m_out;

    extring_arg() : m_count(0), m_out(0) {}
  };

  void trivi_vdump(GtsVertex* v, extring_arg* arg)
  {
    arg->m_map[v] = arg->m_count;
    ++arg->m_count;
    fprintf(arg->m_out, "%lf %lf %lf\n", v->p.x, v->p.y, v->p.z);
  }

  void trivi_fdump(GtsFace* f, extring_arg* arg)
  {
    GtsVertex *a, *b, *c;
    gts_triangle_vertices(&f->triangle, &a, &b, &c);
    fprintf(arg->m_out, "%d %d %d\n", arg->m_map[a], arg->m_map[b], arg->m_map[c]);
  }
}

void GTSurf::ExportTring(const Text_t* fname)
{
  // Dumps vertices/triangles in a trivial format.

  using namespace GTS;

  if (pSurf == 0) return;

  FILE* f = (fname) ? fopen(fname, "w") : stdout;

  fprintf(f, "%u %u\n", gts_surface_vertex_number(pSurf),
                        gts_surface_face_number(pSurf));

  extring_arg arg;
  arg.m_out = f;

  gts_surface_foreach_vertex(pSurf, (GtsFunc) trivi_vdump, &arg);
  gts_surface_foreach_face  (pSurf, (GtsFunc) trivi_fdump, &arg);

  if (fname) fclose(f);
}


//==============================================================================
// Making of split surfaces
//==============================================================================

namespace
{
  void vertex_min_z_fixer(GTS::GtsVertex* v, Double_t* min_z)
  {
    if (v->p.z < *min_z) v->p.z = *min_z;
  }

  void vertex_max_z_fixer(GTS::GtsVertex* v, Double_t* max_z)
  {
    if (v->p.z > *max_z) v->p.z = *max_z;
  }

}

void GTSurf::MakeZSplitSurfaces(Double_t z_split, const TString& stem, Bool_t save_p)
{
  static const Exc_t _eh("GTSurf::SaveZSplitSurfaces ");

  using namespace GTS;

  GtsSurface *sup = 0, *sdn = 0;

  {
    GLensReadHolder _rdlck(this);

    if (!pSurf)
      throw _eh + "Surface is null.";

    sup = CopySurface();
    sdn = CopySurface();
  }

  gts_surface_foreach_vertex(sup, (GtsFunc) vertex_min_z_fixer, &z_split);
  gts_surface_foreach_vertex(sdn, (GtsFunc) vertex_max_z_fixer, &z_split);

  GTSurf *gsup = new GTSurf(GForm("Upper %s", GetName()));
  gsup->ReplaceSurface(sup);
  gsup->SetFile(GForm("%s-upper.gts", stem.Data()));

  GTSurf *gsdn = new GTSurf(GForm("Lower %s", GetName()));
  gsdn->ReplaceSurface(sdn);
  gsdn->SetFile(GForm("%s-lower.gts", stem.Data()));

  {
    GLensWriteHolder _wrlck(this);

    mQueen->CheckIn(gsup);
    mQueen->CheckIn(gsdn);

    Add(gsup);
    Add(gsdn);
  }

  if (save_p)
  {
    { GLensReadHolder _rdlck(gsup); gsup->Save(); }
    { GLensReadHolder _rdlck(gsdn); gsdn->Save(); }
  }
}

//==============================================================================

namespace
{
  struct ct_ud
  {
    TTree    *t;
    HPointD  *p;
    ct_ud() : t(0), p(0) {}
  };

  void ct_filler(GTS::GtsVertex* v, ct_ud* ud)
  {
    ud->p->Set(v->p.x, v->p.y, v->p.z);
    ud->t->Fill();
  }
}

TTree* GTSurf::MakeHPointDTree(const TString& name, const TString& title)
{
  if (pSurf == 0) return 0;

  ct_ud ud;

  TTree *t = new TTree(name, title);
  t->SetDirectory(0);

  ud.t = t;
  t->Branch("P", &ud.p);

  gts_surface_foreach_vertex(pSurf, (GtsFunc) ct_filler, &ud);

  return ud.t;
}

TTree* GTSurf::MakeMultiEvalTree(const TString& name, const TString& title)
{
  if (pSurf == 0) return 0;

  LegendreCoefs::MultiEval me;
  me.Init(gts_surface_vertex_number(pSurf));
  gts_surface_foreach_vertex(pSurf, (GtsFunc) lcme_filler, &me);
  me.Sort();

  TTree *t = new TTree(name, title);
  t->SetDirectory(0);

  Double_t ct, d;
  t->Branch("B1", &ct, "ct/D");
  t->Branch("B2", &d,  "d/D");

  for (Int_t i = 1; i < me.fN; ++i)
  {
    Int_t i1 = me.fIdcs[i];
    Int_t i0 = me.fIdcs[i - 1];

    ct = me.fMVec[i1];
    d  = me.fMVec[i1] - me.fMVec[i0];
    t->Fill();
  }

  return t;
}
 GTSurf.cxx:1
 GTSurf.cxx:2
 GTSurf.cxx:3
 GTSurf.cxx:4
 GTSurf.cxx:5
 GTSurf.cxx:6
 GTSurf.cxx:7
 GTSurf.cxx:8
 GTSurf.cxx:9
 GTSurf.cxx:10
 GTSurf.cxx:11
 GTSurf.cxx:12
 GTSurf.cxx:13
 GTSurf.cxx:14
 GTSurf.cxx:15
 GTSurf.cxx:16
 GTSurf.cxx:17
 GTSurf.cxx:18
 GTSurf.cxx:19
 GTSurf.cxx:20
 GTSurf.cxx:21
 GTSurf.cxx:22
 GTSurf.cxx:23
 GTSurf.cxx:24
 GTSurf.cxx:25
 GTSurf.cxx:26
 GTSurf.cxx:27
 GTSurf.cxx:28
 GTSurf.cxx:29
 GTSurf.cxx:30
 GTSurf.cxx:31
 GTSurf.cxx:32
 GTSurf.cxx:33
 GTSurf.cxx:34
 GTSurf.cxx:35
 GTSurf.cxx:36
 GTSurf.cxx:37
 GTSurf.cxx:38
 GTSurf.cxx:39
 GTSurf.cxx:40
 GTSurf.cxx:41
 GTSurf.cxx:42
 GTSurf.cxx:43
 GTSurf.cxx:44
 GTSurf.cxx:45
 GTSurf.cxx:46
 GTSurf.cxx:47
 GTSurf.cxx:48
 GTSurf.cxx:49
 GTSurf.cxx:50
 GTSurf.cxx:51
 GTSurf.cxx:52
 GTSurf.cxx:53
 GTSurf.cxx:54
 GTSurf.cxx:55
 GTSurf.cxx:56
 GTSurf.cxx:57
 GTSurf.cxx:58
 GTSurf.cxx:59
 GTSurf.cxx:60
 GTSurf.cxx:61
 GTSurf.cxx:62
 GTSurf.cxx:63
 GTSurf.cxx:64
 GTSurf.cxx:65
 GTSurf.cxx:66
 GTSurf.cxx:67
 GTSurf.cxx:68
 GTSurf.cxx:69
 GTSurf.cxx:70
 GTSurf.cxx:71
 GTSurf.cxx:72
 GTSurf.cxx:73
 GTSurf.cxx:74
 GTSurf.cxx:75
 GTSurf.cxx:76
 GTSurf.cxx:77
 GTSurf.cxx:78
 GTSurf.cxx:79
 GTSurf.cxx:80
 GTSurf.cxx:81
 GTSurf.cxx:82
 GTSurf.cxx:83
 GTSurf.cxx:84
 GTSurf.cxx:85
 GTSurf.cxx:86
 GTSurf.cxx:87
 GTSurf.cxx:88
 GTSurf.cxx:89
 GTSurf.cxx:90
 GTSurf.cxx:91
 GTSurf.cxx:92
 GTSurf.cxx:93
 GTSurf.cxx:94
 GTSurf.cxx:95
 GTSurf.cxx:96
 GTSurf.cxx:97
 GTSurf.cxx:98
 GTSurf.cxx:99
 GTSurf.cxx:100
 GTSurf.cxx:101
 GTSurf.cxx:102
 GTSurf.cxx:103
 GTSurf.cxx:104
 GTSurf.cxx:105
 GTSurf.cxx:106
 GTSurf.cxx:107
 GTSurf.cxx:108
 GTSurf.cxx:109
 GTSurf.cxx:110
 GTSurf.cxx:111
 GTSurf.cxx:112
 GTSurf.cxx:113
 GTSurf.cxx:114
 GTSurf.cxx:115
 GTSurf.cxx:116
 GTSurf.cxx:117
 GTSurf.cxx:118
 GTSurf.cxx:119
 GTSurf.cxx:120
 GTSurf.cxx:121
 GTSurf.cxx:122
 GTSurf.cxx:123
 GTSurf.cxx:124
 GTSurf.cxx:125
 GTSurf.cxx:126
 GTSurf.cxx:127
 GTSurf.cxx:128
 GTSurf.cxx:129
 GTSurf.cxx:130
 GTSurf.cxx:131
 GTSurf.cxx:132
 GTSurf.cxx:133
 GTSurf.cxx:134
 GTSurf.cxx:135
 GTSurf.cxx:136
 GTSurf.cxx:137
 GTSurf.cxx:138
 GTSurf.cxx:139
 GTSurf.cxx:140
 GTSurf.cxx:141
 GTSurf.cxx:142
 GTSurf.cxx:143
 GTSurf.cxx:144
 GTSurf.cxx:145
 GTSurf.cxx:146
 GTSurf.cxx:147
 GTSurf.cxx:148
 GTSurf.cxx:149
 GTSurf.cxx:150
 GTSurf.cxx:151
 GTSurf.cxx:152
 GTSurf.cxx:153
 GTSurf.cxx:154
 GTSurf.cxx:155
 GTSurf.cxx:156
 GTSurf.cxx:157
 GTSurf.cxx:158
 GTSurf.cxx:159
 GTSurf.cxx:160
 GTSurf.cxx:161
 GTSurf.cxx:162
 GTSurf.cxx:163
 GTSurf.cxx:164
 GTSurf.cxx:165
 GTSurf.cxx:166
 GTSurf.cxx:167
 GTSurf.cxx:168
 GTSurf.cxx:169
 GTSurf.cxx:170
 GTSurf.cxx:171
 GTSurf.cxx:172
 GTSurf.cxx:173
 GTSurf.cxx:174
 GTSurf.cxx:175
 GTSurf.cxx:176
 GTSurf.cxx:177
 GTSurf.cxx:178
 GTSurf.cxx:179
 GTSurf.cxx:180
 GTSurf.cxx:181
 GTSurf.cxx:182
 GTSurf.cxx:183
 GTSurf.cxx:184
 GTSurf.cxx:185
 GTSurf.cxx:186
 GTSurf.cxx:187
 GTSurf.cxx:188
 GTSurf.cxx:189
 GTSurf.cxx:190
 GTSurf.cxx:191
 GTSurf.cxx:192
 GTSurf.cxx:193
 GTSurf.cxx:194
 GTSurf.cxx:195
 GTSurf.cxx:196
 GTSurf.cxx:197
 GTSurf.cxx:198
 GTSurf.cxx:199
 GTSurf.cxx:200
 GTSurf.cxx:201
 GTSurf.cxx:202
 GTSurf.cxx:203
 GTSurf.cxx:204
 GTSurf.cxx:205
 GTSurf.cxx:206
 GTSurf.cxx:207
 GTSurf.cxx:208
 GTSurf.cxx:209
 GTSurf.cxx:210
 GTSurf.cxx:211
 GTSurf.cxx:212
 GTSurf.cxx:213
 GTSurf.cxx:214
 GTSurf.cxx:215
 GTSurf.cxx:216
 GTSurf.cxx:217
 GTSurf.cxx:218
 GTSurf.cxx:219
 GTSurf.cxx:220
 GTSurf.cxx:221
 GTSurf.cxx:222
 GTSurf.cxx:223
 GTSurf.cxx:224
 GTSurf.cxx:225
 GTSurf.cxx:226
 GTSurf.cxx:227
 GTSurf.cxx:228
 GTSurf.cxx:229
 GTSurf.cxx:230
 GTSurf.cxx:231
 GTSurf.cxx:232
 GTSurf.cxx:233
 GTSurf.cxx:234
 GTSurf.cxx:235
 GTSurf.cxx:236
 GTSurf.cxx:237
 GTSurf.cxx:238
 GTSurf.cxx:239
 GTSurf.cxx:240
 GTSurf.cxx:241
 GTSurf.cxx:242
 GTSurf.cxx:243
 GTSurf.cxx:244
 GTSurf.cxx:245
 GTSurf.cxx:246
 GTSurf.cxx:247
 GTSurf.cxx:248
 GTSurf.cxx:249
 GTSurf.cxx:250
 GTSurf.cxx:251
 GTSurf.cxx:252
 GTSurf.cxx:253
 GTSurf.cxx:254
 GTSurf.cxx:255
 GTSurf.cxx:256
 GTSurf.cxx:257
 GTSurf.cxx:258
 GTSurf.cxx:259
 GTSurf.cxx:260
 GTSurf.cxx:261
 GTSurf.cxx:262
 GTSurf.cxx:263
 GTSurf.cxx:264
 GTSurf.cxx:265
 GTSurf.cxx:266
 GTSurf.cxx:267
 GTSurf.cxx:268
 GTSurf.cxx:269
 GTSurf.cxx:270
 GTSurf.cxx:271
 GTSurf.cxx:272
 GTSurf.cxx:273
 GTSurf.cxx:274
 GTSurf.cxx:275
 GTSurf.cxx:276
 GTSurf.cxx:277
 GTSurf.cxx:278
 GTSurf.cxx:279
 GTSurf.cxx:280
 GTSurf.cxx:281
 GTSurf.cxx:282
 GTSurf.cxx:283
 GTSurf.cxx:284
 GTSurf.cxx:285
 GTSurf.cxx:286
 GTSurf.cxx:287
 GTSurf.cxx:288
 GTSurf.cxx:289
 GTSurf.cxx:290
 GTSurf.cxx:291
 GTSurf.cxx:292
 GTSurf.cxx:293
 GTSurf.cxx:294
 GTSurf.cxx:295
 GTSurf.cxx:296
 GTSurf.cxx:297
 GTSurf.cxx:298
 GTSurf.cxx:299
 GTSurf.cxx:300
 GTSurf.cxx:301
 GTSurf.cxx:302
 GTSurf.cxx:303
 GTSurf.cxx:304
 GTSurf.cxx:305
 GTSurf.cxx:306
 GTSurf.cxx:307
 GTSurf.cxx:308
 GTSurf.cxx:309
 GTSurf.cxx:310
 GTSurf.cxx:311
 GTSurf.cxx:312
 GTSurf.cxx:313
 GTSurf.cxx:314
 GTSurf.cxx:315
 GTSurf.cxx:316
 GTSurf.cxx:317
 GTSurf.cxx:318
 GTSurf.cxx:319
 GTSurf.cxx:320
 GTSurf.cxx:321
 GTSurf.cxx:322
 GTSurf.cxx:323
 GTSurf.cxx:324
 GTSurf.cxx:325
 GTSurf.cxx:326
 GTSurf.cxx:327
 GTSurf.cxx:328
 GTSurf.cxx:329
 GTSurf.cxx:330
 GTSurf.cxx:331
 GTSurf.cxx:332
 GTSurf.cxx:333
 GTSurf.cxx:334
 GTSurf.cxx:335
 GTSurf.cxx:336
 GTSurf.cxx:337
 GTSurf.cxx:338
 GTSurf.cxx:339
 GTSurf.cxx:340
 GTSurf.cxx:341
 GTSurf.cxx:342
 GTSurf.cxx:343
 GTSurf.cxx:344
 GTSurf.cxx:345
 GTSurf.cxx:346
 GTSurf.cxx:347
 GTSurf.cxx:348
 GTSurf.cxx:349
 GTSurf.cxx:350
 GTSurf.cxx:351
 GTSurf.cxx:352
 GTSurf.cxx:353
 GTSurf.cxx:354
 GTSurf.cxx:355
 GTSurf.cxx:356
 GTSurf.cxx:357
 GTSurf.cxx:358
 GTSurf.cxx:359
 GTSurf.cxx:360
 GTSurf.cxx:361
 GTSurf.cxx:362
 GTSurf.cxx:363
 GTSurf.cxx:364
 GTSurf.cxx:365
 GTSurf.cxx:366
 GTSurf.cxx:367
 GTSurf.cxx:368
 GTSurf.cxx:369
 GTSurf.cxx:370
 GTSurf.cxx:371
 GTSurf.cxx:372
 GTSurf.cxx:373
 GTSurf.cxx:374
 GTSurf.cxx:375
 GTSurf.cxx:376
 GTSurf.cxx:377
 GTSurf.cxx:378
 GTSurf.cxx:379
 GTSurf.cxx:380
 GTSurf.cxx:381
 GTSurf.cxx:382
 GTSurf.cxx:383
 GTSurf.cxx:384
 GTSurf.cxx:385
 GTSurf.cxx:386
 GTSurf.cxx:387
 GTSurf.cxx:388
 GTSurf.cxx:389
 GTSurf.cxx:390
 GTSurf.cxx:391
 GTSurf.cxx:392
 GTSurf.cxx:393
 GTSurf.cxx:394
 GTSurf.cxx:395
 GTSurf.cxx:396
 GTSurf.cxx:397
 GTSurf.cxx:398
 GTSurf.cxx:399
 GTSurf.cxx:400
 GTSurf.cxx:401
 GTSurf.cxx:402
 GTSurf.cxx:403
 GTSurf.cxx:404
 GTSurf.cxx:405
 GTSurf.cxx:406
 GTSurf.cxx:407
 GTSurf.cxx:408
 GTSurf.cxx:409
 GTSurf.cxx:410
 GTSurf.cxx:411
 GTSurf.cxx:412
 GTSurf.cxx:413
 GTSurf.cxx:414
 GTSurf.cxx:415
 GTSurf.cxx:416
 GTSurf.cxx:417
 GTSurf.cxx:418
 GTSurf.cxx:419
 GTSurf.cxx:420
 GTSurf.cxx:421
 GTSurf.cxx:422
 GTSurf.cxx:423
 GTSurf.cxx:424
 GTSurf.cxx:425
 GTSurf.cxx:426
 GTSurf.cxx:427
 GTSurf.cxx:428
 GTSurf.cxx:429
 GTSurf.cxx:430
 GTSurf.cxx:431
 GTSurf.cxx:432
 GTSurf.cxx:433
 GTSurf.cxx:434
 GTSurf.cxx:435
 GTSurf.cxx:436
 GTSurf.cxx:437
 GTSurf.cxx:438
 GTSurf.cxx:439
 GTSurf.cxx:440
 GTSurf.cxx:441
 GTSurf.cxx:442
 GTSurf.cxx:443
 GTSurf.cxx:444
 GTSurf.cxx:445
 GTSurf.cxx:446
 GTSurf.cxx:447
 GTSurf.cxx:448
 GTSurf.cxx:449
 GTSurf.cxx:450
 GTSurf.cxx:451
 GTSurf.cxx:452
 GTSurf.cxx:453
 GTSurf.cxx:454
 GTSurf.cxx:455
 GTSurf.cxx:456
 GTSurf.cxx:457
 GTSurf.cxx:458
 GTSurf.cxx:459
 GTSurf.cxx:460
 GTSurf.cxx:461
 GTSurf.cxx:462
 GTSurf.cxx:463
 GTSurf.cxx:464
 GTSurf.cxx:465
 GTSurf.cxx:466
 GTSurf.cxx:467
 GTSurf.cxx:468
 GTSurf.cxx:469
 GTSurf.cxx:470
 GTSurf.cxx:471
 GTSurf.cxx:472
 GTSurf.cxx:473
 GTSurf.cxx:474
 GTSurf.cxx:475
 GTSurf.cxx:476
 GTSurf.cxx:477
 GTSurf.cxx:478
 GTSurf.cxx:479
 GTSurf.cxx:480
 GTSurf.cxx:481
 GTSurf.cxx:482
 GTSurf.cxx:483
 GTSurf.cxx:484
 GTSurf.cxx:485
 GTSurf.cxx:486
 GTSurf.cxx:487
 GTSurf.cxx:488
 GTSurf.cxx:489
 GTSurf.cxx:490
 GTSurf.cxx:491
 GTSurf.cxx:492
 GTSurf.cxx:493
 GTSurf.cxx:494
 GTSurf.cxx:495
 GTSurf.cxx:496
 GTSurf.cxx:497
 GTSurf.cxx:498
 GTSurf.cxx:499
 GTSurf.cxx:500
 GTSurf.cxx:501
 GTSurf.cxx:502
 GTSurf.cxx:503
 GTSurf.cxx:504
 GTSurf.cxx:505
 GTSurf.cxx:506
 GTSurf.cxx:507
 GTSurf.cxx:508
 GTSurf.cxx:509
 GTSurf.cxx:510
 GTSurf.cxx:511
 GTSurf.cxx:512
 GTSurf.cxx:513
 GTSurf.cxx:514
 GTSurf.cxx:515
 GTSurf.cxx:516
 GTSurf.cxx:517
 GTSurf.cxx:518
 GTSurf.cxx:519
 GTSurf.cxx:520
 GTSurf.cxx:521
 GTSurf.cxx:522
 GTSurf.cxx:523
 GTSurf.cxx:524
 GTSurf.cxx:525
 GTSurf.cxx:526
 GTSurf.cxx:527
 GTSurf.cxx:528
 GTSurf.cxx:529
 GTSurf.cxx:530
 GTSurf.cxx:531
 GTSurf.cxx:532
 GTSurf.cxx:533
 GTSurf.cxx:534
 GTSurf.cxx:535
 GTSurf.cxx:536
 GTSurf.cxx:537
 GTSurf.cxx:538
 GTSurf.cxx:539
 GTSurf.cxx:540
 GTSurf.cxx:541
 GTSurf.cxx:542
 GTSurf.cxx:543
 GTSurf.cxx:544
 GTSurf.cxx:545
 GTSurf.cxx:546
 GTSurf.cxx:547
 GTSurf.cxx:548
 GTSurf.cxx:549
 GTSurf.cxx:550
 GTSurf.cxx:551
 GTSurf.cxx:552
 GTSurf.cxx:553
 GTSurf.cxx:554
 GTSurf.cxx:555
 GTSurf.cxx:556
 GTSurf.cxx:557
 GTSurf.cxx:558
 GTSurf.cxx:559
 GTSurf.cxx:560
 GTSurf.cxx:561
 GTSurf.cxx:562
 GTSurf.cxx:563
 GTSurf.cxx:564
 GTSurf.cxx:565
 GTSurf.cxx:566
 GTSurf.cxx:567
 GTSurf.cxx:568
 GTSurf.cxx:569
 GTSurf.cxx:570
 GTSurf.cxx:571
 GTSurf.cxx:572
 GTSurf.cxx:573
 GTSurf.cxx:574
 GTSurf.cxx:575
 GTSurf.cxx:576
 GTSurf.cxx:577
 GTSurf.cxx:578
 GTSurf.cxx:579
 GTSurf.cxx:580
 GTSurf.cxx:581
 GTSurf.cxx:582
 GTSurf.cxx:583
 GTSurf.cxx:584
 GTSurf.cxx:585
 GTSurf.cxx:586
 GTSurf.cxx:587
 GTSurf.cxx:588
 GTSurf.cxx:589
 GTSurf.cxx:590
 GTSurf.cxx:591
 GTSurf.cxx:592
 GTSurf.cxx:593
 GTSurf.cxx:594
 GTSurf.cxx:595
 GTSurf.cxx:596
 GTSurf.cxx:597
 GTSurf.cxx:598
 GTSurf.cxx:599
 GTSurf.cxx:600
 GTSurf.cxx:601
 GTSurf.cxx:602
 GTSurf.cxx:603
 GTSurf.cxx:604
 GTSurf.cxx:605
 GTSurf.cxx:606
 GTSurf.cxx:607
 GTSurf.cxx:608
 GTSurf.cxx:609
 GTSurf.cxx:610
 GTSurf.cxx:611
 GTSurf.cxx:612
 GTSurf.cxx:613
 GTSurf.cxx:614
 GTSurf.cxx:615
 GTSurf.cxx:616
 GTSurf.cxx:617
 GTSurf.cxx:618
 GTSurf.cxx:619
 GTSurf.cxx:620
 GTSurf.cxx:621
 GTSurf.cxx:622
 GTSurf.cxx:623
 GTSurf.cxx:624
 GTSurf.cxx:625
 GTSurf.cxx:626
 GTSurf.cxx:627
 GTSurf.cxx:628
 GTSurf.cxx:629
 GTSurf.cxx:630
 GTSurf.cxx:631
 GTSurf.cxx:632
 GTSurf.cxx:633
 GTSurf.cxx:634
 GTSurf.cxx:635
 GTSurf.cxx:636
 GTSurf.cxx:637
 GTSurf.cxx:638
 GTSurf.cxx:639
 GTSurf.cxx:640
 GTSurf.cxx:641
 GTSurf.cxx:642
 GTSurf.cxx:643
 GTSurf.cxx:644
 GTSurf.cxx:645
 GTSurf.cxx:646
 GTSurf.cxx:647
 GTSurf.cxx:648
 GTSurf.cxx:649
 GTSurf.cxx:650
 GTSurf.cxx:651
 GTSurf.cxx:652
 GTSurf.cxx:653
 GTSurf.cxx:654
 GTSurf.cxx:655
 GTSurf.cxx:656
 GTSurf.cxx:657
 GTSurf.cxx:658
 GTSurf.cxx:659
 GTSurf.cxx:660
 GTSurf.cxx:661
 GTSurf.cxx:662
 GTSurf.cxx:663
 GTSurf.cxx:664
 GTSurf.cxx:665
 GTSurf.cxx:666
 GTSurf.cxx:667
 GTSurf.cxx:668
 GTSurf.cxx:669
 GTSurf.cxx:670
 GTSurf.cxx:671
 GTSurf.cxx:672
 GTSurf.cxx:673
 GTSurf.cxx:674
 GTSurf.cxx:675
 GTSurf.cxx:676
 GTSurf.cxx:677
 GTSurf.cxx:678
 GTSurf.cxx:679
 GTSurf.cxx:680
 GTSurf.cxx:681
 GTSurf.cxx:682
 GTSurf.cxx:683
 GTSurf.cxx:684
 GTSurf.cxx:685
 GTSurf.cxx:686
 GTSurf.cxx:687
 GTSurf.cxx:688
 GTSurf.cxx:689
 GTSurf.cxx:690
 GTSurf.cxx:691
 GTSurf.cxx:692
 GTSurf.cxx:693
 GTSurf.cxx:694
 GTSurf.cxx:695
 GTSurf.cxx:696
 GTSurf.cxx:697
 GTSurf.cxx:698
 GTSurf.cxx:699
 GTSurf.cxx:700
 GTSurf.cxx:701
 GTSurf.cxx:702
 GTSurf.cxx:703
 GTSurf.cxx:704
 GTSurf.cxx:705
 GTSurf.cxx:706
 GTSurf.cxx:707
 GTSurf.cxx:708
 GTSurf.cxx:709
 GTSurf.cxx:710
 GTSurf.cxx:711
 GTSurf.cxx:712
 GTSurf.cxx:713
 GTSurf.cxx:714
 GTSurf.cxx:715
 GTSurf.cxx:716
 GTSurf.cxx:717
 GTSurf.cxx:718
 GTSurf.cxx:719
 GTSurf.cxx:720
 GTSurf.cxx:721
 GTSurf.cxx:722
 GTSurf.cxx:723
 GTSurf.cxx:724
 GTSurf.cxx:725
 GTSurf.cxx:726
 GTSurf.cxx:727
 GTSurf.cxx:728
 GTSurf.cxx:729
 GTSurf.cxx:730
 GTSurf.cxx:731
 GTSurf.cxx:732
 GTSurf.cxx:733
 GTSurf.cxx:734
 GTSurf.cxx:735
 GTSurf.cxx:736
 GTSurf.cxx:737
 GTSurf.cxx:738
 GTSurf.cxx:739
 GTSurf.cxx:740
 GTSurf.cxx:741
 GTSurf.cxx:742
 GTSurf.cxx:743
 GTSurf.cxx:744
 GTSurf.cxx:745
 GTSurf.cxx:746
 GTSurf.cxx:747
 GTSurf.cxx:748
 GTSurf.cxx:749
 GTSurf.cxx:750
 GTSurf.cxx:751
 GTSurf.cxx:752
 GTSurf.cxx:753
 GTSurf.cxx:754
 GTSurf.cxx:755
 GTSurf.cxx:756
 GTSurf.cxx:757
 GTSurf.cxx:758
 GTSurf.cxx:759
 GTSurf.cxx:760
 GTSurf.cxx:761
 GTSurf.cxx:762
 GTSurf.cxx:763
 GTSurf.cxx:764
 GTSurf.cxx:765
 GTSurf.cxx:766
 GTSurf.cxx:767
 GTSurf.cxx:768
 GTSurf.cxx:769
 GTSurf.cxx:770
 GTSurf.cxx:771
 GTSurf.cxx:772
 GTSurf.cxx:773
 GTSurf.cxx:774
 GTSurf.cxx:775
 GTSurf.cxx:776
 GTSurf.cxx:777
 GTSurf.cxx:778
 GTSurf.cxx:779
 GTSurf.cxx:780
 GTSurf.cxx:781
 GTSurf.cxx:782
 GTSurf.cxx:783
 GTSurf.cxx:784
 GTSurf.cxx:785
 GTSurf.cxx:786
 GTSurf.cxx:787
 GTSurf.cxx:788
 GTSurf.cxx:789
 GTSurf.cxx:790
 GTSurf.cxx:791
 GTSurf.cxx:792
 GTSurf.cxx:793
 GTSurf.cxx:794
 GTSurf.cxx:795
 GTSurf.cxx:796
 GTSurf.cxx:797
 GTSurf.cxx:798
 GTSurf.cxx:799
 GTSurf.cxx:800
 GTSurf.cxx:801
 GTSurf.cxx:802
 GTSurf.cxx:803
 GTSurf.cxx:804
 GTSurf.cxx:805
 GTSurf.cxx:806
 GTSurf.cxx:807
 GTSurf.cxx:808
 GTSurf.cxx:809
 GTSurf.cxx:810
 GTSurf.cxx:811
 GTSurf.cxx:812
 GTSurf.cxx:813
 GTSurf.cxx:814
 GTSurf.cxx:815
 GTSurf.cxx:816
 GTSurf.cxx:817
 GTSurf.cxx:818
 GTSurf.cxx:819
 GTSurf.cxx:820
 GTSurf.cxx:821
 GTSurf.cxx:822