import java.awt.*;
import java.applet.*;
import java.io.*;
import java.awt.event.*;
import java.util.Vector;
import java.lang.Math;
import java.lang.Integer;
public class Tu 
 {
  Rec[] reca=new Rec[0];
  String raw,sd,sc,swv;
  int tc;
  boolean announce=true;
  static boolean allturtles=false;
  double pl=0,plo=0; // 0:off 1:follows tu 2:down 3:up
  double plsc=25.4/20.0;
  double plxoff=1750,plyoff=1300;
  double plsleep=75,plseg=20;
  double plpw=3;
  double dmd=0,dhmd=0;
  dP lcsc=new dP(1,1);
  boolean ftfd=false;
  int ng=20;
  int wg=100;
  double snap=10;
  K gnk=new K(189,189,133);
  K gwk=new K(208,168,132);
  K gak=new K(164,132,103);
  double Modc,Modx,Mody,Modz;
  boolean rMod=false;
  boolean grid=false;
  Vector modvec;
  Vector moddpvec;
  int predrawtu=100,postdrawtu=100;
  Font ft;
  FontMetrics ftm;
  int ftsize,ftstyle;
  String ftname;
  K ftk=new K(Color.blue);
  K ftshadk=new K(Color.black);
  double ftshadsize=0,ftshadang=0,ftshadoff=0;
  static boolean sto=true,st=true;
  static boolean dt=false;
  boolean pdo=true,pd=true,d2=true;
  static boolean oo=true;
  double fdzzz=0;
  double pwo=3,pw=3;
  int D=2;
  M parent;
  Te te;
  //LP lp;
  LC lc;
  static int tucount=0;
  String name,host;
  static final double PI=Math.PI;
  static final double PIPI=2*Math.PI;
  static final double DR=PI/180;
  static final double RD=180/PI;
  double h,ho,x,y,z,hx,hy,rthx,rthy,xo,yo,zo;
  double yaw,pitch,roll;
  XYZ xyzcenter;
  double gamma1,gamma2;
  double alpha1,alpha2;
  double beta1,beta2;
  boolean dd=true;
  int x1,x2,y1,y2;
  boolean setabg=true;
  XYZ t3p,t3h,t3l,t3u;
  double t3xs,t3ys;
  double f,fo,recyaw,recroll,recpitch;
  K grid3dk=new K((double)226,(double)207,(double)149,(double)255);
  K pk=new K(0.0,0.0,0.0,255);
  K fk=new K(Color.blue);
  K ek=new K(Color.white);
  double qcslx=200000,qcsly=200000,qcsux=-200000,qcsuy=-200000;
  String hosttype="";
  Tu(M p,String name,LC lc, K pk)
   {
    D=2;
    tucount++;
    if(tucount==1) oo=true;
    parent=p;
    te=parent.te;
    this.name=name;
    this.lc=lc;
    lc.tu=this;
    host=lc.name;
    hosttype="LC";
    spk(pk);
    sfk(fk);
    spw(pw);
    sh(0);
    pd(true);
    sp(new dP(0,0));
    Te.Tuh.put(name,this);
    ftsize=15;
    ftname="Default";
    ftstyle=ivoftstyle("plain");
    setft();
    ftshadsize=.75*ftm.getHeight();
    ftshadoff=0;
    ftshadang=0;
    if(! name.equals("tu0")) oo=false;
   }
  public void dofin()
   {
    tta("finalizing:"+name);
    try { finalize(); }
    catch (Throwable e) {}
   }
  void nhcs(K k)
   {
    lc.clearscreen(k);
    dd=true;
    if(grid) dgrid();
   }
  void cs(K k)
   {
    lc.clearscreen(k);
    home();
    dd=true;
    if(grid) dgrid();
   }
  void cs()
   {
    lc.clearscreen();
    //lc.scvp(new dP(0,0));
    home();
    dd=true;
    if(grid) dgrid();
   }
  void nhcs()
   {
    lc.clearscreen();
    dd=true;
    if(grid) dgrid();
   }
  void shome(dP dp)
   {
    hx=dp.x;
    hy=dp.y;
   }
  void srthome(dP dp)
   {
    rthx=dp.x;
    rthy=dp.y;
   }
  void rthome()
   {
    xo=x;
    yo=y;
    x=rthx;
    y=rthy;
   }
  void rfd(double d)
   {
    double hh=h;
    shtw(rthx,rthy);
    rt(180);
    fd(d);
    h=hh;
   }
  void tfd(double d)
   {
    double hh=h;
    double i=0;
    double delta=.1;
    if(d<0) delta*=-1;
    for(i=0;Math.abs(i)<=Math.abs(d);i+=delta)
     {
      shtw(rthx,rthy);
      rt(-90);
      fd(delta);
     }
    i--;
    double a=d-i;
    if(a>0) fd(a);
    h=hh;
   }
  void afd(double d)
   {
    double hh=h;
    double i=gdto(new dP(rthx,rthy));
    d=PI*2*i*d/36.00;
    double delta=.1;
    for(i=0;i<=d;i+=delta)
     {
      shtw(rthx,rthy);
      rt(-90);
      fd(delta);
     }
    i--;
    double a=d-i;
    if(a>0) fd(a);
    h=hh;
   }
  public void init()
   {
    pd(true);
    pdo=true;
    h=0;
    ho=0;
    x=0;
    y=0;
    z=0;
    xo=0;
    yo=0;
    zo=0;
    spk(pk);
    spw(pw);
    if(dd && st) drawtu();
    if(dd) return;
    t3p=new XYZ(0,0,0);
    t3h=new XYZ(0,1,0);
    t3l=new XYZ(-1,0,0);
    t3u=new XYZ(0,0,1);
    t3xs=1;
    t3ys=1;
    if(setabg) setABG(20,20,0);
   }
  public void home()
   {
    h=0;
    ho=0;
    x=0;
    y=0;
    z=0;
    xo=0;
    yo=0;
    zo=0;
    if(dd && st) drawtu();
    if(dd) sp(x,y);
    else
     {
      t3p=new XYZ(0,0,0);
      t3h=new XYZ(0,1,0);
      t3l=new XYZ(-1,0,0);
      t3u=new XYZ(0,0,1);
      t3xs=1;
      t3ys=1;
     }
   }
  void st()
   {
    st=true;
    drawtu();
   }
  void ht()
   {
    sto=st;
    lc.m2Repaint(x-18,y-18,36.0,36.0);
    st=false;
   }
  synchronized void drawtu()
   {
    te.schleep(predrawtu);
    boolean b=pd;
    double d=pl;
    pl(0);
    dt=true;
    st=false;
    pd(false);
    fd(15);
    rt(160);
    pd(true);
    fd(25);
    rt(110);
    fd(50 * Math.sin(DR*20));
    rt(110);
    fd(25);
    lt(20);
    pd(false);
    bk(15);
    pd(true);
    st=true;
    dt=false;
    pd(b);
    pl(d);
    te.schleep(postdrawtu);
   }
  void plsc(double d)
   {
    plsc=d;
    if(rMod) aModel(22,plsc);
   }
  void plxoff(double d)
   {
    plxoff=d;
    if(rMod) aModel(23,plxoff);
   }
  void plyoff(double d)
   {
    plyoff=d;
    if(rMod) aModel(24,plyoff);
   }
  void plseg(double d)
   {
    plseg=d;
    if(rMod) aModel(25,plseg);
   }
  void plsleep(double d)
   {
    plsleep=d;
    if(rMod) aModel(26,plsleep);
   }
  void plpw(double d)
   {
    plpw=d;
    if(rMod) aModel(27,plpw);
   }
  void snap(double d)
   {
    snap=d;
    if(rMod) aModel(28,snap);
   }
  void lcscx(double d) { lcsc(new dP(d,lcsc.y)); }
  void lcscy(double d) { lcsc(new dP(lcsc.x,d)); }
  void lcsc(dP a)
   {
    lc.tformsc(a.x/lcsc.x,a.y/lcsc.y);
    lcsc=a;
    if(rMod) aModel(29,lcsc);
   }
  void plot(double d)
   {
    double e=pl;
    pl=d;
    plot();
    pl=e;
   }
  void plotpu()
   {
    te.schleep(plsleep);
    int xi=(int)(plsc*x+plxoff);
    int yi=(int)(plsc*y+plyoff);
    String s="M"+xi+","+yi;
    if(pl==4) te.pushS("plsa",s+"\n");
    else te.plotS(s);
   }
  void plot()
   {
    te.schleep(plsleep);
    String s="M";
    int xi=(int)(plsc*x+plxoff);
    int yi=(int)(plsc*y+plyoff);
    if(pl==1 && pd || pl==2 || ( pl==4 && pd)) s="D";
    s=s+xi+","+yi;
    if(pl==4) te.pushS("plsa",s+"\n");
    else te.plotS(s);
   }
  void plot(Rec a)
   {
    pd(false);
    double xx=a.x+plpw/2;
    double yy=a.y+plpw/2;
    double w=a.w-plpw;
    double lh=a.h-plpw;
    mto(new dP(xx,yy));
    if(lh>w)
     {
      int rpco=(int)Math.ceil(w/plpw);
      double cppw=w/rpco;
      sh(0); 
      for (int i=0;i<=rpco;i++)
       {
        pd(true);
        fd(lh);
        pd(false);
        bk(lh);
        rt(90);
        fd(cppw);
        lt(90);
       }
     }
    else
     {
      int rpco=(int)Math.ceil(lh/plpw);
      double cppw=lh/rpco;
      sh(90);
      for (int i=0;i<=rpco;i++)
       {
        pd(true);
        fd(w);
        pd(false);
        bk(w);
        lt(90);
        fd(cppw);
        rt(90);
       }
     }
   }
  void pl(double d)
   {
    // 0:off 1:follows tu 2:down 3:up
    plo=pl;
    pl=d;
    if(pl==4) te.teS("aSa plsa {\"\"}");
    else if(pl==5) te.teS("writefile plsa plotterfile.txt");
    if(plo==0 && pl>0) plotpu();
    if(rMod) aModel(21,pl);
   }
  void pdo() { pd(pdo); }
  void pd(boolean b)
   {
    pdo=pd;
    pd=b;
    if(rMod)
     {
      if(pd) aModel(7);
      else aModel(6);
     }
    if(pl>0) plot();
   }
  public void lt(double r) { rt(-r); }
  public synchronized void rt(double r)
   {
    if(!dd)
     {
      yaw(r);
      return;
     }
    if(st && !dt) 
     {
      lc.m2Repaint(x-18,y-18,36.0,36.0);
      te.schleep(100);
     }
    if(rMod) aModel(2,r);
    ho=h;
    h=ho+r*DR;
    h= h%PIPI;
    if(st && !dt) drawtu();
   }
  synchronized void sh(double r) 
   {
    if(rMod) aModel(8,r);
    if(!dd)
     {
      t3h=new XYZ(0,1,0);
      t3l=new XYZ(-1,0,0);
      t3u=new XYZ(0,0,1);
      return;
     }
    if(st && !dt) lc.m2Repaint(x-18,y-18,36.0,36.0);
    h=r*DR;
    h= h%PIPI;
    if(st && !dt) drawtu();
   }
  double gh() { return h*RD; }
  XYZ p3d() { return new XYZ(x,y,z); }
  void p3d(XYZ xyz)
   {
    x=xyz.x;
    y=xyz.x;
    z=xyz.x;
   }
  synchronized void syaw(double r) { yaw=r*DR; }
  synchronized void spitch(double r) { pitch=r*DR; }
  synchronized void sroll(double r) { roll=r*DR; }
  synchronized double gyaw() { return yaw*RD; }
  synchronized double gpitch() { return pitch*RD; }
  synchronized double groll() { return roll*RD;  }
  void dto(dP dp)
   {
    if(lc.xor) lc.redrawLine();
    rt(ghtw(dp)-h*RD);
    fd(gdt(dp));
   }
  void dto(XYZ xyz)
   {
    shtw(xyz);
    fd3(gdt(xyz));
   }
  void dto(double x,double y)
   {
    dto(new dP(x,y));
   }
  synchronized public void yaw(double a)
   {
    if(rMod) aModel(16,a);
    a= -a;
    XYZ xyz=XYZ.xyzrot(t3h,t3l,a*DR);
    t3l=XYZ.xyzrot(t3l,XYZ.vinv(t3h),a*DR);
    t3h=xyz;
   }
  synchronized public void pitch(double a)
   {
    if(rMod) aModel(17,a);
    XYZ xyz=XYZ.xyzrot(t3h,t3u,a*DR);
    t3u=XYZ.xyzrot(t3u,XYZ.vinv(t3h),a*DR);
    t3h=xyz;
   }
  synchronized public void roll(double a)
   {
    if(rMod) aModel(18,a);
    XYZ xyz=XYZ.xyzrot(t3l,t3u,a*DR);
    t3u=XYZ.xyzrot(t3u,XYZ.vinv(t3l),a*DR);
    t3l=xyz;
   }
  void smag(XYZ xyz)
   {
    t3p.x=xyz.x;
    t3p.y=xyz.y;
    t3p.z=xyz.z;
    fd3();
   }
  void fd3(double f)
   {
    xo=x;
    yo=y;
    t3p= XYZ.vadd(t3p,XYZ.vs(t3h,f));
    fd3();
    if(rMod) aModel(1,f);
   }
  void fd3()
   {
    x=t3p.z*gamma1+t3p.x*alpha1-t3p.y*beta1;
    y=t3p.z*gamma2+t3p.y*beta2+t3p.x*alpha2;
    if(x>qcsux) qcsux=x;
    else if(x<qcslx) qcslx=x;
    if(y>qcsuy) qcsuy=y;
    else if(y<qcsly) qcsly=y;
    if(! pd) return;
    lc.drawLine(xo,yo,x,y,pk,pw);
   }
  void setABG(double a,double b,double g)
   {
    setabg=false;
    alpha1=Math.cos(DR*a);
    alpha2=Math.sin(DR*a);
    beta1=Math.sin(DR*90-b*DR);
    beta2=Math.cos(DR*90-b*DR);
    gamma1=Math.sin(DR*g);
    gamma2=Math.cos(DR*g);
   }
  void gridoff() { grid=false; }
  void dgrid() { dgrid(-lc.width/2,-lc.height/2,lc.width,lc.height); }
  void dgrid(double lx,double ly,double w,double h) { dgrid((int)lx,(int)ly,(int)w,(int)h); }
  void dgrid(int lx,int ly,int w,int h)
   {
    grid=true;
    double lpw=pw;
    K pko=pk;
    spw(1);
    K lgak=new K(164,132,103);
    int ux=lx+w;
    int uy=ly+h;
    int glx,gly,gux,guy;
    glx=lx;
    if(lx%ng !=0) glx=ng*(lx/ng);
    gux=ng*(ux/ng);
    gly=ly;
    if(ly%ng !=0) gly=ng*(ly/ng);
    guy=ng*uy/ng;
    for(int xx=glx;xx<=gux;xx+=ng)
     {
      if(xx==0) spk(lgak);
      else if(xx%wg==0) spk(gwk);
      else  spk(gnk);
      lc.drawLine(xx,ly,xx,uy);
     }
    for(int yy=gly;yy<=guy;yy+=ng)
     {
      if(yy==0) spk(lgak);
      else if(yy%wg==0) spk(gwk);
      else  spk(gnk);
      lc.drawLine(lx,yy,ux,yy);
     }
    spw(lpw);
    spk(pko);
   }
  void d3dgrid(int sx,int dx,int px,int sy,int dy,int py,double ax,double ay,double az)
   {
    double lpw=pw;
    spw(1);
    K pko=new K(pk);
    spk(grid3dk);
    setABG(ax,ay,az);
    double xx=0,yy=0;
    for(yy=py-sy/2;yy<=py+sy/2;yy+=dy)
     {
      sp(new XYZ(xx+px-sx/2,yy,0));
      dto(new XYZ(xx+px+sx/2,yy,0));
     }
    xx=0;
    yy=0;
    for(xx=px-sx/2;xx<=px+sx/2;xx+=dx)
     {
      sp(new XYZ(xx,yy+py-sy/2,0));
      dto(new XYZ(xx,yy+py+sy/2,0));
     }
    home();
    spk(pko);
    spw(lpw);
   }
  void sp(double xx,double yy,double zz) { sp(new XYZ(xx,yy,zz)); }
  void sp(XYZ a)
   {
    t3p=new XYZ(a); 
    if(rMod) aModel(12,t3p.x,t3p.y,t3p.z);
    xo=x;
    yo=y;
    x=t3p.z*gamma1+t3p.x*alpha1-t3p.y*beta1;
    y=t3p.z*gamma2+t3p.y*beta2+t3p.x*alpha2;
   }
  synchronized void sp(double a,double b)
   {
    if(rMod) aModel(12,a,b);
    xo=x;
    yo=y;
    x=a;
    y=b;
    if(pl>0) plotpu();
   }
  synchronized void sp(dP dp) { sp(dp.x,dp.y); }
  synchronized void spnew(double xx,double yy)
   {
    boolean b=pd;
    pd(false);
    sh(RD*Math.atan2(xx-x,yy-y));
    fd(gdt(new dP(xx,yy)));
    pd(b);
   }
  synchronized void spnew(dP dp) { sp(dp.x,dp.y); }
  dP gp() { return new dP(x,y); }
  synchronized void mto(dP dp)
   {
    shtw(dp);
    sp(dp);
   }
  public double gdt(XYZ xyz) { return Math.sqrt(Math.pow((xyz.x-t3p.x),2)+Math.pow((xyz.y -t3p.y),2)+Math.pow((xyz.z -t3p.z),2)); }
  public double gdt(dP dp) { return Math.sqrt(Math.pow((dp.x-x),2)+Math.pow((dp.y -y),2)); }
  synchronized double shtw(double a,double b) { return shtw(new dP(a,b)); }
  synchronized double shtw(dP dp)
   {
    ho=h;
    sh(ghtw(dp));
    return h*RD;
   }
  public double shtw(XYZ xyz)
   {
    ho=h;
    double abyaw=RD*Math.atan2(xyz.x-t3p.x,xyz.y-t3p.y);
    double abpitch=RD* Math.asin((xyz.z -t3p.z)/gdt(xyz));
    t3h=new XYZ(0,1,0);
    t3l=new XYZ(-1,0,0);
    t3u=new XYZ(0,0,1);
    yaw(abyaw);
    pitch(abpitch);
    return 0.123;
   }
  void calcmd(dP md)
   {
    dmd=gdto(md);
    dhmd=ghtw(md)- RD*h;
   }
  void dmd()
   {
    rt(dhmd);
    fd(dmd);
   }
  void dmd(double dh,double d)
   {
    rt(dh);
    fd(d);
   }
  synchronized double gdto(dP dp) { return Math.sqrt(Math.pow((dp.x-x),2)+Math.pow((dp.y -y),2)); }
  synchronized double gdto(XYZ xyz) 
   {
    return Math.sqrt(Math.pow((t3p.x-xyz.x),2)+Math.pow((t3p.y -xyz.y),2)+Math.pow((t3p.z -xyz.z),2)); 
   }
  synchronized double ghtw(double a,double b) { return ghtw(new dP(a,b)); }
  synchronized double ghtw(dP dp) 
   {
    double d=RD*Math.atan2(dp.x-x,dp.y-y); 
    //tta("name:"+name+" dp:"+te.Svo(dp)+" x:"+te.Svo(x)+" y:"+te.Svo(y)+" h:"+te.Svo(d));
    return d;
   }
  synchronized void drawto(dP dp)
   {
    shtw(dp);
    fd(gdt(dp));
   }
  synchronized void drawtw(dP dp,double d)
   {
    shtw(dp);
    fd(d);
   }
  synchronized public void fdbk(double f) 
   {
    if(! pd) return; 
    fd(f); 
    bk(f);
   }
  synchronized public void bkfd(double f) 
   {
    if(! pd) return; 
    bk(f);
    fd(f); 
   }
  synchronized public void tic(double f) 
   {
    rt(90);
    fd(f); 
    bk(2*f);
    fd(f);
    lt(90);
   }
  synchronized public void ticS(double f,String s) 
   {
    tta("ticS:"+f+" s:"+s);
    double hd=h*RD;
    rt(90);
    fd(f); 
    if(hd == 0)  
     {
      dlS(s,false);
     }
    else if(hd == 90)  
     {
      sh(0);
      dlS(s,false);
      sh(90);
     }
    else if(hd == 180)  
     {
      sh(0);
      dlS(s,false);
      sh(180);
     }
    else if(hd == 270)  
     {
      sh(0);
      dlS(s,false);
      sh(270);
     }
    bk(2*f);
    fd(f);
    lt(90);
   }
  synchronized public void toc(double f) 
   {  
    rt (90);
    fd(f); 
    lt (90);
   }
  synchronized public void fdpubk(double f) 
   {
    if(! pd) return;
    fd(f);  
    pd(false);
    bk(f);
    pd(true);
   }
  synchronized public void bk(double f) { fd(-f); }
  public  synchronized void mv(double f)
   {
    boolean b=pd;
    pd(false);
    fd(f);
    pd(b);
   }
  public  synchronized void fd(double f)
   {
    double ff=f;
    if(! dd)
     {
      fd3(ff);
      return;
     }
    if(st & !dt) lc.m2Repaint(x-18,y-18,36.0,36.0);
    xo=x;
    yo=y;
    double plseguse=plseg;
    if(pl>0 && Math.abs(ff) > plseguse)
     {
      if((pl==1 && pd) || pl==2 || (pl==4 && pd))
       {
        int r=(int)(Math.abs(ff)/plseguse);
        if(Math.abs(ff) % plseguse >0)  r++;
        double j=ff/r;
        for(int t=0;t<r;t++) 
         {
          te.schleep(plsleep);
          fd(j);
         }
        return;
       }
     }
    x=x+Math.sin(h)*ff;
    y=y+Math.cos(h)*ff;
    if(x>qcsux) qcsux=x;
    else if(x<qcslx) qcslx=x;
    if(y>qcsuy) qcsuy=y;
    else if(y<qcsly) qcsly=y;
    //tta("fd pk:"+te.Svo(pk));
    if(dt && pd)
     {
      lc.drawosLine(xo,yo,x,y);
     }
    else if(st && pd)
     {
      lc.drawosLine(xo,yo,x,y,pk,pw);
      lc.drawLine(xo,yo,x,y,pk,pw);
     }
    else
     {
      if(pd) lc.drawLine(xo,yo,x,y,pk,pw);
     }
    if(pl>0) plot();
    if(fdzzz>0) te.schleep(fdzzz);
    if(st && !dt) drawtu();
    if(rMod)
     {
      tc++;
      sc=sc+Svo(x)+" "+Svo(y)+" 0\n";
      swv=swv+Svo(x/50)+" "+Svo(y/50)+" 0\n";
      aModel(1,f);
      aModdpel(x,y);
      //tta("pre fd Modx:"+Modx+" Mody:"+Mody+" Modc:"+Modc);
      Modx+=x;
      Mody+=y;
      Modc++;
      //tta("post fd Modx:"+Modx+" Mody:"+Mody+" Modc:"+Modc);
     }
   }
  public void q3dcs()
   {
    lc.fillRec(qcslx-2*pw,qcsly-2*pw,4*pw+qcsux-qcslx,4*pw+qcsuy-qcsly,lc.fk);
    if(st) drawtu();
   }
  public void q3dcs(K k)
   {
    lc.fillRec(qcslx,qcsly,qcsux-qcslx,qcsuy-qcsly,k);
    if(st) drawtu();
   }
  public void qcs() 
   {
    lc.fillRec(qcslx-2*pw,qcsly-2*pw,4*pw+qcsux-qcslx,4*pw+qcsuy-qcsly,lc.fk); 
    if(grid) dgrid(qcslx-2*pw,qcsly-2*pw,4*pw+qcsux-qcslx,4*pw+qcsuy-qcsly);
    if(st) drawtu();
   }
  public void qcs(K k) 
   {
    lc.fillRec(qcslx,qcsly,qcsux-qcslx,qcsuy-qcsly,k); 
    if(st) drawtu();
   }
  public void cs3d()
   {
    dd=false;
    st=false;
    dt=false;
    home();
   }
  public void spw(double d) 
   {
    if(rMod) aModel(5,d);
    pw=d; 
    lc.spw(d);
   }
  public void ipw(double d) { spw(pw+d); }
  public void ipw() { spw(++pw); }
  public void sfk(K a)
   {
    if(rMod) aModel(4,a);
    fk=a;
   }
  public void sek(K a)
   {
    if(rMod) aModel(3,a);
    pk=a;
    lc.spk(pk);
   }
  public void spk(K a) 
   {
    if(rMod) aModel(3,a);
    pk=a;
    lc.spk(pk);
   }
  public void iph(double hi) { spk(pk.ih(hi)); }
  public void iph() { spk(pk.ih(1)); }
  public void ips(double hi) { spk(pk.is(hi)); }
  public void ips() { spk(pk.is(1)); }
  public void ipv(double hi) { spk(pk.iv(hi)); }
  public void ipv() { spk(pk.iv(1)); }
  public String Svo(double x) { return Te.Svo(x); }
  public void tta(String s) { parent.tta(s); }
  public void tta1(String s) { parent.tta1(s); }
  void dSws(String s,double ftshadsize,double ftshadang,double ftshadoff,K ftshadk,int mode,boolean adv)
   {
    dSs(s,ftshadsize,ftshadang,ftshadoff,ftshadk,mode);
    dS(s,mode,adv);
   }
  void dSws(String s,int mode,boolean adv) 
   {
    dSs(s,mode);
    dS(s,mode,adv);
   }
  void swdS(String s,double w)
   {
    swftsize(s,w);
    dS(s);
   }
  void swdlS(String s,double w)
   {
    swftsize(s,w);
    dlS(s);
   }
  void swftsize(String s,double w)
   {
    ftsize=1; 
    setft();
    while(ftm.stringWidth(s) <w )
     {
      ftsize++;
      setft();
     }
    ftsize--;
    setft();
   }
  void dSs(String s,double size,double ang,double off,K k,int mode)
   {
    ftshadsize=size;
    ftshadang=ang;
    ftshadoff=off;
    ftshadk=k;
    dSs(s,mode);
   }
  void dSs(String s,int mode)
   {
    ht();
    pd(false);
    double realhead=gh();
    rt(ftshadang);
    fd(ftshadoff);
    lt(90);
    fd(ftshadsize/2);
    rt(90);
    double temphead;
    for(int i=1;i<=4*ftshadsize;i++)
     {
      temphead=gh();
      sh(realhead);
      dS(s,ftshadk,mode,false);
      sh(temphead);
      fd(PI/4);
      rt(90/ftshadsize);
     }
    rt(90);
    fd(ftshadsize/2);
    lt(90);
    bk(ftshadoff);
    sh(realhead);
   }
  static int ivoftstyle(String s)
   {
    if(s.equals("bold")) return Font.BOLD;
    else if(s.equals("plain")) return Font.PLAIN;
    else if(s.equals("italic")) return Font.ITALIC;
    return -1;
   }
  static String Svoftstyle(Font f)
   {
    return Svoftstyle(f.getStyle());
   }
  static String Svoftstyle(int i)
   {
    if(i==Font.BOLD) return "bold";
    else if(i==Font.PLAIN) return "plain";
    return "unknown font style";
   }
  void setftname(String ftname)
   {
    this.ftname=ftname;
    setft();
   }
  void setftstyle(String s)
   {
    ftstyle=ivoftstyle(s);
    setft();
   }
  void setftsize(double d)
   {
    ftsize=(int)d;
    setft();
   }
  void setft()
   {
    ft=new Font(ftname,ftstyle,ftsize);
    ftm=lc.getFontMetrics(ft);
   }
  void dS(String s,int mode,boolean adv) { dS(s,ftk,mode,adv); }
  void dS(String s,K k,int mode,boolean adv)
   {
    if(mode==0) dS(s,k,adv);
    else if(mode==1) dcS(s,k,adv);
    else if(mode==2) dpS(s,k,adv);
   }
  void dS(String s) { dS(s,ftk,true); }
  void dS(String s,boolean adv) { dS(s,ftk,adv); }
  void dS(String s,K k,boolean adv)
   {
    spk(k); 
    lc.dS(s,x,y,ft,gh());
    //if(pl==1 && pd || pl==2 || ( pl==4 && pd))
    if(pl==1 || pl==2 || ( pl==4 && pd))
     {
      int n=(int)(2+ftsize/15);
      te.plotS("S"+n);
      te.plotS("P"+s);
      plotpu();
     }
    if(adv)
     {
      if (ftfd) fd(ftm.getHeight());
      else bk(ftm.getHeight());
     }
   }
  void dlS(String s,boolean adv) {dlS(s,ftk,adv); }
  void dlS(String s) {dlS(s,ftk,true); }
  void dlS(String s,K k,boolean adv)
   {
    spk(k);
    double w=ftm.stringWidth(s);
    double dsx=x-w*Math.cos(h);
    double dsy=y;
    lc.dS(s,dsx,dsy,ft,gh());
    if(adv)mv(ftm.getHeight());
   }
  void drS(String s,boolean adv) {drS(s,ftk,adv); }
  void drS(String s) {drS(s,ftk,true); }
  void drS(String s,K k,boolean adv)
   {
    spk(k);
    double w=ftm.stringWidth(s);
    double dsx=x+w*Math.cos(h);
    double dsy=y;
    lc.dS(s,dsx,dsy,ft,gh());
    if(adv)mv(ftm.getHeight());
   }
  void dcS(String s,boolean adv) {dcS(s,ftk,adv); }
  void dcS(String s,K k,boolean adv)
   {
    spk(k);
    double w=ftm.stringWidth(s);
    double dsx=x-w/2*Math.cos(h);
    double dsy=y+w/2*Math.sin(h);
    lc.dS(s,dsx,dsy,ft,gh());
    // if(adv)mv(ftm.getHeight());
    if(adv)
     {
      if (ftfd) mv(ftm.getHeight());
      else bk(ftm.getHeight());
     }
   }
  void dcvS(String s,boolean adv,double d) 
   {
    char[] c=s.toCharArray();
    for(int i=0;i<c.length;i++) 
     {
      String ss=String.valueOf(c[i]);
      //dcS(String.valueOf(c[i]),adv); 
      double w=ftm.stringWidth(ss);
      double dsx=x-w/2*Math.cos(h);
      double dsy=y+w/2*Math.sin(h);
      lc.dS(ss,dsx,dsy,ft,gh());
      // if(adv)mv(ftm.getHeight());
      if(adv)
       {
        if (ftfd) mv(d * ftm.getHeight());
        else bk(d * ftm.getHeight());
       }
     }
   }
  void dpS(String s,boolean adv) {dpS(s,ftk,adv); }
  void dpS(String s,K k,boolean adv)
   {
    lc.dS(s,x,y,ft,gh());
    double w=ftm.stringWidth(s);
    if(adv)
     {
      x+=w*Math.cos(h);
      y+=w*Math.sin(h);
     }
   }
  double gSw(String s) { return ftm.stringWidth(s); }
  double gFth() { return ftm.getHeight(); }
  void dS(String s,K k)
   {
    spk(k);
    lc.dS(s,x,y,ft);
   }
  void ed()
   {
    tta1(name+".host "+host);
    tta1(name+".x "+Te.Svo(x));
    tta1(name+".y "+Te.Svo(y));
    if(!dd) tta1(name+".z "+Te.Svo(z));
    if(dd) 
     {
      tta1(name+".p "+Te.Svo(new dP(x,y)));
      tta1(name+".h "+Te.Svo(h));
     }
    else
     {
      tta1(name+".p "+Te.Svo(new XYZ(x,y,z)));
      tta1(name+".yaw "+Te.Svo(yaw));
      tta1(name+".pitch "+Te.Svo(pitch));
      tta1(name+".roll "+Te.Svo(roll));
     }
    tta1(name+".pw "+Te.Svo(pw));
    tta1(name+".pd "+Te.Svo(pd));
    tta1(name+".st "+Te.Svo(st));
    tta1(name+".pk "+Te.Svo(pk));
    tta1(name+".lcsc "+Te.Svo(lcsc));
    tta1(name+".pl "+Te.Svo(pl));
    tta1(name+".plsc "+Te.Svo(plsc));
    tta1(name+".plxoff "+Te.Svo(plxoff));
    tta1(name+".plyoff "+Te.Svo(plyoff));
    tta1(name+".plseg "+Te.Svo(plseg));
    tta1(name+".plsleep "+Te.Svo(plsleep));
    tta1(name+".plpw "+Te.Svo(plpw));
    tta1(name+".snap "+Te.Svo(snap));
    tta1(name+".ftname "+ftname);
    tta1(name+".ftstyle "+Svoftstyle(ftstyle));
    tta1(name+".ftsize "+Te.Svo(ftsize));
    tta1(name+".ftk "+Te.Svo(ftk));
    tta1(name+".ftfd "+Te.Svo(ftfd));
    tta1(name+".ftshadk "+Te.Svo(ftshadk));
    tta1(name+".ftshadsize "+Te.Svo(ftshadsize));
    tta1(name+".ftshadang "+Te.Svo(ftshadang));
    tta1(name+".ftshadoff "+Te.Svo(ftshadoff));
    tta1(name+".announce "+Te.Svo(announce));
   }
  void dMod(double[] da) { dMod(da,1); }
  void dMod(double[] da,double scale)
   {
    ht();
    int zz=da.length;
    int i=0;
    double h0=0,x0=0,y0=0,z0=0;
    boolean open=true,centered=true;
    if(da[i]==15)
     {
      if(da[++i]==0) 
       {
        dd=true;
        x0=x;
        y0=y;
        h0=gh();
       }
      else
       {
        dd=false;
       }
     }
    else tta("Problem with Mod");
    if(da[++i]==19)
     {
      if(da[++i]==0) centered=true;
      else centered=false;
     }
    else tta("Problem with Mod");
    if(da[++i]==20)
     {
      if(da[++i]==0) open=true;
      else open=false;
     }
    else tta("Problem with Mod");
    i++;
    while(i<zz-1)
     {
      if(da[i]==1) fd(scale*da[++i]);
      else if(da[i]==2) rt(da[++i]);
      else if(da[i]==3) spk(new K(da[++i],da[++i],da[++i],da[++i]));
      else if(da[i]==4) sfk(new K(da[++i],da[++i],da[++i],da[++i]));
      else if(da[i]==5) spw(da[++i]);
      else if(da[i]==6) pd(false);
      else if(da[i]==7) pd(true);
      else if(da[i]==8) sh(da[++i]);
      else if(da[i]==10) spmr(scale*da[++i],scale*da[++i]);
      else if(da[i]==11) sphr(scale*da[++i],scale*da[++i]);
      else if(da[i]==12) sp(scale*da[++i],scale*da[++i]);
      else if(da[i]==13) sp(scale*da[++i],scale*da[++i],scale*da[++i]);
      else if(da[i]==16) yaw(da[++i]);
      else if(da[i]==17) pitch(da[++i]);
      else if(da[i]==18) roll(da[++i]);
      else if(da[i]==21) pl(da[++i]);
      else if(da[i]==22) plsc(da[++i]);
      else if(da[i]==23) plxoff(da[++i]);
      else if(da[i]==24) plyoff(da[++i]);
      else if(da[i]==25) plseg(da[++i]);
      else if(da[i]==26) plsleep(da[++i]);
      else if(da[i]==27) plpw(da[++i]);
      else if(da[i]==28) snap(da[++i]);
      else if(da[i]==29) lcsc(new dP(da[++i],da[++i]));
      else tta("dMod unkonwn command:"+Te.Svo(i));
      i++;
     }
    st=sto;
    if(dd && centered)
     {
      sp(x0,y0);
      sh(h0);
     }
   }
  void sphr(dP dp) { sphr(dp.x,dp.y); }
  void sphr(double a,double b)
   {
    if(rMod) aModel(11,a,b);
    double zz=Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
    double hh=Math.atan2(a,b);
    x+=zz*Math.sin(h+hh);
    y+=zz*Math.cos(h+hh);
    if(pl>0) plotpu();
   }
  void spmr(double a,double b) 
   {
    if(rMod) aModel(12,a,b);
    x+=a;
    y+=b;
    if(pl>0) plotpu();
   }
  void spmr(dP dp) { spmr(dp.x,dp.y); }
  void rMod(boolean centered,boolean open)
   {
    ht();
    modvec=new Vector();
    moddpvec=new Vector();
    rMod=true;
    sc="";
    swv="";
    tc=0;
    Modx=x;
    Mody=y;
    Modz=z;
    Modc=0;
    if(dd) aModel(15,0);
    else aModel(15,1);
    if(centered) aModel(19,0);
    else aModel(19,1);
    if(open)
     {
      aModel(20,0);
      fd(0);
     }
    else aModel(20,1); 
   }
  void nMod(String name)
   {
    rMod=false;
    boolean centered=true;
    st=sto;
    int mvz=modvec.size();
    int zz=moddpvec.size();
    double[] dpda=new double[zz];
    int i=0;
    double[] da=new double[mvz];
    for(i=0;i<mvz;i++) da[i]=((Double)modvec.elementAt(i)).doubleValue();
    i=2;
    if(da[i] !=19)
     {
      tta("Problem with Mod ele 2 should be 19:"+name+":"+Te.Svo(da));
      return;
     }
    if(da[++i]==0) centered=true;
    else centered=false;
    //tta("pre  c Modx:"+Modx+" Mody:"+Mody+" Modc:"+Modc);
    Modx/=Modc;
    Mody/=Modc;
    //tta("post  c Modx:"+Modx+" Mody:"+Mody+" Modc:"+Modc);
    //tta("Center:"+te.Svo(new dP(Modx,Mody)));
    if(dd && centered)
     {
      double[] db=new double[mvz+3];
      for(i=0;i<6;i++) db[i]=da[i]; 
      db[i]=11;
      db[++i]=-Modx;
      db[++i]=-Mody;
      i=6;
      for(;i<mvz;i++) db[i+3]=da[i];
      Te.dah.put(name,db);
      Te.dah.put(name+"dp",dpda);
     }
    else Te.dah.put(name,da);
    for(i=0;i<zz;i++)
     {
      //tta("next i:"+te.Svo(((Double)moddpvec.elementAt(i)).doubleValue()));
      if(i==2*(int)(i/2)) dpda[i]=-Modx+((Double)moddpvec.elementAt(i)).doubleValue();
      else dpda[i]=-Mody+((Double)moddpvec.elementAt(i)).doubleValue();
     }
    Te.dah.put(name+"dp",dpda);
    //new Mod(name,this,da,dpda,Modx,Mody);
    raw=sc;
    swv="World Vertices "+tc+"\n"+swv;
    sd="Faces 2\nFace verts "+tc+" flags 16 mat 0\n0\n"+(tc-1)+"\n";
    sd=sd+"Face verts "+tc+" flags 16 mat 0\n"+(tc-1)+"\n"+0+"\n";
   }
  void aModdpel(double a,double b) 
   {
    moddpvec.addElement(new Double(a));
    moddpvec.addElement(new Double(b));
   }
  void aModel(double a) {modvec.addElement(new Double(a)); }
  void aModel(double a,double b,double c,double d)
   {
    modvec.addElement(new Double(a));
    modvec.addElement(new Double(b));
    modvec.addElement(new Double(c));
    modvec.addElement(new Double(d));
   }
  void aModel(double a,double b,double c)
   {
    modvec.addElement(new Double(a));
    modvec.addElement(new Double(b));
    modvec.addElement(new Double(c));
   }
  void aModel(double a,double b)
   {
    modvec.addElement(new Double(a));
    modvec.addElement(new Double(b));
   }
  void aModel(double a,K k)
   {
    modvec.addElement(new Double(a));
    modvec.addElement(new Double(k.h));
    modvec.addElement(new Double(k.s));
    modvec.addElement(new Double(k.v));
    modvec.addElement(new Double(k.a));
   }
  void aModel(double a,dP dp)
   {
    modvec.addElement(new Double(a));
    modvec.addElement(new Double(dp.x));
    modvec.addElement(new Double(dp.y));
   }
  void aModel(double a,boolean boo)
   {
    modvec.addElement(new Double(a));
    if(boo)modvec.addElement(new Double(1));
    else modvec.addElement(new Double(0));
   }
 }
