var Phi = (Math.sqrt(5)+1)/2 ,  phi = (Math.sqrt(5)-1)/2, Pi=Math.PI;var myErr=false; //self.onerror=function(ErrMsg,URL,LineNb){if(myErr){halt(ErrMsg+"\r");return true}else{return false}};function halt(msg){alert(msg);ERROR()};function DoERROR(){return false};function resetERROR(){self.onerror=DoERROR;return true};function HALT(msg){alert("**Error**\r"+msg);//self.onerror=resetERROR;   ERROR();};function ECHO(txt){alert(txt);return txt};function getArgs(opts){  if(arguments.length==0)opts=location.search.substring(1);  //alert("getArgs "+opts);  var args=new Object();  var pairs=opts.split(",");  //if(pairs.length>0)alert("getArgs "+pairs);  for(var i=0;i<pairs.length;i++)  { var pos=pairs[i].indexOf("=");	if(pos==-1)args[pairs[i]]=true  //allow ids with no values	else args[pairs[i].substring(0,pos)]=pairs[i].substring(pos+1);   };   return args };var outF;function clearmsg(F){ if(arguments.length==0)F=outF;    document.getElementById('msg'+F).innerHTML=''};   function putmsg(txt){     var olist = document.getElementById('msg'+outF);        olist.innerHTML += txt+"<br>";        olist.scrollTop = olist.scrollHeight;        olist.scrollLeft=0;};function isInt(i){return i.toString()!="" && i.toString().indexOf(".")==-1      &&i.toString().toLowerCase().indexOf("e")==-1      && !isNaN(i) && isFinite(i) && (i+1)!=i};function isNb(r){return r!="" && !isNaN(r) &&isFinite(r)};function log10(x){return Math.log(x)/Math.LN10}; function logB(B,x){return Math.log(x)/Math.log(B)};function gcd(a,b){  return gcd1(Math.abs(a),Math.abs(b))  };function gcd1(a,b){     do{     if(a==0) return b      else if(b==0) return a      else var aa=a;a=b%a;b=aa     }while(true)};//var test=new Array("gcd(0,2)","gcd(2,0)","gcd(12,15)","gcd(144,89)");//for(var i=0;i<test.length;i++)alert(test[i]+" = "+eval(test[i]));function lcm(a,b){ return a/gcd(a,b)*b };function powmod(Base,Pow,Mod){   var pm;         if(Pow==0)pm= 1  else if(Pow==1)pm= Base%Mod  else if(Pow>1)       {var s=powmod(Base,Math.round((Pow-Pow%2)/2),Mod);        var ss=mul(s,s)%Mod;        pm= (Pow%2==0 ? ss : (Base*ss)%Mod )  } ;  return pm     };function isprime(N){   if(N%2==0)return (N==2);  var i=3,L=Math.sqrt(N),ct=0;  //var stime=(new Date()).getTime();  while(i<=L && N%i!=0){i=i+2; ct++}; // var inctime=(new Date()).getTime()-stime;    return(N>1 && i>L)};function primefactors(N){       if(N==1)return [1];    var f=new Array(), II=N,L=Math.sqrt(N);    while(II%2==0){f=f.concat(2);II=II/2;L=Math.sqrt(II)};    for(var i=3;i<=L;i=i+2)       while(i<=L && II%i==0){f=f.concat(i);II=II/i;L=Math.sqrt(II)};    if(II>1)f=f.concat(II);    return f};function cpfrom(PrevAnss,Li,L,F){    if(L.length==Li)return F(PrevAnss);   var ans=[];   for(var i=0;i<=L[Li][1];i++)      ans=ans.concat(cpfrom(PrevAnss.concat(Math.pow(L[Li][0],i)), Li+1, L, F));   return ans};function ordlistToZbag(L){       var s=L[0],ct=1,i,z=[];   for(var i=1;i<L.length;i++)     if(L[i]==s)ct++     else {z=z.concat([[s,ct]]);s=L[i];ct=1};   z=z.concat([[s,ct]]);    return z};function EulerPhi(N){    var pfs=ordlistToZbag(primefactors(N));  var phi=1,i=0;  while(i<pfs.length)  {var pr=pfs[i][0],po=pfs[i][1]; i++; phi=phi*Math.pow(pr,po-1)*(pr-1)};  return phi};function factors(N){    if(N==1)return [1];  return cpfrom([],0,ordlistToZbag(primefactors(N)),function(L){return eval(L.join('*'))})   .sort(function(a,b){return a-b});};function strip(s,remCh){  if(arguments.length==1)remCh=" ";  var i=0;while(i<s.length && s.substring(i,i+1)==remCh)i++;  return s.substring(i)};  function endswith(s,x){if(typeof s != "string")s=s.toString(); if(typeof x != "string")x=x.toString();  if(s.substring(s.slength-1)==" ")s=revstr(strip(revstr(s)));  if(s.length>=x.length){return s.substring(s.length-x.length)==x }else{return false}};  function beginswith(s,x){ if(typeof s != "string")s=s.toString(); if(typeof x != "string")x=x.toString();  s=strip(s," ");  if(s.length>=x.length){return s.substring(0,x.length)==x }else{return false}};  function revstr(r){var s="";for(var i=0;i<r.length;i++)s=r.charAt(i)+s;return s};  function randint(lo,hi){ with(Math){return floor(random()*(hi-lo+1))+lo} };function randelt(vals){   if(arguments.length==1)      {if(typeof vals=="object")return vals[randint(0,vals.length-1)]       else if(typeof vals == "string")return randelt(vals.split(""));      }   else return arguments[randint(0,arguments.length-1)]};function evalstr(fld)  {try{var i=eval(fld.replace("sqrt","Math.sqrt").replace(/infinity/,"Infinity")                .replace(/pi/ig,"Math.PI").replace("E","Math.E"))  }catch(e){}   return i};   function checkinput(fld,nm,opts){  // default: eval input, or include opt "noeval"   var i,res;//alert("checkinput "+fld+" "+nm);   var opts=arguments.length<3?new Object():getArgs(opts);   if(!opts.emptyval)opts.emptyval=""; //Empty always allowed (when clicking on (?) button; use 'emptyval=NaN' otherwise    //alert(typeof opts.noeval);   if(!opts.hasOwnProperty("noeval"))opts.noeval=false;   //alert(fld);   fld=fld.replace(/\s/g,"");   //alert("< "+fld+" "+nm);   if(fld=="")return opts.emptyval;   if(!opts.noeval)       {var xtra=fld.replace(/sqrt/g,"").replace(/[Ii]nfinity/g,"").replace(/pi/gi,"").replace(/[0-9eE\.\-\*\/+\(\)\s]/g,"")          if(xtra!="" )              halt(nm+": Only numbers, fractions, E, Pi, sqrt, Infinity and -Infinity are allowed in input boxes\nFound "+xtra)              // don't allow trig fns etc          else try{i=evalstr(fld) }               catch(evt){halt("I do not understand your input to "+nm+"\nPlease change it");return NaN}                if(opts.eval&&isNaN(i))         {//alert(nm+" is NaN");            if(fld=="") i=opts.emptyval // empty fields always allowed as input ELSE use:-           //else if(isemptyinput(fld))halt("The "+nm+" input box must have a value typed in.")         else halt("No number found for "+nm)};         res=i     }     else res=fld;   //debug(nm+" Noeval="+opts.noeval+" = "+res);   return res }; function isemptyinput(str){return str.replace(/\s/,'')==''};var maxdps=Math.PI.toString().length-2;function pad(used,requd){ if(typeof used != "string")used=used.toString();  used=used.length;  return (requd<=used?"":"                    ".slice(0,requd-used).replace(/ /g,"&nbsp;"))};function fw(n,fwd,pad){ if(arguments.length<3)pad=" ";   var s=n.toString(); while(s.length<fwd)s=pad+s;  return s};function fw2(n){  if(n<10){return " "+n   } else return n};function hideId(nm) { if(arguments.length==0)nm="Soln";        if (document.getElementById) {document.getElementById(nm).style.visibility = "hidden";}   else if (document.all) {document.all[nm].style.visibility = "hidden";}   else if (document.layers) {document[nm].visibility = "hide";}   else {var w=eval(nm).style;w.visibility="hidden"};};function showId(nm) {if(arguments.length==0)nm="Soln";	     if (document.getElementById) {document.getElementById(nm).style.visibility = "visible"; }     else if (document.all) {document.all[nm].style.visibility = "visible"; } 	else if (document.layers) {document[nm].visibility = "show"; } 	else {var w=eval(nm).style;w.visibility="visible"};};function setStyle(nm,valpair) {if(arguments.length==0)nm="Soln";   var attr=valpair.slice(0,valpair.indexOf(":")),attrval=valpair.slice(valpair.indexOf(":")+1);        if (document.getElementById) {document.getElementById(nm).style[attr] = attrval }     else if (document.all) {document.all[nm].style[attr] = attrval } 	else if (document.layers) {document[nm][attr] = attrval } 	else {var w=eval(nm).style;w[attr]=attrval};};function ARR(lo,hi,mt){//JS array type which allows -ve indices//putmsg("ARR "+lo+" "+hi+" "+mt)  if(arguments.length<3)mt=0;  this.empty=mt;  this.lwb=lo;this.upb=hi;  this.elts=new Array(hi-lo+1);for(var i=0;i<hi-lo+1;i++)this.elts[i]=this.empty;  this.length=this.upb-this.lwb+1;  this.at=function(i){if(this.inrange(i)){return this.elts[i-this.lwb]} else return this.empty};  this.set=function(ind,val){          if(ind<this.lwb){var extra=new Array();for(var i=this.lwb-1;i>=ind;i--)extra[i-ind]=this.empty;this.lwb=ind;                 this.elts=extra.concat(this.elts)}     else if(ind>this.upb){var extra=new Array();for(var i=0;i<ind-this.upb;i++)extra[i]=this.empty;this.upb=ind;                 this.elts=this.elts.concat(extra)}     this.elts[ind-this.lwb]=val};  this.inc=function(i,addon){var currval=this.at(i);this.set(i,currval+addon)};  this.inrange=function(i){return i>=this.lwb && i<=this.upb};  this.toString=function(){return this.elts};  this.inrng=function(lind,rind){           return this.elts.slice(lind-this.lwb,rind-this.lwb+1)} }  function changeOpac(opacity, id) {    var object = document.getElementById(id).style;    object.opacity = (opacity / 100);     object.KhtmlOpacity = (opacity / 100);}function blendimage(divid, imageid, imagefile, millisec) {    var speed = Math.round(millisec / 100);    var timer = 0;        //set the current image as background    document.getElementById(divid).style.backgroundImage = "url(" + document.getElementById(imageid).src + ")";        //make image transparent    changeOpac(0, imageid);        //make new image    document.getElementById(imageid).src = imagefile;    //fade in image    for(var i = 0; i <= 100; i++) {        setTimeout("changeOpac(" + i + ",'" + imageid + "')",(timer * speed));        timer++;    }} 	function showMoreOrLess(divId,incdec){ //needs a hidden field divId+"depth" containing the depth in em    var v=document.getElementById(divId+"depth").value;    if(!isNaN(v))    {  v=eval(v)+incdec;       if(v<15)v=15;       document.getElementById(divId).style.height=v+'em'}   }