ROOT logo
// $Id: Saturn.cxx 2791 2012-06-23 01:18:47Z 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 "Saturn.h"
#include "gled-config-build.h"

#include <Gled/GledNS.h>
#include <Ephra/Mountain.h>
#include <Glasses/ZGod.h>
#include <Glasses/ZKing.h>
#include <Glasses/ZFireKing.h>
#include <Glasses/ZSunQueen.h>
#include <Glasses/ZQueen.h>
#include <Glasses/ZFireQueen.h>
#include <Glasses/ZMirFilter.h>
#include <Glasses/EyeInfo.h>
#include <Gled/GThread.h>
#include <Stones/ZComet.h>
#include <Gled/GledMirDefs.h>
#include "Eye/Ray.h"
#include "Ephra/EyeInfoVector.h"

// Services
#include <Stones/ZHistoManager.h>

#include <TROOT.h>
#include <TClass.h>
#include <TFile.h>
#include <TDirectory.h>
#include <TSystem.h>
#include <TServerSocket.h>

#include <errno.h>
#include <signal.h>
#include <sys/socket.h>

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Definitely need Queen loading implemented in Saturn
// GCondition mQueenLoadingCond
// lID_t mAwaited Queens (or hash ... or both ... or sth) (need list<GCondition*>)
// void LoadQueen(ZQueen*) or LoadQueen(ID_t) { checks deps ... }
// void SuspendUntilQueenReady(ZQueen*)
// void SuspendUntilNoQueensPending()
//
// where do requests come from?
// This is ... again ... the tricky part.
// Now been mis-using the fire-king

//______________________________________________________________________
//
// Server and client. In fact Sun, Moon and Fire.
// Shines, reflects and glows.
//

ClassImp(Saturn);

//==============================================================================
// Thread invocators
//==============================================================================

namespace
{
  void sh_SaturnFdSucker(GSignal* sig)
  {
    ISmess(GForm("Saturn::sh_SaturnFdSucker invoked by signal %d.", sig->fSignal));
  }
}

void* Saturn::tl_SaturnFdSucker(Saturn *s)
{
  // The thread foo for doing select on all sockets (master, moons & eyes).
  // Could (in principle) have several threads.

  GThread::SetCancelState(GThread::CS_Enable);
  GThread::SetCancelType(GThread::CT_Deferred);

  { // Signals init;
    // return from select on USR1 to allow additions of new socket fd's

    GThread::UnblockSignal(GThread::SigUSR1);
    GThread::SetSignalHandler(GThread::SigUSR1, sh_SaturnFdSucker);
  }

  // Perhaps should install some exit-foo ... to close sockets ...
  while (true)
  {
    int ret = s->SockSuck();
    if (ret != 0)
    {
      ISmess(GForm("Saturn::mServerThread %s", strerror(errno)));
    }
    GThread::TestCancel();
  }
  return 0;
}

void* Saturn::tl_SaturnAcceptor(new_connection_ti* ncti)
{
  // Thread foo for acception of a new connection.
  // Accept threads are always created in a detached state.

  ncti->sat->AcceptWrapper(ncti->sock);
  delete ncti;
  return 0;
}

void* Saturn::tl_MIR_Router(Saturn* sat)
{
  // Thread foo for routing of a single MIR.

  static const Exc_t _eh("Saturn::tl_MIR_Router ");

  auto_ptr<ZMIR> mir(GThread::MIR());
  try {
    sat->RouteMIR(mir);
    if (mir->fRequiresResult) sat->generick_shoot_mir_result(*mir, 0, 0);
  }
  catch(Exc_t& exc) {
    sat->report_mir_post_demangling_error(*mir, _eh + "MIR execution failed: " + exc);
  }

  return 0;
}

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

bool Saturn::DetachedThreadsPerLens::IsEmpty() const
{
  return fThreads.empty();
}

GThread* Saturn::DetachedThreadsPerLens::GetLastThread() const
{
  return fThreads.back().fThread;
}

void Saturn::DetachedThreadsPerLens::PushBack(GThread* t, lDetachedThreadInfo_i i)
{
  fThreads.push_back(Thread(t, i));
}

Saturn::lDetachedThreadInfo_i Saturn::DetachedThreadsPerLens::PopBack()
{
  lDetachedThreadInfo_i mi = fThreads.back().fMainIter;
  fThreads.pop_back();
  return mi;
}

Saturn::lDetachedThreadInfo_i Saturn::DetachedThreadsPerLens::FindAndRemove(GThread* t)
{
  for (list<Thread>::iterator i = fThreads.begin(); i != fThreads.end(); ++i)
  {
    if (i->fThread == t)
    {
      lDetachedThreadInfo_i mi = i->fMainIter;
      fThreads.erase(i);
      return mi;
    }
  }
  throw Exc_t("Saturn::DetachedThreadsPerLens::FindAndRemove internal state corrupted.");
}

//------------------------------------------------------------------------------

void Saturn::register_detached_thread(ZGlass *lens, GThread *thread)
{
  GMutexHolder _lck(mDetachedMirMutex);

  mDetachedThreadsList.push_back(DetachedThreadInfo(lens, thread));
  mDetachedThreadsHash[lens].PushBack(thread, --mDetachedThreadsList.end());
}

void Saturn::unregister_detached_thread(ZGlass *lens, GThread *thread)
{
  static const Exc_t _eh("Saturn::unregister_detached_thread ");

  GMutexHolder _lck(mDetachedMirMutex);

  hpZGlass2DetachedThreadPerLens_i hi = mDetachedThreadsHash.find(lens);
  if (hi == mDetachedThreadsHash.end())
  {
    ISerr(_eh + "entry for " + lens->Identify() + " not found in mDetachedThreadsHash.");
    return;
  }
  lDetachedThreadInfo_i mi = hi->second.FindAndRemove(thread);
  mDetachedThreadsList.erase(mi);
  if (hi->second.IsEmpty())
  {
    mDetachedThreadsHash.erase(hi);
  }
}

bool Saturn::cancel_and_join_thread(ZGlass* lens, GThread* thread)
{
  static const Exc_t _eh("Saturn::cancel_and_join_thread ");

  bool status = true;

  ISdebug(2, GForm("%sattempting cancellation of a detached MIR thread of lens '%s'.",
                   _eh.Data(), lens->GetName()));
  int retc = thread->Cancel();
  ISdebug(2, GForm("%scancellation of thread of lens '%s' returned %d.",
		     _eh.Data(), lens->GetName(), retc));
  if (retc)
  {
    ISerr(_eh + "having problems cancelling a detached thread of " + lens->GetName() + ".");
    status = false;
  }
  else
  {
    ISdebug(2, GForm("%sattempting join on a detached MIR thread of lens '%s'.",
                     _eh.Data(), lens->GetName()));
    int retj = thread->Join();
    ISdebug(2, GForm("%sjoin on thread of lens '%s' returned %d.",
                     _eh.Data(), lens->GetName(), retj));
    if (retj)
    {
      ISerr(_eh + "having problems joining a detached thread of " + lens->GetName() + ".");
      status = false;
    }
    else
    {
      delete thread;
    }
  }

  return status;
}


//------------------------------------------------------------------------------

void* Saturn::tl_MIR_DetachedExecutor(Saturn* sat)
{
  // Thread foo for execution of a single *detached* MIR.
  // MIR is set in the GThread structure.

  static const Exc_t _eh("Saturn::tl_MIR_DetachedExecutor ");

  GThread *self = GThread::Self();
  ZMIR    *mir  = self->get_mir();
  {
    ISdebug(1, GForm("%sregistering a detached thread %p to '%s'.",
		     _eh.Data(), self, mir->fAlpha->GetName()));

    sat->register_detached_thread(mir->fAlpha, self);
  }

  self->SetTerminalPolicy(GThread::TP_ThreadExit);

  try
  {
    ISdebug(1, GForm("%snow execing mir.", _eh.Data()));

    if (mir->IsWriting()) mir->RewindToData();

    GledNS::LibSetInfo* lsi = GledNS::FindLibSetInfo(mir->fLid);
    if (lsi == 0)
      throw(_eh + GForm("can't demangle lib ID=%hu.", mir->fLid));

    (lsi->fLME_Foo)(mir->fAlpha, *mir);

    if (mir->fRequiresResult)
      sat->generick_shoot_mir_result(*mir, 0, 0);
    ISdebug(1, GForm("%smir exec done.", _eh.Data()));
  }
  catch (Exc_t& exc)
  {
    sat->report_mir_post_demangling_error(*mir, _eh + "MIR execution failed: " + exc);
  }

  return 0;
}

void Saturn::tl_MIR_DetachedCleanUp(Saturn* sat)
{
  static const Exc_t _eh("Saturn::tl_MIR_DetachedCleanUp ");

  GThread *self = GThread::Self();
  ZMIR    *mir  = self->get_mir();

  {
    ISdebug(1, GForm("%sunregistering a detached thread %p from '%s'.",
		     _eh.Data(), self, mir->fAlpha->GetName()));

    sat->unregister_detached_thread(mir->fAlpha, self);
  }

  delete mir;
}

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

void* Saturn::tl_MIR_Shooter(Saturn* s)
{
  // Thread foo executing Saturn::mir_shooter().

  GThread::SetCancelState(GThread::CS_Enable);
  GThread::SetCancelType(GThread::CT_Deferred);

  s->mir_shooter();

  return 0;
}

void* Saturn::tl_Delayed_MIR_Shooter(Saturn* s)
{
  // Thread foo executing Saturn::dealyed_mir_shooter().

  GThread::SetCancelState(GThread::CS_Enable);
  GThread::SetCancelType(GThread::CT_Deferred);

  s->delayed_mir_shooter();

  return 0;
}

void* Saturn::tl_Ray_Emitter(Saturn* s)
{
  // Thread foo executing Saturn::ray_emitter().

  GThread::SetCancelState(GThread::CS_Enable);
  GThread::SetCancelType(GThread::CT_Deferred);

  s->ray_emitter();

  return 0;
}

//==============================================================================
// Static members
//==============================================================================

const Int_t Saturn::s_Gled_Protocol_Version = 1;

//==============================================================================
// Con/De/Structor
//==============================================================================

Saturn::Saturn() :
  mIDLock(GMutex::recursive),
  mEyeLock(GMutex::recursive),
  mMoonLock(GMutex::recursive),
  mMasterLock(GMutex::recursive),
  mRulingLock(GMutex::recursive),
  mSelector(GMutex::recursive),
  mGod(0), mSunKing(0), mSunQueen(0), mKing(0), mFireKing(0), mFireQueen(0),
  mSunInfo(0), mSaturnInfo(0), bSunAbsolute(false),
  mQueenLoadNum(0), mQueenLoadCnd(GMutex::recursive),
  mChaItOss(0),
  mServerSocket(0), mServerThread(0), mShutdownThread(0),
  bAllowMoons(false),
  pZHistoManager(0),
  mBeamReqHandleMutex(GMutex::recursive), mLastBeamReqHandle(0),
  mMIRShootingCnd(GMutex::recursive), mDelayedMIRShootingCnd(GMutex::recursive),
  bAcceptsRays(false), mRayEmittingCnd()
{
  // GOD
  mGod = new ZGod("God", "I do nothing ... I only am.");
  Enlight(mGod, MAX_ID);

  mChaItOss = new Mountain(this);
}

Saturn::~Saturn()
{
  delete mChaItOss;
  delete mServerSocket; // Close is called by dtor
}

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

TString Saturn::HandleClientSideSaturnHandshake(TSocket*& socket)
{
  // Handles handshake with a Saturn on a newly opened socket.
  // Returns greeting TString.

  static const Exc_t _eh("Saturn::HandleClientSideSaturnHandshake ");

  TInetAddress ia = socket->GetInetAddress();
  if (!socket->IsValid())
  {
    delete socket; socket = 0;
    throw _eh + GForm("opening socket to %s:%d failed.",
		      ia.GetHostName(), ia.GetPort());
  }

  // Receive greeting
  int ml; char buf[256];
  ml = socket->RecvRaw(buf, 255, kDontBlock);
  if (ml <= 0)
  {
    delete socket; socket = 0;
    throw _eh + GForm("handshake with %s:%d failed: len=%d.",
		      ia.GetHostName(), ia.GetPort(), ml);
  }
  buf[ml] = 0;
  return TString(buf);
}

TMessage* Saturn::HandleClientSideMeeConnection(TSocket* socket, ZMirEmittingEntity* mee)
{
  // Sends request for instantiation of mee via socket.
  // If authentication is required it is handled via
  // ZSunQueen::HandleClientSideAuthentication(). The required identity
  // is deduced from the TString ZMirEmittingEntity::mLogin.

  static const Exc_t _eh("Saturn::HandleClientSideMeeConnection "); // caller should prefix the exception

  { // Send the desired Identity & Mee
    TMessage creq(GledNS::MT_MEE_Connect);
    GledNS::StreamLens(creq, mee);
    socket->Send(creq);
  }
  TMessage* m = 0;
  Int_t     l;
 grant_auth_loop:
  l = socket->Recv(m);
  if (l <= 0)
  {
    throw _eh + "connection broken";
  }

  if (m->What() == GledNS::MT_MEE_ConnectionGranted)
  {
    return m;
  }
  else if (m->What() == GledNS::MT_MEE_AuthRequested)
  {
    TString host; Int_t port; UInt_t conn_id;
    host.Streamer(*m); *m >> port >> conn_id;
    TSocket* auth_sock = new TSocket(host.Data(), port);
    try
    {
      Saturn::HandleClientSideSaturnHandshake(auth_sock);
      ZSunQueen::HandleClientSideAuthentication(auth_sock, conn_id, mee->mLogin);
    }
    catch (Exc_t& exc)
    {
      delete auth_sock; delete m;
      throw _eh + "auth failed: " + exc;
    }
    delete auth_sock; delete m;
    goto grant_auth_loop;
  }
  else if (m->What() == GledNS::MT_MEE_ConnectionDenied)
  {
    TString s; *m >> s;  delete m;
    throw _eh + "connection denied: " + s.Data();
  }
  else
  {
    throw _eh + "unknown response";
  }
}

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

void Saturn::Create(SaturnInfo* si)
{
  // Spawns SunAbsolute and starts internal Saturn threads.
  //
  // The calling thread is given the identity of the argument SaturnInfo,
  // which is also assigned to mSunInfo and mSaturnInfo members.

  static const Exc_t _eh("Saturn::Create ");

  mSunInfo = mSaturnInfo = si;
  mSaturnInfo->hSocket = 0; // No masters above me
  bSunAbsolute = true;

  mSaturnInfo->mKingID = 1;
  fix_fire_king_id(mSaturnInfo);
  create_kings("SunKing", "FireKing");
  mKing->SetTitle("Ruler of what is");
  mFireKing->SetTitle("Ruler of what isn't");

  mSunKing = mKing;

  mSunQueen = new ZSunQueen(666, "SunQueen", "Princess of ChaItOss");
  mSunKing->Enthrone(mSunQueen);
  mSunQueen->CheckIn(mSaturnInfo);
  mSunQueen->mSunInfo = mSaturnInfo;
  mSaturnInfo->create_lists();

  GThread::OwnerChanger _chown(mSaturnInfo);

  {
    GThread thread_starter("saturn-thread_starter",
			   (GThread_foo) start_threads, this, false);
    void *result;
    thread_starter.Spawn();
    thread_starter.Join(&result);
    if (result != 0)
    {
      exit(1);
    }
  }

  try
  {
    mSunQueen->attach_primary_identity(mSaturnInfo);
  }
  catch(Exc_t& exc)
  {
    cerr << _eh + "exception: "<< exc <<endl;
    exit(1);
  }
}

SaturnInfo* Saturn::Connect(SaturnInfo* si)
{
  // Connects to a higher Saturn, as specified by si->MasterName and
  // si->MasterPort. Does the following:
  // 1) handles handshake & protocol info exchange
  // 2) queries first free id to establish beginning of local sun-space
  // 3) authenticates to sun.absolute and receives higher kings, sun.queen
  //    and the authorized SaturnInfo structure
  // 4) starts MirShooting thread and server thread
  // 5) issues requests for mirroring of mandatory queens
  //
  // The calling thread is given the identity of the return SaturnInfo, which
  // is also assigned to mSaturnInfo member.

  static const Exc_t _eh("Saturn::Connect ");

  bSunAbsolute = false;

  TSocket* sock = new TSocket(si->GetMasterName(), si->GetMasterPort());
  try
  {
    TString greeting = Saturn::HandleClientSideSaturnHandshake(sock);
    ISmess(_eh + greeting);
  }
  catch(Exc_t& exc)
  {
    throw(_eh + exc);
  }

  // Exchange protocol info
  {
    TMessage m(GledNS::MT_GledProtocol);
    m << s_Gled_Protocol_Version;
    sock->Send(m);
    TMessage* r;
    int rl = sock->Recv(r);
    if (rl <= 0)
    {
      delete sock;
      throw _eh + GForm("protocol exchange failed; len=%d.", rl);
    }

    if (r->What() == GledNS::MT_GledProtocol)
    {
      Int_t sproto; *r >> sproto;
      ISmess(_eh + GForm("server protocol=%d.", sproto));
    }
    else if (r->What() == GledNS::MT_ProtocolMismatch)
    {
      Int_t sproto; *r >> sproto;
      delete sock; delete r;
      throw _eh + GForm("protocol mismatch: server=%d, client=%d.",
			sproto, s_Gled_Protocol_Version);
    }
    else
    {
      Int_t mt = r->What();
      delete sock; delete r;
      throw _eh + GForm("unknown message type %d.", mt);
    }
  }

  // QueryFFId
  {
    TMessage m(GledNS::MT_QueryFFID);
    sock->Send(m);
    TMessage* r;
    int rl = sock->Recv(r);
    if (rl <= 0)
    {
      delete sock;
      throw(_eh + "handshake failed (3).");
    }

    if (r->What() == GledNS::MT_QueryFFID)
    {
      ID_t ffid; *r >> ffid;
      ISmess(_eh + GForm("got first free id=%d.", ffid));

      si->mKingID = ffid;
      if (si->mKingID == 0) throw(_eh + "failed FFID query.");
      fix_fire_king_id(si);

    }
    else
    {
      Int_t mt = r->What();
      delete sock; delete r;
      throw(_eh + GForm("unknown message type %d.", mt));
    }
  }

  {
    TMessage* m;
    try
    {
      m = HandleClientSideMeeConnection(sock, si);
    }
    catch(Exc_t& exc)
    {
      delete sock;
      throw(_eh + exc);
    }
    arrival_of_kings(m);
    delete m;
  }

  create_kings("King of the Moon", "FireKing");
  mKing->SetTitle("Ruler of what partially is");
  mFireKing->SetTitle("Ruler of what isn't");

  mSaturnInfo->hSocket = 0;
  mSaturnInfo->hRoute = 0;
  mSaturnInfo->GetMaster()->hSocket = sock;
  mSaturnInfo->GetMaster()->hRoute  = mSaturnInfo->GetMaster();
  mSelector.fRead.Add(sock);
  // sock->SetOption(kNoBlock, 1);

  GThread::OwnerChanger _chown(mSaturnInfo);

  {
    GThread thread_starter("saturn-thread_starter",
			   (GThread_foo) start_threads, this, false);
    void *result;
    thread_starter.Spawn();
    thread_starter.Join(&result);
    if (result != 0)
    {
      exit(1);
    }
  }

  // Issue requests for mandatory queens.
  lpZGlass_t kings; mGod->CopyList(kings); kings.pop_back(); kings.pop_back();
  for (lpZGlass_i i=kings.begin(); i!=kings.end(); ++i)
  {
    ZKing* k = dynamic_cast<ZKing*>(*i);
    lpZGlass_t queens; k->CopyList(queens);
    for (lpZGlass_i j=queens.begin(); j!=queens.end(); ++j)
    {
      ZQueen* q = dynamic_cast<ZQueen*>(*j);
      q->mKing = k;
      if (q->GetMandatory() && ! q->GetRuling())
      {
	mFireKing->RequestQueenMirroring(q);
      }
    }
  }

  return mSaturnInfo;
}

TSocket* Saturn::MakeSocketPairAndAccept(const TString& name)
{
  // Creates unix socket pair and runs Accept() in a special thread. The other
  // socket is returned.
  // Used for Eye connections.

  static const Exc_t _eh("Saturn::MakeSocketPairAndAccept ");

  int fds[2];
  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))
    throw _eh + "socketpair failed: " + strerror(errno);

  TSocket *ssock = new TSocket(fds[0], name);
  TSocket *csock = new TSocket(fds[1], name);

  new_connection_ti* ncti = new new_connection_ti(this, ssock);
  GThread* at = new GThread("Saturn-Eye-Acceptor", (GThread_foo)tl_SaturnAcceptor, ncti, true);
  at->Spawn();

  return csock;
}

void Saturn::OpenServerSocket()
{
  if (mServerSocket != 0)
    return;

  if (create_server_socket())
    exit(1);
}

void Saturn::AllowMoons()
{
  // On start-up the moons are not allowed to connect (only Eyes).
  // AllowMoons() allows moons connections from now on.

  if (mServerSocket == 0)
    OpenServerSocket();

  bAllowMoons = true;
}

void Saturn::Shutdown()
{
  // Performs shutdown of connected objects and threads.

  // first should dump moons, eyez ...

  static const Exc_t _eh("Saturn::Shutdown ");

  static GMutex shd_moo;
  {
    GMutexHolder lck(shd_moo);
    if (mShutdownThread)
      throw _eh + "already in progress.";
    mShutdownThread = GThread::Self();
  }

  ISmess(_eh + "commencing.");

  ISmess(_eh + "stopping ChaItOss (thread manager).");
  mChaItOss->Shutdown();

  ISmess(_eh + "stopping detached threads.");
  stop_detached_threads();

  ISmess(_eh + "stopping MIR shooters.");
  stop_shooters();
  ISmess(_eh + "stopping server thread.");
  stop_server();

  ISmess(_eh + "stopping services.");
  if (pZHistoManager)
  {
    pZHistoManager->Write();
    pZHistoManager->Close();
    delete pZHistoManager; pZHistoManager = 0;
  }

  ISmess(_eh + "done.");
}

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

void Saturn::LockMIRShooters(bool wait_until_queue_empty)
{
  mMIRShootingCnd.Lock();
  if (wait_until_queue_empty)
  {
    while (true)
    {
      if(mMIRShootingQueue.empty()) break;
      mMIRShootingCnd.Wait();
    }
  }
  mMIRShooterRoutingLock.Lock();
  mMIRShootingCnd.Unlock();

  mDelayedMIRShootingCnd.Lock();
}

void Saturn::UnlockMIRShooters()
{
  mDelayedMIRShootingCnd.Unlock();
  mMIRShooterRoutingLock.Unlock();
}


/**************************************************************************/
// Enlight/Reflect/Freeze/Endark of lenses
/**************************************************************************/

void Saturn::Enlight(ZGlass* glass, ID_t id) throw(Exc_t)
{
  // Inserts glass into hash with key id.
  // Sets Saturn related glass members and calls ZGlass::AdEnlightenment().

  static const Exc_t _eh("Saturn::Enlight ");

  if(glass == 0)
    throw(_eh + "glass=0; stalling ...");

  if(id == 0)
    throw(_eh + "id=0; stalling ...");


  mIDLock.Lock();
  hID2pZGlass_i i = mIDHash.find(id);
  if(i != mIDHash.end()) {
    mIDLock.Unlock();
    throw(_eh + GForm("id=%u already used by '%s' (new is '%s'; stalling...",
		      id, i->second->GetName(), glass->GetName()));
  }
  mIDHash[id] = glass;
  mIDLock.Unlock();

  // Infrom the new lens
  glass->mSaturnID = id;
  glass->mSaturn = this;
  ISdebug(2,GForm("%sfor %s, id=%u", _eh.Data(), glass->GetName(), id));
  // Now let the newglass call its initialization foos
  glass->AdEnlightenment();
}

void Saturn::Reflect(ZGlass* glass) throw(Exc_t)
{
  // Enlights glass with a key taken from glass->mSaturnID.
  // Used for ZComet unpacking on Moons (hence Reflect).

  static const Exc_t _eh("Saturn::Reflect ");

  if(glass->mSaturnID == 0) throw (_eh + "called w/ id 0.");
  Enlight(glass, glass->mSaturnID);
}

void Saturn::Freeze(ZGlass* lens) throw(Exc_t)
{
  // Stops all detached MIR threads for lens.

  static const Exc_t _eh("Saturn::Freeze ");

  if (lens==0)
    throw _eh + "lens=0; stalling.";

  ISdebug(2,GForm("%sfor %s, id=%u", _eh.Data(), lens->GetName(), lens->GetSaturnID()));

  // Remove delayed MIRs aimed at the lens.
  // XXXX This is somewhat funky ... MIRs should be routed to their
  // final destination before being queued up. So, MIR should have
  // an "execute at" GTime member. Also, we could have "execute on Freeze"
  // tag (maybe GTime::Never()?).
  {
    GMutexHolder _lck(mDelayedMIRShootingCnd);

    mTime2MIR_i i = mDelayedMIRShootingQueue.begin();
    while (i != mDelayedMIRShootingQueue.end())
    {
      ZMIR *mir = i->second;
      if (mir->fCaller == lens || mir->fRecipient == lens || mir->fResultRecipient == lens ||
          mir->fAlpha  == lens || mir->fBeta      == lens || mir->fGamma           == lens)
      {
        mTime2MIR_i j = i++;
        delete mir;
        mDelayedMIRShootingQueue.erase(j);
      }
      else
      {
        ++i;
      }
    }
  }

  int  ok = 0, failed = 0;
  bool yield = false;
  // !! Could be rewritten into two loops: Cancel, then Join those that
  // were successfully cancelled.
  while (true)
  {
    if (yield)
    {
      GThread::Yield();
      yield = false;
    }
    GThread* thr = 0;
    {
      GMutexHolder _lck(mDetachedMirMutex);
      hpZGlass2DetachedThreadPerLens_i i = mDetachedThreadsHash.find(lens);
      if (i == mDetachedThreadsHash.end())
      {
	break;
      }
      if (i->second.IsEmpty())
      {
	mDetachedThreadsHash.erase(i);
	break;
      }

      thr = i->second.GetLastThread();
      if (thr->ClearDetachOnExit() == false)
      {
	// We caught the thread in its last breath, yield cpu before next
	// attempt (but get out of lock first).
	yield = true;
	continue;
      }
    }

    cancel_and_join_thread(lens, thr) ? ++ok : ++failed;
  }
  if (ok > 0 || failed > 0)
  {
    ISdebug(1, GForm("%ssuccessfully canceled %d (failed for %d) detached MIR threads of lens '%s'.",
		     _eh.Data(), ok, failed, lens->GetName()));
  }
}

void Saturn::Endark(ZGlass* lens) throw(Exc_t)
{
  static const Exc_t _eh("Saturn::Endark ");

  if(lens==0)
    throw(_eh + "lens=0; stalling.");

  ISdebug(2,GForm("%sfor %s, id=%u", _eh.Data(), lens->GetName(), lens->GetSaturnID()));

  // Hack self
  mIDLock.Lock();
  hID2pZGlass_i i;
  if((i=mIDHash.find(lens->mSaturnID)) == mIDHash.end() || i->second != lens) {
    mIDLock.Unlock();
    throw(_eh + "id/lens mismatch; stalling.");
  }
  mIDHash.erase(i);
  mIDLock.Unlock();
  lens->AdEndarkenment();
  lens->mSaturnID = 0;
  lens->mSaturn = 0;
}

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

Bool_t Saturn::IsMoon(SaturnInfo* si)
{
  mMoonLock.Lock();
  lpSaturnInfo_i l = find(mMoons.begin(), mMoons.end(), si);
  Bool_t ret = (l != mMoons.end());
  mMoonLock.Unlock();
  return ret;
}

void Saturn::CopyMoons(lpSaturnInfo_t& list)
{
  mMoonLock.Lock();
  copy(mMoons.begin(), mMoons.end(), back_inserter(list));
  mMoonLock.Unlock();
}

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

// Freezing not really needed anymore. Now solved via RulingLock,
// ZGlass::ReadLock and ZQueen::SubjectWriteLock.

Int_t Saturn::Freeze()
{
  mChaItOss->SuspendAll();
  mMoonLock.Lock();
  return 0;
}

Int_t Saturn::UnFreeze()
{
  mMoonLock.Unlock();
  mChaItOss->ResumeAll();
  return 0;
}

/**************************************************************************/
// Saturn services
/**************************************************************************/

ZHistoManager* Saturn::GetZHistoManager()
{
  if(!pZHistoManager) {
    GledNS::PushFD();
    pZHistoManager = new ZHistoManager(GForm("%s.root", mSaturnInfo->GetName()), "RECREATE");
    GledNS::PopFD();
  }
  return pZHistoManager;
}

/**************************************************************************/
// Net Stuff
/**************************************************************************/

Int_t Saturn::SockSuck()
{
  mSelector.fTimeOut = 10;
  Int_t s_stat = mSelector.Select();

  ISdebug(9, GForm("Saturn::SockSuck got %d", s_stat));
  if (s_stat <  0) return s_stat;
  if (s_stat == 0) return 0;

  for (GFdSet_i i=mSelector.fReadOut.begin(); i!=mSelector.fReadOut.end(); i++)
  {
    TSocket* s = (TSocket*) i->first;
    if (s == mServerSocket)
    {
      TSocket *newsocket = mServerSocket->Accept();
      new_connection_ti* ncti = new new_connection_ti(this, newsocket);
      GThread* at = new GThread("Saturn-Acceptor", (GThread_foo)tl_SaturnAcceptor, ncti, true);
      at->Spawn();
      continue;
    }
    try
    {
      Manage(s);
    }
    catch(Exc_t& exc)
    {
      ISerr(GForm("Saturn::SockSuck caught exception: %s", exc.Data()));
    }
  }

  return 0;
}

SaturnInfo* Saturn::FindRouteTo(SaturnInfo* target)
{
  // Finds SaturnInfo that is on-route to target.
  // Checks target's masters and if self is found, sends to
  // the previous master.
  // Otherwise it must be sent up.

  list<SaturnInfo*> t_ml;
  SaturnInfo* p = target;
  do {
    t_ml.push_back(p);
    if(p == mSaturnInfo) {
      return (*(--(--t_ml.end())));
    }
    p = p->GetMaster();
  } while(p);
  return mSaturnInfo->GetMaster();
}

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

void Saturn::AcceptWrapper(TSocket* newsocket)
{
  // Exception catching wrapper for Accept().

  static const Exc_t _eh("Saturn::AcceptWrapper ");

  if (!newsocket)
  {
    ISerr(_eh + "Accept socket failed.");
    return;
  }

  try
  {
    Accept(newsocket);
  }
  catch (Exc_t& exc)
  {
    // Perhaps should report to someone
    ISerr(_eh + " exception: " + exc.Data());
  }
}

void Saturn::Accept(TSocket* newsocket) throw(Exc_t)
{
  // Accepts connection from an Eye/Moon or handles FirstFreeID query.
  // Locks/Suspends all executions upon
  // adding fd to Selector and sending scene to the Moon.
  // Runs in a detached thread (called from tl_SaturnAcceptor) ...
  // perhaps should timeout.
  // Handles one connection at a time.

  static const Exc_t _eh("Saturn::Accept ");

  ISdebug(0, _eh + GForm("Connection from '%s'.",
		   newsocket->GetInetAddress().GetHostName()));

  // Initial handshake
  char msgbuf[256];
  int  len = snprintf(msgbuf, 256,
		      "This is Saturn \"%s\", Gled version %s (%s). Hello ...",
		      mSaturnInfo->GetName(), GLED_BUILD_VERSION, GLED_BUILD_DATE);
  if (len > 255) len = 255;
  newsocket->SendRaw(msgbuf, len);

  GSelector sel;
  sel.fRead.Add(newsocket);
  sel.fTimeOut = 60; // close connection after 60s of inactivity

  bool loop_done  = false;
  bool loop_error = false;
  TString loop_error_msg;

  while (!loop_done)
  {
    if (loop_error)
    {
      delete newsocket;
      throw _eh + loop_error_msg;
    }

    int ret = sel.Select();

    if (ret <= 0)
    {
      // do clean-up
      // make descriptive message
      TString err_msg = (ret == 0) ? "connection timeout." : "select error.";

      delete newsocket;
      throw _eh + err_msg;
    }

    TMessage* msg;
    int len = newsocket->Recv(msg);
    if (len <= 0)
    {
      delete newsocket;
      if (len == 0)
      {
	ISdebug(0, _eh +"other side closed connection.");
	return;
      }
      else
      {
	throw _eh + GForm("error receiving message (len=%d).", len);
      }
    }

    switch (msg->What())
    {
    case GledNS::MT_GledProtocol:
    {
      Int_t client_proto;
      *msg >> client_proto;
      bool compatible_p = (client_proto == s_Gled_Protocol_Version);
      TMessage reply(compatible_p ? GledNS::MT_GledProtocol :
		     GledNS::MT_ProtocolMismatch, TBuffer::kMinimalSize);
      reply << s_Gled_Protocol_Version;
      newsocket->Send(reply);
      if (!compatible_p)
      {
	loop_error = true;
	loop_error_msg = "incompatible protocols.";
      }
      break;
    }

    case GledNS::MT_QueryFFID:
    {
      ISdebug(0, _eh + "FirstFreeIDQuery: reporting.");

      ID_t wkid = mFireKing->GetSaturnID();
      TMessage m(GledNS::MT_QueryFFID);
      m << wkid;
      newsocket->Send(m);
      break;
    }

    case GledNS::MT_MEE_Connect:
    {
      ISdebug(0, _eh + "MEE_Connect ...");

      ZMirEmittingEntity* mee;
      mee = dynamic_cast<ZMirEmittingEntity*>(GledNS::StreamLens(*msg));
      if (mee == 0)
      {
	loop_error = true;
	loop_error_msg = "MEE_Connect not followed by a MirEmittingEntity.";
	break;
      }
      ISmess(_eh + GForm("MEE_Connect (type='%s', name='%s', host='%s').",
			 mee->IsA()->GetName(), mee->GetName(),
			 newsocket->GetInetAddress().GetHostName()));
      try
      {
	// Now we ask SunQueen to negotiate instantiation of the new MEE with
	// its master replica on SunAbsolute. This is done by sending over a
	// MIR and the protections on SunQueen give permissions to call this
	// functions (moon/eye creation) to some saturn identities (called
	// mooned and eyed saturns). So, we need to set this Saturn as the
	// caller.
	// SunQueen then performs the authentication with the new MEE
	// directly over a special socket.
	GThread::OwnerChanger _chown(mSaturnInfo);

	mSunQueen->handle_mee_connection(mee, newsocket);
      }
      catch(Exc_t& exc)
      {
	TMessage m(GledNS::MT_MEE_ConnectionDenied);
	m << exc;
	newsocket->Send(m);
	loop_error = true;
	loop_error_msg = exc;
	break;
      }
      loop_done = true;
      break;
    }

    case GledNS::MT_MEE_Authenticate:
    {
      ISdebug(0, _eh + "MEE_Authenticate ...");

      UInt_t conn_id;
      *msg >> conn_id;
      try
      {
	mSunQueen->handle_mee_authentication(conn_id, newsocket);
      }
      catch(Exc_t& exc)
      {
	loop_error = true;
	loop_error_msg = exc;
	break;
      }
      delete newsocket;
      loop_done = true;
      break;
    }

      // Unknown
    default:
    {
      ISdebug(0, _eh + "got unknown message ... closing connection.");
      loop_error = true;
      loop_error_msg = _eh + GForm("unknown message type %d", msg->What());
      break;
    }

    } // end switch message type

    delete msg;

  } // end top-loop

  //newsocket->SetOption(kNoBlock, 1);
}

void Saturn::finalize_moon_connection(SaturnInfo* si)
{
  static const Exc_t _eh("Saturn::finalize_moon_connection ");

  {
    TMessage m(GledNS::MT_MEE_ConnectionGranted);
    lpZGlass_t kings; mGod->CopyList(kings); kings.pop_back();
    m << si->GetSaturnID();
    m << (UInt_t) kings.size();
    mRulingLock.Lock();
    bool first = true;
    for(lpZGlass_i i=kings.begin(); i!=kings.end(); ++i) {
      ZKing* k = dynamic_cast<ZKing*>(*i);
      assert(k!=0);
      ZComet* s = k->MakeComet();
      s->Streamer(m);
      delete s;
      if(first) { // Stream also SunQueen
	s = mSunQueen->MakeComet();
	s->Streamer(m);
	delete s;
	first = false;
      }
    }
    mRulingLock.Unlock();
    si->hSocket->Send(m);
  }

  mMoonLock.Lock();
  mSelector.Lock();
  mSelector.fRead.Add(si->hSocket);
  mServerThread->Kill(GThread::SigUSR1);
  mSelector.Unlock();
  mSock2InfoHash.insert(pair<TSocket*, SocketInfo>
			(si->hSocket, SocketInfo(SocketInfo::OS_Moon, si)));
  mMoons.push_back(si);
  mSunQueen->add_reflector(si);
  si->hQueens.insert(mSunQueen);
  mMoonLock.Unlock();

  ISmess(_eh + GForm("(type='%s', name='%s', host='%s').",
		     si->IsA()->GetName(), si->GetName(),
		     si->hSocket->GetInetAddress().GetHostName()));
}

void Saturn::finalize_eye_connection(EyeInfo* ei)
{
  static const Exc_t _eh("Saturn::finalize_eye_connection ");

  {
    TMessage m(GledNS::MT_MEE_ConnectionGranted);
    m << (size_t)this << ei->GetSaturnID();
    ei->hSocket->Send(m);
  }

  mEyeLock.Lock();
  mSelector.Lock();
  mSelector.fRead.Add(ei->hSocket);
  mServerThread->Kill(GThread::SigUSR1);
  mSelector.Unlock();
  mSock2InfoHash.insert(pair<TSocket*, SocketInfo>
			(ei->hSocket, SocketInfo(SocketInfo::OS_Eye, ei)));
  mEyes.push_back(ei);
  bAcceptsRays = true;
  mEyeLock.Unlock();

  ISmess(_eh + GForm("(type='%s', name='%s', host='%s').",
		     ei->IsA()->GetName(), ei->GetName(),
		     ei->hSocket->GetInetAddress().GetHostName()));

}


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

Int_t Saturn::Manage(TSocket* sock) throw(Exc_t)
{
  static const Exc_t _eh("Saturn::Manage ");

  ISdebug(8, GForm("%sgot sth from\t%s/%s:%d", _eh.Data(),
		   sock->GetInetAddress().GetHostName(),
		   sock->GetInetAddress().GetHostAddress(),
		   sock->GetInetAddress().GetPort()));

  int len, cnt = 0;
  TMessage *m;

  while (true)
  {
  start:
    len = sock->Recv(m);

    if(len == 0) { // closed connection
      ISmess(_eh + "Recv failed w/ code 0, other side closed connection.");
      socket_closed(sock);
      break;
    }
    if(len == -1) { // error
      ISmess(_eh + "Recv failed w/ code -1. Closing connection.");
      socket_closed(sock);
      break;
    }
    // Now all sockets non-blocking ... so the following 'if' is irrelevant.
    // Would need ROOT support for a proper implementation (and several threads).
    if(len == -4) {
      ++cnt;
      cerr << _eh + "Recv failed w/ code -4, cnt="<< cnt <<endl;
      if(cnt > 10) break;
      gSystem->Sleep(100);
      goto start;
    }

    ISdebug(8, GForm("%slen=%d, type=%d", _eh.Data(), len, m->What()));

    switch(m->What())
    {
      case GledNS::MT_Flare:
      case GledNS::MT_Beam:
      {
	// Swallows the message 'm', deletes it and sets it to null.
	auto_ptr<ZMIR> mir( new ZMIR(m) );
	mir->ReadRoutingHeader();
	// Could have dedicated thread for listening to the master.
	if(!bSunAbsolute && sock == mSaturnInfo->GetMaster()->hSocket) {
	  mir->fDirection = ZMIR::D_Down;
	} else {
	  mir->fDirection = ZMIR::D_Up;
	  // These could be handled in separate threads, the first
	  // listening to saturns and the second to eyes.
	  hSock2SocketInfo_i i = mSock2InfoHash.find(sock);
	  if(i == mSock2InfoHash.end()) throw(_eh + "unknown socket");
	  switch(i->second.fWhat) {
            case SocketInfo::OS_Moon:
              // ?? Perhaps should check authenticity of caller
              break;
            case SocketInfo::OS_Eye:
              // set caller as eyes don't do that (or even if they do ...)
              mir->SetCaller( (i->second.get_eye()) );
              break;
            default:
              throw(_eh + "internal inconsistency");
	  } // switch from
	}
	RouteMIR(mir);
	break;
      }

      default:
        throw _eh + "unknown message type";

    } // switch message type

    delete m;
    break;
  } // while sock

  return 0;
}

/**************************************************************************/
// Beam results & MIR posting
/**************************************************************************/

UInt_t Saturn::register_mir_result_request(GCondition* cond)
{
  mBeamReqHandleMutex.Lock();
  UInt_t req_handle = ++mLastBeamReqHandle;
  mBeamReqHandles.insert(pair<UInt_t, mir_rr_info>(req_handle, mir_rr_info(cond)));
  mBeamReqHandleMutex.Unlock();
  return req_handle;
}

ZMIR_RR* Saturn::query_mir_result(UInt_t req_handle)
{
  ZMIR_RR* ret = 0;
  mBeamReqHandleMutex.Lock();
  hReqHandle2MirRRInfo_i req = mBeamReqHandles.find(req_handle);
  if(req != mBeamReqHandles.end() && req->second.mir_rr != 0) {
    ret = req->second.mir_rr;
    mBeamReqHandles.erase(req);
  }
  mBeamReqHandleMutex.Unlock();
  return ret;
}

void Saturn::handle_mir_result(UInt_t req_handle, ZMIR* mirp)
{
  static const Exc_t _eh("Saturn::handle_mir_result ");

  ZMIR_RR* res = new ZMIR_RR;
  *mirp >> res->fMirRRBits;
  if(res->HasException()) {
    res->fException.Streamer(*mirp);
  }
  if(res->HasResult()) {
    mirp->CopyToBuffer(*res);
    res->SetReadMode();
    res->SetBufferOffset(0);
  }

  mBeamReqHandleMutex.Lock();
  hReqHandle2MirRRInfo_i req = mBeamReqHandles.find(req_handle);
  if(req == mBeamReqHandles.end()) {
    mBeamReqHandleMutex.Unlock();
    delete res;
    throw(_eh + "unresolved beam result request handle.");
  }
  req->second.mir_rr = res;
  req->second.cond->Lock();
  req->second.cond->Signal();
  req->second.cond->Unlock();
  mBeamReqHandleMutex.Unlock();
}

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

void Saturn::markup_posted_mir(ZMIR& mir, ZMirEmittingEntity* caller)
{
  // Writes header and caller infromation.
  // If caller==0 the owner of current thread is used.

  if (mir.What() == GledNS::MT_Flare)
    mir.fDirection = ZMIR::D_Up;

  mir.SetCaller((caller==0) ? GThread::Owner() : caller);
  mir.WriteHeader();
  mir.RewindToExecHeader();
}

void Saturn::post_mir(auto_ptr<ZMIR>& mir, ZMirEmittingEntity* caller)
{
  static const Exc_t _eh("Saturn::post_mir ");

  ISdebug(8, GForm("%s entered ...", _eh.Data()));

  markup_posted_mir(*mir, caller);

  try
  {
    RouteMIR(mir);
  }
  catch(Exc_t& exc)
  {
    ISerr(_eh + "failed: " + exc);
  }
}

void Saturn::shoot_mir(auto_ptr<ZMIR>& mir, ZMirEmittingEntity* caller,
		       bool use_own_thread)
{
  // The auto_ptr<ZMIR> is released and should not be used afterwards.

  markup_posted_mir(*mir, caller);

  if (use_own_thread)
  {
    GThread* bar = new GThread("Saturn-MIRRouter",
                               (GThread_foo) (tl_MIR_Router), this,
                               true);
    bar->set_owner(caller);
    bar->set_mir(mir.release());
    bar->Spawn();
  }
  else
  {
    mMIRShootingCnd.Lock();
    mMIRShootingQueue.push_back(mir.release());
    mMIRShootingCnd.Broadcast();
    mMIRShootingCnd.Unlock();
  }
}

void Saturn::delayed_shoot_mir(auto_ptr<ZMIR>& mir, ZMirEmittingEntity* caller,
			       GTime at_time)
{
  // The auto_ptr<ZMIR> is released and should not be used afterwards.

  markup_posted_mir(*mir, caller);

  mDelayedMIRShootingCnd.Lock();
  mDelayedMIRShootingQueue.insert(pair<GTime, ZMIR*>(at_time, mir.release()));
  mDelayedMIRShootingCnd.Signal();
  mDelayedMIRShootingCnd.Unlock();
}

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

void Saturn::mir_shooter()
{
  // Routes MIRs from the ShootingQueue.
  // Every MIR is deleted after routing.

  static const Exc_t _eh("Saturn::mir_shooter ");

  while (true)
  {
    mMIRShootingCnd.Lock();
    if (mMIRShootingQueue.empty())
    {
      mMIRShootingCnd.Broadcast();
      mMIRShootingCnd.Wait();
    }
    auto_ptr<ZMIR> mir(mMIRShootingQueue.front());
    mMIRShootingQueue.pop_front();
    mMIRShootingCnd.Unlock();
    try
    {
      mMIRShooterRoutingLock.Lock();
      RouteMIR(mir);
      mMIRShooterRoutingLock.Unlock();
    }
    catch(Exc_t& exc)
    {
      ISmess(_eh + "caugt exception: " + exc);
    }
  }
}

void Saturn::delayed_mir_shooter()
{
  // Routes MIRs from the ShootingQueue.
  // Every MIR is deleted after routing.

  static const Exc_t _eh("Saturn::delayed_mir_shooter ");

  while (true)
  {
    mDelayedMIRShootingCnd.Lock();
  begin:
    if (mDelayedMIRShootingQueue.empty())
    {
      mDelayedMIRShootingCnd.Wait();
      goto begin;
    }
    mTime2MIR_i i = mDelayedMIRShootingQueue.begin();
    GTime now(GTime::I_Now);
    if (i->first > now)
    {
      int timeoutp = mDelayedMIRShootingCnd.TimedWaitUntil(i->first);
      if (! timeoutp) goto begin;
    }
    auto_ptr<ZMIR> mir(i->second);
    mDelayedMIRShootingQueue.erase(i);
    mDelayedMIRShootingCnd.Unlock();
    try
    {
      RouteMIR(mir);
    }
    catch(Exc_t& exc)
    {
      ISmess(_eh + "caugt exception: " + exc);
    }
  }
}

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

void Saturn::PostMIR(auto_ptr<ZMIR>& mir)
{
  // Routes MIR 'mir' in the current thread.
  // Usually called from Operators to publish some result.
  // 'mir' will NOT be harmed; if it is to be re-used, do:
  //  mir.RewindToMIR() prior to posting it again.

  post_mir(mir, 0);
}

void Saturn::PostMIR(ZMIR* mir)
{
  // Routes a MIR in the current thread.
  // Wrapper for the variant with auto_ptr argument.

  auto_ptr<ZMIR> apmir(mir);
  post_mir(apmir, 0);
  apmir.release();
}

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


void Saturn::ShootMIR(auto_ptr<ZMIR>& mir, bool use_own_thread)
{
  // Accepts a MIR and shoots it into the system.
  // The auto_ptr<ZMIR> is released and should not be used afterwards.

  shoot_mir(mir, 0, use_own_thread);
}

void Saturn::ShootMIR(ZMIR* mir, bool use_own_thread)
{
  // Accepts a MIR and shoots it into the system.
  // Wrapper for the variant with auto_ptr argument.

  auto_ptr<ZMIR> apmir(mir);
  shoot_mir(apmir, 0, use_own_thread);
}

void Saturn::DelayedShootMIR(auto_ptr<ZMIR>& mir, GTime at_time)
{
  // Accepts a MIR and shoots it into the system.
  // The auto_ptr<ZMIR> is released and should not be used afterwards.

  delayed_shoot_mir(mir, 0, at_time);
}

void Saturn::DelayedShootMIR(ZMIR* mir, GTime at_time)
{
  // Accepts a MIR and shoots it into the system.
  // Wrapper for the variant with auto_ptr argument.

  auto_ptr<ZMIR> apmir(mir);
  delayed_shoot_mir(apmir, 0, at_time);
}

ZMIR_RR* Saturn::ShootMIRWaitResult(auto_ptr<ZMIR>& mir, bool use_own_thread)
{
  // Accepts a MIR, shoots it into the system and waits for ResultReport.
  // The auto_ptr<ZMIR> is released and should not be used afterwards.

  GCondition result_cond(GMutex::recursive);
  UInt_t req_handle = register_mir_result_request(&result_cond);
  mir->SetResultReq(mSaturnInfo, req_handle);

  result_cond.Lock();
  shoot_mir(mir, 0, use_own_thread);
  result_cond.Wait(); // !!!! timed-wait
  result_cond.Unlock();

  return query_mir_result(req_handle);
}

ZMIR_RR* Saturn::ShootMIRWaitResult(ZMIR* mir, bool use_own_thread)
{
  // Accepts a MIR, shoots it into the system and waits for ResultReport.
  // Wrapper for the variant with auto_ptr argument.

  auto_ptr<ZMIR> apmir(mir);
  return ShootMIRWaitResult(apmir, use_own_thread);
}

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

// sub function doing the actual construction ... and sending.
// otherwise will have three shitty stuffy

void Saturn::generick_shoot_mir_result(ZMIR& mir, const Text_t* exc, TBuffer* buf)
{
  SaturnInfo* ret_addr = mir.fResultRecipient;
  if(ret_addr == 0) return;

  UChar_t bits = 0;
  if(exc) bits |= ZMIR_RR::B_HasException;
  if(buf) bits |= ZMIR_RR::B_HasResult;

  auto_ptr<ZMIR> result( ret_addr->S_ReceiveBeamResult(mir.fResultReqHandle) );
  *result << bits;
  if(exc) {
    TString s(exc);
    s.Streamer(*result);
  }
  if(buf) {
    result->AppendBuffer(*buf);
  }

  result->SetRecipient(ret_addr);
  result->SetCaller(ret_addr); // The result pretends to be coming come from the caller itself
  result->WriteHeader(); result->RewindToExecHeader();
  mMIRShootingCnd.Lock();
  mMIRShootingQueue.push_back(result.release());
  mMIRShootingCnd.Signal();
  mMIRShootingCnd.Unlock();
  mir.fRequiresResult = false;
}

void Saturn::ShootMIRResult(TBuffer& b)
{
  // Makes a result MIR and sends it to the caller Saturn.
  // Should be called from a method called via a MIR (flare OR beam)
  // containing a result request.

  ZMIR* mir = GThread::MIR();
  if(mir != 0 && mir->fRequiresResult) {
    generick_shoot_mir_result(*mir, 0, &b);
  }
}

/**************************************************************************/
// MIR handling
/**************************************************************************/

void Saturn::report_mir_pre_demangling_error(ZMIR& mir, TString error)
{
  static const Exc_t _eh("Saturn::report_mir_pre_demangling_error ");

  ISerr(error);

  mir.fCaller = dynamic_cast<ZMirEmittingEntity*>(DemangleID(mir.fCallerID));
  if(mir.fCaller != 0) {
    auto_ptr<ZMIR> err( mir.fCaller->S_Error( error.Data()) );
    err->SetRecipient(mir.fCaller->HostingSaturn());
    ShootMIR(err);
    // Here could also add entry into local log.
  } else {
    ISerr(_eh + GForm("could not notify caller id=%u", mir.fCallerID));
  }

  // The following is equivalent to ZMIR::DemangleResultRecipient(this).
  if(mir.HasResultReq()) {
    mir.fResultRecipient = dynamic_cast<SaturnInfo*>(DemangleID(mir.fResultRecipientID));
    if(mir.fResultRecipient) {
      generick_shoot_mir_result(mir, error.Data(), 0);
    } else {
      ISerr(_eh + GForm("could not damangle&notify result recipient id=%u", mir.fResultRecipientID));
    }
  }
}

void Saturn::report_mir_post_demangling_error(ZMIR& mir, TString error)
{
  static const Exc_t _eh("Saturn::report_mir_post_demangling_error ");

  ISerr(error);

  if(mir.fCaller != 0) {
    auto_ptr<ZMIR> err( mir.fCaller->S_Error(error.Data()) );
    err->SetRecipient(mir.fCaller->HostingSaturn());
    ShootMIR(err);
  } else {
    ISerr(_eh + GForm("could not notify caller id=%u", mir.fCallerID));
  }

  if(mir.fRequiresResult) {
    generick_shoot_mir_result(mir, error.Data(), 0);
  }
}

//--------------------------------------------------------------------------

void Saturn::RouteMIR(auto_ptr<ZMIR>& mir) throw()
{
  // Decides what to do with a MIR ... and does it.

  static const Exc_t _eh("Saturn::RouteMIR ");

  ISdebug(8, GForm("%s entered ...", _eh.Data()));

  if(mir->fAlphaID == 0)
    throw _eh + "AlphaID is zero!";

  switch(mir->What())
  {
    case GledNS::MT_Flare:
    {
      switch (mir->fDirection)
      {
	case ZMIR::D_Up:
	  if(mir->fAlphaID < mKing->GetSaturnID()) {
	    // This could in principle break if the connection has just been lost.
	    // But this is catastrophic anyway.
	    ForwardMIR(*mir, mSaturnInfo->GetMaster());
	  } else {
	    UnfoldMIR(mir);
	  }
	  break;
	case ZMIR::D_Down:
	  UnfoldMIR(mir);
	  break;
	default:
	  ISerr(_eh + "unknown direction of a flare.");
	  break;
      }
      break;
    }

    case GledNS::MT_Beam:
    {
      try
      {
	if (mir->fRecipientID == 0 || mir->fRecipientID == mSaturnInfo->GetSaturnID())
	{
	  mir->fRecipient = mSaturnInfo;
	  UnfoldMIR(mir);
	}
	else
	{
	  mir->fRecipient = dynamic_cast<SaturnInfo*>(DemangleID(mir->fRecipientID));
	  if (mir->fRecipient == 0)
	    throw _eh + "can't demangle recipient of a beam.";

	  SaturnInfo* route = mir->fRecipient->hRoute;
	  if (route == 0)
	  {
	    route = FindRouteTo(mir->fRecipient);
	    if (route == 0 || route->hSocket == 0)
	      throw _eh + "no route to recipient.";
	    mir->fRecipient->hRoute = route;
	  }

	  ForwardMIR(*mir, route);
	}
      }
      catch(Exc_t& exc) {
	report_mir_pre_demangling_error(*mir, exc);
      }
      break;
    }

    default:
      ISerr(_eh + "unknown message type. Ignoring.");
  }
}

void Saturn::UnfoldMIR(auto_ptr<ZMIR>& mir) throw()
{
  // Prepares MIR for execution, does checks, proper broadcasting
  // and the execution itself.
  // Message type should be MT_Beam or MT_Flare.

  static const Exc_t _eh("Saturn::UnfoldMIR ");

  ISdebug(8, GForm("%s entered ...", _eh.Data()));

  bool is_shared_space;    // if shared_space and flare => mir should be broadcasted
  bool is_flare = (mir->What() == GledNS::MT_Flare);

  bool is_moon_space = false;
  bool is_sun_space  = false;
  // bool is_fire_space = false; // not used

  if (mir->fAlphaID < mKing->GetSaturnID())
  {
    is_shared_space = true;
    is_moon_space   = true;
  }
  else if (mir->fAlphaID >= mKing->GetSaturnID() &&
	   mir->fAlphaID <= mKing->GetMaxID())
  {
    is_shared_space = true;
    is_sun_space    = true;
  }
  else if (mir->fAlphaID >= mFireKing->GetSaturnID() &&
	   mir->fAlphaID <= mFireKing->GetMaxID())
  {
    is_shared_space = false;
    // is_fire_space   = true;
  }
  else
  {
    report_mir_pre_demangling_error(*mir, _eh + "lens ID out of range.");
    return;
  }

  if (mir->HasResultReq())
  {
    if ((!is_flare || (is_flare && is_sun_space)))
    {
      try {
	mir->DemangleResultRecipient(this);
      }
      catch(Exc_t& exc) {
	report_mir_pre_demangling_error(*mir, _eh + "could not demangle result recipient.");
	return;
      }
      mir->fRequiresResult = true;
    }
  }

  try
  {
    mir->ReadExecHeader();
    mir->Demangle(this);
  }
  catch(Exc_t& exc)
  {
    report_mir_pre_demangling_error(*mir, _eh + "context demangling error: " + exc);
    return;
  }

  ZKing      *king     = mir->fAlpha->GetQueen()->GetKing();
  bool        is_king  = (king == mir->fAlpha);
  bool        is_ruler = false;
  MIR_Priest *priest   = 0;
  ZGlass     *ruler    = 0;

  lpSaturnInfo_t *reflectors = 0;

  if (is_king)
  {
    is_ruler   = true;
    priest     = king;
    reflectors = &mMoons;
    ruler      = king;
  }
  else
  {
    ZQueen *queen = mir->fAlpha->GetQueen();
    is_ruler   = (mir->fAlpha == queen);
    priest     = queen;
    reflectors = &(queen->mReflectors);
    ruler      = queen;
  }

  try
  {
    if (is_flare)
    {
      if (is_moon_space)
      {
	BroadcastMIR(*mir, *reflectors);
	if(mir->ShouldExeDetached()) {
	  ExecDetachedMIR(mir);
	} else {
	  if(is_ruler) { GMutexHolder rulerGMH(mRulingLock); ExecMIR(mir); }
	  else         { ExecMIR(mir); }
	}
      }
      else
      {
	{ GMutexHolder blessGMH(ruler->mReadMutex); priest->BlessMIR(*mir); }
	if(mir->ShouldExeDetached()) {
	  if(is_shared_space && mir->IsDetachedExeMultix()) {
	    BroadcastMIR(*mir, *reflectors);
	  }
	  ExecDetachedMIR(mir);
	} else {
	  if(is_ruler) { GMutexHolder rulerGMH(mRulingLock); ExecMIR(mir); }
	  else         { ExecMIR(mir); }
	  if(is_shared_space && mir->fSuppressFlareBroadcast == false) {
	    BroadcastMIR(*mir, *reflectors);
	  }
	  if(mir->fRequiresResult) generick_shoot_mir_result(*mir, 0, 0);
	}

      }
    }
    else // it's a beam
    {
      {
	GMutexHolder blessGMH(ruler->mReadMutex);
	priest->BlessMIR(*mir);
      }
      if (mir->ShouldExeDetached())
      {
	ExecDetachedMIR(mir);
      }
      else
      {
	if (is_ruler) {
	  GMutexHolder rulerGMH(mRulingLock);
	  ExecMIR(mir);
	} else {
	  ExecMIR(mir);
	}
	if (mir->fRequiresResult) generick_shoot_mir_result(*mir, 0, 0);
      }

    }
  }
  catch(Exc_t& exc) {
    report_mir_post_demangling_error(*mir, _eh + "processing failed: " + exc);
    return;
  }
  catch(TString str) {
    printf("Jebo TString exception: '%s'\n", str.Data());
    return;
  }
  catch(exception& exc) {
    printf("Jebo std::exception: '%s'\n", exc.what());
    return;
  }
  catch(...) {
    printf("Jebo unknown exception. This looks bad.\n");
    throw;
  }
}

void Saturn::ExecMIR(ZMIR* mir, bool lockp)
{
  static const Exc_t _eh("Saturn::ExecMIR ");

  ISdebug(8, GForm("%sentered ...", _eh.Data()));

  if (mir->IsWriting()) mir->RewindToData();

  GledNS::LibSetInfo* lsi = GledNS::FindLibSetInfo(mir->fLid);
  if (lsi == 0)
    throw _eh + GForm("can't demangle lib ID=%u.", (unsigned int) mir->fLid);

  ZGlass *lens = mir->fAlpha;

  GThread::OwnerChanger _chown(mir->fCaller);
  GThread::MIRChanger   _chmor(mir);

  auto_ptr<GLensWriteHolder> _wlck(lockp ? new GLensWriteHolder(lens) : 0);

  (lsi->fLME_Foo)(lens, *mir);
}

void Saturn::ExecMIR(auto_ptr<ZMIR>& mir, bool lockp)
{
  // Wrapper with auto_ptr argument.
  //
  // This is the preferred entry point but the variant taking plain
  // ZMIR* is also needed for execution of MIRs in detached threads
  // that can be potentially cancelled.

  ExecMIR(mir.get(), lockp);
}

void Saturn::ExecDetachedMIR(auto_ptr<ZMIR>& mir)
{
  // This function spawns a thread that calls ExecMIR().
  // mir is released and deleted at thread completition.

  Int_t nice = mir->fAlpha->DetachedThreadNice(mir.get());

  // Created joinable with detach-on-exit flag, so that it can be canceled and
  // joined while runnung via Freeze().
  GThread* bar = new GThread("Saturn-MirDetachedExec",
                             (GThread_foo) (tl_MIR_DetachedExecutor), this,
                             false, true);
  bar->set_owner(mir->fCaller);
  bar->set_mir(mir.release());
  bar->SetNice(nice);
  bar->CleanupPush((GThread_cu_foo) tl_MIR_DetachedCleanUp, this);
  bar->Spawn();
}

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

void Saturn::ForwardMIR(ZMIR& mir, SaturnInfo* route)
{
  // Forwards a MIR to Saturn given by route.

  static const Exc_t _eh("Saturn::ForwardMIR ");

  ISdebug(8, GForm("%s entered ...", _eh.Data()));

  assert(route->hSocket != 0);
  bool is_reading = mir.IsReading();
  if(is_reading) mir.Forward();
  bool upwards_p = (route == mSaturnInfo->GetMaster());
  if(upwards_p) mMasterLock.Lock(); else mMoonLock.Lock();

  // cout <<"Saturn::ForwardMIR routing to "<< route->GetName() <<endl;
  Int_t ret = route->hSocket->Send(mir);
  // cout <<"Saturn::ForwardMIR ret="<< ret <<endl;
  if(ret == -1) socket_closed(route->hSocket);

  if(upwards_p) mMasterLock.Unlock(); else mMoonLock.Unlock();
  if(is_reading) mir.RewindToData();

  if(ret == -1) throw(_eh + "connection just closed.");
}

void Saturn::BroadcastMIR(ZMIR& mir, lpSaturnInfo_t& moons)
{
  // Broadcasts MIR to reflecting Moons specified in socks.

  static const Exc_t _eh("Saturn::BroadcastMIR() ");

  ISdebug(9, GForm("%s entered.", _eh.Data()));

  if(moons.empty()) return;
  bool was_reading = mir.IsReading();
  if(was_reading) mir.Forward();
  mMoonLock.Lock();
  ISdebug(9, GForm("Saturn::BroadcastMIR sending to %d moon(s)", moons.size()));
  lpSaturnInfo_i i = moons.begin();
  while(i != moons.end()) {
    if((*i)->hSocket) {
      Int_t ret = (*i)->hSocket->Send(mir);
      lpSaturnInfo_i j = i++;
      if(ret < 0) {
	// Should be more gracefull !!!!?
	wipe_moon(*j, true);
      }
    }
  }
  mMoonLock.Unlock();
  if(was_reading) mir.RewindToData();
}

void Saturn::BroadcastBeamMIR(ZMIR& mir, lpSaturnInfo_t& moons)
{
  // Broadcasts MIR to reflecting Moons specified in socks.
  // Specifically sets each SaturnInfo to be the recipient.

  static const Exc_t _eh("Saturn::BroadcastMIR ");

  if(moons.empty()) return;
  bool was_reading = mir.IsReading();
  if(was_reading) mir.Forward();
  mMoonLock.Lock();
  ISdebug(10, _eh + GForm("sending to %d moon(s).", moons.size()));
  lpSaturnInfo_i i = moons.begin();
  while(i != moons.end()) {
    if((*i)->hSocket) {
      mir.SetRecipient(*i);
      Int_t ret = (*i)->hSocket->Send(mir);
      lpSaturnInfo_i j = i++;
      if(ret < 0) {
	// Should be more gracefull !!!!
	wipe_moon(*j, true);
      }
    }
  }
  mMoonLock.Unlock();
  if(was_reading) mir.RewindToData();
}

/**************************************************************************/
// Ray handling ... viewer notifications.
/**************************************************************************/

void Saturn::ray_emitter()
{
  // Emits Rays from the EmittingQueue.
  // Every MIR is deleted after routing.

  static const Exc_t _eh("Saturn::ray_emitter ");

  while (true)
  {
    mRayEmittingCnd.Lock();
    if (mRayEmittingQueue.empty())
      mRayEmittingCnd.Wait();

    RayQueueEntry_t rqe = mRayEmittingQueue.front();
    mRayEmittingQueue.pop_front();
    mRayEmittingCnd.Unlock();

    mEyeLock.Lock();

    ISdebug(10, _eh + GForm("notifying %d eye(s).", rqe.second->size()));
    rqe.first->SetRefCnt(rqe.second->size());

    EyeInfoVector::iterator i = rqe.second->begin();
    while (i != rqe.second->end())
    {
      if ((*i)->hSocket != 0)
      {
	ssize_t len = send((*i)->hSocket->GetDescriptor(), &rqe.first, sizeof(Ray*), 0);
	if (len != sizeof(Ray*))
	{
	  ISerr(_eh + GForm("sent too little: Eye=%s, exp_len=%3d, ret=%3d.",
			    (*i)->GetName(), sizeof(Ray*), len));
	}
	if (len < 0)
	{
	  wipe_eye(*i, true);
	}
      }
      else
      {
	rqe.first->DecRefCnt();
      }
      ++i;
    }
    mEyeLock.Unlock();
  }
}

void Saturn::Shine(auto_ptr<Ray>& ray, EyeInfoVector* eiv)
{
  GMutexHolder raw_lock(mRayEmittingCnd);
  if(!bAcceptsRays) return;
  eiv->IncRefCnt();
  mRayEmittingQueue.push_back(make_pair(ray.release(), eiv));
  mRayEmittingCnd.Signal();
}


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

/**************************************************************************/
// Protected & less pleasant
/**************************************************************************/

int Saturn::start_threads(Saturn* saturn)
{
  // A thread function to spawn off server thread and shooter threads.
  // Needed to ensure that most signals are blocked.
  // Termination policy for these threads is set to system-exit.
  // This is called from Create() or Connect() which in turn is usually called
  // from a CINT script -- and that thread has several system signals
  // unblocked.

  GThread::BlockAllSignals();
  GThread::UnblockCpuExceptionSignals(true);

  GThread::Self()->SetTerminalPolicy(GThread::TP_SysExit);

  return saturn->start_server() || saturn->start_shooters();
}

int Saturn::create_server_socket()
{
  static const Exc_t _eh("Saturn::create_server_socket ");

  int try_count = 0;
open_server_socket:
  int serv_port = mSaturnInfo->GetServerPort();
  mServerSocket = new TServerSocket(serv_port, kTRUE, 4);
  if ( ! mServerSocket->IsValid())
  {
    if (++try_count <= mSaturnInfo->GetServPortScan())
    {
      delete mServerSocket;
      mServerSocket = 0;
      ISwarn(GForm("%sfailed opening server socket at port %d. Trying %d.",
		   _eh.Data(), serv_port, serv_port + 1));
      mSaturnInfo->SetServerPort(serv_port + 1);
      goto open_server_socket;
    }
    int err = 10 - mServerSocket->GetErrorCode();
    ISerr(_eh +"can not create server socket ... giving up.");
    return err;
  }

  ISdebug(2, GForm("%sregistering server socket at port=%d", _eh.Data(),
		   mSaturnInfo->GetServerPort()));

  mSelector.Lock();
  mSelector.fRead.Add(mServerSocket);
  mServerThread->Kill(GThread::SigUSR1);
  mSelector.Unlock();

  return 0;
}

int Saturn::start_server()
{
  static const Exc_t _eh("Saturn::start_server ");

  mServerThread = new GThread("Saturn-FdSucker", (GThread_foo)tl_SaturnFdSucker, this, false);
  if (mServerThread->Spawn())
  {
    ISerr(GForm("%scan not create server thread ... giving up. errno=%d",
		_eh.Data(), errno));
    return 1;
  }
  ISdebug(2, _eh + "started server thread.");
  return 0;
}

int Saturn::stop_server()
{
  if (mSaturnInfo == 0) return 0;

  if (mServerThread) {
    mServerThread->Cancel();
    mServerThread->Join();
    delete mServerThread;
    mServerThread = 0;
  }

  if (mServerSocket) {
    mServerSocket->Close();
    delete mServerSocket;
    mServerSocket = 0;
  }

  // Need some locking here ?!!
  if (!bSunAbsolute && mSaturnInfo->GetMaster()) {
    mSaturnInfo->GetMaster()->hSocket->Close();
  }
  for (lpEyeInfo_i ei=mEyes.begin(); ei!=mEyes.end(); ++ei) {
    (*ei)->hSocket->Close();
  }
  for (lpSaturnInfo_i si=mMoons.begin(); si!=mMoons.end(); ++si) {
    (*si)->hSocket->Close();
  }

  return 0;
}

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

int Saturn::start_shooters()
{
  static const Exc_t _eh("Saturn::start_shooters ");

  mMIRShootingThread = new GThread("Saturn-MIRShooter",
                                   (GThread_foo) tl_MIR_Shooter, this,
                                   false);
  if (mMIRShootingThread->Spawn())
  {
    ISerr(GForm("%scould not create a MirShooter thread ... dying (errno=%d).",
		_eh.Data(), errno));
    return 1;
  }
  ISdebug(2, _eh + "started MirShooter thread.");

  mDelayedMIRShootingThread = new GThread("Saturn-DelayedMIRShooter",
                                          (GThread_foo) tl_Delayed_MIR_Shooter, this,
                                          false);
  if (mDelayedMIRShootingThread->Spawn())
  {
    ISerr(GForm("%scould not create a DelayedMirShooter thread (errno=%d).",
		_eh.Data(), errno));
    return 1;
  }
  ISdebug(2, _eh + "started DelayedMirShooter thread.");

  mRayEmittingThread = new GThread("Saturn-RayEmitter",
                                   (GThread_foo) tl_Ray_Emitter, this,
                                   false);
  if (mRayEmittingThread->Spawn())
  {
    ISerr(GForm("%scould not create a RayEmitting thread (errno=%d).",
		_eh.Data(), errno));
    return 1;
  }
  ISdebug(2, _eh + "started RayEmitting thread.");

  return 0;
}

int Saturn::stop_shooters()
{
  if (mMIRShootingThread)
  {
    mMIRShootingThread->Cancel();
    mMIRShootingThread->Join();
    delete mMIRShootingThread;
    mMIRShootingThread = 0;
  }

  if (mDelayedMIRShootingThread)
  {
    mDelayedMIRShootingThread->Cancel();
    mDelayedMIRShootingThread->Join();
    delete mDelayedMIRShootingThread;
    mDelayedMIRShootingThread = 0;
  }

  if (mRayEmittingThread)
  {
    {
      GMutexHolder ray_lock(mRayEmittingCnd);
      bAcceptsRays = false;
    }
    mRayEmittingThread->Cancel();
    mRayEmittingThread->Join();
    delete mRayEmittingThread;
    mRayEmittingThread = 0;
  }

  return 0;
}

int Saturn::stop_detached_threads()
{
  // Stop all detached threads.

  static const Exc_t _eh("Saturn::stop_detached_threads ");

  bool yield = false;
  
  while (true)
  {
    if (yield)
    {
      GThread::Yield();
      yield = false;
    }
    DetachedThreadInfo dti;
    {
      GMutexHolder _lck(mDetachedMirMutex);
      if (mDetachedThreadsList.empty())
      {
	return 0;
      }
      dti = mDetachedThreadsList.back();
      if (dti.fThread->ClearDetachOnExit() == false)
      {
	// We caught the thread in its last breath, yield cpu before next
	// attempt (but get out of lock first).
	yield = true;
	continue;
      }
    }

    cancel_and_join_thread(dti.fLens, dti.fThread);
  }
}

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

void Saturn::socket_closed(TSocket* sock)
{
  if(!bSunAbsolute && sock == mSaturnInfo->GetMaster()->hSocket) {
    // Here should take some drastic measures.
    // Retake sun control ... or sth.
    // For now die miserably ...
    assert(123==321);
    return;
  }

  hSock2SocketInfo_i i = mSock2InfoHash.find(sock);
  if(i == mSock2InfoHash.end()) {
    ISerr("Saturn::WipeMoonOrEye can't find socket ...");
    return;
  }
  switch(i->second.fWhat) {
  case SocketInfo::OS_Moon:
    wipe_moon(i->second.get_moon(), true);
    break;
  case SocketInfo::OS_Eye: {
    wipe_eye(i->second.get_eye(), true);
    break;
  }
  default: {
    ISerr("Saturn::WipeMoonOrEye unknown socket ID ...");
  }
  } // switch
}

void Saturn::wipe_moon(SaturnInfo* moon, bool notify_sunqueen_p)
{
  // Removes moon from list of moons and notifies the SunQueen if
  // notify_sunqueen_p is true.
  // Also removes the moon from all queens that are reflecting to it.

  static const Exc_t _eh("Saturn::wipe_moon ");

  ISmess(GForm("%sclosing connection for Moon %s", _eh.Data(), moon->GetName()));
  if(moon->hSocket == 0) {
    // Hmmpsh ... shouldn't really happen ... or just maybe.
    ISmess(_eh + "socket already wiped ... stalling");
    return;
  }

  mMoonLock.Lock();

  mSelector.Lock();
  if(mServerThread) mServerThread->Kill(GThread::SigUSR1);
  mSelector.fRead.Remove(moon->hSocket);
  mSelector.Unlock();

  hSock2SocketInfo_i h = mSock2InfoHash.find(moon->hSocket);
  if(h != mSock2InfoHash.end()) {
    mSock2InfoHash.erase(h);
  } else {
    ISerr(GForm("%smoon %s not found in hash", _eh.Data(), moon->GetName()));
  }

  lpSaturnInfo_i l = find(mMoons.begin(), mMoons.end(), moon);
  if(l != mMoons.end()) {
    mMoons.erase(l);
  } else {
    ISerr(GForm("%s moon %s not found in list", _eh.Data(), moon->GetName()));
  }
  for(SaturnInfo::spZQueen_i q=moon->hQueens.begin(); q!=moon->hQueens.end(); ++q) {
    (*q)->remove_reflector(moon);
  }

  delete moon->hSocket; moon->hSocket = 0;
  moon->hRoute = 0; moon->hQueens.clear();

  mMoonLock.Unlock();

  if(notify_sunqueen_p) {
    auto_ptr<ZMIR> mir( mSunQueen->S_CremateMoon(moon) );
    mir->SetCaller(mSaturnInfo);
    mir->SetRecipient(mSunInfo);
    mir->WriteHeader(); mir->RewindToExecHeader();
    RouteMIR(mir);
  }
}

void Saturn::wipe_eye(EyeInfo* eye, bool notify_sunqueen_p)
{
  static const Exc_t _eh("Saturn::wipe_eye ");

  ISmess(_eh + GForm("Closing connection for Eye %s.", eye->GetName()));
  if (eye->hSocket == 0)
  {
    // Hmmpsh ... shouldn't really happen ... or just maybe.
    ISmess(_eh + "Socket already closed ... nothing to do.");
    return;
  }

  mEyeLock.Lock();

  if (mServerThread) mServerThread->Kill(GThread::SigUSR1);
  mSelector.Lock();
  mSelector.fRead.Remove(eye->hSocket);
  mSelector.Unlock();

  hSock2SocketInfo_i h = mSock2InfoHash.find(eye->hSocket);
  if (h != mSock2InfoHash.end()) {
    mSock2InfoHash.erase(h);
  } else {
    ISerr(_eh + GForm("eye '%s' not found in socket-hash.", eye->GetName()));
  }

  lpEyeInfo_i l = find(mEyes.begin(), mEyes.end(), eye);
  if (l != mEyes.end()) {
    mEyes.erase(l);
  } else {
    ISerr(_eh + GForm("eye '%s' not found in eye-list.", eye->GetName()));
  }
  delete eye->hSocket; eye->hSocket = 0;

  if (mEyes.empty())
    bAcceptsRays = false;
  mEyeLock.Unlock();

  if (notify_sunqueen_p)
  {
    auto_ptr<ZMIR> mir( mSunQueen->S_CremateEye(eye) );
    mir->SetCaller(mSaturnInfo);
    mir->SetRecipient(mSunKing->mSaturnInfo.get());
    mir->WriteHeader(); mir->RewindToExecHeader();
    RouteMIR(mir);
  }
}

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

void Saturn::fix_fire_king_id(SaturnInfo* si)
{
  if(si->mSunSpaceSize == 0 || (si->mKingID + si->mSunSpaceSize) < si->mKingID) {
    si->mSunSpaceSize = ID_t(-1) - si->mKingID;
    si->mSunSpaceSize >>= 3;
  }
  si->mFireKingID = si->mKingID + si->mSunSpaceSize;
  ISmess(GForm("Saturn::fix_fire_king_id sun_space(beg=%5.3f siz=%5.3f) "
	       "fire-space: beg=%5.3f siz=%5.3f",
	       double(si->mKingID)/ID_t(-1),
	       double(si->mFireKingID - si->mKingID)/ID_t(-1),
	       double(si->mFireKingID)/ID_t(-1),
	       double(ID_t(-1) - si->mFireKingID)/ID_t(-1)));
}

void Saturn::create_kings(const char* king, const char* whore_king)
{
  // Local King
  mKing = new ZKing(mSaturnInfo->mKingID + 1, mSaturnInfo->mFireKingID - 1,
		    king);
  mKing->mSaturnInfo = mSaturnInfo;
  mKing->mLightType = ZKing::LT_Sun;
  Enlight(mKing, mSaturnInfo->mKingID);
  mGod->Add(mKing);

  // Fire King
  mFireKing = new ZFireKing(mSaturnInfo->mFireKingID + 1, MAX_ID-1, whore_king);
  mFireKing->mSaturnInfo = mSaturnInfo;
  mFireKing->mLightType = ZKing::LT_Fire;
  Enlight(mFireKing, mSaturnInfo->mFireKingID);
  mGod->Add(mFireKing);
  mFireQueen = new ZFireQueen(1024, "FireQueen", "Enchantress of ChaOss");
  mFireKing->Enthrone(mFireQueen);
  mFireQueen->SetMapNoneTo(ZMirFilter::R_Allow);
  mFireQueen->bFollowDeps = true; // !!! This is a wicked trick.
}

void Saturn::arrival_of_kings(TMessage* m)
{
  ID_t satinfo_id = GledNS::ReadLensID(*m);
  UInt_t nk; *m >> nk;
  ISmess(GForm("Saturn::arrival_of_kings %d king(s), len=%d",
	       nk, m->BufferSize()));
  for(UInt_t i=0; i<nk; ++i) {
    ZComet c;
    c.Streamer(*m);
    c.RebuildGraph();
    ZKing* k = c.GetKing();
    assert(k!=0);
    Reflect(k);
    k->mLightType = ZKing::LT_Moon;
    lpZGlass_t queens; k->CopyList(queens);
    for(lpZGlass_i j=queens.begin(); j!=queens.end(); ++j) {
      ZQueen* q = dynamic_cast<ZQueen*>(*j);
      assert(q!=0);
      q->mKing = k;
      Reflect(q); q->mQueen = q;
      Reflect(q->mDeps.get()); q->mDeps->mQueen = q;
    }
    k->reference_all();
    for(lpZGlass_i j=queens.begin(); j!=queens.end(); ++j) {
      ZQueen* q = dynamic_cast<ZQueen*>(*j);
      q->reference_all();
      q->mDeps->reference_all();
    }

    if(i == 0) { // This was SunKing and SunQueen is following.
      mSunKing  = k;
      mSunQueen = dynamic_cast<ZSunQueen*>(queens.front());
      assert(mSunQueen!=0);

      //ZComet t; t.Streamer(*m);
      //t.SetExtDemangler(this);
      //t.RebuildGraph();
      //mSunQueen->UnfoldFrom(t);
      mSunQueen->InvokeReflection(*m);

      mSaturnInfo = dynamic_cast<SaturnInfo*>(DemangleID(satinfo_id));
      assert(mSaturnInfo != 0);
      // Fix mSunInfo and SunKing's SaturnInfo pointer
      mSunInfo = mSunQueen->mSunInfo.get();
      mSunKing->SetSaturnInfo(mSunInfo);
      assert(mSunInfo != 0);
    }
    mGod->Add(k);
  }
}

/**************************************************************************/
 Saturn.cxx:1
 Saturn.cxx:2
 Saturn.cxx:3
 Saturn.cxx:4
 Saturn.cxx:5
 Saturn.cxx:6
 Saturn.cxx:7
 Saturn.cxx:8
 Saturn.cxx:9
 Saturn.cxx:10
 Saturn.cxx:11
 Saturn.cxx:12
 Saturn.cxx:13
 Saturn.cxx:14
 Saturn.cxx:15
 Saturn.cxx:16
 Saturn.cxx:17
 Saturn.cxx:18
 Saturn.cxx:19
 Saturn.cxx:20
 Saturn.cxx:21
 Saturn.cxx:22
 Saturn.cxx:23
 Saturn.cxx:24
 Saturn.cxx:25
 Saturn.cxx:26
 Saturn.cxx:27
 Saturn.cxx:28
 Saturn.cxx:29
 Saturn.cxx:30
 Saturn.cxx:31
 Saturn.cxx:32
 Saturn.cxx:33
 Saturn.cxx:34
 Saturn.cxx:35
 Saturn.cxx:36
 Saturn.cxx:37
 Saturn.cxx:38
 Saturn.cxx:39
 Saturn.cxx:40
 Saturn.cxx:41
 Saturn.cxx:42
 Saturn.cxx:43
 Saturn.cxx:44
 Saturn.cxx:45
 Saturn.cxx:46
 Saturn.cxx:47
 Saturn.cxx:48
 Saturn.cxx:49
 Saturn.cxx:50
 Saturn.cxx:51
 Saturn.cxx:52
 Saturn.cxx:53
 Saturn.cxx:54
 Saturn.cxx:55
 Saturn.cxx:56
 Saturn.cxx:57
 Saturn.cxx:58
 Saturn.cxx:59
 Saturn.cxx:60
 Saturn.cxx:61
 Saturn.cxx:62
 Saturn.cxx:63
 Saturn.cxx:64
 Saturn.cxx:65
 Saturn.cxx:66
 Saturn.cxx:67
 Saturn.cxx:68
 Saturn.cxx:69
 Saturn.cxx:70
 Saturn.cxx:71
 Saturn.cxx:72
 Saturn.cxx:73
 Saturn.cxx:74
 Saturn.cxx:75
 Saturn.cxx:76
 Saturn.cxx:77
 Saturn.cxx:78
 Saturn.cxx:79
 Saturn.cxx:80
 Saturn.cxx:81
 Saturn.cxx:82
 Saturn.cxx:83
 Saturn.cxx:84
 Saturn.cxx:85
 Saturn.cxx:86
 Saturn.cxx:87
 Saturn.cxx:88
 Saturn.cxx:89
 Saturn.cxx:90
 Saturn.cxx:91
 Saturn.cxx:92
 Saturn.cxx:93
 Saturn.cxx:94
 Saturn.cxx:95
 Saturn.cxx:96
 Saturn.cxx:97
 Saturn.cxx:98
 Saturn.cxx:99
 Saturn.cxx:100
 Saturn.cxx:101
 Saturn.cxx:102
 Saturn.cxx:103
 Saturn.cxx:104
 Saturn.cxx:105
 Saturn.cxx:106
 Saturn.cxx:107
 Saturn.cxx:108
 Saturn.cxx:109
 Saturn.cxx:110
 Saturn.cxx:111
 Saturn.cxx:112
 Saturn.cxx:113
 Saturn.cxx:114
 Saturn.cxx:115
 Saturn.cxx:116
 Saturn.cxx:117
 Saturn.cxx:118
 Saturn.cxx:119
 Saturn.cxx:120
 Saturn.cxx:121
 Saturn.cxx:122
 Saturn.cxx:123
 Saturn.cxx:124
 Saturn.cxx:125
 Saturn.cxx:126
 Saturn.cxx:127
 Saturn.cxx:128
 Saturn.cxx:129
 Saturn.cxx:130
 Saturn.cxx:131
 Saturn.cxx:132
 Saturn.cxx:133
 Saturn.cxx:134
 Saturn.cxx:135
 Saturn.cxx:136
 Saturn.cxx:137
 Saturn.cxx:138
 Saturn.cxx:139
 Saturn.cxx:140
 Saturn.cxx:141
 Saturn.cxx:142
 Saturn.cxx:143
 Saturn.cxx:144
 Saturn.cxx:145
 Saturn.cxx:146
 Saturn.cxx:147
 Saturn.cxx:148
 Saturn.cxx:149
 Saturn.cxx:150
 Saturn.cxx:151
 Saturn.cxx:152
 Saturn.cxx:153
 Saturn.cxx:154
 Saturn.cxx:155
 Saturn.cxx:156
 Saturn.cxx:157
 Saturn.cxx:158
 Saturn.cxx:159
 Saturn.cxx:160
 Saturn.cxx:161
 Saturn.cxx:162
 Saturn.cxx:163
 Saturn.cxx:164
 Saturn.cxx:165
 Saturn.cxx:166
 Saturn.cxx:167
 Saturn.cxx:168
 Saturn.cxx:169
 Saturn.cxx:170
 Saturn.cxx:171
 Saturn.cxx:172
 Saturn.cxx:173
 Saturn.cxx:174
 Saturn.cxx:175
 Saturn.cxx:176
 Saturn.cxx:177
 Saturn.cxx:178
 Saturn.cxx:179
 Saturn.cxx:180
 Saturn.cxx:181
 Saturn.cxx:182
 Saturn.cxx:183
 Saturn.cxx:184
 Saturn.cxx:185
 Saturn.cxx:186
 Saturn.cxx:187
 Saturn.cxx:188
 Saturn.cxx:189
 Saturn.cxx:190
 Saturn.cxx:191
 Saturn.cxx:192
 Saturn.cxx:193
 Saturn.cxx:194
 Saturn.cxx:195
 Saturn.cxx:196
 Saturn.cxx:197
 Saturn.cxx:198
 Saturn.cxx:199
 Saturn.cxx:200
 Saturn.cxx:201
 Saturn.cxx:202
 Saturn.cxx:203
 Saturn.cxx:204
 Saturn.cxx:205
 Saturn.cxx:206
 Saturn.cxx:207
 Saturn.cxx:208
 Saturn.cxx:209
 Saturn.cxx:210
 Saturn.cxx:211
 Saturn.cxx:212
 Saturn.cxx:213
 Saturn.cxx:214
 Saturn.cxx:215
 Saturn.cxx:216
 Saturn.cxx:217
 Saturn.cxx:218
 Saturn.cxx:219
 Saturn.cxx:220
 Saturn.cxx:221
 Saturn.cxx:222
 Saturn.cxx:223
 Saturn.cxx:224
 Saturn.cxx:225
 Saturn.cxx:226
 Saturn.cxx:227
 Saturn.cxx:228
 Saturn.cxx:229
 Saturn.cxx:230
 Saturn.cxx:231
 Saturn.cxx:232
 Saturn.cxx:233
 Saturn.cxx:234
 Saturn.cxx:235
 Saturn.cxx:236
 Saturn.cxx:237
 Saturn.cxx:238
 Saturn.cxx:239
 Saturn.cxx:240
 Saturn.cxx:241
 Saturn.cxx:242
 Saturn.cxx:243
 Saturn.cxx:244
 Saturn.cxx:245
 Saturn.cxx:246
 Saturn.cxx:247
 Saturn.cxx:248
 Saturn.cxx:249
 Saturn.cxx:250
 Saturn.cxx:251
 Saturn.cxx:252
 Saturn.cxx:253
 Saturn.cxx:254
 Saturn.cxx:255
 Saturn.cxx:256
 Saturn.cxx:257
 Saturn.cxx:258
 Saturn.cxx:259
 Saturn.cxx:260
 Saturn.cxx:261
 Saturn.cxx:262
 Saturn.cxx:263
 Saturn.cxx:264
 Saturn.cxx:265
 Saturn.cxx:266
 Saturn.cxx:267
 Saturn.cxx:268
 Saturn.cxx:269
 Saturn.cxx:270
 Saturn.cxx:271
 Saturn.cxx:272
 Saturn.cxx:273
 Saturn.cxx:274
 Saturn.cxx:275
 Saturn.cxx:276
 Saturn.cxx:277
 Saturn.cxx:278
 Saturn.cxx:279
 Saturn.cxx:280
 Saturn.cxx:281
 Saturn.cxx:282
 Saturn.cxx:283
 Saturn.cxx:284
 Saturn.cxx:285
 Saturn.cxx:286
 Saturn.cxx:287
 Saturn.cxx:288
 Saturn.cxx:289
 Saturn.cxx:290
 Saturn.cxx:291
 Saturn.cxx:292
 Saturn.cxx:293
 Saturn.cxx:294
 Saturn.cxx:295
 Saturn.cxx:296
 Saturn.cxx:297
 Saturn.cxx:298
 Saturn.cxx:299
 Saturn.cxx:300
 Saturn.cxx:301
 Saturn.cxx:302
 Saturn.cxx:303
 Saturn.cxx:304
 Saturn.cxx:305
 Saturn.cxx:306
 Saturn.cxx:307
 Saturn.cxx:308
 Saturn.cxx:309
 Saturn.cxx:310
 Saturn.cxx:311
 Saturn.cxx:312
 Saturn.cxx:313
 Saturn.cxx:314
 Saturn.cxx:315
 Saturn.cxx:316
 Saturn.cxx:317
 Saturn.cxx:318
 Saturn.cxx:319
 Saturn.cxx:320
 Saturn.cxx:321
 Saturn.cxx:322
 Saturn.cxx:323
 Saturn.cxx:324
 Saturn.cxx:325
 Saturn.cxx:326
 Saturn.cxx:327
 Saturn.cxx:328
 Saturn.cxx:329
 Saturn.cxx:330
 Saturn.cxx:331
 Saturn.cxx:332
 Saturn.cxx:333
 Saturn.cxx:334
 Saturn.cxx:335
 Saturn.cxx:336
 Saturn.cxx:337
 Saturn.cxx:338
 Saturn.cxx:339
 Saturn.cxx:340
 Saturn.cxx:341
 Saturn.cxx:342
 Saturn.cxx:343
 Saturn.cxx:344
 Saturn.cxx:345
 Saturn.cxx:346
 Saturn.cxx:347
 Saturn.cxx:348
 Saturn.cxx:349
 Saturn.cxx:350
 Saturn.cxx:351
 Saturn.cxx:352
 Saturn.cxx:353
 Saturn.cxx:354
 Saturn.cxx:355
 Saturn.cxx:356
 Saturn.cxx:357
 Saturn.cxx:358
 Saturn.cxx:359
 Saturn.cxx:360
 Saturn.cxx:361
 Saturn.cxx:362
 Saturn.cxx:363
 Saturn.cxx:364
 Saturn.cxx:365
 Saturn.cxx:366
 Saturn.cxx:367
 Saturn.cxx:368
 Saturn.cxx:369
 Saturn.cxx:370
 Saturn.cxx:371
 Saturn.cxx:372
 Saturn.cxx:373
 Saturn.cxx:374
 Saturn.cxx:375
 Saturn.cxx:376
 Saturn.cxx:377
 Saturn.cxx:378
 Saturn.cxx:379
 Saturn.cxx:380
 Saturn.cxx:381
 Saturn.cxx:382
 Saturn.cxx:383
 Saturn.cxx:384
 Saturn.cxx:385
 Saturn.cxx:386
 Saturn.cxx:387
 Saturn.cxx:388
 Saturn.cxx:389
 Saturn.cxx:390
 Saturn.cxx:391
 Saturn.cxx:392
 Saturn.cxx:393
 Saturn.cxx:394
 Saturn.cxx:395
 Saturn.cxx:396
 Saturn.cxx:397
 Saturn.cxx:398
 Saturn.cxx:399
 Saturn.cxx:400
 Saturn.cxx:401
 Saturn.cxx:402
 Saturn.cxx:403
 Saturn.cxx:404
 Saturn.cxx:405
 Saturn.cxx:406
 Saturn.cxx:407
 Saturn.cxx:408
 Saturn.cxx:409
 Saturn.cxx:410
 Saturn.cxx:411
 Saturn.cxx:412
 Saturn.cxx:413
 Saturn.cxx:414
 Saturn.cxx:415
 Saturn.cxx:416
 Saturn.cxx:417
 Saturn.cxx:418
 Saturn.cxx:419
 Saturn.cxx:420
 Saturn.cxx:421
 Saturn.cxx:422
 Saturn.cxx:423
 Saturn.cxx:424
 Saturn.cxx:425
 Saturn.cxx:426
 Saturn.cxx:427
 Saturn.cxx:428
 Saturn.cxx:429
 Saturn.cxx:430
 Saturn.cxx:431
 Saturn.cxx:432
 Saturn.cxx:433
 Saturn.cxx:434
 Saturn.cxx:435
 Saturn.cxx:436
 Saturn.cxx:437
 Saturn.cxx:438
 Saturn.cxx:439
 Saturn.cxx:440
 Saturn.cxx:441
 Saturn.cxx:442
 Saturn.cxx:443
 Saturn.cxx:444
 Saturn.cxx:445
 Saturn.cxx:446
 Saturn.cxx:447
 Saturn.cxx:448
 Saturn.cxx:449
 Saturn.cxx:450
 Saturn.cxx:451
 Saturn.cxx:452
 Saturn.cxx:453
 Saturn.cxx:454
 Saturn.cxx:455
 Saturn.cxx:456
 Saturn.cxx:457
 Saturn.cxx:458
 Saturn.cxx:459
 Saturn.cxx:460
 Saturn.cxx:461
 Saturn.cxx:462
 Saturn.cxx:463
 Saturn.cxx:464
 Saturn.cxx:465
 Saturn.cxx:466
 Saturn.cxx:467
 Saturn.cxx:468
 Saturn.cxx:469
 Saturn.cxx:470
 Saturn.cxx:471
 Saturn.cxx:472
 Saturn.cxx:473
 Saturn.cxx:474
 Saturn.cxx:475
 Saturn.cxx:476
 Saturn.cxx:477
 Saturn.cxx:478
 Saturn.cxx:479
 Saturn.cxx:480
 Saturn.cxx:481
 Saturn.cxx:482
 Saturn.cxx:483
 Saturn.cxx:484
 Saturn.cxx:485
 Saturn.cxx:486
 Saturn.cxx:487
 Saturn.cxx:488
 Saturn.cxx:489
 Saturn.cxx:490
 Saturn.cxx:491
 Saturn.cxx:492
 Saturn.cxx:493
 Saturn.cxx:494
 Saturn.cxx:495
 Saturn.cxx:496
 Saturn.cxx:497
 Saturn.cxx:498
 Saturn.cxx:499
 Saturn.cxx:500
 Saturn.cxx:501
 Saturn.cxx:502
 Saturn.cxx:503
 Saturn.cxx:504
 Saturn.cxx:505
 Saturn.cxx:506
 Saturn.cxx:507
 Saturn.cxx:508
 Saturn.cxx:509
 Saturn.cxx:510
 Saturn.cxx:511
 Saturn.cxx:512
 Saturn.cxx:513
 Saturn.cxx:514
 Saturn.cxx:515
 Saturn.cxx:516
 Saturn.cxx:517
 Saturn.cxx:518
 Saturn.cxx:519
 Saturn.cxx:520
 Saturn.cxx:521
 Saturn.cxx:522
 Saturn.cxx:523
 Saturn.cxx:524
 Saturn.cxx:525
 Saturn.cxx:526
 Saturn.cxx:527
 Saturn.cxx:528
 Saturn.cxx:529
 Saturn.cxx:530
 Saturn.cxx:531
 Saturn.cxx:532
 Saturn.cxx:533
 Saturn.cxx:534
 Saturn.cxx:535
 Saturn.cxx:536
 Saturn.cxx:537
 Saturn.cxx:538
 Saturn.cxx:539
 Saturn.cxx:540
 Saturn.cxx:541
 Saturn.cxx:542
 Saturn.cxx:543
 Saturn.cxx:544
 Saturn.cxx:545
 Saturn.cxx:546
 Saturn.cxx:547
 Saturn.cxx:548
 Saturn.cxx:549
 Saturn.cxx:550
 Saturn.cxx:551
 Saturn.cxx:552
 Saturn.cxx:553
 Saturn.cxx:554
 Saturn.cxx:555
 Saturn.cxx:556
 Saturn.cxx:557
 Saturn.cxx:558
 Saturn.cxx:559
 Saturn.cxx:560
 Saturn.cxx:561
 Saturn.cxx:562
 Saturn.cxx:563
 Saturn.cxx:564
 Saturn.cxx:565
 Saturn.cxx:566
 Saturn.cxx:567
 Saturn.cxx:568
 Saturn.cxx:569
 Saturn.cxx:570
 Saturn.cxx:571
 Saturn.cxx:572
 Saturn.cxx:573
 Saturn.cxx:574
 Saturn.cxx:575
 Saturn.cxx:576
 Saturn.cxx:577
 Saturn.cxx:578
 Saturn.cxx:579
 Saturn.cxx:580
 Saturn.cxx:581
 Saturn.cxx:582
 Saturn.cxx:583
 Saturn.cxx:584
 Saturn.cxx:585
 Saturn.cxx:586
 Saturn.cxx:587
 Saturn.cxx:588
 Saturn.cxx:589
 Saturn.cxx:590
 Saturn.cxx:591
 Saturn.cxx:592
 Saturn.cxx:593
 Saturn.cxx:594
 Saturn.cxx:595
 Saturn.cxx:596
 Saturn.cxx:597
 Saturn.cxx:598
 Saturn.cxx:599
 Saturn.cxx:600
 Saturn.cxx:601
 Saturn.cxx:602
 Saturn.cxx:603
 Saturn.cxx:604
 Saturn.cxx:605
 Saturn.cxx:606
 Saturn.cxx:607
 Saturn.cxx:608
 Saturn.cxx:609
 Saturn.cxx:610
 Saturn.cxx:611
 Saturn.cxx:612
 Saturn.cxx:613
 Saturn.cxx:614
 Saturn.cxx:615
 Saturn.cxx:616
 Saturn.cxx:617
 Saturn.cxx:618
 Saturn.cxx:619
 Saturn.cxx:620
 Saturn.cxx:621
 Saturn.cxx:622
 Saturn.cxx:623
 Saturn.cxx:624
 Saturn.cxx:625
 Saturn.cxx:626
 Saturn.cxx:627
 Saturn.cxx:628
 Saturn.cxx:629
 Saturn.cxx:630
 Saturn.cxx:631
 Saturn.cxx:632
 Saturn.cxx:633
 Saturn.cxx:634
 Saturn.cxx:635
 Saturn.cxx:636
 Saturn.cxx:637
 Saturn.cxx:638
 Saturn.cxx:639
 Saturn.cxx:640
 Saturn.cxx:641
 Saturn.cxx:642
 Saturn.cxx:643
 Saturn.cxx:644
 Saturn.cxx:645
 Saturn.cxx:646
 Saturn.cxx:647
 Saturn.cxx:648
 Saturn.cxx:649
 Saturn.cxx:650
 Saturn.cxx:651
 Saturn.cxx:652
 Saturn.cxx:653
 Saturn.cxx:654
 Saturn.cxx:655
 Saturn.cxx:656
 Saturn.cxx:657
 Saturn.cxx:658
 Saturn.cxx:659
 Saturn.cxx:660
 Saturn.cxx:661
 Saturn.cxx:662
 Saturn.cxx:663
 Saturn.cxx:664
 Saturn.cxx:665
 Saturn.cxx:666
 Saturn.cxx:667
 Saturn.cxx:668
 Saturn.cxx:669
 Saturn.cxx:670
 Saturn.cxx:671
 Saturn.cxx:672
 Saturn.cxx:673
 Saturn.cxx:674
 Saturn.cxx:675
 Saturn.cxx:676
 Saturn.cxx:677
 Saturn.cxx:678
 Saturn.cxx:679
 Saturn.cxx:680
 Saturn.cxx:681
 Saturn.cxx:682
 Saturn.cxx:683
 Saturn.cxx:684
 Saturn.cxx:685
 Saturn.cxx:686
 Saturn.cxx:687
 Saturn.cxx:688
 Saturn.cxx:689
 Saturn.cxx:690
 Saturn.cxx:691
 Saturn.cxx:692
 Saturn.cxx:693
 Saturn.cxx:694
 Saturn.cxx:695
 Saturn.cxx:696
 Saturn.cxx:697
 Saturn.cxx:698
 Saturn.cxx:699
 Saturn.cxx:700
 Saturn.cxx:701
 Saturn.cxx:702
 Saturn.cxx:703
 Saturn.cxx:704
 Saturn.cxx:705
 Saturn.cxx:706
 Saturn.cxx:707
 Saturn.cxx:708
 Saturn.cxx:709
 Saturn.cxx:710
 Saturn.cxx:711
 Saturn.cxx:712
 Saturn.cxx:713
 Saturn.cxx:714
 Saturn.cxx:715
 Saturn.cxx:716
 Saturn.cxx:717
 Saturn.cxx:718
 Saturn.cxx:719
 Saturn.cxx:720
 Saturn.cxx:721
 Saturn.cxx:722
 Saturn.cxx:723
 Saturn.cxx:724
 Saturn.cxx:725
 Saturn.cxx:726
 Saturn.cxx:727
 Saturn.cxx:728
 Saturn.cxx:729
 Saturn.cxx:730
 Saturn.cxx:731
 Saturn.cxx:732
 Saturn.cxx:733
 Saturn.cxx:734
 Saturn.cxx:735
 Saturn.cxx:736
 Saturn.cxx:737
 Saturn.cxx:738
 Saturn.cxx:739
 Saturn.cxx:740
 Saturn.cxx:741
 Saturn.cxx:742
 Saturn.cxx:743
 Saturn.cxx:744
 Saturn.cxx:745
 Saturn.cxx:746
 Saturn.cxx:747
 Saturn.cxx:748
 Saturn.cxx:749
 Saturn.cxx:750
 Saturn.cxx:751
 Saturn.cxx:752
 Saturn.cxx:753
 Saturn.cxx:754
 Saturn.cxx:755
 Saturn.cxx:756
 Saturn.cxx:757
 Saturn.cxx:758
 Saturn.cxx:759
 Saturn.cxx:760
 Saturn.cxx:761
 Saturn.cxx:762
 Saturn.cxx:763
 Saturn.cxx:764
 Saturn.cxx:765
 Saturn.cxx:766
 Saturn.cxx:767
 Saturn.cxx:768
 Saturn.cxx:769
 Saturn.cxx:770
 Saturn.cxx:771
 Saturn.cxx:772
 Saturn.cxx:773
 Saturn.cxx:774
 Saturn.cxx:775
 Saturn.cxx:776
 Saturn.cxx:777
 Saturn.cxx:778
 Saturn.cxx:779
 Saturn.cxx:780
 Saturn.cxx:781
 Saturn.cxx:782
 Saturn.cxx:783
 Saturn.cxx:784
 Saturn.cxx:785
 Saturn.cxx:786
 Saturn.cxx:787
 Saturn.cxx:788
 Saturn.cxx:789
 Saturn.cxx:790
 Saturn.cxx:791
 Saturn.cxx:792
 Saturn.cxx:793
 Saturn.cxx:794
 Saturn.cxx:795
 Saturn.cxx:796
 Saturn.cxx:797
 Saturn.cxx:798
 Saturn.cxx:799
 Saturn.cxx:800
 Saturn.cxx:801
 Saturn.cxx:802
 Saturn.cxx:803
 Saturn.cxx:804
 Saturn.cxx:805
 Saturn.cxx:806
 Saturn.cxx:807
 Saturn.cxx:808
 Saturn.cxx:809
 Saturn.cxx:810
 Saturn.cxx:811
 Saturn.cxx:812
 Saturn.cxx:813
 Saturn.cxx:814
 Saturn.cxx:815
 Saturn.cxx:816
 Saturn.cxx:817
 Saturn.cxx:818
 Saturn.cxx:819
 Saturn.cxx:820
 Saturn.cxx:821
 Saturn.cxx:822
 Saturn.cxx:823
 Saturn.cxx:824
 Saturn.cxx:825
 Saturn.cxx:826
 Saturn.cxx:827
 Saturn.cxx:828
 Saturn.cxx:829
 Saturn.cxx:830
 Saturn.cxx:831
 Saturn.cxx:832
 Saturn.cxx:833
 Saturn.cxx:834
 Saturn.cxx:835
 Saturn.cxx:836
 Saturn.cxx:837
 Saturn.cxx:838
 Saturn.cxx:839
 Saturn.cxx:840
 Saturn.cxx:841
 Saturn.cxx:842
 Saturn.cxx:843
 Saturn.cxx:844
 Saturn.cxx:845
 Saturn.cxx:846
 Saturn.cxx:847
 Saturn.cxx:848
 Saturn.cxx:849
 Saturn.cxx:850
 Saturn.cxx:851
 Saturn.cxx:852
 Saturn.cxx:853
 Saturn.cxx:854
 Saturn.cxx:855
 Saturn.cxx:856
 Saturn.cxx:857
 Saturn.cxx:858
 Saturn.cxx:859
 Saturn.cxx:860
 Saturn.cxx:861
 Saturn.cxx:862
 Saturn.cxx:863
 Saturn.cxx:864
 Saturn.cxx:865
 Saturn.cxx:866
 Saturn.cxx:867
 Saturn.cxx:868
 Saturn.cxx:869
 Saturn.cxx:870
 Saturn.cxx:871
 Saturn.cxx:872
 Saturn.cxx:873
 Saturn.cxx:874
 Saturn.cxx:875
 Saturn.cxx:876
 Saturn.cxx:877
 Saturn.cxx:878
 Saturn.cxx:879
 Saturn.cxx:880
 Saturn.cxx:881
 Saturn.cxx:882
 Saturn.cxx:883
 Saturn.cxx:884
 Saturn.cxx:885
 Saturn.cxx:886
 Saturn.cxx:887
 Saturn.cxx:888
 Saturn.cxx:889
 Saturn.cxx:890
 Saturn.cxx:891
 Saturn.cxx:892
 Saturn.cxx:893
 Saturn.cxx:894
 Saturn.cxx:895
 Saturn.cxx:896
 Saturn.cxx:897
 Saturn.cxx:898
 Saturn.cxx:899
 Saturn.cxx:900
 Saturn.cxx:901
 Saturn.cxx:902
 Saturn.cxx:903
 Saturn.cxx:904
 Saturn.cxx:905
 Saturn.cxx:906
 Saturn.cxx:907
 Saturn.cxx:908
 Saturn.cxx:909
 Saturn.cxx:910
 Saturn.cxx:911
 Saturn.cxx:912
 Saturn.cxx:913
 Saturn.cxx:914
 Saturn.cxx:915
 Saturn.cxx:916
 Saturn.cxx:917
 Saturn.cxx:918
 Saturn.cxx:919
 Saturn.cxx:920
 Saturn.cxx:921
 Saturn.cxx:922
 Saturn.cxx:923
 Saturn.cxx:924
 Saturn.cxx:925
 Saturn.cxx:926
 Saturn.cxx:927
 Saturn.cxx:928
 Saturn.cxx:929
 Saturn.cxx:930
 Saturn.cxx:931
 Saturn.cxx:932
 Saturn.cxx:933
 Saturn.cxx:934
 Saturn.cxx:935
 Saturn.cxx:936
 Saturn.cxx:937
 Saturn.cxx:938
 Saturn.cxx:939
 Saturn.cxx:940
 Saturn.cxx:941
 Saturn.cxx:942
 Saturn.cxx:943
 Saturn.cxx:944
 Saturn.cxx:945
 Saturn.cxx:946
 Saturn.cxx:947
 Saturn.cxx:948
 Saturn.cxx:949
 Saturn.cxx:950
 Saturn.cxx:951
 Saturn.cxx:952
 Saturn.cxx:953
 Saturn.cxx:954
 Saturn.cxx:955
 Saturn.cxx:956
 Saturn.cxx:957
 Saturn.cxx:958
 Saturn.cxx:959
 Saturn.cxx:960
 Saturn.cxx:961
 Saturn.cxx:962
 Saturn.cxx:963
 Saturn.cxx:964
 Saturn.cxx:965
 Saturn.cxx:966
 Saturn.cxx:967
 Saturn.cxx:968
 Saturn.cxx:969
 Saturn.cxx:970
 Saturn.cxx:971
 Saturn.cxx:972
 Saturn.cxx:973
 Saturn.cxx:974
 Saturn.cxx:975
 Saturn.cxx:976
 Saturn.cxx:977
 Saturn.cxx:978
 Saturn.cxx:979
 Saturn.cxx:980
 Saturn.cxx:981
 Saturn.cxx:982
 Saturn.cxx:983
 Saturn.cxx:984
 Saturn.cxx:985
 Saturn.cxx:986
 Saturn.cxx:987
 Saturn.cxx:988
 Saturn.cxx:989
 Saturn.cxx:990
 Saturn.cxx:991
 Saturn.cxx:992
 Saturn.cxx:993
 Saturn.cxx:994
 Saturn.cxx:995
 Saturn.cxx:996
 Saturn.cxx:997
 Saturn.cxx:998
 Saturn.cxx:999
 Saturn.cxx:1000
 Saturn.cxx:1001
 Saturn.cxx:1002
 Saturn.cxx:1003
 Saturn.cxx:1004
 Saturn.cxx:1005
 Saturn.cxx:1006
 Saturn.cxx:1007
 Saturn.cxx:1008
 Saturn.cxx:1009
 Saturn.cxx:1010
 Saturn.cxx:1011
 Saturn.cxx:1012
 Saturn.cxx:1013
 Saturn.cxx:1014
 Saturn.cxx:1015
 Saturn.cxx:1016
 Saturn.cxx:1017
 Saturn.cxx:1018
 Saturn.cxx:1019
 Saturn.cxx:1020
 Saturn.cxx:1021
 Saturn.cxx:1022
 Saturn.cxx:1023
 Saturn.cxx:1024
 Saturn.cxx:1025
 Saturn.cxx:1026
 Saturn.cxx:1027
 Saturn.cxx:1028
 Saturn.cxx:1029
 Saturn.cxx:1030
 Saturn.cxx:1031
 Saturn.cxx:1032
 Saturn.cxx:1033
 Saturn.cxx:1034
 Saturn.cxx:1035
 Saturn.cxx:1036
 Saturn.cxx:1037
 Saturn.cxx:1038
 Saturn.cxx:1039
 Saturn.cxx:1040
 Saturn.cxx:1041
 Saturn.cxx:1042
 Saturn.cxx:1043
 Saturn.cxx:1044
 Saturn.cxx:1045
 Saturn.cxx:1046
 Saturn.cxx:1047
 Saturn.cxx:1048
 Saturn.cxx:1049
 Saturn.cxx:1050
 Saturn.cxx:1051
 Saturn.cxx:1052
 Saturn.cxx:1053
 Saturn.cxx:1054
 Saturn.cxx:1055
 Saturn.cxx:1056
 Saturn.cxx:1057
 Saturn.cxx:1058
 Saturn.cxx:1059
 Saturn.cxx:1060
 Saturn.cxx:1061
 Saturn.cxx:1062
 Saturn.cxx:1063
 Saturn.cxx:1064
 Saturn.cxx:1065
 Saturn.cxx:1066
 Saturn.cxx:1067
 Saturn.cxx:1068
 Saturn.cxx:1069
 Saturn.cxx:1070
 Saturn.cxx:1071
 Saturn.cxx:1072
 Saturn.cxx:1073
 Saturn.cxx:1074
 Saturn.cxx:1075
 Saturn.cxx:1076
 Saturn.cxx:1077
 Saturn.cxx:1078
 Saturn.cxx:1079
 Saturn.cxx:1080
 Saturn.cxx:1081
 Saturn.cxx:1082
 Saturn.cxx:1083
 Saturn.cxx:1084
 Saturn.cxx:1085
 Saturn.cxx:1086
 Saturn.cxx:1087
 Saturn.cxx:1088
 Saturn.cxx:1089
 Saturn.cxx:1090
 Saturn.cxx:1091
 Saturn.cxx:1092
 Saturn.cxx:1093
 Saturn.cxx:1094
 Saturn.cxx:1095
 Saturn.cxx:1096
 Saturn.cxx:1097
 Saturn.cxx:1098
 Saturn.cxx:1099
 Saturn.cxx:1100
 Saturn.cxx:1101
 Saturn.cxx:1102
 Saturn.cxx:1103
 Saturn.cxx:1104
 Saturn.cxx:1105
 Saturn.cxx:1106
 Saturn.cxx:1107
 Saturn.cxx:1108
 Saturn.cxx:1109
 Saturn.cxx:1110
 Saturn.cxx:1111
 Saturn.cxx:1112
 Saturn.cxx:1113
 Saturn.cxx:1114
 Saturn.cxx:1115
 Saturn.cxx:1116
 Saturn.cxx:1117
 Saturn.cxx:1118
 Saturn.cxx:1119
 Saturn.cxx:1120
 Saturn.cxx:1121
 Saturn.cxx:1122
 Saturn.cxx:1123
 Saturn.cxx:1124
 Saturn.cxx:1125
 Saturn.cxx:1126
 Saturn.cxx:1127
 Saturn.cxx:1128
 Saturn.cxx:1129
 Saturn.cxx:1130
 Saturn.cxx:1131
 Saturn.cxx:1132
 Saturn.cxx:1133
 Saturn.cxx:1134
 Saturn.cxx:1135
 Saturn.cxx:1136
 Saturn.cxx:1137
 Saturn.cxx:1138
 Saturn.cxx:1139
 Saturn.cxx:1140
 Saturn.cxx:1141
 Saturn.cxx:1142
 Saturn.cxx:1143
 Saturn.cxx:1144
 Saturn.cxx:1145
 Saturn.cxx:1146
 Saturn.cxx:1147
 Saturn.cxx:1148
 Saturn.cxx:1149
 Saturn.cxx:1150
 Saturn.cxx:1151
 Saturn.cxx:1152
 Saturn.cxx:1153
 Saturn.cxx:1154
 Saturn.cxx:1155
 Saturn.cxx:1156
 Saturn.cxx:1157
 Saturn.cxx:1158
 Saturn.cxx:1159
 Saturn.cxx:1160
 Saturn.cxx:1161
 Saturn.cxx:1162
 Saturn.cxx:1163
 Saturn.cxx:1164
 Saturn.cxx:1165
 Saturn.cxx:1166
 Saturn.cxx:1167
 Saturn.cxx:1168
 Saturn.cxx:1169
 Saturn.cxx:1170
 Saturn.cxx:1171
 Saturn.cxx:1172
 Saturn.cxx:1173
 Saturn.cxx:1174
 Saturn.cxx:1175
 Saturn.cxx:1176
 Saturn.cxx:1177
 Saturn.cxx:1178
 Saturn.cxx:1179
 Saturn.cxx:1180
 Saturn.cxx:1181
 Saturn.cxx:1182
 Saturn.cxx:1183
 Saturn.cxx:1184
 Saturn.cxx:1185
 Saturn.cxx:1186
 Saturn.cxx:1187
 Saturn.cxx:1188
 Saturn.cxx:1189
 Saturn.cxx:1190
 Saturn.cxx:1191
 Saturn.cxx:1192
 Saturn.cxx:1193
 Saturn.cxx:1194
 Saturn.cxx:1195
 Saturn.cxx:1196
 Saturn.cxx:1197
 Saturn.cxx:1198
 Saturn.cxx:1199
 Saturn.cxx:1200
 Saturn.cxx:1201
 Saturn.cxx:1202
 Saturn.cxx:1203
 Saturn.cxx:1204
 Saturn.cxx:1205
 Saturn.cxx:1206
 Saturn.cxx:1207
 Saturn.cxx:1208
 Saturn.cxx:1209
 Saturn.cxx:1210
 Saturn.cxx:1211
 Saturn.cxx:1212
 Saturn.cxx:1213
 Saturn.cxx:1214
 Saturn.cxx:1215
 Saturn.cxx:1216
 Saturn.cxx:1217
 Saturn.cxx:1218
 Saturn.cxx:1219
 Saturn.cxx:1220
 Saturn.cxx:1221
 Saturn.cxx:1222
 Saturn.cxx:1223
 Saturn.cxx:1224
 Saturn.cxx:1225
 Saturn.cxx:1226
 Saturn.cxx:1227
 Saturn.cxx:1228
 Saturn.cxx:1229
 Saturn.cxx:1230
 Saturn.cxx:1231
 Saturn.cxx:1232
 Saturn.cxx:1233
 Saturn.cxx:1234
 Saturn.cxx:1235
 Saturn.cxx:1236
 Saturn.cxx:1237
 Saturn.cxx:1238
 Saturn.cxx:1239
 Saturn.cxx:1240
 Saturn.cxx:1241
 Saturn.cxx:1242
 Saturn.cxx:1243
 Saturn.cxx:1244
 Saturn.cxx:1245
 Saturn.cxx:1246
 Saturn.cxx:1247
 Saturn.cxx:1248
 Saturn.cxx:1249
 Saturn.cxx:1250
 Saturn.cxx:1251
 Saturn.cxx:1252
 Saturn.cxx:1253
 Saturn.cxx:1254
 Saturn.cxx:1255
 Saturn.cxx:1256
 Saturn.cxx:1257
 Saturn.cxx:1258
 Saturn.cxx:1259
 Saturn.cxx:1260
 Saturn.cxx:1261
 Saturn.cxx:1262
 Saturn.cxx:1263
 Saturn.cxx:1264
 Saturn.cxx:1265
 Saturn.cxx:1266
 Saturn.cxx:1267
 Saturn.cxx:1268
 Saturn.cxx:1269
 Saturn.cxx:1270
 Saturn.cxx:1271
 Saturn.cxx:1272
 Saturn.cxx:1273
 Saturn.cxx:1274
 Saturn.cxx:1275
 Saturn.cxx:1276
 Saturn.cxx:1277
 Saturn.cxx:1278
 Saturn.cxx:1279
 Saturn.cxx:1280
 Saturn.cxx:1281
 Saturn.cxx:1282
 Saturn.cxx:1283
 Saturn.cxx:1284
 Saturn.cxx:1285
 Saturn.cxx:1286
 Saturn.cxx:1287
 Saturn.cxx:1288
 Saturn.cxx:1289
 Saturn.cxx:1290
 Saturn.cxx:1291
 Saturn.cxx:1292
 Saturn.cxx:1293
 Saturn.cxx:1294
 Saturn.cxx:1295
 Saturn.cxx:1296
 Saturn.cxx:1297
 Saturn.cxx:1298
 Saturn.cxx:1299
 Saturn.cxx:1300
 Saturn.cxx:1301
 Saturn.cxx:1302
 Saturn.cxx:1303
 Saturn.cxx:1304
 Saturn.cxx:1305
 Saturn.cxx:1306
 Saturn.cxx:1307
 Saturn.cxx:1308
 Saturn.cxx:1309
 Saturn.cxx:1310
 Saturn.cxx:1311
 Saturn.cxx:1312
 Saturn.cxx:1313
 Saturn.cxx:1314
 Saturn.cxx:1315
 Saturn.cxx:1316
 Saturn.cxx:1317
 Saturn.cxx:1318
 Saturn.cxx:1319
 Saturn.cxx:1320
 Saturn.cxx:1321
 Saturn.cxx:1322
 Saturn.cxx:1323
 Saturn.cxx:1324
 Saturn.cxx:1325
 Saturn.cxx:1326
 Saturn.cxx:1327
 Saturn.cxx:1328
 Saturn.cxx:1329
 Saturn.cxx:1330
 Saturn.cxx:1331
 Saturn.cxx:1332
 Saturn.cxx:1333
 Saturn.cxx:1334
 Saturn.cxx:1335
 Saturn.cxx:1336
 Saturn.cxx:1337
 Saturn.cxx:1338
 Saturn.cxx:1339
 Saturn.cxx:1340
 Saturn.cxx:1341
 Saturn.cxx:1342
 Saturn.cxx:1343
 Saturn.cxx:1344
 Saturn.cxx:1345
 Saturn.cxx:1346
 Saturn.cxx:1347
 Saturn.cxx:1348
 Saturn.cxx:1349
 Saturn.cxx:1350
 Saturn.cxx:1351
 Saturn.cxx:1352
 Saturn.cxx:1353
 Saturn.cxx:1354
 Saturn.cxx:1355
 Saturn.cxx:1356
 Saturn.cxx:1357
 Saturn.cxx:1358
 Saturn.cxx:1359
 Saturn.cxx:1360
 Saturn.cxx:1361
 Saturn.cxx:1362
 Saturn.cxx:1363
 Saturn.cxx:1364
 Saturn.cxx:1365
 Saturn.cxx:1366
 Saturn.cxx:1367
 Saturn.cxx:1368
 Saturn.cxx:1369
 Saturn.cxx:1370
 Saturn.cxx:1371
 Saturn.cxx:1372
 Saturn.cxx:1373
 Saturn.cxx:1374
 Saturn.cxx:1375
 Saturn.cxx:1376
 Saturn.cxx:1377
 Saturn.cxx:1378
 Saturn.cxx:1379
 Saturn.cxx:1380
 Saturn.cxx:1381
 Saturn.cxx:1382
 Saturn.cxx:1383
 Saturn.cxx:1384
 Saturn.cxx:1385
 Saturn.cxx:1386
 Saturn.cxx:1387
 Saturn.cxx:1388
 Saturn.cxx:1389
 Saturn.cxx:1390
 Saturn.cxx:1391
 Saturn.cxx:1392
 Saturn.cxx:1393
 Saturn.cxx:1394
 Saturn.cxx:1395
 Saturn.cxx:1396
 Saturn.cxx:1397
 Saturn.cxx:1398
 Saturn.cxx:1399
 Saturn.cxx:1400
 Saturn.cxx:1401
 Saturn.cxx:1402
 Saturn.cxx:1403
 Saturn.cxx:1404
 Saturn.cxx:1405
 Saturn.cxx:1406
 Saturn.cxx:1407
 Saturn.cxx:1408
 Saturn.cxx:1409
 Saturn.cxx:1410
 Saturn.cxx:1411
 Saturn.cxx:1412
 Saturn.cxx:1413
 Saturn.cxx:1414
 Saturn.cxx:1415
 Saturn.cxx:1416
 Saturn.cxx:1417
 Saturn.cxx:1418
 Saturn.cxx:1419
 Saturn.cxx:1420
 Saturn.cxx:1421
 Saturn.cxx:1422
 Saturn.cxx:1423
 Saturn.cxx:1424
 Saturn.cxx:1425
 Saturn.cxx:1426
 Saturn.cxx:1427
 Saturn.cxx:1428
 Saturn.cxx:1429
 Saturn.cxx:1430
 Saturn.cxx:1431
 Saturn.cxx:1432
 Saturn.cxx:1433
 Saturn.cxx:1434
 Saturn.cxx:1435
 Saturn.cxx:1436
 Saturn.cxx:1437
 Saturn.cxx:1438
 Saturn.cxx:1439
 Saturn.cxx:1440
 Saturn.cxx:1441
 Saturn.cxx:1442
 Saturn.cxx:1443
 Saturn.cxx:1444
 Saturn.cxx:1445
 Saturn.cxx:1446
 Saturn.cxx:1447
 Saturn.cxx:1448
 Saturn.cxx:1449
 Saturn.cxx:1450
 Saturn.cxx:1451
 Saturn.cxx:1452
 Saturn.cxx:1453
 Saturn.cxx:1454
 Saturn.cxx:1455
 Saturn.cxx:1456
 Saturn.cxx:1457
 Saturn.cxx:1458
 Saturn.cxx:1459
 Saturn.cxx:1460
 Saturn.cxx:1461
 Saturn.cxx:1462
 Saturn.cxx:1463
 Saturn.cxx:1464
 Saturn.cxx:1465
 Saturn.cxx:1466
 Saturn.cxx:1467
 Saturn.cxx:1468
 Saturn.cxx:1469
 Saturn.cxx:1470
 Saturn.cxx:1471
 Saturn.cxx:1472
 Saturn.cxx:1473
 Saturn.cxx:1474
 Saturn.cxx:1475
 Saturn.cxx:1476
 Saturn.cxx:1477
 Saturn.cxx:1478
 Saturn.cxx:1479
 Saturn.cxx:1480
 Saturn.cxx:1481
 Saturn.cxx:1482
 Saturn.cxx:1483
 Saturn.cxx:1484
 Saturn.cxx:1485
 Saturn.cxx:1486
 Saturn.cxx:1487
 Saturn.cxx:1488
 Saturn.cxx:1489
 Saturn.cxx:1490
 Saturn.cxx:1491
 Saturn.cxx:1492
 Saturn.cxx:1493
 Saturn.cxx:1494
 Saturn.cxx:1495
 Saturn.cxx:1496
 Saturn.cxx:1497
 Saturn.cxx:1498
 Saturn.cxx:1499
 Saturn.cxx:1500
 Saturn.cxx:1501
 Saturn.cxx:1502
 Saturn.cxx:1503
 Saturn.cxx:1504
 Saturn.cxx:1505
 Saturn.cxx:1506
 Saturn.cxx:1507
 Saturn.cxx:1508
 Saturn.cxx:1509
 Saturn.cxx:1510
 Saturn.cxx:1511
 Saturn.cxx:1512
 Saturn.cxx:1513
 Saturn.cxx:1514
 Saturn.cxx:1515
 Saturn.cxx:1516
 Saturn.cxx:1517
 Saturn.cxx:1518
 Saturn.cxx:1519
 Saturn.cxx:1520
 Saturn.cxx:1521
 Saturn.cxx:1522
 Saturn.cxx:1523
 Saturn.cxx:1524
 Saturn.cxx:1525
 Saturn.cxx:1526
 Saturn.cxx:1527
 Saturn.cxx:1528
 Saturn.cxx:1529
 Saturn.cxx:1530
 Saturn.cxx:1531
 Saturn.cxx:1532
 Saturn.cxx:1533
 Saturn.cxx:1534
 Saturn.cxx:1535
 Saturn.cxx:1536
 Saturn.cxx:1537
 Saturn.cxx:1538
 Saturn.cxx:1539
 Saturn.cxx:1540
 Saturn.cxx:1541
 Saturn.cxx:1542
 Saturn.cxx:1543
 Saturn.cxx:1544
 Saturn.cxx:1545
 Saturn.cxx:1546
 Saturn.cxx:1547
 Saturn.cxx:1548
 Saturn.cxx:1549
 Saturn.cxx:1550
 Saturn.cxx:1551
 Saturn.cxx:1552
 Saturn.cxx:1553
 Saturn.cxx:1554
 Saturn.cxx:1555
 Saturn.cxx:1556
 Saturn.cxx:1557
 Saturn.cxx:1558
 Saturn.cxx:1559
 Saturn.cxx:1560
 Saturn.cxx:1561
 Saturn.cxx:1562
 Saturn.cxx:1563
 Saturn.cxx:1564
 Saturn.cxx:1565
 Saturn.cxx:1566
 Saturn.cxx:1567
 Saturn.cxx:1568
 Saturn.cxx:1569
 Saturn.cxx:1570
 Saturn.cxx:1571
 Saturn.cxx:1572
 Saturn.cxx:1573
 Saturn.cxx:1574
 Saturn.cxx:1575
 Saturn.cxx:1576
 Saturn.cxx:1577
 Saturn.cxx:1578
 Saturn.cxx:1579
 Saturn.cxx:1580
 Saturn.cxx:1581
 Saturn.cxx:1582
 Saturn.cxx:1583
 Saturn.cxx:1584
 Saturn.cxx:1585
 Saturn.cxx:1586
 Saturn.cxx:1587
 Saturn.cxx:1588
 Saturn.cxx:1589
 Saturn.cxx:1590
 Saturn.cxx:1591
 Saturn.cxx:1592
 Saturn.cxx:1593
 Saturn.cxx:1594
 Saturn.cxx:1595
 Saturn.cxx:1596
 Saturn.cxx:1597
 Saturn.cxx:1598
 Saturn.cxx:1599
 Saturn.cxx:1600
 Saturn.cxx:1601
 Saturn.cxx:1602
 Saturn.cxx:1603
 Saturn.cxx:1604
 Saturn.cxx:1605
 Saturn.cxx:1606
 Saturn.cxx:1607
 Saturn.cxx:1608
 Saturn.cxx:1609
 Saturn.cxx:1610
 Saturn.cxx:1611
 Saturn.cxx:1612
 Saturn.cxx:1613
 Saturn.cxx:1614
 Saturn.cxx:1615
 Saturn.cxx:1616
 Saturn.cxx:1617
 Saturn.cxx:1618
 Saturn.cxx:1619
 Saturn.cxx:1620
 Saturn.cxx:1621
 Saturn.cxx:1622
 Saturn.cxx:1623
 Saturn.cxx:1624
 Saturn.cxx:1625
 Saturn.cxx:1626
 Saturn.cxx:1627
 Saturn.cxx:1628
 Saturn.cxx:1629
 Saturn.cxx:1630
 Saturn.cxx:1631
 Saturn.cxx:1632
 Saturn.cxx:1633
 Saturn.cxx:1634
 Saturn.cxx:1635
 Saturn.cxx:1636
 Saturn.cxx:1637
 Saturn.cxx:1638
 Saturn.cxx:1639
 Saturn.cxx:1640
 Saturn.cxx:1641
 Saturn.cxx:1642
 Saturn.cxx:1643
 Saturn.cxx:1644
 Saturn.cxx:1645
 Saturn.cxx:1646
 Saturn.cxx:1647
 Saturn.cxx:1648
 Saturn.cxx:1649
 Saturn.cxx:1650
 Saturn.cxx:1651
 Saturn.cxx:1652
 Saturn.cxx:1653
 Saturn.cxx:1654
 Saturn.cxx:1655
 Saturn.cxx:1656
 Saturn.cxx:1657
 Saturn.cxx:1658
 Saturn.cxx:1659
 Saturn.cxx:1660
 Saturn.cxx:1661
 Saturn.cxx:1662
 Saturn.cxx:1663
 Saturn.cxx:1664
 Saturn.cxx:1665
 Saturn.cxx:1666
 Saturn.cxx:1667
 Saturn.cxx:1668
 Saturn.cxx:1669
 Saturn.cxx:1670
 Saturn.cxx:1671
 Saturn.cxx:1672
 Saturn.cxx:1673
 Saturn.cxx:1674
 Saturn.cxx:1675
 Saturn.cxx:1676
 Saturn.cxx:1677
 Saturn.cxx:1678
 Saturn.cxx:1679
 Saturn.cxx:1680
 Saturn.cxx:1681
 Saturn.cxx:1682
 Saturn.cxx:1683
 Saturn.cxx:1684
 Saturn.cxx:1685
 Saturn.cxx:1686
 Saturn.cxx:1687
 Saturn.cxx:1688
 Saturn.cxx:1689
 Saturn.cxx:1690
 Saturn.cxx:1691
 Saturn.cxx:1692
 Saturn.cxx:1693
 Saturn.cxx:1694
 Saturn.cxx:1695
 Saturn.cxx:1696
 Saturn.cxx:1697
 Saturn.cxx:1698
 Saturn.cxx:1699
 Saturn.cxx:1700
 Saturn.cxx:1701
 Saturn.cxx:1702
 Saturn.cxx:1703
 Saturn.cxx:1704
 Saturn.cxx:1705
 Saturn.cxx:1706
 Saturn.cxx:1707
 Saturn.cxx:1708
 Saturn.cxx:1709
 Saturn.cxx:1710
 Saturn.cxx:1711
 Saturn.cxx:1712
 Saturn.cxx:1713
 Saturn.cxx:1714
 Saturn.cxx:1715
 Saturn.cxx:1716
 Saturn.cxx:1717
 Saturn.cxx:1718
 Saturn.cxx:1719
 Saturn.cxx:1720
 Saturn.cxx:1721
 Saturn.cxx:1722
 Saturn.cxx:1723
 Saturn.cxx:1724
 Saturn.cxx:1725
 Saturn.cxx:1726
 Saturn.cxx:1727
 Saturn.cxx:1728
 Saturn.cxx:1729
 Saturn.cxx:1730
 Saturn.cxx:1731
 Saturn.cxx:1732
 Saturn.cxx:1733
 Saturn.cxx:1734
 Saturn.cxx:1735
 Saturn.cxx:1736
 Saturn.cxx:1737
 Saturn.cxx:1738
 Saturn.cxx:1739
 Saturn.cxx:1740
 Saturn.cxx:1741
 Saturn.cxx:1742
 Saturn.cxx:1743
 Saturn.cxx:1744
 Saturn.cxx:1745
 Saturn.cxx:1746
 Saturn.cxx:1747
 Saturn.cxx:1748
 Saturn.cxx:1749
 Saturn.cxx:1750
 Saturn.cxx:1751
 Saturn.cxx:1752
 Saturn.cxx:1753
 Saturn.cxx:1754
 Saturn.cxx:1755
 Saturn.cxx:1756
 Saturn.cxx:1757
 Saturn.cxx:1758
 Saturn.cxx:1759
 Saturn.cxx:1760
 Saturn.cxx:1761
 Saturn.cxx:1762
 Saturn.cxx:1763
 Saturn.cxx:1764
 Saturn.cxx:1765
 Saturn.cxx:1766
 Saturn.cxx:1767
 Saturn.cxx:1768
 Saturn.cxx:1769
 Saturn.cxx:1770
 Saturn.cxx:1771
 Saturn.cxx:1772
 Saturn.cxx:1773
 Saturn.cxx:1774
 Saturn.cxx:1775
 Saturn.cxx:1776
 Saturn.cxx:1777
 Saturn.cxx:1778
 Saturn.cxx:1779
 Saturn.cxx:1780
 Saturn.cxx:1781
 Saturn.cxx:1782
 Saturn.cxx:1783
 Saturn.cxx:1784
 Saturn.cxx:1785
 Saturn.cxx:1786
 Saturn.cxx:1787
 Saturn.cxx:1788
 Saturn.cxx:1789
 Saturn.cxx:1790
 Saturn.cxx:1791
 Saturn.cxx:1792
 Saturn.cxx:1793
 Saturn.cxx:1794
 Saturn.cxx:1795
 Saturn.cxx:1796
 Saturn.cxx:1797
 Saturn.cxx:1798
 Saturn.cxx:1799
 Saturn.cxx:1800
 Saturn.cxx:1801
 Saturn.cxx:1802
 Saturn.cxx:1803
 Saturn.cxx:1804
 Saturn.cxx:1805
 Saturn.cxx:1806
 Saturn.cxx:1807
 Saturn.cxx:1808
 Saturn.cxx:1809
 Saturn.cxx:1810
 Saturn.cxx:1811
 Saturn.cxx:1812
 Saturn.cxx:1813
 Saturn.cxx:1814
 Saturn.cxx:1815
 Saturn.cxx:1816
 Saturn.cxx:1817
 Saturn.cxx:1818
 Saturn.cxx:1819
 Saturn.cxx:1820
 Saturn.cxx:1821
 Saturn.cxx:1822
 Saturn.cxx:1823
 Saturn.cxx:1824
 Saturn.cxx:1825
 Saturn.cxx:1826
 Saturn.cxx:1827
 Saturn.cxx:1828
 Saturn.cxx:1829
 Saturn.cxx:1830
 Saturn.cxx:1831
 Saturn.cxx:1832
 Saturn.cxx:1833
 Saturn.cxx:1834
 Saturn.cxx:1835
 Saturn.cxx:1836
 Saturn.cxx:1837
 Saturn.cxx:1838
 Saturn.cxx:1839
 Saturn.cxx:1840
 Saturn.cxx:1841
 Saturn.cxx:1842
 Saturn.cxx:1843
 Saturn.cxx:1844
 Saturn.cxx:1845
 Saturn.cxx:1846
 Saturn.cxx:1847
 Saturn.cxx:1848
 Saturn.cxx:1849
 Saturn.cxx:1850
 Saturn.cxx:1851
 Saturn.cxx:1852
 Saturn.cxx:1853
 Saturn.cxx:1854
 Saturn.cxx:1855
 Saturn.cxx:1856
 Saturn.cxx:1857
 Saturn.cxx:1858
 Saturn.cxx:1859
 Saturn.cxx:1860
 Saturn.cxx:1861
 Saturn.cxx:1862
 Saturn.cxx:1863
 Saturn.cxx:1864
 Saturn.cxx:1865
 Saturn.cxx:1866
 Saturn.cxx:1867
 Saturn.cxx:1868
 Saturn.cxx:1869
 Saturn.cxx:1870
 Saturn.cxx:1871
 Saturn.cxx:1872
 Saturn.cxx:1873
 Saturn.cxx:1874
 Saturn.cxx:1875
 Saturn.cxx:1876
 Saturn.cxx:1877
 Saturn.cxx:1878
 Saturn.cxx:1879
 Saturn.cxx:1880
 Saturn.cxx:1881
 Saturn.cxx:1882
 Saturn.cxx:1883
 Saturn.cxx:1884
 Saturn.cxx:1885
 Saturn.cxx:1886
 Saturn.cxx:1887
 Saturn.cxx:1888
 Saturn.cxx:1889
 Saturn.cxx:1890
 Saturn.cxx:1891
 Saturn.cxx:1892
 Saturn.cxx:1893
 Saturn.cxx:1894
 Saturn.cxx:1895
 Saturn.cxx:1896
 Saturn.cxx:1897
 Saturn.cxx:1898
 Saturn.cxx:1899
 Saturn.cxx:1900
 Saturn.cxx:1901
 Saturn.cxx:1902
 Saturn.cxx:1903
 Saturn.cxx:1904
 Saturn.cxx:1905
 Saturn.cxx:1906
 Saturn.cxx:1907
 Saturn.cxx:1908
 Saturn.cxx:1909
 Saturn.cxx:1910
 Saturn.cxx:1911
 Saturn.cxx:1912
 Saturn.cxx:1913
 Saturn.cxx:1914
 Saturn.cxx:1915
 Saturn.cxx:1916
 Saturn.cxx:1917
 Saturn.cxx:1918
 Saturn.cxx:1919
 Saturn.cxx:1920
 Saturn.cxx:1921
 Saturn.cxx:1922
 Saturn.cxx:1923
 Saturn.cxx:1924
 Saturn.cxx:1925
 Saturn.cxx:1926
 Saturn.cxx:1927
 Saturn.cxx:1928
 Saturn.cxx:1929
 Saturn.cxx:1930
 Saturn.cxx:1931
 Saturn.cxx:1932
 Saturn.cxx:1933
 Saturn.cxx:1934
 Saturn.cxx:1935
 Saturn.cxx:1936
 Saturn.cxx:1937
 Saturn.cxx:1938
 Saturn.cxx:1939
 Saturn.cxx:1940
 Saturn.cxx:1941
 Saturn.cxx:1942
 Saturn.cxx:1943
 Saturn.cxx:1944
 Saturn.cxx:1945
 Saturn.cxx:1946
 Saturn.cxx:1947
 Saturn.cxx:1948
 Saturn.cxx:1949
 Saturn.cxx:1950
 Saturn.cxx:1951
 Saturn.cxx:1952
 Saturn.cxx:1953
 Saturn.cxx:1954
 Saturn.cxx:1955
 Saturn.cxx:1956
 Saturn.cxx:1957
 Saturn.cxx:1958
 Saturn.cxx:1959
 Saturn.cxx:1960
 Saturn.cxx:1961
 Saturn.cxx:1962
 Saturn.cxx:1963
 Saturn.cxx:1964
 Saturn.cxx:1965
 Saturn.cxx:1966
 Saturn.cxx:1967
 Saturn.cxx:1968
 Saturn.cxx:1969
 Saturn.cxx:1970
 Saturn.cxx:1971
 Saturn.cxx:1972
 Saturn.cxx:1973
 Saturn.cxx:1974
 Saturn.cxx:1975
 Saturn.cxx:1976
 Saturn.cxx:1977
 Saturn.cxx:1978
 Saturn.cxx:1979
 Saturn.cxx:1980
 Saturn.cxx:1981
 Saturn.cxx:1982
 Saturn.cxx:1983
 Saturn.cxx:1984
 Saturn.cxx:1985
 Saturn.cxx:1986
 Saturn.cxx:1987
 Saturn.cxx:1988
 Saturn.cxx:1989
 Saturn.cxx:1990
 Saturn.cxx:1991
 Saturn.cxx:1992
 Saturn.cxx:1993
 Saturn.cxx:1994
 Saturn.cxx:1995
 Saturn.cxx:1996
 Saturn.cxx:1997
 Saturn.cxx:1998
 Saturn.cxx:1999
 Saturn.cxx:2000
 Saturn.cxx:2001
 Saturn.cxx:2002
 Saturn.cxx:2003
 Saturn.cxx:2004
 Saturn.cxx:2005
 Saturn.cxx:2006
 Saturn.cxx:2007
 Saturn.cxx:2008
 Saturn.cxx:2009
 Saturn.cxx:2010
 Saturn.cxx:2011
 Saturn.cxx:2012
 Saturn.cxx:2013
 Saturn.cxx:2014
 Saturn.cxx:2015
 Saturn.cxx:2016
 Saturn.cxx:2017
 Saturn.cxx:2018
 Saturn.cxx:2019
 Saturn.cxx:2020
 Saturn.cxx:2021
 Saturn.cxx:2022
 Saturn.cxx:2023
 Saturn.cxx:2024
 Saturn.cxx:2025
 Saturn.cxx:2026
 Saturn.cxx:2027
 Saturn.cxx:2028
 Saturn.cxx:2029
 Saturn.cxx:2030
 Saturn.cxx:2031
 Saturn.cxx:2032
 Saturn.cxx:2033
 Saturn.cxx:2034
 Saturn.cxx:2035
 Saturn.cxx:2036
 Saturn.cxx:2037
 Saturn.cxx:2038
 Saturn.cxx:2039
 Saturn.cxx:2040
 Saturn.cxx:2041
 Saturn.cxx:2042
 Saturn.cxx:2043
 Saturn.cxx:2044
 Saturn.cxx:2045
 Saturn.cxx:2046
 Saturn.cxx:2047
 Saturn.cxx:2048
 Saturn.cxx:2049
 Saturn.cxx:2050
 Saturn.cxx:2051
 Saturn.cxx:2052
 Saturn.cxx:2053
 Saturn.cxx:2054
 Saturn.cxx:2055
 Saturn.cxx:2056
 Saturn.cxx:2057
 Saturn.cxx:2058
 Saturn.cxx:2059
 Saturn.cxx:2060
 Saturn.cxx:2061
 Saturn.cxx:2062
 Saturn.cxx:2063
 Saturn.cxx:2064
 Saturn.cxx:2065
 Saturn.cxx:2066
 Saturn.cxx:2067
 Saturn.cxx:2068
 Saturn.cxx:2069
 Saturn.cxx:2070
 Saturn.cxx:2071
 Saturn.cxx:2072
 Saturn.cxx:2073
 Saturn.cxx:2074
 Saturn.cxx:2075
 Saturn.cxx:2076
 Saturn.cxx:2077
 Saturn.cxx:2078
 Saturn.cxx:2079
 Saturn.cxx:2080
 Saturn.cxx:2081
 Saturn.cxx:2082
 Saturn.cxx:2083
 Saturn.cxx:2084
 Saturn.cxx:2085
 Saturn.cxx:2086
 Saturn.cxx:2087
 Saturn.cxx:2088
 Saturn.cxx:2089
 Saturn.cxx:2090
 Saturn.cxx:2091
 Saturn.cxx:2092
 Saturn.cxx:2093
 Saturn.cxx:2094
 Saturn.cxx:2095
 Saturn.cxx:2096
 Saturn.cxx:2097
 Saturn.cxx:2098
 Saturn.cxx:2099
 Saturn.cxx:2100
 Saturn.cxx:2101
 Saturn.cxx:2102
 Saturn.cxx:2103
 Saturn.cxx:2104
 Saturn.cxx:2105
 Saturn.cxx:2106
 Saturn.cxx:2107
 Saturn.cxx:2108
 Saturn.cxx:2109
 Saturn.cxx:2110
 Saturn.cxx:2111
 Saturn.cxx:2112
 Saturn.cxx:2113
 Saturn.cxx:2114
 Saturn.cxx:2115
 Saturn.cxx:2116
 Saturn.cxx:2117
 Saturn.cxx:2118
 Saturn.cxx:2119
 Saturn.cxx:2120
 Saturn.cxx:2121
 Saturn.cxx:2122
 Saturn.cxx:2123
 Saturn.cxx:2124
 Saturn.cxx:2125
 Saturn.cxx:2126
 Saturn.cxx:2127
 Saturn.cxx:2128
 Saturn.cxx:2129
 Saturn.cxx:2130
 Saturn.cxx:2131
 Saturn.cxx:2132
 Saturn.cxx:2133
 Saturn.cxx:2134
 Saturn.cxx:2135
 Saturn.cxx:2136
 Saturn.cxx:2137
 Saturn.cxx:2138
 Saturn.cxx:2139
 Saturn.cxx:2140
 Saturn.cxx:2141
 Saturn.cxx:2142
 Saturn.cxx:2143
 Saturn.cxx:2144
 Saturn.cxx:2145
 Saturn.cxx:2146
 Saturn.cxx:2147
 Saturn.cxx:2148
 Saturn.cxx:2149
 Saturn.cxx:2150
 Saturn.cxx:2151
 Saturn.cxx:2152
 Saturn.cxx:2153
 Saturn.cxx:2154
 Saturn.cxx:2155
 Saturn.cxx:2156
 Saturn.cxx:2157
 Saturn.cxx:2158
 Saturn.cxx:2159
 Saturn.cxx:2160
 Saturn.cxx:2161
 Saturn.cxx:2162
 Saturn.cxx:2163
 Saturn.cxx:2164
 Saturn.cxx:2165
 Saturn.cxx:2166
 Saturn.cxx:2167
 Saturn.cxx:2168
 Saturn.cxx:2169
 Saturn.cxx:2170
 Saturn.cxx:2171
 Saturn.cxx:2172
 Saturn.cxx:2173
 Saturn.cxx:2174
 Saturn.cxx:2175
 Saturn.cxx:2176
 Saturn.cxx:2177
 Saturn.cxx:2178
 Saturn.cxx:2179
 Saturn.cxx:2180
 Saturn.cxx:2181
 Saturn.cxx:2182
 Saturn.cxx:2183
 Saturn.cxx:2184
 Saturn.cxx:2185
 Saturn.cxx:2186
 Saturn.cxx:2187
 Saturn.cxx:2188
 Saturn.cxx:2189
 Saturn.cxx:2190
 Saturn.cxx:2191
 Saturn.cxx:2192
 Saturn.cxx:2193
 Saturn.cxx:2194
 Saturn.cxx:2195
 Saturn.cxx:2196
 Saturn.cxx:2197
 Saturn.cxx:2198
 Saturn.cxx:2199
 Saturn.cxx:2200
 Saturn.cxx:2201
 Saturn.cxx:2202
 Saturn.cxx:2203
 Saturn.cxx:2204
 Saturn.cxx:2205
 Saturn.cxx:2206
 Saturn.cxx:2207
 Saturn.cxx:2208
 Saturn.cxx:2209
 Saturn.cxx:2210
 Saturn.cxx:2211
 Saturn.cxx:2212
 Saturn.cxx:2213
 Saturn.cxx:2214
 Saturn.cxx:2215
 Saturn.cxx:2216
 Saturn.cxx:2217
 Saturn.cxx:2218
 Saturn.cxx:2219
 Saturn.cxx:2220
 Saturn.cxx:2221
 Saturn.cxx:2222
 Saturn.cxx:2223
 Saturn.cxx:2224
 Saturn.cxx:2225
 Saturn.cxx:2226
 Saturn.cxx:2227
 Saturn.cxx:2228
 Saturn.cxx:2229
 Saturn.cxx:2230
 Saturn.cxx:2231
 Saturn.cxx:2232
 Saturn.cxx:2233
 Saturn.cxx:2234
 Saturn.cxx:2235
 Saturn.cxx:2236
 Saturn.cxx:2237
 Saturn.cxx:2238
 Saturn.cxx:2239
 Saturn.cxx:2240
 Saturn.cxx:2241
 Saturn.cxx:2242
 Saturn.cxx:2243
 Saturn.cxx:2244
 Saturn.cxx:2245
 Saturn.cxx:2246
 Saturn.cxx:2247
 Saturn.cxx:2248
 Saturn.cxx:2249
 Saturn.cxx:2250
 Saturn.cxx:2251
 Saturn.cxx:2252
 Saturn.cxx:2253
 Saturn.cxx:2254
 Saturn.cxx:2255
 Saturn.cxx:2256
 Saturn.cxx:2257
 Saturn.cxx:2258
 Saturn.cxx:2259
 Saturn.cxx:2260
 Saturn.cxx:2261
 Saturn.cxx:2262
 Saturn.cxx:2263
 Saturn.cxx:2264
 Saturn.cxx:2265
 Saturn.cxx:2266
 Saturn.cxx:2267
 Saturn.cxx:2268
 Saturn.cxx:2269
 Saturn.cxx:2270
 Saturn.cxx:2271
 Saturn.cxx:2272
 Saturn.cxx:2273
 Saturn.cxx:2274
 Saturn.cxx:2275
 Saturn.cxx:2276
 Saturn.cxx:2277
 Saturn.cxx:2278
 Saturn.cxx:2279
 Saturn.cxx:2280
 Saturn.cxx:2281
 Saturn.cxx:2282
 Saturn.cxx:2283
 Saturn.cxx:2284
 Saturn.cxx:2285
 Saturn.cxx:2286
 Saturn.cxx:2287
 Saturn.cxx:2288
 Saturn.cxx:2289
 Saturn.cxx:2290
 Saturn.cxx:2291
 Saturn.cxx:2292
 Saturn.cxx:2293
 Saturn.cxx:2294
 Saturn.cxx:2295
 Saturn.cxx:2296
 Saturn.cxx:2297
 Saturn.cxx:2298
 Saturn.cxx:2299
 Saturn.cxx:2300
 Saturn.cxx:2301
 Saturn.cxx:2302
 Saturn.cxx:2303
 Saturn.cxx:2304
 Saturn.cxx:2305
 Saturn.cxx:2306
 Saturn.cxx:2307
 Saturn.cxx:2308
 Saturn.cxx:2309
 Saturn.cxx:2310
 Saturn.cxx:2311
 Saturn.cxx:2312
 Saturn.cxx:2313
 Saturn.cxx:2314
 Saturn.cxx:2315
 Saturn.cxx:2316
 Saturn.cxx:2317
 Saturn.cxx:2318
 Saturn.cxx:2319
 Saturn.cxx:2320
 Saturn.cxx:2321
 Saturn.cxx:2322
 Saturn.cxx:2323
 Saturn.cxx:2324
 Saturn.cxx:2325
 Saturn.cxx:2326
 Saturn.cxx:2327
 Saturn.cxx:2328
 Saturn.cxx:2329
 Saturn.cxx:2330
 Saturn.cxx:2331
 Saturn.cxx:2332
 Saturn.cxx:2333
 Saturn.cxx:2334
 Saturn.cxx:2335
 Saturn.cxx:2336
 Saturn.cxx:2337
 Saturn.cxx:2338
 Saturn.cxx:2339
 Saturn.cxx:2340
 Saturn.cxx:2341
 Saturn.cxx:2342
 Saturn.cxx:2343
 Saturn.cxx:2344
 Saturn.cxx:2345
 Saturn.cxx:2346
 Saturn.cxx:2347
 Saturn.cxx:2348
 Saturn.cxx:2349
 Saturn.cxx:2350
 Saturn.cxx:2351
 Saturn.cxx:2352
 Saturn.cxx:2353
 Saturn.cxx:2354
 Saturn.cxx:2355
 Saturn.cxx:2356
 Saturn.cxx:2357
 Saturn.cxx:2358
 Saturn.cxx:2359
 Saturn.cxx:2360
 Saturn.cxx:2361
 Saturn.cxx:2362
 Saturn.cxx:2363
 Saturn.cxx:2364
 Saturn.cxx:2365
 Saturn.cxx:2366
 Saturn.cxx:2367
 Saturn.cxx:2368
 Saturn.cxx:2369
 Saturn.cxx:2370
 Saturn.cxx:2371
 Saturn.cxx:2372
 Saturn.cxx:2373
 Saturn.cxx:2374
 Saturn.cxx:2375
 Saturn.cxx:2376
 Saturn.cxx:2377
 Saturn.cxx:2378
 Saturn.cxx:2379
 Saturn.cxx:2380
 Saturn.cxx:2381
 Saturn.cxx:2382
 Saturn.cxx:2383
 Saturn.cxx:2384
 Saturn.cxx:2385
 Saturn.cxx:2386
 Saturn.cxx:2387
 Saturn.cxx:2388
 Saturn.cxx:2389
 Saturn.cxx:2390
 Saturn.cxx:2391
 Saturn.cxx:2392
 Saturn.cxx:2393
 Saturn.cxx:2394
 Saturn.cxx:2395
 Saturn.cxx:2396
 Saturn.cxx:2397
 Saturn.cxx:2398
 Saturn.cxx:2399
 Saturn.cxx:2400
 Saturn.cxx:2401
 Saturn.cxx:2402
 Saturn.cxx:2403
 Saturn.cxx:2404
 Saturn.cxx:2405
 Saturn.cxx:2406
 Saturn.cxx:2407
 Saturn.cxx:2408
 Saturn.cxx:2409
 Saturn.cxx:2410
 Saturn.cxx:2411
 Saturn.cxx:2412
 Saturn.cxx:2413
 Saturn.cxx:2414
 Saturn.cxx:2415
 Saturn.cxx:2416
 Saturn.cxx:2417
 Saturn.cxx:2418
 Saturn.cxx:2419
 Saturn.cxx:2420
 Saturn.cxx:2421
 Saturn.cxx:2422
 Saturn.cxx:2423
 Saturn.cxx:2424
 Saturn.cxx:2425
 Saturn.cxx:2426
 Saturn.cxx:2427
 Saturn.cxx:2428
 Saturn.cxx:2429
 Saturn.cxx:2430
 Saturn.cxx:2431
 Saturn.cxx:2432
 Saturn.cxx:2433
 Saturn.cxx:2434
 Saturn.cxx:2435
 Saturn.cxx:2436
 Saturn.cxx:2437
 Saturn.cxx:2438
 Saturn.cxx:2439
 Saturn.cxx:2440
 Saturn.cxx:2441
 Saturn.cxx:2442
 Saturn.cxx:2443
 Saturn.cxx:2444
 Saturn.cxx:2445
 Saturn.cxx:2446
 Saturn.cxx:2447
 Saturn.cxx:2448
 Saturn.cxx:2449
 Saturn.cxx:2450
 Saturn.cxx:2451
 Saturn.cxx:2452
 Saturn.cxx:2453
 Saturn.cxx:2454
 Saturn.cxx:2455
 Saturn.cxx:2456
 Saturn.cxx:2457
 Saturn.cxx:2458
 Saturn.cxx:2459
 Saturn.cxx:2460
 Saturn.cxx:2461
 Saturn.cxx:2462
 Saturn.cxx:2463
 Saturn.cxx:2464
 Saturn.cxx:2465
 Saturn.cxx:2466
 Saturn.cxx:2467
 Saturn.cxx:2468
 Saturn.cxx:2469
 Saturn.cxx:2470
 Saturn.cxx:2471
 Saturn.cxx:2472
 Saturn.cxx:2473
 Saturn.cxx:2474
 Saturn.cxx:2475
 Saturn.cxx:2476
 Saturn.cxx:2477
 Saturn.cxx:2478
 Saturn.cxx:2479
 Saturn.cxx:2480
 Saturn.cxx:2481
 Saturn.cxx:2482
 Saturn.cxx:2483
 Saturn.cxx:2484
 Saturn.cxx:2485
 Saturn.cxx:2486
 Saturn.cxx:2487
 Saturn.cxx:2488
 Saturn.cxx:2489
 Saturn.cxx:2490
 Saturn.cxx:2491
 Saturn.cxx:2492
 Saturn.cxx:2493
 Saturn.cxx:2494
 Saturn.cxx:2495
 Saturn.cxx:2496
 Saturn.cxx:2497
 Saturn.cxx:2498
 Saturn.cxx:2499
 Saturn.cxx:2500
 Saturn.cxx:2501
 Saturn.cxx:2502
 Saturn.cxx:2503
 Saturn.cxx:2504
 Saturn.cxx:2505
 Saturn.cxx:2506
 Saturn.cxx:2507
 Saturn.cxx:2508
 Saturn.cxx:2509
 Saturn.cxx:2510
 Saturn.cxx:2511
 Saturn.cxx:2512
 Saturn.cxx:2513
 Saturn.cxx:2514
 Saturn.cxx:2515
 Saturn.cxx:2516
 Saturn.cxx:2517
 Saturn.cxx:2518
 Saturn.cxx:2519
 Saturn.cxx:2520
 Saturn.cxx:2521
 Saturn.cxx:2522
 Saturn.cxx:2523
 Saturn.cxx:2524
 Saturn.cxx:2525
 Saturn.cxx:2526
 Saturn.cxx:2527
 Saturn.cxx:2528
 Saturn.cxx:2529
 Saturn.cxx:2530
 Saturn.cxx:2531
 Saturn.cxx:2532
 Saturn.cxx:2533
 Saturn.cxx:2534
 Saturn.cxx:2535
 Saturn.cxx:2536
 Saturn.cxx:2537
 Saturn.cxx:2538
 Saturn.cxx:2539
 Saturn.cxx:2540
 Saturn.cxx:2541
 Saturn.cxx:2542
 Saturn.cxx:2543
 Saturn.cxx:2544
 Saturn.cxx:2545
 Saturn.cxx:2546
 Saturn.cxx:2547
 Saturn.cxx:2548
 Saturn.cxx:2549
 Saturn.cxx:2550
 Saturn.cxx:2551
 Saturn.cxx:2552
 Saturn.cxx:2553
 Saturn.cxx:2554
 Saturn.cxx:2555
 Saturn.cxx:2556
 Saturn.cxx:2557
 Saturn.cxx:2558
 Saturn.cxx:2559
 Saturn.cxx:2560
 Saturn.cxx:2561
 Saturn.cxx:2562
 Saturn.cxx:2563
 Saturn.cxx:2564
 Saturn.cxx:2565
 Saturn.cxx:2566
 Saturn.cxx:2567
 Saturn.cxx:2568
 Saturn.cxx:2569
 Saturn.cxx:2570
 Saturn.cxx:2571
 Saturn.cxx:2572
 Saturn.cxx:2573
 Saturn.cxx:2574
 Saturn.cxx:2575
 Saturn.cxx:2576
 Saturn.cxx:2577
 Saturn.cxx:2578
 Saturn.cxx:2579
 Saturn.cxx:2580
 Saturn.cxx:2581
 Saturn.cxx:2582
 Saturn.cxx:2583
 Saturn.cxx:2584
 Saturn.cxx:2585
 Saturn.cxx:2586
 Saturn.cxx:2587
 Saturn.cxx:2588
 Saturn.cxx:2589
 Saturn.cxx:2590
 Saturn.cxx:2591
 Saturn.cxx:2592
 Saturn.cxx:2593
 Saturn.cxx:2594
 Saturn.cxx:2595
 Saturn.cxx:2596
 Saturn.cxx:2597
 Saturn.cxx:2598
 Saturn.cxx:2599
 Saturn.cxx:2600
 Saturn.cxx:2601
 Saturn.cxx:2602
 Saturn.cxx:2603
 Saturn.cxx:2604
 Saturn.cxx:2605
 Saturn.cxx:2606
 Saturn.cxx:2607
 Saturn.cxx:2608
 Saturn.cxx:2609
 Saturn.cxx:2610
 Saturn.cxx:2611
 Saturn.cxx:2612
 Saturn.cxx:2613
 Saturn.cxx:2614
 Saturn.cxx:2615
 Saturn.cxx:2616
 Saturn.cxx:2617
 Saturn.cxx:2618
 Saturn.cxx:2619
 Saturn.cxx:2620
 Saturn.cxx:2621
 Saturn.cxx:2622
 Saturn.cxx:2623
 Saturn.cxx:2624
 Saturn.cxx:2625
 Saturn.cxx:2626
 Saturn.cxx:2627
 Saturn.cxx:2628
 Saturn.cxx:2629
 Saturn.cxx:2630
 Saturn.cxx:2631
 Saturn.cxx:2632
 Saturn.cxx:2633
 Saturn.cxx:2634
 Saturn.cxx:2635
 Saturn.cxx:2636
 Saturn.cxx:2637
 Saturn.cxx:2638
 Saturn.cxx:2639
 Saturn.cxx:2640
 Saturn.cxx:2641
 Saturn.cxx:2642
 Saturn.cxx:2643
 Saturn.cxx:2644
 Saturn.cxx:2645
 Saturn.cxx:2646
 Saturn.cxx:2647
 Saturn.cxx:2648
 Saturn.cxx:2649