function frac2num(num,den) {den-=0;
if ((den==1)||((den==0)&&(1/den==-1/0))) return num;
else if ((den==0)||(typeof den != 'number')) return NaN;
else return (num/den);
}
function num2dfrac(str,options) {
var pair=this.num2frac(str,arguments[1],arguments[2],arguments[3]);
var foptions="";
for(var i=1;i<arguments.length;i++) if ((arguments[i])&&
(!isFinite(arguments[i]))) {foptions=arguments[i];break;}
if ((typeof pair!="object")||(typeof pair[1]!="number")) 
return this.dfrac(str,"","",foptions);
if ((pair[1]==0)||(pair[1]==1)) return this.dfrac(pair[0],"","",foptions);
else if (pair[0]<0) return this.dfrac("- ",-pair[0],pair[1],foptions);
else return this.dfrac("",pair[0],pair[1],foptions);
}
function num2ofrac(num,MAX,MIN) {
var pair=this.num2frac(num,MAX,MIN);
if ((typeof pair!="object")||(typeof pair[1]!="number")) return num;
if ((pair[1]==0)||(pair[1]==1)) return pair[0];
else return "@fo"+pair[0]+"@fb"+pair[1]+"@fc";
}
function ofrac2num(t) {
var pair=null;
if ((typeof t!="string")||(isFinite(t))||(t=="NaN")) return t;
if ((pair=t.match(/^ *@fo([^@]*)@fb([^@]*)@fc *$/))!=null) {
return this.frac2num(pair[1],pair[2]);
}
else return NaN;
}
function ofrac2str(t,options) {
var pair=null,num,den,gcdn;
if (typeof options != "string") options="";
if ((typeof t!="string")||(isFinite(t))||(t=="NaN")) return t;
if ((pair=t.match(/^ *@fo([^@]*)@fb([^@]*)@fc *$/))!=null) {
num=pair[1];den=pair[2];
if ((den==0)&&(1/den==-1/0)) return num;
if (options.indexOf("none")>=0) {
if (options.indexOf("display")>=0) return this.dfrac('',num,den);
else return this.drfmat(num,den);
} 
if (den==0) return NaN;
if (options.indexOf("simplify")>=0) {
num-=0;den-=0;
gcdn=this.gcd(num,den);
if (gcdn>1) {num/=gcdn;den/=gcdn;}
if (den<0) {num=-num;den=-den;}
}
if ((num==0)||(den==1)) return num;
if (options.indexOf("display")>=0) {
var whole="";
if ((options.indexOf("improper")<0)&&(Math.abs(num)>Math.abs(den))) {
var sign=(num*den < 0);
num=Math.abs(num);
den=Math.abs(den);
whole=Math.floor(num/den);
num=num%den;
if (sign) whole=-whole;
if (num==0) return whole;
else return this.dfrac(whole,num,den);
}
else if (num<0) return this.dfrac('- ',-num,den);
else return this.dfrac('',num,den);
}
else return this.drfmat(num,den);
}
if (t.indexOf("@fo")!=t.lastIndexOf("@fo")) {
t=t.replace(/@fo/g,"\xF2@fo").replace(/@fc/g,"@fc\xF2");
var chunks=t.split("\xF2");
if (options.indexOf("display")>=0) {
t="<itable><tr><td>"+this.ofrac2str(chunks[0],options);
for(var i=1;i<chunks.length;i++) 
t+="</td><td>"+this.ofrac2str(chunks[i],options);
t+="</td></tr></itable>"; 
}
else {
t="";
for(var i=0;i<chunks.length;i++) t+=this.ofrac2str(chunks[i],options);
} 
} 
return t;
}
function oMatrix(nrows,ncols) {
if (!(BeRn.ZZf_y(nrows,ncols)&&(nrows>0)&&(ncols>0))) {nrows=-1;ncols=0;}
this.nrows=nrows;this.ncols=ncols;this.numer=false;
this.data=new Array(Math.max(0,nrows*ncols));
this.toString=function () {
var result= "@mo"+this.nrows+","+this.ncols+"@lo\n";
for (var i=0;i<this.nrows;i++) for (var j=0;j<this.ncols;j++) 
result+=((i+j==0)?"":(j==0)?",\n":",\t")+this.data[j+i*this.ncols];
result+="\n@lc@mc\n";
result=result.replace(/\n/g,"\t");
return result;
};
this.copy=function () {
var result=new BeRn.oMatrix(this.nrows,this.ncols);
result.numer=this.numer;
for (var i=0;i<this.nrows;i++) for (var j=0;j<this.ncols;j++) 
result.data[j+i*this.ncols]=this.data[j+i*this.ncols];
return result;
} 
this.toNumbers=function () {
if (this.numer) return;
for (var i=0;i<this.nrows;i++) for (var j=0;j<this.ncols;j++) {
this.data[j+i*this.ncols]=BeRn.ofrac2num(this.data[j+i*this.ncols]);
}
this.numer=true;
}
this.otype="matrix";
}
function isOfType(obj,type) {
if (typeof obj != "object") return false;
if (! obj.otype) return false;
return (obj.otype==type)
}
function detmatrix(_mat,frac) {
var mat;var docopy=true;
if (typeof _mat == "string") {mat=this.makematrix(_mat);docopy=false;}
else mat=_mat;
if (! isOfType(mat,"matrix")) return NaN;
if (!mat.numer) {if (docopy) mat=mat.copy();mat.toNumbers();}
var minor,c,i,j,k,l=mat.ncols,product,sum=0,minor,sign=true;
if ((l!=mat.nrows)||(mat.nrows<0)) return NaN;
if (l==1) {sum=mat.data[0];}
else if (l==2) {sum=mat.data[0]*mat.data[3]-mat.data[1]*mat.data[2];}
else for(c=0;c<l;c++) {
minor=new this.oMatrix(l-1,l-1);minor.numer=true;
k=0;for(i=1;i<l;i++) for(j=0;j<l;j++) 
if (j!=c) minor.data[k++]=mat.data[j+i*l];
product=this.detmatrix(minor,false)*mat.data[c];
if (sign) sum+=product;else sum-=product;sign=!sign;
}
if ((sum==Math.round(sum))||(frac=="false")||(frac===false)) return sum;
else if ((frac) && !isNaN(frac)) return this.num2dfrac(sum,frac-0);
else return this.num2dfrac(sum);
}
function ZZOiJ(mat,col) {
var i,j,k,l=mat.ncols;
if (!(ZZf_y(col)&&(col>=0)&&(col<=l)&&(l==mat.nrows))) return null;
var result=new this.oMatrix(l-1,l-1);result.numer=true;
k=0;for(i=1;i<l;i++) for(j=0;j<l;j++) if (j!=col) result.data[k++]=mat.data[j+i*l];
return result;
}
function opermatrices(oper,matr1,matr2,options) {
var dofrac=true;var doeval=true;
var type1=false;var type2=false;
if (typeof options=="string") {
if (options.indexOf("nofrac")>=0) frac=false;
else if (options.indexOf("frac")>=0) frac=true;
if (options.indexOf("noeval")>=0)    doeval=false;
else if (options.indexOf("eval")>=0) doeval=true;
}
if (typeof matr1 == "string") {matr1=this.makematrix(matr1);type1=true;}
if (typeof matr2 == "string") {matr2=this.makematrix(matr2);type2=true;}
if ((oper!='+')&&(oper!='-')&&(oper!='*')) return NaN;
if ((! isOfType(matr1,"matrix"))||(! isOfType(matr2,"matrix"))) return NaN;
if (!((matr1.nrows>0)&&(matr1.ncols>0)&&(matr2.nrows>0)&&(matr1.ncols>0))) return NaN;
if ((oper=="*")&&(matr2.nrows!=matr1.ncols)) return NaN;
else if (((oper=="+")||(oper=="-"))&&
((matr1.nrows!=matr2.nrows)||(matr1.ncols!=matr2.ncols))) return NaN;
var nrows=matr1.nrows;var ncols=matr2.ncols;
if ((doeval)&&(!matr1.numer)) { if (!type1) matr1=matr1.copy();matr1.toNumbers();}
if ((doeval)&&(!matr2.numer)) { if (!type2) matr1=matr1.copy();matr1.toNumbers();}
type1=doeval;
var num1,num2,res,sum,k;
var result=new this.oMatrix(nrows,ncols);
if ((oper=='+')||(oper=='-')) {
k=(oper=='+')?1:-1;
sum=(oper=='+')?" + ":" - ";
for(var i=0;i<nrows;i++) for(var j=0;j<ncols;j++) {
var num1=matr1.data[j+i*ncols];
var num2=matr2.data[j+i*ncols];
if (doeval) {
res=(this.ofrac2num(num1)-0)+k*this.ofrac2num(num2);
if (( res!=Math.round(res) )||(dofrac)) {res=this.num2ofrac(res);type1=false;}
result.data[j+i*ncols]=res;
} 
else result.data[j+i*ncols]="<nobr>"+num1+sum+num2+"</nobr>";
}
}
else for(var i=0;i<nrows;i++) for(var j=0;j<ncols;j++) {
if (doeval) {res=0;
for(var k=0;k<matr1.ncols;k++) 
res+=this.ofrac2num(matr1.data[k+i*matr1.ncols])*
this.ofrac2num(matr2.data[j+k*matr2.ncols]);
if (( res!=Math.round(res) )||(dofrac)) {res=this.num2ofrac(res);type1=false;}
result.data[j+i*ncols]=res;
} 
else {
res="<nobr>";
for(var k=0;k<matr1.ncols;k++) {
if (k>0) res+=" + ";
res+=""+matr1.data[k+i*matr1.ncols]+"*"+matr2.data[j+k*matr2.ncols];
}
res+="</nobr>";   
result.data[j+i*ncols]=res;
}   
}
result.numer=type1;
return result;
}
function addmatrices(matr1,matr2,options) {
return this.opermatrices("+",matr1,matr2,options);
}
function subtractmatrices(matr1,matr2,options) {
return this.opermatrices("-",matr1,matr2,options);
}
function multiplymatrices(matr1,matr2,options) {
return this.opermatrices("*",matr1,matr2,options);
}
function makematrix(nrows,ncols,list) {
if (arguments.length==1) {
var mystr=arguments[0];
if ((typeof mystr != "string")||(mystr.indexOf("@mo")<0)) return null;
mystr=mystr.replace(/@f/g,"\xF1");
var myar=mystr.match(/^\s*@mo(-?\d+)\s*,\s*(\d+)@lo\s*([^@]+[^\s])\s*@lc@mc\s*$/);
if (myar==null) return null;
nrows=myar[1];ncols=myar[2];list=""+myar[3];
list=list.replace(/\xF1/g,"@f");
} 
else {
if (typeof list != "string") return null;
list=list.replace(/,/g,",\t"); 
}
var arr=list.split(/,[\t\n]/);
nrows=this.ZZPpc(nrows);ncols=this.ZZPpc(ncols);
if (! ZZf_y(nrows,ncols) || (nrows*ncols != arr.length)) return null;
result=new this.oMatrix(nrows,ncols);
result.numer=true;
for(var i=0;i<arr.length;i++) {
var res=this.makefraction(arr[i]);
if ((result.numer)&&(!isFinite(res))) result.numer=false;
result.data[i]=res;
}
return result;
}
function showmatrix(mat,params) {
if (typeof mat == "string") mat=this.makematrix(mat);
if (! isOfType(mat,"matrix")) return NaN;
var i,j,nrows=mat.nrows,ncols=mat.ncols;
if (nrows<0) return null;
var mborder="mat",aug=false,boxed=false,pcol=-1,boxrow=-1,boxcol=-1,evalfrac="";
if (arguments.length==1) params="improper,drf";
else params="improper,drf,"+params;
var tmp;
tmp=params.match(/augm=(\d+)/);
if (tmp!=null) {aug=true;pcol=tmp[1];params=params.replace(/\s*,\s*augm=\d+\s*/,""); }
tmp=params.match(/brow=(\d+)/);
if (tmp!=null) {boxrow=tmp[1]-1;params=params.replace(/\s*,\s*brow=\d+\s*/,"");}
tmp=params.match(/bcol=(\d+)/);
if (tmp!=null) {boxcol=tmp[1]-1;params=params.replace(/\s*,\s*bcol=\d+\s*/,"");}
if ((pcol<1)||(pcol>ncols-1)) aug=false;
if ((boxcol<0)||(boxcol>=ncols)||(boxrow<0)||(boxrow>=nrows)) boxed=false;else boxed=true;
var parar=params.split(",");
for(i=0;i<parar.length;i++) switch (parar[i]) {
case "mat":case "det":case "text":
case "paren":case "brace":case "bracket":
case "norm":case"vert":case "tiny":
mborder=parar[i];break;
case "simplify":case "none":case "full":case "small":
evalfrac+=","+parar[i];break;
}
var list=new Array(mat.data.length);
for(i=0;i<mat.data.length;i++) {
list[i]=this.ofrac2str(mat.data[i],evalfrac);
if (boxed &&( i == boxrow*ncols+boxcol )) {
list[i]="<nobr><box>"+(list[i]+'').replace(/<\/?[a-zA-Z][^>]*>/g,"").
replace(/\&\w+;/g," ").replace(/\$[.:a-zA-Z0-9]*\$/g,"")+
"</box></nobr>";
} 
}
if (aug) return this.daugmat(nrows,ncols,pcol,list);
else return this.dmatdet(mborder,nrows,ncols,list);
}
function makefraction(str) {
str=""+str;
if (str.indexOf("/")>0) {
str=str.replace(/<\//g,"\xF2");
str=str.replace(/^([^\/]*)\/([^\/]*)$/,"@fo$1@fb$2@fc");
str=str.replace(/\xF2/g,"<\//");
}
return str;
}
function showfraction(str,options) {
if (!options) options="";
str=""+str;
if (str.indexOf("/")>0) {
str=str.replace(/<\//g,"\xF2");
str=str.replace(/^([^\/]*)\/([^\/]*)$/,"@fo$1@fb$2@fc");
str=str.replace(/\xF2/g,"<\//");
}
return this.ofrac2str(str,"display,"+options);
}
function makecomplex(s) {
if (arguments.length==3) {
var opt=(arguments[2]+"").toLowerCase();
var u=arguments[0]-0;
var v=arguments[1]-0;
if (isNaN(u+v)) return NaN;
else if (opt.indexOf('rec')>=0) return [u,v];
else if (opt.indexOf('pol')>=0) return this.pol2rec(u,v);
else if (opt.indexOf('deg')>=0) return this.pol2rec(u,this.deg2rad(v));
}
if (arguments.length==2) {
var x=arguments[0]-0;
var y=arguments[1]-0;
if (isNaN(x+y)) return NaN;
else return [x,y];
}
if (isFinite(s)) return [s-0,0];
else if (typeof s=="number") return NaN;
else if (! s) return [0,0];
res=(s+"").split(",");
res[0]-=0;res[1]-=0;
if (isNaN(res[0]+res[1])) return NaN;
else return res;
}
function showcomplex(z,opt) {
var rfrm=6;var cfrm=41;var qfrm=0;
if (!z.sort) {z=this.makecomplex(z);if (!z.sort) return "9999999999";}
if (! opt) opt="";else opt=","+opt+",";
opt=opt.replace(/\*/g,'-').replace(/(R|-)\./g,'$1');
var i,t,re,im,fa,fb,signR='',signI='+',bxt="",byt="";
t=parseFloat(opt);if (t) rfrm=t;
if ((i=opt.lastIndexOf("C"))>=0) {cfrm=opt.substr(i+1,2)-0;}
if ((i=opt.lastIndexOf("Q"))>=0) {
t=parseFloat(opt.substring(i+1));
if (t>=1) qfrm=t;else qfrm=1e2;
if (rfrm>0) qfrm+=", 0.9e-"+rfrm;
}
if ((i=opt.search(/[^B]R/))>=0) {t=parseFloat(opt.substring(i+2));if (t) rfrm=t;}
if (opt.indexOf('B')>0) {
var opts=opt.replace(/([^xy])B/,'$1zB');
if (opts.search(/xB/)>0) {
bxt=opts.replace(/.*xB([^,]*).*/,"$1");
if (bxt) bxt="<box="+bxt+">";else bxt="<box>";
}
if (opts.search(/yB/)>0) {
byt=opts.replace(/.*yB([^,]*).*/,"$1");
if (byt) byt="<box="+byt+">";else byt="<box>";
}
if (opts.search(/zB/)>=0) {
bxt=opts.replace(/.*zB([^,]*).*/,"$1");
if (bxt) bxt="<box="+bxt+">";else bxt="<box>";
byt=bxt;
}
}
var re=z[0];var im=z[1];
if (re<0) {signR='-';re=-re;}
if (im<0) {signI='-';im=-im;}
if (qfrm) {
fa=this.num2frac(re,qfrm);
fb=this.num2frac(im,qfrm);
if ((fa[1]!=0)&&(fb[1]!=0)) {
if (fa[1]!=1) re=this.dfrac(fa[0],fa[1]);
if (fb[1]!=1) im=this.dfrac(fb[0],fb[1]);
} else qfrm=0;
} 
if ((! qfrm)&&(rfrm!=0)) {
re=this.ZZCJI(re,rfrm);
im=this.ZZCJI(im,rfrm);
}
var swap=false;if (cfrm>=40) {swap=true;cfrm-=40;}
var imunit=(['i','j','I','J'])[Math.floor(0.1*cfrm)];
cfrm=cfrm%10;
var formats=(" , , <i>,</i> , <b>,</b> , <b><i>,</i></b> ").split(",");
imunit=formats[2*cfrm]+imunit+formats[2*cfrm+1];
if (opt.indexOf('S')>=0) {
if ((re-0==0)&&(im-0==0)) return '0';
if (re-0==0) {re='';signR='';if (signI=='+') signI='';}
if (im-0==0) {im='';signI='';imunit='';}
else if (im-0==1) {im='';}
}
if (bxt) {re=bxt+signR+re+'</box>';signR='';}
if (byt) {
if (signI=='-') {im=byt+'-'+im+'</box>';signI='+';}
else im=byt+im+'</box>';
}
if (swap) {
return signR+re+' '+signI+imunit+im+' ';
}
else return signR+re+' '+signI+' '+im+' '+imunit;
}
function evalcomplex(oper,z0,z1,z2) {
if (typeof oper!="string") return NaN;
var ch=oper.charAt(0);
if ("+-*/^h".indexOf(ch)>=0) {
if (! z0.sort) z0=this.makecomplex(z0);
if (! z1.sort) z1=this.makecomplex(z1);
if ((z0!=z0)||(z1!=z1)) return NaN;
} else if ("rimac".indexOf(ch)>=0) {
if (! z0.sort) z0=this.makecomplex(z0);
if (z0!=z0) return NaN;
} else if ("f12".indexOf(ch)>=0) {
if (! z0.sort) z0=this.makecomplex(z0);
if (! z1.sort) z1=this.makecomplex(z1);
if (! z2.sort) z2=this.makecomplex(z2);
if ((z0!=z0)||(z1!=z1)||(z2!=z2)) return NaN;
} else return NaN;
var x,y,u,v,w,norm,result;
switch(ch) {
case '+': result = [z0[0]+z1[0],z0[1]+z1[1]];break;
case '-': result = [z0[0]-z1[0],z0[1]-z1[1]];break;
case '*': x=z0[0]*z1[0]-z0[1]*z1[1];
y=z0[0]*z1[1]+z0[1]*z1[0];
result = [x,y];break;
case '/': norm=z1[0]*z1[0]+z1[1]*z1[1];if (! norm) result = NaN;  
x=z0[0]*z1[0]+z0[1]*z1[1];
y=z0[1]*z1[0]-z0[0]*z1[1];
result = [x/norm,y/norm];break;
case 'h': u=[z0[0]*z1[0]-z0[1]*z1[1],z0[0]*z1[1]+z0[1]*z1[0]];
v=[z0[0]+z1[0],z0[1]+z1[1]];
result = this.evalcomplex('/',u,v);break;
case 'r': result = z0[0];break;
case 'i': result = z0[1];break;
case 'c': result = [z0[0],-z0[1]];break;
case 'm': result = Math.sqrt(z0[0]*z0[0]+z0[1]*z0[1]);break;
case 'a':   u=this.rec2pol(z0[0],z0[1]);
if (u[0]==0) result = NaN;
else result = u[1];break;
case '^':   if ((z0[1]==0)&&(z1[1]==0)&&(z0[0]>=0)) result=[Math.pow(z0[0],z1[0]),0];
else if (z1[1]==0) {
u=this.rec2pol(z0[0],z0[1]);
result=this.pol2rec(Math.pow(u[0],z1[0]),u[1]*z1[0]);
} else if ((z0[0]>0)&&(z0[1]==0)) {
result=this.pol2rec(Math.pow(z0[0],z1[0]),z1[1]*Math.log(z0[0]));
} else {
w=this.rec2pol(z0[0],z0[1]);
u=Math.log(w[0]);
result=this.pol2rec(exp(z1[0]*u-w[1]*z1[1]),w[1]*z1[0]+u*z1[1]);
};break;
case 'f':   norm=z2[0]*z2[0]+z2[1]*z2[1];if (! norm) result = NaN;
x=(z1[0]*z2[0]+z1[1]*z2[1])/norm;
y=(z1[1]*z2[0]-z1[0]*z2[1])/norm;
result = [z0[0]-x,z0[1]-y];break;
case '1': norm=z0[0]*z0[0]+z0[1]*z0[1];
if (norm<1e-20) {result=this.evalcomplex('f',z0,z2,z1);break;}
var w1=this.evalcomplex('*',z1,z1);
var w2=this.evalcomplex('*',z0,z2);
var w3=this.evalcomplex('f',w1,w2,0.25);
w1=this.evalcomplex('^',w3,0.5);
w2=this.evalcomplex('-',w1,z1);
w3=this.evalcomplex('*',z0,2);
result=this.evalcomplex('/',w2,w3);break;
case '2': norm=z0[0]*z0[0]+z0[1]*z0[1];
if (norm<1e-20) {result=this.evalcomplex('f',z0,z2,z1);break;}
var w1=this.evalcomplex('*',z1,z1);
var w2=this.evalcomplex('*',z0,z2);
var w3=this.evalcomplex('f',w1,w2,0.25);
w1=this.evalcomplex('^',w3,0.5);
w2=this.evalcomplex('+',w1,z1);
w3=this.evalcomplex('*',z0,-2);
result=this.evalcomplex('/',w2,w3);break;
default : result=NaN;   
}
return result;
}
function rad2deg(x) {return x/Math.PI*180.0;}
function deg2rad(x) {return x*Math.PI/180.0;}
function pol2rec(m,a) {return [m*Math.cos(a),m*Math.sin(a)];}
function rec2pol(x,y) {
var m,a;
m=Math.sqrt(x*x+y*y);
if (m==0) return [0,0];
a=Math.atan(y/x);
if ((x>=0)&&(y>=0)) return [m,a];
else if ((x>=0)&&(y<0)) return [m,a+2*Math.PI];
else return [m,a+Math.PI];
}
function mpvar(name,a,b,n) {
var result="";
if (arguments.length==2) result+="="+a;
else if (arguments.length>=3) result+=":"+a+","+b;
if (n) result+=","+n;
return "[&var "+name+result+"&]";
}
function mpterm(coef,base,exp) {
var val=0,str='',result='';
if (arguments.length==2) {style='';exp=base;base=coef;coef='';}
if ((typeof exp=="undefined")||(ZZqOM(exp))||(exp-0==1)) exp=1;
if ((typeof base == 'undefined')||(base==1)||(exp-0==0)) base='';
else {base+='';}
if (this.ZZqOM(coef)) val=1;
else val=this.r007(this.ZZVtv(coef));
if ((val==0)||(base==' 0')) return "&null;";
if ((val!=1)&&(base.charAt(0)>='0')&&(base.charAt(0)<='9')) base=' '+base;
else if (this.ZZqOM(base)) return (val==val)?val:coef;
else str=(val==1)?'':(val==-1)?'-':(val==val)?val:coef;
if (exp==1) result=str+''+base;
else result=str+""+base+"<x>"+exp+"</x>";
return result;
}
function mpfrac(whole,num,den,options) {
if (arguments.length==1) {den="";num="";}
else if (arguments.length==2) {den=num+'';num=whole+'';whole="";}
else {whole+='';num+='';den+='';}
if ((num==="")&&(den==="")) return "\t"+whole;
if ((num.search(/^-[^\+\-]*$/)==0)&&(whole-0==0)&&((options+"").indexOf('S')<0)) {
whole='-';num=num.substr(1);
}
if (whole-0==0) return "<nmr>"+num+"</nmr><den>"+den+"</den>";
else return "\t"+whole+"<nmr>"+num+"</nmr><den>"+den+"</den>";
}
function mprad(coef,rad,idx) {
if (arguments.length==1) {rad=''+coef;coef='';idx='';}
else if (arguments.length==2) {idx=''+rad;rad=''+coef;coef='';}
else {idx+='';rad+='';coef+='';}
if(idx=="2") idx="";else idx=this.strip(idx);
var result="";
if (coef-0==1) coef="";
else if (coef-0==-1) coef="-";
if (ZZqOM(coef)&& ZZqOM(idx)) return "<rdn></rdn><rad>"+rad+"</rad>";
else if (ZZqOM(coef)) return "<rdn>"+idx+"</rdn><rad>"+rad+"</rad>";
else if (ZZqOM(idx)) return "\t"+coef+"<rdn></rdn><rad>"+rad+"</rad>";
else return "\t"+coef+"<rdn>"+idx+"</rdn><rad>"+rad+"</rad>";
}
function empfrac(whole,num,den,options) {
var tmp;
var numarg=arguments.length-1;options=arguments[numarg];
if (options==="") options=",";
else {
tmp=this.ZZVtv(options);
if (isFinite(tmp)) {options=",";numarg++;}
else options=','+options+',';
}
var noeval=(options.indexOf(',no')>=0)?'no':'ev';
var nsign=(options.indexOf('S')>=0)?'S':'';
options=options.replace(/,no(ne|eval)?,/ig,',').replace(/,ev(al)?,/ig,',');
var farr;
if (numarg>=3) farr=this.efrac(whole,num,den,noeval);
else if (numarg==2) farr=this.efrac(whole,num,noeval);
else if (numarg==1) farr=this.efrac(whole,noeval);
whole=farr[0];num=farr[1];den=farr[2];var inum=farr[3];
var re=/,(mi(xed)?1?|im(proper)?1?|i?n(um)?|wh(ole)?|de(n)?),/;
var rtype=re.exec(options);
if (!rtype || !rtype[1]) rtype="mi";else rtype=''+rtype[1];
switch (rtype) {
case 'mi':case'mixed':
if (! num) return mpfrac(whole,'','',nsign);
else return mpfrac(whole,num,den,nsign);
case 'im':case 'improper':
if (! num) return mpfrac(whole,'','',nsign);
else return mpfrac('',inum,den,nsign);
case 'mi1':case'mixed1':return mpfrac(whole,num,den,nsign);
case 'im1':case 'improper1':return mpfrac('',inum,den,nsign);
default:mpfrac(whole,num,den,nsign);
}
}
function term(a,x) {
var aval = this.ZZVtv(a);var z;
if (!this.ZZrcD(aval)) return a+" "+x;
as = this.r007(Math.abs(aval));
switch(aval){
case  0: z="&null;";break;
case -1: if (x) z=' - '+x;else z=' - 1';break;
case  1: if (x) z=' + '+x;else z=' + 1';break;
default:if (aval<0) z=" - "+as+""+x;else z=" + "+as+""+x;
}
return z;
}
function term1(a,x) {
var aval = this.ZZVtv(a);var z;
if (!this.ZZrcD(aval)) return a+" "+x;
as = this.r007(Math.abs(aval));
switch(aval){
case  0: z="&pnull;";break;
case -1: if (x) z='-'+x;else z='-1';break;
case  1: if (x) z=''+x;else z='1';break;
default:if (aval<0) z="-"+as+""+x;else z=" "+as+""+x;
}
return z;
}
function mktable(s,rows,cols,border) {
var elems=(s+"").split(/\s*,\s*/);
if (! border) border=0;
if ((border=="true")||(border===true)) border=1;
if (isFinite(border-0)) border='border='+border;
var result='<table cellspacing=0 cellpadding=5 '+border+'>';
var count=-1;
for(var i=0;i<rows;i++) {
result+="\n<tr>";
for(var j=0;j<cols;j++) {
result+='<td>';
if (++count<elems.length) result+=elems[count];
else result+="&nbsp;";
result+="</td>";
}
result+="</tr>";
}
result+="\n</table>";
return result;
}
function paren(opt,txt) {
var i,j,k,l,tp,tpl,tpr,tps;
var bnameL=['tiny','parenleftz','bracketleftz','braceleftz','vertz','normz'];
var bnameR=['tiny','parenrightz','bracketrightz','bracerightz','vertz','normz'];
var items=new Array();
if (arguments.length==1) {items[0]=opt;opt='11h35';}
else for(i=1;i<arguments.length;i++) items[i-1]=arguments[i];
opt+="";opt=opt.replace(/[^0-9A-Za-z]*/g,'');
if (opt.indexOf('h')<0) opt+='h25';
j=opt.search(/[^0-9]/);
if (j==0) {opt='11'+opt;}
else if (j==1) opt=opt.substring(0,1)+opt;
else if (j>2) opt=opt.substring(0,2)+opt.substring(j);
tp=opt.substr(0,1)-0;if (!(tp>=0 && (tp <= 5))) tp=0;tpl=bnameL[tp];
tp=opt.substr(1,1)-0;if (!(tp>=0 && (tp <= 5))) tp=0;tpr=bnameR[tp];
tp=opt.replace(/(h\d\d+).*/,'$1').replace(/.*h(\d\d+)/,'$1')-0;
if (!(tp>=10 && (tp <=800 ))) tp=25;tps=tp;
tp=String.fromCharCode(Math.floor(Math.max(Math.min(tps,125),15)/5)+94);
if (tpl.lastIndexOf('z')==tpl.length-1) {
tpl+=tp;if (tps % 5) tpl+=":h"+tps;
} else tpl+=":h"+tps;
if (tpr.lastIndexOf('z')==tpr.length-1) {
tpr+=tp;if (tps % 5) tpr+=":h"+tps;
} else tpr+=":h"+tps;
result="<itable=P0p0A0><tr><td=m>$"+tpl+"$</td>";
for(i=0;i<items.length;i++) result+="<td>"+items[i]+"</td>";
result+="<td=m>$"+tpr+"$</td></tr></itable>";
return result; 
}
function dscinot(num,nexp,opt) {
var result="";
if (arguments.length==1) {nexp='';opt='';}
else if (arguments.length==2) {
if (isFinite(nexp)) opt='';else {opt=nexp;nexp='';}
}
opt=","+opt+",";
var ev=true, dnum="", dexp="",sf=0;
if (opt.search(/, *no/)>=0) ev=false;
if (! ev) {
dnum=num;
dexp=nexp;
opt=opt.replace(/, *no[^,]*,/,',');
} else {
if (!isFinite(num)) num=this.ZZVtv(num);
sf=this.getsigfig(num);
dnum=(num-0).toExponential(sf-1);
sf=dnum.indexOf('e');
dexp=(dnum.substring(sf+1)-0)+(nexp-0);
dnum=dnum.substring(0,sf);
}
if (opt.search(/, *S\d+/)>=0) {
sf =opt.replace(/, *S(\d+).*/,',S$1').
replace(/.*,S(\d+)/,'$1');
opt=opt.replace(/, *S\d+/,',');
dnum=this.ZZCJI(dnum,1-sf);
} 
else if (opt.search(/, *R\d+/)>=0) {
sf =opt.replace(/, *R(\d+).*/,',R$1').
replace(/.*,R(\d+)/,'$1');
opt=opt.replace(/, *R\d+/,',');
dnum=this.ZZCJI(dnum,sf-0);
}  
if (opt.toLowerCase().indexOf('coef')>0) return ''+dnum;
if (opt.toLowerCase().indexOf('exp')>0) return ''+dexp;
if (opt.toLowerCase().indexOf('calc')>0) return ''+dnum+'E'+dexp;
if (opt.indexOf('B')<0) {
result="<nobr>"+dnum+" $times$ 10<sup>"+dexp+"</sup></nobr>";
} else { 
var xB=false,yB=false;
if (opt.search(/, *B/)>=0) {
xB=true;yB=true;opt=opt.replace(/, *B[^,]*,/,',');
}
if (opt.search(/, *xB/)>=0) {
xB=true;opt=opt.replace(/, *xB[^,]*,/,',');
}
if (opt.search(/, *yB/)>=0) {
yB=true;opt=opt.replace(/, *yB[^,]*,/,',');
}
opt=opt.replace(/ +/g,'').replace(/,,+/g,',').replace(/^,|,$/g,'');
if (opt) opt="="+opt;
var hb=5;
if (xB)  dnum="<box"+opt+">"+dnum+"</box>";
if (yB)  {
if (isFinite(dexp)) {
dexp-=0;
var s="";var j=this.ZZqLf(1,4);
for(var k=0;k<6;k++) if (k!=j) s+=":"+(2*(k-j)+dexp);
dexp="<box>"+dexp+s+"</box>";
} else {
dexp+="";
if (dexp.indexOf(":")>0) dexp="<box>"+dexp+"</box>";
else dexp="<box>"+dexp.replace(/,/g,':')+"</box>";
}
hb=10;
result="<itable><tr><td=R2bn>"+
dnum+" $times$ 10&nbsp;</td><td=tn>"+dexp+""+
"</td></tr><tr><td=h"+hb+"></td></tr></itable>";
} else {
result="<nobr>"+dnum+" $times$ 10<sup>"+dexp+"</sup></nobr>";
}
}
return result;
}
function efrac(whole,num,den,options) {
var inum,tmp;
if (arguments.length==1) options='all,eval';
else options=(arguments[arguments.length-1]+'').toLowerCase();
if (this.nospace(whole+"")=='-') {tmp=0;num="-("+num+")";}
else tmp=this.ZZVtv(whole);
if (arguments.length<=2) {
if (options.indexOf('re')>=0) return tmp;
tmp=this.num2frac(tmp);
den=tmp[1];num=tmp[0];whole=0;
} else if (arguments.length==3) {
den=this.ZZVtv(num);num=tmp;whole=0;
} else {
num=this.ZZVtv(num);den=this.ZZVtv(den);
if (isFinite(tmp)) whole=tmp;else whole=0;
}
if (den<0) {num=-num;den=-den;}
if ((whole!=0)&&(den>0)) {num=whole*den+((whole<0)?-num:num);whole=0;}
if (! den) {num=NaN;whole=NaN;}
else if (options.indexOf('no')==-1) {
tmp=this.gcd(num,den);if (tmp>1) {num/=tmp;den/=tmp;}
}
if ((inum=num)) {
num=Math.abs(inum)%den;
whole=(Math.abs(inum)-num)/den;
if ((inum<0)&&(whole>0)) whole=-whole;
else if (inum<0) whole='-';
} 
if (options.indexOf('re')>=0) return inum/den;
else if (options.indexOf('in')>=0) return inum;
else if (options.indexOf('de')>=0) return den;
else if (options.indexOf('nu')>=0) return num; 
else if (options.indexOf('wh')>=0) return whole;
else return [whole,num,den,inum];
}
function edfrac(whole,num,den,options) {
var tmp;
var numarg=arguments.length-1;options=arguments[numarg];
if (options==="") options=",";
else {
tmp=this.ZZVtv(options);
if (isFinite(tmp)) {options=",";numarg++;}
else options=','+options+',';
}
var noeval=(options.indexOf(',no')>=0)?'no':'ev';
options=options.replace(/,no(ne|eval)?,/ig,',').replace(/,ev(al)?,/ig,',');
var farr;
if (numarg>=3) farr=this.efrac(whole,num,den,noeval);
else if (numarg==2) farr=this.efrac(whole,num,noeval);
else if (numarg==1) farr=this.efrac(whole,noeval);
whole=farr[0];num=farr[1];den=farr[2];var inum=farr[3];
var re=/,(mi(xed)?1?|im(proper)?1?|i?n(um)?|wh(ole)?|de(n)?),/;
var rtype=re.exec(options);
if (!rtype || !rtype[1]) rtype="mi";else rtype=''+rtype[1];
options=options.replace(re,',');
switch (rtype) {
case 'mi':case'mixed':
if (! num) return dfrac(whole,'','',options);
else return dfrac(whole,num,den,options);
case 'im':case 'improper':
if (! num) return dfrac(whole,'','',options);
else return dfrac('',inum,den,options);
case 'mi1':case'mixed1':return dfrac(whole,num,den,options);
case 'im1':case 'improper1':return dfrac('',inum,den,options);
case 'in':case 'inum':return inum;
case 'nu':case 'num':return num;
case 'wh':case 'whole':return whole;
case 'de':case 'den':return den;
default:dfrac(whole,num,den,options);
}
}
function strip(str)   {return (''+str).replace(/^\s+|\s+$/g,"");}
function nospace(str)   {return (''+str).replace(/ /g,"");}
function uppercase(str) {return (''+str).toUpperCase();}
function lowercase(str) {return (''+str).toLowerCase();}
function getSeedArray(numseeds,startseed,maxseed) {
var a=1366,b=150889,c=714025;
var i, result;
startseed=Math.round(startseed);
numseeds=Math.round(numseeds);
maxseed=Math.round(maxseed)+1;
if (!((startseed>=1) && (startseed<c))) startseed=Math.floor(Math.random()*c);
if (!((numseeds>=1) && (numseeds<=255))) numseeds=10;
if (!((maxseed>=1) && (maxseed<=c))) maxseed=c;
result=new Array(numseeds);
result[0]=startseed;
for(i=1;i<numseeds;i++) {
result[i]=(result[i-1]*a+b)%c;
result[i-1]%=maxseed;
} 
result[numseeds-1]%=maxseed;
return result;
}
function randomseed() {
var n=arguments.length;
if (n==0) return ZZFmC();
var i=Math.floor(n*this.random());
var seed=Math.round(arguments[i]);
if ((0<seed)&&(seed<1000000)) ZZQYc(seed);
return (i+1);
}
function ZZQYc(num) {this.ZZWBe=Math.round(Math.abs(num))%714025;}
function ZZFmC() {return this.ZZWBe;}
function random() {
this.ZZWBe=(this.ZZWBe*1366+150889)%714025;
return (this.ZZWBe/714025);
}
function sortOnNumPosition(a,b) {
if (!isFinite(a)) return 1;
else if (!isFinite(b)) return -1;
return a-b;
}
function sortOnRandPosition(a,b) {
if (!isFinite(a)) return 1;
else if (!isFinite(b)) return -1;
else return 2*Math.random()-1;
}
function myescape(str) {return unescape(escape(""+str).replace(/%([09]\d)/g,'[$1]'));}
function binesc(str) {
str=(str+"").replace(/@/g,'&#64;').replace(/\t/g,' ').
replace(/\"/g,"&#34;").replace(/\$/g,"&#36;").
replace(/&minus;/g,"-").replace(/~/g,"&#126;");
if (str.search(/[^\t\n -~]/)<0) return str;
str=str.replace(/[\u2212\xF6\xF7\u2013\u2014\u2015]/g,'-');
var i=0,cc=0,result="";
for(var i=0;i<str.length;i++) {
cc=str.charCodeAt(i);
if ((32<cc)&&(cc<128)) result+=str.charAt(i);
else if (cc>128) result+="&#"+cc+";";
else if ((cc!=9)&&(cc!=10)&&(cc!=13)) result+="&#11;";
else result+=str.charAt(i);
} 
return result;
}
function uni2esc(a) {return escape(a+"").replace(/@/g,'%40');}
function esc2box(a) {return unescape(a+"").
replace(/&/g,'&amp;').replace(/\"/g,'&quot;').
replace(/</g,'&lt;').replace(/>/g,'&gt;');
}
function esc2htm(a) {
var scode={
'x3C':'&lt;'  ,'x3E':'&gt;' ,'x26':'&amp;',
'x22':'&quot;','x5C':'&#92;','x23':'&#35;',
'x3A':'&#58;','x40':'&#64;','x5C':'&#92;'
};
var b,c,i,j;
b=(" "+a).split(/%/);
for(i=1;i<b.length;i++) {
if (b[i].indexOf('u')==0) b[i]='&#'+
parseInt('0x'+ b[i].substr(1,4))+";"+b[i].substr(5);
else { 
c='x'+b[i].substr(0,2).toUpperCase();
if (scode[c]) b[i]=scode[c]+b[i].substr(2);
else {
c=parseInt('0'+c);
if ((c>=32)&&(c<127)) b[i]=String.fromCharCode(c)+b[i].substr(2);
else b[i]='&#'+c+';'+b[i].substr(2);
} 
}
} 
return b.join("").substring(1);
}
function ZZGBu(str) {
str=(str+"").
replace(/\\/g,"\\\\"). 
replace(/\"/g,"\\\""). 
replace(/<\/([a-zA-Z])/g,"<\\/$1").
replace(/\n/g,"\\\\n");
return str; 
}
function debug_text(s,wordwrap) {
if (arguments.length==1) wordwrap=60;
s=s.replace(/&/g,'&amp;').
replace(/</g,'&lt;').
replace(/>/g,'&gt;');
var re=new RegExp("(.{"+wordwrap+"}[^ <>]*)([ <>])","g");
s=s.replace(re,'$1\n&#187; $2').replace(/\n&#187;( *\n)/g,"$1");
var win=window.open("",'show_text',
'scrollbars=yes,resizable=yes,width=730,height=350');
win.document.writeln("<HTML><BODY><PRE>"+s+"</PRE></BODY></HTML>");
win.document.close();
if( win.focus ) win.focus();
}
function debug_html(s) {
var win=window.open("",'show_html',
'scrollbars=yes,resizable=yes,width=730,height=350');
var htmlb='<html><head>'+'<base href="'+this.ccvURL+'">\n'+
'<link HREF="bv_styles.css" REL="stylesheet" TYPE="text/css">'+
'</head>\n<body>';
var htmle='\n</body></html>';
win.document.writeln(htmlb+s+htmle);
win.document.close();
if( win.focus ) win.focus();
}
function markbe(s,level) {
var c=0,i=0,j=0,k=0;
if (!level) level=100;else level*=100;
s+="";
while(true) {
i=s.indexOf('<b>');j=s.indexOf('<e>');
if (i<0) k=j;else if (j<0) k=i;
else k=Math.min(i,j);
if (k<0) break; 
if (k==i) c++;
s=s.substring(0,k+2)+(level+c)+s.substring(k+2);
if (k==j) c--;
if (c<0) return "ERROR "+s.substring(0,k)+"??"+s.substring(k);
}
if (c>0) {
k=s.lastIndexOf("<b"+(level+c));
return "ERROR "+s.substring(0,k)+"??"+s.substring(k);
} else return s;
}
function getParserVars(s) {
s=s.toLowerCase().
replace(/<\/?a-z]>/g,' ').
replace(/[a-z][a-z]+/g,' ').
replace(/[0-9.e]+/g,' ').
replace(/[^a-z]+/g,'');
if (s.length>1) {
var j=s.charCodeAt(0);
for(var i=1;i<s.length;i++) if (s.charCodeAt(i)!=j) {j=-1;break;}
if (j<0) return "ERROR";
else return s.substring(0,1);
} 
else return s;
}
function list() {
if (arguments.length==0) return [];
var result=new Array(arguments.length);
for(var i=0;i<arguments.length;i++) result[i]=arguments[i];
return result;
}
function parser(expr,vars,opts) {
var i,j,k,c,str,str1,str2,str3,neg,ovars;
if (! vars) vars=new Array();
else {  
str=','+vars+',';
str=str.replace(/[^,a-z0-9_]+/g,'').
replace(/,[^a-z][^,]*/g,'').
replace(/,+/g,',').
replace(/^,|,$/g,'');
if (str) vars=str.split(',');
else vars=new Array();
}
vars[vars.length]='pi';vars[vars.length]='e';
var vcomp=function (a,b){return (a.length!=b.length)?b.length-a.length:(a<b)?-1:1;};
ovars=(vars+'').split(',').sort(vcomp);
if ((!opts)&&(vars.length==2)) opts="n";
else if (!opts) opts="e";
else opts=(opts+"").replace(/[^a-z]+/g,"");
str=" "+(expr+"").toLowerCase().replace(/\s+/g,'')+" ";
str=str.replace(/([.0-9] *)e( [\+\-]*[0-9]+[^.0-9])/g,"$1*10^$2");
str=str.replace(/(<\/?)sup>/g,"$1x>");
var listForm=((str.indexOf(',')>0)&&(str.search(/^\s*\[[^\[\]]*\]\s*$/)==0));
str=str.replace(/[\[\{]/g,"(").
replace(/[\]\}]/g,")").
replace(/([ \(\^,])\+/g,"$1").
replace(/(<[a-z]*>)\+/g,"$1");
var rex_re=/([^0-9.])([1-9][0-9]*)<nmr>([0-9]+)<\/nmr><den>([0-9]+)<\/den>/;
var rex_str="";var rex_arr=null;
while ((rex_arr = str.match(rex_re)) != null) {
rex_str+=str.substring(0,rex_arr.index);
str=str.substring(rex_arr.index+rex_arr[0].length);
rex_str+=rex_arr[1]+"<nmr>"+
(rex_arr[2]*rex_arr[4]+(rex_arr[3]-0))+
"</nmr><den>"+rex_arr[4]+"</den>";
}
str=rex_str+str;
str=str.replace(/\|([^\|]*)\|/g,"<b>abs($1)<e>");
str=str.replace(/<nmr>/g,"<b>divd(").
replace(/<\/nmr><den>/g,")@(").
replace(/<\/den>/g,")<e>");
str=str.replace(/<rdn>2?<\/rdn><rad>/g,"<b>sqrt(").
replace(/<\/rad>/g,")<e>");
str=str.replace(/<rdn>/g,"<b>root(").
replace(/<\/rdn><rad>/g,")@(").
replace(/<\/rad>/g,")<e>");
str=str.replace(/<x>/g,"^<b>(").
replace(/<\/x>/g,")<e>").
replace(/<sub>/g,"_<b>(").
replace(/<\/sub>/g,")<e>");
str=str.replace(/log\^/g,'log_<b>(10)<e>^');
str=str.replace(/!([^=])/g,'^(114636.470669)$1');
str=str.replace(/arc(sin|cos|tan|cot|sec|csc)/g,"a$1");
str=str.replace(/(a?(sin|cos|tan|cot|sec|csc)h?)/g,"[$1]@").
replace(/(list|ln|log|abs|pow|exp|root|sqrt|divd|round)/g,"[$1]@").
replace(/,/g,")@(").replace(/@\+/g,'@');
str=str.replace(/([0-9]+)/g,'{$1}').replace(/\}\.\{/g,'.');
str=str.replace(new RegExp('('+ovars.join('|')+')','g'),'{$1}');
str1='';while(str1!=str) {str1=str;
str=str.replace(/(\[[a-z]*)[\{\}]([{}a-z]*\])/g,'$1$2');
str=str.replace(/(<[a-z]*)[\{\}]([{}a-z]*>)/g,'$1$2');
}
str1=str.replace(/\{[a-z]*\}/g,'').
replace(/\[[a-z0-9]*\]/g,'').
replace(/<[be]>/g,'');
if (str1.search(/[a-z]/)>=0) {
str1=(" "+str1).replace(/^.*[^a-z]([a-z]+).*$/,'$1');
j=str.indexOf(str1);
return "ERROR:?"+str1+"? pos "+j+"\n"+str;
} 
str=str.replace(/@\^(-*\{[^\}]*\})([^\^])/g,"@^<b>($1)<e>$2").
replace(/@\^(\([^\(\)]*\))([^\^])/g,"@^<b>$1<e>$2").
replace(/@\^-(\([^\(\)]*\))([^\^])/g,"@^<b>-($1)<e>$2");
str=str.replace(/\(/g,'(<b>').replace(/\)/g,'<e>)');
str=str.replace(/\{/g,'<b>{').replace(/\}/g,'}<e>');
str=this.markbe(str);
if (str.indexOf("ERROR")>=0) {
str=str.replace(/<[be][1-9][0-9][0-9]>/g,'');
if (str.indexOf("(??")>=0) return "ERROR '('\n"+str;
else return "ERROR ')'\n"+str;
}
k=str.length-1;c=200;
while((k=str.lastIndexOf(']',k))>=0) {
i=k+2;
while((str.charAt(i)=='^')||(str.charAt(i)=='_')) {
j=str.indexOf('<e'+str.substr(i+3,4),i)+5;
str=this.Insert(this.Remove(str,i),'@',j);i=j+1;
}
var need_parens;
if ((str.charAt(i)=='(')||(str.indexOf('-(',i)==i)) {
j=str.indexOf('<b1',i);
j=str.indexOf('<e'+str.substr(j+2,4),j)+7;
if (str.charAt(j)=='^') {
need_parens=true;
j=str.indexOf('<b1',j);
j=str.indexOf('<e'+str.substr(j+2,4),j)+6;
} else need_parens=(str.charAt(i)=='-');
str=str.substring(0,i)+'<b'+(++c)+'>'+((need_parens)?'(':'')+
str.substring(i,j)+((need_parens)?')':'')+'<e'+c+'>'+
str.substring(j);
k--;
continue;
}
str=this.Insert(str,'<b'+(++c)+'>(~',i);i+=7;
if ((str.indexOf('~[',i)==i)||(str.indexOf('~-[',i)==i)) {
str=this.Remove(str,i);
j=str.indexOf('<b2',i);
j=str.indexOf('<e'+str.substr(j+2,4),j)+6;
if (str.charAt(j)=='^') {
j=str.indexOf('<b1',j);
j=str.indexOf('<e'+str.substr(j+2,4),j)+6;
}
str=this.Insert(str,')<e'+c+'>',j);
} else {
if (str.charAt(i+1)=='-') str=str.replace(/~-/,'-~');
do {str1=str;
str=str.replace(/~(\{[a-z0-9]+\}|\^)/,'$1~');
if ((i=str.indexOf('~<b1',i))>=0) {
j=str.indexOf('<e'+str.substr(i+3,4),i)+5;
str=this.Insert(this.Remove(str,i),'~',j);
}
} while(str1!=str);
str=str.replace(/~/,')<e'+c+'>');
} 
k--;
}
str=str.replace(/<[be][1-9][0-9][0-9]>/g,'');
str=str.replace(/(\)|\})(\[|\(|\{)/g,"$1*$2");
str=str.replace(/^ | $/g,'');
j=str.search(/[^\]\)]@|@[^\(]/);if (j>=0) return "ERROR:@ pos "+j+"\n"+str;
j=str.search(/[^\+\-\/\*\(@\^][\{\(\[]/);if (j>=0) return "ERROR:TL pos "+j+"\n"+str;
j=str.search(/[^\}\)][\/\*\)\^]/);if (j>=0) return "ERROR:OL pos "+j+"\n"+str;
j=str.search(/[^\}\)\(\*\/\^][\+\-]/);if (j>=0) return "ERROR:+- pos "+j+"\n"+str;
j=str.replace(/\^-/g,'_').search(/[\^_][^\(\{\[]/);if (j>=0) return "ERROR:^ pos "+j+"\n"+str;
str=str.replace(/([\{\(])/g,"<b>$1").replace(/([\}\)])/g,"$1<e>");
str=this.markbe(str);i=0;c=400;
while((j=i=str.lastIndexOf('^'))>0) {
do {j=str.indexOf('<b',j);
j=str.indexOf('<e'+str.substr(j+2,4),j+6)+6;
} while (str.charAt(j)=='@')
k=str.lastIndexOf('<e',i);
k=str.lastIndexOf('<b'+str.substr(k+2,4),k);
str=str.substring(0,k)+'<b'+(++c)+'>'+'([pow]@('+
str.substring(k,i)+')@('+str.substring(i+1,j)+
'))<e'+c+'>'+str.substring(j);
}
str=str.replace(/<b4\d\d>\(|\)<e4\d\d>/g,'');
str=str.replace(/<[be][1-9][0-9][0-9]>/g,'');
str=str.replace(/\]@/g,'').
replace(/\[/g,'').
replace(/\)@\(/g,',').
replace(/log/g,"logb").
replace(/pow/g,"powb");
str=str.replace(/([,\(])\(([^\(\),]*)\)([,\)])/g,"$1$2$3").
replace(/([,\(])\(([^\(\),]*)\)([,\)])/g,"$1$2$3");
str=str.replace(/powb\(([^\(\),]*),\{2\}\)/g,"(($1)*($1))");
str=str.replace(/powb\(([^\(\),]*),\{3\}\)/g,"(($1)*($1)*($1))");
if (listForm) str=str.replace(/^\s*\((.*)\)\s*$/,'[$1]');
var dstr,estr,func,func1,numval,result;
estr=str.replace(/\{PI\}/ig,'Math.PI').replace(/\{E\}/ig,'Math.E');
vstr=estr;vars.length=vars.length-2;
estr=estr.replace(/[\}\{]/g,'');
dstr=str.replace(/[\}\{]/g,'');
if ((opts+"").indexOf('f')>=0) {
for(i=0;i<vars.length;i++) vstr=vstr.replace(
new RegExp('\\{'+vars[i]+'\\}','g'),'VA['+i+']');
vstr=vstr.replace(/[\}\{]/g,'');
try {func=new Function('VA','with (BeRn) {return ('+vstr+');}');}
catch(e) {func=NaN;}
} 
if ((opts+"").indexOf('g')>=0) {
try {func1=new Function(vars.join(','),'with (BeRn) {return ('+estr+');}');}
catch(e) {func1=NaN;}
}
numval=this.ZZVtv(estr);
result=new Array();
for(i=0;i<opts.length;i++) {
switch(opts.charAt(i)) {
case 'n':result[i]=numval;break;
case 'd':result[i]=dstr;break;
case 'e':result[i]=estr;break;
case 'f':result[i]=func;break;
case 'g':result[i]=func1;break;
case 'l':result[i]=vars.length;break;
case 's':result[i]=expr;break;
}
}
if (result.length==1) return result[0];
else return result;
}
function addcommas(str,skip4) {
if (str.indexOf('<noc>')<0 && str.indexOf('</noc>')<0) {
if (BeRn.nocmode) return str;
else return _addcommas(str,skip4);
}  
if (BeRn.nocmode) str='\xF2'+str;
str=this.Replace(str,'<noc>','\xF1\xF2');
str=this.Replace(str,'</noc>','\xF1');
var arr=str.split('\xF1');str="";
for (var i=0;i<arr.length;i++) {
if (arr[i].charAt(0)=='\xF2') {
BeRn.nocmode=true;
str+=arr[i].substring(1);
} else {
BeRn.nocmode=false;
str+=_addcommas(arr[i],skip4)
} 
}
return str;
} 
function _addcommas(str,skip4) {
var a=" "+str+" ",s="",t="",i=0,j=0;
if (! skip4) a=a.replace(/([^\.\d])(\d\d\d\d+)/g,"$1\xF1$2\xF2");
else a=a.replace(/([^\.\d])(\d\d\d\d\d+)/g,"$1\xF1$2\xF2");
s="";while (s!=a) {s=a;
a=a.replace(/&#\xF1(\d+)\xF2;/g,"&#$1;").
replace(/(<[a-zA-Z\/][^<>]*)\xF1(\d+)\xF2/g,"$1$2");
}
s="";while((i=a.indexOf("\xF1"))>=0) {
s+=a.substring(0,i);
j=a.indexOf("\xF2");t=a.substring(i+1,j);a=a.substring(j+1);
j=t.length;
while(j>3) {j-=3;t=t.substring(0,j)+','+t.substring(j);}
s+=t;
}
s+=a;
return s.substring(1,s.length-1);
}
function dformat(x,type) {
x+="";
if (type==',') {
var j=x.indexOf(".");if (j<0) j=x.length;
while(j>3) {j-=3;x=x.substring(0,j)+","+x.substring(j);}
return x;       
}
if (type='E') {
var j=Math.max(x.indexOf('E'),x.indexOf('e'));
if (j<0) return x;
var base, expo, newnum;
base=x.substring(0,j);expo=x.substring(j+1)-0;
if (base.indexOf('.')<0) base+='.';
if (expo>0) {
base+='000000000000000000000000000000000000000000000000000';
j=base.indexOf('.');
newnum=base.substring(0,j)+base.substring(j+1,j+expo+1)+'.'+base.substring(j+expo+1);
newnum=newnum.replace(/0*$/,'').replace(/\.$/,'');
} else if (expo<=0) {
base='00000000000000000000000000000000000000000000000'+base;
j=base.indexOf('.');
newnum=base.substring(0,j+expo)+'.'+base.substring(j+expo,j)+base.substring(j+1);
newnum=newnum.replace(/^0*/,'').replace(/^\./,'0.');
} else newnum=base;
return newnum;
}
}
function cmmrm(str) {
var str1="";str+="@";
str=str.replace(/(\.\d+),/g,"$1@");
while (str1!=str) {str1=str;
str=str.replace(/([1-9]0*),(\d\d\d\D)/,"$1$2");
}
str=str.replace(/@$/,'').replace(/@/g,',');
return str;
}
function ZZATK(any,level) {
if (any==null) {return 'null';}
else if (typeof any == "undefined") return 'undefined';
else if (typeof any == "string")    return '"'+this.ZZGBu(any)+'"';
else if (typeof any != "object")    return ''+any;
if (! level) level=0;else if (level>10) return '"[object Recursive]"';
var result,i;
if (typeof any.sort == "function") {
result="[";
for(i=0;i<any.length;i++) {
if (this.ZZkFp(any[i])) result+=this.ZZATK(any[i],level+1);
if (i<any.length-1) result+=",";
}
return result+"]";
} else {
result="";
for(i in any) result+=","+i+":"+this.ZZATK(any[i],level+2);
return '({'+result.substring(1)+'})';
}
}
function ZZVtv(str) {
if ((typeof str=="string")) {
if (str.search(/^\s*$/)==0) return 0;
var result=0;
str=str.replace(/--/g,'+').replace(/\+\+/g,'+');
try {result=window.eval("with (this) {"+str+"}");}
catch(e) {result=NaN;}
return result;
}
else if (typeof str=="undefined") return NaN;
else return str;
}
function ZZZtO(str) {
if (typeof str=="string") str=this.ZZVtv(str);
if (typeof str=="number") return str;
else return NaN;
}
function ZZPpc(str) {
if (typeof str=="string") str=this.ZZVtv(str);
if ((!isFinite(str))||(typeof str!="number")) return NaN;
else return Math.round(str);
}
function ZZrcD(dummy) {
for(var i=0;i<arguments.length;i++) {
if ((typeof arguments[i] != "number")||
(!isFinite(arguments[i]))) return false;}
return true;
}
function ZZf_y(dummy) {
for(var i=0;i<arguments.length;i++) 
if ((typeof arguments[i] != "number")||
(arguments[i]!=Math.round(arguments[i]))) return false;
return true;
}
function ZZimA(dummy) {
for(var i=0;i<arguments.length;i++) 
if ((typeof arguments[i] != "object")||
(typeof arguments[i].sort != "function")) return false;
return true;
}
function ZZMBe(dummy) {
for(var i=0;i<arguments.length;i++) 
if ((typeof arguments[i] != "object")||
(typeof arguments[i].sort != "undefined")) return false;
return true;
}
function ZZnnl(dummy) {
for(var i=0;i<arguments.length;i++) 
if ((typeof arguments[i] != "function")||
(arguments[i].toString().indexOf("[native code]")<0)) return false;
return true;
}
function ZZqOM(str) {
return ((typeof str == "string")&&(str.search(/^\s*$/)==0));
}
function ZZkFp(a) {return (typeof a != "undefined");}
function ZZVzF(collection,value,error) {
if (!collection) return false;
if (typeof error=="undefined") {
for(member in collection) if (collection[member]==value) return true;
return false;
} 
else if (typeof error=="number") {
for(member in collection) if (Math.abs(collection[member]-value)<=error) return true;
return false;
}
else if (typeof error=="function") {
for(member in collection) if (error(collection[member],value)) return true;
return false;
}   
}
function r007(x) {return (Math.round(x*10000000)/10000000);}
function repeats(where,what) {
var i=-1,j=0;
if (typeof where=="object") {for(i in where) if (where[i]==what) j++;}
else {where+="";what+="";while( (i=where.indexOf(what,i+1))>=0 ) j++;}
return j; 
}
function fromCharCode(lst) {
var expr="String.fromCharCode("+lst;
for(var i=1;i<arguments.length;i++) expr+=','+arguments[i];
return eval(expr+')');
}
function toCharCode(strlst) {
var i,result,str='';
for(i=0;i<arguments.length;i++) str+=''+arguments[i];
result=new Array(str.length);
for(i=0;i<str.length;i++) result[i]=str.charCodeAt(i); 
return result;
}
function Replace(strOrig, str1, str2,upToTimes) {
str1+="";
if ((!strOrig)||(!str1)) return strOrig;
var idxend=strOrig.indexOf(str1);
if (idxend<0) return strOrig;
if ((!str2)&&(str2!==0)) str2="";
if (!(upToTimes-0>0)) upToTimes=1e8;
var num=0,idx=0,result="";
var len0=strOrig.length, len1=str1.length;
while ((idx<len0)&&(num++<upToTimes)) {
result += strOrig.substring(idx, idxend);
result += str2;
idx = idxend + len1;
idxend = strOrig.indexOf(str1, idx);
if (idxend<0) break;
}
return result+strOrig.substring(idx);
}
function Insert(str,newtxt,pos) {return str.substring(0,pos)+newtxt+str.substring(pos);}
function Remove(str,pos,n) {return str.substring(0,pos)+str.substring(pos+((n)?n:1));}
function sort(source,compare) {
var arr,fmt=0;
if ((typeof source=="string")&&(source.indexOf(',')>=0)) {
if (source.search(/^[0-9, eE\-\+]*$/)==0) arr=this.ZZSUj(source);
else arr=this.ZZSUj(source,'no');
fmt=1;
} 
else if (typeof source=="string") {arr=source.split();fmt=2;}
else if (typeof source!="object") return source;
else arr=new Array().concat(source);
if ((compare)&&(typeof compare=="string")) compare=new Function('a','b','return '+str);
if ((!compare)&&(compare.join("").search(/^[0-9eE\-\+]*$/)==0)) compare=this.sortOnNumPosition;
if (typeof compare=="function") arr.sort(compare);else arr.sort();
if (fmt==2) return arr.join('');
else if (fmt==1) return arr.join(', ');
else return arr;
}
function reverse(source) {
if (typeof source=="object") return new Array().concat(source).reverse(); 
if ((typeof source=="string")&&(source.search(/^[0-9\, eE\-\+]*$/)==0)) {
return this.ZZSUj(source).reverse().join(', ');
} else if (typeof source=="string") {
if (source.indexOf(',')>=0) return this.ZZSUj(source,'no').reverse().join(', ');
else return source.split("").reverse().join("");
} else return source;
}
function num2frac(num) {
if (typeof num=="string") r=this.ZZVtv(num);else r=num;
if (!isFinite(r)) return [num,-0];else num=r;
var neg=false,big=false,rev=false;
var t,a0,a,r0,r,p0=1,p=0,q0=0,q=1,opt;
var MaxErr=2e-9,MaxInt=1000;
for(t=1;t<arguments.length;t++) {
if (isFinite(arguments[t])) {
a=arguments[t]-0;
if ((a>1)&&(a<1.e9)) MaxInt=a;else if ((a<1)&&(a>1.e-19)) MaxErr=a;
} else {
opt=(arguments[t]+"").split(',');
for(var i=0;i<opt.length;i++) {
a=opt[i]-0;
if ((a>1)&&(a<1.e9)) MaxInt=a;else if ((a<1)&&(a>1.e-19)) MaxErr=a;
}
}
}
if (Math.abs(r-Math.round(r))<=MaxErr) return [Math.round(r),1]; 
if (r<0) {neg=true;r=-r;}
else if (r==0) return [0,1];
if (r<1) {rev=true;r=1/r;}
a0=Math.floor(r);r=r-a0;r0=r;
while ((Math.abs(p/q-r0)> MaxErr)&&(q<MaxInt)) {
r=1.0/r;
a=Math.floor(r);r-=a;
t=a*p+p0;p0=p;p=t;
t=a*q+q0;q0=q;q=t;
}
if (q>=MaxInt) return [num,-0];
p+=q*a0;if (rev) {t=p;p=q;q=t;}
return (neg)?[-p,q]:[p,q];
}
function rndperm(n) {
var i,j,k,l;
var result=new Array(n);
for (i=0;i<n;i++) result[i]=i;
for (k=0;k<2*n;k++) {
i=Math.floor(this.random()*n);
j=Math.floor(this.random()*n);
if (j!=i) {l=result[i];result[i]=result[j];result[j]=l;}
}
return result;
}
function cbperm(k,n) {
if (!(k>=1)) return null;
var i,j,a,b,c=this.ZZZrv[k];
if (n>=c) return null;else c/=k;
b=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
b.length=k--;
for (i=0;i<k;i++) {
j=Math.floor(n/c);n-=j*c;j+=i;a=b[j];
while(j>i) b[j]=b[--j];b[i]=a;c/=k-i;
}
for(i=0;i<b.length;i++) b[i]+=1;
return b;
}
function cbcomb(n,k,i) {
n=Math.round(n);k=Math.round(k);i=Math.round(i);
var CNK=this.binomialArray;
if (n>=31) {
var result=new Array();
var cr=new Array(n);for(i=0;i<n;i++) cr[i]=i;
if (k<=0||k>n) return [];
if (k==n) result=cr;
else if (k<=n/2) {
result=this.randomlist(k,0,n-1,0,true).split(',').sort(sortOnNumPosition);
} else {
var ar=this.ZZSUj(this.randomlist(n-k,0,n-1,0,true));
for(i=0;i<ar.length;i++) {cr[ar[i]]=-1;}
for(i=0;i<n;i++) if (cr[i]>=0) result[result.length]=cr[i];
}
for(i=0;i<k;i++) result[i]-=-1;
return result;
} 
else if (n>=CNK.length) {
for(var l=CNK.length;l<=n;l++) {
CNK[l]=new Array(l+1);CNK[l][0]=1;CNK[l][l]=1;
for(var j=1;j<l;j++) CNK[l][j]=CNK[l-1][j-1]+CNK[l-1][j];
}
} 
if (! CNK[n][k]) return [];
if (!((i<CNK[n][k])&&(i>=0))) i=Math.floor(this.random()*CNK[n][k]);
var res=0;n=n-k;while((k>1)&&(i>0)) {
while(i<CNK[k+n][k]) n--;
res+=1<<(k+n);i-=CNK[k+n][k];k--;n++;
}
if (i==0) res+=(1<<k)-1;else res+=1<<i;
return bi2ia(2*res);
}
function bi2ia(a) {
if (! isFinite(a)) return a;else a-=0;
var j=0,i=1,k=0,res=new Array();
while(i<=a) {if (i&a) res[k++]=j;i=1<<++j;}
return res;
}
function ia2bi(res) {
var nres=this.ZZSUj(res);
var a=0;for(var i=0;i<res.length;i++) {
if (res[i]<30) a|=1<<res[i];
else return res;
} 
return a;
}
function ch2txt(str) {
str=(str+"").
replace(/<i?table[^>]*>/ig,"{").
replace(/<\/i?table[^>]*>/ig,"}").
replace(/<td=h1gK0>/ig,"///").
replace(/radtop\.gif/ig,">RAD<a").
replace(/<param/g,""). 
replace(/<\/?[a-zA-Z][^>]*>|&nbsp;/g," ").
replace(/\$(space|tiny)\$/g," ").
replace(/\$parenleft[^\$]*\$/g,"(").
replace(/\$parenright[^\$]*\$/g,")").
replace(/\s+/g," ").
replace(/^\s+/,'');
return str;   
}
function assert(cond) {
for(var i=0;i<arguments.length;i++) {
var c=arguments[i];
if (typeof c=="string") c=this.ZZVtv(c);
if (!(c)) return "ASSERT FAILURE";
}
return "ASSERT SUCCESS";
}
function aparse(str,args) {
str=";"+str+" ";
var i,j,k,re,str,arrdef;
var predef="";
for(i=1;i<arguments.length;i++) {
var namear=arguments[i];
if (typeof namear!="object"||typeof namear[0]!="string") continue;
if (namear[0].search(/^[A-Za-z_][A-Za-z_0-9]*$/)) continue;
predef+="var "+namear[0];
if (namear.length==1) predef+=";";
else if (namear.length==2) predef+="="+this.ZZATK(namear[1])+";";
else {
re=new RegExp("([^a-z0-9])("+namear[0]+")(\\d+)",'g');
str=str.replace(re,"$1$2[$3]");
predef+="="+this.ZZATK(namear)+";";
}
}
str=predef+str;
str=str.replace(/<nobr>(&nbsp;|\s)*/g,'{').replace(/(&nbsp;|\s)*<\/nobr>/g,'}');
str=str.replace(/<sup>(.)<\/sup>/g,'^$1').
replace(/<sup>/g,'^{').
replace(/<\/sup>/g,'}');
str=str.replace(/<sub>(.)<\/sub>/g,'_$1').
replace(/<sub>/g,'_{').
replace(/<\/sub>/g,'}');
str=str.replace(/(\s*\+\s*\+\s*|\s*\-\s*\-\s*)([0-9.])/g,'+$2');
str=str.replace(/\s*([a-z][a-z0-9]*)\s*:=/g,';var $1=');
var result=0;
try {result=window.eval("with (window.BeRn) {"+str+"}");}
catch(e) {result=NaN;}
return result;
}
function parseTags(txt,tst,brk,strict) {
var i,ctag,ch,atst,abrk;
txt=(txt+"").replace(/@/g,"&#PTAT;").replace(/~/g,"&#PTTLD;");
brk=','+brk+',';
atst=(tst+"").split(',');
for(i=0;i<atst.length;i++) {
ctag=atst[i];if (ctag.length==0) continue;
brk=this.Replace(brk,','+ctag+',',',');
txt=this.Replace(txt,'<'+ctag,'@<@'+ctag);
txt=this.Replace(txt,'</'+ctag,'@</'+ctag);
}
if (txt.indexOf('@')<0) return txt.replace(/&#PTAT;/g,"@").replace(/&#PTTLD;/g,"~");
abrk=(brk+"").split(',');
for(i=0;i<abrk.length;i++) {
ctag=abrk[i];if (ctag.length==0) continue;
txt=this.Replace(txt,'<'+ctag,'~<'+ctag);
txt=this.Replace(txt,'</'+ctag,'~</'+ctag);
}
if (! strict) {
txt=txt.replace(/@<\/[^>]*>([^@~]*@<\/)/g,'$1').
replace(/@<\/[^>]*>([^@~]*@<\/)/g,'$1');
}  
txt=txt.replace(/@<@([^@~]*)@<\/\s*/g,'<$1</');
txt=txt.replace(/~/g,'');
if (txt.indexOf('@')>=0) {
txt=txt.replace(/@/g,'');
for(i=0;i<atst.length;i++) {
ctag=atst[i];if (ctag.length==0) continue;
txt=this.Replace(txt,'<'+ctag,'&#60;'+ctag+'@');
txt=this.Replace(txt,'</'+ctag,'&#60;/'+ctag+'@');
txt=txt.replace(/@([^<>]*)>/g,'$1&#62').
replace(/@/g,'');
}
} 
return txt.replace(/&#PTAT;/g,"@").replace(/&#PTTLD;/g,"~");
}
function ZZovT(Qobj) {
var index=Qobj.loc.replace(/\/\w?prob.html$/,"");
if (index.length>this.topURL.length) index=index.substring(this.topURL.length).replace(/\//g,"-");
for (var f in Qobj) this.ZZorj[index][f]=Qobj[f];
this.ZZorj[index].loaded=true;
this.canLoad=true;
if (this.win.bernLoader) for (var newtid in this.ZZorj){
if (!this.ZZorj[newtid].loaded) {
this.win.bernLoader.document.location.replace(this.ZZorj[newtid].loc);
this.canLoad=false;
break;
}}
}
function ZZnnn(_tid, _base, _seed, _response,_tolopt) {
var Q=null;var qid="";
while (!qid) {
var tmp='Q'+(100000+Math.round(Math.random()*99999));
if (!this.ZZDBx[tmp]) qid=tmp;
}
this.ZZDBx[qid]=new Object();
Q=this.ZZDBx[qid];
Q.loaded=false;
Q.ready=false;
Q.info={sat:"",nci:1,ilev:0,hint:0,sol:0,nlb:0};
Q.qid=qid;
Q.tid=_tid;
if ((0<_seed)&&(_seed<1000000)) Q.seed=_seed;
else Q.seed=1+Math.round(Math.random()*700000);
this.MPDebug=false;
this.MIDebug=false;
Q.options=new Object();
Q.options.xmult=true;
Q.options.cmm=true;
Q.fbck=new Array();
Q.flup=new Array();
Q.xchoice=-1;
Q.gtol=0;
Q.tolopt=this.read_tol_opt(_tolopt);
if (Q.tolopt.tol2p) Q.gtol=-0.02;
Q.evalvars=new Array();
if ((_response)||(_response===0)) Q.response=_response+"";
else Q.response="";
if (this.ZZqOM(Q.response)) Q.response="";
else {
Q.response=this.strip(Q.response);
if (Q.response.search(/[^@a-zA-Z0-9\+\-]/)>=0) {
Q.response=this.binesc(Q.response.replace(/@/g,"&NL;"),true);
Q.response=Q.response.replace(/&NL;/g,"@");
}
}
Q.IE52=(this.browser.v<5.5)&&(this.browser.I)&&(this.browser.M);
Q.N62=((this.browser.N)&&(this.browser.v<7.0));
Q.S12=((this.browser.S)&&(this.browser.v>120));
Q.htmlURL=this.ccvURL;
Q.htmlbase='<base href="'+this.ccvURL+'">\n';
Q.queWin=null;
Q.qdir=this.topURL+Q.tid.replace(/-tmp$/,'').replace(/-/g,"/");
if (Q.qdir.search(/\/courses\/\w+\//)>0) {
Q.pdir=Q.qdir.replace(/(\/courses\/\w+\/).*/,"$1userimglib/");
} 
else Q.pdir=this.topURL+"userimglib/";
if ((this.ZZorj[Q.tid])&&(this.ZZorj[Q.tid].loaded)) {
Q.loaded=true;this.ZZBag(Q.qid);
} else if (!this.ZZorj[Q.tid]) {
this.ZZorj[Q.tid]=new Object();
this.ZZorj[Q.tid].loaded=false;
this.ZZorj[Q.tid].loc=this.topURL+Q.tid.replace(/-/g,"/")+"/uprob.html";
if (this.canLoad) this.win.bernLoader.document.location.replace(this.ZZorj[Q.tid].loc);
}
return qid;
}
function ZZOgi(qid){
var Q=this.ZZDBx[qid];
if ((! Q.loaded)&&(this.ZZorj[Q.tid].loaded)) {
Q.loaded=true;
this.ZZBag(Q.qid);
} 
return Q.ready;
}
function ZZaIV(qid){var Q=this.ZZDBx[qid];return Q.at+"("+Q.nv+","+Q.nc+")";}
function ZZBag(qid){
if (this.ZZFmC()!=0) return;
if (this.waitID) clearTimeout(this.waitID);
this.ZZQYc(12345);
var Q = this.ZZDBx[qid];
var T = this.ZZorj[Q.tid];
Q.unid=Q.tid.replace(/\W/g,"")+Q.qid;
Q.nv=T.nv-0;
Q.nc=T.nc-0;
Q.ans=T.ans;
Q.sat=T.at;
Q.T=new Array(Q.nv);for(var i=0;i<Q.nv;i++) Q.T[i]=T[i];
Q.assets=new Object();
if ((typeof T.assets=="object")&&(T.assets.length>0)) {
for(var i=1;2*i<=T.assets.length;i++) Q.assets[T.assets[2*i-1]]=T.assets[2*i];
} 
Q.info.sat=Q.sat;
if (Number(T.ilev)) Q.info.ilev=Number(T.ilev);
if ((Q.sat=="SA")||(Q.sat=="ES")) { 
Q.at="Y";Q.strict=true;
if (T.yrows-0) Q.yrows=Math.max(0,T.yrows-0);
else Q.yrows=(Q.sat=="SA")?0:7;
if (T.ycols-0) Q.ycols=Math.max(10,T.ycols-0);
else Q.ycols=(Q.sat=="SA")?55:55;
}
else if (Q.sat=="P") {
Q.at="P";Q.strict=true;
if (T.mpv-0) Q.mpv=Math.max(1,T.mpv-0);else Q.mpv=1;
if ((T.mpn+""=="0")||(T.mpn-0>0)) Q.mpn=T.mpn;else Q.mpn=2; 
if (Q.mpv<2) {Q.mpv=2;Q.mpn=0;}
if (T.mpw-0) Q.mpw=Math.max(400,T.mpw-0);else Q.mpw=550;
Q.mpc=(T.mpc+"").toLowerCase().replace(/[^a-z0-9]/g,"");
if (! this.mpcs[Q.mpc]) Q.mpc="algebra";
Q.mph=this.mpcs[Q.mpc][Q.mpv-1];
if (T.mph-0>0) Q.mph=Math.max(Q.mph,T.mph-0);
} else if ((Q.sat=="M")||(Q.sat=="MD")) {
Q.at="M";Q.strict=true;Q.nct=1;Q.ncm=2;
if (T.ncp-0>0) Q.ncp=T.ncp-0;else Q.ncp=Q.nc;
if (T.ncd-0>0) Q.ncd=T.ncd-0;else Q.ncd=1;
if (Q.sat=="MD") Q.ncd=0;
if (T.ncm-0>0) Q.ncm=Math.max(2,T.ncm);
Q.ncl=(Q.sat=="MD")||(T.ncl);
} else if (Q.sat=="MS") {
Q.at="M";Q.strict=true;Q.ncl=false;
Q.ncp=Q.nc;Q.ncm=Q.nc;
if ((T.nct===0)||(T.nct)) Q.nct=T.nct-0;
if (!isFinite(Q.nct)) Q.nct=1;
if (T.ncd-0>0) Q.ncd=Math.min(Q.ncp,T.ncd-0);else Q.ncd=1;
} else if (("|F|N|S|TL|U|").indexOf("|"+Q.sat+"|")>=0) {
Q.at="S";Q.strict=(Q.sat!="S");Q.idam=1;
} else if (Q.sat=="MI") {
Q.at="I";Q.strict=true;
Q.idam=0;if (T.mdm) Q.idam=T.mdm;
} 
Q.tol=T.tol+"";
Q.tol=Q.tol.replace(/^ *\+?| *$/g,'').replace(/^\*/,'-');
if (Q.tol.search(this.tagREn)!=0) Q.tol="1e-14";
this.ctol=Q.tol;
Q.V=new Array(Q.nv);
Q.VT=new Array(Q.nv);
Q.init_seed=Q.seed;
this.ZZQYc(Q.seed);
this.ZZw_u(Q);
Q.hi=this.ZZIVr(T.hi+"",Q.V);
Q.hi=Q.hi.replace(/\s*<step>\s*<\/step>\s*/g,'');
if (! Q.hi) Q.hi="NotYetImplemented";
else Q.info.hint=1;
Q.hi=this.ZZKQf(Q.hi,"",Q);
if ((typeof T.fu=='object')&&(T.fu.length>0)) {
var futmp=T.fu.join(',');
futmp=this.ZZIVr(futmp,Q.V);
Q.flup=futmp.split(',');
for(var i=0;i<Q.flup.length;i++) {
Q.flup[i]=Q.flup[i].replace(/^\W*/,'');
if (!Q.flup[i]) continue;
else if (Q.flup[i].indexOf('chap')==0) 
Q.flup[i]=Q.tid.replace(/chap.*/,Q.flup[i]);
else if (Q.flup[i].indexOf('sect')==0)
Q.flup[i]=Q.tid.replace(/sect.*/,Q.flup[i]);
else if (Q.flup[i].indexOf('prob')==0)
Q.flup[i]=Q.tid.replace(/prob.*/,Q.flup[i]);
else if (Q.flup[i].indexOf('chap')+Q.flup[i].indexOf('courses')==-2) 
Q.flup[i]='courses-'+Q.flup[i];
}       
}
Q.qt=T.qt+"";
Q.qt=this.ZZIVr(Q.qt,Q.V);
Q.wo=this.ZZIVr(T.wo+"",Q.V);
Q.wo=Q.wo.replace(/\s*<step>\s*<\/step>\s*/g,'');
this.nocmode=false;
parseUI(Q);
parseQT(Q);
parseWO(Q);
Q.ready = true;
this.ZZQYc(0);
for (var newqid in this.ZZDBx) {
if ((this.ZZDBx[newqid].loaded)&&(!this.ZZDBx[newqid].ready)) {
this.waitID=this.win.setTimeout(
"getBernEngine().ZZBag("+newqid+")",100);
break;
}
}
}
function ZZIVr(str,Vars) {
str=(" "+str).
replace(/innertable/ig,"itable").
replace(/([^a-z])Log([^a-z])/g,"$1log$2").
replace(/([^a-z])Ln([^a-z])/g,"$1ln$2").
replace(/([^a-z])Sin([^a-z])/g,"$1sin$2").
replace(/([^a-z])Cos([^a-z])/g,"$1cos$2").
replace(/(<\/?n)br>/g,"$1obr>").
replace(/<nobr>(.| *|[a-zA-Z0-9\.]+)<\/nobr>/g,"$1").
replace(/^ +/,"");
str=str.replace(/@/g,"&#64;").
replace(/~/g,"&#126;");
if (str.indexOf("V[")<0) return str;
var chunks=str.replace(/V\[(\d+)\]/g,"@~$1@").split("@");
for(var i in chunks) if(chunks[i].indexOf("~")==0) {
var k=(chunks[i].substr(1))-0;
chunks[i]=(Vars[k]+"");
}
str=chunks.join("");
return str;
}
function ZZw_u(Q) {
var chvnum=Q.ans;
var noLoop=0;
while (noLoop++<1000) {
Q.seed=this.ZZFmC();
var qOK=parseVS(Q);
if (!qOK) continue;
if (Q.at=="M") {
var chnum,i,j,k,shfl;
var noa=false;
Q.ncpos=new Array(Q.nc);
for(i=0;i<Q.nc;i++) Q.ncpos[i]=i;
Q.ncans=new Array();
Q.ans=new Array(Q.nc);
Q.fbck=new Array(chvnum.length);
for(i=0;i<chvnum.length;i++) {
chnum=chvnum[i]-0;
if ((chnum>=0)||(chnum-0<Q.nv)) Q.ans[i]=""+Q.V[chnum];
else Q.ans[i]="";
if (Q.ans[i].indexOf('<fb>')>=0) {
Q.fbck[i]=Q.ans[i].replace(/^.*<fb>(.*)<\/fb>.*/,'$1');
Q.ans[i]=Q.ans[i].replace(/<fb>(.*)<\/fb>/,'');
} else Q.fbck[i]='';
}
if ((Q.sat=="M")||(Q.sat=="MD")) {
var ch=new Array(Q.nc);
ch[0]=this.ch2txt(Q.ans[0]);
if ((! ch[0])&&(noLoop<300)) {qOK=false;continue;}
chnum=1;
for(i=1;i<Q.nc;i++) {
ch[i]=this.ch2txt(Q.ans[i]);
if (!ch[i]) continue;
for(j=0;j<i;j++) if ((ch[j])&&(ch[j]==ch[i])) {
ch[i]="";Q.ans[i]="";break;
}
if (ch[i]) chnum++;
}
if ((chnum<Q.nc)&&(Q.ncp>chnum)&&(noLoop<50)) {qOK=false;continue;}
if ((chnum<Q.nc)&&(Q.ncm>chnum)&&(noLoop<200)) {qOK=false;continue;}
if (chnum>=Q.ncp) Q.nca=Q.ncp;else Q.nca=chnum;
if (chnum<Q.nc) {
i=0;j=0;while(i<Q.nc) {
if (j>=Q.nc) Q.ans[i++]="";
else if (Q.ans[j]!=="") {
Q.ncpos[j]=i;
Q.ans[i++]=Q.ans[j++];
if (i!=j) Q.ans[j-1]="";}
else Q.ncpos[j++]=-1;
}
}
while (chnum>Q.nca) {
j=this.ZZqLf(1,chnum-1);
for(i=1;i<Q.nc;i++) {
k=Q.ncpos[i];
if (k<j) continue;
else if (k==j) Q.ncpos[i]=-1;
else {Q.ans[k-1]=Q.ans[k];Q.ncpos[i]=k-1;}
}
Q.ans[--chnum]="";
}
noa=(Q.ans[Q.nca-1].toLowerCase().replace(/[^a-z]+/g,'')=="noneoftheabove");
if ((Q.nca<Q.ncp)&&(chnum<Q.nc)&&(!noa)) {
noa=true;
Q.ans[Q.nca]="none of the above";
Q.ncpos[Q.nc]=Q.nca;
Q.nc++;Q.nca++;
}
Q.ncans=[0];
}  else {
Q.nca=Q.nc;
if (Q.nct>0) {
for(i=0;i<Q.nct;i++) Q.ncans[i]=i;
noa=((! noa )&&(this.ZZqLf(1,10)<4));
if (noa) {
Q.ans[Q.nca]="none of the above";
Q.ncpos[Q.nc]=Q.nca;
Q.nc++;Q.nca++;
}
} else {
noa=true;Q.nct=1;
Q.ans[Q.nca]="none of the above";
Q.ncpos[Q.nc]=Q.nca;
Q.ncans=[Q.nca];
Q.nc++;Q.nca++;
}
} 
if (noa) {
shfl=this.rndperm(Q.nca-1);
shfl[Q.nca-1]=Q.nca-1;
Q.ncd=Math.min(Q.ncd,1);
}
else shfl=this.rndperm(Q.nca);
for(j=0;j<Q.nc;j++) if (Q.ncpos[j]>=0) Q.ncpos[j]=shfl[Q.ncpos[j]];
for(j=0;j<Q.nct;j++) Q.ncans[j]=shfl[Q.ncans[j]];
var oldans=Q.ans;Q.ans=new Array(Q.nca);
for(i=0;i<Q.nca;i++) Q.ans[shfl[i]]=oldans[i];
Q.info.nci=Q.nca;
if ((Q.nca==2)&&(Q.sat=="M")) {
ch[0]="|"+Q.ans[0].toLowerCase().replace(/ +/g,'')+"|";
ch[1]="|"+Q.ans[1].toLowerCase().replace(/ +/g,'')+"|";
if ((this.nolabeltest.indexOf(ch[0])>=0)&&
(this.nolabeltest.indexOf(ch[0])>=0)) {
Q.ncl=true;
if ((ch[0]=='|true|')||(ch[0]=='|false|'))  Q.info.sat="TF";
else if ((ch[0]=='|yes|')||(ch[0]=='|no|')) Q.info.sat="YN";
} 
if (Q.ncl) Q.ncd=2;
}
}
if (qOK) break;
} 
if (noLoop>=600) alert("Error in data !");
}
function parseUI(Q){
var i=0;
var uitbp='<table cellpadding=10 cellspacing=0 border=0 width='+(this.qwidth-2)+
'><tr><td align="left">';
var uitbi='<table><tr><td align="left">';var uite='</td></tr></table>';
if (Q.sat=="P") {
var direct=false;if (this.browser.W) direct=true;
var mpstr=Q.ans[0]+"";
if (mpstr.indexOf("<") < 0 ) mpstr=this.ZZoTY(mpstr);
if (mpstr.indexOf('<m>')==mpstr.indexOf('<e>')) mpstr+="<t>  </t>"; 
mpstr=this.QMPA2T(mpstr);
mpstr=this.ZZIVr(mpstr,Q.V);
if (mpstr.indexOf("XXX")>=0) this.MPDebug=true;
Q.ans=mpstr;
var mpaans=this.QMPupdate(Q.ans);
Q.mpalg=this.ZZKPS(mpaans,Q);
var mptans=this.QMPput(mpaans);
Q.xdui=this.QMPview(mptans,0);
Q.xdca=this.QMPview(mptans,1);
Q.xans=Q.xdca;
Q.xcmp=this.ZZRGC(this.ZZeUj(mptans));
var ptext=this.ZZnMG(mptans,' ');
Q.xtst=ptext.replace(/<\/?[tiboc]>| +/g,"");//"is answer empty" test
Q.info.nci=Q.xtst.split(/<[me]>/).length-1 
ptext=this.ZZRGC(ptext);
if (Q.response) {Q.mpuans=Q.response;Q.mpreset=ptext;}
else {Q.mpuans=ptext;Q.mpreset="";}
Q.mpuans=MPCleanVersion(Q.mpuans,Q.mpv);
Q.mpreset=MPCleanVersion(Q.mpreset,Q.mpv);
Q.xdur=this.QMPview(this.ZZoTY(Q.mpuans),2);
if (this.browser.W && this.browser.I) i=1;
else if (this.browser.M &&(!this.browser.S)) i=1;
else i=0;
Q.applet=new this.ZZTEF(
this.ccvURL+"palette_"+Math.floor(Q.mpv)+"_"+i+".jar", 
Q.unid+"-APPLET",Q.mpw, Q.mph, Q.mpc,"student",
Q.mpuans,"right","no",direct,Q.mpreset,Q.mpn
);
Q.xrui=uitbp+Q.applet.get_applet_html()+uite;
if (Q.mpalg+""==="") Q.xdca="None Given";
}
else if ((Q.sat=="M")||(Q.sat=="MD")||(Q.sat=="MS")) {
Q.ncposinv=new Array(Q.nca);
for(i=0;i<Q.ncpos.length;i++) {
var ccpos=Q.ncpos[i];
if ((ccpos>=0)&&(ccpos<Q.nca)) Q.ncposinv[ccpos]=i;
}
var multilinech=false;
Q.xtst="";Q.xdca="";Q.xans="";
Q.xcmp=Q.ncans.sort(this.sortOnNumPosition)+"";
Q.charr=new Array(Q.nca);
for(i=0;i<Q.nca;i++) {
if (Q.sat=="MD") Q.charr[i]=Q.ans[i].replace(/</g,"&lt;");
else     Q.charr[i]=this.ZZKQf(Q.ans[i],"tbn",Q);
}
if (Q.ncl) {
Q.xdca=Q.charr[Q.ncans[0]];
Q.xans=Q.xdca;
} else {
for(i=0;i<Q.ncans.length;i++) {
var chr=String.fromCharCode(65+(Q.ncans[i]-0));
if (i>0) Q.xdca+=", "+chr;else Q.xdca+=" "+chr;
Q.xans+="<tr><td><B>"+chr+".&nbsp;</B></td><td>"+Q.charr[Q.ncans[i]-0]+"</tr>\n"
}
Q.xans="<table>"+Q.xans+"</table>";
}
if (Q.sat=="M") {
Q.xrui=this.mkchtable(Q.unid,Q.charr,Q.ncd,Q.response,0,Q.ncl);
Q.xdui=this.mkchtable(Q.unid,Q.charr,Q.ncd,"",1,Q.ncl);
Q.xdur=this.mkchtable(Q.unid,Q.charr,Q.ncd,Q.response,1,Q.ncl);
} else if (Q.sat=="MS") { 
Q.xrui=this.mkchtable(Q.unid,Q.charr,-Q.ncd,Q.response,0,false);
Q.xdui=this.mkchtable(Q.unid,Q.charr,-Q.ncd,"",1,false);
Q.xdur=this.mkchtable(Q.unid,Q.charr,-Q.ncd,Q.response,1,false);
} else if (Q.sat=="MD") {
Q.xrui=this.mkdropdown(Q.unid,Q.charr,Q.response,0);
Q.xdui=this.mkdropdown(Q.unid,Q.charr,"",1);
Q.xdur=this.mkdropdown(Q.unid,Q.charr,Q.response,1);
} 
} else if (Q.at=="Y") {
var ansstr="Answers may vary.";
if (Q.ans[0]<Q.nv) ansstr=Q.V[Q.ans[0]];
Q.xcmp=this.uni2esc(ansstr);
Q.xdca=this.mkareabox(Q.unid,Q.xcmp,2,Q.yrows,Q.ycols);
Q.xans=Q.xdca;
var pretext="<b>Your Answer:</b>&nbsp;";
if (Q.yrows) pretext="<b>Your Answer:</b><br>";
Q.xrui=pretext+this.mkareabox(Q.unid,Q.response,0,Q.yrows,Q.ycols);
Q.xdui=pretext+this.mkareabox(Q.unid,"",1,Q.yrows,Q.ycols);
Q.xdur=pretext+this.mkareabox(Q.unid,Q.response,1,Q.yrows,Q.ycols);
}
else if (Q.sat=="U") {
var bttm="<hide>"+uitbi+"<b>Your Answer:</b>&nbsp;</hide>"+
"<hide> <box=N>V["+(Q.ans[0]-0)+"]</box> <box=O>V["+(Q.ans[1]-0)+"]</box></hide>"+
"<hide>"+uite+"</hide>";
bttm=this.ZZIVr(bttm,Q.V);
Q.qt+=bttm;Q.at="I";Q.qdam=0;
} else if (("|S|F|N|TL|").indexOf("|"+Q.sat+"|")>=0) {
var str=Q.ans[0]+"";
var tst=this.ZZIVr(str,Q.V);
if (tst.indexOf('<ans')!=tst.lastIndexOf('<ans')) {
tst=str.replace(/.*<ans[^>]*>V\[(\d+)\]<\/ans>.*/,'$1');
if (isFinite(tst)) str=this.Replace(str,
"V["+tst+"]</ans>",this.ZZorj[Q.tid][2][1]+"</ans>",1);
str=str.replace(/(.*)(<ans=[^>]*>)(.*)<ans>(.*)<\/ans>(.*)/,'$1$3$2$4$5').
replace(/(.*)<ans[^>]*>(.*<ans.*)<\/ans>(.*)/,'$1$2$3');
}
var i,j,k,atol,rtol;
str=str.replace(/^\s*/,"").replace(/\s*$/,"");
i=str.toLowerCase().indexOf("<ans");
j=str.toLowerCase().indexOf(">",i);
k=str.toLowerCase().indexOf("</ans>",j);
var preans=str.substring(0,i);
var anstag=str.substring(i+4,j);
var tans=str.substring(j+1,k);
var postans=str.substring(k+6);
if (postans) postans=this.ZZIVr(postans,Q.V);else postans="&nbsp;";
if (preans) {preans=this.ZZIVr(preans,Q.V);}
else {preans="<b>Your Answer:</b>&nbsp;";}
if (tans.search(/^ *V\[\d+\] *$/)==0) {
i=tans.replace(/\D/g,"")-0;
if (i<Q.nv) tans=Q.V[i];
}
var vtype="";
if (isFinite(tans-0)) vtype="E";
else if ((i=tans.indexOf("$pm$"))>0) {
var tans1=tans.substring(0,i).replace(/ /g,'');
var tans2=tans.substring(i+4).replace(/ /g,'');
i=tans2.indexOf("%");
if (i==tans2.length-1) tans2=tans2.substring(0,tans2.length-1);
if (isFinite(tans1)&&isFinite(tans2)) {
if (i<0) {vtype="T"+(tans2-0);tans=tans1;}
else{vtype="T"+(tans2-0)+"%";tans=tans1;}
} else vtype="S";
} else vtype="S";
anstag=anstag.replace(/ +/g,'');
if (anstag.indexOf("=")==0) anstag=anstag.substring(1);
if ((! anstag)&&(Q.sat=="TL")) anstag=Q.tol;
if (vtype.indexOf("T")==0) {
if (anstag.indexOf('X')!=0) anstag="X"+vtype;
else anstag=vtype;
} else if ((vtype=="S")&&(anstag.search(this.tagREs)!=0)) {
anstag="S";
} else if ((vtype=="E")&&(anstag.search(this.tagREn)!=0)) {
if (Q.gtol) anstag=""+Q.gtol;else anstag="R";
}
if (anstag.indexOf("S")!=0) anstag=anstag.replace(/X/g,'');
else if ((! Q.strict)&&(anstag.indexOf("X")<0)) anstag="X"+anstag;
Q.xcmt=anstag;
var bttm=
'<hide>'+uitbi+preans+' <box='+anstag+'>'+tans+'</box> '+postans+uite+'</hide>';
Q.qt+=bttm;Q.at="I";Q.qdam=1;
}
} 
function parseQT(Q) {
var str,str1,str2,str3,hstr,chunks;
var p0,p1,p2,bc,abc,gc,hd;
str=Q.qt;
gc=0;Q.irbp=new Array();
if (str.indexOf('<grade>')>0) {
str=this.parseTags(str,'grade','',true);
while ((p0=str.indexOf('<grade>'))>=0) {
p1=str.indexOf('</grade>',p0);
Q.irbp[gc++]=str.substring(p0+7,p1);
str=str.substring(0,p0)+str.substring(p1+8);
}
}
str=str.replace(/<\/?[op]?step[^>]*>/g,'');
str=this.parseTags(str,'hide','');
if ((",F,N,S,TL,U,MI,").indexOf(','+Q.sat+',')<0) {
str=str.replace(/<\/?box[^>]*>/g,'');
} else str=this.parseTags(str,'box','hide');
str2="<split>";
p0=str.indexOf(str2);
if (p0<0) {
str2="<p>&nbsp;<p>";
p0=str.indexOf(str2);
}
if (p0>0) {
str1=str.substring(0,p0).replace(/&nbsp;|<p>|<br>/g,'');
if (str1.indexOf("<box")>=0) p0=-1;
else if (str1.indexOf("<hide")>=0) p0=-1;
else if (!isNaN(str1)) p0=-1;
}
if (p0>0) {
str1=str.substring(0,p0);
if (str1.indexOf('<itable')>=0) str1=this.ZZKQf(str1,"tbn",Q);
else str1=this.ZZKQf(str1,"tb",Q);
Q.inst=str1;
str=str.substring(p0+str2.length);
} else Q.inst="";
if ((Q.at=="I")&&(str.indexOf('<box')<0)) {
str+="<p><box>No Boxes Found</box>";
}
var boxes=new Array();bc=-1;
if (str.indexOf("<box")>=0) {
while ((p0=str.indexOf('<box'))>=0) {
bc++;
p1=str.indexOf('>',p0)+1;
p2=str.indexOf('</box>',p1);
boxes[bc]=new UIObj(
str.substring(p1,p2),
Q.qid+"Q"+(300+bc),
str.substring(p0+4,p1-1) );
str=str.substring(0,p0)+"&UIO"+(300+bc)+";"+str.substring(p2+6);
}
}
str1="";str2="";p0=0;
var hide4dca=new Array();
while ((p1=str.indexOf('<hide>',p0))>=0) {
str3=str.substring(p0,p1);
str1+=str3;str2+=str3;
p1+=6;
p2=str.indexOf('</hide>',p1);
p0=p2+7;
p3=str.indexOf('::',p1);
if ((p3>=p1)&&(p3<p2)) {
str1+=str.substring(p1,p3);
hstr=str.substring(p3+2,p2);
str2+=hstr;
}
else {
hstr=str.substring(p1,p2);
str2+=hstr;
}
if (hstr.indexOf("&UIO3")>=0) hide4dca[hide4dca.length]=hstr;
}
str3=str.substring(p0);
str1+=str3;
str2+=str3;
var boxeshidden=(str1.indexOf("&UIO3")<0);
if (str1.indexOf('<itable')>=0) str1=this.ZZKQf(str1,"tbn",Q);
else str1=this.ZZKQf(str1,"tb",Q);
while((p0=str1.indexOf("&UIO3"))>=0) {
bc=str1.substr(p0+5,2)-0;
str1=str1.substring(0,p0)+boxes[bc].render(1,0)+str1.substring(p0+8);
}
if (Q.inst) {str1=Q.inst+str1;}
Q.xqtp=str1;
if ((Q.at=="P")||(Q.at=="M")||(Q.at=="Y")) {
if (str2.indexOf('<itable')>=0) str2=this.ZZKQf(str2,"tbn",Q);
else str2=this.ZZKQf(str2,"tb",Q);
while((p0=str2.indexOf("&UIO3"))>=0) {
bc=str2.substr(p0+5,2)-0;
str2=str2.substring(0,p0)+boxes[bc].render(1,0)+str2.substring(p0+8);
}
if (Q.inst) {str1=Q.inst+str1;str2=Q.inst+str2;}
Q.xqta=str2;
Q.xqtd=str2;
return;
}
if ((!boxeshidden)&&(Q.idam==0)) Q.idam=2;
if (str2.indexOf('<itable')>=0) str2=this.ZZKQf(str2,"tbn",Q);
else str2=this.ZZKQf(str2,"tb",Q);
Q.ibxa=new Array();
Q.ibxi=new Array(boxes.length);
for(bc=0;bc<boxes.length;bc++) Q.ibxi[bc]=-1;
abc=0;
str3=str2;
while((p0=str3.indexOf("&UIO3"))>=0) {
bc=str3.substr(p0+5,2)-0;
Q.ibxa[abc]=boxes[bc];Q.ibxi[bc]=abc++;
str3=str3.substring(0,p0)+boxes[bc].render(1,0)+str3.substring(p0+8);
}
if (Q.inst) Q.xqtq=Q.inst+str3;
else Q.xqtq=str3;
Q.icmp=new Array(abc);
Q.idca=new Array(abc);
Q.idua=new Array(abc);
Q.igra=new Array(abc);
Q.ires=new Array();
Q.info.nci=abc;
if (Q.response.indexOf('@')>=0) Q.ires=Q.response.split("@");
else Q.ires[0]=Q.response;
for (abc=Q.ires.length;abc<Q.ibxa.length;abc++) Q.ires[abc]="";
for(abc=0;abc<Q.ibxa.length;abc++) {
var uio=Q.ibxa[abc];
uio.getResponse(Q.ires[abc]);
Q.icmp[abc]=uio.cmp;
Q.idca[abc]=uio.dca;
}
Q.xcmp=Q.icmp.join('@');
str3=str2;
while((p0=str3.indexOf("&UIO3"))>=0) {
abc=Q.ibxi[str3.substr(p0+5,2)-0];
str3=str3.substring(0,p0)+Q.ibxa[abc].render(0,2)+str3.substring(p0+8);
}
if (Q.inst) Q.xqta=Q.inst+str3;else Q.xqta=str3;
str3=str2;
while((p0=str3.indexOf("&UIO3"))>=0) {
abc=Q.ibxi[str3.substr(p0+5,2)-0];
str3=str3.substring(0,p0)+Q.ibxa[abc].render(1,2)+str3.substring(p0+8);
}
if (Q.inst) Q.xdur=Q.inst+str3;else Q.xdur=str3;
if (Q.idam==2) Q.xqtd=Q.inst;
else Q.xqtd=Q.xqtq;
if (Q.idam==0) {
str3="<table>";
for(hd=0;hd<hide4dca.length;hd++) str3+="\n<tr><td>"+hide4dca[hd]+"</td></tr>";
str3+="</table>";
if (str3.indexOf('<itable')>=0) str3=this.ZZKQf(str3,"tbn",Q);
else str3=this.ZZKQf(str3,"tb",Q);
Q.idua=str3;
while((p0=str3.indexOf("&UIO3"))>=0) {
abc=Q.ibxi[str3.substr(p0+5,2)-0];
str3=str3.substring(0,p0)+Q.ibxa[abc].render(2,1)+str3.substring(p0+8);
}
Q.xdca=str3;
} else if (Q.idam==1) {
Q.xdca=Q.idca.join("; &nbsp;");
for(bc=0;bc<Q.ibxi.length;bc++) {
if (Q.ibxi[bc]==0) Q.idua="&UIO"+(300+bc)+";";
else if (Q.ibxi[bc]>0) Q.idua="; &nbsp;&UIO"+(300+bc)+";";
}
} else if (Q.idam==2) {
Q.idua=str2;
str3=str2;
while((p0=str3.indexOf("&UIO3"))>=0) {
bc=str3.substr(p0+5,2)-0;
str3=str3.substring(0,p0)+boxes[bc].render(2,1)+str3.substring(p0+8);
}
Q.xdca=str3;
}
Q.xans=Q.xdca;
}
function parseVS(Q){
var j, pair;
var Vars=Q.V;var TVars=Q.VT;
for(j=0;j<Q.nv;j++) {
pair=new Array(2);
var From=Q.T[j];
var vtype=From[0];
var vlen=From.length-1;
var vnumber=0,vstring="";
var parts=new Array(vlen);
for(var i=0;i<vlen;i++) parts[i]=this.ZZIVr(From[i+1],Vars);
if (vtype=="I") { 
if (vlen==4) vnumber=this.ZZqLf(parts[0],parts[1],parts[2],parts[3]);
else vnumber=Math.round(this.ZZZtO(parts[0]));
pair=["I",vnumber];
} else if (vtype.indexOf("R")==0) { 
if (vlen==4) vnumber=this.ZZIOc(parts[0],parts[1],parts[2],parts[3],vtype)
else vnumber=this.ZZZtO(parts[0]);
pair=[vtype,this.ZZCJI(vnumber,vtype)];
} else if (vtype.indexOf("L")==0) { 
if (vtype.indexOf("L*")==0) {
var index=this.ZZPpc(parts[0]);
if (!(index>=1)) vstring=parts[1];
else if (!(index<vlen)) vstring=parts[vlen-1];
else vstring=parts[index];
} else vstring=parts[this.ZZqLf(0,vlen-1)];
if (this.ZZqOM(vstring)) pair=["S",vstring]; 
else if (this.ZZf_y(vstring-0))  pair=["I",vstring];
else if (this.ZZrcD(vstring-0))  pair=["E",vstring];
else pair=["S",vstring];
} else if ((vtype.indexOf("E")==0)||(vtype.indexOf("S")==0)) {
vstring=parts[0];
if (vtype.indexOf("E")==0) {
if (vstring.indexOf("annotate(")>=0) vstring=vstring.replace(
/^ *(annotate\()/,'annotate("'+Q.qid+'",');
vstring=this.ZZVtv(vstring);
} 
if (vstring=="ASSERT FAILURE")  return false;
else if (this.ZZqOM(vstring)) pair=["S",vstring]; 
else if (this.ZZf_y(vstring-0))  pair=["I",vstring];
else if (this.ZZrcD(vstring-0))  pair=["E",vstring];
else if (typeof vstring=="string")   pair=["S",vstring];
else pair=["S",vstring];
} 
Q.VT[j]=pair[0];Q.V[j]=pair[1];
}
return true;
}
function ZZujQ(_qid,passive){
if (!this.ZZOgi(_qid)) return null;
if (passive) return this._rQP(_qid,true);
var Q = this.ZZDBx[_qid];
var qtblb='<table cellpadding=10 cellspacing=0 border=0 width='+
(this.qwidth-2)+'><tr><td align=left>';
var qtble='</td></tr></table><!--ENDQT-->\n';
var formb='<form action="about:" onsubmit="return false;">';
var forme='</form>';
var result=qtblb+Q.xqta+qtble;
if (Q.at!="I") result+=Q.xrui;
if (Q.at!="P") result=formb+result+forme;
return this.fix_box_sup(result);
}
function popupAP(_qid,windoc) {
var Q = this.ZZDBx[_qid];
var win=window.open("",'WAPal',
'scrollbars=no,toolbar=no,menubar=no,status=no,location=no,'+
'resizable=no,width=600,height=450');
var htmltext;
htmltext= '<html><head><title>Answer Palette</title></head><body>'+
'<table align="center"><tr><td align="center" valign=top">';
htmltext+=Q.applet.get_applet_html();
htmltext+='</td></tr><tr><td align="center" valign=top">';
htmltext+='<table border=1><tr><td>'+
'<a href="javascript:void(opener.replaceAP(\''+_qid+'\'));"'+
' style="text-decoration: none"'+
'><span style="font-size:14pt;font-weight:600">Submit Changes'+
'</span></a></td></tr></table>';
htmltext+='</td></tr></table></body>';
win.document.writeln(htmltext);
win.document.close();
if( win.focus ) win.focus();
this.popupWindow=win;
this.popupOpener=windoc;
win.lsi_math_palette=Q.applet;
}
var replaceAPtimer=null;
function replaceAP(_qid) {
clearTimeout(replaceAPtimer);
win=this.popupOpener;
if (win && (! win.closed )) win.focus();
var Q = this.ZZDBx[_qid];
if (typeof Q.applet!="object") return;
var ready=this.ZZWCl(_qid,this.popupWindow);
if (! ready) {
replaceAPtimer=setTimeout(replaceAP,200,_qid);
return;
} 
Q.response=Q.applet.get_input();
Q.applet.initval=Q.response;
this.popupWindow.close();
if ( (! win) || win.closed ) return;
if (win.document && win.document.getElementById) {
var elmnt=win.document.getElementById('WAP_'+_qid);
var newcode=(Q.response+"").replace(/[^0-9a-fA-F]+/g,'');
newcode=this.QMPview(this.ZZoTY(newcode),2);
if (elmnt && elmnt.innerHTML) elmnt.innerHTML=newcode;
}
}
function _renderWQuestion(_qid) {
if (!this.ZZOgi(_qid)) return null;
var Q = this.ZZDBx[_qid];Q.worksheet=true;
var qtblb='<table cellpadding=10 cellspacing=0 border=0 width='+
(this.qwidth-2)+'><tr><td align=left>';
var qtble='</td></tr></table>\n';
var result=qtblb+Q.xqta+qtble;
if (Q.at=="P") {
var pqtblb='<table width="10%" border=0 cellspacing=0 cellpadding=5><tr>'+
'<td>&nbsp;&nbsp;&nbsp;&nbsp;</td><td width="1%" valign="middle" align="left">';
result+=pqtblb+'<table border=1><tr><td id="WAP_'+_qid+'">'+
Q.xdui+'</td></tr></table>'+
'</td><td align="left" valign="middle">'+
'<table border=1><tr><td>'+
'<a href="javascript:void(parent.popupAP(\''+_qid+'\',window))"'+
' style="text-decoration: none"'+
' onMouseOver="window.status=\'OPEN ANSWER PALETTE\';return true;"'+
' onMouseOut="window.status=\'\';return true;">'+
'<span style="font-size:12pt;font-weight:600">Edit'+
'</span></a></td></tr></table>'   ;
result+=qtble;
}
else if (Q.at!="I") result+=Q.xrui;
return this.fix_box_sup(result);
}
function _rQP(_qid, with_response) {
if (!this.ZZOgi(_qid)) return null;
var Q = this.ZZDBx[_qid];
var qtblb='<table cellpadding=10 cellspacing=0 border=0 width='+
(this.qwidth-2)+'><tr><td align=left>';
var qtble='</td></tr></table><!--ENDQT-->\n';
var formb='<form action="about:" onsubmit="return false;">';
var forme='</form>';
var result=qtblb;
if (! with_response) {
if (Q.at=="P") result+=Q.xqta+Q.xdui;
else if ((Q.at=="M")||((Q.at=="Y"))) result+=Q.xqta+formb+Q.xdui+forme;
else result+=formb+Q.xqtq+forme;
} else {
if (Q.at=="P") result+=Q.xqta+Q.xdur;
else if ((Q.at=="M")||((Q.at=="Y"))) result+=Q.xqta+formb+Q.xdur+forme;
else result+=formb+Q.xdur+forme;
} 
return this.fix_box_sup(result+qtble);
}
function _printQuestion(_qid) {
if (!this.ZZOgi(_qid)) return null;
var qtblb='<table cellpadding=10 cellspacing=0 border=0 width='+
(this.qwidth-2)+'><tr><td align=left>';
var qtble='</td></tr></table><!--ENDQT-->\n';
var Q = this.ZZDBx[_qid];
var result="",uio="";
if (Q.at=="P") {
uio=Q.xdui.replace(/<img[^>]*\/mp\/box.gif[^>]*>/g,' ____ ');
result=qtblb+Q.xqta+'<p>'+uio+qtble;
} else if (Q.at=="Y") {
uio=Q.xdui.replace(/<input[^>]*>/,' _______________ ').
replace(/@/g,'&#64;').
replace(/<\/[t]extarea>/g,'@').
replace(/<[t]extarea[^@]*@/g,'&nbsp;<br>&nbsp;<br>');
result=qtblb+Q.xqta+'<p>'+uio+qtble;
} else if (Q.at=="M") {
uio=Q.xdui.replace(/<input[^>]*radio[^>]*>/ig,'&nbsp;');
uio=uio.replace(/<input[^>]*heckbox[^>]*>/ig,' __ ');
uio=uio.replace(/<option value=""[^<]*<optio/ig,'<optio');
uio=uio.replace(/<select[^>]*>/g,'<table><tr><td><u>Select:</u>').
replace(/<optio[^>]*>/g,'</td></tr><tr><td>').
replace(/<\/select>[^>]*>/g,'</td></tr></table>');
result=qtblb+Q.xqta+uio+qtble;
} else {
uio=Q.xqta;
uio=uio.replace(/<input[^>]*>/ig,' ____ ');
uio=uio.replace(/<\/select>/ig,"</select>\xF1");
uio=uio.replace(/<select[^\xF1]*\xF1/ig,' ____ ');
result=qtblb+uio+qtble;
}
return result;
}
function ZZPQC(_qid,_msg){
if (!this.ZZOgi(_qid)) return null;
var Q = this.ZZDBx[_qid];
var htmlb='<html><head>'+Q.htmlbase+
'<link HREF="bv_styles.css" REL="stylesheet" TYPE="text/css">'+
'</head>\n<body>';
var htmle='\n</body></html>';
if ((_msg)&&((_msg+"").replace(/\s+|&nbsp;/g,''))) {
htmlb+= '<div style="font-size:large;font-weight:900;'+
'text-align:left;vertical-align:middle;color:#4040A0;">'+
_msg+'</div>&nbsp;';
} 
if ((Q.wtxt+"").indexOf("NotYetImplemented")>=0) {
return htmlb+"<p>Question:<p>"+
_rQP(_qid)+"<p>"+_getAnswerText(_qid)+htmle;
}
var qtxt=Q.xqtp;
var soltxt=_getSolutionHTML(_qid,false);
var result=htmlb+qtxt+"<p>"+soltxt+htmle;
return this.fix_box_sup(result);
}
function _renderPreview(_qid,_msg){
if (!this.ZZOgi(_qid)) return null;
var Q = this.ZZDBx[_qid];
var htmlb='<html><head>'+Q.htmlbase+
'<link HREF="bv_styles.css" REL="stylesheet" TYPE="text/css">'+
'</head>\n<body>';
var htmle='\n</body></html>';
if ((_msg)&&((_msg+"").replace(/\s+|&nbsp;/g,''))) {
htmlb+= '<div style="font-size:large;font-weight:900;'+
'text-align:left;vertical-align:middle;color:#4040A0;">'+
_msg+'</div>&nbsp;';
} 
var qtxt="<!--BQT-->"+_rQP(_qid)+"<!--EQT-->";
if ((Q.wtxt+"").indexOf("NotYetImplemented")>=0) {
var soltxt="<p>Solution is not available.<p>";
} else {
var soltxt="<p>SOLUTION:<p>"+_getSolutionHTML(_qid,true);
}
var dcaQA="";
if (Q.at=="P") {dcaQA=Q.xdca;}
else if (Q.at=="M") {
dcaQA="<nobr>"+Q.xdca+"&nbsp;( ZZ";
for(var jjj=0;jjj<Q.ncpos.length;jjj++) {
var iii=Q.ncpos[jjj]-0;
if (iii>=0) dcaQA+=","+String.fromCharCode(65+iii)+"&lt;=="+((jjj==0)?"A":"C"+jjj);
}
dcaQA=dcaQA.replace(/ZZ,/,"")+" )</nobr>";
}
else {dcaQA=Q.xdca;}
var result=htmlb+qtxt+"<p><b>CORRECT ANSWER:<p>"+dcaQA+soltxt+htmle;
return this.fix_box_sup(result);
}
function ZZSXM(_qid,doc,_msg){
if (!this.ZZOgi(_qid)) return null;
var Q=this.ZZDBx[_qid];
this.ctol=Q.tol;
if (typeof doc=="string") {
_msg=doc;
Q.YTwin=window.question;
Q.YTdoc=Q.YTwin.document;
} else {
Q.YTwin=doc;
Q.YTdoc=Q.YTwin.document;
}
var htmlb='<html><head>'+Q.htmlbase+
'<link HREF="bv_styles.css" REL="stylesheet" TYPE="text/css">'+
'</head>\n<body onload="self.scrollTo(0,10000);">'+
'<form action="about:" onsubmit="return false;">';
var htmle='\n</form></body></html>';
if ((_msg)&&((_msg+"").replace(/\s+|&nbsp;/g,''))) {
htmlb+= '<div style="font-size:large;font-weight:900;'+
'text-align:left;vertical-align:middle;color:#4040A0;">'+
_msg+'</div>&nbsp;';
} 
if ((Q.wtxt+"").indexOf("NotYetImplemented")>=0) {
return htmlb+"<p>Question:<p>"+
_rQP(_qid)+"<p>"+_getAnswerText(_qid)+htmle;
}
var qtxt=Q.xqtp;
Q.YTtxt=htmlb+qtxt;
return ytsa(_qid,0);
}
function ZZ_zd(_qid,s){
if (!this.ZZOgi(_qid)) return null;  
var Q=this.ZZDBx[_qid];
var result="";
var markb="TBERN ONLY BEGIN";
result+="<br><hr><br>";
for (var qobj in this.ZZDBx) 
if ((this.ZZDBx[qobj])&&(this.ZZDBx[qobj].init_seed)) {
result+="<br>"+this.ZZDBx[qobj].tid+"::"+this.ZZDBx[qobj].init_seed;
}
result+='<p>Answer:<br>'+this._getAnswerHTML(_qid,true);
result+='<p>GetAnswer:<br>'+this.ZZQdm(_qid);
var marke="TBERN ONLY END";
var hi_txt=this.ZZDBx[_qid].hi;
if (hi_txt.indexOf("NotYetImplemented")>=0) {
if ((Q.wtxt+"").indexOf("NotYetImplemented")>=0) {
return "<p>Question:<p>"+_rQP(_qid)+"<p>"+this._getAnswerText(_qid);
} else {
return Q.xqtp+"<p>"+this._getSolutionHTML(_qid,false); 
}
}
if (! s) s=999;
var i,l,str,steps;
str=this.parseTags(hi_txt,'step','');
if (str.indexOf('<step>')<0) return str+result;
str=str.replace(/<step>/g,"@~").
replace(/<\/step>/g,"@");
steps=str.split("@");
hi_txt="<table width=580 cellpadding=0 cellspacing=0 border=0>";l=0;
for(i=0;i<steps.length;i++) {
if (steps[i].indexOf("~")!=0) continue;
if (++l>s) break;
hi_txt+="<tr><td>"+steps[i].substr(1)+"</td></tr>";
}
hi_txt+="</table>";
return hi_txt+result;
}
function _getSolutionHTML(_qid,full) {
var result="";
if (full) result=_renderSolution(_qid,true,"red");
else result=_renderSolution(_qid,false);
if (result.indexOf("NotYetImplemented")>=0) result=_getAnswerText(_qid);
return result;
}
function ZZ_wu(_qid){
if (!this.ZZOgi(_qid)) return Math.sqrt(-1);  
var Q=this.ZZDBx[_qid];
if (Q.at=="Y") return -1;
else if (Q.at=="P") return 0;
else if (Q.at=="I") return 1;
else if (Q.sat=="MS") {if (Q.nca<=2) return 3;else return 4;}
else if (Q.at=="M") return Math.min(4,Q.nca);
else return 4;
}
function _getInfo(_qid){
if (!this.ZZOgi(_qid)) return "";  
with (ZZDBx[_qid].info) {
return (''+sat+':'+nci+':'+ilev+':'+hint+':'+sol);
} 
}
function ZZWCl(_qid,win){
if (!this.ZZOgi(_qid)) return false;
var Q = this.ZZDBx[_qid];
if ((typeof win == "object")&&(win!=null)&&(win.document)) Q.queWin=win;
if (Q.at != "P") return true;
if (Q.queWin) Q.queWin.lsi_math_palette=Q.applet;
if ((!Q.queWin)||(!Q.queWin.lsi_math_palette)) {return false;}
if (Q.response!=null) {
Q.response=null;
return Q.queWin.lsi_math_palette.request_input(Q.queWin.document);
} 
if (Q.queWin.lsi_math_palette.ready) return true;
else return false;
}
function ZZQdm(_qid,win){
if (!this.ZZOgi(_qid)) return false;  
var Q = this.ZZDBx[_qid];
var doc=null, correct=false, score=0;
if ((typeof win == "object")&&(win!=null)&&
(win.document)) {Q.queWin=win;doc=win.document;}
else if ((typeof Q.queWin == "object")&&(Q.queWin!=null)&&
(Q.queWin.document)) {doc=Q.queWin.document;}
this.ctol=Q.tol;
Q.xfan="";Q.xchoice=-1;
if (Q.at=="M") {
Q.response=this.getresponse(doc,Q.unid);
Q.xres=Q.response+"";
if ((!Q.xres)||(this.ZZqOM(Q.response))) {
Q.xres="";
Q.xdua='None Given';
correct=false;
score=(correct)?1:0;
} else {
correct=(Q.xres==Q.xcmp);
score=(correct)?1:0;
var ansrs=Q.xres.split(",");
for(var i=0;i<ansrs.length;i++) {
Q.xfan+='<mc>'+Q.charr[ansrs[i]-0]+'</mc>';
if (Q.xchoice<0) Q.xchoice=Q.ncposinv[ansrs[i]-0];
if (Q.ncl) ansrs[i]=Q.charr[ansrs[i]-0];
else ansrs[i]=String.fromCharCode(65+(ansrs[i]-0));
}
Q.xdua=ansrs.join(", ");
}
} else if (Q.at=="I") {
correct=true;
var bc,gc,tst;
var triple=new Array(3);
var u_ar=new Array(Q.ibxa.length+1);u_ar[0]='U';
var a_ar=new Array(Q.ibxa.length+1);a_ar[0]='A';
for (bc=0;bc<Q.ibxa.length;bc++) {
triple=Q.ibxa[bc].getGrade(doc);
Q.igra[bc]=triple[0];
Q.ires[bc]=triple[1];
Q.xfan+="<mi>"+triple[0]+"::"+triple[1]+"</mi>";
if ((Q.igra[bc]<1)&&(Q.igra[bc]>-10)) correct=false;
tst=Q.icmp[bc];
if (isFinite(tst)) {
a_ar[bc+1]=tst-0;
tst=Q.ires[bc];if (isFinite(tst)) tst-=0;
u_ar[bc+1]=tst;
} else  {
a_ar[bc+1]=tst;
u_ar[bc+1]=Q.ires[bc];
}
}
if (correct) for(var gc=0;gc<Q.irbp.length;gc++) {
tst=this.aparse(Q.irbp[gc],u_ar,a_ar,['QID',_qid]);
if (((tst+'').toLowerCase()=='false')||(!tst)
||((tst<1)&&(tst>0))) {correct=false;break;}
}
Q.xgra=Q.igra.join('@');
var p0,abc,cdua="";
var str3=Q.idua;
while((p0=str3.indexOf("&UIO3"))>=0) {
abc=Q.ibxi[str3.substr(p0+5,2)-0];
if (Q.igra[abc]<1) cdua=Q.ibxa[abc].render(2,2,'red');
else cdua=Q.ibxa[abc].render(2,2,'green');
str3=str3.substring(0,p0)+cdua+str3.substring(p0+8);
}
Q.xdua=str3;
Q.xres=Q.ires.join('@');
if (Q.xres.search(/^[ @]*$/)==0) Q.xres="";
score=(correct)?1:0;
} else if (Q.at=="P") {
if (Q.mpalg+""==="") {
correct=true;
Q.xres=Q.xcmp;
Q.xdua='None Given';
} else { 
if (Q.response==null) {
if (doc) Q.response=(""+Q.queWin.lsi_math_palette.get_input());
else Q.response=""; 
Q.response=Q.response.replace(/[^0-9a-f]+/g,"");
}
Q.xres=Q.response+"";
var sresp = this.ZZoTY(Q.xres);
var mptst= sresp.replace(/<\/*[tiboc]>/g,"").replace(/  */g,"");
if ((!doc)||(!Q.xres)||(mptst==Q.xtst)) {
Q.xres="";Q.xdua='None Given';correct=false;
} else {
Q.xdua=this.QMPview(sresp,2);
if (Q.gtol) Q.mptol=Q.gtol;
correct=this.ZZApB(Q,this.ZZLuF(sresp,Q));
} 
if ((this.MZbrowser)&&(doc)&&(Q.queWin.lsi_math_palette)) alert("Java Applet Unloading ...");
} 
Q.xfan="<mp>"+this.ZZoTY(Q.xres)+"::"+this.ZZoTY(Q.xcmp)+"</mp>";
score=(correct)?1:0;
} else if (Q.at=="Y") {
Q.response=this.getresponse(doc,Q.unid,true);
Q.xres=Q.response+"";
if ((!Q.xres)||(this.ZZqOM(Q.response))) {
Q.xres="";
Q.xdua='None Given';
score=0;
} else {
Q.xres=this.uni2esc(Q.xres);
Q.xdua=this.mkareabox(Q.unid,Q.xres,2,Q.yrows,Q.ycols);
score=-1;
Q.xfan="<my>not graded</my>";
}
}
Q.xdco=(score==1)?'correct':(score==0)?'incorrect':'not graded';
if (this.MIDebug) debug_report(correct,Q);
if (Q.inst.indexOf("<!--XXEmilXX-->")>0) this.MIDebug=!this.MIDebug;
return score+":"+Q.init_seed+":"+Q.xres+":"+Q.xcmp;
}
function _getFullAnswer(_qid) {return this.ZZDBx[_qid].xfan;}
function _getFollowup(_qid) {
var Q = this.ZZDBx[_qid];
if ((Q.xchoice>=0)&&(Q.xchoice<Q.flup.length)) return Q.flup[Q.xchoice];
else return '';
}
function _getFeedback(_qid) {
var Q = this.ZZDBx[_qid];
if ((Q.xchoice>=0)&&(Q.xchoice<Q.fbck.length)) return Q.fbck[Q.xchoice];
else return '';
}
function debug_report(Q) {
var txt="",nr="</td></tr>\n<tr><td>";nc="</td><td>";
var _qid=Q.qid;
txt="<table border=1 cellpadding=5><tr><td>";
txt+="getAnswer"+nc+":"+Q.init_seed+":"+Q.xres+":"+Q.xcmp;
txt+=nr+"getDisplay"+nc+ZZZoV(_qid);
txt+=nr+"Q.at:Q.sat:Q.idam"+nc+Q.at+":"+Q.sat+":"+Q.idam;
if (Q.at=="I") {
var tt="<table border=1 width=100%><tr><td>Num</td>"+
"<td>ires</td><td>cmp</td><td>tag</td>"+
"<td>dua</td><td>dca</td><td>gra</td></tr>";
for(var dbc=0;dbc<Q.ibxa.length;dbc++) {
tt+="<tr><td>"+dbc+
"</td><td>"+Q.ires[dbc]+
"</td><td>"+Q.icmp[dbc]+
"</td><td>"+Q.itag[dbc]+
"</td><td>"+Q.idua[dbc]+
"</td><td>"+Q.idca[dbc]+
"</td><td>"+Q.igra[dbc]+
"</td></tr>";
}
tt+="</table>";
txt+="</td></tr><tr><td colspan=2>"+tt;
}
txt+=nr+"Q.inst"+nc+Q.inst;
txt+=nr+"Q.xqta"+nc+Q.xqta;
txt+=nr+"Q.xqtp"+nc+Q.xqtp;
txt+=nr+"Q.xqtd"+nc+Q.xqtd;
txt+=nr+"Q.xrui"+nc+Q.xrui;
txt+=nr+"Q.xdui"+nc+Q.xdui;
txt+="</td></tr></table>";
debug_html(txt);
}
function _getAllAnswers(_qid) {
var Q = this.ZZDBx[_qid];
var result="";
if (Q.at=="P") {
var obj=Q.mpalg;
var term="";
for (var l1 in obj) {
result+="\n<p>";
if (typeof obj[l1] !="object") {
term=l1+"->"+obj[l1];
result+=term.replace(/&/g,"&amp;").replace(/</g,"&lt;");
} else for (var l2 in obj[l1]) {
result+="\n<br>&nbsp;";
if (typeof obj[l1][l2] !="object") {
term=l1+"."+l2+"->"+obj[l1][l2];
result+=term.replace(/&/g,"&amp;").replace(/</g,"&lt;");
} else for (var l3 in obj[l1][l2]) {
result+="\n<br>&nbsp;&nbsp;";
term=l1+"."+l2+"."+l3+"->"+obj[l1][l2][l3];
result+=term.replace(/&/g,"&amp;").replace(/</g,"&lt;");
}
}  
}
if (result=="") result="No Answer Given.";
else {
result=result.replace(/&lt;x>/g,"<sup>").replace(/&lt;\/x>/g,"</sup>");
result=result.replace(/&lt;y>/g,"<sub>").replace(/&lt;\/y>/g,"</sub>");
}
return "<table><tr><td>"+result+"</td></tr></table>";
} else if (Q.at=="M") {
result="<nobr>"+Q.xdca+"&nbsp;(ZZ";
for(var jjj=0;jjj<Q.ncpos.length;jjj++) {
var iii=Q.ncpos[jjj]-0;
if (iii>=0) result+=","+String.fromCharCode(65+iii)+"&lt;=="+((jjj==0)?"A":"C"+jjj);
}
result=result.replace(/ZZ,/,"")+" )</nobr><br>"+Q.xans;
return result;
}
else return _getAnswerHTML(_qid,true);
} 
function _getAnswerHTML(_qid,full) {
if (!this.ZZOgi(_qid)) return false;
var Q = this.ZZDBx[_qid];
if (full) return Q.xans;
else return Q.xdca;
}
function _getAnswerText(_qid){
if (!this.ZZOgi(_qid)) return false;  
var Q = this.ZZDBx[_qid];
return "The correct answer is:"+
"<p><!--BCA-->"+Q.xans+"<!--ECA--></p>";
}
function _getLAnswer(_qid){
if (!this.ZZOgi(_qid)) return false;  
var Q = this.ZZDBx[_qid];
var cstep=this.ytsa(_qid,3);
var tblb='<table cellpadding=3 cellspacing=0 width="'+(this.qwidth-2)+'" border=0>'+
'<colgroup><col width="1*" align="right"><col width="0*" align="center">'+
'<col width="1*" align="left"><col width="6*" align="left"></colgroup><tbody>'+
'<tr height=3><td width="5%"> </td><td width="1%"> </td><td width="5%"> '+
'</td><td width="89%"> </td></tr>';
var tble='\n</tbody></table>';
var stepc='<tr><td colspan=4 align="left"><b>Step @@</b></td></tr>';
Q.liya="";
Q.lica="";
var ncorr=0;
var nwrng=0;
var nastp=0;
for(i=1;i<=cstep;i++) {
ncorr+=Q.alico[i][0];
nwrng+=Q.alico[i][1];
if (Q.alico[i][1]+Q.alico[i][0]>0) {
nastp++;
Q.liya+=stepc.replace(/@@/,i)+Q.aliya[i];
Q.lica+=stepc.replace(/@@/,i)+Q.alica[i];
}
}
if (nastp>0) {
Q.liya=tblb+Q.liya+tble;
Q.lica=tblb+Q.lica+tble;
nastp=ncorr+nwrng;
} else {
Q.liya="";
Q.lica="";
if (Q.info.nlb>0) {ncorr=0;nwrng=1;nastp=1;}
else {ncorr=1;nwrng=1;nastp=1;}
}
Q.lico="Total correct: "+ncorr+"<br>Total attempted:"+nastp;
return ncorr+":"+nwrng+":"+Q.info.nlb+":"+Q.init_seed;
}
function _getLDisplay(_qid){
if (!this.ZZOgi(_qid)) return false;  
var Q = this.ZZDBx[_qid];
var par='<div style="background-color:#CECECE;">';
var result="";
result+=par+"Question</div><!--BQT-->"+_rQP(_qid)+"<!--EQT-->\n";
result+=par+"Solution</div><!--BST-->"+_renderSolution(_qid,false,'report')+"<!--EST-->\n";
result+=par+"Your Answer(s)</div><!--BUA-->"+Q.liya+"<!--EUA-->\n";
result+=par+"Correct Answer(s)</div><!--BCA-->"+Q.lica+"<!--ECA-->\n";
result+=par+"Summary</div><!--BCO-->"+Q.lico+"<!--ECO-->\n";
return this.fix_box_sup(result);
} 
function ZZZoV(_qid){
if (!this.ZZOgi(_qid)) return false;  
var Q = this.ZZDBx[_qid];
if (typeof Q.xdua=="undefined") Q.xdua="None Given";
if (typeof Q.xdco=="undefined") Q.xdco="incorrect";
var result="";
if ((Q.at=='I')&&(Q.idam==2)) result+="<!--BIT-->"+Q.inst+"<!--EIT-->";
else result+="<!--BQT-->"+_rQP(_qid)+"<!--EQT-->";
result+="<p>Your Answer:<!--BUA-->"+Q.xdua+"<!--EUA--></p>";
result+="<p>Correct Answer:<!--BCA-->"+Q.xdca+"<!--ECA--></p>";
result+="<p>Your Answer was:<!--BCO-->"+Q.xdco+"<!--ECO--></p>";
return this.fix_box_sup(result);
}
function mkgraph(xs,ys,func,xmin,xmax,ymin,ymax,opts) {
var applettext='<br><applet code="cal" archive="cal.jar" '+
'codebase="'+this.ccvURL+'lib" ';
if ((xs>=100)&&(xs<=1000)) applettext+='width="'+xs+'" ';
else applettext+='width="200" ';
if ((ys>=100)&&(ys<=1000)) applettext+='height="'+ys+'">\n';
else applettext+='height="200">\n';
var apar=new Object();
if ((xmin===0)||(xmin)) apar.xmin=xmin;
if ((xmax===0)||(xmax)) apar.xmax=xmax;
if ((ymin===0)||(ymin)) apar.ymin=ymin;
if ((ymax===0)||(ymax)) apar.ymax=ymax;
if ((func===0)||(func)) apar.func=func;
var allopt="",opt=7,str="",i=0,nm,val;
for(opt=7;opt<arguments.length;opt++) allopt+='~'+arguments[opt];
var optarr=allopt.replace(/&#126;/g,'~').split(/~/);
for(opt=0;opt<optarr.length;opt++) {
str=optarr[opt];i=str.indexOf("=");
if (i<=1) continue;
nam=str.substr(0,i);val=str.substr(i+1);
var oldval=apar[nam];
if (oldval) {
oldval=(oldval+"").replace(/;$/,'');
apar[nam]=oldval+";"+val;
} else apar[nam]=val;
}
for(nam in apar) {
apar[nam]=(apar[nam]+'').
replace(/- *\+/g,'-').
replace(/\+ *-/g,'-').
replace(/- *-/g,'+').
replace(/\+ *\+/g,'+').
replace(/<sup>(.)<\/sup>/g,'^$1').
replace(/<sup>(..+)<\/sup>/g,'^($1)').
replace(/\*\*/g,'^').
replace(/\+ *\+/g,'+').
replace(/</g,"&#LT;").
replace(/>/g,"&#GT;");
applettext+='\n<param name="'+nam+'" value="'+apar[nam]+'">';
}
applettext+='</applet><br>';
return applettext.replace(/-/g,"&#HM;");
}
function annotate(_qid,W,H,imgtag,anns){
var Q=this.ZZDBx[_qid];
var movie_data=''+W+'@'+H+'@';
var x=0,y=0,imgname,imgopts='',i,w,h,a,t;
imgtag=imgtag.replace(/^[\s\$]/g,'');
t=imgtag.indexOf(':');
if (t<0) {imgname=imgtag;imgopts='x0y0';}
else {imgname=imgtag.substring(0,t);imgopts=imgtag.substring(t+1);}
if ( imgname.indexOf('..')==0) movie_data+=Q.pdir +"/"+imgname.substring(2);
else if ( imgname.indexOf('.')==0) movie_data+=Q.qdir +"/"+imgname.substring(1);
else movie_data+=this.ccvURL+"chars/"+imgname;
movie_data+='.jpg';
if (imgopts) {
x=parseInt(imgopts.replace(/^.*x/,''));
y=parseInt(imgopts.replace(/^.*y/,''));
} 
movie_data+='@'+x+'@'+y;
for(i=5; i<arguments.length; i++) anns+='@'+arguments[i];
var ann=anns.split('@');
for(i=0;i<ann.length;i++) {
h=(ann[i]+"").replace(/^\W*/,'');
t=h.charAt(0);
if ((t=='c')||(t=='C')) a='c';
else if ((t=='r')||(t=='R')) a='r';
else a='l';
h=h.replace(/^\D*/,'');  
movie_data+='@'+parseInt(h);
h=h.replace(/^[^,]*,\D*/,'');  
movie_data+='@'+parseInt(h)+'@'+a;
movie_data+='@:'+h.replace(/^[^:]*:/,'');
}
movie_data=movie_data.replace(/@NaN/g,'@0').replace(/@:/g,'@');
var FlashVars='img_data='+escape(movie_data);
var movieURL=this.ccvURL+'lib/image_viewer.swf?ver=1';
var img_v_code= 
'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" \n'+
'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" '+
'width="'+W+'" height="'+H+'" align="middle">\n'+
'<param name="movie" value="'+movieURL+'">\n'+
'<param name="quality" value="best">\n'+
'<param name="bgcolor" value="#ffffff">\n'+
'<param name="allowScriptAccess" value="always">\n'+
'<param name="scale" value="exactfit">\n'+
'<param name="FlashVars" value="'+FlashVars+'">\n'+
'<embed '+
'type="application/x-shockwave-flash" \n'+
'pluginspace="http://www.macromedia.com/go/getflashplayer" \n'+
'width="'+W+'" height="'+H+'" align="middle" \n'+
'src="'+movieURL+'" \n quality="best" bgcolor="#ffffff" '+
'allowScriptAccess="always" scale="exactfit"\n'+
'FlashVars="'+FlashVars+'">'+
'</object>';
img_v_code=img_v_code.replace(/-/g,"&#HM;").replace(/@/g,"&#HA;");
return img_v_code;
}
function fix_box_sup(str) {
if ((typeof str!='string')||(str.indexOf('<!--InpBox-->')<0)) return str;
var zsup='<span style="font-size:0.9em;position:relative;top:-1em;left:.2em;right:.2em">';
str=str.replace(/<!--InpBox-->((\s*|&nbsp;)+)/g,'$1\xF1').
replace(/<\/sup>/g,'\xF2<\/sup>').
replace(/<sup>/g,'<sup>\xF3').
replace(/(\xF3[^\xF2\xF3]*)\xF3/g,'$1').
replace(/(\xF2[^\xF2\xF3]*\xF2)/g,'$1').
replace(/(\xF3[^\xF2\xF3]*)\xF3/g,'$1').
replace(/(\xF2[^\xF2\xF3]*\xF2)/g,'$1').
replace(/\xF1<sup>\xF3([^\xF2\xF3]*)\xF2<\/sup>/g,'<zsup>$1</span>').
replace(/[\xF1\xF2\xF3]+/g,'').
replace(/<zsup>/g,zsup).
replace(/<!--InpBox-->/g,'');
return str;
}
function ZZKQf(str,style,Q) {
if ((! Q)||(typeof Q!="object")) {Q=this.dummyQ;}
if (typeof str != "string") {
if ((typeof str != "number")&&(! str)) str="";
else str=""+str;
}
if (str.search(/^\s*$/)==0) return str;
var font="";var nobr="";
if (str.indexOf("<o:")>=0) str=this.ZZNPW(str);
str=str.replace(/<!--/g,'&#OC;').replace(/-->/g,'&#CC;');
str=this.ZZzEM(str);
if (style) {
if (style.indexOf("i")>=0) font+="font-style:italic;";
if (style.indexOf("b")>=0) font+="font-weight:bold;";
if (style.indexOf("n")>=0) nobr="n";
if (style.indexOf("N")>=0) nobr="N";
if (style.indexOf("t")>=0) str="<table><tr><td"+((nobr)?"=n":"")+">"
+str+"</td></tr></table>";
}
if (nobr) str=this.ZZslq(str,nobr);
else str=this.ZZslq(str);
str=this.ZZucD(str,Q);
if (font) str=this.ZZoVx(str,font);
else str=this.ZZoVx(str);
var str1='';str=str.replace(/@/g,"&#HA;");
while ((str1!=str)&&(str.indexOf('-')>=0)) {str1=str;
str=str.replace(/([a-zA-Z\"\'])-([a-zA-Z])/g,"$1@$2").
replace(/(<[a-zA-Z][^<>]*['"][^<>]*)-/g,"$1@");    //"'
}
str=str.replace(/-/g,"&minus;").
replace(/@/g,"-").
replace(/&#HM;/g,"-").
replace(/&#HA;/g,"@").
replace(/&#LT;/g,"<").
replace(/&#GT;/g,">").
replace(/&#OC;/g,'<!--').
replace(/&#CC;/g,'-->').
replace(/\$/g,"&#36;");
str=str.replace(/<nobr>(.|[a-zA-Z0-9]*|&[#a-zA-Z0-9]*;)<\/nobr>/g,"$1");
if (Q.tolopt.cmm4) str=this.addcommas(str,(!(Q.tolopt.cmm3)));
return str;
}
function ZZNPW(str) {
return str;
}
function ZZxme(str) {
return '<b>Begin Object:</b>'+str+'<b>End Object:</b>';
}
function ZZucD(str,Q) {
str=str.replace(/\\\\/g,'\xF1').replace(/\\\$/g,'\xF2');
str=str.replace(/(\$[\.a-zA-Z0-9_%:]+\$)/g,"\xF3\xF4$1\xF3");
var chunks=str.split(/\xF3/);
for(var i=0;i<chunks.length;i++) {
chunks[i]=chunks[i].replace(/\xF1/g,'\\\\').replace(/\xF2/g,'\\$');
if (chunks[i].indexOf("\xF4")==0) {
chunks[i]=chunks[i].substring(2,chunks[i].length-1);
var img=chunks[i].split(':');
if (Q.assets&&Q.assets[img[0]]) {img[0]=img[0]+'.'+Q.assets[img[0]];}
chunks[i]=this.ZZuff(img.join(':'),Q.qdir,Q.pdir);
} 
}
str=chunks.join(""); 
return str;
}
function ZZuff(str,qdir,pdir) {
if (str=="DOLLAR") return "$";
else if (str==".") return qdir;
else if (str=="..") return pdir;
var opts="";var i=str.indexOf(":");var dir="chars";
if (i>0) {
opts=str.substr(i+1);
str=str.substring(0,i);
if ((opts.charAt(0)>='0')&&(opts.charAt(0)<='9')) opts='w'+opts;
}
if ((pdir)&&(str.indexOf("..")==0)) {dir=pdir;str=str.substr(2);}
else if ((qdir)&&(str.indexOf(".")==0)) {dir=qdir;str=str.substr(1);}
dir=dir.replace(/\/$/,"");
var fstr=str;if (fstr.indexOf(".")<0) fstr+=".gif";
str=str.replace(/\..*/,'');
if (opts) return '<img='+opts+' src="'+dir+'/'+fstr+'" alt="'+str+'">';
else return '<img src="'+dir+"/"+fstr+'" alt="'+str+'">';
}
function ZZzEM(str) {
var str1="",i=0,j=0,k=0;
if (str.indexOf("<getm>")>=0) {
while((i=str.indexOf("<getm>"))>=0) {
j=str.indexOf("<putm>",i+6);
if (str.charAt(i-1)=='-') k=1;else k=0;
str1+=str.substring(0,i-k)+str.substring(i+6,j)+((k==1)?'-':'');
str=str.substring(j+6);
}
str=str1+str;
} 
if ((str.indexOf("+")<0)&&(str.indexOf("-")<0)) {
if (str.indexOf("null;")<0) return str;
else return str.replace(/&pnull;/g,'').replace(/&null;/g,' ');
}
str=str.replace(/((<\/?nobr>|\s+|<\/?span[^>]*>|\$(space|tiny)[^\$]*\$|&nbsp;)+)/g,'\xF1$1\xF2');
str1="";
while (str1!=str) {str1=str;
str=str.replace(/\+((\xF1[^\xF2]*\xF2|\s*)*) *\+/g,'$1+ ').
replace(/\+((\xF1[^\xF2]*\xF2|\s*)*) *\-/g,'$1- ').
replace(/\-((\xF1[^\xF2]*\xF2|\s*)*) *\+/g,'$1- ').
replace(/\-((\xF1[^\xF2]*\xF2|\s*)*) *\-/g,'$1+ ');
}
if (str.indexOf("null;")>=0) {
str=str.replace(/([\+\-])((\xF1[^\xF2]*\xF2|\s*)*)&null;/g,'$2');
str=str.replace(/&null;/g," ");
str=str.replace(/&pnull;([\+\-])(\xF1[^\xF2]*\xF2|\s*)\+/g,'$1');
str=str.replace(/&pnull;/g," ");
}
str=str.replace(/[\xF1\xF2]/g,'');
return str;
}
function ZZslq(str,nobr) {
var txt=str;var i,piece,chunks;
txt=txt.replace(/[\r\n]+/g,"<NL>");
txt=txt.replace(/[\xF1-\xF8]/g,"");
txt=txt.replace(/<NL>/g,"\xF8");
txt=txt.replace(/(<i?table[^>]*>)/ig,"$1\xF6").replace(/(<\/i?table>)/ig,"\xF7$1");
txt=txt.replace(/(<tr[^>]*>)/ig,"$1\xF4").replace(/(<\/tr>)/ig,"\xF5$1");
txt=txt.replace(/\xF4([^\xF4\xF5\xF6]*)\xF7/g,"\xF4$1\xF5</tr>\xF7");
txt=txt.replace(/(<td[^>]*>)([\xF8]*)/ig,"$1$2\xF1").
replace(/([\xF8]*)(<\/td>)/ig,"\xF2$1$2");
txt=txt.replace(/\xF1([^\xF1\xF2\xF6]*)\xF5/g,"\xF1$1\xF2</td>\xF5");
txt=txt.replace(/[\xF4\xF5\xF6\xF7]*/g,"");
txt=txt.replace(/([\xF8]*)(<table|<div|<p[ >])/ig,"\xF3$1$2").
replace(/(<\/table|<\/div|<\/p)([\xF8]*>[\xF8]*)/ig,"$1$2\xF3").
replace(/[\xF8]*<br\/?>[\xF8]*/ig,"\xF4").
replace(/[\xF3\xF8]*\xF3[\xF3\xF8]*/g,"\xF3").
replace(/[\xF3\xF4\xF8]*\xF4[\xF3\xF4\xF8]*/g,"\xF4");
txt=txt.replace(/(<itable)/ig,"\xF5$1").
replace(/(<\/itable>)/ig,"$1\xF5").
replace(/\xF5[\xF5]+/g,"\xF5");
txt=txt.replace(/\xF3\xF5/g,"\xF3").
replace(/\xF5\xF3/g,"\xF3").
replace(/\xF4[\xF3\xF5]/g,"\xF4").
replace(/[\xF3\xF5]\xF4/g,"\xF4").
replace(/\xF1[\xF3\xF4\xF5]/g,"\xF1").
replace(/[\xF3\xF4\xF5]\xF2/g,"\xF2");
var loop_break=0;
var REcells=/\xF1[^\xF1]*\xF2/;
while ((i=txt.search(REcells))>=0) {
if (++loop_break>str.length/5) {
alert("Endless loop in render Text !!"); 
return str;
}
var iend=txt.indexOf("\xF2",i);
var mid=txt.substring(i,iend+1);
if (mid.indexOf("\xF5")<0) {
mid=mid.replace(/[\xF1\xF2\xF3]+/g,"").
replace(/\xF4/g,"<br>");
}
else { var td=(nobr)?'<td=n>':'<td>';
if ((this.browser.N)&&(this.browser.v<7.0)) td='<td=n>';
mid=mid.
replace(/ *&nbsp; */g,"&nbsp;").
replace(/\xF1/g,"<table=J2P0p0><tr>"+td).
replace(/\xF2/g,"</td></tr></table>").
replace(/\xF3/g,"</td></tr></table><table=J2P0p0><tr>"+td+"").
replace(/\xF4/g,"</td></tr></table><table=J2P0p0><tr>"+td+"").
replace(/ \xF5/g,"&nbsp;</td>"+td).
replace(/\xF5 /g,"</td>"+td+"&nbsp;").
replace(/\xF5/g,"</td>"+td);
} 
txt=txt.substring(0,i)+mid+txt.substr(iend+1); 
}
txt=txt.replace(/[\xF1-\xF5]/g,"");
txt=txt.replace(/\xF8/g,"\n");
if (nobr=='N') {
txt=txt.replace(/<td=/gi,"<td=n").
replace(/<td /gi,"<td nowrap ").
replace(/<td>/gi,"<td=n>");
}
return txt;
} 
function ZZoVx(str,font) {
str=(str+"").replace(/<itable>/ig,"<itable=>");
if (font) str=str.replace(/<(td|span|div)([\s>])/ig,"<$1=$2");
else font="";
var rex_str,rex_arr,rex_re;
rex_str="";rex_arr=null;
rex_re=/<(td|span|div)=([a-zA-Z0-9.]*)([^>]*)>/i;
while ((rex_arr = str.match(rex_re)) != null) {
rex_str+=str.substring(0,rex_arr.index);
str=str.substring(rex_arr.index+rex_arr[0].length);
rex_str+=this.ZZlqi(rex_arr[1],rex_arr[2],rex_arr[3],font);
}
str=rex_str+str;
rex_str="";rex_arr=null;
rex_re=/<(itable|table|tr|div|span|img)=([a-zA-Z0-9.]*)([^>]*)>/i;
while ((rex_arr = str.match(rex_re)) != null) {
rex_str+=str.substring(0,rex_arr.index);
str=str.substring(rex_arr.index+rex_arr[0].length);
rex_str+=this.ZZlqi(rex_arr[1],rex_arr[2],rex_arr[3],font);
}
str=rex_str+str;
str=str.replace(/(<\/?)itable/ig,"$1table");
return str;
}
function ZZlqi(tag,style,other,font) {
var ch="",prm="",i=0;
if (!style) style="";
if (font) {
if (font.indexOf('italic')>0) style='i'+style;
if (font.indexOf('bold')>0) style='d'+style;
}
if (!other) other="";
if (other.toLowerCase().indexOf('nowrap')>=0) {
style+="n";other=other.replace(/(white-space:)?\s*nowrap\s*/ig," ");
}
for(i=0;i<2;i++) style=style.
replace(/[wWGg]\d*(.*[wWGg])/,"$1").
replace(/[hHM]\d+(.*[hHM])/,"$1").
replace(/[fFs]\d*(.*[fFs])/,"$1").
replace(/[lrcj](.*[lrcj])/,"$1").
replace(/[mtba](.*[mtba])/,"$1");
if (style.indexOf('N')>=0) style=style.replace(/n/g,'');
else if (style.indexOf('n')>=0) style='n'+style.replace(/n/g,'');
if (style.indexOf('I')>=0) style=style.replace(/i/g,'');
else if (style.indexOf('i')>=0) style='i'+style.replace(/i/g,'');
if (style.indexOf('D')>=0) style=style.replace(/d/g,'');
else if (style.indexOf('d')>=0) style='d'+style.replace(/d/g,'');
var ttag=(tag.search(/^(i?table|tr|td|th)$/i)==0);
var itag=(tag.search(/^(img|applet|object|embed)$/i)==0);
var calgn={l:'align="left"',r:'align="right"',c:'align="center"',
b:'valign="bottom"',t:'valign="top"',m:'valign="middle"',a:'valign="baseline"'};
var algn={l:"text-align:left",r:"text-align:right",c:"text-align:center",
j:"text-align:justified",b:"vertical-align:bottom",m:"vertical-align:middle",
t:"vertical-align:top",a:"vertical-align:baseline",g:"width:100%",
i:"font-style:italic",I:"font-style:normal",d:"font-weight:bold",
D:"font-weight:normal",T:"margin-left:0.2em",s:"font-size:small",
n:"white-space:nowrap"};
var hgh={h:"height:@px",H:"height:@%",w:"width:@px",W:"width @%",
L:"line-height:@px",G:"width:@/10em",M:"height:@/10em",J:"margin:0em @/10em",
o:"vertical-align:@px",O:"vertical-align:-@px"}
var cspec=["#000000","#FF0000","#008000","#0000FF","#C0C0C0",
"#FF00FF","#00FF00","#00FFFF","#FFFF00","#FFFFFF"];
var bspec=["none","thin dot","thin solid","medium solid","thin double", 
"thick solid","medium double","thick double","hidden","solid"];
var fspec={f:["medium","small","x-small","xx-small","smaller"],
F:["medium","large","x-large","xx-large","larger"]};
var brd={U:"border-top:",V:"border-bottom:",B:"border:"};
var tblr={P:'cellpadding',p:'cellspacing',A:'border',
R:'rowspan',C:'colspan',n:'nowrap'};
var parm={h:'height',w:'width',A:'border'};
if ((tag=="itable")&&(!other)) {
if (style.indexOf("P")<0) style+="P0";
if (style.indexOf("p")<0) style+="p0";
if (style.indexOf("A")<0) style+="A0";
if (style.indexOf("J")<0) style="J2"+style;
}
if (this.browser.I){
style=style.replace(/f2/g, 'f3').replace(/f1/g, 'f2');
}
style=style.replace(/([a-zA-Z])/g,"\xF5$1");
var pieces=style.split(/\xF5/);
style="";var param="";
var ch="",prm="",i=0;
for(i=0;i<pieces.length;i++) {
ch=pieces[i];prm="";
if (ch.length>1) {prm=ch.substr(1)-0;ch=ch.charAt(0);}
if (ttag&&(calgn[ch])) {param+=' '+calgn[ch];continue;}
else if (itag&&(parm[ch])) {
if (typeof prm == "number") param+=' '+parm[ch]+'="'+prm+'"';
else param+=' '+parm[ch];
}
else if (tblr[ch]) {
if (typeof prm == "number") param+=' '+tblr[ch]+'="'+prm+'"';
else param+=' '+tblr[ch];
} else if (algn[ch]) {
style+=algn[ch]+";";
} else switch(ch) {
case "h":case "H":case "w":case "W":case "o":case "O":
case "L":style+=(hgh[ch]+"").replace(/@/,prm)+";";break;
case "M":case "G":
case "J":if (prm>0) style+=hgh[ch].replace(/@\/10/,(prm/10))+";";break;
case "f":case "F":style+="font-size:"+fspec[ch][prm]+";";break;
case "U":case "V":
case "B":style+=brd[ch]+bspec[(prm-prm%10)/10]+" "+cspec[prm%10]+";";break; 
case "k":style+="color:"+cspec[prm]+";";break;
case "K":if (ttag&&(this.browser.N)&&(this.browser.v<7.0)) param+=' bgcolor="'+cspec[prm]+'"';
else style+="background:"+cspec[prm]+";";break;
default:
}
}
if (other.search(/style *=/)>=0) {
var stpart="";
other=other.replace(/style\s*=\s*/ig,"\xF5");
style+=other.replace(/[^\xF5]*\xF5'([^']*)'/ig,";$1;");
other=other.replace(/[^\xF5]*\xF5'[^']*'/ig,"");
style+=other.replace(/[^\xF5]*\xF5"([^"]*)"/ig,";$1;");
other=other.replace(/[^\xF5]*\xF5"[^"]*"/ig,"");
}
if (style) {
style=style.replace(/;;+/,";").replace(/^;/,"").replace(/;*$/,";");
return '<'+tag+' style="'+style+'" '+param+other+'>';
} else return '<'+tag+param+other+'>';
}
function get3opt(opt) {
var result=['','','',''];
if (! opt) return result;else opt="_"+opt;
opt=opt.replace(/\W\W*/g,'%').
replace(/([xyz][a-wA-Z][0-9]*)/g,'%$1').
replace(/([xyz][0-9][0-9]*)/g,'%$1').
replace(/([^xyz])([a-wA-Z][0-9]*)/g,'$1%$2').
replace(/([^%xyz])([a-wA-Z][0-9]*)/g,'$1%$2').
replace(/([^a-zA-Z0-9])([0-9][0-9]*)/g,'$1%$2').
replace(/^[_%]*/g,'').replace(/%%*/g,'%');
var arr=opt.split("%");var i,ch;
for(i=0;i<arr.length;i++) {
ch=arr[i].charAt(0);
if (ch=='x') result[1]+=arr[i].substr(1);
else if (ch=='y') result[2]+=arr[i].substr(1);
else if (ch=='z') result[3]+=arr[i].substr(1);
else if (ch<='9') result[0]=arr[i]+result[0];
else result[0]+=arr[i];
}
return result; 
}
function ZZCJI(num,typ) {
if (typeof typ == "string") {
if (typ=="I") typ=0;
else if (typ.indexOf("R*.")==0) typ=-typ.substr(3);
else if (typ.indexOf("R.")==0) typ=typ.substr(2)-0;
else if (typ.indexOf("R*")==0) typ=-typ.substr(2);
else if (typ.indexOf("R")==0) typ=typ.substr(1)-0;
}
if (!this.ZZf_y(typ)) typ=16;num-=0;
if (!isFinite(num)) return ((num<0)?'-':'')+"999999999999";
var dig=Math.abs(typ);var result="";
var N=Math.abs(num)+0.50000001*pow(10,-dig);
if (dig==0) result=Math.floor(N);
else {
result=''+((N-Math.floor(N)+1)*0.1)+'00';
if (typ<0) result+='00000000000000000';
result=Math.floor(N)+"."+result.substr(result.indexOf(".")+2,dig);
if (typ>0) result=result.replace(/00*$/,'').replace(/\.$/,'');
} 
if (num<-0.5*N) result='-'+result;
return result;
}
function read_tol_opt(_tolopt) {
var t=" "+(""+_tolopt).replace(/\D/g,'');
if (t.length==15) t+='100';
else if (t.length<18) t+="000000000000000000";
var to=new Object();
to.cmm3  =(t.charAt(1)=="1");
to.cmm4  =(t.charAt(2)=="1")||to.cmm3;
to.coef1 =(t.charAt(3)=="1");
to.scinot=(t.charAt(4)=="1");
to.postcf=(t.charAt(5)=="1");
to.unary =(t.charAt(6)=="1");
to.exp0  =(t.charAt(7)=="1");
to.exp1  =(t.charAt(8)=="1");
to.expneg=(t.charAt(9)=="1");
to.expfra=(t.charAt(10)=="1");
to.franeg=(t.charAt(11)=="1");
to.fraequ=(t.charAt(12)=="1");
to.framix=(t.charAt(13)=="1");
to.fradec=(t.charAt(14)=="1");
to.indefi=(t.charAt(15)=="1");
to.angles=(t.charAt(16)=="1");
to.tol2p=(t.charAt(17)=="1");
return to;
}
function dterm(coef,base,exp,style) {
var val=0,h=-1,str='',result='',sarr=[];
if (arguments.length==2) {style='';exp=base;base=coef;coef='';}
if ((typeof exp=="undefined")||(ZZqOM(exp))||(exp-0==1)) exp=1;
if ((typeof base == 'undefined')||(base==1)||(exp-0==0)) base='';
else {base+='';}
if (this.ZZqOM(coef)) val=1;
else val=this.r007(this.ZZVtv(coef));
if ((val==0)||(base==' 0')) return "&null;";
if ((val!=1)&&(base.charAt(0)>=0)&&(base.charAt(0)<=9)) base=' '+base;
if (this.ZZqOM(base)) str=(val==val)?val:coef;
else str=(val==1)?'':(val==-1)?'-':(val==val)?val:coef;
if ((style)&&(typeof style =="string" )) {
if ((h=style.indexOf('B'))>0) {
if ((style.charAt(h-1)=="x")&&(str))  str="<box>"+str+"</box>";
if ((style.charAt(h-1)=="y")&&(base))  base="<box>"+base+"</box>";
if ((style.charAt(h-1)=="z")&&(exp))  exp="<box>"+exp+"</box>";
style=style.replace(/.B/,"");
}
sarr=get3opt(style);
if (sarr[1]) str='<span='+sarr[1]+'>'+str+'</span>';
if (sarr[2]) base='<span='+sarr[2]+'>'+base+'</span>';
if (sarr[3]) exp='<span='+sarr[3]+'>'+exp+'</span>';
}
if (this.ZZqOM(base)) result=str;
else if (exp==1) result=str+""+base;
else result=str+""+base+"<sup>"+exp+"</sup>";
result='<nobr>'+result+'</nobr>';
if (sarr[0]) result='<span='+sarr[0]+'>'+result+'</span>';
return result;
}
function dfrac(whole,num,den,style) {
var ds="ctn",ns="cbn",ws="mn",gs="",h,i,ks=false,result='',sarr=[];
if (arguments.length==1) {den="";num="";whole+='';}
else if (arguments.length==2) {den=num+'';num=whole+'';whole='';}
else {num+='';den+='';whole+='';}
if (whole=='0') whole='';
if ((style)&&(typeof style =="string" )) {
if (style.indexOf('S')>=0) {ks=true;style=style.replace(/S/,'');}
if ((num==="")&&(den==="")) style=style.replace(/[yz]([A-Za-z])/g,"x$1");
if ((h=style.indexOf('B'))>0) {
if (style.charAt(h-1)=="x") {if (whole=='') whole='0';whole="<box>"+whole+"</box>";}      
else if (style.charAt(h-1)=="y") num="<box>"+num+"</box>";
else if (style.charAt(h-1)=="z") den="<box>"+den+"</box>";
style=style.replace(/.B/,"");
} 
sarr=get3opt(style);
gs+=sarr[0];ws+=sarr[1];ns+=sarr[2];ds+=sarr[3];
ws+=gs;ds+=gs;ns+=gs;
}
if ((num=='')&&(den=='')) {
if (!whole) whole='0';
if ((sarr[0])||(sarr[1])) return '<span='+sarr[0]+','+sarr[1]+'>'+whole+'</span>';
else return "<nobr>"+whole+"</nobr>";
} 
if ((!ks)&&(whole=='')&&((num+'').search(/^-[^\-\+]*$/)==0)) {
whole='-';num=(num+'').substring(1);
}
whole=whole.replace(/-$/,"- ");
if (whole.search(/^(\s|&nbsp;)*\-/)<0) ks="";
else {ks="-<getm>";whole=whole.replace(/\-/,"<putm>");}
if (whole) result=ks+"<itable=A0p0P1><tr><td="+ws+"><nobr>"+whole+"</nobr></td><td=m>"+
"<itable=J0><tr><td="+ns+"><nobr>"+num+"</nobr></td></tr>"+
"<tr><td=h1gK0></td></tr>"+
"<tr><td="+ds+"><nobr>"+den+"</nobr></td></tr></itable></td></tr></itable>";
else result="<itable=T><tr><td="+ns+"><nobr>"+num+"</nobr></td></tr>"+
"<tr><td=h1gK0></td></tr>"+
"<tr><td="+ds+"><nobr>"+den+"</nobr></td></tr></itable>";
return result;   
}
function stack(ts,bs,va) {
var stackable=["lim","inf","sup","max","min"];  
var result = "<itable>";
ts=(ts)?strip(ts):"";bs=(bs)?strip(bs):"";va=""+va;
if (!va) {
if (bs=="&nbsp;") va="top";
else for (var i=0;i<stackable.length;i++) 
if (ts.indexOf(stackable[i])>=0) {va="bottom";break;}
}
if ((this.browser.I)&&(ts.indexOf('<sup>')>=0)) {bs+='&nbsp;';ts+='&nbsp;';}
if (va[0]=="b") result+="<tr><td=cbnM22><nobr>"+ts+"</nobr></td></tr>"+
"<tr><td=ctn><nobr>"+bs+"<nobr></td></tr>";
else if (va[0]=="t") result+="<tr><td=cbn><nobr>"+ts+"</nobr></td></tr>"+
"<tr><td=ctnM22><nobr>"+bs+"</nobr></td></tr>";
else if (va[0]=="l") result+="<tr><td=lbn><nobr>"+ts+"</nobr></td></tr>"+
"<tr><td=ltn><nobr>"+bs+"</nobr></td></tr>"; 
else if (va[0]=="r") result+="<tr><td=rbn><nobr>"+ts+"</nobr></td></tr>"+
"<tr><td=rtn><nobr>"+bs+"</nobr></td></tr>"; 
else  result+="<tr><td=cbn><nobr>"+ts+"</nobr></td></tr>"+
"<tr><td=ctn><nobr>"+bs+"</nobr></td></tr>"; 
return result+"</itable>";
}
function dcomb(n,r) {
n=(""+n).replace(/^\s*/,"").replace(/\s*$/,"");
r=(""+r).replace(/^\s*/,"").replace(/\s*$/,"");
return "<itable>"+
"<tr><td=cmR4>$dcombl$</td><td=M2></td><td=cmR4>$dcombr$</td></tr>"+
"<tr><td=ctn>"+n+"</td></tr><tr><td=cbn>"+r+"</td></tr></itable>";
}
function drad(coef,rad,idx,style) {
if (arguments.length==1) {rad=coef;coef="";idx="";style="";}
rad+="";
if (!coef) coef="";else coef+="";
if((!idx)||(idx+""=="2")) idx="";else idx=this.strip(idx);
var result="", cst="rmnR2",ist="rtnf2R2",rst="cmn",gst="";
var size="n",h;
if (typeof style =="number" ) {h=style;}
else if (typeof style =="string" ) {
if ((h=style.indexOf('B'))>0) {
if (style.charAt(h-1)=="x") coef="<box>"+coef+"</box>";
else if (style.charAt(h-1)=="y") rad="<box>"+rad+"</box>";
else if (style.charAt(h-1)=="z") index="<box>"+index+"</box>";
style=style.replace(/.B/,"");
} 
var sarr=get3opt(style);
if (isFinite(parseInt(sarr[0]))) {
h=parseInt(sarr[0]);
sarr[0]=sarr[0].replace(/^[0-9]*/,'');
}
gst+=sarr[0];cst+=sarr[1];rst+=sarr[2];ist+=sarr[3];
cst+=gst;rst+=gst;ist+=gst;
}
if ((coef)&&(idx)) coef+="&nbsp;";
if ( !h || h<20 ) {
h=20;
if (rad.indexOf("table")+coef.indexOf("table")>=0) h=40;
if (rad.indexOf("<sup>")+coef.indexOf("<sup>")>=0) h=Math.max(h,29);
if (rad.indexOf("<sub>")+coef.indexOf("<sub>")>=0) h+=10;
}  
if (h<=30) size="n";else if (h<=50) size="b";else size="x";
if (rad.indexOf("table")<0) rad+="&nbsp;";
var cf="";if (coef.indexOf('-')==0) {coef="<putm>"+coef.substr(1);cf="-<getm>";}
result =cf+
"<itable><tr><td>$tiny$</td><td="+ist+">"+idx+"</td>"+
"<td></td><td=bN>$radtop:h5g$</td></tr>"+
"<tr><td="+cst+"><nobr>"+coef+"</nobr></td>"+
"<td=rmR2>$radright"+size+":h"+h+"$</td><td=rmR2>"+
"<itable=h"+h+"J0><tr><td="+rst+"><nobr>"+rad+"</nobr></td></tr></itable>"+
"</td></tr>"+
"<tr><td=rb>$radleft"+size+"$</td></tr><tr><td=h"+
((idx)?3:5)+"></td></tr></itable>";
return result;
}
function daround(text,pos,params) {pos+="";
var cell=[pos,'','','','',text+'','','','',''];
var ncell=new Array(10);
var i,options="",set=0,j=arguments.length,len=pos.length,result="";
if (j<2+len) {
for(i=3;i<j;i++) params+=","+arguments[i];
ncell=params.split(",");
} 
else for(i=2;i<j;i++) ncell[i-2]=""+arguments[i];
for(i=0;i<len;i++) {
j=pos.charCodeAt(i)-48;
if ((j>0)&&(j<10)&&(j!=5)) {cell[j]=ncell[i];set+=1<<j;}
else if (j==5) options+=ncell[i];
}
if (!options) options="A0p0P0";
if ((set&340)==0) return '<itable='+options+'>'+
'<tr><td=tc><sup>'+cell[1]+'</sup></td>'+
'<td=R2mc>'+cell[5]+'</td>'+
'<td=tc><sup>'+cell[3]+'</sup></td></tr>'+
'<tr><td=bc><sub>'+cell[7]+'</sub></td>'+
'<td=bc><sub>'+cell[9]+'</sub></td></tr>'+
'</itable>';
return '<itable='+options+'>'+
'<tr><td=mc><sup>'+cell[1]+'</sup></td>'+
'<td=mc>'+cell[2]+'</td>'+
'<td=mc><sup>'+cell[3]+'</sup></td></tr>'+
'<tr><td=mc>'+cell[4]+'</td>'+
'<td=mc>'+cell[5]+'</td>'+
'<td=mc>'+cell[6]+'</td></tr>'+
'<tr><td=mc><sup>'+cell[7]+'</sup></td>'+
'<td=mc>'+cell[8]+'</td>'+
'<td=mc><sup>'+cell[9]+'</sup></td></tr>'+
'</itable>';
}
function boxstyle(str,stl) {
if (stl) return "<itable><tr><td="+stl+">"+str+"</td></tr></itable>";
else return "<itable><tr><td=n>"+str+"</td></tr></itable>";
}
function overline(str,color,thickness) {
if (!color) color=0;if (!thickness) thickness=2;
return this.boxstyle(str,"U"+thickness+color+'n');
}
function underline(str,color,thickness) {
if (!color) color=0;if (!thickness) thickness=2;
return this.boxstyle(str,"V"+thickness+color+'n');
}
function boxit(str,color,thickness) {
if (!color) color=0;if (!thickness) thickness=2;
return this.boxstyle(str,"B"+thickness+color+'n');
}
function dsum(top,bottom) {
return("<itable><tr><td=cbf2>"+top+"</td></tr><tr><td=cm>"+
"$sum:w20h22$</td></tr><tr><td=cbf2>"+bottom+"</td></tr></itable>");
}
function dint(lower,upper,theImage) {
if (!(theImage)){ theImage="integralze"}
return "<itable=P0p0A0><tr><td>$space:h1w1$</td>"+
"<td=R2lt>$space:h1w1t$<sup>"+ upper + "</sup></td></tr>" +
"<tr><td=R3m>$"+ theImage + "$</td></tr>"+
"<tr><td=lmH100>$space:h2w2$</td></tr>"+
"<tr><td=R2lb><sub>"+ lower + "</sub></td></tr>" +
"<tr><td>$space:h1w1$</td></tr>"+
"</itable>";
}
function ddint(lower,upper,theImage,theImgSize) {
if (!(theImage)){ theImage="integralze"}
if (!(theImgSize)){theImgSize=25}
return "<itable=P0p0A0h"+(theImgSize + 2)+"><tr><td>$space:h1w1$</td>"+
"<td=R2lt>$space:h1w1t$<sup>"+ upper + "</sup></td></tr>" +
"<tr><td=R3mh" + theImgSize +">$"+ theImage +":h" + theImgSize +"$</td></tr>"+
"<tr><td=lmH100>$space:h2w2$</td></tr>"+
"<tr><td=R2lb><sub>"+ lower + "</sub></td></tr>" +
"<tr><td>$space:h1w1$</td></tr>"+
"</itable>";
}
function drfmat(num,den) {
if ((! this.ZZf_y(num,den) )||(den==0)) return "<sup>"+ num +"</sup>/<sub>"+ den +"</sub>";
else if (!num) return "0";
den=den-0;num=num-0;
if( num % den == 0) return "" + num/den;
if (den<0) {den=0-den;num=0-num;}
var factor=this.gcd(Math.abs(num),den);
return "<sup>"+ (num/factor) +"</sup>/<sub>"+ (den/factor) +"</sub>";
}
function daugmat(m,n,p,s) {
var rows,cols,result="",cur_elem=0;
var elems = new Array();
if (typeof s == "string") elems = s.split(",");
else if (typeof s == "object") elems=s;
else return null;
if((m*n)!=(elems.length)) return null;
result += "$space:h1w1$"+
"<itable><tr>"+
"<td=w1K0R"+(4+m)+">$bdot:w1h"+(m*10)+"$</td>"+
"<td=w7h1K0>$bdot:w7h1$</td>"+
"<td=C"+ (n+1) +">$space:w1h1$</td>"+
"<td=w7h1K0>$bdot:w7h1$</td>"+
"<td=w1K0R"+ (4+m) +">$bdot:w1h"+ (m*10) +"$</td></tr>"+
"<tr><td=R"+(m+2)+">$space:h1w1$</td>"+
"<td=C"+(n-p)+">$space:h2w1$</td><td=w1K0R"+(m+2)+">$bdot:w1h"+ m*10 +"$</td>"+
"<td=C"+ p +">$space:h2w1$</td>"+
"<td=R"+(m+2)+">$space:h1w1$</td></tr>";
for(rows=0;rows<m;rows++){
result += "<tr>";
for(cols=0;cols<n;cols++) result+="<td=cmn><nobr>&nbsp;"+elems[cur_elem++] +"&nbsp;</nobr></td>";
result += "</tr>";
}
result += 
"<tr><td=C"+(n-p)+">$space:h2w1$</td><td=C"+p+">$space:h2w1$</td></tr>"+
"<tr><td=w7h1K0>$bdot:w7h1$</td>"+
"<td=C"+ (n+1) +">$space:w1h1$</td>"+
"<td=w7h1K0>$bdot:w7h1$</td></tr></itable>"+"$space:h1w1$";
return(result);
}
function dnormmat(m,n,s) {
var rows,cols,result="",cur_elem=0;
var elems = new Array();
if (typeof s == "string") elems = s.split(",");
else if (typeof s == "object") elems=s;
else return null;
if((m*n)!=(elems.length)) return null;
result += "$space:h1w1$"+
"<itable><tr>"+
"<td=w1K0R"+(2+m)+">$bdot:w1h"+(m*10)+"$</td>"+
"<td=w7h1K0>$bdot:w7h1$</td>"+"<td=C"+n+">$space:w1h1$</td>"+"<td=w7h1K0>$bdot:w7h1$</td>"+
"<td=w1K0R"+(2+m)+">$bdot:w1h"+(m*10)+"$</td></tr>";
for(rows=0;rows<m;rows++){
result += "<tr><td></td>";
for(cols=0;cols<n;cols++) result+="<td=cmn><nobr>&nbsp;"+elems[cur_elem++] +"&nbsp;</nobr></td>";
result += "</tr>";
}
result += "<tr>"+
"<td=w7h1K0>$bdot:w7h1$</td>"+"<td=C"+n+">$space:w1h1$</td>"+"<td=w7h1K0>$bdot:w7h1$</td>"+
"</tr></itable>"+"$space:h1w1$";
return result;
}
function dmatdet(typ,m,n,s) {
if (typ=="mat") return this.dnormmat(m,n,s);
var rows,cols,result="",cur_elem=0;
var elems = new Array();
if (typeof s == "string") elems = s.split(",");
else if (typeof s == "object") elems=s;
else return null;
if((m*n)!=(elems.length)) return NaN;
if (typ=="text") {
for(rows=0;rows<m;rows++){result+="\n";
for(cols=0;cols<n;cols++) result+="\t"+elems[n*rows+cols];}
return result;
}
var normleft="",normright="",bgclr="",isize="bfjnrv";
if (typ=="det") {normleft="$bdot:w1H100$";normright="$bdot:w1H100$";bgclr="w1K0";}
else if ((typ=="paren")||(typ=="brace")||(typ=="bracket")) {
if (m<7) normleft ="$"+typ+"leftz" +isize.charAt(m-1)+"$";
else normleft ="$"+typ+ "leftzw:h"+(20*m)+"$";
if (m<7) normright="$"+typ+"rightz"+isize.charAt(m-1)+"$";
else normright="$"+typ+"rightzw:h"+(20*m)+"$";
}
else if ((typ=="norm")||(typ=="vert")) {
if (m<7) normleft="$"+typ+"z"+isize.charAt(m-1)+"$";
else normleft="$"+typ+"zw:h"+(20*m)+"$";
normright=normleft;
}
else {normleft="$"+typ+"$";
if (typ.indexOf("left")>0) {normright="$"+typ.replace(/left/,"right")+"$";}
else normright="$"+typ+"$";
}
for(rows=0;rows<m;rows++){
result += "<tr>";
if ((rows==0)&&(typ)) result += "<td=m"+bgclr+"R"+m+">"+normleft+"</td>";
for(cols=0;cols<n;cols++) result+="<td=cmn><nobr>&nbsp;"+elems[cur_elem++] +"&nbsp;</nobr></td>";
if ((rows==0)&&(typ)) result += "<td=m"+bgclr+"R"+m+">"+normright+"</td>";
result += "</tr>";
}
result ="$space:h1w1$<itable>"+result+"</itable>$space:h1w1$";
return(result);
}
function showlist(s,delim,delim2,eval) {
if (! delim) delim=", ";
var ar=this.ZZSUj(s,eval);
if (!ar||!(ar.length>0)) return "";
if (delim2) {
var result=""+ar[0];
for(var i=1;i<ar.length-1;i++) result+=delim+""+ar[i];
result+=delim2+""+ar[ar.length-1];
return result;
} else return ar.join(delim);
}
function factorsof(N,delm,delm2) {
if (delm2) return this.showlist(this.ZZhwc(N),', '+delm,delm2);
else if (delm) return this.showlist(this.ZZhwc(N),', '+delm);
else return this.showlist(this.ZZhwc(N));
}
function dpfactors(N,delm,expo,delm2) {
var delimiter="&nbsp;&bull;&nbsp;";
var useExp=false;
if ((expo)&&((expo=='E')||(expo=='e'))) {useExp=true;expo="";}
else if ((delm)&&((delm=='E')||(delm=='e'))) {useExp=true;delm=expo;expo="";}
else if ((delm2)&&((delm2=='E')||(delm2=='e'))) {useExp=true;delm2=expo;expo="";}
if (expo) delm2=expo;
if (delm) delimiter=delm;
var testN=Math.abs(this.ZZPpc(N));
if ((testN<2)||(!isFinite(testN))) return "";
if (useExp) {
var freqlist=this.ZZstN(this.ZZqpD(testN));
var factors=new Array(freqlist.length/2);
for (var i=0;i<freqlist.length/2;i++) {
factors[i]=""+freqlist[2*i];
if (freqlist[2*i+1]>1) factors[i]+="<sup>"+freqlist[2*i+1]+"</sup>"
}
return this.showlist(factors,delimiter,delm2);
}
else return this.showlist(this.ZZqpD(testN),delimiter,delm2);
}
function dphase(u,v,opts) {
if (arguments.length<=1) return this.dphaser(u);
else if (arguments.length==2) opts='deg';
else opts+='';
var opt=opts.toLowerCase();
var w=[u-0,v-0];var i=0;
if (opt.indexOf('rec')>=0) {
w=this.rec2pol(w[0],w[1]);
w[1]=this.rad2deg(w[1]);
if (! isNaN(w[0]-w[1])) {u=w[0];v=w[1];}
} else if (opt.indexOf('pol')>=0) {
w[1]=this.rad2deg(w[1]);
if (! isNaN(w[1]-0)) v=w[1];
}
if (! isNaN(v-0)) {v=v%360;if (v>=180) v-=360;else if (v<-180) v+=360;}
opts=","+opts.replace(/R\.(\d+)/g,'R$1').replace(/R\*\.?(\d+)/g,'R-$1')+",";
if (opts.search(/,z?R-?\d+,/)>=0) {
i=opts.replace(/.*z?R(-?\d+).*/,'$1')-0;
if (! isNaN(u-v)) {u=this.ZZCJI(u,i);v=this.ZZCJI(v,i);}
}
if (opts.search(/,xR-?\d+,/)>=0) {
i=opts.replace(/.*xR(-?\d+).*/,'$1')-0;
if (! isNaN(u)) u=this.ZZCJI(u,i);
}
if (opts.search(/,yR-?\d+,/)>=0) {
i=opts.replace(/.*yR(-?\d+).*/,'$1')-0;
if (! isNaN(v)) v=this.ZZCJI(v,i);
}
if ((opts.search(/,xB/)>=0)&&((u+'').indexOf('<box')<0)) {
opt=opts.replace(/.*,xB([^,]*),.*/,"$1");if (opt) opt="="+opt;
u='<box>'+u+'</box>';
}
if ((opts.search(/,yB/)>=0)&&((v+'').indexOf('<box')<0)) {
opt=opts.replace(/.*,yB([^,]*),.*/,"$1");if (opt) opt="="+opt;
v='<box>'+v+'</box>';
}
if (opts.search(/,z?B/)>=0) {
opt=opts.replace(/.*,z?B([^,]*),.*/,"$1");if (opt) opt="="+opt;
if ((u+'').indexOf('<box')<0) u='<box'+opt+'>'+u+'</box>';
if ((v+'').indexOf('<box')<0) v='<box'+opt+'>'+v+'</box>';
} 
var result=u+' '+this.dphaser(v+"$degree$");
return result;
}
function dphaser(str) {
return "<itable=A0p0P0><tr><td=b>$phaser$</td><td>"+
str+"</td></tr><tr><td=K0h1C2></td></tr></itable>";
}
function init(baseurl) {
window.BeRn=window;
window.getBernEngine=function() {return BeRn;};
var Bern=getBernEngine();
Bern.canLoad=false;
if(baseurl) Bern.ccvURL=baseurl;
else {
Bern.ccvURL=window.document.location.href+"";
Bern.ccvURL=Bern.ccvURL.replace(/\/(cdviewer|viewer)\/[^\/]*$/,"/$1/");
}
Bern.topURL=Bern.ccvURL.replace(/[^\/]*\/$/,"");
Bern.win=window;
Bern.ZZWBe=0;
Bern.browser=ZZhaa();
Bern.waitID=null;
Bern.qwidth=580;
Bern.ZZorj=new Object();
Bern.ZZDBx=new Object();
Bern.canLoad=true;
Bern.initBernConstants(Bern);
var zzttzz=new Image();zzttzz.src="chars/radtop.gif";
Bern.MZbrowser=Bern.browser.M && ( Bern.browser.F || Bern.browser.N );
}
function ZZkai(program) {
eval(program);
}
function addQTemplate(Qobj) {
if (typeof getBernEngine=="function") getBernEngine().ZZovT(Qobj);
}
function Question(_tid, _base, _seed, _response, _tolopt){
this.tid=_tid;   
this.base=_base;  
this.seed=_seed;  
this.response=_response;
this.tolopt=_tolopt;    
this.qid="";   
this.win=window;  
this.bern=null;   
this.wcount=0;
this.getBern = function () {
this.wcount++;
var nocycle=0;while (! this.bern) {
if (typeof this.win.getBernEngine=="function") 
this.bern=this.win.getBernEngine();
else if ((++nocycle>6)||(this.win==this.win.parent)) break;
else this.win=window.parent;
}
return this.bern;
}
if (this.getBern()) {
this.qid=this.bern.ZZnnn(this.tid,this.base,this.seed,this.response,this.tolopt);
}
this.isReady = function () {
if (this.qid) {this.seed=this.bern.ZZDBx[this.qid].seed;return this.bern.ZZOgi(this.qid);} 
if (!this.bern) {this.getBern();}
if (this.bern) this.qid=this.bern.ZZnnn(
this.tid,this.base,this.seed,this.response,this.tolopt);
else if (this.wcount>50) {
alert("Initialization Incomplete !!");return null;
}
return false;
}
var XY=function (t) {if (t==111) alert("Start Function "+t);}
this.renderQuestion = function(m)   {XY(1);if(this.qid) return this.bern.ZZujQ(this.qid,m);} 
this.renderShowme  = function(m)   {XY(2);if(this.qid) return this.bern.ZZPQC(this.qid,m);}
this.renderYourturn = function(m,n) {XY(3);if(this.qid) return this.bern.ZZSXM(this.qid,m,n);}
this.renderHint  = function(s)   {XY(4);if(this.qid) return this.bern.ZZ_zd(this.qid,s);} 
this.answerReady  = function(d)   {XY(5);if(this.qid) return this.bern.ZZWCl(this.qid,d);} 
this.getAnswer   = function(d)   {XY(6);if(this.qid) return this.bern.ZZQdm(this.qid,d);} 
this.getAnswerType = function()    {XY(7);if(this.qid) return this.bern.ZZ_wu(this.qid);}
this.getDisplay  = function()    {XY(8);if(this.qid) return this.bern.ZZZoV(this.qid);}
this.getPreview  = function(m)   {XY(9);if(this.qid) return this.bern._renderPreview(this.qid,m);}
this.getAllAnswers  = function()    {XY(10);if(this.qid) return this.bern._getAllAnswers(this.qid);}
this.getInfo   = function()    {XY(11);if(this.qid) return this.bern._getInfo(this.qid);}
this.printQuestion  = function(f)   {XY(12);if(this.qid) return this.bern._printQuestion(this.qid,f);}
this.renderWQuestion = function()   {XY(1);if(this.qid) return this.bern._renderWQuestion(this.qid);}
this.getSeed        =function () {XY(19);if(this.qid) return this.bern.ZZDBx[this.qid].seed;}
this.getFullAnswer  = function()    {XY(12);if(this.qid) return this.bern._getFullAnswer(this.qid);} 
this.getAnswerText = function(f)   {XY(13);if(this.qid) return this.bern._getAnswerHTML(this.qid,f);}
this.getSolutionText= function(f)   {XY(14);if(this.qid) return this.bern._getSolutionHTML(this.qid,f);}
this.getType   = function()    {XY(15);if(this.qid) return this.bern.ZZaIV(this.qid);}
this.getLAnswer  = function()    {XY(16);if(this.qid) return this.bern._getLAnswer(this.qid);}
this.getLDisplay = function()    {XY(17);if(this.qid) return this.bern._getLDisplay(this.qid);}
this.getFeedback = function()    {XY(18);if(this.qid) return this.bern._getFeedback(this.qid);}
this.getFollowup = function()    {XY(18);if(this.qid) return this.bern._getFollowup(this.qid);}
}
function initBernConstants(Bern) {
Bern.copyright="function () {return '2006 © Link-Systems International, Inc.';}";
Bern.ZZwCJ=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 
53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
var ar=new Array(17);ar[0]=1;for(var i=1;i<17;i++) ar[i]=i*ar[i-1];
Bern.ZZZrv=ar;
ar=new Array(17);ar[0]=[1];ar[1]=[1,1];
for(var i=2;i<17;i++) {ar[i]=new Array(i+1);ar[i][0]=1;ar[i][i]=1;
for(var j=1;j<i;j++) ar[i][j]=ar[i-1][j-1]+ar[i-1][j];}
Bern.binomialArray=ar;
Bern.MACHEP =  1.11022302462515654042E-16;
Bern.MAXLOG =  7.09782712893383996732E2;
Bern.MINLOG = -7.45133219101941207625E2;
Bern.MAXGAM =171.62437695630272500000;
Bern.EUGAMMA=  5.77215664901532860607E-1;
Bern.INVHLF =  4.50359962737049600000E15;
Bern.EPSHLF =  2.22044604925031308085E-16;
Bern.PI     =  3.14159265358979323846;
Bern.SQTPI  =  2.50662827463100050242;
Bern.LOGPI  =  1.14472988584940017414;
Bern.LN2    =  6.93147180559945309417E-1;
Bern.LOG2E  =  1.44269504088896340736;
Bern.E      =  2.71828182845904523536;
Bern.EXP2INV=  0.13533528323661269189;
Bern.LN10   =  2.30258509299404568402;
Bern.LOG10E =  4.34294481903251827651E-1;
Bern.NaN    =  Math.sqrt(-1);
Bern.mpcs ={calculus:[179,247,247],chemistry:[175,179,179],algebra:[145,247,247],
engcircuits:[0,145,145],engdynamics:[0,247,247],statistics:[0,213,213]};
Bern.ctol="1e-6";
Bern.tagREn=/^(T?[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?%?|[RF](\.?\d+)?)$/;
Bern.tagREs=/^[ScwnalubCWNALUB]*$/;
Bern.nolabeltest="|yes|no|true|false|correct|incorrect|";
Bern.nocmode=false;
Bern.Units=this.initUnitsConvert();
Bern.ZZorj.dummyL=new Object();
Bern.dummyT={0:["S",""],1:["S","dummy"],at:"N",tol:"+1E-4",nv:2,qt:"",
wo:"<step></step>",ans:["<ans>V[1]</ans>"],hi:"",ilev:0,loc:"dummyL"};
Bern.addQTemplate(Bern.dummyT);
Bern.dummyQO=new Question("dummyL",'',0,'','');
Bern.dummyQID=dummyQO.qid;
Bern.dummyQ=Bern.ZZDBx[Bern.dummyQID];
}                   
function ZZhaa() {
var b=new Object();
var nua=window.navigator.userAgent.toLowerCase();
b.W=false;b.M=false;b.U=true;b.OS="U";b.OSV="";
if (nua.indexOf("win")>=0)     {
b.W=true ;b.M=false;b.U=false;b.OS="W";
if (nua.indexOf("windows nt 5.1")>0) b.OSV='XP';
else if (nua.indexOf("windows nt 5.0")>0) b.OSV='2000';
else if (nua.indexOf("windows 98")>0) b.OSV='98';
else if (nua.indexOf("windows me")>0) b.OSV='ME';
}
else if (nua.indexOf("mac")>=0) {b.W=false;b.M=true ;b.U=false;b.OS="M";}
b.X=false;b.S=false; b.N=false;b.I=false;b.F=false;b.B="U";
if (nua.indexOf("opera")>0) {
b.X=true;b.B="O";b.V=0;
} else if (nua.indexOf("safari")>0)   {
b.S=true;b.B="S";b.V=nua.replace(/.*\/([0-9.]+).*/,"$1");
} else if (nua.indexOf("netscape")>=0) {
b.N=true;b.B="N";b.V=nua.replace(/.*\/([0-9.]+).*/,"$1");
} else if (nua.indexOf("msie")>=0) {
b.I=true;b.B="I";b.V=nua.replace(/.*msie *([0-9.]+).*/,"$1");
} else if (nua.indexOf("firefox")>=0) {
b.F=true;b.B="F";b.V=nua.replace(/.*\/([0-9.]+).*/,"$1");
}
b.v=parseFloat(b.V);
return b;
} 
function UIObj(txt,oid,tag) {
var i,j,k,bdata,chind;
this.oid=oid;
this.cmp="";
this.res="";
this.dca="";
this.dua="";
this.tag="";
if ((tag===0)||(tag)) this.tag=(tag+"").replace(/[^a-zA-Z0-9\.\%\*\+\-]+/g,'');
this.ungraded=(tag.indexOf('U')>=0);
if ((txt.indexOf(':')>=0)&&(txt.indexOf('::')<0)) txt=txt.replace(/:/g,"::");
if (txt.indexOf('</')>=0) txt=txt.replace(/<\/?[a-zA-Z][^<>:]*>/g,'');
if (txt.indexOf("::")>=0) {
this.typ="D";var ordered=false;
if ((this.tag+"").indexOf('O')>=0) ordered=true;
if (ordered) {
this.cmp=parseFloat(txt)-1;
txt=txt.replace(/^\d+::/,"");
}
bdata=txt.split("::");
k=bdata.length;
if (ordered) {
chind=new Array(k);
for(i=0;i<k;i++) chind[i]=i;
} else {
chind=BeRn.rndperm(k);
this.cmp=chind[0];
}
this.dat=new Array(k);
for(j=0;j<k;j++) {
this.dat[chind[j]]=bdata[j].
replace(/-/g,'&minus;').
replace(/</g,'&lt;').
replace(/\$/g,'&#34;').
replace(/@/g,'&#64;').
replace(/>/g,'&gt;');
} 
this.dca=this.dat[this.cmp];
} else {
this.typ="B";
this.cmp=txt.replace(/^\s+/,'').replace(/\s+$/,'').replace(/@/g,'&#64;');
this.dca=this.cmp;
if (this.tag==="") {
if (isFinite(this.cmp)) this.tag="R";else this.tag="S";
}
}
this.res="";
this.dua="";
this.grade=-3;
this.evalAnswer=function () {
if (this.ungraded) this.grade=-10;
else if (this.typ=="D") {
if (this.res==="") {
this.dua="None Given";
this.grade=-2;
} else {
this.dua=this.dat[this.res];
this.grade=(this.res==this.cmp)?1:0;
}
} else {
if (this.res==="") {
this.dua="None Given";
this.grade=-1;
} else {
this.dua=this.res;
var gra=BeRn.QSAcomp(this.cmp,this.res,this.tag);
this.grade=(gra)?1:0;
} 
}
}
this.getResponse=function(doc) {
if (typeof doc=="object") {
this.res=BeRn.getresponse(doc,this.oid);
} 
else if (arguments.length==1) this.res=doc;
return this.res;
}
this.getGrade=function(doc) {
if (arguments.length==1) this.getResponse(doc);
this.evalAnswer();
return [this.grade,this.res,this.dua];
} 
this.getAnswer=function(doc) {
if (typeof doc=="object") this.res=BeRn.getresponse(doc,this.oid);
this.evalAnswer();
return [this.grade,this.dua];
}
this.render=function (dmode,amode,color) {
var result="";var astr="";
if (amode==0) astr="";
else if (amode==1) astr=this.cmp;
else if (amode==2) astr=this.res;
if (this.typ=="D") result=
mkdropdown(this.oid,this.dat,astr,dmode,color);
else result=
mkinputbox(this.oid,astr,dmode,95,color);
return result;
}
}
function mkinputbox(qunid,val,dmode,width,color) {
val+="";
if (!color) color="";
else color="color:"+color+";";
if (!(width-0>30)) width=95;
var result="";
if (dmode==2) {
val=(val+"").
replace(/-/g,'&minus;').
replace(/</g,'&lt;').
replace(/\$/g,'&#34;').
replace(/>/g,'&gt;');
if (! color) result='<span style="white-space:nowrap;">'+val+'</span>';
else result='<span style="white-space:nowrap;'+color+'">'+val+'</span>';
return result;
} 
result='<input type="text" name="'+qunid+'" id="'+qunid+'"'+
' size=10 style="background:#FFFFFF;color:#000000;width:'+width+';'+color+'" value="'+
val+((dmode==1)?'" disabled>':'">');
return result+"<!--InpBox-->";
}
function mkareabox(qunid,escval,dmode,rows,cols,color) {
rows=Math.round(rows);
cols=Math.round(cols);
if (!color) color="#000000";
if (!(cols>30)) cols=45;
if (!(rows>=0)) rows=7;
var val="",result="";
if (dmode==2) val=this.esc2htm(escval+"");
else val=this.esc2box(escval+"");
if (dmode==2) {
if (rows>0) {
result='<table width="'+Math.round(cols*6.5+4)+'"><tr>'+
'<td style="color:'+color+'"><pre>'+
val+'</pre></td></tr></table>';
} else {
result='<span style="color:'+color+';"><pre>'+val+'</pre></span>';
} 
} 
else if (rows==0) {
result='<input type="text" name="'+qunid+'" id="'+qunid+'"'+
' size="'+cols+'" style="background:#FFFFFF;color:'+color+
';" value="'+val+((dmode==1)?'" disabled>':'">');
} else {
result='<'+'textarea align=top name="'+qunid+'" id="'+qunid+'"'+
'style="background:#FFFFFF;color:'+color+';" '+
'rows="'+rows+'" cols="'+cols+'" '+
((dmode==1)?'" disabled>':'>')+
val+'<'+'/textarea>';
}
return result;
}
function mkdropdown(qunid,charr,selch,dmode,color) {
var numch=charr.length;
var result="",i,chlen=8,ddinit="(select)";
if (isNaN(selch)&&(selch)) {ddinit=""+selch;selch=-1;}
else if ((selch===0)||(selch==="0")||(selch-0>0)) selch-=0;
else {selch=-1;}
if (!color) color="";
else color="color:"+color+";";
var dd_="_____________________________________________";
for(i=0;i<numch;i++) chlen=Math.max(chlen,charr[i].length);
if (dmode==2) {
if ((selch>=0)&&(selch<numch)) {
if (! color) result='<span style="white-space:nowrap;">'+charr[selch]+'</span>';
else result='<span style="white-space:nowrap;'+color+'">'+charr[selch]+'</span>';
} else {
result='<span style="font-family:monospace;">'
+dd_.substring(0,chlen)+'</span>';
}
return result;
}
result='<select style="font-family:monospace;background:#FFFFFF;color:#000000;"'+
' name="'+qunid+'" id="'+qunid+'"';
if (dmode==1) result+=" disabled>\n";else result+=">\n";
if (selch<0)  result+='<option value="" selected>'+ddinit+'\n';
for(i=0;i<numch;i++) result+='<option value="'+i+'"'+
((i==selch)?' selected>':'>')+charr[i]+'\n';
result+='</select>';
return result;
} 
function mkchtable(qunid,charr,numcl,selch,dmode,noletters) {
var result="",i=0,txt="",iutxt="";
var twidth=578,tcellp=10;
var numch=charr.length;
var addbr="";
for (i=0;i<numch;i++) {
txt=charr[i].toLowerCase();
if ((txt.lastIndexOf('<tr>')>30)||(txt.indexOf('<br>')>=0)) {
addbr="<tr><td>&nbsp;</td></tr>";
break;
}
}
var radio=true;if (numcl<0) {radio=false;numcl*=-1;}
if ((typeof selch=="undefined")||(selch-0<0)||(selch+""==="")) selch="";
else selch+=","+selch+","; 
var basech="",basech0="",iotxt="",iotxt0="";
if (radio) {
iotxt='<input type="radio" name="'+qunid+'" id="'+qunid+'-X" value="X">';
if (dmode<2) {
iotxt0='<input type="radio" name="'+qunid+'" id="'+
qunid+'-X" value="" style="display:none"';
if (!selch) iotxt0+=' checked>';else iotxt0+='>';
} 
} else {
iotxt='<input type="checkbox" name="'+qunid+'-X" id="'+qunid+'-X" value="X">';
} 
if ((noletters)&&(dmode<2)) basech=
'<td valign="middle" width=30>&nbsp;</td>'+
'<td valign="middle"><%CH%>&nbsp;</td>'+
'<td valign="middle"><%CHTXT%></td>';
else if (noletters) basech=
'<td valign="middle" width=30>&nbsp;</td>'+
'<td valign="middle"><%CHTXT%></td>';
else if (dmode==2) basech=
'<td valign="middle" width=30>&nbsp;</td>'+
'<td valign="middle"><b><%CHL%>.</b>&nbsp;</td>'+
'<td valign="middle"><%CHTXT%></td>';
else basech=
'<td valign="middle" width=30>&nbsp;</td>'+
'<td valign="middle"><%CH%></td>'+
'<td valign="middle"><b><%CHL%>.</b>&nbsp;</td>'+
'<td valign="middle"><%CHTXT%></td>';
basech0=this.Replace(basech,'&nbsp;','&nbsp;'+iotxt0,1);
var dlm=[
'<table cellpadding='+tcellp+' cellspacing=0 border=0 width='+twidth+
'><tr><td align="left">'+'<table><tr>',
'<td valign="middle" width=30>&nbsp;<\/td>','<\/tr>'+addbr+'<tr>'];
for(var i=0;i<numch;i++) {
if (i==0) result+=dlm[0]+"\n";
else if ((i%numcl)==0) result+=dlm[2]+"\n";
else result+=dlm[1]+"\n";
iutxt=iotxt.replace(/X/g,i+"");
if (selch.indexOf(','+i+",")>=0) iutxt=iutxt.replace(/>/,' checked>');
if (dmode==1) iutxt=iutxt.replace(/>/,' disabled>');
txt=(i==0)?basech0:basech;
txt=this.Replace(txt,'<%CHL%>',String.fromCharCode(65+i),1);
txt=this.Replace(txt,'<%CH%>',iutxt,1);
txt=this.Replace(txt,'<%CHTXT%>',
'<!--BCH'+i+'-->'+charr[i]+'<!--ECH'+i+'-->',1);
result+=txt+"\n";
}
result+='<\/tr></table></td></tr></table>';
return result;
}
function getresponse(doc,iuo_id,unicode) {
var result="";var uelem;
if (!((doc)&&(doc.getElementById)))return "";
uelem=doc.getElementById(iuo_id+"-0");
if (uelem) {
result=new Array();
for(var i=0;i<20;i++) {
uelem=doc.getElementById(iuo_id+"-"+i);
if (! uelem) break;
if (uelem.checked) result[result.length]=uelem.value;
}
return result.sort(this.sortOnNumPosition)+"";
} else {
uelem=doc.getElementById(iuo_id);
if (! uelem) return "";
result=doc.getElementById(iuo_id).value;
if (typeof result=="undefined") return "";
if (! unicode) result=this.binesc(""+result,true);
return result;
}
}
function QSScomp(v,s,opt) {
v+="";s+=""; 
v=v.replace(/&minus;/g,"-").replace(/&nbsp;/g," ").replace(/\^/g,"__");
s=s.replace(/&minus;/g,"-").replace(/&nbsp;/g," ").replace(/\^/g,"__");
if ((!opt)||(opt=="S")) {
v=v.toLowerCase().replace(/^\s+|\s+$/g,'');
s=s.toLowerCase().replace(/^\s+|\s+$/g,'');
if (s.search(/\d,\d\d\d/)>=0) s=cmmrm(s);
if (v.search(/\d,\d\d\d/)>=0) v=cmmrm(v);
v=v.replace(/(\.[0-9]*[1-9])0+([^1-9])/g,"$1$2").
replace(/\.0+([^1-9])/g,"$1").
replace(/([^0-9.])0+([1-9])/g,"$1$2");
s=s.replace(/(\.[0-9]*[1-9])0+([^1-9])/g,"$1$2").
replace(/\.0+([^1-9])/g,"$1").
replace(/([^0-9.])0+([1-9])/g,"$1$2");
v=v.replace(/\s+/g,"");
s=s.replace(/\s+/g,"");
return (v==s);
} else opt+="";
if (opt.indexOf("c")<0) {
v=v.toLowerCase();
s=s.toLowerCase();
}
if ((opt.indexOf("l")<0)&&(opt.indexOf("a")<0)&&(s.search(/\d,\d\d\d/)>=0)) {
s=cmmrm(s);v=cmmrm(v);
}
if (opt.indexOf("n")>=0) {
v=" "+v+" ";s=" "+s+" ";
v=v.replace(/(\.[0-9]*[1-9])0+([^1-9])/g,"$1$2").
replace(/\.0+([^1-9])/g,"$1").
replace(/([^0-9.])0+([1-9])/g,"$1$2");
s=s.replace(/(\.[0-9]*[1-9])0+([^1-9])/g,"$1$2").
replace(/\.0+([^1-9])/g,"$1").
replace(/([^0-9.])0+([1-9])/g,"$1$2");
}
if (opt.indexOf("a")>=0) {
v=v.replace(/[^a-zA-Z0-9-]+/g,"");
s=s.replace(/[^a-zA-Z0-9-]+/g,"");
} 
else if (opt.indexOf("w")<0) {
v=v.replace(/\s+/g,"");
s=s.replace(/\s+/g,"");
} else {
v=v.replace(/^\s+|\s+$/g,'');
s=s.replace(/^\s+|\s+$/g,'');
}
if (opt.indexOf("b")>=0) {
v=","+v+",";s=","+s+",";
v=v.replace(/[^a-z_A-Z0-9<>+-]*[,;\"\"\'\'\|:][^a-z_A-Z0-9<>+-]*/g,',').
replace(/^,*/,'').replace(/,*$/,'').replace(/\s+/,' ');
s=s.replace(/[^a-z_A-Z0-9+-]*[,;\"\"\'\'\|:][^a-z_A-Z0-9+-]*/g,',').
replace(/^,*/,'').replace(/,*$/,'').replace(/\s+/,' ');
v=v.split(',').sort().join(",");
s=s.split(',').sort().join(",");
} else if (opt.indexOf("u")>=0) {
v=v.split("").sort().join(",");
s=s.split("").sort().join(",");
} 
return (v==s);
} 
function QSAcomp(v,s,tag) {
if ((tag!==0)&&(!tag)) tag="";else tag+="";
if (tag.indexOf("S")==0) return QSScomp(v,s,tag);
if (tag.indexOf("F")==0) {
tag="T2%";
}
if (isNaN(v)) {
v=(v+"").replace(/ *([+-]) */g,'$1');
v=this.cmmrm(v);
if (isNaN(v)) return false;
v=v.replace(/^ *| *$/g,'');
}
if (tag.indexOf("X")>=0) {
if (isNaN(s)) {
s=(""+s).replace(/[^0-9]\.[^0-9]/g,"").
replace(/- */g,"-").
replace(/-[^0-9.]/g,"").
replace(/^[^0-9.\-]*/,"");
s=parseFloat(s);
} 
tag=tag.replace(/X/g,'');
}
if (isNaN(s)) {
s=(s+"").replace(/ *([+-]) */g,'$1');
s=this.cmmrm(s);
if (isNaN(s)) return false;
s=s.replace(/^ *| *$/g,'');
}
if (tag=="N") tag=this.ctol;
if (tag=="R"||(tag==="")) return (v-0)==(s-0);
if (tag.indexOf("R")==0) {
v=this.ZZCJI(v,tag);
s=this.ZZCJI(s,tag);
return (v-0)==(s-0);
} 
if (tag.indexOf('T')==0) tag=tag.substring(1);
if (tag.indexOf('%')>0) tag=parseFloat(tag)*(-0.01);
if (isNaN(tag)) return (v-0)==(s-0);
else if (tag-0>=0) return (Math.abs(v-s)<=(tag-0));
else return (Math.abs(v-s)<=(0-tag)*(Math.abs(v)+1e-14));
}
function test(tag,v,s) {
var correct=true;
var tc=1,ctag="",tval,cval,tcorr,tcp;
if (arguments.length%2) ctag=tag;else tc=0;
while(tc<arguments.length) {
tval=arguments[tc];
cval=arguments[tc+1];
tc+=2;tcorr=false;
if ((typeof cval != 'object')&&(typeof tval != 'object')) {
tcorr=this.QSAcomp(cval,tval,ctag);
} else if ((typeof cval == 'object')&&(typeof tval != 'object')) {
for(tcp in cval) {
tcorr=tcorr || this.QSAcomp(cval[tcp],tval,ctag);
if (tcorr) break;
}
} else if ((typeof tval == 'object')&&(typeof cval != 'object')) {
for(tcp in tval) {
tcorr=tcorr || this.QSAcomp(cval,tval[tcp],ctag);
if (tcorr) break;
}
} else if ((cval.length>0)&&(cval.length==tval.length)) {
tcorr=true;
for(tcp=0;tcp<cval.length;tcp++) {
tcorr=tcorr && this.QSAcomp(cval[tcp],tval[tcp],ctag);
if (! tcorr) break;
}
}
correct=tcorr;
if (! correct) break;
}
return correct;
}
function cdfrac(num,den,old) {
var num = new String(num);
var den = new String(den);
num = num.replace(/(\$\.*\w\w*):(\w*\$)/g,"$1^^$2");
num = num.replace(/:/g," ").replace(/\^\^/g,":");//removes ":"
den = den.replace(/(\$\.*\w\w*):(\w*\$)/g,"$1^^$2"); 
den = den.replace(/:/g," ").replace(/\^\^/g,":");
return dfrac('',num,den);
}
function oldmkfrac(_whole,_num,_den,_howeval,_returnwhat,_wherebox,_small) {
if (arguments.length==3) {
_howeval='none';
_returnwhat='mixed1';
_wherebox='nobox';
_small=false;
}
var whole="",num=0,den=0;
var small=false;
if ((typeof _small=="boolean")&&(_small)) small=true;
else {
_small+='';
if ((_small.toLowerCase()=='small')||(_small.toLowerCase()=='true')) small=true;
}
var wherebox='nobox';
if (typeof _wherebox=="string") {
_wherebox=_wherebox.toLowerCase();
if ((_wherebox=='den')||(_wherebox=='num')||(_wherebox=='whole')) wherebox=_wherebox;
}
var returnwhat='mixed';
if (typeof _returnwhat=="string") {
_returnwhat=_returnwhat.toLowerCase();
switch (_returnwhat) {
case 'mixed':case 'mixed1':
case 'improper':case 'improper1':
case 'mwhole':case 'den':
case 'mnum':case 'inum':
returnwhat=_returnwhat;break;
default:break; 
}
}
var dosimplify=false;
if ((typeof _howeval=="string")&&(_howeval.toLowerCase()=="simplify")) dosimplify=true;
if (!_whole || (_whole=='0')) whole = 0;else whole=_whole;
if (!_num) num = 0;else num=_num;
if (!_den) den = 0;else den=_den;
var ntype=2;
_num   = num  -0;if (_num   != Math.round(_num  )) {_num  =NaN;dosimplify=false;ntype=0}
_den   = den  -0;if (_den   != Math.round(_den  )) {_den  =NaN;dosimplify=false;ntype=0}
_whole = whole-0;if (_whole != Math.round(_whole)) {_whole=0;ntype/=2;}
if ((_whole)&&(_num>=0)&&(_den>0)) {
_num=_whole*_den+((_whole<0)?(-_num):_num);
_whole=0;num=_num;whole=_whole;
}
if (dosimplify||((ntype==2)&&((returnwhat=="improper")||(returnwhat=="improper1")||
(returnwhat=="inum")))) {
if (_den==0) return "Invalid fraction: 0 in denominator.";
if (_den<0)  {num = 0-_num;den = 0-_den;}
else {num = _num;den = _den;}
if ((ntype==2)&&(_whole>=0)) num = _whole*den + num;
else if (ntype==2) num = _whole*den - num;
if (dosimplify) {
_whole=num/this.gcd(num,den);
den=den/this.gcd(num,den);
num=_whole;
}
_whole=0;
}
if ((ntype>0)&&(returnwhat=="mixed" || returnwhat=="mixed1" || returnwhat=="mnum")) {
whole = _whole+parseInt(num/den);
if(isNaN(whole)) whole=0;
if (whole!=0) {num = Math.abs(num) - Math.abs(whole*den);den=Math.abs(den);}
}
if (wherebox!='nobox') {
if (wherebox=='whole') whole="<box>"+whole+"</box>";
else if (wherebox=='num') num="<box>"+num+"</box>";
else if (wherebox=='den') den="<box>"+den+"</box>";
}
switch (returnwhat) {
case 'mnum':case 'inum':return num;break;
case 'mwhole':return whole;break;
case 'den':return den;break;
case 'improper':
if (den==1) return "<nobr>"+num+"</nobr>";
if (num<0) {whole='-';num=-num;}
if (small) return dfrac(whole,num,den,"f1");
else return dfrac(whole,num,den);
break;  
case 'mixed':
if (num==0) return "<nobr>"+whole+"</nobr>";
if (num<0) {whole='-';num=-num;}
if (small) return dfrac(whole,num,den,"f1");
else return dfrac(whole,num,den);
break;  
case 'improper1':case 'mixed1':
if (small) return dfrac(whole,num,den,"f1");
else return dfrac(whole,num,den);
break;  
}
}
function mfrac(whole,num,den) {
whole+="";num+="";den+="";
if (num=="0") return whole;
else if (whole=="0") return this.dfrac('',num,den);
else return this.dfrac(whole,num,den);
}
function mfracstar(pw,pn,pd) {
var whole,num,den,reduce,twhole,tnum,tden,peval;
if (pw=="-") {pw=0;pn="-"+pn;}
whole=this.ZZVtv(""+pw);
num=this.ZZVtv(""+pn);
den=this.ZZVtv(""+pd);
if (den==0) return "Not a Number";
if( (den)&&(num)&& (isFinite(whole))) {
if(den<0)  {num=num*-1;den=den*-1;}
if(whole<0) num=num*-1;
twhole=parseInt(((whole*den)+num)/den);
if(isNaN(twhole)) twhole=0;
tnum=((whole*den)+num)-(twhole*den);
num=tnum;
tnum=num/(gcd(num,den));
tden=den/(gcd(num,den));
whole=twhole;
if(whole<0)num=Math.abs(tnum);
else num=tnum;
den=tden;
if((whole==0)&&(num<0)) {whole="-";num=num*-1;}
}
else {whole=""+pw;num=""+pn;den=""+pd;}
if (num-0==0) return ""+whole;
else if ((den==1)&&(whole==0)) return ""+num;
else if ((den==1)&&(isNaN(Number(whole))||isNaN(Number(num)))) return whole+" + "+num;
else if (den==1) return eval(whole+num);
else if(whole=="0") return this.dfrac('',num,den);
else return this.dfrac(whole,num,den);
} 
function dimproper(x,y,s) {
if (! ZZf_y(x-0,y-0)) return this.dfrac('',x,y);
else if (y<0) {x=0-x;y=0-y;}
else {x=x-0;y=y-0;}
var d=this.gcd(x,y);x/=d;y/=d;
if(!s) s = "r1";else s+="";
if (s.indexOf('<i>')>=0) s=s.replace(/<\/*i>/i,''); 
switch (s) {
case "n":return x;break;
case "d":return y;break;
case "f":return dfrac('',x,y);break;
default:
if (x==0) return 0;
else if (y==1) return x;
else if (x<0) return dfrac('-',-x,y);
else return dfrac('',x,y);
}
} 
function deqalign(n,s) {
var parts = new Array();parts = s.split(":");
var result="<itable=p1P0A0>";
for(var i=0;i<(n*4);i=i+4) {
result += "<tr><td=rmn>"+ parts[i]  +"</td>"+
"<td=cmn>&nbsp;"+ parts[i+1] +"&nbsp;</td>"+
"<td=lmn>"+ parts[i+2] +"</td>"+
"<td=lm>&nbsp;&nbsp;"+ parts[i+3] +"</td></tr>";
} 
result += "</itable>";
return result;
}
function dalignx(n,s,x) {
var parts = new Array();parts = s.split(",");
var result="<itable=p1P0A0>";
for(i=0;i<(2*n);i=i+2) {
result += "<tr>"+
"<td=rmn>"+parts[i] +"</td>"+
"<td=cmn>&nbsp;"+x+"&nbsp;</td>"+
"<td=lmn>"+ parts[i+1] +"</td>"+
"</tr>";
}
result += "</itable>";
return result;
}
function mixednum(w,n,d) {return (w*d+((w-0<0)?(0-n):(n-0)));}
function mixedval(w,n,d) {w=w-0;d=d-0;n=n-0;return (w+((w<0)?-n:n)/d);}
function cases(test1,results1) {
var total=Math.floor(arguments.length/2);
for(var i=0;i<total;i++) {
var ntest=arguments[2*i];
if (typeof ntest != "boolean") return NaN;
else if (ntest) return arguments[2*i+1];
}
if (2*total==arguments.length) return 0;
else return arguments[2*total];
}
function ZZqLf(low,high,step,exceptions) {
exceptions=this.ZZSUj(exceptions);
if (!this.ZZimA(exceptions)) exceptions=false;
low=this.ZZPpc(low);high=this.ZZPpc(high);
step=this.ZZPpc(step);if (!step) step=1;
step=(low<high)?Math.abs(step):-Math.abs(step);
var delta=Math.floor((high-low)/step)+1;
if ((delta<2)||!isFinite(delta)) return (this.ZZVzF(exceptions,low))?NaN:low;
for(var i=0;i<10000;i++) {
var test=low+Math.floor(this.random()*delta)*step;
if (!this.ZZVzF(exceptions,test)) return test;
}
return NaN;
}
function ZZIOc(low,high,step,exceptions,vtype) {
exceptions=this.ZZSUj(exceptions);
if (!this.ZZimA(exceptions)) exceptions=false;
low=this.ZZZtO(low);high=this.ZZZtO(high);
if (!isFinite(low+high)) return NaN;
step=this.ZZZtO(step);
if ((!step)&&(! exceptions)) return (low+this.random()*(high-low));
else if (! step) {
for(var nii=0;nii<10000;nii++) {
var test1=low+this.random()*(high-low);
var test2=this.ZZCJI(test1,vtype);
var test=parseFloat(test2);
if (!this.ZZVzF(exceptions,test,1e-12)) return test;
}
}
else {
step=(low<high)?Math.abs(step):-Math.abs(step);
var delta=Math.floor((high-low)/step)+1;
if (delta<2) return (this.ZZVzF(exceptions,low,1e-12))?NaN:low;
for(var i=0;i<10000;i++) {
var test=low+Math.floor(this.random()*delta)*step;
if (!this.ZZVzF(exceptions,test,1e-12)) return test;
}
} 
return NaN;
}
function randomlist(num,low,high,ndig,uniq) {
num-=0;var result=new Array(num);
if (arguments.length<3) {
if (arguments.length==1) {low=0;high=num;}
else  {high=low;low=num;}
for(num=low;num<high;num++) result[num-low]=num;
return result.join(', ');
} 
low=this.ZZZtO(low);high=this.ZZZtO(high);
if (!isFinite(low+high)) return NaN;
if (ZZf_y(ndig)) ndig=-ndig;
if ((! uniq)||(uniq=="false")||(uniq=="no")) uniq=false;
else uniq=true;
var found=true;var endloop=0;
num=ZZPpc(num);if (!ZZf_y(num)&&(num>0)) return NaN;
for(var i=0;i<num;i++) {found=false;endloop=0;
while ((! found)&&(endloop++<100)) {
var test=this.ZZCJI(low+this.random()*(high-low),ndig);
found=true;
if (uniq) for(var j=0;j<i;j++) if (result[j]==test) {
found=false;break;
}
}
result[i]=test;
}
return result.join(', ');
}
function gcd(p,q) {
if (arguments.length==2) {
if ((p==1)||(q==1)||!this.ZZf_y(p,q)) return 1;
if (p<0) p=-p;if (q<0) q=-q;
var r=Math.min(p,q);p=p+q-r;q=r;
if (r==0) return p+q;
while ((r=(p%q))>0) {p=q;q=r;}
return q;
} else if (arguments.length>2) {
var result=this.gcd(arguments[0],arguments[1]);
for(var i=2;i<arguments.length;i++) result=this.gcd(result,arguments[i]);
return result;
}
}
function lcm(p,q) {
if (arguments.length==2) return (p*q/this.gcd(p,q));
else if (arguments.length>2) {
var result=this.gcd(arguments[0],arguments[1]);
for(var i=2;i<arguments.length;i++) 
result*=arguments[i]/this.gcd(result,arguments[i]);
return result;
}
}
function min(dummy) {
for(var i=1;i<arguments.length;i++) 
if (!(dummy<=arguments[i])) 
dummy=arguments[i];
return dummy;
}
function max(dummy) {
for(var i=1;i<arguments.length;i++) 
if (!(dummy>=arguments[i])) dummy=arguments[i];
return dummy;
}
function root(b,a) {
if (Math.abs(a)<=1e-14) return (b>0)?0:NaN;
if (a>0) return Math.pow(a,1.0/b);
if (Math.abs((b%2)-1)<1e-8) return -Math.pow(-a,1.0/b);
return NaN;
}
function sin(x,y){if (arguments.length==1) return Math.sin(x);
else if (x==-1) return Math.asin(y);
else return this.powb(Math.sin(y),x);}
function cos(x,y){if (arguments.length==1) return Math.cos(x);
else if (x==-1) return Math.acos(y);
else return this.powb(Math.cos(y),x);}
function tan(x,y){if (arguments.length==1) return Math.tan(x);
else if (x==-1) return Math.atan(y);
else return this.powb(Math.tan(y),x);}
function cot(x,y){if (arguments.length==1) return 1/Math.tan(x);
else if (x==-1) return Math.atan(1/y);
else return this.powb(Math.tan(y),-x);}
function sec(x,y){if (arguments.length==1) return 1/Math.cos(x);
else if (x==-1) return Math.acos(1/y);
else return this.powb(Math.cos(y),-x);}
function csc(x,y){if (arguments.length==1) return 1/Math.sin(x);
else if (x==-1) return Math.asin(1/y);
else return this.powb(Math.sin(y),-x);}
function asin(x,y){if (arguments.length==1) return Math.asin(x);
else if (x==-1) return Math.sin(y);
else return this.powb(Math.asin(y),x);}
function acos(x,y){if (arguments.length==1) return Math.acos(x);
else if (x==-1) return Math.cos(y);
else return this.powb(Math.acos(y),x);}
function atan(x,y){if (arguments.length==1) return Math.atan(x);
else if (x==-1) return Math.tan(y);
else return this.powb(Math.atan(y),x);}
function acot(x,y) {if (arguments.length==1) return Math.atan(1/x);
else if (x==-1) return 1/Math.tan(y);
else return this.powb(Math.atan(1/y),x);}
function asec(x,y) {if (arguments.length==1) return Math.acos(1/x);
else if (x==-1) return 1/Math.cos(y);
else return this.powb(Math.acos(1/y),x);}
function acsc(x,y) {if (arguments.length==1) return Math.asin(1/x);
else if (x==-1) return 1/Math.sin(y);
else return this.powb(Math.asin(1/y),x);}
function sinh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(x);y=0.5*(y-1/y);
return (c==1)?(y):(c==-1)?asinh(x):this.powb(y,c);}
function cosh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(x);y=0.5*(y+1/y);
return (c==1)?(y):(c==-1)?acosh(x):this.powb(y,c);}
function tanh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(2*x);y=(y-1)/(y+1);
return (c==1)?(y):(c==-1)?this.atanh(x):this.powb(y,c);}
function sech(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(x);y=2/(y+1/y);
return (c==1)?(y):(c==-1)?this.acosh(1/x):this.powb(y,c);}
function csch(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(x);y=2/(y-1/y);
return (c==1)?(y):(c==-1)?this.asinh(1/x):this.powb(y,c);}
function coth(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.exp(2*x);y=(y+1)/(y-1);
return (c==1)?(y):(c==-1)?this.atanh(1/x):this.powb(y,c);}
function asinh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.log(x+Math.sqrt(x*x+1));
if (c==1) return y;else if (c==-1) return this.sinh(x);
else return this.powb(y,c);}
function acosh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=Math.log(x+Math.sqrt(x*x-1));
if (c==1) return y;else if (c==-1) return this.cosh(x);
else return this.powb(y,c);}
function atanh(c,x) {if (arguments.length==1) {x=c;c=1;}
var y=0.5*Math.log((1+x)/(1-x));
if (c==1) return y;else if (c==-1) return this.tanh(x);
else return this.powb(y,c);}
function acoth(x,y) {if (arguments.length==1) return this.atanh(1/x);
else if (x==-1) return this.coth(y);
else return this.powb(this.atanh(1/y),x);}
function asech(x,y) {if (arguments.length==1) return this.acosh(1/x);
else if (x==-1) return this.sech(y);
else return this.powb(this.acosh(1/y),x);}
function acsch(x,y) {if (arguments.length==1) return this.asinh(1/x);
else if (x==-1) return this.csch(y);
else return this.powb(this.asinh(1/y),x);}
function abs(x,y){if (arguments.length==1) return Math.abs(x);
else return Math.pow(Math.abs(y),x);}
function exp(x,y){if (arguments.length==1) return Math.exp(x);
else if (x==-1) return Math.log(y);
else return this.powb(Math.exp(arguments[1]),x);}
function ln(x,y) {if (arguments.length==1) return Math.log(x);
else if (x==-1) return Math.exp(y);
else return this.powb(Math.log(y),x);}
function logb(a,c,b) {
if (arguments.length==1) {b=a;a=10;c=1;}
else if (arguments.length==2) {b=c;c=1;}
else if (arguments.length==4) {a=b;b=arguments[3];}
if (c==1) return Math.log(b)/Math.log(a);
else if (c==-1) return Math.pow(a,b);
else return this.powb(Math.log(b)/Math.log(a),c);
}
function divd(a,b) {return (a)/(b);}
function sqrt(x){return Math.sqrt(x);}
function pow(x,y){return Math.pow(x,y);}
function powb(x,y){
if (y==114636.470669) {
if (Math.abs(x-Math.round(x))<1e-10) x=Math.round(x);
return gamma(x*1+1);
}
var result=Math.pow(x,y);
if (isFinite(result)) return result;
if (Math.abs(x)<=1e-14) return (y>=0)?0:NaN;
result=Math.pow(-x,y);
if (isFinite(result)) {
y=Math.abs(y*675675);
if (Math.abs( y%2-1)<1e-5) return -result;
if (Math.abs((y+1)%2-1)<1e-5) return result;
}
return NaN;
}
function atanb(x,y) {return Math.atan2(y,x)}
function atan2(x,y){return Math.atan2(x,y);}
function ceil(x){return Math.ceil(x);}
function floor(x){return Math.floor(x);}
function log(x){return Math.log(x);}
function round(x,dig,method){
if (arguments.length==1) return Math.round(x);
else if (arguments.length==2) return this.ZZCJI(x,dig);
if (! isFinite(x)) return x-0;else x-=0;
if (method-0<0) method=(x<0)?1:0;
else if (method==3) method=(x<0)?0:1;
else if ((method!=0)&&(method!=2)) method=1;
if (isFinite(dig) && (dig==Math.floor(dig)) &&
(dig-0>=0&&dig-0<16)) dig=Math.pow(10,dig);
else dig=1e16;
dig=(x<0)?-dig:dig;x*=dig;
var n=Math.floor(x);
if ((x-n>0.500000001)||((method)&&(x-n>0.499999999)&&(n%2+method%2))) n++;
return n/dig;
}
function mathround(x,dig,method) {
if (! isFinite(x)) return x-0;else x-=0;
if (method-0<0) method=(x<0)?1:0;
else if (method==3) method=(x<0)?0:1;
else if ((method!=0)&&(method!=2)) method=1;
var dign;
if (isFinite(dig) && (dig==Math.floor(dig)) &&
(dig-0>=0&&dig-0<16)) dign=Math.pow(10,dig);
else dign=1e16;
dign=(x<0)?-dign:dign;x*=dign;
var n=Math.floor(x);
if ((x-n>0.500000001)||((method)&&(x-n>0.499999999)&&(n%2+method%2))) n++;
var s="00000000000000"+n;
var i=s.length-dig;s=s.substring(0,i)+"."+s.substring(i);
i=0;while(s.charAt(i)=="0") i++;i;if (s.charAt(i)=="0") i--;
s=s.substring(i)+"00000000000000";
i=s.indexOf('.');s=s.substring(0,i+dig+1);
if (dign<0) s="-"+s;
return s;
}
function getsigfig(s) {
if (isNaN(s)) return 0;else s=s+"";
s=s.replace(/[eE].*/,'').
replace(/[^0-9.]+/,'').
replace(/^0+/,'');
if (s.indexOf(".")<0) {
s=s.replace(/0+$/,'');
return s.length;
} else {
s=s.replace(/^\.0+/,'.');
return s.length-1;
} 
}
function sigfig(x,dig,method) {
if (! isFinite(x)) return x-0;else x-=0;
if (arguments.length==2) method=1;
dig-=0;method-=0;
var sgn,l,x1,x2,x3,i,sci4int=false;
if (dig<0) {sci4int=true;dig=-dig;}
sgn=(x<0)?-1:1;x*=sgn;
if (x<1e-300) return "0";
l=Math.floor(Math.log(x)/Math.LN10)+1;
x1=x/Math.pow(10,l);
x2=(this.mathround(x1,dig,method)+"").substring(0,dig+1);
if (x2-0==1) {
if ((l<0)&&(dig-8<=l)) x3=("0.000000000000000").substring(0,-l+1)+
"1"+("0000000000000").substring(0,dig-1);
else x3="1."+("0000000000000").substring(0,dig-1)+"E"+l;
if ((l>=dig)&&sci4int&&(l<11)) x3=
"1"+("0000000000000").substring(0,l);
} else if ((1<=l)&&(l < dig)) {
i=x2.indexOf('.')+1; 
x3=x2.substring(0,i-1)+x2.substring(i,i+l)+"."+x2.substring(i+l);
} else if ((l==dig)&&(x2.substring(x2.length-1)>'0')) {
i=x2.indexOf('.')+1; 
x3=x2.substring(0,i-1)+x2.substring(i,i+l);
} else if ((dig-9<=l)&&(l<=0)) {
x3=("0.000000000").substring(0,-l+2)+x2.substring(1);
} else if ((l>=dig)&&sci4int&&(l<11)) {
i=x2.indexOf('.')+1; 
x3=x2.substring(0,i-1)+x2.substring(i,i+l)+
"00000000000".substring(0,l-dig);
} else {
x3=x2.substring(1,2)+"."+x2.substring(2)+"E"+(l-1);
}
if (sgn<0){ return "-" + x3;}
else {return x3;}
}
function ZZSUj(s,doeval) {
if (typeof s == "number") return [s];
else if (s == "") return [];
else if (typeof s != "string") return s;
var escaped=(s.indexOf("\\,")>=0);
if (escaped) s=s.replace(/\\\\/g,"\xF1").replace(/\\,/g,"\xF2");
s=s.replace(/(\s*,\s*)+/g,"\xF3").replace(/^\xF3/,"").replace(/\xF3$/,"");
if (escaped) s=s.replace(/\xF1/g,"\\").replace(/\xF2/g,",");
var numarray=s.split(/\xF3/);doeval+="";
if ((doeval=='false')||(doeval.indexOf('no')==0)) return numarray;
for(i=0;i<numarray.length;i++) {
var x=numarray[i]-0;
if (! isFinite(x)) x=this.ZZVtv(numarray[i]);
numarray[i]=x;
} 
return numarray; 
}
function getelm(s,t,opt) {
s=this.ZZSUj(s,opt);
if (!s ||! s.length) return NaN;
if (isFinite(t)) return ((t>=1)&&(t<=s.length))?s[t-1]:NaN;
t=this.ZZSUj(t);
if (!t ||! t.length) return NaN;
var r=new Array();
for(var i=0;i<t.length;i++) if (t[i]>=1 && t[i]<=s.length) r[r.length]=s[t[i]-1];
return r;
}
function getnum(s,t) {
s=this.ZZSUj(s);if (!s ||! s.length) return NaN;
return this.getelm(s.sort(this.sortOnNumPosition),t);
}
function ZZstN(list) {
var result=new Array();var resultN=-1;
if (list.length==0) return result;
for (i=1;i<list.length;i++) if (list[i]<list[i-1]) {
result=list;
return ZZstN(result.sort(this.sortOnNumPosition));
}
var freq=1;var value=list[0];
for(var i=1;i<list.length;i++) {
if (list[i] != value) {
result[++resultN]=value;
result[++resultN]=freq;
value=list[i];
freq=1;
} else {freq++;}
}
result[++resultN]=value;
result[++resultN]=freq;
return result;
}
function factorial(n) {
var x=this.ZZPpc(n);
if (x<0) return -1;else if (!isFinite(x)) return x;
var result=1;
while(x>=this.ZZZrv.length) result*=x--;
return this.ZZZrv[x]*result;
}
function comb(n,r) {
var x=this.ZZPpc(n);
var y=this.ZZPpc(r);
if ((x<0)||(y<0)||!isFinite(x)||!isFinite(y)) return -1;
if (x<y) return 0;else if (x<17) return this.binomialArray[x][y];
var numer=1;var denom=1;while(y>0) {numer*=x--;denom*=y--;}
return numer/denom;
}
function multinom(a) {
if (arguments.length<2) return 1;
var product=1;var sum=0;var n,x,y,numer,denom;
for(var i=0;i<arguments.length;i++) {
n=this.ZZPpc(arguments[i]);
if ((n<0)||!isFinite(n)) return -1;
else if (n==0) continue;
numer=1;denom=1;x=sum+n;y=Math.min(sum,n);
while(y>0) {numer*=x--;denom*=y--;}
product*=numer/denom;sum+=n;
}
return product;
}
function ZZqpD(N) {
var srcN=Math.abs(this.ZZPpc(N));
if (!isFinite(srcN)||srcN<2) return [];
var primeN=this.ZZwCJ.length-1;
var testN=this.ZZwCJ[primeN];
if (testN%3==2) testN-=2;
var i=0,sqrtN=1,resultN=Math.sqrt(srcN)+1;
while ((testN<32740)&&(testN<resultN)) {
testN+=4;sqrtN=Math.sqrt(testN+2);
for(i=2;true;i++) 
if (testN % this.ZZwCJ[i] == 0) {break;} 
else if (this.ZZwCJ[i] > sqrtN) {
this.ZZwCJ[++primeN]=testN;break;
}
testN+=2;
for(i=2;true;i++) 
if (testN % this.ZZwCJ[i] ==0) {break;} 
else if (this.ZZwCJ[i]>sqrtN) {this.ZZwCJ[++primeN]=testN;break;}
}
testN=srcN;sqrtN=resultN;resultN=-1;primeN=-1;
var result=new Array();
while(this.ZZwCJ[++primeN]<=sqrtN ) {
while ((testN % this.ZZwCJ[primeN]) ==0) {
result[++resultN]=this.ZZwCJ[primeN];
testN/=this.ZZwCJ[primeN];
sqrtN=Math.sqrt(testN);
}
}
if (testN>1) {result[++resultN]=testN;}
return result;
}
function ZZCnN(N) {return (this.ZZqpD(N).length==1);}
function isqr(N) {
var testN=Math.abs(this.ZZPpc(N));
if (!isFinite(testN)) return 0;
else if (testN<2) return testN;
var freqlist=this.ZZstN(this.ZZqpD(testN));
var result=1;
for(var i=1;i<freqlist.length;i+=2) if (freqlist[i]>1) {
result*=Math.pow(freqlist[i-1],freqlist[i]&1022);
}
return result;
}
function ZZrwd(N) {
var testN=Math.abs(this.ZZPpc(N));
if (!isFinite(testN)) return 0;
else if (testN<2) return testN;
var freqlist=this.ZZstN(this.ZZqpD(testN));
var result=1;
for(var i=1;i<freqlist.length;i+=2) {result*=freqlist[i]+1;}
return result;
}
function ZZhwc(N) {
var testN=Math.abs(this.ZZPpc(N));
if ((testN==0)||(!isFinite(testN))) return [];
else if (testN==1) return [1];
var i,j,k;var result=new Array();
var freqlist=this.ZZstN(this.ZZqpD(testN));
var nump=freqlist.length/2;var base=new Array(nump);
var exp=new Array(nump);var maxnum=new Array(nump+1);
var status=new Array(nump);var product=1;
j=0;maxnum[0]=1;
for(i=0;i<nump;i++) {
base[i]=freqlist[j++];
exp[i]=freqlist[j++];
status[i]=0;
maxnum[i+1]=maxnum[i]*Math.pow(base[i],exp[i]);
}
var product=1;k=-1;j=0;
while (j<nump) {
result[++k]=product;
if (status[j]<exp[j]) {
status[j]++;
product*=base[j];
}
else {
while((j<nump)&&(status[j]==exp[j])) {j++;}
if (j<nump) {
product/=maxnum[j];
product*=base[j];
status[j]++;
while (--j>=0) status[j]=0;
}
}
}
return result.sort(this.sortOnNumPosition);
}
function getfactor(N,p) {
return this.ZZhwc(N)[p-1];
}
function simpson(fnexpr,lbound,ubound,stopval) {
var a,b,delta,i,n,eps,stype,ndegree;
stopval=this.ZZZtO(stopval);
if ((!stopval)||(stopval!=stopval)) {stype=false;n = 200;eps=1e-3;}
else if ((stopval>=2)&&(this.ZZf_y(stopval))) {stype=true;n = stopval;n+=n%2;}
else if (stopval>0) {stype=false;n = 4;eps=stopval;}
else if (stopval<0) {stype=false;n = 4;eps=Math.pow(10,stopval-1);}
var last_approx=-123456789, new_approx=0;
var pv=this.getParserVars(fnexpr);
if (pv.length!=1) pv='x';
var fnx = this.parser(fnexpr,pv,'g');
if (typeof fnx != "function") return NaN;
a = this.ZZVtv(lbound);b = this.ZZVtv(ubound);
for(var ctrl=0;ctrl<10;ctrl++){
var delta=(b-a)/n;
new_approx=fnx(a);
for(i=1;i<n;i++) new_approx+=2*(1+i%2)*fnx(a+i*delta);
new_approx+=fnx(b);
new_approx*=delta/3.0;
if (stype) break;
else if (Math.abs(new_approx - last_approx)<eps) break;
last_approx = new_approx;
n += n;
}
return new_approx;
}
function evalfunc(fnexpr,vars,values) {
fnexpr=(fnexpr+"").toLowerCase();
if (arguments.length<2) return Number(this.parser(fnexpr,'','n'));
var lvalues,i,j,k,avals,avar,nvar,res,fnc,stmp,rea;
var lvars=(vars+"").toLowerCase();
var isStr=((fnexpr.indexOf('"')>=0)||(fnexpr.indexOf("'")>=0));
if (isStr) fnexpr=fnexpr.replace(/^\s*\\?["']/,'').replace(/\\?['"]\s*$/,'');
var isTrans=(lvars.indexOf(';')>=0);
if (isFinite(parseFloat(lvars))) {
lvars=['x'];nvar=1;lvalues=vars+"";
} else {
if (lvars.indexOf(';')>0) isTrans=true;
lvars=lvars.replace(/;/g,',').replace(/^[^a-z]*|[^a-z]*$/g,'');
lvars=lvars.split(','); 
if (! lvars) lvars=['x'];
nvar=lvars.length;lvalues="";
}
if ((nvar==1)&&(fnexpr.indexOf(lvars[0])<0)) {
var pv=this.getParserVars(fnexpr);
if (pv.length==1) lvars=[pv];
}
fnc=this.parser(fnexpr,lvars,((nvar>1)?"f":"g"));
if (typeof fnc!="function") return NaN;
for(i=2;i<arguments.length;i++) lvalues+=","+arguments[i];
if (isStr) lvalues=lvalues.
replace(/@/g,'&#64;').replace(/~/g,'&#126;').
replace(/%/g,'&#37;').replace(/\$/g,'&#36;');
var escaped=(lvalues.indexOf("\\,")>=0);
if (escaped) lvalues=lvalues.replace(/\\\\/g,'@').replace(/\\,/g,'~');
lvalues=lvalues.replace(/(\s*,\s*)+/g,'%').replace(/^%|%$/g,'');
if (escaped) lvalues=lvalues.replace(/@/g,',').replace(/@/g,'\\');
var avals=lvalues.split("%");
avar=avals.length;
while(avar%nvar) avals[avar++]=(isStr)?"":0.0;
k=avar/nvar;
res=new Array(k);
rea=new Array(nvar);
if (isStr) {
for(i=0;i<avar;i++) avals[i]+="";
for(i=0;i<nvar;i++) rea[i]=new RegExp(lvars[i],"g");
if (isTrans) {
for(j=0;j<k;j++) {
stmp=fnexpr;
for(i=0;i<nvar;i++) stmp=stmp.replace(rea[i],avals[j+i*k]);
res[j]=stmp;
}
} else {
for(j=0;j<k;j++) {
stmp=fnexpr;
for(i=0;i<nvar;i++) stmp=stmp.replace(rea[i],avals[j*nvar+i]);
res[j]=stmp;
}
}
return res;
}
for(i=0;i<avar;i++) avals[i]-=0;
if (isTrans) {for(j=0;j<k;j++) {
for(i=0;i<nvar;i++) rea[i]=avals[j+i*k];
res[j]=fnc(rea);
}} else if (nvar>1) {for(j=0;j<k;j++) {
for(i=0;i<nvar;i++) rea[i]=avals[j*nvar+i];
res[j]=fnc(rea);
}} else {for(j=0;j<k;j++) res[j]=fnc(avals[j]);}
return res;
}
function evalsum(fnexpr,lbound,ubound,varname) {
if (arguments.length==1) {
var avals=ZZSUj(fnexpr);
var res=0,i=0;
while(i<avals.length) res+=(avals[i++]-0);
return res;
}
if (! varname) {varname="x";}
var pv=this.getParserVars(fnexpr);
if (pv.length!=1) pv=varname;
var fnx = this.parser(fnexpr,pv,'g');
if (typeof fnx!="function") return NaN;
var i=this.ZZPpc(lbound);
var u=this.ZZZtO(ubound);
if (! this.ZZrcD(i,u)) return NaN;
var sum=0.0;while(i<=u) sum+=fnx(i++);
return sum;
}
function evalprod(fnexpr,lbound,ubound,varname) {
if (arguments.length==1) {
var avals=ZZSUj(fnexpr);
var res=1.0,i=0;
while(i<avals.length) res*=(avals[i++]-0);
return res;
}
if (! varname) {varname="x";}
var pv=this.getParserVars(fnexpr);
if (pv.length!=1) pv=varname;
var fnx = this.parser(fnexpr,pv,'g');
if (typeof fnx!="function") return NaN;
var i=this.ZZPpc(lbound);
var u=this.ZZZtO(ubound);
if (! this.ZZrcD(i,u)) return NaN;
var prod=1.0;while(i<=u) prod*=fnx(i++);
return prod;
}
function findroot(fnexpr,lbound,rbound,xerror,yerror) {
var a,b,c,d,x,y,fnx;
if ((arguments.length<5)||(! isFinite(yerror))) yerror=0; 
else yerror=Math.abs(yerror);
if ((arguments.length<4)||(! isFinite(xerror))) xerror=1e-8; 
else xerror=Math.max(Math.abs(xerror),1e-14);
var pv=this.getParserVars(fnexpr);
if (pv.length!=1) pv='x';
var fnx = this.parser(fnexpr,pv,'g');
if (typeof fnx!="function") return NaN;
a= this.ZZZtO(lbound);
b= this.ZZZtO(rbound);
if (! this.ZZrcD(a,b)) return NaN;
x=Math.min(a,b);b+=a-x;a=x;
if (!(b-a<1e20)) return NaN;
c=fnx(a);d=fnx(b);
if (Math.abs(c)<=yerror) return a;
if (Math.abs(d)<=yerror) return b;
if (!(c*d<0)) return NaN;
while (b-a>xerror) {
x=(a+b)/2;y=fnx(x);
if (Math.abs(y)<=yerror) return x;
if (c*y<0) {b=x;d=y;}
else {a=x;c=y;} 
}
return (a+b)/2;
}
function rootpoly(coeflist) {
var i,j,k,coef,deg,result;
for(i=1;i<arguments.length;i++) coeflist+=','+arguments[i];
coef=this.ZZSUj(coeflist);
deg=coef.length-1;if (deg<=0) return [];
for(i=0;i<=deg;i++) if (! isFinite(coef[i])) return [];
result=new Array();
if ((deg==3)&&(coef[0] != 0)) {
var a,b,c,d,x,y,z,s;
a=coef[1]/coef[0];b=coef[2]/coef[0];c=coef[3]/coef[0];
d=4*(1+Math.abs(a)+Math.sqrt(Math.abs(b)+1)+Math.pow(Math.abs(c)+1,0.34));
s='x^3+('+a+')*x^2+('+b+')*x+('+c+')';
x=this.findroot(s,-d-3.456,d+1.234);
result[0]=x;a+=x;b+=a*x;
d=this.rootpoly([1,a,b]);
if (d.length>0) {result[1]=d[0];result[2]=d[1];}
else result.length=1;
} else if (deg==3) {deg=2;coef[0]=coef[1];coef[1]=coef[2];coef[2]=coef[3];}
if ((deg==2)&&(coef[0] != 0)) {
i=coef[1];j=2*coef[0];
k=i*i-2*j*coef[2];
if (k<0) return [];
else if (coef[2]==0) {result[0]=0;result[1]=-coef[1]/coef[0];}
else if (i>=0) {
result[0]=-(i+Math.sqrt(k))/j;
result[1]=coef[2]/j*2/result[0];
} else {
result[0]=(-i+Math.sqrt(k))/j;
result[1]=coef[2]/j*2/result[0];
}
} else if (deg==2) {deg=1;coef[0]=coef[1];coef[1]=coef[2];}
if ((deg==1)&&(coef[0] != 0)) {
result[0]=(-coef[1]/coef[0]);
} else if (deg==1) return [];
result.sort(this.sortOnNumPosition);
return result;
}
function listprod(xlist,ylist) {
var xarr,yarr,xl,yl,xi,yi,result;
xarr=ZZSUj(xlist,'no');xl=xarr.length;
yarr=ZZSUj(ylist,'no');yl=yarr.length;
result=new Array(2*xl*yl);
for(xi=0;xi<xl;xi++) for(yi=0;yi<yl;yi++) {
result[2*xi*yl+2*yi  ]=xarr[xi];
result[2*xi*yl+2*yi+1]=yarr[yi];
}
return result; 
}
function QMPA2T(str) {str=str+"";
var schk="<>";while(schk!=str) {schk=str;
str=str.replace(/<x>\s*<\/x>/g,' ').
replace(/<y>\s*<\/y>/g,' ').
replace(/<u>\s*<\/u>/g,' ').
replace(/<v>\s*<\/v>/g,' ').
replace(/<w>\s*:\s*<\/w>/g,' ').
replace(/<w>([^<>:]*):\s*<\/w>/g,'<x>$1</x>').
replace(/<w>\s*:([^<>:]*)<\/w>/g,'<y>$1</y>').
replace(/<h>\s*:\s*:([^<>:]*):\s*:\s*<\/h>/g,' $1 ');
}
str=str.replace(/<u>/g,'<x>').replace(/<\/u>/g,'<\/x>').
replace(/<(v|y)>/g,'<sub>').replace(/<\/(v|y)>/g,'<\/sub>');
str=str.replace(/@/g,'$$at$$');   
str=str.replace(/(<\/[pndfgrslawkj]>)/g,'@$1');
schk="<>";while(schk!=str) {schk=str;
str=str.replace(/<p>([^@:]*):([^@]*)@<\/p>/g,
'<t>$1</t><x>$2</x>').
replace(/<s>([^@:]*):([^@]*)@<\/s>/g,
'<t>$1$$times$$10</t><x>$2</x>').
replace(/<r>([^@]*)@<\/r>/g,
'<rdn></rdn><rad>$1<\/rad>').
replace(/<f>([^@:]*):([^@]*)@<\/f>/g,
'<nmr>$1</nmr><den>$2</den>').
replace(/<n>([^@:]*):([^@:]*):([^@]*)@<\/n>/g,
'<t>$1</t><nmr>$2</nmr><den>$3</den>').
replace(/<d>([^@:]*):([^@]*)@<\/d>/g,
'<t>$1</t><rdn></rdn><rad>$2</rad>').
replace(/<g>([^@:]*):([^@]*)@<\/g>/g,
'<rdn>$1</rdn><rad>$2</rad>').
replace(/<l>([^@:]*):([^@]*)@<\/l>/g,
'<lim>$1<pbr>$2</lim>').
replace(/<k>([^@]*)@<\/k>/g,
'<pha>$1</pha>').
replace(/<j>([^@]*)@<\/j>/g,
'<ovr>$1</ovr>').
replace(/<a>([^@:]*):([^@]*):([^@]*)@<\/a>/g,
'<int>$1<pbr>$2<pbr>$3</int>').
replace(/<w>([^@:]*):([^@]*)@<\/w>/g,
'<stk>$1<pbr>$2</stk>');
}
str=str.replace(/@/g,'').
replace(/<\/t><t>/g,'\t').
replace(/<\/?t>/g,'');
str=str.replace(/<x>([\t ]*)<\/x>/g,'$1').
replace(/<y>([\t ]*)<\/y>/g,'$1');
str=str.replace(/<1>/g,'@').
replace(/<m>([^@]*)<\/m>/g,'<m><1>$1</1></m>').
replace(/@/g,'<1>');
str=str.replace(/\$at\$/g,'@');  
return str;  
}
function QMPupdate(str) {
str=str.replace(/<nobr>/ig,"{").
replace(/<\/nobr>/ig,"}").
replace(/<sup>/g,'<x>').
replace(/<\/sup>/g,'<\/x>');
str="\xF1"+str+"\xF2"; 
str=str.replace(/\[([a-z])!/g,'<pe=$1>').
replace(/!([a-z])\]/g,'</pe=$1>').
replace(/\[!/g,'\xF3\xF1').
replace(/!\]/g,'\xF2</pe>').
replace(/(<\/?[me1-9]>)/g,"\xF2$1\xF1").
replace(/\xF1([^\xF1\xF2\xF3]*)\xF2/g,'$1').
replace(/\xF1([^\xF1\xF2\xF3]*)\xF2/g,'$1').
replace(/\xF1/g,'<pg>').
replace(/\xF2/g,'</pg>').
replace(/\xF3/g,'<pe>');
str=str.replace(/\[([a-z]);/g,'<lg=$1>\xF1').
replace(/;([a-z])\]/g,'\xF2</lg=$1>').
replace(/\[;/g,'<lg>\xF1').
replace(/;\]/g,'\xF2</lg>');
var str1=null;while (str1!=str) {str1=str;  
str=str.replace(/(\xF1[^\xF1\xF2]*);/g,'$1<le>');
}
str=str.replace(/[\xF1\xF2]/g,'');
str=str.replace(/::/g,'$COLON$').
replace(/:/g,'$colon$').
replace(/\$COLON\$/g,':');
str=str.replace(/<(\/?[pl][ge]=[a-z])>/g,"@L$1@G").
replace(/<(\/?[a-z]+)>/g,"@L$1@G").
replace(/<(\/?[0-9])>/g,"@L$1@G").
replace(/</g,'$$lt$$').
replace(/>/g,'$$gt$$').
replace(/@L/g,'<').
replace(/@G/g,'>');
return str;
} 
function QMPput(str) {
str='<t>'+str+'</t>';
str=str.replace(/@/g,'$$at$$');
str=str.replace(/<m><1>/g,'<m>').
replace(/<\/m>/g,'@').
replace(/<\/1>[^@]*@/g,'@').
replace(/@/g,'</m>');
str=str.replace(/\t/g,'</t><t>').
replace(/(<\/?[em]>)/g,'</t>$1<t>').
replace(/<sub>/g,'<y>').replace(/<\/sub>/g,'<\/y>').
replace(/([0-9.]+)(\*|\$times\$)10<x>([\+\-0-9]+)<\/x>/g,
'</t><s>$1:$3</s><t>');
str=str.replace(/<\/(nmr|den|rdn|rad|lim|pha|int|stk|ovr)>/g,'@$1>');
var schk="";while(schk!=str) {schk=str;
str=str.replace(/<nmr>([^@]*)@nmr><den>([^@]*)@den>/g,
'</t><f>$1:$2</f><t>').
replace(/<rdn>@rdn><rad>([^@]*)@rad>/g,
'</t><r>$1</r><t>').
replace(/<rdn>([^@]+)@rdn><rad>([^@]*)@rad>/g,
'</t><g>$1:$2</g><t>').
replace(/<lim>([^@]*)<pbr>([^@]*)@lim>/g,
'</t><l>$1:$2</l><t>').
replace(/<pha>([^@]*)@pha>/g,
'</t><k>$1</k><t>').
replace(/<ovr>([^@]*)@ovr>/g,
'</t><j>$1</j><t>').
replace(/<stk>([^@]*)<pbr>([^@]*)@stk>/g,
'</t><w>$1:$2</w><t>').
replace(/<int>([^@]*)<pbr>([^@]*)<pbr>([^@]*)@int>/g,
'</t><a>$1:$2:$3</a>');
}   
str=str.replace(/@/g,'').replace(/\$at\$/g,'@');
str=str.replace(/\[&([^&]*)&\]/g,'').
replace(/&nbsp;/g,' ').
replace(/<t><\/t>/g,'');
str=str.replace(/<\/?pe=[a-z]>/g,'').
replace(/<\/?p[ge]>/g,'');
str=str.replace(/<\/lg(=[a-z])?>/g,"\xF1").
replace(/<lg(=[a-z])?>/g,"\xF2").
replace(/<le>/g,"\xF3");
var str1="";while (str1!=str) {str1=str;   
str=str.replace(/\xF2([^\xF1\xF2\xF3]*)\xF1/g,"$1").
replace(/\xF2([^\xF1\xF2\xF3]*)\xF3[^\xF1\xF2]*\xF1/g,"$1");
};str=str.replace(/[\xF1\xF2\xF3]/g,"");
str=str.replace(/<![^>]*>/,'');
str=str.replace(/<\/t><t>/g,"\t").
replace(/[\-\+](\s*)&null;/g,"$1").
replace(/&pnull;(\s*)\+/g,"$1").
replace(/&pnull;(\s*)\-/g,"$1-").
replace(/\-(\s*)\+/g,"-$1").
replace(/\-(\s*)\-/g,"+$1").
replace(/\+(\s*)\-/g,"-$1").
replace(/\+(\s*)\+/g,"+$1").
replace(/\t/g,"</t><t>").
replace(/&pnull;|&null;/g,'');
return str;
}   
function ZZRGC( hstr ) {
if ( hstr === "" )  hstr="<t>  </t>";else hstr+="";
if (hstr.search(/[^0-9a-fA-F]/)<0) return hstr;
hstr=hstr.replace(/[\t\n]/g,' ').replace(/[^ -~]/g,'');
var b = "0123456789abcdef";
var astr = "";
for ( var i = 0; i < hstr.length; i++ ) {
var c = hstr.charCodeAt ( i );
astr += b.charAt( c/16 ) + b.charAt ( c%16 );
}
return astr;
}
function ZZoTY( hstr ) {
if ( hstr === "" )  return "";else hstr+="";
if (hstr.search(/[^0-9a-fA-F]/)>=0) return hstr;
var astr = "";
for ( var i = 0; i < hstr.length; i++ ) {
var ccode = parseInt( hstr.substring(2*i, 2*(i+1)), 16 );
if (ccode) astr += String.fromCharCode( ccode );
}
if (astr.indexOf("XXX")>=0) this.MPDebug=true;
return astr;
}
function ZZTEF(jarfile, name, w, h, course, mode, 
initval, pos, debug, direct_call,resetVal,maxnest,
hascaret,hasunderscore
){
var url=jarfile;
if (! url) {
url=window.location.href+"";
url=url.replace(/[^\/]*$/,"palette_2_0.jar");
} 
this.jarfile = url.replace(/.*\//,"");
this.codebase= url.replace(/[^\/]*$/,"");
this.name =(name)?name:"mathpalette";
this.width = w;
this.height = h;
this.course=(course)?course:"algebra";
this.mode = mode;
this.initval =(initval)?initval:"3c743e203c2f743e";
this.pos =(pos)?pos:"";
this.debug =(debug)?debug:"";
this.direct=(direct_call)?true:false;
this.resetVal=(resetVal)?resetVal:"";
this.maxnests=((maxnest===0)||(maxnest))?maxnest:2;
if (typeof hascaret =='undefined') this.hascaret=false;
else this.hascaret=(hascaret)?'yes':'no';
if (typeof hasunderscore =='undefined') this.hasunderscore=false;
else this.hasunderscore=(hasunderscore)?'yes':'no';
this.inputstr = null;
this.ready = false;
this.applet_str =
'<applet name="java2js" code="java2js.class" ' +
'codebase="' + this.codebase + '" ' +
'archive="' + this.jarfile + '" width="2" height="2"></applet>';
this.jjholder='<div id="lsiholder"\n' +
' style="position:relative;visibility:hidden"><iframe\n' +
' src="" name="lsijava2js" width="2" height="2"></iframe></div>\n';
this.indirect='<div id="lsi_applet_loader" '+
'style="position:relative;visibility:hidden"></div>\n';
this.get_applet_html = function () {
var myresult = '\n'+this.jjholder+((this.direct)?'':this.indirect)+
'<applet name="' + this.name + '" ' +
' code="Palette.class" archive="' + this.jarfile + '" ' +
' codebase="' + this.codebase + '" ' +
' width="' + this.width + '" height="' + this.height + '">\n' +
'<param name="mode" value="' + this.mode + '">\n' +
'<param name="course" value="' + this.course + '">\n' +
'<param name="InitialInput" value="' + this.initval + '">\n' +
((this.resetVal)?'<param name="resetValue" value="' + this.resetVal + '">\n':'') +
'<param name="maxnests" value="'+((this.maxnests)?this.maxnests:0)+'">\n'+
((this.debug)?'<param name="DisplayText" value="'   + this.debug    + '">\n':'') +
((this.pos)?'<param name="ButtonsPosition" value="' + this.pos      + '">\n':'') +
((this.hascaret)?'<param name="hascaret" value="'   + this.hascaret+'">\n':'') +
((this.hasunderscore)?'<param name="hasunderscore" value="'+this.hasunderscore+'">\n':'')+
'</applet>\n';
return myresult;
};
this.calls=0;
this.request_input = function (doc) {
if (this.direct) {
this.inputstr=""+doc.applets[this.name].getText();
this.ready=true;
return true;
}
else if (++this.calls>30) {
this.ready = true;
this.inputstr=this.initval;
this.calls=0;
return true;
}
this.ready = false;
this.inputstr = null;
doc.getElementById("lsi_applet_loader").innerHTML=this.applet_str;
return false;
};
this.get_input = function () {
return this.inputstr;
};
this.set_input = function ( mesg ) {
this.calls=0;
this.inputstr = mesg;
this.ready = true;
};
}
function ZZnMG(str,fln) {
var res=str+'';
res=res.replace(/<\/?t>/g,'');
res=res.replace(/(<e>|<m>)/g,"$1\xF1").
replace(/(<\/e>|<\/m>)/g,"\xF2$1").
replace(/\xF1[^\xF1\xF2]*\xF2/,"<t><c>"+fln+"</t>").
replace(/\xF1[^\xF1\xF2]*\xF2/g,"<t>"+fln+"</t>").
replace(/\xF1|\xF2/g,"");
return res;
}
function ZZeUj(str) {
var res=str+"";
res=res.replace(/<\/m>/g,"\xF1").
replace(/<\/1>/g,"\xF2").
replace(/<m><1>([^\xF2]*)\xF2[^\xF1]*\xF1/g,"<m>$1</m>").
replace(/\xF1|\xF2/g,"").
replace(/<t><\/t>/g,"").
replace(/<![^>]*>/g,"");
return res;
}
function QMPview(str,typ) {
var i,j,k,l,bparts,result,stmp;
str=unescape(escape(""+str).replace(/%9[0-9]/g,'').replace(/%00/g,''));
str=this.ZZoTY(str+"")+"";
str=str.replace(/<c>/g,"").replace(/<![^>]*>/g,"");
str=str.replace(/<(\/?[genftombdrips1-9alkjzuvwxy])>/g,"\xF1$1\xF2").
replace(/</g,"&lt;").replace(/>/g,"&gt;").
replace(/\xF1/g,"<").replace(/\xF2/g,">");
str=str.replace(/<z>/g,'<b>').
replace(/<\/z>/g,'</b>').
replace(/<[iob]>(\s*)<\/[iob]>/g,"$1").
replace(/<o>/g,"<b><i>").
replace(/<\/o>/g,"<\/i><\/b>").
replace(/<e>/g,"<m>").
replace(/<\/e>/g,"</m>");
if (str.indexOf("<m>")>=0) {
if (typ==0) {
str=str.replace(/<m>/g,'\xF1').
replace(/<\/m>/g,"\xF2").
replace(/\xF1[^\xF1\xF2]*\xF2/g,'<m>$$box$$</m>');
} else if (typ==1) {
str=str.replace(/<\/?1>/g,'').
replace(/<[0-9]+>/g,'\xF1').
replace(/<\/[0-9]+>/g,'\xF2').
replace(/\xF1[^\xF1\xF2]*\xF2/g,'');
} else if (typ==2) {
str=str.replace(/<m>/g,"<m> ").replace(/<\/m>/g," <\/m>").
replace(/<m> *<\/m>/g,"<m><t></t><\/m>").
replace(/<\/m>/g,'\xF1</m>');
var str1='<<<';while (str1!=str) {str1=str;
str=str.replace(/(<m>[^\xF1]*)\*10/g,"$1<e>").
replace(/(<m>[^\xF1]*<t>)<\/t>/g,"$1$$box$$</t>");
}
}
str=str.replace(/<\/?m>|[\xF1\xF2]/g,"");
} 
str=str.replace(/\*10(<\/t><x>|<x>)/g,"$$times$$10$1");
if (typ==2) str=str.replace(/<e>/g,'*10');
if ((str=="<t>$box$</t>")||(str=="$box$")) return "&nbsp;";
result=Hview(str);
return result;
}
function QMPMadj(str,typ,Q) {
var str1="",i,j,k,l;
typ+="";str=" "+str+" ";
str=str.replace(/<\/?[ctbio]>/g," ").replace(/\s+/g," ");
str=str.replace(/<h>([^<>:]*):/g,'$1<h> :').
replace(/:([^<>:]*)<\/h>/g,': </h>$1').
replace(/<h>\s*:\s*:([^<>:]*):\s*:\s*<\/h>/g,' $1 ').
replace(/<h>\s*:([^<>:]*):\s*:([^<>:]*):\s*<\/h>/g,'<stk>$1<pbr>$2</stk>').
replace(/<stk>\s*<pbr>\s*<\/stk>/g," ").
replace(/<stk>\s*<pbr>([^<>:]*)<\/stk>/g,"<sub>$1</sub>").
replace(/<stk>([^<>:]*)<pbr>\s*<\/stk>/g,"<x>$1</x>");
var opt=new Array();
if ((typ=="AE")||(typ=="AM")) {
var tst=str;
tst=tst.replace(/\$\w\w*\$/g,'IMG').
replace(/<x>/g,'^{').
replace(/<\/x>/g,'}').
replace(/<\/\w\w*>/g,'<>').
replace(/\[&[^&]*&\]/g,' ');
if (tst.indexOf('x')>=0) Q.options.xmult=false;
if (tst.search(/[0-9.]\s*,\s*\d\d\d/)>=0) Q.options.cmm=false;
} 
if ( str.indexOf('[&') >=0 ) {
i=1,j=0,k=1;
while((i=str.indexOf('[&',i-1))>=0) {
j=str.indexOf('&]');
var opttxt=str.substring(i+2,j);
opt[k++]=opttxt.replace(/^\s+|\s+$/g,'').replace(/\$colon\$/g,":");
str=str.substring(0,i)+str.substring(j+2);
}
}
if ((Q.options.cmm)&&((typ=="SE")||(typ=="SM"))) {
str=cmmrm(str);
}
str=str.replace(/(\D)\.(\d)/g,"$1 0.$2").
replace(/(\d)\.0*(\D)/g,"$1$2").
replace(/(\d\.\d*[1-9])0+(\D)/g,"$1$2").
replace(/([^0-9\.])0+(\d)/g,"$1$2");
if ((Q.options.xmult)&&((typ=="SE")||(typ=="SM"))) {
str=str.replace(/([0-9 >\)])x([\(<0-9 ])/g,"$1*$2");
}
str=str.replace(/<(nmr|den|rdn|rad)>\s*\+/g,"<$1>");
if ((typ=="AE")||(typ=="AM")||Q.tolopt.franeg) { 
str=str.replace(/<nmr> *- *([0-9.]+)<\/nmr><den> *- *([0-9.]+) *<\/den>/g,
"<nmr>$1</nmr><den>$2</den>").
replace(/<nmr> *([0-9.]*) *<\/nmr><den> *- *([0-9.]+) *<\/den>/g,
"<nmr>-$1</nmr><den>$2</den>");
}
str=str.replace(/- *<nmr> *- *([0-9.]+) *<\/nmr>/g,"<nmr>$1</nmr>").
replace(/<nmr> *- *([0-9.]+) *<\/nmr>/g,"-<nmr>$1</nmr>");
str=str.replace(/<(x|y)>/g,'@<$1>');
str1="";while(str1!=str) {str1=str;
str=str.replace(/<x>(\s*)@<x>([^@]*)<\/x>(\s*)<\/x>/g,"<x>$1$2$3</x>");
str=str.replace(/<y>(\s*)@<y>([^@]*)<\/y>(\s*)<\/y>/g,"<y>$1$2$3</y>");
}
str=str.replace(/@/g,'');
if ((Q.tolopt.scinot)&&(typ.indexOf("M")==1)) {
str=str.replace(
/([^0-9\.])(\d+\.\d+|\d+)\s*(\$times\$|\*)10<x>\s*([\+\-]?\d+)\s*<\/x>/g,'$1@$2^$4@');
i=0,j=0,k=0;
var base=0,expo=0,newnum=0;
while((i=str.indexOf('@'))>=0) {
j=str.indexOf('^',i);
base=str.substring(i+1,j)-0;
k=str.indexOf('@',j);
expo=str.substring(j+1,k)-0;
newnum=this.dformat(base+'E'+expo,'E');
str=str.substring(0,i)+newnum+" "+str.substring(k+1);
}
}
str=str.replace(/\$times\$/g,"*").
replace(/\$frasl\$/g,"/").
replace(/\$parenleft(zd)?\$/g,"(").
replace(/\$parenright(zd)?\$/g,")").
replace(/\$bracketleft\$/g,'[').
replace(/\$bracketright\$/g,']').
replace(/\$braceleft\$/g,'{').
replace(/\$braceright\$/g,'}').
replace(/\$lang\$/g,'<').replace(/\$rang\$/g,'>').
replace(/\$pi\$/g,"pi").
replace(/\$lt\$/g,'<').
replace(/\$gt\$/g,'>').
replace(/\$colon\$/g,':').
replace(/ *</g,'<').
replace(/> */g,'>');
str=str.replace(/<rdn> *<\/rdn>/g,"<rdn>2</rdn>").
replace(/(<\/x>)\s+([0-9])/g,"$1*$2").
replace(/([0-9])\s+([0-9])/g,"$1*$2").
replace(/([0-9])\s+([0-9])/g,"$1*$2");
str=str.replace(/<x><nmr>([-]?\d+)<\/nmr><den>(\d+)<\/den><\/x>/g,"<x>$1/$2</x>");
str=str.replace(/> */g,">").replace(/ *</g,"<");
var numer=0,denom=0,whole=0;
if ((Q.tolopt.framix)&&(typ.indexOf("M")==1)) {
str=str.replace(
/([^0-9.])([1-9][0-9]*)<nmr>([0-9]+)<\/nmr><den>([0-9]+)<\/den>/g,
"$1@$2^$3^$4@");
while((i=str.indexOf('@'))>=0) {
j=str.indexOf('^',i);
whole=str.substring(i+1,j)-0;
k=str.indexOf('^',j+1);
numer=str.substring(j+1,k)-0;
l=str.indexOf('@',k);
denom=str.substring(k+1,l)-0;
numer=whole*denom+numer;
str=str.substring(0,i)+"<nmr>"+numer+"<\/nmr><den>"+
denom+"<\/den>"+str.substring(l+1);
}
}
if ((Q.tolopt.fraequ)&&(typ.indexOf("M")==1)) {
str=str.replace(/<nmr>([1-9]\d*)<\/nmr><den>([1-9]\d*)<\/den>/g,"@$1^$2@");
while((i=str.indexOf('@'))>=0) {
j=str.indexOf('^',i);
numer=str.substring(i+1,j)-0;
k=str.indexOf('@',j);
denom=str.substring(j+1,k)-0;
whole=this.gcd(numer,denom);
if (whole!=1) {numer/=whole;denom/=whole;}
if (denom==1) str=str.substring(0,i)+" "+numer+" "+str.substring(k+1);
else str=str.substring(0,i)+"<nmr>"+numer+"<\/nmr><den>"+
denom+"<\/den>"+str.substring(k+1);
}
}
if ((Q.tolopt.fradec)&&(typ.indexOf("M")==1)) {
str=str.replace(/<nmr>([1-9]\d*)<\/nmr><den>([1-9]\d*)<\/den>/g,"@$1^$2@");
while((i=str.indexOf('@'))>=0) {
j=str.indexOf('^',i);
numer=str.substring(i+1,j)-0;
k=str.indexOf('@',j);
denom=str.substring(j+1,k)-0;
if ((10000000%denom)==0) {
whole=0;l=i-1;var ch=str.charAt(l);
while((ch>='0')&&(ch<='9')) ch=str.charAt(--l);
if (l+1<i) whole=str.substring(l+1,i)-0;
whole+=numer/denom;
str=str.substring(0,l+1)+" "+whole+" "+str.substring(k+1);
} else str=str.substring(0,i)+"<nmr>"+numer+"<\/nmr><den>"+
denom+"<\/den>"+str.substring(k+1);
}
}
if ((Q.tolopt.exp0)&&(typ.indexOf("M")==1)) str=str.
replace(/(\d+\.\d*|\d+|[a-z])<x>0<\/x>/g,"1").
replace(/(\([^\(\)]*\)) *<x> *0 *<\/x>/g,"1");
if ((Q.tolopt.exp1)&&(typ.indexOf("M")==1)) str=str.
replace(/<x>1<\/x>/g," ");
if ((typ=="AE")||(typ=="AM")) { 
str=str.replace(/[\-\+] *&null;/g,"").
replace(/&pnull; *\+/g,"").
replace(/&pnull;|&null;/g,"").
replace(/\- *\+/g,"-").
replace(/\- *\-/g,"+").
replace(/\+ *\-/g,"-").
replace(/\+ *\+/g,"+").
replace(/\( *\+/g,"(");
if (Q.tolopt.unary) str=str.
replace(/<(nmr|den|rdn|rad|lim|pha|int|stk|x|z|ovr|sub)> *\+/g,"<$1>");
}   
if ((typ=="SE")||(typ=="SM")) {
str=str.replace(/\( *\+/g,"(").
replace(/<(nmr|den|rdn|rad|lim|pha|int|stk|x|z|ovr|sub)> *\+/g,"<$1>");
if (Q.tolopt.unary) str=str.
replace(/\- *\+/g,"-"). replace(/\- *\-/g,"+").
replace(/\+ *\-/g,"-"). replace(/\+ *\+/g,"+").
replace(/\- *\+/g,"-"). replace(/\- *\-/g,"+").
replace(/\+ *\-/g,"-"). replace(/\+ *\+/g,"+");
else {
str=str.replace(/\+ *<nmr> *-/g,' - <nmr>').
replace(/- *<nmr> *-/g,' + <nmr>').   
replace(/- *- *<nmr>/g,' + <nmr>').
replace(/\+ *- *<nmr>/g,' - <nmr>');
str=str.replace(/[\+\-\*\/]([\+\-\*\/])/g,"$1ERROR$2");
} 
}  
if ((Q.tolopt.coef1)&&(typ.indexOf("M")==1)) str=str.
replace(/([^0-9a-z])1( *[a-z])/g,"$1$2").
replace(/([^0-9a-z])1 *\* *([a-z])/g,"$1 $2");
str=str.replace(/> */g,">").
replace(/ *</g,"<").
replace(/ *([\+\-\*\/]) */g,"$1").
replace(/^ */," ").replace(/ *$/," ");
if ((Q.tolopt.expneg)&&(typ.indexOf("M")==1)) {
str=str.
replace(/(^|[^a-z])([a-z])<x>\s*-\s*(\d+)\s*<\/x>/g,
"$1<nmr>1<\/nmr><den>$2<x>$3</x><\/den>").
replace(/(\d+\.\d*|\d+)<x>\s*-\s*(\d+)\s*<\/x>/g,
"<nmr>1<\/nmr><den>$1<x>$2</x><\/den>").
replace(/(\([^\(\)]*\))<x>\s*-\s*(\d+)\s*<\/x>/g,
"<nmr>1<\/nmr><den>$1<x>$2</x><\/den>");
}
if ((Q.tolopt.expfra)&&(typ.indexOf("M")==1)) {
str=str.
replace(/<rdn>(\d+)<\/rdn><rad>(\d+\.\d*|\d+|[a-z])<\/rad>/g,
" $2<x>1/$1<\/x>").
replace(/<rdn>(\d+)<\/rdn><rad>(\([^\(\)]+\))<\/rad>/g, 
"$2<x>1/$1<\/x>").
replace(/<rdn>(\d+)<\/rdn><rad>([^\(\)]+)<\/rad>/g, 
"($2)<x>1/$1<\/x>");
} 
if ((Q.tolopt.postcf)&&(typ.indexOf("M")==1)) str=str.
replace(/([a-z])(\d+|\d+\.\d+)([ \+\-\*\/])/g,"$2$1$3");
if (typ.indexOf("M")==1) {
str=str.
replace(/<(nmr|den|rdn|rad|lim|pha|int|stk|ovr|z|x|sub)>[ \{\(\[]*/g,"<$1>").
replace(/[\)\]\} ]*<\/(nmr|den|rdn|rad|pbr|lim|pha|int|stk|ovr|z|x|sub)>/g,"</$1>").
replace(/[\)\]\} ]*<pbr>[ \{\[\(]*/g,"<pbr>");
str=str.replace(/\((\d+\.\d*|\d+|[a-z])\)/g,"$1");
} else if (typ.indexOf("E")==1) {
str=str.replace(/<\/?z>/g,'').
replace(/\[/g,'(').replace(/\]/g,')').
replace(/\{/g,'(').replace(/\}/g,')');
}
if ((typ.indexOf("M")==1)&&(Q.tolopt.angles)) {
str=' '+str;
var arr;
if (str.indexOf('<pha>')>0) {
arr=str.replace(/([\+\-]?\d+\.?\d*)<pha>([\+\-]?\d+\.?\d*)(<\/pha>)/g,
'\xF2\xF1$1\xF1$2\xF1\$3').split('\xF1');
for(i=1;i<arr.length;i+=3) {
arr[i]=this.norm_angle(parseFloat(arr[i]),
parseFloat(arr[i+1])).join('<pha>');
arr[i+1]='';
}  
str=arr.join('').replace(/(\w)\xF2(\d)/g,'$1 $2').replace(/\xF2/g,'');
}
if (str.indexOf('$oangle')>0) {
arr=str.replace(/\$(oangle\w\w)\$\s*([\+\-]?\d+\.?\d*)\s*(\$degree\$)/g,
'\xF1$1\xF1$2\xF1$3').split('\xF1');
for(i=1;i<arr.length;i+=3) {
arr[i+1]=this.norm_angle(arr[i],parseFloat(arr[i+1])).join('$');
arr[i]='$';
}  
str=arrpha.join('');
}
str=str.substring(1);
} 
if (opt.length>0) {opt[0]=" "+str+" ";return opt;} 
else return " "+str+" ";
}
function alertar(arr,msg,return_text) {
if (!msg) msg="";else msg+="\n";
if (typeof arr!='object') msg+='=>'+arr+'<=\n';
else for(var i in arr) msg+=i+'=>'+arr[i]+'<=\n';
if (return_text) return msg;
else alert(msg);
}
function ZZKPS(str,Q) {
var tmp=str+"";
tmp=tmp.replace(/\s+|<c>|<\/?[bio]>/g,"");
var strar=this.mpglobal([tmp]);
var result=new Array(strar.length);
for(var i=0;i<strar.length;i++) result[i]=this.QMPAget1(strar[i],Q);
return result;
} 
function QMPAget1(str,Q) {
var i,j,k,l,chunks,result,line,options,mresult,str1;
chunks=(' '+str+' ').
replace(/<e>/g,"\xF1E").replace(/<m>/g,"\xF1M").
replace(/(<\/e>|<\/m>)/g,"\xF1C").
split(/\xF1/);
result=new Array();k=0;
for (i=0;i<chunks.length;i++) { 
if (chunks[i].charAt(0)=="E") {
line=chunks[i].substr(1);
options=this.mplocal([line]);
mresult=new Array();l=0;
for(j=0;j<options.length;j++) mresult[l++]=this.MPAEval(options[j],Q);
result[k++]=["E",mresult];
}
else if (chunks[i].charAt(0)=="M") {
line=chunks[i].substr(1);
line=line.
replace(/<[0-9]+>/g,"\xF1").
replace(/<\/[0-9]+>/g,"\xF2").
replace(/^[^\xF1]*\xF1/g,"").
replace(/\xF2[^\xF2]*$/g,"").
replace(/\xF2[^\xF1]*\xF1/g,"\xF3");
options=line.split(/\xF3/);
options=this.mplocal(options);
mresult=new Array();l=0;
for(j=0;j<options.length;j++) 
mresult[l++]=QMPMadj(options[j],"AM",Q);
result[k++]=["M",mresult];
}
}
return result;
} 
function ZZLuF(str,Q) {
var i,k,chunks,result,ch;
str=this.QMPA2T(str+"");
chunks=(' '+str+' ').
replace(/<e>/g,"@E").replace(/<m>/g,"@M").
replace(/(<\/e>|<\/m>)/g,"@C").
replace(/<\/?[0-9]+>/g,"").
split(/@/);
result=new Array();k=0;
for (i=0;i<chunks.length;i++) {
ch=chunks[i].charAt(0);
if ((ch=="E")||(ch=="M")) result[k++]=
[ch,this.QMPMadj(chunks[i].substr(1),"S"+ch,Q)];
} 
if (this.MPDebug) alert("Q MPS get:\n"+this.ZZATK(result));
return result;
}
function MPAEval(str,Q) {
var optarr=this.QMPMadj(str,"AE",Q);
var expr="";var i,j,k,a,b,x,names;
if (typeof optarr!="object") {optarr=[optarr];}
var evvars=new Object();
evvars.vnum=0;evvars.names=new Array();
evvars.nump=0;evvars.data=new Array();
evvars.func="";var vartyp=new Array();
evvars.cnst=false;
var vn=0,np=0,ci=0,cl=0,npl=0,npi=0,list,listv;
for(i=0;i<optarr.length;i++) {
if (i==0) {expr=optarr[0];continue;}
var opt=optarr[i];
if (opt.indexOf('var')==0) {
var name="";var typ="";
opt=opt.substring(3).replace(/\s+/g,'');
if ((j=opt.indexOf('='))>0) {
typ="L";name=opt.substring(0,j);
list=this.ZZSUj(opt.substring(j+1));
cl=list.length;if ((npl==0)||(npl>cl)) npl=cl;
} else if ((j=opt.indexOf(':'))>0) {
typ="I";name=opt.substring(0,j);
list=this.ZZSUj(opt.substring(j+1));
cl=list.length;
if(list[2]>2) ci=list[2];else ci=0;
if (cl==0) list=[-10,10];
else if (cl==1) list[1]=list[0]+10;
else list.length=2;
if ((npi==0)||(npi>ci)) npi=ci;
} else {
typ="I";
name=opt;
list=[-10,10];
}
listv=name.split(',');
for(k=0;k<listv.length;k++) if (listv[k]) {
evvars.names[vn]=listv[k];
evvars.data[vn]=list;
vartyp[vn]=typ;vn++;
}    
}
if (npl>=3) np=npl;else if (npi>=3) np=npi;else np=10;
}
evvars.vnum=vn;evvars.nump=np;
if (evvars.vnum>0) {
for (vn=0;vn<evvars.vnum;vn++) {
if (vartyp[vn]=="L") {
cl=evvars.data[vn].length;
if (cl>np) {evvars.data[vn].sort(sortOnRandPosition);}
else if (cl<np) for(j=cl;j<np;j++) evvars.data[vn][j]=evvars.data[vn][j%cl];
} else if (vartyp[vn]=="I") {
a=evvars.data[vn][0];b=evvars.data[vn][1];
if (!(Math.abs(b-a)>1e-6)) {a=-10;b=10;}
if (a>b) {x=a;a=b;b=x;}
k=0;
while(k<np) {
x=a+Math.random()*(b-a);
for(j=1;j<k;j++) if (Math.abs(x-evvars.data[vn][j])<1e-8) {x=NaN;break;}
if (isFinite(x)) evvars.data[vn][k++]=x;
}
}
}
} 
if (evvars.vnum>0) {
names=evvars.names.join(',');
if ((names.indexOf('c')<0)&&(expr.search(/\s*\+\s*[cC]\s*$/)>0)) {
expr=expr.replace(/\s*\+\s*[cC]\s*$/,'');
evvars.cnst=true;
}
list=parser(expr,names,'d,f');
if ((list+"").indexOf("ERROR")>=0) list=[list+"",new Function('return NaN')];
evvars.func=list[1];
k=Q.evalvars.length;
Q.evalvars[k]=evvars;
expr="F"+k+"("+evvars.names.join(',')+')='+list[0];
} else expr=parser(expr,'','n');
return expr;
}
function ZZApB(Q,ssol) {allsol=Q.mpalg;
if (typeof allsol[0][0]=="string") return QMPcompare1(allsol,ssol,Q);
for (var i=0;i<allsol.length;i++)
if  (QMPcompare1(allsol[i],ssol,Q)) return true;
return false;
} 
function QMPcompare1(asol,ssol,Q) {
var i,j,atype,apart,spart,matching;
if (asol.length!=ssol.length) {return false;}
for(var i=0;i<asol.length;i++) {
atype=asol[i][0];
apart=asol[i][1];
spart=ssol[i][1];
matching=false;
if (atype=="E") for(j=0;j<apart.length;j++)  {
if (this.QFEcompare(Q,apart[j],spart)) {matching=true;break;}
} 
if (atype=="M") for(j=0;j<apart.length;j++) {
if (this.QSScomp(apart[j],spart)) {matching=true;break;}
} 
if (!matching) return false;
}
return true;
}
function QFEcompare(Q,corr,expr) {
corr+="";expr+="";var tol=-1e-8;
var result=true;var a,b,c=0,tmp=0;
if (corr.indexOf('ERROR')>=0) return false;
else if (corr.search(/^F[0-9]/)==0) {
var num=corr.replace(/^F([0-9]+).*$/,'$1')-0;
var evvars=Q.evalvars[num];
var integ=evvars.cnst;
if (integ) {
if ((Q.tolopt)&&(!Q.tolopt.indefi)&& 
(expr.search(/\s*\+\s*[cC]\s*$/)<0)) return false;
expr=(" "+expr+" ").
replace(/([^a-zA-Z])[cC]([^a-zA-Z])/,'$1(0.342675189)$2').
replace(/([^a-zA-Z])[cC]([^a-zA-Z])/,'$1(0.342675189)$2');
} 
var sfunc=this.parser(expr,evvars.names.join(','),'f');
var afunc=evvars.func;
var np=evvars.nump;var vn=evvars.vnum;
var score=(integ)?1:0;
var aNaN=0;
var VA=new Array(vn);
for(var i=0;i<np;i++) {
for(var j=0;j<vn;j++) VA[j]=evvars.data[j][i];
try {a=afunc(VA);} catch(e) {a=NaN;}
try {b=sfunc(VA);} catch(e) {b=NaN;}
if (integ) {b+=c;c+=a-b;}
if (!isFinite(a)) aNaN++;
if (tol>0) score+=(Math.abs(b-a)<=tol)?1:0;
else score+=(Math.abs(b-a)<=(-tol)*Math.max(1e-3+Math.abs(a)+Math.abs(b)))?1:0;
if (score<i-aNaN) {result=false;break;}
} 
if (score<2) result=false;
} else {
if (isFinite(Q.mptol)) tol=Q.mptol-0;
a=corr-0;
if (isFinite(expr)) b=expr-0;
else b=parser(expr,'','n');
if (tol>0) result=(Math.abs(b-a)<=tol);
else result=(Math.abs(b-a)<=(-tol)*Math.max(1e-3+Math.abs(a)+Math.abs(b)));
}
return result; 
}
function mpul(dlm,elm1,elm2) {
var result="<pg><pe><pg>"+elm1+'</pg></pe>';
for(var i=2;i<arguments.length;i++) {
result+='<pg>'+dlm+'</pg><pe><pg>'+arguments[i]+'</pg></pe>';
}
result+='</pg>';
return result;
}
function mplg(elm1,elm2) {
var result="<lg>"+elm1;
for(var i=1;i<arguments.length;i++) result+='<le>'+arguments[i];
result+='</lg>';
return result;
}
function mpnlg(name,elm1,elm2) {
name+='';var t=1;
if ((name.length==1)&&(name>='a')&&(name<='z')) name='='+name;
else {name='';t=0;}
var result='<lg'+name+'>'+arguments[t];
for(var i=t+1;i<arguments.length;i++) result+='<le>'+arguments[i];
result+='</lg'+name+'>';
return result;
}
function mpglobal(strs) {
if (typeof strs !='object') strs=[strs];
var more;var i;var len=strs.length-1;
do {
more=false;
for(i=0;i<=len;i++) {
var str=strs[i];
var newar=mpxpnd1nl(str);
if (newar) {
strs[i]=newar[0];
for(j=1;j<newar.length;j++) strs[++len]=newar[j];
more=true;
}
} 
} while (more);
do {
more=false;
for(i=0;i<=len;i++) {
var str=strs[i];
var newar=mpxpnd1np(str);
if (newar) {
strs[i]=newar[0];
for(j=1;j<newar.length;j++) strs[++len]=newar[j];
more=true;
}
} 
} while (more);
return strs;
}
function mplocal(strs) {
var more;var i;var len=strs.length-1;
do {
more=false;
for(i=0;i<=len;i++) {
var str=strs[i];
var newar=mpxpnd1ul(str);
if (newar) {
strs[i]=newar[0];
for(j=1;j<newar.length;j++) strs[++len]=newar[j];
more=true;
}
} 
} while (more);
do {
more=false;
for(i=0;i<=len;i++) {
var str=strs[i];
var newar=mpxpnd1up(str);
if (newar) {
strs[i]=newar[0];
for(j=1;j<newar.length;j++) strs[++len]=newar[j];
more=true;
}
} 
} while (more);
return strs;
}
function mpxpnd1nl(str) {
var tmp=str+'';
var j=tmp.search(/<lg=[a-z]>/);
if (j<0) return null;
var nam=tmp.charAt(j+4);
tmp=this.Replace(tmp,'<lg='+nam+'>','\xF1\xF2');
tmp=this.Replace(tmp,'</lg='+nam+'>','\xF1');
var parts=tmp.split("\xF1");
var i,k,l,p;p=parts.length;k=1;
var pos=new Array(p);var marks=new Array(p);
for(i=0;i<p;i++) {
pos[i]=[];marks[i]=0;
if (! parts[i]) {parts[i]="";marks[i]=0;}
else if (parts[i].charAt(0)!='\xF2') marks[i]=0;
else {
parts[i]=parts[i].substring(1);
if (parts[i].indexOf('<lg')>=0) {
var p1=parts[i];var p2="";
p1=this.Replace(p1,'<lg','\xF4<lg');
p1=this.Replace(p1,'</lg','\xF5</lg');
while(p2!=p1) {p2=p1;p1=p1.replace(/(\xF4[^\xF5]*)\xF4([^\xF4\xF5]*)\xF5/g,'$1$2');}
p1='\xF5'+p1;p2="";
while(p2!=p1) {p2=p1;p1=p1.replace(/(\xF5[^\xF4]*)<le>/g,'$1\xF3');}
p1=p1.substring(1).replace(/[\xF4\xF5]/g,'');
parts[i]=p1;
} else parts[i]=parts[i].replace(/<le>/g,'\xF3');
if (parts[i].indexOf('\xF3')<0) {marks[i]=0;}
else {
pos[i]=parts[i].split('\xF3');
marks[i]=pos[i].length;k=Math.max(k,marks[i]);
}
}
}
var res=new Array(k);
for (l=0;l<k;l++) {
res[l]="";
for(i=0;i<p;i++) {
if (marks[i]<=0) res[l]+=parts[i];
else res[l]+=pos[i][l%marks[i]];
}
}
return res; 
}
function mpxpnd1np(str) {
var tmp=str+'';
var j=tmp.search(/<pe=[a-z]>/);
if (j<0) return null;
var nam=tmp.charAt(j+4);
tmp=this.Replace(tmp,'<pe='+nam+'>','\xF1\xF2');
tmp=this.Replace(tmp,'</pe='+nam+'>','\xF1');
var parts=tmp.split("\xF1");
var i,k,l,p;p=parts.length;k=0;
var marks=new Array(p);var pos=new Array(p);
for(i=0;i<p;i++) {
if (! parts[i]) {parts[i]="";marks[i]=-1;}
else if (parts[i].charAt(0)!='\xF2') marks[i]=-1;
else {parts[i]=parts[i].substring(1);marks[i]=k;pos[k++]=i;} 
}
var j=this.ZZZrv[k];
var res=new Array(j);
for (l=0;l<j;l++) {
var perm=this.cbperm(k,l);
res[l]="";for(i=0;i<p;i++) {
if (marks[i]<0) res[l]+=parts[i];
else res[l]+=parts[pos[ perm[marks[i]]-1 ]];
}
}
return res; 
}
function mpxpnd1up(str) {
var tmp=str+'';var tmp1='';
if (tmp.indexOf('<pg>')<0) return null;
tmp=this.Replace(tmp,'<pg>','\xF1');
tmp=this.Replace(tmp,'</pg>','\xF2');
tmp=this.Replace(tmp,'<pe>','\xF3');
tmp=this.Replace(tmp,'</pe>','\xF4');
tmp1='';while(tmp1!=tmp) {tmp1=tmp;
tmp=tmp.replace(/\xF1([^\xF1\xF2\xF3\xF4]*)\xF2/g,'$1');
}
var j=tmp.search(/\xF1[^\xF1\xF2]*\xF2/);
if (j<0) {
tmp=this.Replace(tmp,'\xF1','<pg>');
tmp=this.Replace(tmp,'\xF2','</pg>');
tmp=this.Replace(tmp,'\xF3','<pe>');
tmp=this.Replace(tmp,'\xF4','</pe>');
return [tmp];
} 
var k=tmp.indexOf('\xF2',j);
tmp1=this.Replace(this.Replace(tmp.substring(j+1,k),'\xF3','<pe=z>'),'\xF4','</pe=z>');
tmp=tmp.substring(0,j)+tmp1+tmp.substring(k+1);
tmp=this.Replace(tmp,'\xF1','<pg>');
tmp=this.Replace(tmp,'\xF2','</pg>');
tmp=this.Replace(tmp,'\xF3','<pe>');
tmp=this.Replace(tmp,'\xF4','</pe>');
return mpxpnd1np(tmp);
}
function mpxpnd1ul(str) {
var tmp=str+'';var tmp1='';
if (tmp.indexOf('<lg>')<0) return null;
tmp=this.Replace(tmp,'<lg>','\xF1');
tmp=this.Replace(tmp,'</lg>','\xF2');
tmp=this.Replace(tmp,'<le>','\xF3');
tmp1='';while(tmp1!=tmp) {tmp1=tmp;
tmp=tmp.replace(/\xF1([^\xF1\xF2\xF3]*)\xF2/g,'$1');
}
var j=tmp.search(/\xF1[^\xF1\xF2]*\xF2/);
if (j<0) {
tmp=this.Replace(tmp,'\xF1','<lg>');
tmp=this.Replace(tmp,'\xF2','</lg>');
tmp=this.Replace(tmp,'\xF3','<le>');
return [tmp];
}
var k=tmp.indexOf('\xF2',j);
tmp1=tmp.substring(j+1,k);
var tmp0=tmp.substring(0,j);
tmp0=this.Replace(tmp0,'\xF1','<lg>');
tmp0=this.Replace(tmp0,'\xF2','</lg>');
tmp0=this.Replace(tmp0,'\xF3','<le>');
var tmp2=tmp.substring(k+1);
tmp2=this.Replace(tmp2,'\xF1','<lg>');
tmp2=this.Replace(tmp2,'\xF2','</lg>');
tmp2=this.Replace(tmp2,'\xF3','<le>');
var parts=tmp1.split('\xF3');
var res=new Array(parts.length);
for (var i=0;i<parts.length;i++) {
res[i]=tmp0+parts[i]+tmp2;
}
return res;
}
function Hview(mpcode) {
mpcode=Hcleanbefore(mpcode);
var elems=new Array();
var ce=-1,lvl=9,str='',gce=-1;
var tmp=Hmarklevel('<H>'+mpcode+'</H>',lvl);
lvl=tmp[0];str=tmp[1];
if (lvl<0) {
if (this.MPDebug) alert(str);
return "<table><tr><td>ANSWER PALETTE CODE ...</td></tr></table>";
}
var tb,te,sb,sa,sc,tag,i,j;
while(lvl>9) {
tb=str.indexOf('<'+lvl);
if (tb<0) {lvl--;continue;}
te=str.indexOf('</'+lvl);  
sb=str.substring(0,tb);
sa=str.substring(te+6);
tag=str.charAt(tb+3);
sc=str.substring(tb+5,te);
if (tag=='a') {
sa=sc.replace(/^.*:/,'')+sa;sb+='$integralzc$';
tag='W';sc=sc.replace(/:[^:]*$/,'');
}
if (tag=='l') {tag='L';sc=sc.replace(/:/,'$$arrow$$');} 
var celem=sc.split(":");
if (tag=="H") celem=[sc];
var oelem=new Array(celem.length);
for(i=0;i<celem.length;i++) {
var sce=celem[i];
if (sce.indexOf('@')<0) {
oelem[i]=++ce;
elems[ce]=new Helem('t',[],sce);
continue;
} else if (sce.search(/^@\d+;$/)==0) {
oelem[i]=sce.substring(1,sce.length-1)-0;
continue;
}
sce=sce.replace(/(@\d+;)/g,':$1:').
replace(/::/g,':').
replace(/^:/,'').
replace(/:$/,'');
var celeme=sce.split(":");
var coelem=new Array(celeme.length);
for(j=0;j<celeme.length;j++) {
var scee=celeme[j];
if (scee.charAt(0)=='@') coelem[j]=scee.substring(1,scee.length-1)-0;
else {coelem[j]=++ce;elems[ce]=new Helem('t',[],scee);} 
}
oelem[i]=++ce;elems[ce]=new Helem('H',coelem,'');
}
elems[++ce]=new Helem(tag,oelem,'');
str=sb+'@'+ce+';'+sa;
}
gce=elems.length-2;
elems[gce].setFont(0,elems);
elems[gce].render(elems);
var HTres=elems[gce].oc;
HTres=Hcleanafter(HTres);
return HTres;
}
function Hcleanbefore(str) {
str=str+"";
if (ZZqOM(str)) return str;
str=str.replace(/\\/g,"&#92;").
replace(/@/g,'&#64;').
replace(/%/g,'&#37;').
replace(/\$([a-zA-Z0-9_]*)\$/g,'@$1@').
replace(/\$/g,'&#36;').
replace(/@/g,'$$').
replace(/\$sumze\$/g,'$$sumzc$$').
replace(/\$integral\$/g,'$$integralzc$$');
str=str.replace(/<([bio])>/g,'&o$1;').
replace(/<\/([bio])>/g,'&c$1;');
str=str.replace(/<\/t>/g,"@<\/t>");
str=str.replace(/<t>/g,'').replace(/@<\/t>/g,'');
str=str.replace(/<u>/g,'<x>').
replace(/<\/u>/g,'</x>').
replace(/<v>/g,'<y>').
replace(/<\/v>/g,'</y>').
replace(/<p>([^:]*):/g,'$1<x>').
replace(/<\/p>/g,'</x>').
replace(/<d>([^:]*):/g,'$1<r>').
replace(/<\/d>/g,'</r>').
replace(/<n>([^:]*):/g,'$1<f>').
replace(/<\/n>/g,'</f>').
replace(/<s>([^:]*):/g,'$1$$times$$10<x>').
replace(/<\/s>/g,'</x>');
return str;  
}
function Hcleanafter(str) {
str=str+"";
str=str.replace(/&oo;/g,'&ob;&oi;').
replace(/&co;/g,'&ci;&cb;').
replace(/&o([bi]);/g,'<$1>').
replace(/&c([bi]);/g,'</$1>');
var s="";
while (s!=str) {s=str;str=str.replace(/<([^<>]*)-/g,"<$1\xF1");}
str=str.replace(/(\+|\-|&times;)/g," $1 ").
replace(/> /g,">&nbsp;").replace(/ </g,"&nbsp;<").
replace(/-/g,"&minus;").
replace(/\xF1/g,'-');
return str;
}
function Helem(tag,elems,str) {
this.tag=tag;this.elems=elems;this.str=str;
this.font=0;this.oa=NaN;this.ob=NaN;this.oc='';
this.setFont=HsetFont;this.render=Hrender;
}
function Hmarklevel(s,level0) {s+="";
var stags='ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
var level=level0, maxlevel=-1, result="", endtags=new Array();
var tb=0,te=-1,tag="",ch="";
while (true) {
tb=s.indexOf("<",te+1);
if (tb<0) {result+=s.substring(te+1);break;}
result+=s.substring(te+1,tb);ch=s.charAt(tb+1);
if (ch=='/') {tag=s.charAt(tb+2);te=tb+3;}
else {tag=ch;te=tb+2;}
if ((s.charAt(te)!='>')||(stags.indexOf(tag)<0)) return [-1,
'ERROR: Unknown tag or missing ">"\n'+
s.substring(0,tb)+"\n"+s.substring(tb)];
if (ch==tag) {
result+="<"+(++level)+tag+">";
maxlevel=Math.max(maxlevel,level);
endtags[level-level0]=[tb,tag];
} else {
if (endtags[level-level0][1]!=tag) {
if (level != level0) break;
else return [-2,'ERROR: Extra "</'+tag+'>".\n'+
s.substring(0,tb)+"\n"+s.substring(tb)];
} 
result+="</"+(level--)+tag+">";
} 
} 
if (level != level0) {
tb=endpos[level-level0][0];tag=endtags[level-level0][1];
return [-3,'ERROR: Tag "<'+tag+'>" not closed.\n'+
s.substring(0,tb)+"\n"+s.substring(tb)];
} 
return [maxlevel,result];
}
function HsetFont(font,allelems) {
this.font=font;
if (this.tag=='t') {
var style="";
if ((this.str.length>1)&&(this.str.indexOf(' ')>=0)) style="white-space:nowrap;";
if (font&1) style+="font-weight:bold;";
if (font&2) style+="font-style:italic;";
if (font>7) style+="font-size:0.6em;";
else if (font>3) style+="font-size:0.8em;";
if (style) this.str='<span style="'+style+'">'+this.str+'</span>';
return;
} 
var i;var parts=new Array(this.elems.length);
for(i=0;i<this.elems.length;i++) parts[i]=allelems[this.elems[i]];
if ("uvxywlWL".indexOf(this.tag)>=0) {
for(i=0;i<parts.length;i++) parts[i].setFont(font+4,allelems);
} else if (this.tag=='h') {
parts[0].setFont(font+4,allelems);
parts[1].setFont(font+4,allelems);
parts[2].setFont(font,allelems);
parts[3].setFont(font+4,allelems);
parts[4].setFont(font+4,allelems);
} else if (this.tag=='g') { 
parts[0].setFont(font+4,allelems);parts[1].setFont(font,allelems);
} else {
for(i=0;i<this.elems.length;i++) parts[i].setFont(font,allelems); 
}
}
function Hrender(allelems) {
var i,oa,ob,ow,oc,od,oh;
var tag=this.tag;
var mpimages={aleph:[11,12],alpha:[12,9],angle:[12,12],approx:[10,8],
arrow:[10,6],beta:[9,15],box:[10,20],braceleft:[7,30],braceright:[7,30],
bracketleft:[4,30],bracketright:[4,30],calpha:[10,10],cbeta:[9,10],cchi:[12,10],
cdelta:[9,10],cepsilon:[9,10],ceta:[12,10],cgamma:[9,10],chi:[10,13],
cifraktur:[12,12],cintegralzc:[10,25],ciota:[6,10],ckappa:[10,10],pi:[9,9],
clambda:[11,10],cmu:[12,10],cnu:[10,10],colon:[8,11],comega:[10,12],
comicron:[10,12],cphi:[12,10],cpi:[10,10],cpsi:[12,11],crho:[10,10],
csigma:[9,10],ctau:[10,10],ctheta:[9,10],cupsilon:[10,10],cupsilon1:[9,13],
cxi:[11,11],czeta:[10,11],degree:[6,4],delta:[7,12],derivative:[4,10],
derivative2:[8,10],div:[8,9],dotmath:[5,11],doubledot:[11,8],element:[10,9],
ellipsis:[13,8],empty:[14,13],epsilon:[8,9],eta:[9,10],gamma:[9,12],geq:[8,12],
gt:[8,11],infty:[11,8],integralzc:[7,25],intersect:[13,8],iota:[6,10],
kappa:[10,10],lambda:[12,11],lang:[6,22],leq:[9,12],lt:[8,11],mu:[9,11],neq:[9,9],
nu:[10,9],omega:[11,9],omega1:[12,10],omicron:[9,9],parenleft:[6,22],
parenleftzd:[6,30],parenright:[6,22],parenrightzd:[7,30],partialdiff:[8,12],
phi:[10,15],phi1:[9,12],plusminus:[8,11],psi:[11,12],rang:[6,22],rho:[8,12],
sigma:[9,9],sigma1:[9,12],singledot:[6,8],sumzc:[20,25],tau:[7,9],theta:[9,12],
theta1:[10,10],times:[9,10],triangle:[15,15],union:[12,10],upsilon:[10,9],
xbar:[7,9],xi:[10,17],zeta:[8,16],
arrowup:[7,11],arrowdown:[7,11],arrowright:[13,11],arrowleft:[13,11],
arrowne:[11,11],arrownw:[11,11],arrowse:[11,11],arrowsw:[11,11],
oanglene:[13,11],oanglenw:[13,11],oanglese:[13,11],oanglesw:[13,11],
rarrclock:[7,11],rarrcount:[7,11],scriptr:[13,11]};
var mpentities={colon:"&#58;",lt:"&#60;",gt:"&#62;",at:"&#64;"};
if (tag=='t') {
if (this.font>7) {oa=4;ob=4;}
else if (this.font>3) {oa=6;ob=6;}
else {oa=8;ob=8;}
oc=this.str;
if (oc.indexOf('$')>=0) {
var sar=oc.split('$');
for(i=0;2*i+1<sar.length;i++) {
if (mpentities[sar[2*i+1]]) {
sar[2*i+1]=mpentities[sar[2*i+1]];
} else if (mpimages[sar[2*i+1]]){
var ih=Math.round((mpimages[sar[2*i+1]][1]+1)/2);
var va="";
if (ih>11) va='style="vertical-align:middle;" ';
oa=Math.max(oa,ih);ob=Math.max(ob,ih);
sar[2*i+1]=
'<img '+va+'src="chars/mp/'+sar[2*i+1]+
'.gif" height="'+mpimages[sar[2*i+1]][1]+
'" width="'+mpimages[sar[2*i+1]][0]+'">';
} else sar[2*i+1]="???"+sar[2*i+1]+'???';
}
oc=sar.join('');
} 
this.oa=oa;this.ob=ob;this.oc=oc;
return;
}
var i,result;var parts=new Array(this.elems.length);
for(i=0;i<this.elems.length;i++) {
parts[i]=allelems[this.elems[i]];
parts[i].render(allelems);
} 
if (tag=='H') {oa=-10;ob=-10;
for(i=0;i<parts.length;i++) {
oa=Math.max(oa,parts[i].oa);
ob=Math.max(ob,parts[i].ob);
} 
result='<table cellpadding="0" cellspacing="0" height="'+(oa+ob)+'"><tr>';
for(i=0;i<parts.length;i++) {
od=Math.round((ob-oa+parts[i].oa-parts[i].ob)/2);
if (Math.abs(od)>1) 
result+='<td><div style="position:relative;bottom:'+od+'"\n>'+parts[i].oc+'</div></td>';
else 
result+='<td>'+parts[i].oc+'</td>';
}
result+='</tr></table>';
this.oa=oa;this.ob=ob;this.oc=result;
} else if (tag=='f') {
oa=parts[0].oa+parts[0].ob;ob=parts[1].oa+parts[1].ob+1;;oh=oa+ob;
var showHeight=(isFinite(oh))?' height="'+oh+'"':'';
result=
'<table border=0 cellpadding="0" cellspacing="0"'+showHeight+'\n>'+
'<tr><td width="4"></td><td align="center">'+parts[0].oc+'</td><td width="4"></td></tr\n>'+
'<tr><td colspan="3" style="background:#000000;" height="1"></td></tr\n>'+
'<tr><td width="4"></td><td align="center">'+parts[1].oc+'</td><td width="4"></td></tr>'+
'</table>';
this.oa=oa;this.ob=ob;this.oc=result;
} else if (tag=='g') {
var rh=parts[1].oa+parts[1].ob;
var hh=Math.max(15,5*Math.floor(.2*rh+.4));
var img="diagz"+String.fromCharCode(94+hh/5)+".gif";
var rad=parts[1].oc;var idx=parts[0].oc;
var result=
'<table cellpadding="0" cellspacing="0" border="0"><tr\n><td width="1"></td><td align="right"'+
' valign="top" rowspan="2"\n>'+idx+'</td><td></td\n><td valign="bottom"><img height="5" '+
'width="100%" src="chars/radtop.gif"\n></td></tr><tr><td height="'+(hh-8)+'" width="1"></td'+
'><td align="right" rowspan="2" height="'+hh+'"\n><img src="chars/'+img+'"></td><td align="right"'+
' valign="middle" rowspan="2"\n>'+rad+'</td></tr><tr><td width="1" height="8"></td><td align="right"'+
' valign="bottom"\n><img src="chars/radleftn.gif"\n></td></tr></table>';
this.oa=parts[1].oa+8;this.ob=parts[1].ob+2;this.oc=result;
} else if (tag=='r') {
var rh=parts[0].oa+parts[0].ob;
var rad=parts[0].oc;
var hh=Math.max(15,5*Math.floor(.2*rh+.4));
var img="diagz"+String.fromCharCode(94+hh/5)+".gif";
var result=
'<table cellpadding="0" cellspacing="0" border="0"><tr\n><td rowspan="2"></td><td></td\n><td valign="bottom"'+
'><img height="5" width="100%" src="chars/radtop.gif"\n></td></tr><tr><td align="right" rowspan="2" '+
'height="'+hh+'"\n><img src="chars/'+img+'"></td><td align="right" valign="middle" rowspan="2"\n>'+rad+
'</td></tr><tr><td align="right" valign="bottom"\n><img src="chars/radleftn.gif"\n></td></tr></table>';
this.oa=parts[0].oa+6;this.ob=parts[0].ob+2;this.oc=result;
} else if (tag=='x') {
this.oa=parts[0].oa+parts[0].ob+4;this.ob=0;this.oc=parts[0].oc;
} else if (tag=='y') {
this.ob=parts[0].oa+parts[0].ob+4;this.oa=0;this.oc=parts[0].oc;
} else if (tag=='w') {
this.oa=parts[0].oa+parts[0].ob+3;
this.ob=parts[1].oa+parts[1].ob+1;
this.oc='<table cellspacing="0" cellpadding="0">'+
'<tr><td valign="top" align="center">'+parts[0].oc+'</td></tr>'+
'<tr><td height="4"></td></tr>'+
'<tr><td valign="bottom" align="center">'+parts[1].oc+'</td></tr>'+
'</table>';
} else if (tag=='W') {
var dlm=(tag=='w')?1:5;var spc=(tag=='w')?'':'';
this.oa=parts[0].oa+parts[0].ob+5;
this.ob=parts[1].oa+parts[1].ob+5;
this.oc='<table cellspacing="0" cellpadding="0">'+
'<tr><td width="2"></td><td valign="top" align="left">'+parts[0].oc+'</td></tr>'+
'<tr><td colspan="2" height="10"></td></tr>'+
'<tr><td  colspan="2" valign="bottom" align="left">'+parts[1].oc+'</td></tr>'+
'</table>';
} else if (tag=='k') {
this.ob=9;this.oa=9;
this.oc='<table cellspacing="0" cellpadding="0"><tr><td valign="bottom">'+
'<img src="chars/phaser.gif"></td><td>'+
parts[0].oc+'&deg;</td></tr>'+
'<tr><td style="background:#000000;height:1px;" colspan="2"></td></tr></table>';
} else if (tag=='j') {
this.ob=9;this.oa=9;
this.oc='<table cellspacing="0" cellpadding="0">'+
'<tr><td style="background:#000000;height:1px;" colspan="2"></td></tr>'+
'<tr><td>'+parts[0].oc+'</td></tr>'+
'</table>';
} else if (tag=='L') {
this.ob=parts[0].oa+parts[0].ob+8;
this.oa=8;
this.oc='<table cellspacing="0" cellpadding="0">'+
'<tr><td valign="bottom" align="center">lim</td></tr>'+
'<tr><td valign="top" align="center">'+parts[0].oc+'</td></tr>'+
'</table>';
}
}
function MPCleanVersion(str,ver) {
if (! str) return str;
if (ver==1) {
str=ZZoTY(str);
str=str.replace(/\$colon\$/g,':').
replace(/\$gt\$/g,'>').
replace(/\$lt\$/g,'<').
replace(/\$parenleft\$/g,'$$parenleftzd$$').
replace(/\$parenright\$/g,'$$parenrightzd$$').
replace(/\$bracketleftzd\$/g,'[').
replace(/\$bracketrightzd\$/g,']').
replace(/\$braceleftzd\$/g,'{').
replace(/\$bracerightzd\$/g,'}').
replace(/\$sumzc\$/g,'$$sumze$$').
replace(/\$integralzc\$/g,'$$integral$$').
replace(/<\/?[ct123456789]>/g,'');
str=str.replace(/(<[me]>)(<[xywlagfrndps]>)/g,'$1 $2');
str="<t>@"+str+"</t>";
str=str.replace(/<([mexywlagfrndps])>/g,"</t><$1>").
replace(/<\/([mexywlagfrndps])>/g,"</$1><t>@").
replace(/<t>@<\/t>/g,"").replace(/@/g,"");
str=str.replace(/<x>([^<>]*)<\/x>/g,"<t><u>$1</u></t>").
replace(/<y>([^<>]*)<\/y>/g,"<t><v>$1</v></t>").
replace(/<\/t><t><(u|v)>/g,'<$1>').
replace(/<\/(u|v)><\/t><t>/g,'</$1>');
str=str.replace(/(<\/[me]>)/g,'</t>$1').
replace(/(<[me]>)/g,'$1<t>');
str=str.replace(/<\/t><t>/g,'').
replace(/<t><\/t>/g,'');
str=str.replace(/(<[me]>)(<\/[me]>)/g,'$1<t></t>$2').
replace(/(<[me]><t>)/,'$1<c>');
str=ZZRGC(str);
} else if (ver==2) {
str=ZZoTY(str);
str=str.replace(/\$sumze\$/g,'$$sumzc$$').
replace(/\$integral\$/g,'$$integralzc$$').
replace(/<t><u>([^<>]*)<\/u><\/t>/g,"<x>$1</x>").
replace(/<t><v>([^<>]*)<\/v><\/t>/g,"<y>$1</y>").
replace(/<\/?[t123456789]>/g,'');
str=ZZRGC(str);
}
return str;
}
function norm_angle(oa,a) {
if (isFinite(oa)) {
oa-=0;a-=0;
if (oa<0) {oa=-oa;a+=180;}
a=a%360;if (a<0) a+=360;
} else {
oa+="";a-=0;
var oa2q,q2oa,q=-1;
oa2q={oanglene:1,oanglenw:2,oanglesw:3,oanglese:4};
q2oa="oanglene,oanglenw,oanglesw,oanglese".split(',');
if (typeof oa2q[oa]!="undefined") {
q=oa2q[oa];
if (a<0) {q=5-q;a=-a;}
if (a>=360) {a=a%360;}
if (a>=180) {a=a-180;q=(q%2)?4-q:6-q;}
if (a>90)  {a=180-a;q=(q<3)?3-q:7-q;}
oa=q2oa[q-1];
} 
} 
return [oa,a];
}
function count(s) {
for(var i=0;i<arguments.length;i++) s+=","+arguments[i];
return this.ZZSUj(s).length;
}
function mean(s) {
for(var i=0;i<arguments.length;i++) s+=","+arguments[i];
var numarr=this.ZZSUj(s);var sum=0;
for(var i=0;i<numarr.length;i++) sum+=numarr[i];
return this.r007(sum/numarr.length);
}
function median(s) {
for(var i=0;i<arguments.length;i++) s+=","+arguments[i];
var numarr=this.ZZSUj(s).sort(this.sortOnNumPosition);
var n=numarr.length;
if (n%2==1) return numarr[(n-1)/2];
else return (numarr[n/2-1]+numarr[n/2])/2;
}
function moment(s,k) {
for(var i=0;i<arguments.length-1;i++) s+=","+arguments[i];
k=arguments[arguments.length-1];
var numarr=this.ZZSUj(s);var sum=0;
for(var i=0;i<numarr.length;i++) sum+=Math.pow(numarr[i],k);
return this.r007(sum);
}
function sdv(s) {
for(var i=0;i<arguments.length;i++) s+=","+arguments[i];
var numarr=this.ZZSUj(s);
var sum=0;var sum2=0;var n=numarr.length;
for(var i=0;i<n;i++) {sum+=numarr[i];sum2+=numarr[i]*numarr[i];}
return this.r007((sum2-sum*sum/n)/(n-1));
}
function ssd(s) {
for(var i=0;i<arguments.length;i++) s+=","+arguments[i];
var numarr=this.ZZSUj(s);
var sum=0;var sum2=0;var n=numarr.length;
for(var i=0;i<n;i++) {sum+=numarr[i];sum2+=numarr[i]*numarr[i];}
return this.r007(Math.sqrt((sum2-sum*sum/n)/(n-1)));
}
function bestfit(type,x,y) {
var xarr=this.ZZSUj(x);
var yarr=this.ZZSUj(y);
var n=xarr.length;
if (!( (n>0) && (n==yarr.length) )) return NaN;
var sx=0,sx2=0,sy=0,sy2=0,sxy=0;
for(var i=0;i<n;i++) {
sx+=xarr[i];sy+=yarr[i];sxy+=xarr[i]*yarr[i];
sx2+=xarr[i]*xarr[i];sy2+=yarr[i]*yarr[i];
}
var a=(sy*sx2-sx*sxy)/(n*sx2-sx*sx);
var b=(n*sxy-sx*sy)/(n*sx2-sx*sx);
if ((type=="a")||(type==0)) return this.r007(a);
else if ((type=="b")||(type==1)) return this.r007(b);
else if ((type=="v")||(type==-1)) {
var zarr=new Array();
for(var i=0;i<n;i++) zarr[i]=this.r007(a+b*xarr[i]);
return zarr.join(", ");
}
else return NaN;
}
function stdest(yo,yp) {
var xarr=this.ZZSUj(yo);
var yarr=this.ZZSUj(yp);
var n=xarr.length;
if (!( (n>2) && (n==yarr.length) )) return NaN;
var rs=0;for(var i=0;i<n;i++) rs+=(xarr[i]-yarr[i])*(xarr[i]-yarr[i]);
return this.r007(Math.sqrt(rs/(n-2)));
}
function corrcoef(x,y) {
var xarr=this.ZZSUj(x);
var yarr=this.ZZSUj(y);
var n=xarr.length;
if (!( (n>0) && (n==yarr.length) )) return NaN;
var sx=0,sx2=0,sy=0,sy2=0,sxy=0;
for(var i=0;i<n;i++) {
sx+=xarr[i];sy+=yarr[i];sxy+=xarr[i]*yarr[i];
sx2+=xarr[i]*xarr[i];sy2+=yarr[i]*yarr[i];
}
return this.r007( (n*sxy-sx*sy) / Math.sqrt( (n*sx2-sx*sx)*(n*sy2-sy*sy) ) );
}
function getrank(list) {
var xarr=this.ZZSUj(list);
var n=xarr.length;if (!(n>0)) return null;
var srtranks=new Array();for(var i=0;i<n;i++) srtranks[i]=new Array(i,xarr[i]);
srtranks.sort(new Function("a","b","return (b[1]-a[1])"));
var ranks=new Array();for(var i=0;i<n;i++) ranks[srtranks[i][0]]=i+1;
return ranks.join(", ");
}
function rankcorr(x,y) {
var xarr=this.ZZSUj(getrank(x));
var yarr=this.ZZSUj(getrank(y));
var n=xarr.length;
if (!( (n>1) && (n==yarr.length) )) return NaN;
var rs=0;for(var i=0;i<n;i++) rs+=(xarr[i]-yarr[i])*(xarr[i]-yarr[i]);
return this.r007(1.0- ( (6*rs) / (n * (n*n-1) ) ) );
}
function bpd(p,n,r) {p-=0;n-=0;r-=0;
if ((p>=0)&&(p<=1)&&(n>=r)&&(r>=0)) return this.r007(this.comb(n,r)*Math.pow(p,r)*Math.pow(1-p,n-r));
else return NaN;
}
function snd(z) {z-=0;
if ((!z)||(z<0)) return 0;
return this.r007(this.normald(z)-0.5);
}
function sndinv(y) {y-=0;
if ((y>0)&&(y<0.5)) return this.r007(this.ZZNUP(y+0.5));
else return 0;
}
function tdist(m,x,df) {
var alpha=0;df=df-0;
if ((m==0)||(m=='c')) alpha=1-x;
else if ((m==1)||(m=='a1')) alpha=2*x;
else if ((m==2)||(m=='a2')) alpha=x-0;
if ((alpha>0)&&(alpha<1)&&(df>0)) return this.r007(this.ZZBfd(df,alpha));
else return NaN;
}
function chidist(df,val) {
df=0.5*df;val=1.0-val;
if ( df < 0.5 || val < 0.0 || val >= 1.0) return NaN;
else if ( val == 0.0 ) return 0.0;
var val0=val-1e-8;var val1=val+1e-8;
var x0,x1,x2,y0,y1,y2;
x0=1.0;y0=this.ZZWEM(df,0.5);
if ( y0<val1 && y0>val0 ) return this.r007(1.0);
x1=x0;y1=y0;
while (y1<val) {
x0=x1;y0=y1;
y1=this.ZZWEM(df,x0);
x1*=2.0;
};if (y1<val1) return this.r007(x1);
while (y0>val) {
x1=x0;y1=y0;
x0*=0.5;y0=this.ZZWEM(df,0.5*x0);
};if (y0>val0) return this.r007(x0);
while (x1-x0>1e-4) {
x2=x0+((val-y0)/(y1-y0))*(x1-x0);
y2=this.ZZWEM(df,0.5*x2);
if ( y2<val1 && y2>val0 ) return this.r007(x2);
else if (y2<val) {x0=x2;y0=y2;}
else {x1=x2;y1=y2;}
}
return this.r007((x0+x1)*0.5);
}
function chidistinv(df,b) {df=Math.round(df);b-=0;
if ((b>0)&&(df>=1)) return this.r007(this.ZZqnm(df*0.5,b*0.5));
else return 0;
}
function fdist(x,y,val) {
x-=0;y-=0;val=1.0-val;
if (!((x>0)&&(y>0)&&(val>0)&&(val<1))) return NaN;
if (val<1e-8) return 0.0;
var a=y*0.5;
var b=x*0.5;
var c=this.ZZDAk(a,b,1.0);
var valOne=c-this.ZZDAk(a,b,(a/(a+b)));
if (Math.abs(val-valOne)<1e-8) return 1.0;
var x0=1.0,y0=valOne,x1=1.0,y1=valOne,x2,y2;
var val0=val-1e-8;val1=val+1e-8;
while (y1<val) {
x0=x1;y0=y1;x1*=2.0;
y1=c-this.ZZDAk(a,b,(a/(a+b*x1)));
}
if (y1<val1) return this.r007(x1);
while (y0>val) {
x1=x0;y1=y0;x0*=0.5;
y0=c-this.ZZDAk(a,b,(a/(a+b*x0)));
}
if (y0>val0) return this.r007(x0);
while (x1-x0>1e-4) {
x2=x0+((val-y0)/(y1-y0))*(x1-x0);
y2=c-this.ZZDAk(a,b,(a/(a+b*x2)));
if ( y2<val1 && y2>val0 ) return this.r007(x2);
else if (y2<val) {x0=x2;y0=y2;}
else {x1=x2;y1=y2;}
}
x2=(x0+x1)/2;
return this.r007(x2);
}
function fdistinv(x,y,b) {
x=Math.round(x);y=Math.round(y);b-=0;
if ((x>0)&&(y>0)&&(b>0)) {
x*=0.5;y*=0.5;
b=this.ZZDAk(y,x,1.0)-this.ZZDAk(y,x,(y/(y+b*x)));
return this.r007(1.0-b);
} 
else return 0;
}
function polevl(x,coef,N ){var ans=coef[0];for(i=1; i<=N; i++) ans = ans*x+coef[i];return ans;}
function p1evl(x,coef,N ) {var ans=x+coef[0];for(i=1;i<N; i++) ans = ans*x+coef[i];return ans;}
function beta(a,b) {
y = this.gamma(a + b);if (y != y) return NaN;else if ( y == 0.0 ) return 1.0;
if( a > b ) {y = this.gamma(a)/y;y *= this.gamma(b);}
else   {y = this.gamma(b)/y;y *= this.gamma(a);}
return (y);
}
function gamma(x) {
var p, z, i;var q = Math.abs(x);
var P = new Array(1.60119522476751861407E-4, 1.19135147006586384913E-3, 
1.04213797561761569935E-2,4.76367800457137231464E-2, 2.07448227648435975150E-1, 
4.94214826801497100753E-1, 0.999999999999999996796);
var Q = new Array(-2.31581873324120129819E-5,5.39605580493303397842E-4,
-4.45641913851797240494E-3,1.18139785222060435552E-2,3.58236398605498653373E-2,
-2.34591795718243348568E-1,7.14304917030273074085E-2,1.00000000000000000320E0 );
if( q > 33.0 ) {
if( x < 0.0 ) {
p = Math.floor(q);
if( p == q ) return NaN;
i = p; z = q - p;
if( z > 0.5 ) {p += 1.0;z = q - p;}
z = q * Math.sin( this.PI * z );
if( z == 0.0 ) return NaN;
z = Math.abs(z);
z = this.PI/(z * this.ZZxou(q) );
return -z;
} else {return this.ZZxou(x);}
}
z = 1.0;
while( x >= 3.0 ) {x -= 1.0;z *= x;}
while( x < 0.0 ) {
if( x > -1.E-9 ) {return( z/((1.0 + this.EUGAMMA * x) * x) );}
z /= x; x += 1.0;
}
while( x < 2.0 ) {
if( x == 0.0 ) {return NaN;} 
else if( x < 1.e-9 ) {return( z/((1.0 + this.EUGAMMA * x) * x) );}
z /= x; x += 1.0;
}
if( (x == 2.0) || (x == 3.0) ) return z;
x -= 2.0;
p = this.polevl( x, P, 6 );
q = this.polevl( x, Q, 7 );
return  z * p / q;
}
function ZZDAk(aa,bb,xx ) {
var a, b, t, x, xc, w, y;
var flag = false;
if( aa <= 0.0 || bb <= 0.0 ) return NaN;
if( (xx <= 0.0) || ( xx >= 1.0) ) {
if( xx == 0.0 ) return 0.0;
else if( xx == 1.0 ) return 1.0;
else return NaN;
}
if( (bb * xx) <= 1.0 && xx <= 0.95) {t = this.ZZlkf(aa, bb, xx);return t;}
w = 1.0 - xx;
if( xx > (aa/(aa+bb)) ) {flag = true;a = bb;b = aa;xc = xx;x = w;} 
else {a = aa;b = bb;xc = w;x = xx;}
if( flag  && (b * x) <= 1.0 && x <= 0.95) {
t = this.ZZlkf(a, b, x);
if( t <= this.MACHEP )  t = 1.0 - this.MACHEP;
else            t = 1.0 - t;
return t;
}
y = x * (a+b-2.0) - (a-1.0);
if( y < 0.0 ) w = this.ZZmgO( a, b, x, true );
else          w = this.ZZmgO( a, b, x, false) / xc;
y = a * Math.log(x);t = b * Math.log(xc);
if( (a+b) < this.MAXGAM && Math.abs(y) < this.MAXLOG && Math.abs(t) < this.MAXLOG ) {
t = Math.pow(xc,b);t *= Math.pow(x,a);
t /= a;t *= w;t *= this.gamma(a+b) / (this.gamma(a) * this.gamma(b));
} else { 
y += t + this.ZZaiD(a+b) - this.ZZaiD(a) - this.ZZaiD(b);
y += Math.log(w/a);
if( y < this.MINLOG ) t = 0.0;else t = Math.exp(y);
}
if( flag ) {
if( t <= this.MACHEP )  t = 1.0 - this.MACHEP;
else            t = 1.0 - t;
}
return t;
} 
function ZZmgO(a,b,x,ftype )  {
var xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
var k1, k2, k3, k4, k5, k6, k7, k8;
var r, t, ans, thresh;
var z, z2, z6;
var n;
if (ftype) {z=x;z2=1.0;z6=-1.0;k2 = a + b  ;k6 = b - 1.0;}
else   {z = x / (1.0-x);z2=-1.0;z6=1.0 ;k6 = a + b  ;k2 = b - 1.0;}
k1 = a  ;k3 = a ;k4 = a + 1.0;
k5 = 1.0;k7 = k4;k8 = a + 2.0;
pkm2 = 0.0;qkm2 = 1.0;pkm1 = 1.0;qkm1 = 1.0;
ans = 1.0;r = 1.0;n = 0;
thresh = 3.0 * this.MACHEP;
do {
xk = -( z * k1 * k2 )/( k3 * k4 );
pk = pkm1 +  pkm2 * xk;
qk = qkm1 +  qkm2 * xk;
pkm2 = pkm1;pkm1 = pk;
qkm2 = qkm1;qkm1 = qk;
xk = ( z * k5 * k6 )/( k7 * k8 );
pk = pkm1 +  pkm2 * xk;
qk = qkm1 +  qkm2 * xk;
pkm2 = pkm1;pkm1 = pk;
qkm2 = qkm1;qkm1 = qk;
if( qk != 0 )  r = pk/qk;
if( r != 0 ) {t = Math.abs( (ans - r)/r );ans = r;}
else  t = 1.0;
if( t < thresh ) return ans;
k1 += 1.0;k2 += z2;
k3 += 2.0;k4 += 2.0;
k5 += 1.0;k6 += z6;
k7 += 2.0;k8 += 2.0;
if( (Math.abs(qk) + Math.abs(pk)) > this.INVHLF ) {
pkm2 *= this.EPSHLF;pkm1 *= this.EPSHLF;
qkm2 *= this.EPSHLF;qkm1 *= this.EPSHLF;
}
if( (Math.abs(qk) < this.EPSHLF) || (Math.abs(pk) < this.EPSHLF) ) {
pkm2 *= this.INVHLF;pkm1 *= this.INVHLF;
qkm2 *= this.INVHLF;qkm1 *= this.INVHLF;
}
} while( ++n < 300 );
return ans;
}
function ZZWEM(a,x) {
var ans, ax, c, r;
if( x <= 0 || a <= 0 ) return 0.0;
if( x > 1.0 && x > a ) return 1.0 - this.ZZqnm(a,x);
ax = a * Math.log(x) - x - this.ZZaiD(a);
if( ax < -this.MAXLOG ) return( 0.0 );
ax = Math.exp(ax); 
r = a; c = 1.0; ans = 1.0;
do {r += 1.0;c *= x/r;ans += c;} while( c/ans > this.MACHEP );
return( ans * ax/a );
}
function ZZqnm(a,x ) {
var ans, ax, c, yc, r, t, y, z;
var pk, pkm1, pkm2, qk, qkm1, qkm2;
if( x <= 0 || a <= 0 ) return 1.0;
if( x < 1.0 || x < a ) return 1.0 - this.ZZWEM(a,x);
ax = a * Math.log(x) - x - this.ZZaiD(a);
if( ax < -this.MAXLOG ) return 0.0;
ax = Math.exp(ax);
y = 1.0 - a;z = x + y + 1.0;c = 0.0;
pkm2 = 1.0;qkm2 = x;pkm1 = x + 1.0;qkm1 = z * x;
ans = pkm1/qkm1;
do {
c += 1.0;y += 1.0;z += 2.0;
yc = y * c;
pk = pkm1 * z  -  pkm2 * yc;
qk = qkm1 * z  -  qkm2 * yc;
if( qk != 0 ) {r = pk/qk;t = Math.abs( (ans - r)/r );ans = r;} 
else t = 1.0;
pkm2 = pkm1;pkm1 = pk;
qkm2 = qkm1;qkm1 = qk;
if( Math.abs(pk) > this.INVHLF ) {
pkm2 *= this.EPSHLF;pkm1 *= this.EPSHLF;
qkm2 *= this.EPSHLF;qkm1 *= this.EPSHLF;
}
} while( t > this.MACHEP );
return ans * ax;
}
function ZZaiD(x) {
var p, q, w, z;
var A = new Array ( 8.11614167470508450300E-4, -5.95061904284301438324E-4, 
7.93650340457716943945E-4, -2.77777777730099687205E-3, 8.33333333333331927722E-2);
var B = new Array ( -1.37825152569120859100E3,-3.88016315134637840924E4,
-3.31612992738871184744E5,-1.16237097492762307383E6,-1.72173700820839662146E6,
-8.53555664245765465627E5);
var C = new Array (-3.51815701436523470549E2,-1.70642106651881159223E4,
-2.20528590553854454839E5,-1.13933444367982507207E6,-2.53252307177582951285E6,
-2.01889141433532773231E6);
if( x < -34.0 ) {
q = -x; w = this.ZZaiD(q);p = Math.floor(q);
if( p == q ) return NaN;;
z = q - p;
if( z > 0.5 ) {p += 1.0;z = p - q;}
z = q * Math.sin( this.PI * z );
if( z == 0.0 ) return NaN;;
z = this.LOGPI - Math.log( z ) - w;
return z;
}
if( x < 13.0 ) {
z = 1.0;
while( x >= 3.0 ) {x -= 1.0;z *= x;}
while( x < 2.0 ) {
if( x == 0.0 ) return NaN;;
z /= x; x += 1.0;
}
if( z < 0.0 ) z = -z;
if( x == 2.0 ) return Math.log(z);
x -= 2.0;
p = x * this.polevl( x, B, 5 ) / this.p1evl( x, C, 6);
return( Math.log(z) + p );
}
if( x > 2.556348e305 ) return NaN;;
q = ( x - 0.5 ) * Math.log(x) - x + 0.91893853320467274178;
if( x > 1.0e8 ) return( q );
p = 1.0/(x*x);
if( x >= 1000.0 ) q += (
(7.9365079365079365079365e-4 * p - 2.7777777777777777777778e-3) *p
+ 0.0833333333333333333333) / x;
else q += this.polevl( p, A, 4 ) / x;
return q;
}
function ZZlkf(a,b,x ) {
var s, t, u, v, n, t1, z, ai;
ai = 1.0 / a;u = (1.0 - b) * x;v = u / (a + 1.0);
t1 = v;t = u;n = 2.0;s = 0.0;z = this.MACHEP * ai;
while( Math.abs(v) > z ) {
u = (n - b) * x / n;t *= u;
v = t / (a + n);s += v;n += 1.0;
}
s += t1;s += ai;u = a * Math.log(x);
if( (a+b) < this.MAXGAM && Math.abs(u) < this.MAXLOG ) {
t = gamma(a+b)/(gamma(a)*gamma(b));
s = s * t * Math.pow(x,a);
} else {
t = this.ZZaiD(a+b) - this.ZZaiD(a) - this.ZZaiD(b) + u + Math.log(s);
if( t < this.MINLOG )  s = 0.0;
else               s = Math.exp(t);
}
return s;
}
function ZZxou(x) {
var STIR = new Array (7.87311395793093628397E-4,-2.29549961613378126380E-4,
-2.68132617805781232825E-3,3.47222221605458667310E-3,8.33333333333482257126E-2);
var MAXSTIR = 143.01608;
var w = 1.0/x;
var y = Math.exp(x);
w = 1.0 + w * this.polevl( w, STIR, 4 );
if( x > MAXSTIR ) {
var v = Math.pow( x, 0.5 * x - 0.25 );
y = v * (v / y);
} else {y = Math.pow( x, x - 0.5 ) / y;}
y = this.SQTPI * y * w;
return y;
}
function ZZzKU(x) { 
var T = new Array (9.60497373987051638749E0,9.00260197203842689217E1,
2.23200534594684319226E3,7.00332514112805075473E3,5.55923013010394962768E4);
var U = new Array (3.35617141647503099647E1,5.21357949780152679795E2, 
4.59432382970980127987E3,2.26290000613890934246E4,4.92673942608635921086E4);
var y, z;
if( Math.abs(x) > 1.0 ) return( 1.0 - this.ZZHqR(x) );
z = x * x; y = x * this.polevl( z, T, 4 ) / this.p1evl( z, U, 5 );
return y;
}
function ZZHqR(a) { 
var x,y,z,p,q;
var P = new Array (2.46196981473530512524E-10,5.64189564831068821977E-1,
7.46321056442269912687E0,4.86371970985681366614E1,1.96520832956077098242E2,
5.26445194995477358631E2,9.34528527171957607540E2,1.02755188689515710272E3,
5.57535335369399327526E2);
var Q = new Array (1.32281951154744992508E1,8.67072140885989742329E1,
3.54937778887819891062E2,9.75708501743205489753E2,1.82390916687909736289E3,
2.24633760818710981792E3,1.65666309194161350182E3,5.57535340817727675546E2);
var R = new Array (5.64189583547755073984E-1,1.27536670759978104416E0,
5.01905042251180477414E0,6.16021097993053585195E0,7.40974269950448939160E0,
2.97886665372100240670E0);
S = new Array (2.26052863220117276590E0,9.39603524938001434673E0,
1.20489539808096656605E1,1.70814450747565897222E1,9.60896809063285878198E0,
3.36907645100081516050E0);
if( a < 0.0 )   x = -a;
else            x =  a;
if( x < 1.0 )   return 1.0 - this.ZZzKU(a);
z = -a * a;
if( z < -this.MAXLOG ) {
if( a < 0 )  return( 2.0 );
else         return( 0.0 );
}
z = Math.exp(z);
if( x < 8.0 ) { p = this.polevl( x, P, 8 ); q = this.p1evl( x, Q, 8 );} 
else     { p = this.polevl( x, R, 5 ); q = this.p1evl( x, S, 6 );}
y = (z * p)/q;
if( a < 0 ) y = 2.0 - y;
if( y == 0.0 ) {
if( a < 0 ) return 2.0;
else        return 0.0;
}
return y;
}
function normald(a) { 
var x, y, z;
x = a/Math.sqrt(2.0); z = Math.abs(x);
if( z < Math.sqrt(0.5) ) y = 0.5 + 0.5 * this.ZZzKU(x);
else {
y = 0.5 * this.ZZHqR(z);
if( x > 0 )  y = 1.0 - y;
}
return y;
}
function ZZNUP(y0) {
var P0 = new Array(-5.99633501014107895267E1,9.80010754185999661536E1,
-5.66762857469070293439E1,1.39312609387279679503E1,-1.23916583867381258016E0);
var Q0 = new Array(1.95448858338141759834E0,4.67627912898881538453E0,
8.63602421390890590575E1,-2.25462687854119370527E2,2.00260212380060660359E2,
-8.20372256168333339912E1,1.59056225126211695515E1,-1.18331621121330003142E0);
var P1 = new Array(4.05544892305962419923E0,3.15251094599893866154E1,
5.71628192246421288162E1,4.40805073893200834700E1,1.46849561928858024014E1,
2.18663306850790267539E0,-1.40256079171354495875E-1,-3.50424626827848203418E-2,
-8.57456785154685413611E-4);
var Q1 = new Array(1.57799883256466749731E1,4.53907635128879210584E1,
4.13172038254672030440E1,1.50425385692907503408E1,2.50464946208309415979E0,
-1.42182922854787788574E-1,-3.80806407691578277194E-2,-9.33259480895457427372E-4);
var P2 = new Array(3.23774891776946035970E0,6.91522889068984211695E0,
3.93881025292474443415E0,1.33303460815807542389E0,2.01485389549179081538E-1,
1.23716634817820021358E-2,3.01581553508235416007E-4,2.65806974686737550832E-6,
6.23974539184983293730E-9);
var Q2 = new Array(6.02427039364742014255E0,3.67983563856160859403E0,
1.37702099489081330271E0,2.16236993594496635890E-1,1.34204006088543189037E-2,
3.28014464682127739104E-4,2.89247864745380683936E-6,6.79019408009981274425E-9);
var x, y, z, y2, x0, x1;
var code;
if( (y0 <= 0.0) || ( y0 >= 1.0 ) ) return NaN;
code = 1;y = y0;
if( y > (1.0 - this.EXP2INV) ) {
y = 1.0 - y;
code = 0;
}
if( y > this.EXP2INV ) {
y = y - 0.5;
y2 = y * y;
x = y + y * (y2 * this.polevl( y2, P0, 4)/this.p1evl( y2, Q0, 8 ));
x = x * this.SQTPI; 
return x;
}
x = Math.sqrt( -2.0 * Math.log(y) );
x0 = x - Math.log(x)/x;
z = 1.0/x;
if( x < 8.0 ) x1 = z * this.polevl( z, P1, 8 )/this.p1evl( z, Q1, 8 );
else    x1 = z * this.polevl( z, P2, 8 )/this.p1evl( z, Q2, 8 );
x = x0 - x1;
if( code != 0 ) x = -x;
return x;
}
function ZZSXO(size, t) {
if( size <= 0 ) return NaN;
if( t == 0 ) return( 0.5 );
return 1.0 - 0.5 * this.ZZDAk( 0.5*size, 0.5, size / (size + t * t) );
}
function ZZBfd(size,alpha) {
var cumProb = 1-alpha/2;
var f1,f2,f3;var x1,x2,x3;
x1 = this.ZZNUP(cumProb);
if (size > 200) {return x1;}
f1 = this.ZZSXO(size,x1)-cumProb;
x2 = x1;f2 = f1;
do { 
if (f1>0) x2 = x2/2;
else    x2 = x2+x1;
f2 = this.ZZSXO(size,x2)-cumProb;
} while (f1*f2>0);
do {
x3 = x2 - f2*((x2-x1)/(f2-f1));
f3 = this.ZZSXO(size,x3)-cumProb;
if (Math.abs(f3)<1e-8) return x3;
if (f3*f2<0) {x1=x2; f1=f2;x2=x3; f2=f3;} 
else {f1 *= f2/(f2+f3); x2=x3;f2=f3;}
} while(Math.abs(x2-x1)>0.0001);
if (Math.abs(f2)<=Math.abs(f1)) {return x2;} 
else {return x1;}
}
function ZZmdk(v,x) {
if( x < 0.0 || v < 1.0 ) return 0.0;
return this.ZZWEM( v/2.0, x/2.0 );
}
function ZZtDP(v,val) {
if ( v < 1.0 || val < 0.0 || val >= 1.0) return NaN;
else if ( val == 0.0 ) return 0.0;
var val0=val-1e-8;var val1=val+1e-8;
var x0,x1,x2,y0,y1,y2;
x0=1.0;y0=this.ZZmdk(v,x0);x1=x0;y1=y0;
if ( y1<val1 && y0>val0 ) return x0;
while (y1<val) {x0=x1;y0=y1;x1*=2.0;y1=this.ZZmdk(v,x1);}
if (y1<val1) return x1;
while (y0>val) {x1=x0;y1=y0;x0*=0.5;y0=this.ZZmdk(v,x0);}
if (y0>val0) return x0;
while (x1-x0>1e-4) {
x2=x0+((val-y0)/(y1-y0))*(x1-x0);
y2=this.ZZmdk(v,x2);
if ( y2<val1 && y2>val0 ) return x2;
else if (y2<val) {x0=x2;y0=y2;}
else {x1=x2;y1=y2;}
}
return (x0+x1)*0.5;
}
function uconvert(coef,str1,str2) {
var ar,ar1,ar2,i,j,num,den,str,scoef=coef;
if (arguments.length>=3) {
coef=this.parser(coef)-0;
if (!isFinite(coef) || ! coef) coef=1.0;
str=str1;str1=str2;
} else {str=coef+"";coef=1.0;}
if (isFinite(parseFloat(str))) {
coef*=parseFloat(str);
str=str.replace(/^\s*\d*\.?\d*([eE]-?\d+)?\s*/,'');
str1=str1.replace(/^\s*\/\s*/,'1@');
}
ar=(str+"").split('/');
if (ar.length==1) ar[1]="";
if (! str1) str1="";else str1+="";
if (isFinite(parseFloat(str1))) {
coef/=parseFloat(str1);
str1=(str1+"").replace(/^\s*-?\d*\.?\d*([eE]-?\d+)?\s*/,'');
} 
ar2=(str1+"").split('/');
if (ar2[0]) ar[1]+='*'+ar2[0];
if (ar2[1]) ar[0]+="*"+ar2[1];
str1="";str=";"+ar.join('@')+";";
str=str.replace(/([;@])\s*\*\s*/,'$1').
replace(/\s*\*\s*([;@])/,'$1');
while(str1!=str) {str1=str;
str=str.replace(/(\W)in(\W)/g,'$1inch$2').
replace(/(\W)nm(\W)/g,'$1nmi$2').
replace(/(\W)mt(\W)/g,'$1t$2').
replace(/(\W)sh(ort)?\s*(\w)/g,'$1sh$3').
replace(/(\W)fl(oat)?\s*(\w)/g,'$1fl$3').
replace(/(\W)long\s*(\w)/g,'$1$2').
replace(/(\W)link(\W)/g,'$1li$2').
replace(/(\W)chain(\W)/g,'$1ch$2').
replace(/(\W)grain(\W)/g,'$1gr$2').
replace(/(\W)rod(\W)/g,'$1rd$2').
replace(/(\W)sec(\W)/g,'$1s$2').
replace(/(\W)cental(\W)/g,'$1shcwt$2').
replace(/(\W)parsec(\W)/g,'$1pc$2').
replace(/(\W)hr(\W)/g,'$1h$2').
replace(/(\W)hour(\W)/g,'$1h$2').
replace(/(\W)day(\W)/g,'$1d$2').
replace(/(\W)year(\W)/g,'$1yr$2').
replace(/hz/g,'Hz').
replace(/(\W)(\xC5|&#197;)(\W)/g,'$1ang$3').
replace(/(\W)(&deg;|\^[0Oo]|\xBA|\&#186;|degrees*)\s*([CKF])/g,'$1deg$3').
replace(/(\W)K(\W)/g,'$1degK$2').
replace(/(\W)sq\s*(\w+)(\W)/g,'$1$2<sup>2</sup>$3').
replace(/(\W)cb\s*(\w+)(\W)/g,'$1$2<sup>3</sup>$3');
}
str=str.replace(/&#\d+;|&\w+;|<\/?\w+>/g,'|').
replace(/([0-9\.])[eE](-?\d)/g,'$1#$2').
replace(/[^a-zA-Z0-9\.\-@#]+/g,'|').
replace(/(\d)\./g,'$1,').replace(/\.(\d)/g,',$1').
replace(/\./g,'|').replace(/,/g,'.').
replace(/([0-9\.])([a-zA-Z])/g,'$1|$2').
replace(/([a-zA-Z])([\-0-9\.])/g,'$1|$2').
replace(/,/g,'').replace(/@/g,'|@|').
replace(/\|+/g,'|').replace(/#/g,'E').
replace(/^\|/,'').replace(/\|$/,'');
str=str.replace(/^@/,'1|@').replace(/\|@$/,'');
var inum=1,iden=1,isign=false,cnum=1.0,cidx=1,cpow=0;
if (str.search(/^deg[KFC]\|@\|deg[KFC]$/)==0) {
ar=str.split('|@|');
if ((scoef===0)||(scoef==='0')) coef=0;
return temperatureConvert(coef,ar[0],ar[1]);
}
ar=str.split('|');
for (i=0;i<ar.length;i++) {
if (ar[i]=='@') {
if (isign) {iden*=cidx;coef/=cnum;}
else {inum*=cidx;coef*=cnum;}
cnum=1.0;cidx=1;isign=!isign;
} 
else if (parseInt(ar[i])) {
cpow=parseInt(ar[i]);
cnum=Math.pow(cnum,cpow);
cidx=Math.pow(cidx,cpow);
if (isign) {iden*=cidx;coef/=cnum;}
else {inum*=cidx;coef*=cnum;}
cnum=1.0;cidx=1;
} else if (this.Units[ar[i]]) {
if (isign) {iden*=cidx;coef/=cnum;}
else {inum*=cidx;coef*=cnum;}
cnum=this.Units[ar[i]].val;
cidx=this.Units[ar[i]].dim;
} else return NaN; 
}
if (isign) {iden*=cidx;coef/=cnum;}
else {inum*=cidx;coef*=cnum;}
if (inum/iden==1) return coef;
else return NaN;
}
function initUnitsConvert() {
var ft2m=0.3048;
var lb2kg=0.45359237;
var gal2m3=3.785411784e-3;
var uL={dim:2,mm:1e-3,cm:1e-2,dm:1e-1,m:1,km:1e3,
inch:ft2m/12,ft:ft2m,yd:3*ft2m,mi:5280*ft2m,
nmi:1852,rd:16.5*ft2m,li:0.66*ft2m,fur:660*ft2m,
ch:66*ft2m,fat:6*ft2m,cbl:608*ft2m,ang:1e-10,
pc:3.08567758e16,AU:149598550000};
var uA={dim:4,da:1e3,ha:1e4,acr:4046.8564224};
var uV={dim:8,mL:1e-6,cL:1e-5,dL:1e-4,L:1e-3,floz:gal2m3/128,
flpt:gal2m3/8,flqt:gal2m3/4,gal:gal2m3,
qt:1.101220942715e-3,pt:0.5506104713575e-3};
var uT={dim:5,ms:1e-3,s:1,min:60,h:3600,d:86400,yr:31556952};  
var uM={dim:7,mg:1e-6,g:1e-3,kg:1,t:1e3,mkt:2e-4,lb:lb2kg,
gr:lb2kg/7000,oz:lb2kg/16,st:14*lb2kg,shcwt:100*lb2kg,
cwt:112*lb2kg,shtn:2000*lb2kg,ton:2240*lb2kg};
var uFreq={dim:0.2,Hz:1,kHZ:1e3,MHz:1e6};
var uTemp={dim:3,K:1,degK:1,degC:1,degF:5/9};
var uSpeed={dim:0.4,mph:0.44704,kph:1/3.6,knot:4.63/9,Mach:330}; 
var Units=new Object();
var allUnits=[uL,uA,uV,uT,uM,uFreq,uTemp,uSpeed];
for(var unitSet in allUnits) {
var cdim=allUnits[unitSet].dim;
for(var unit in allUnits[unitSet]) {
if (unit=='dim') continue;
Units[unit]={dim:cdim,val:allUnits[unitSet][unit]};
}
}
return Units;
}
function temperatureConvert(t,scale1,scale2) {
scale1=(scale1+"").replace(/[^KCF]*([KCF]).*/,"$1");
scale2=(scale2+"").replace(/[^KCF]*([KCF]).*/,"$1");
if (scale1==scale2) return t;else t-=0;
if (scale2=="K") return (scale1=="C")?t+273.15:5/9*(t+459.67);
else if (scale2=="F") return (scale1=="C")?1.8*t+32:1.8*t-459.67;
else if (scale2=="C") return (scale1=="K")?t-273.15:5/9*(t-32);
else return NaN;
}
function parseWO(Q) {
var tdstyle=['',
['<td colspan="4" width="100%" align="left">'],
['<td colspan="2" width="40%" align="left">',
'<td colspan="2" width="60%" align="left" style="padding-left:1.5em;">'],
['<td style="white-space:nowrap;">',
'<td style="white-space:nowrap;">',
'<td colspan="2" align="left" style="white-space:nowrap;">'],
['<td style="white-space:nowrap;" width="5%" align="right">',
'<td style="white-space:nowrap;" width="1%" align="center">',
'<td style="white-space:nowrap;" width="5%" align="left">',
'<td style="padding-left:1.5em;" width="89%" align="left">']];
var txt;
if (typeof Q=="string") txt=Q;else txt=Q.wo;
if ((txt.indexOf('<box')<0)&&(txt.lastIndexOf('<step>')==0)) {
txt=txt.replace(/<step>/,"<step=p>");
}
txt=txt.replace(/@/g,"&#64;").
replace(/~/g,"&#126;");
txt=this.parseTags(txt,'step,ostep,pstep','');
txt=txt.replace(/<pstep/g,"<step=p").
replace(/<\/[po]+step>/g,"</step>"); 
txt=txt.replace(/(<o?step)/g,'$1~').
replace(/(<\/step>)/g,'@$1').
replace(/~([^~@]*)<psv>/g,'~=p$1').
replace(/@/g,"").replace(/~/g,"");
txt=txt.replace(/(<o?step)=p(=[^p>]*p)/g,"$1$2");
txt=txt.replace(/^\s*<step>\s*<\/step>\s*$/,"");
if (this.ZZqOM(txt)) txt="NotYetImplemented";
else if (Q.info) Q.info.sol=1;
if (txt.indexOf("</step>")<0) txt="<step=p>"+txt+"</step>";
var steps=new Array();
var p0,p1,p2,p3,mid,typ;
while ((p0=txt.indexOf('<ostep'))>=0) {
p1=txt.indexOf('>',p0)+1;
p2=txt.indexOf('::',p1)+2;
p3=txt.indexOf('</step>',p1)+'</step>'.length;
if ((p2<9)||(p2>p3-5)) txt=txt.substring(0,p0)+txt.substring(p3);
else {
mid=txt.substring(p1,p2-2);
mid=mid.replace(/([0-9\.])=([0-9.])/g,"$1==$2");
if (this.ZZVtv(mid)) txt=txt.substring(0,p0+1)+
txt.substring(p0+2,p1)+txt.substring(p2);
else txt=txt.substring(0,p0)+txt.substring(p3);
} 
}  
txt=txt.replace(/<step/g,'@').
replace(/<\/step>/g,'~').
replace(/^[^@]*@/g,'').
replace(/~[^@]*$/g,'').
replace(/~[^@~]*@/g,'~@');
steps=txt.split("~@");
var i,j,k,bc=-1;
var boxes=new Array();
for(i=0;i<steps.length;i++) {
txt=steps[i];
txt=this.parseTags(txt,'hide','step,ostep,pstep');
txt=this.parseTags(txt,'box','step,ostep,pstep,hide');
p0=txt.indexOf(">");
tag=txt.substring(0,p0).replace(/=/g,'');
txt=txt.substring(p0+1);
while ((p0=txt.indexOf('<box'))>=0) {
bc++;
p1=txt.indexOf('>',p0)+1;
p2=txt.indexOf('</box>',p1);
var bans=txt.substring(p1,p2);
var btag=txt.substring(p0+4,p1-1);
if ((Q.gtol)&&(btag==="")) btag=""+Q.gtol;
boxes[bc]=new UIObj(bans,Q.qid+"W"+(100+bc),btag);
txt=txt.substring(0,p0)+"&UIO"+(100+bc)+";"+txt.substring(p2+6);
}  
var hid1=new Array();
var hid2=new Array();
var hc=-1;
while ((p0=txt.indexOf('<hide>'))>=0) {
hc++;
p1=txt.indexOf('</hide>',p0);
mid=txt.substring(p0+6,p1);
txt=txt.substring(0,p0)+"&HiDe"+(hc)+";"+txt.substring(p1+7);
if ((p1=mid.indexOf('::'))>=0) {
hid1[hc]=mid.substring(0,p1);
hid2[hc]=mid.substring(p1+2);
} else {hid1[hc]="";hid2[hc]=mid;}
}
var txt1=txt;
var txt2=txt;
for(j=0;j<=hc;j++) {
var mid="&HiDe"+j+";";
if ((p1=txt1.indexOf(mid))>=0) txt1=
txt1.substring(0,p1)+hid1[j]+txt1.substring(p1+mid.length);
if ((p2=txt2.indexOf(mid))>=0) txt2=
txt2.substring(0,p2)+hid2[j]+txt2.substring(p2+mid.length);
}
if (txt1 != txt2) tag+="z";
steps[i]=[tag,txt1,txt2];
var parts,mod,html;
for(j=1;j<=2;j++) {
if ((j==2)&&(txt1==txt2)) {steps[i][2]=steps[i][1];break;}
html="<tr>";
parts=steps[i][j].split("::");
while(parts.length>4) {parts[parts.length-2]+=parts[parts.length-1];parts.length--;}
for(k=0;k<parts.length;k++) {
if (tdstyle[parts.length][k].indexOf('nowrap')>0) mod="tN";else mod="t";
parts[k]=this.ZZKQf(parts[k],mod,Q);
parts[k]=parts[k].
replace(/^<table[^>]*>\s*<tr>\s*<td[^>]*>/,'').
replace(/<\/td>\s*<\/tr>\s*<\/table>\s*$/,'');
if ((mod=="tN")&&(parts[k].indexOf("table")<0)
&&(this.browser.I)&&(parts[k].indexOf(' ')>=0)) {
parts[k]="<nobr>"+parts[k]+"</nobr>";
}
html+=tdstyle[parts.length][k]+parts[k]+"</td>";
}
html+="</tr>";
steps[i][j]=html;
}
}
var blcount=0,aboxcount=0;
for(i=0;i<steps.length;i++) {
var control=new Object();
tag=steps[i][0].toLowerCase();
control.tag=tag;
control.w=(tag.indexOf('w')>=0);
control.p=(tag.indexOf('s') <0);
control.a=(tag.indexOf('h') <0);
control.z=(tag.indexOf('z')>=0);
control.z = (control.z || control.a || control.p);
control.b=false;
control.l=false;
if (tag.indexOf('p')>=0) control.n=0;
else if (tag.indexOf('c')>=0) control.n=blcount;
else {control.n=++blcount;control.b=true;}
if (i==steps.length-1) control.l=(control.n>0);
if ((i>=1)&&(tag.indexOf('c')<0)) steps[i-1][0].l=(steps[i-1][0].n>0);
steps[i][0]=control;
if (control.a) {
var j=-1;while((j=steps[i][1].indexOf("&UIO",j+1))>=0) aboxcount++;
}
} 
Q.wtxt=steps;
Q.wiuo=boxes;
Q.info.nlb=aboxcount;
Q.whst=new Array();
}
function _renderSolution(_qid,active,color) {
if (!this.ZZOgi(_qid)) return null;
var Q=this.ZZDBx[_qid];
var tblb='<table cellpadding=3 cellspacing=0 width="'+(this.qwidth-2)+'" border=0>'+
'<colgroup><col width="1*" align="right"><col width="0*" align="center">'+
'<col width="1*" align="left"><col width="6*" align="left"></colgroup><tbody>'+
'<tr height=3><td width="5%"> </td><td width="1%"> </td><td width="5%"> '+
'</td><td width="89%"> </td></tr>';
if (active) tblb=tblb.replace(/border=0/,"border=1");
var report=false;
if (color=='report') {report=true;color='blue';}
var tble='</tbody></table>';
if (! color) color='green';
var i,j,k,bnum,btxt,rows='';
var sbn=0;
for(i=0;i<Q.wtxt.length;i++) {
var stepobj=Q.wtxt[i];
if (stepobj[0].w) rows+=tble+"\n"+tblb;
if ((active||report)&&(sbn<stepobj[0].n)) {
sbn=stepobj[0].n;
rows+='<tr><td colspan=4 align="left"><b>Step '+sbn+'</b></td></tr>';
}
if ((active)&&(! stepobj[0].a)) continue;
if ((! active)&&(! stepobj[0].p)) continue;
var stxt=stepobj[((active)?1:2)];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
if (active) btxt=Q.wiuo[bnum].render(2,1,color);
else btxt=Q.wiuo[bnum].render(2,1);
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
rows+=stxt;
}
rows=rows.replace(/&minus;( *<span[^>]*>| *)&minus;/g,"$1 +").
replace(/\+( *<span[^>]*>| *)&minus;/g,"$1&minus;");
return tblb+rows+tble;
}
function ytsa(_qid,amode) {
if (! amode) amode=0;
if (!this.ZZOgi(_qid)) return "";
if (amode<0) {show_hist(_qid,-amode);return;}
var just_read_answers=false;
if (amode==3) {amode=1;just_read_answers=true;}
var Q=this.ZZDBx[_qid];
var wdoc=Q.YTdoc;
var htmlb=Q.YTtxt;
var steps=Q.wtxt;
var tblb='<table cellpadding=3 cellspacing=0 width="'+(this.qwidth-2)+'" border=0>'+
'<colgroup><col width="1*" align="right"><col width="0*" align="center">'+
'<col width="1*" align="left"><col width="6*" align="left"></colgroup><tbody>'+
'<tr height=3><td width="5%"> </td><td width="1%"> </td><td width="5%"> '+
'</td><td width="89%"> </td></tr>';
var tble='\n</tbody></table>';
var htmle='\n</form></body></html>';
var popuphtmlb='<html><head>'+Q.htmlbase+
'<link HREF="bv_styles.css" REL="stylesheet" TYPE="text/css">'+
'</head>\n<body><form action="about:" onsubmit="return false;">\n';
var popuphtmle='\n<br>&nbsp;<br><center>'+
'<input type="button" value="Close" onclick="window.close()">'+
'</center>\n</form></body></html>';
var wres=new Array();
if (amode==0) {
Q.aliya=new Array();
Q.alica=new Array();
Q.alico=new Array();
}
var rep2=["",""];
var samestep=(amode==2);
var allcorrect=true;
var i,j,k,l,sp,bc,smax,ltxt,stepobj,stxt,cstep=0;
if (amode==0) {
Q.wind=new Array();
Q.wind[0]=0;
htmlb+=tblb;
Q.whst=new Array();
Q.whst[0]=popuphtmlb+tblb+
'<tr><td colspan=4 align="left"><b>Your Answer:</b></td></tr>'+'@@@1'+
'<tr><td colspan=4 align="left"><hr><br><b>Correct Answer:</b></td></tr>'+'@@@2'+
tble+popuphtmle;
}
else {
cstep=Q.wind[0];
Q.alico[cstep]=[0,0];
for(i=1;i<Q.wind.length;i++) {
bc=Q.wind[i];
wres[i-1]=Q.wiuo[bc].getAnswer(wdoc);
if (wres[i-1][0]<1) {allcorrect=false;Q.alico[cstep][1]++;}
else Q.alico[cstep][0]++;
}
if (allcorrect) samestep=false;
if (wres.length>0) rep2=stepReport(wres,samestep);
if (samestep) {
if (wdoc.getElementById("stepreport")) {
wdoc.getElementById("stepreport").innerHTML=rep2[0];
wdoc.getElementById("stepmessage").innerHTML=rep2[1];
}
return;
}
var stcnt=0;
var ltxt1="";var ltxt2="";
for(stcnt=0;stcnt<steps.length;stcnt++) {
if (steps[stcnt][0].n!=Q.wind[0]) continue;
stepobj=steps[stcnt];
if (stepobj[0].w) {
ltxt1+=tble+"\n"+tblb;
ltxt2+=tble+"\n"+tblb;
}
if (! stepobj[0].a)  continue;
stxt=stepobj[1];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
btxt=Q.wiuo[bnum].render(0,2);
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
ltxt1+=stxt;
stxt=stepobj[1];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
btxt=Q.wiuo[bnum].render(0,1);
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
ltxt2+=stxt;
}
var stmp3=Q.whst[0];
stmp3=this.Replace(stmp3,'@@@1',ltxt1);
stmp3=this.Replace(stmp3,'@@@2',ltxt2);
Q.aliya[cstep]=ltxt1;
Q.alica[cstep]=ltxt2;
Q.whst[Q.wind[0]]=stmp3;
}
if (just_read_answers) return cstep;
bc=Q.wind[0];sp=0;smax=steps.length;
if (amode>0) {
ltxt="";
while((steps[sp][0].n!=bc)||(! steps[sp][0].b)) sp++;
if (! allcorrect) {
rep2[0]='<input type="image" '+
'onclick="javascript:parent.ytsa(\''+_qid+'\',-'+Q.wind[0]+');return false" '+
'src="../bernstyle/viewer/chars/yt_mag.gif" alt="Details" '+
'onmouseover="this.src=\'../bernstyle/viewer/chars/yt_mag_over.gif\'" '+ 
'onmousedown="this.src=\'../bernstyle/viewer/chars/yt_mag_down.gif\'" '+ 
'onmouseup="this.src=\'../bernstyle/viewer/chars/yt_mag_over.gif\'" '+ 
'onmouseout="this.src=\'../bernstyle/viewer/chars/yt_mag.gif\'" '+ 
'border="0" width=34 height=26 >';
}
ltxt='<tr height=30><td colspan=4>'+
'<table width="100%"><tr><td width="100" valign="middle" align="left">'+
'<b>Step '+bc+':</b>'+
'</td><td valign="middle" align="right">'+
rep2[0]+'</td></tr></table></td></tr>\n';
while(steps[sp][0].n==bc) {
stepobj=steps[sp];
if (stepobj[0].w) ltxt+=tble+"\n"+tblb;
if (! stepobj[0].p) {if (++sp==smax) break;else continue;}
stxt=stepobj[2];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
if (Q.wiuo[bnum].grade<=0) btxt=Q.wiuo[bnum].render(2,1,'red');
else btxt=Q.wiuo[bnum].render(2,1,'green');
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
ltxt+=stxt;
if (++sp==smax) break;
}
htmlb+=ltxt;
}
var has_hide=false;
while((sp<smax)&&(steps[sp][0].n==0)) {
ltxt="";
while(steps[sp][0].n==0) {
if (steps[sp][0].z) has_hide=true;
stepobj=steps[sp];
if (stepobj[0].w) ltxt+=tble+"\n"+tblb;
stxt=stepobj[2];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
btxt=Q.wiuo[bnum].render(2,1);
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
ltxt+=stxt;
if (++sp==smax) break;
}
htmlb+=ltxt;
}
Q.YTtxt=htmlb;
ltxt="";
if (sp<smax) {
bc++;
Q.wind=new Array();
Q.wind[0]=bc;
ltxt='<tr height=30><td colspan=4>'+
'<table width="100%"><tr><td width="100" valign="middle" align="left">'+
'<b>Step '+bc+':</b>'+
'</td><td valign="middle" align="right" id="stepreport">'+
'</td></tr></table></td></tr>\n';
while(steps[sp][0].n==bc) {
if (steps[sp][0].z) has_hide=true;
stepobj=steps[sp];
if (stepobj[0].w) ltxt+=tble+"\n"+tblb;
if (! stepobj[0].a)  {if (++sp==smax) break;else continue;}
stxt=stepobj[1];
while((j=stxt.indexOf('&UIO'))>=0) {
k=stxt.indexOf(';',j);
bnum=stxt.substring(j+4,k)-100;
Q.wind[Q.wind.length]=bnum;
btxt=Q.wiuo[bnum].render(0,0);
stxt=stxt.substring(0,j)+btxt+stxt.substring(k+1);
}
ltxt+=stxt;
if (++sp==smax) break;
}
var abtxtb= '<tr><td colspan=4 style="font-weight:900">'+
'<table width="100%"><tr><td valign="middle" align="left">';
var abtxtm= '</td><td valign="middle" align="center" id="stepmessage">'+
'</td><td valign="middle" align="right">';
var abtxte= '</td></tr></table></td></tr>';
var abcheck='&nbsp;&nbsp;&nbsp;&nbsp;'+
'<input type="image" '+
'onClick="parent.ytsa(\''+_qid+'\',2);return false" '+
'src="../bernstyle/viewer/chars/yt_check.gif" alt="Check" '+
'onmouseover="this.src=\'../bernstyle/viewer/chars/yt_check_over.gif\'" '+ 
'onmousedown="this.src=\'../bernstyle/viewer/chars/yt_check_down.gif\'" '+ 
'onmouseup="this.src=\'../bernstyle/viewer/chars/yt_check_over.gif\'" '+ 
'onmouseout="this.src=\'../bernstyle/viewer/chars/yt_check.gif\'" '+ 
'border="0" width=74 height=26 >';
var abnext='<input type="image" '+
'onClick="parent.ytsa(\''+_qid+'\',1);return false" '+
'src="../bernstyle/viewer/chars/yt_next.gif" alt="Next" '+
'onmouseover="this.src=\'../bernstyle/viewer/chars/yt_next_over.gif\'" '+
'onmousedown="this.src=\'../bernstyle/viewer/chars/yt_next_down.gif\'" '+
'onmouseup="this.src=\'../bernstyle/viewer/chars/yt_next_over.gif\'" '+
'onmouseout="this.src=\'../bernstyle/viewer/chars/yt_next.gif\'" '+
'border="0" width=74 height=26 >'+
'&nbsp;&nbsp;&nbsp;&nbsp;';
if (Q.wind.length==1) {
abcheck="&nbsp;";
if ((! has_hide)&&(sp==smax)) abnext="&nbsp;";
}
ltxt+=abtxtb+abcheck+abtxtm+abnext+abtxte;
}
var result=htmlb+ltxt+tble+htmle;
result=result.replace(/&minus;( *<span[^>]*>| *)&minus;/g,"$1 +").
replace(/\+( *<span[^>]*>| *)&minus;/g,"$1&minus;");
result=this.fix_box_sup(result);
if (amode==0) return result;
wdoc.open();
wdoc.clear();
wdoc.writeln(result);
wdoc.close();
return false;
}
function stepReport(results,show_all) {
var wrong_img='&nbsp;<img src="../bernstyle/viewer/chars/yt_wrong.gif" width=20 height=20 alt="Watch this step.">';
var right_img='&nbsp;<img src="../bernstyle/viewer/chars/yt_correct.gif" width=20 height=20 alt="Correct! Good job!">';
var try_again='<span style="color:red">Try Again !</span>';
var no_answer='<span style="color:red">Please, answer first, then click "Check".</span>';
var no_answer_D='<span style="color:red">Please select an item from the menu.</span>';
var no_answer_B='<span style="color:red">Please enter a value in the textbox.</span>';
var allcorrect=true;
var allempty=true;
var txt1="",txt2="",cimg="";
var i=0,j=0,l=0;
for(i=0;i<results.length;i++) {
if (results[i][0]>=0) allempty=false;
if (results[i][0]<1) allcorrect=false;
}
if (allempty) {
txt1='<table cellspacing=0 cellpadding=0><tr><td>Your Answer&nbsp;:&nbsp;None Given&nbsp;'+
'</td><td>'+wrong_img+'</td></tr></table>';
if (results.length>1) txt2=no_answer;
else if (results[0][0]==-2) txt2=no_answer_D;
else txt2=no_answer_B;
} else if (allcorrect) {
txt1=right_img;txt2="";
} else {
txt1="<table cellspacing=0 cellpadding=0><tr><td>Your Answer&nbsp;:&nbsp;</td>";
j=0;
for(i=0;i<results.length;i++) {
if ((! show_all)&&(results[i][0]>0)) continue;
else if (results[i][0]>0) cimg=right_img;
else cimg=wrong_img;
if (j>0) txt1+="<tr><td></td>";else j++;
txt1+='<td align="right">'+results[i][1]+"</td><td>"+cimg+"</td></tr>";
}
txt1+="</table>";
txt2=try_again;
}
return [txt1,txt2];
}
function show_hist(_qid,stepnum) {
var win=window.open("",'yt_hst',
'scrollbars=yes,resizable=yes,width='+(this.qwidth+50)+',height=300');
var txt=this.ZZDBx[_qid].whst[stepnum];
win.document.writeln(txt);
win.document.close();
if( win.focus ) win.focus();
}
