DIR : /home/kozerus/public_html/wz/wz_grapher.htm

/home/kozerus/public_html/wz

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--  Created by Walter Zorn  -->

<html>
<head>
	<title>/ko/wz_grapher.html 20230315_2330</title>
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<!--	<link rel="stylesheet" type="text/css" href="../newwalterzorn.css"> -->
	<style id="style_newwalterzorn" >
body {
  margin:0px;
  padding-top:0px;
  padding-bottom:100px;
}

html,body,div,center,p,table,tr,th,td,ul,li {
  font-family:arial,helvetica,sans-serif;
  font-size:14px;
  color:black;
}

big {
  font-size:18px;
}

small {
  font-family:verdana,helvetica,sans-serif;
  font-size:10px;
}

code, tt {
  font-size:13px;
  font-family:courier new,courier;
  white-space:nowrap;
}

a:link {
  color:#3355cc;
  text-decoration:underline;
  font-weight:bold;
}
a:visited {
  color:#8800aa;
  text-decoration:underline;
  font-weight:bold;
}
a:hover {
  color:#660099;
  background:#ececec;
  text-decoration:underline;
  font-weight:bold;
}
a:active {
  color:#3355cc;
  text-decoration:underline;
  font-weight:bold;
}

a.nodeco:link {
  text-decoration:none;
}

a.nodeco:visited {
  text-decoration:none;
}

a.nodeco:hover {
  text-decoration:none;
}

a.nodeco:active {
  text-decoration:none;
}

a.code:link {
  font-size:13px;
  text-decoration:none;
  font-family:courier new,courier;
  background:#e0e0e0;
}

a.code:visited {
  font-size:13px;
  text-decoration:none;
  font-family:courier new,courier;
  background:#e0e0e0;
}

a.code:hover {
  font-size:13px;
  text-decoration:none;
  font-family:courier new,courier;
  background:#e0e0e0;
}

a.code:active {
  font-size:13px;
  text-decoration:none;
  font-family:courier new,courier;
  background:#e0e0e0;
}

tt.code {
  background:#e0e0e0;
  padding:1pt;
}

input {
  font-size:12px;
  font-family:courier new,courier,arial,helvetica,sans-serif;
  color:black;
}

textarea {
  background-color:white;
  font-family:courier new,courier;
  font-size:12px;
}

.lite {
  color:#cc6666;
}

.bt1 {
  font-size:17px;
  font-family:arial,helvetica,sans-serif;
}

.bt1b {
  font-size:17px;
  font-family:arial,helvetica,sans-serif;
  font-weight:bold;
}

.bt2 {
  font-size:13px;
  font-family:arial,helvetica,sans-serif;
}

.bt2b {
  font-size:13px;
  font-family:arial,helvetica,sans-serif;
  font-weight:bold;
}

.bt3 {
  font-size:11px;
  font-family:arial,helvetica,sans-serif;
}

.bt3b {
  font-size:11px;
  font-family:arial,helvetica,sans-serif;
  font-weight:bold;
}
		</style id="style_newwalterzorn_end" >

<style type="text/css">
<!--
-->
</style>
	<script id="script_wz_grapher" type="text/javascript">
<!--
	function mkFourier(f) {
		var htm = '';
		var na = parseInt(f.FOU_NA.value), nz = parseInt(f.FOU_NZ.value), dn = parseFloat(f.FOU_DN.value);
		var sgn = f.FOU_SGN[2].checked? -1 : f.FOU_SGN[3].checked? 1 : 0;
		for (var i = na; i <= nz; i += (dn || nz)) {
			htm += ((i == na)? '' : (sgn < 0 || !sgn && f.FOU_SGN[1].checked)? '-' : '+') + f.FOU_TERM.value.replace(/\s/g, '').replace(/sin/g,'sim').replace(/n/gi, ''+i).replace(/sim/g,'sin');
			sgn = -sgn;
			}
			f.FOU_OUT.value = htm;
		}
//-->
		</script id="script_wz_grapher_end" >

	<script id="script_startup">
		function startup(args) {
			htmout=""; j=0; k=0;
			alert( "BUGS_100 startup args="+args );
			return(htmout);
			}
		</script id="script_startup_end">
	</head>

<body bgcolor=linen onload="startup('onload'); return false;" >
	<div id="div_wz_grapher">
		<h1>div_wz_grapher</h1>

		<form name="fo" action="javascript:if (window.mkGraph) mkGraph(this);" onsubmit="return false;">
			<a name="top"> </a>
			<center>
			<div id="body1">
				<table width="99%">
				<tr>
					<td align="left">
						&nbsp;<a href="http://www.walterzorn.de/grapher/grapher.htm" target="_top"><img src="../images/germany.gif" align="middle" border="0" alt="German version" width="22" height="15"></a> <small><a href="http://www.walterzorn.de/grapher/grapher.htm" target="_top">German version</a></small>
						</td>
					</tr>
				</table>
        <table>
          <tr>
            <td align="center"><a href="../index.htm"><img border="0" src="/js/wz/images/logo.gif" alt="" width="271" height="30"></a></td>
          </tr>
        </table>
        <table cellspacing="12">
          <tr valign="top">
            <td><a href="/js/wz/index.htm">Home</a></td>
            <td><a href="/js/wz/dragdrop/dragdrop_e.htm">DHTML-Drag&amp;Drop-Library</a></td>
            <td><a href="/js/wz/jsgraphics/jsgraphics_e.htm">VectorGraphics-Library</a></td>
            <td><a href="/js/wz/tooltip/tooltip_e.htm">Tooltips-Library</a></td>
            <td><br></td>
            <td style="border: 1px solid #000099;">
            
            
            </td>
          </tr>
        </table>
        <table cellpadding="6" width="740">
          <tr>
            <td align="left">
              <b><big>Online Function Grapher</big></b><br>
              <small>Written entirely in JavaScript<br>By Walter Zorn</small>
            </td>
          </tr>
        </table>


        <table cellpadding="6" width="740">
          <tr>
            <td align="left">
              Currently under development:
              A standalone application version of this Function Graphing Program, written in C language,
              much faster, essentially more capabilities, e.g. scrolling and zooming the displayed range, built-in function calculator, numerical integration, solving differential equations numerically ... <a href="grapher_app.htm">free download of WZGrapher</a>.<br>&nbsp;
            </td>
          </tr>
        </table>
        <div id="inputs" style="position:relative;text-align:left;">
          <div style="padding-top:8px;padding-right:8px;padding-left:8px;">
            <input type="submit" class="bt2" value="Plot Graph" onclick="if (window.mkGraph) mkGraph(this.form); return false;">
            <input name="Add" type="checkbox">don't delete previous graphs&nbsp;
            &nbsp;<input type="button" class="bt2" value="Delete graphs" onmouseup="this.form.F.focus()" onclick="delGraphs(1)">
            <br>
            x min <input name="XA" type="text" class="input" size="8" maxlength="13" value="-5">
            &nbsp;x max <input name="XZ" type="text" class="input" size="8" maxlength="13" value="5">&nbsp;
            &nbsp; &nbsp; &nbsp; &nbsp;y min <input name="YA" type="text" class="input" size="8" maxlength="13" value="-5">
            &nbsp;y max <input name="YZ" type="text" class="input" size="8" maxlength="13" value="5">
            <br>
            <b>Function f(x)</b><small> (up to 5 functions may be entered simultaneously, separated from each other by a semicolon)</small>

		<hr color="black" />	
		<hr color="white" />	
		<br>
		<textarea id="textarea" name="F" class="input" cols="90" rows="4">cos(pi*x) / (-LN2*x);
sqrt(9-x^2);
-sqrt(9-x^2)
			</textarea id="textarea_end" >
			</div>
		</div>
	</div>

	<div id="graphframe" style="position:relative;left:0px;top:0px;">
	<hr color="white" />
	<hr color="black" />
	<br />

        <noscript><big><b><font color="#cc0000">&nbsp;<br>JavaScript not enabled. Graph of function can't be created.</font></b></big></noscript>
        <br>Function Graph Area.
      </div>
      <div id="terms" style="position:relative;left:0px;top:0px;width:690px;padding:3px;text-align:left;"></div>
      <div id="body2">
        <table cellpadding="14">
          <tr>
            <td align="left">
              <big>&nbsp;<br><b>Operators and Helper Functions</b></big> <small>upper/lower case is arbitrary</small>
              <table>
                <tr>
                  <td valign="top">
                    <b>+ - * : /</b>
                    <br>
                    <b>() [] {}</b>
                  </td>
                  <td>
                    Plus, minus, multiplication, division, grouping symbols.
                    Multiplication sign <b>*</b> is not necessary and can be omitted. Examples:
                    <b style="white-space:nowrap;">0.5x^3-3x</b> or <b style="white-space:nowrap;">pixeln(2cos[LN2x])</b> or <b style="white-space:nowrap;">Pipi/(Exe)</b>
                    Using different types of grouping symbols (parentheses, brackets, braces) for clarity of nested expressions is optional, but not necessary.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <i>base</i><b>^</b><i>exponent</i>
                    <br>or<br>
                    <span style="white-space:nowrap;"><b>p(</b>base<b>,</b>exponent<b>)</b></span>
                  </td>
                  <td>
                    Exponentiation base<sup>exponent</sup>, for example <b>p(x,2)</b> or <b>x^2</b>&nbsp;.
                    Instead of <b>^</b> you can also type a single quote <b>'</b> or a double quote <b>&quot;</b>.
                    If you don't use p(), make sure that bases or exponents composed by sub-expressions such as additions, subtractions, multiplications or divisions, are clearly marked off by being completely enclosed into parentheses, brackets or braces.
                    Example: <b style="white-space:nowrap;">(x/3)^(2x)</b>&nbsp;.
                    Instead of <b style="white-space:nowrap;">x&quot;3</b>, of course, you can also enter <b style="white-space:nowrap;">xxx</b>.
                    Or, instead of <b style="white-space:nowrap;">tan(x)'2</b> you may type <b style="white-space:nowrap;">tan(x)tan(x)</b>.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>root(</b>arg<b>,</b>index<b>)</b></span>
                  </td>
                  <td>
                    &quot;<i>index</i>-th&quot; root of <i>argument</i>.
                    Example: <b style="white-space:nowrap;">root(x,6)</b> sixth root of x, <b style="white-space:nowrap;">root[tan(x),4]</b> fourth root of the tangent of x.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>sqrt()</b>
                  </td>
                  <td>
                    Square root of argument (number or expression inside the parentheses). Equivalent to root(<i>argument</i>,2)
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>cbrt()</b>
                  </td>
                  <td>
                    Cube root of argument. Equivalent to root(<i>argument</i>,3)
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>logn(</b>arg<b>,</b>base<b>)</b></span>
                  </td>
                  <td>
                    Logarithm base-<i>base</i> of <i>arg</i>.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>ln()</b>
                  </td>
                  <td>
                    Natural logarithm of argument
                    (base-E logarithm of argument where E is Euler's constant)
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>lg()</b>
                  </td>
                  <td>
                    Logarithm base-10 of argument, equivalent to <span style="white-space:nowrap;">logn(<i>argument</i>,10)</span>.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>lb()</b>
                  </td>
                  <td>
                    Logarithm base-2 of argument.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>exp()</b>
                  </td>
                  <td>
                    Exponential Function E to the power of argument, equivalent to E^<i>argument</i>
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>sin()</b>
                  </td>
                  <td>
                    Sine of argument
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>cos()</b>
                  </td>
                  <td>
                    Cosine
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>tan()</b>
                  </td>
                  <td>
                    Tangent
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>cot()</b></span>
                  </td>
                  <td>
                    Cotangent
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>sec()</b>
                  </td>
                  <td>
                    Secant of argument, equiv. to 1/cos(<i>arg</i>).
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>csc()</b>
                  </td>
                  <td>
                    Cosecant, equiv. to 1/sin(<i>arg</i>).
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>asin()</b></span>
                  </td>
                  <td>
                    Arc sine
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acos()</b></span>
                  </td>
                  <td>
                    Arc cosine
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>atan()</b></span>
                  </td>
                  <td>
                    Arc tangent
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acot()</b></span>
                  </td>
                  <td>
                    Arc cotangent
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>asec()</b></span>
                  </td>
                  <td>
                    Arc secant, inverse secant.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acsc()</b></span>
                  </td>
                  <td>
                    Arc cosecant, inverse cosecant.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>sinh()</b></span>
                  </td>
                  <td>
                    Hyperbolic sine, Sinus hyperbolicus
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>cosh()</b></span>
                  </td>
                  <td>
                    Hyperbolic cosine, Cosinus hyperbolicus
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>tanh()</b></span>
                  </td>
                  <td>
                    Hyperbolic tangent, Tangens hyperbolicus
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>coth()</b></span>
                  </td>
                  <td>
                    Hyperbolic cotangent, Cotangens hyperbolicus
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>sech()</b></span>
                  </td>
                  <td>
                    Hyperbolic secant, Secans hyperbolicus.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>csch()</b></span>
                  </td>
                  <td>
                    Hyperbolic cosecant, Cosecans hyperbolicus.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>asinh()</b></span>
                  </td>
                  <td>
                    Area sine, Area sinus hyperbolicus, inverse sinh().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acosh()</b></span>
                  </td>
                  <td>
                    Area cosine, Area cosinus hyperbolicus, inverse cosh().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>atanh()</b></span>
                  </td>
                  <td>
                    Area tangent, Area tangens hyperbolicus, inverse tanh().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acoth()</b></span>
                  </td>
                  <td>
                    Area cotangent, Area cotangens hyperbolicus, inverse cotanh().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>asech()</b></span>
                  </td>
                  <td>
                    Area- secant, Area secans hyperbolicus, inverse sech().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>acsch()</b></span>
                  </td>
                  <td>
                    Area- cosecant, Area cosecans hyperbolicus, inverse csch().
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>gaussd(x,</b>mean<b>,</b>sigma<b>)</b></span>
                  </td>
                  <td>
                    Gaussian distribution (&quot;Bell Curve&quot;).
                    <b style="white-space:nowrap;">gaussd(x,0,1)</b>, by the way, is the special case &quot;Normal distribution density with mean-value=0, standard-deviation=1&quot;.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>min(</b>arg1<b>,</b>arg2<b>)</b></span>
                  </td>
                  <td>
                    Returns the lesser of the two arguments
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <span style="white-space:nowrap;"><b>max(</b>arg1<b>,</b>arg2<b>)</b></span>
                  </td>
                  <td>
                    Returns the greater of the two arguments
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b style="white-space:nowrap;">round()</b>
                  </td>
                  <td>
                    Rounds argument up or down to the closest integer
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b style="white-space:nowrap;">floor()</b>
                  </td>
                  <td>
                    Rounds arg down.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b style="white-space:nowrap;">ceil()</b>
                  </td>
                  <td>
                    Rounds arg up.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>abs()</b> or <b>|&nbsp;|</b>
                  </td>
                  <td>
                    Absolute value of argument.
                    Example: <b style="white-space:nowrap;">2abs(sin[x])</b> or alternatively <b style="white-space:nowrap;">2|sin(x)|</b>&nbsp;.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>sgn()</b>
                  </td>
                  <td>
                    Sign Function.
                    <br>
                    <table>
                      <tr>
                        <td rowspan="3" valign="middle">
                          <b style="white-space:nowrap;">sgn(x)</b>&nbsp;&nbsp;=&nbsp;&nbsp;
                        </td>
                        <td>&nbsp;1 for x &gt; 0</td>
                      </tr>
                      <tr>
                        <td>&nbsp;0 for x = 0</td>
                      </tr>
                      <tr>
                        <td>-1 for x &lt; 0</td>
                      </tr>
                    </table> 
                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td align="left">
              <big>&nbsp;<br><b>Predefined Constants, Values</b></big> <small>upper/lower case is arbitrary</small>
              <table>
                <tr>
                  <td valign="top">
                    <b>rand</b>
                  </td>
                  <td>
                    Random number between 0 und 1. Example:<br><b style="white-space:nowrap;">pi*rand*sin(x)</b> or even <b style="white-space:nowrap;">Pirandsin(x)</b>&nbsp;.
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>E</b>
                  </td>
                  <td>
                    Euler's constant 2.718281828459045...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>LN2</b>
                  </td>
                  <td>
                    Natural logarithm of 2, is 0.6931471805599453...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>LN10</b>
                  </td>
                  <td>
                    Natural logarithm of 10, is 2.302585092994046...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>LOG2E</b>
                  </td>
                  <td>
                    Base-2 logarithm of E (E: see above), is 1.4426950408889633...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>LOG10E</b>
                  </td>
                  <td>
                    Base-10 logarithmus of E, is 0.4342944819032518...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>PHI</b>
                  </td>
                  <td>
                    Golden Ratio 1.61803398874989...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>PI</b>
                  </td>
                  <td>
                    3.141592653589793...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>SQRT1_2</b>
                  </td>
                  <td>
                    Square root of 1/2, is 0.7071067811865476...
                  </td>
                </tr>
                <tr>
                  <td valign="top">
                    <b>SQRT2</b>
                  </td>
                  <td>
                    Square root of 2, is 1.4142135623730951...
                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td align="left">
              <big>&nbsp;<br><b>Notes</b></big>
              <br>
              Enter functions in standard mathematical notation, using x as independent variable.
              As evident from the examples on this page, arguments to helper functions must be enclosed into parentheses (or braces or brackets).
              <br>&nbsp;<br>
              Grouping symbols such as parentheses, and helper functions may be arbitrarily deeply nested. Examples:<br>
              <b style="white-space:nowrap;">cos[atan(5x)^4]</b> or <b style="white-space:nowrap;">sqrt{16*[1-sec(x)^2/4]}</b>
              <br>&nbsp;<br>
              The function plotter engine follows the common rules of math. notation and order of operation;
              for example, expressions inside parentheses have increased precedence, * and / have higher precedence than + and -, etc..
              In case no grouping symbols are used, <b style="white-space:nowrap;">2*x-3/x</b> evaluates as if it were <b style="white-space:nowrap;">(2*x) - (3/x)</b>.
              <br>&nbsp;<br>
              Since horizontal fraction lines aren't available to clearly mark off fraction expressions composed by sub-expressions, is is recommended to insert numerator and denominator each completely into parentheses (or brackets or braces).
              For example, type in <b style="white-space:nowrap;">pi-(5-x)/(3x)*acoth(x)</b> instead of <b style="white-space:nowrap;">pi-5-x/3x*acoth(x)</b> which otherwise would evaluate to <b style="white-space:nowrap;">pi-5-(x/3)*x*acoth(x)</b>.
              <br>&nbsp;<br>
              Upper and lower case may be arbitrarily used and mixed, even for predefined constants.
              Spaces may be used for clarity as you wish, but neither help nor harm; the program engine ignores them.
              <br>&nbsp;<br>
              Range of x (x&nbsp;min to x&nbsp;max) should not extend beyond minus 10<sup>12</sup> and plus 10<sup>12</sup>.
              Range of y (y&nbsp;min to y&nbsp;max) is optional; if not specified, the function-grapher engine tries to evaluate it for the specified x range.
              <br>&nbsp;<br>
            </td>
          </tr>
          <tr>
            <td align="left">
              <big>&nbsp;<br><b>Multiple Functions at Once</b></big>
              <br>
              You may enter up to 5 functions simultaneously, each terminated by a semicolon.
              Of course building the diagram then will take more time, possibly several seconds.
              Example (you may copy it into the function input):<br>
              <b>
                sqrt[16*(1-x&sup2;/2)];<br>
                -sqrt[16*(1-x&sup2;/2)];<br>
                sqrt[2*(1-x&sup2;/16)];<br>
                -sqrt[2*(1-x&sup2;/16)]
              </b>
            </td>
          </tr>
          <tr>
            <td align="left">
              <big>&nbsp;<br><b>Create Fourier Series</b></big>
              <br>
              <table cellpadding="5">
                <tr>
                  <td align="left" bgcolor="#eeeeee">
                    <small>
                    The Fourier Series will be written into the lightblue area below.
                    <br>
                    You may copy it from there, and enter it into the input of the Function Grapher
                    <br>&nbsp;<br></small>
                    <b>n:</b>
                    from <input name="FOU_NA" type="text" size="4" value="1">
                    to <input name="FOU_NZ" type="text" size="4" maxlength="4" value="10">
                    step width <input name="FOU_DN" type="text" size="4" value="1">
                    <br>
                    Single terms:
                    Add<input type="radio" name="FOU_SGN" checked>
                    subtract<input type="radio" name="FOU_SGN">
                    or alternate, beginning with plus<input type="radio" name="FOU_SGN">
                    minus<input type="radio" name="FOU_SGN" checked>
                    <br>
                    <b>Single term:</b>
                    <input name="FOU_TERM" type="text" size="44" value="0.9^n * cos(n*x)/2">
                    <input class="bt2" type="button" value="Create Fourier Series" onclick="mkFourier(this.form)">
                    <br>
                    <textarea name="FOU_OUT" cols="82" rows="20" style="background:#d3e6ff;"></textarea>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td align="center">
              <table cellpadding="40">
                <tr>
                  <td><a href="#top"><img border="0" src="../images/topOfPage.gif" alt="Seitenanfang" width="21" height="20"></a></td>
                  <td><a href="../index.htm" target="_top">Home</a></td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
        <hr width="95%" size="1" noshade>
        <table width="740">
          <tr>
            <td>
              <small>Walter Zorn
              <br><a href="http://www.kreuzotter.de/impressum.htm">Impressum and about this page</a></small>
              <br>
              &nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>
            </td>
          </tr>
        </table>
      </div>
    </center>
  </form>




	<div id="div_files" >
		<output id="zonelist"></output>
		<div id="dropzone">
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-index: 1;
					position:absolute;
					left:0px;
					top:0px;
					" height="100px" width="200" background-color="darkSlategrey" color="ivory">
					WARN_1387 unauthorized access has been logged
					</canvas>
				</div id=div_canvas_end>
			</div id=dropzone_end>

		<script name="script_fileselect">
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.preventDefault();

				var files = evt.dataTransfer.files; // FileList object.

// files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }

  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
</script>

<hr><hr><hr>
	<label class="fileContainer">
		files
		<input id="files" name="files[]" multiple="" type="file">
		</label>


<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>

	<div id="div_files2" hidden >
		<label class="fileContainer">
			files2
			<input id="files" name="files[]" multiple="" type="file">
			</label>
		<output id="zonelist"></output>
		</div>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

// Only process image files.
	if (!f.type.match('image.*')) { continue; }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('zonelist').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

	<script id="script_previewfile">
			function previewfile(file) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
					var reader = new FileReader();
					reader.onload = function (event) {
						var image = new Image();
						image.src = event.target.result;
						image.width = 250; // a fake resize
						holder.appendChild(image);
						};

					reader.readAsDataURL(file);
					}  
				else {
					holder.innerHTML += 
						'<p>done:  koupload' 
							+ file.name 
							+ ' ' 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
						console.log(file);
					}
				}

			function readfiles(files) {
				debugger;
				var formData = tests.formdata ? new FormData() : null;
				for (var i = 0; i < files.length; i++) {
					if (tests.formdata) formData.append('file', files[i]);
					previewfile(files[i]);
					}

// now post a new XHR request
				if (tests.formdata) {
					var xhr = new XMLHttpRequest();
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
//					xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
					xhr.onload = function() {
						progress.value = progress.innerHTML = 100;
						};

				if (tests.progress) {
					xhr.upload.onprogress = function (event) {
						if (event.lengthComputable) {
							var complete = (event.loaded / event.total * 100 | 0);
							progress.value = progress.innerHTML = complete;
							}
						}
					}

				xhr.send(formData);
				}
			}

			if (tests.dnd) { 
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondrop = function (e) {
					this.className = '';
					e.preventDefault();
					readfiles(e.dataTransfer.files);
					}
				} 
			else {
				fileupload.className = 'hidden';
				fileupload.querySelector('input').onchange = function () {
				readfiles(this.files);
				};
			}
		</script>

	<script id="script_myfilework>

		funtion myfilework( j, file ) {

			alert( j+" file="+file );
			}

		</script>





		<script id="script_upload_input">>
			var upload = document.getElementsByTagName('input')[0],
			holder2 = document.getElementById('holder2'),
			state = document.getElementById('status');

			if (typeof window.FileReader === 'undefined') {
				state.className = 'fail';
				} 
			else {
				state.className = 'success';
				state.innerHTML = 'File API & FileReader available';
				}
 
			upload.onchange = function (e) {
				e.preventDefault();

				var file = upload.files[0],
				reader = new FileReader();
				reader.onload = function (event) {
					var img = new Image();
					img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
					if (img.width > 560) { // holder width
						img.width = 560;
						}
					holder2.innerHTML = '';
					holder.appendChild(img);
					};
				reader.readAsDataURL(file);

				return false;
				};

//			var formData = new FormData();
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_price", 7.95);
//				formData.append("part_image", somefile)
//
//			var xhr = new XMLHttpRequest();
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.send(formData);
			</script>

	<canvas color="darkSlategrey" height="100" width="400"></canvas>
	<script>
		var canvas = document.getElementsByTagName('canvas')[0],
    ctx = null,
    grad = null,
    body = document.getElementsByTagName('body')[0],
    color = 255;
    color = lightblue;
    
if (canvas.getContext('2d')) {
  ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, 600, 600);
  ctx.save();

// Create radial gradient
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');

  // assign gradients to fill
//  ctx.fillStyle = grad;
	ctx.fillstyle = "lightblue";

  // draw 600x600 fill
  ctx.fillRect(0,0,600,600);
  ctx.save();
  
  body.onmousemove = function (event) {
    var width = window.innerWidth, 
        height = window.innerHeight, 
        x = event.clientX, 
        y = event.clientY,
        rx = 600 * x / width,
        ry = 600 * y / height;
        
    var xc = ~~(256 * x / width);
    var yc = ~~(256 * y / height);

    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad.addColorStop(0, '#000');
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    // ctx.restore();
//    ctx.fillStyle = grad;
	ctx.fillstyle="lightblue";
    ctx.fillRect(0,0,600,600);
    // ctx.save();
  };
}
	</script>



<!-- DIV_CSV -->
	<div id="div_csv"><h3>div_csv 300</h3></div id="div_csv_end" >
	
	<script id="script_upload_csv"  type="text/javascript">
//		function upload_csv() {
		function Upload() {
//			var files = evt.dataTransfer.files; // FileList object.
//			var fileUpload = document.getElementById("upload_files");
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					reader.onload = function (e) {
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
					
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						}
					reader.readAsText(fileUpload.files[0]);
					file_csv=fileUpload.files[0];
					file_csvlen = fileUpload.files.length;
					alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
					load_file_csv(file_csv);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
		</script id="script_upload_csv" >

	<script id="script_load_file_csv">
		function load_file_csv(file_csv) {
			alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
			file_psv=file_csv.replace(",","|");
			return(file_psv);
			}
		</script id="script_load_file_csv_end">

	<label id="label_upload_csv" class="fileContainer">
		files.csv.psv.txt
		<input id="fileUpload" type="file"></input id="fileUpload_end" >
		</label id="label_upload_csv_end" >

	&nbsp &nbsp &nbsp
	<label id="label_parse_csv" class="fileContainer">
		parse.csv.psv.txt
		<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
		</label id="label_parse_csv" > 



	<div id="csv2tbl"><h3>csv2tbl MSG_367</h3></div id="csv2tbl_end" >



	<script id="script_uploads" type="text/javascript">
// grab the file input and bind a change event onto it
// new html5 formdata object.
// for each entry, add to formdata to later access via $_FILES["file" + i]
//send formdata to server-side

		$(function() {
			$('#file').bind("change", function() {
				var formData = new FormData();
				for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
					formData.append("file" + i, document.getElementById('file').files[i]);
					}
 
				$.ajax({
//					url: "file-upload.php", // our php file
//					url: "ka1_fileupload.php", // our php file
//					nurl: "http://ka1/ka1.php?q=up", // our php file
//					url: "/kup.php", // our php file
//					url: "/ka1_up.php", // our php file
//					url: "/ka1.php?q=kup", // our php file
//					url: "/ko0.php?q=kup", // our php file
//					url: "/ko1.php?q=kup", // our php file
// bugs					url: "10.0.0.112:/ka1.php?q=up", // our php file
//					url: "/ko.php?todo=mp3s", // our php file

					url: "/ko.php?kup", // our php file
					type: 'post',
					data: formData,
					dataType: 'html', // we return html from our php file
					async: true,
					processData: false,  // tell jQuery not to process the data
					contentType: false,   // tell jQuery not to set contentType
					success : function(data) {
						$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
						$('#upload-result .alert').append(data);
						},
					error : function(request) {
						console.log(request.responseText);
						}
					});
				});
			});
		</script id="script_uploads_end" >





	<hr color=white>
	<hr color=black>
	<div id='editableDiv' contenteditable='true'>paste</div id='editableDiv_end' >
	<hr color=black>
	<hr color=white>
	<hr color=black>
	<div id='div' contenteditable='true'>ffpaste</div id='div_end'>
	<hr color=black>
	<hr color=white>

	<script id="script_clipboard" >
		function handlePaste (e) {
			var clipboardData, pastedData;

// Stop data actually being pasted into div
			e.stopPropagation();
			e.preventDefault();

// Get pasted data via clipboard API
			clipboardData = e.clipboardData || window.clipboardData;
			pastedData = clipboardData.getData('Text');

// Do whatever with pasteddata
			alert(pastedData);
			}

		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		</script id="script_clipboard_end" >


	<script id="script_clipboard_ff" >
// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
// Extract data and pass it to callback
// Stop the data from actually being pasted
// Everything else: Move existing element contents to a DocumentFragment for safekeeping
// Then wait for browser to paste content into it and cleanup

		function handlepaste_ff (e) {
			var types, pastedData, savedContent;
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
				types = e.clipboardData.types;
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {

					pastedData = e.clipboardData.getData('text/html');
//					processPaste(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);

					e.stopPropagation();
					e.preventDefault();
					return false;
					}
				}

			savedContent = document.createDocumentFragment();
			while(editableDiv.childNodes.length > 0) {
				savedContent.appendChild(editableDiv.childNodes[0]);
				}

			waitForPastedData(editableDiv, savedContent);
			return true;
			}

// If data has been processes by browser, process it
// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
// Restore saved content
// Call callback
// Else wait 20ms and try again
		function waitForPastedData (elem, savedContent) {
			if (elem.childNodes && elem.childNodes.length > 0) {
				var pastedData = elem.innerHTML;
				elem.innerHTML = "";
				elem.appendChild(savedContent);
				processPaste_ff(elem, pastedData);
				}

			else {
				setTimeout(function () {
					waitForPastedData(elem, savedContent)
					}, 20);
				}
			}

// Do whatever with gathered data;
// Modern browsers. Note: 3rd argument is required for Firefox <= 6
		function processPaste_ff (elem, pastedData) {
			alert(pastedData);
			elem.focus();
			}

		if (editableDiv.addEventListener) {
			editableDiv.addEventListener('paste', handlepaste, false);
			}
// IE <= 8
		else {
			editableDiv.attachEvent('onpaste', handlepaste);
			}

		$(document).on('paste','[contenteditable]',function(e) {
			e.preventDefault();
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			window.document.execCommand('insertText', false, text);
			});
		</script id="script_clipboard_ff_end" >

	<script id="script_clipboard_jskit" >
		function getSelectionText(){
			var selectedText = ""
			if (window.getSelection){ // all modern browsers and IE9+
				selectedText = window.getSelection().toString()
				}
			return selectedText
			}


		document.addEventListener('mouseup', function(){
			var thetext = getSelectionText()
			if (thetext.length > 0){ // check there's some text selected
				console.log(thetext) // logs whatever textual content the user has selected on the page
				}
			}, false)

		function copySelectionText(){
			var copysuccess // var to check whether execCommand successfully executed
			try{
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
    				} 
			catch(e){
				copysuccess = false
				}
			return copysuccess
			}

		</script id="script_clipboard_jskit_end" >
		</div id="div_files_end">

	<br />
	<hr color="yellow" />
	<div id="div_tail" >
		<h1>div_tail</h1>
		<a href=./ target=_blank><img src=/imgs/gif/disks/disk_yellow.gif></a>
		</div id="div_tail_end" >


	<script id="script_wz_lang" type="text/javascript">
<!--
		var G_LANG = "E";
//-->
		</script id="script_wz_lang_end" >


<!--		<script id="script_wz_grapher" type="text/javascript" src="/js/wz/wz_grapher.js"></script> -->
		<script id="script_b64_wz_grapher"
			src="data:/text/plain;base64,LyogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHVudG91Y2hlZCBhdCBhbGwgdGltZXMuCnd6X2dyYXBoZXIuanMKCkNvcHlyaWdodCAoYykgMjAwMyBXYWx0ZXIgWm9ybi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KQ3JlYXRlZCAzMC4gOS4gMjAwMyBieSBXYWx0ZXIgWm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkKTGFzdCBtb2RpZmllZDogMjguIDMuIDIwMDcKClRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQKaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbQpvciBodHRwOi8vd3d3LmRldmlyYS5jb20Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmRlCgpDcm9zcy1icm93c2VyIEphdmFTY3JpcHQgZnVuY3Rpb24gZ3JhcGhlci4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOwp5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CmVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CndpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuClNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYXQgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sIGZvciBtb3JlIGRldGFpbHMuCiovCgoKLyoqKioqKioqKioqICBDb25maWcgdmFyaWFibGVzICAqKioqKioqKioqLwp2YXIgQk9SREVSQ09MT1IgPSAnI2Q2ZDZkNic7CnZhciBGUkFNRUNPTE9SID0gJyNlZWVlZWUnOwp2YXIgQ05WQ09MT1IgPSAnI2ZmZmZmZic7CnZhciBTQ0FMRUNPTE9SID0gJyMwMDAwMDAnOwp2YXIgQVhDT0xPUiA9ICcjNjY2NjY2JzsKdmFyIEdSSURDT0xPUiA9ICcjZDZkNmQ2JzsKdmFyIEdSQVBIQ09MT1IgPSBbCgknZmYwMDAwJywKCScwMDlmMDAnLAoJJzQ0NDRmZicsCgknZmZhYTAwJywKCScwMGUwZTAnLAoJJ2IwMDA5OScsCgknMDBkMDAwJywKCSdjYzY2MzMnLAoJJzMzMzNjYycsCgknZmY3NzQ0JywKCScwMGMwYWEnLAoJJ2ZmMDBmZicsCgknMDA2ZjAwJywKCSdjYzAwMDAnLAoJJzAwOTZkMCcsCgknOTkwMGVlJwpdOwp2YXIgREVGVyA9IDUyMDsgLy8gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNhbnZhcwp2YXIgTEVGVCA9IDUwOyAgLy8gbGVmdCBtYXJnaW4gY29ubnRhaW5pbmcgeS1oYXNoIGxheWVyCnZhciBUT1AgPSA0OyAgICAvLyB0b3AgICAiCnZhciBSSUdIVCA9IDEyNDsvLyByaWdodCAiICBjb250YWluaW5nIG9wdGlvbnMKdmFyIEJPVFRPTSA9IDIyOy8vIGJvdHRvbSBtYXJnaW4gY29udGFpbmluZyB4LWhhc2ggbGF5ZXIKLyoqKioqKioqKiAgIEVuZCBjb25maWcgdmFyaWFibGVzICAgKioqKioqKioqKiovCgoKdmFyIGdfZnJhbWUsCmdfaW5wdXRUYiwKZ19jbnYsICAgICAgICAgLy8gY2FudmFzCmdfZ3JpZGx5ciwKZ194bHlyLCBnX3lseXIsLy8gbGF5ZXJzIGZvciB4LSBhbmQgeS1oYXNoCmdfdGVybWx5ciwgICAgIC8vIHRlcm1zdHJpbmctbGF5ZXIgb24gYm90dG9tIG9mIGNhbnZhcwpnX29wdHNseXIsCmdfY29vcmR0aXAsICAgIC8vIHRvb2x0aXAgZGlzcGxheWluZyBtb3VzZS1jby1vcmRpbmF0ZXMKZ19uID0gMCwgICAgICAgLy8gbnVtYmVyIG9mIGdyYXBocyBvbiBjbnYKZ19odG0gPSAnJywKZ190ZXJtLApnX3csIGdfaCwgICAgICAvLyBzaXplIG9mIGNudgpnX3hhLCBnX3h6LCAgICAvLyB4IG1pbiwgeCBtYXgKZ195YSwgZ195eiwKZ19keCwgZ19keSwgICAgLy8gZGVsdGEgdmFsdWUvcHgKZ19wYWdlWCwgZ19wYWdlWSwgLy8gcG9zaXRpb24gb2YgY2FudmFzCmdfd2FpdCA9IDAsCmdfaW5maW4gPSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAsCgpnX2FkaHRtLCBnX2RvbSwKZ19tb3osCmdfdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCmdfaWUgPSAhISghd2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmFsbCAmJiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpKSwKZ19pZW1hYyA9ICEhKGdfaWUgJiYgZ191YS5pbmRleE9mKCdtYWMnKSA+PSAwKSwKZ19rcSA9ICEhKGdfdWEuaW5kZXhPZigna29ucXUnKSA+PSAwKSwKZ19kYiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5IHx8IG51bGw7CgoKZnVuY3Rpb24gaW5pdChvKQp7CglnX2ZyYW1lID0gZ2V0RGl2KCdncmFwaGZyYW1lJyk7CglpZiAoIWdfZnJhbWUpIHJldHVybjsKCWdfdyA9IGdfaCA9IERFRlc7CgkobyA9IGdfZnJhbWUuc3R5bGUpLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglvLmhlaWdodCA9IChUT1ArZ19oK0JPVFRPTSkrJ3B4JzsKCW8uYmFja2dyb3VuZCA9IChnX2lucHV0VGIgPSBnZXREaXYoJ2lucHV0cycpKS5zdHlsZS5iYWNrZ3JvdW5kID0gRlJBTUVDT0xPUjsKCWdfaW5wdXRUYi5zdHlsZS53aWR0aCA9IChnX3crMStMRUZUK1JJR0hUKSsncHgnOwoJby5ib3JkZXJCb3R0b20gPSBvLmJvcmRlclJpZ2h0ID0gby5ib3JkZXJMZWZ0ID0gZ19pbnB1dFRiLnN0eWxlLmJvcmRlclRvcCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJSaWdodCA9IGdfaW5wdXRUYi5zdHlsZS5ib3JkZXJMZWZ0ID0gJzFweCBzb2xpZCAnK0JPUkRFUkNPTE9SOwoJZ19hZGh0bSA9ICh0eXBlb2YgZ19mcmFtZS5pbnNlcnRBZGphY2VudEhUTUwgIT0gInVuZGVmaW5lZCIpOwoJZ19kb20gPSAoIWdfYWRodG0gJiYKCQl0eXBlb2YgZ19mcmFtZS5hcHBlbmRDaGlsZCAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiBkb2N1bWVudC5jcmVhdGVSYW5nZSAhPSAidW5kZWZpbmVkIiAmJgoJCXR5cGVvZiAobyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLnNldFN0YXJ0QmVmb3JlICE9ICJ1bmRlZmluZWQiICYmCgkJdHlwZW9mIG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsKCWdfbW96ID0gZG9jdW1lbnQuYm9keSAmJiB0eXBlb2YgZG9jdW1lbnQuYm9keS5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOwoJZ2V0Q252UG9zKCk7CglwYWludChnX2ZyYW1lLAoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QLCBnX3crMSwgZ19oKzEsIENOVkNPTE9SLCAnYmdseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2dyaWRseXInKSsKCQlta0RpdignJywgJycsIExFRlQsIFRPUCwgZ193KzEsIGdfaCsxLCAnJywgJ2Nudmx5cicpKwoJCW1rRGl2KCcnLCAnJywgTEVGVCwgVE9QK2dfaCsxLCBnX3crMSwgQk9UVE9NLCAnJywgJ3hseXInLCB0cnVlKSsKCQlta0RpdignJywgJ3JpZ2h0JywgMCwgVE9QLCBMRUZULCBnX2grMSwgJycsICd5bHlyJywgdHJ1ZSkrCgkJbWtEaXYoJycsICcnLCBMRUZUK2dfdys0LCBUT1ArKGdfaD4+MSktMjAwLCBSSUdIVCwgZ19oLCAnJywgJ29wdHMnLCB0cnVlKQoJKTsKCXBhaW50KGdldERpdignb3B0cycpLAoJCSc8aW5wdXQgbmFtZT0iR1JJRCIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgb25jbGljaz0ic2V0VGltZW91dChcJ3NldEdyaWRWaXMoKTtcJywgMTApIj4nK1NfU0hPV0dSSUQrCgkJJzxicj4mbmJzcDs8YnI+PGlucHV0IG5hbWU9IlhZUkFUSU8iIHR5cGU9ImNoZWNrYm94Ij4nK1NfU0FNRVNDQUxFKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJGSVRXTkQiIHR5cGU9ImNoZWNrYm94Ij4nK1NfRklUV05EKwoJCSc8YnI+Jm5ic3A7PGJyPjxpbnB1dCBuYW1lPSJQUlQiIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJzZXRUaW1lb3V0KFwncHJ0KCk7XCcsIDEwKSI+JytTX1BSVFZJRVcrCgkJJzxicj4mbmJzcDs8YnI+Jm5ic3A7PGJyPiZuYnNwOzxicj4nK1NfUE9TVFJFUElORywKCQl0cnVlCgkpOwoJKG8gPSAoZ19jbnYgPSBnZXREaXYoJ2Nudmx5cicpKS5zdHlsZSkuekluZGV4ID0gMTsKCW8uY3Vyc29yID0gJ2Nyb3NzaGFpcic7CglnX3hseXIgPSBnZXREaXYoJ3hseXInKTsKCWdfeWx5ciA9IGdldERpdigneWx5cicpOwoJZ19ncmlkbHlyID0gZ2V0RGl2KCdncmlkbHlyJyk7CglnX3Rlcm1seXIgPSBnZXREaXYoJ3Rlcm1zJyk7CglnX29wdHNseXIgPSBnZXREaXYoJ29wdHMnKTsKCWlmIChkb2N1bWVudC5jYXB0dXJlRXZlbnRzKSBkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFTU9WRSk7Cgl3aW5kb3cub25yZXNpemUgPSBnZXRDbnZQb3M7Cn0KCgpmdW5jdGlvbiBpc051bSh4KQp7CglyZXR1cm4gKCFpc05hTih4KSAmJiB0eXBlb2YgeCA9PSAnbnVtYmVyJyk7Cn0KCgpmdW5jdGlvbiBnZXREaXYoeCkKewoJeCA9ICEhZG9jdW1lbnQuYWxsPyBkb2N1bWVudC5hbGxbeF0gOiAhIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh4KSA6IG51bGw7CglyZXR1cm4gKHggJiYgdHlwZW9mIHguc3R5bGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHguaW5uZXJIVE1MICE9ICd1bmRlZmluZWQnKT8geCA6IG51bGw7Cn0KCgpmdW5jdGlvbiBnZXRDbnZQb3MobykKewoJZ19wYWdlWCA9IExFRlQrMTsKCWdfcGFnZVkgPSBUT1A7CglvID0gZ19mcmFtZTsKCXdoaWxlIChvLm9mZnNldFBhcmVudCkKCXsKCQlnX3BhZ2VYICs9IG8ub2Zmc2V0TGVmdDsKCQlnX3BhZ2VZICs9IG8ub2Zmc2V0VG9wOwoJCW8gPSBvLm9mZnNldFBhcmVudDsKCX0KfQoKCmZ1bmN0aW9uIGdldFZhbChlbCwgeSkKewoJcmV0dXJuICgoeSA9IGVsLnZhbHVlLnJlcGxhY2UoLyAvZywgJycpKSA9PSAnJyB8fCAhaXNOYU4oeSA9IHBhcnNlRmxvYXQoeS5yZXBsYWNlKC9cLC8sJy4nKSkpKT8geSA6ICduJzsKfQoKCmZ1bmN0aW9uIGFsZXJ0RXJyKGVsLCBzdHIpCnsKCWFsZXJ0KFNfRVJSX0JBU0UgKyBzdHIpOwoJZWwuZm9jdXMoKTsKCWVsLnNlbGVjdCgpOwp9CgoKZnVuY3Rpb24gc2V0Q3NzV0gobywgdywgaCwgb3ZlcikKewoJKG8gPSBvLnN0eWxlKS53aWR0aCA9IHcrJ3B4JzsKCW8uaGVpZ2h0ID0gaCsncHgnOwoJaWYgKCFvdmVyKQoJewoJCW8uY2xpcCA9ICdyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApJzsKCQlvLm92ZXJmbG93ID0gJ2hpZGRlbic7Cgl9Cn0KCgpmdW5jdGlvbiByZXNpemVDbnYobykKewoJZ19pbnB1dFRiLnN0eWxlLndpZHRoID0gKExFRlQrZ193KzErUklHSFQpKydweCc7CglzZXRDc3NXSChnX2ZyYW1lLCBMRUZUK2dfdysxK1JJR0hULCBNYXRoLm1heCgzNTAsIFRPUCtnX2grQk9UVE9NKSk7CglzZXRDc3NXSChnZXREaXYoJ2JnbHlyJyksIGdfdysxLCBnX2grMSk7CglzZXRDc3NXSChnX2NudiwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfZ3JpZGx5ciwgZ193KzEsIGdfaCsxKTsKCXNldENzc1dIKGdfeWx5ciwgTEVGVCwgZ19oKzEsIHRydWUpOwoJc2V0Q3NzV0goKG8gPSBnX3hseXIpLCBnX3crMSwgQk9UVE9NLCB0cnVlKTsKCW8uc3R5bGUudG9wID0gKFRPUCtnX2grMSkrJ3B4JzsKCWdfb3B0c2x5ci5zdHlsZS5sZWZ0ID0gKExFRlQrZ193KzUpKydweCc7Cn0KCgpmdW5jdGlvbiBmaXRXbmQoKQp7CglpZiAoZG9jdW1lbnQuZm9ybXMuZm8uRklUV05ELmNoZWNrZWQpCgl7CgkJaWYgKCEhKChvID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpICYmIG8uY2xpZW50V2lkdGgpKQoJCXsKCQkJdmFyIF93ID0gby5jbGllbnRXaWR0aDsKCQkJdmFyIF9oID0gby5jbGllbnRIZWlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJCXZhciBfdyA9IHdpbmRvdy5pbm5lcldpZHRoOwoJCQl2YXIgX2ggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CgkJfQoJCWdfdyA9IGdfaCA9IE1hdGgubWluKF93LV93JTItTEVGVC1SSUdIVCwgX2gtX2glMi1UT1AtQk9UVE9NKS00OwoJfQoJZWxzZSBnX3cgPSBnX2ggPSBERUZXOwoJcmVzaXplQ252KCk7CglnZXRDbnZQb3MoKTsKfQoKCmZ1bmN0aW9uIGluaXRDb29yZHRpcChvKQp7CgkobyA9IChnX2Nvb3JkdGlwID0gZ2V0RGl2KCdjb29yZHRpcCcpKS5zdHlsZSkubGVmdCA9IChnX3BhZ2VYKzE1KSsncHgnOwoJby50b3AgPSAoZ19wYWdlWSsxMCkrJ3B4JzsKCW8uekluZGV4ID0gMjsKCXBhaW50KGdfY29vcmR0aXAsICc8c21hbGwgc3R5bGU9ImJhY2tncm91bmQ6JytDTlZDT0xPUisnO3doaXRlLXNwYWNlOm5vd3JhcDsiPicrU19DT09SRFRJUCsnPFwvc21hbGw+Jyk7CglnX2Nudi5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uKCkge2RvY3VtZW50Lm9ubW91c2Vtb3ZlID0gY29vcmRUaXA7IGdfY252Lm9ubW91c2VvdmVyID0gbnVsbDt9Cn0KCgpmdW5jdGlvbiBwcnQoKQp7CglnZXREaXYoJ2JvZHkxJykuc3R5bGUuZGlzcGxheSA9IGdldERpdignYm9keTInKS5zdHlsZS5kaXNwbGF5ID0gKGRvY3VtZW50LmZvcm1zLmZvLlBSVC5jaGVja2VkKT8gJ25vbmUnIDogJ2Jsb2NrJzsKCWdldENudlBvcygpOwp9CgoKZnVuY3Rpb24gc2V0R3JpZFZpcygpCnsKCWdfZ3JpZGx5ci5zdHlsZS52aXNpYmlsaXR5ID0gKGRvY3VtZW50LmZvcm1zLmZvLkdSSUQuY2hlY2tlZCk/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwp9CgoKZnVuY3Rpb24gZGVsR3JhcGhzKGFzaykKewoJaWYgKGFzayAmJiAhKGdfbiAmJiB3aW5kb3cuY29uZmlybShTX0RFTEdSQVBIUykpKSByZXR1cm47CglnX24gPSAwOwoJcGFpbnQoZ19jbnYsICcnKTsKCXBhaW50KGdfdGVybWx5ciwgJycpOwp9CgoKU3RyaW5nLnByb3RvdHlwZS50b0V4cCA9IGZ1bmN0aW9uKCkKewoJdmFyIG5lZyA9ICh0aGlzLmNoYXJBdCgwKSA9PSAnLScpKjE7Cgl2YXIgbiA9IHRoaXMubWF0Y2goL1sxLTldL2cpLmxlbmd0aDsKCWlmIChNYXRoLmFicyhwYXJzZUZsb2F0KHRoaXMpKSA+IDEpCgkJcmV0dXJuIHRoaXMuc3Vic3RyaW5nKDAsbmVnKzEpICsgKChuLTEpPyAoJy4nK3RoaXMuc3Vic3RyaW5nKG5lZysxLCB0aGlzLmluZGV4T2YoJzAnKSkpIDogJycpICsgJyoxMDxzdXA+JyArICh0aGlzLmxlbmd0aC0xLW5lZykgKyAnPFwvc3VwPic7CglyZXR1cm4gKG5lZz8gJy0nIDogJycpICsgdGhpcy5tYXRjaCgvWzEtOV0vKVswXSArICgobi0xKT8gKCcuJyt0aGlzLnN1YnN0cmluZyh0aGlzLmxlbmd0aC1uKzEpKSA6ICcnKSArICcqMTA8c3VwPi0nICsgKHRoaXMuc3Vic3RyaW5nKHRoaXMuaW5kZXhPZignLicpKzEpLmxlbmd0aC1uKzEpICsgJzxcL3N1cD4nOwp9CgoKZnVuY3Rpb24gc2hpZnRMKHgsIG4pCnsKCXZhciBuZWcgPSAoeCA8IDApPyAnLScgOiAnJzsKCXggPSAnJytNYXRoLmFicyh4KTsKCXdoaWxlIChuLS0pCgl7CgkJaWYgKHguY2hhckF0KHgubGVuZ3RoLTEpID09ICcwJykKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpOwoJCWVsc2UgaWYgKCEoL1wuLykudGVzdCh4KSkKCQkJeCA9IHguc3Vic3RyaW5nKDAsIHgubGVuZ3RoLTEpKycuJyt4LmNoYXJBdCh4Lmxlbmd0aC0xKTsKCQllbHNlIGlmICgheC5pbmRleE9mKCcuJykpCgkJCXggPSAnLjAnK3guc3Vic3RyaW5nKDEpOwoJCWVsc2UgeCA9IHguc3Vic3RyaW5nKDAsIHguaW5kZXhPZignLicpLTEpKycuJyt4LmNoYXJBdCh4LmluZGV4T2YoJy4nKS0xKSt4LnN1YnN0cmluZyh4LmluZGV4T2YoJy4nKSsxKTsKCX0KCWlmICh4LmNoYXJBdCgwKSA9PSAnLicpIHggPSAnMCcreDsKCXJldHVybiBuZWcreDsKfQoKCmZ1bmN0aW9uIG1rSXYoeCkKewoJeCAqPSBERUZXL2dfdzs7Cgl2YXIgaSA9IDA7Cgl3aGlsZSAoeC0xMDAgPD0gMCkKCXsKCQl4ICo9IDEwOwoJCWkrKzsKCX0KCXdoaWxlICh4LTEwMDAgPiAwKQoJewoJCXggLz0gMTA7CgkJaS0tOwoJfQoJeCA9IE1hdGguZmxvb3IoeCk7Cgl4ID0gKHgtNjAwID49IDApPyAxMDAgOiAoeC0zMDAgPj0gMCk/IDUwIDogKHgtMjAwID49IDApPyAyNSA6IDIwOwoJd2hpbGUgKGkgPCAwKQoJewoJCXggPSBwYXJzZUludCh4ICs9ICcwJyk7CgkJaSsrOwoJfQoJcmV0dXJuIHBhcnNlRmxvYXQoc2hpZnRMKHgsIGkpKTsKfQoKCmZ1bmN0aW9uIG1rTnVtU3RyKG4sIGl2LCB0b0UpCnsKCXZhciBpID0gMDsKCWlmICghbiB8fCAhaXYpIHJldHVybiAnMCc7Cgl3aGlsZSAoTWF0aC5hYnMoaXYpLTEgPCAwKQoJewoJCWl2ICo9IDEwOwoJCWkrKzsKCX0KCW4gPSBzaGlmdEwoIXRvRT8gTWF0aC5yb3VuZChuKml2KSA6IChuKml2KSwgaSk7CglyZXR1cm4gKHRvRSAmJiBuLmxlbmd0aCA+IDYpPyBuLnRvRXhwKCkgOiBuOwp9CgoKZnVuY3Rpb24gbWtTY2FsZSgpCnsKCXZhciBpdnggPSBta0l2KGdfeHotZ194YSksIGl2eSA9IG1rSXYoKGdfeXotZ195YSkqZ193L2dfaCksCglyeCA9IGl2eC9nX2R4LCByeSA9IGl2eS9nX2R5LAoJaHRtID0gJycsIGdyaWRodG0gPSAnJywKCXBvcywgc3RyLCBzdHJzLCBzdHJsLAoJbGltdCA9IE1hdGgucm91bmQoZ194ei9nX2R4KSwgbGltYiA9IE1hdGgucm91bmQoZ194YS9nX2R4KSwKCWogPSBNYXRoLmNlaWwoZ194YS9pdngpLAoJaSA9IE1hdGgucm91bmQoaipyeCk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RycyA9IChzdHIgPSAnJytta051bVN0cihqLCBpdngsIHRydWUpKS5tYXRjaCgvW15cPlw8YS16XSsvZyk7CgkJc3RybCA9IHN0cnNbMF0ubGVuZ3RoICsgKHN0cnNbMV0/IHN0cnNbMV0ubGVuZ3RoIDogMCk7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgKHBvcyA9IGktbGltYiksIDAsIDEsIDQsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAnJywgcG9zLTMqc3RybCwgNCwgMTYqc3RybCwgMTIsICcnLCAnJywgdHJ1ZSwgZmFsc2UpOwoJCWdyaWRodG0gKz0gbWtEaXYoJycsICcnLCAgcG9zLCAwLCAxLCBnX2grMSwgIWo/IEFYQ09MT1IgOiBHUklEQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSk7CgkJaSA9IE1hdGgucm91bmQoKytqKnJ4KTsKCX0KCXBhaW50KGdfeGx5ciwgaHRtKTsKCXZhciBzY2x3ID0gcGFyc2VJbnQoZ195bHlyLnN0eWxlLndpZHRoKTsKCWh0bSA9ICcnOwoJbGltdCA9IE1hdGgucm91bmQoZ195ei9nX2R5KSwgbGltYiA9IE1hdGgucm91bmQoZ195YS9nX2R5KTsKCWogPSBNYXRoLmNlaWwoZ195YS9pdnkpOwoJaSA9IE1hdGgucm91bmQoaipyeSk7Cgl3aGlsZSAoaS1saW10IDw9IDApCgl7CgkJc3RybCA9IChzdHIgPSAnJytta051bVN0cihqLCBpdnksIHRydWUpKS5sZW5ndGg7CgkJaHRtICs9IG1rRGl2KCcnLCAnJywgc2Nsdy00LCAocG9zID0gZ19oLWkrbGltYiksIDQsIDEsIFNDQUxFQ09MT1IsICcnLCBmYWxzZSwgdHJ1ZSkrCgkJCW1rRGl2KCc8Zm9udCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Ij4nK3N0cisnPFwvZm9udD4nLCAncmlnaHQnLCAwLCBwb3MtNywgc2Nsdy02LCAxMiwgJycsICcnLCB0cnVlLCBmYWxzZSk7CgkJZ3JpZGh0bSArPSBta0RpdignJywgJycsICAwLCBwb3MsIGdfdysxLCAxLCAhaj8gQVhDT0xPUiA6IEdSSURDT0xPUiwgJycsIGZhbHNlLCB0cnVlKTsKCQlpID0gTWF0aC5yb3VuZCgrK2oqcnkpOwoJfQoJcGFpbnQoZ195bHlyLCBodG0pOwoJcGFpbnQoZ19ncmlkbHlyLCBncmlkaHRtKTsKfQoKCmZ1bmN0aW9uIG1rRGl2KHR4dCwgYWxpZ24sIHgsIHksIHcsIGgsIGMsIGlkLCBvdmVyLCBjdXQpCnsKCWlmIChjdXQpCgl7CgkJaWYgKHgtZ193ID4gMCB8fCB4K3cgPCAwIHx8IHktZ19oID4gMCB8fCB5K2ggPCAwKSByZXR1cm4gJyc7CgkJaWYgKHkgPCAwKQoJCXsKCQkJaCArPSB5OwoJCQl5ID0gMDsKCQl9CgkJaWYgKHkraC1nX2gtMSA+IDApIGggPSBnX2grMS15OwoJCWlmICh4IDwgMCkKCQl7CgkJCXcgKz0geDsKCQkJeCA9IDA7CgkJfQoJCWlmICh4K3ctZ193LTEgPiAwKSB3ID0gZ193KzEreDsKCX0KCWlmIChnX2llKSByZXR1cm4gKCclJScreCsnOycreSsnOycrdysnOycraCsnOycrKGFsaWduPyAncmlnaDsnIDogJ2xlZjsnKSsoYz8gKGMrJzsnKSA6ICc7JykrKG92ZXI/ICd2aXNpYmxlOycgOiAnaGlkZGVuOycpKyhpZD8gKCcgaWQ9IicraWQrJyI+JykgOiAnPicpK3R4dCk7CglyZXR1cm4gKCc8ZGl2JysKCQkoaWQ/ICcgaWQ9IicraWQrJyInIDogJycpKwoJCScgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JyArIHggKyAncHg7dG9wOicgKyB5ICsgJ3B4O3dpZHRoOicgKyB3ICsgJ3B4O2hlaWdodDonICsgaCArICdweDsnKwoJCShvdmVyPyAnJyA6ICgnY2xpcDpyZWN0KDAsJyArIHcgKyAncHgsJyArIGggKyAncHgsMCk7JyArIChnX21vej8gJycgOiAnb3ZlcmZsb3c6aGlkZGVuOycpKSkrCgkJKGM/ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBjICsgJzsnIDogJycpKwoJCSd0ZXh0LWFsaWduOicgKyAoYWxpZ24gfHwgJ2xlZnQnKSArICc7Ij4nICsgdHh0ICsgJzxcL2Rpdj4nCgkpOwp9CgoKZnVuY3Rpb24gZ1JlcGxhY2UoeCkKewoJcmV0dXJuIHgucmVwbGFjZSgvJSUoW147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOyhbXjtdKyk7KFteO10qKTsoW147XSspOyhbXiUlXSopL2csCgkJJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6JDFweDt0b3A6JDJweDt3aWR0aDokM3B4O2hlaWdodDokNHB4O3RleHQtYWxpZ246JDV0OycrCgkJJ2JhY2tncm91bmQ6JDY7b3ZlcmZsb3c6JDc7IiQ4PFwvZGl2PicpOwp9CgoKZnVuY3Rpb24gcGFpbnQoY252LCBodG0sIGFkZCkKewoJaWYgKGNudikKCXsKCQlpZiAoYWRkKQoJCXsKCQkJdmFyIG87CgkJCWlmIChnX2FkaHRtKSBjbnYuaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLCBnUmVwbGFjZShodG0pKTsKCQkJZWxzZSBpZiAoZ19kb20pCgkJCXsKCQkJCW8gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCQkJby5zZXRTdGFydEJlZm9yZShjbnYpOwoJCQkJbyA9IG8uY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bSk7CgkJCQljbnYuYXBwZW5kQ2hpbGQobyk7CgkJCX0KCQkJZWxzZSBjbnYuaW5uZXJIVE1MICs9IGh0bTsKCQl9CgkJZWxzZSBjbnYuaW5uZXJIVE1MID0gZ19pZT8gZ1JlcGxhY2UoaHRtKSA6IGh0bTsKCX0KfQoKCmZ1bmN0aW9uIHNjYWxlWSh4KQp7CglyZXR1cm4gKE1hdGgubWluKE1hdGgubWF4KGdfaCtNYXRoLnJvdW5kKChnX3lhLXgpL2dfZHkpLCAtMSksIGdfaCsxKSk7Cn0KCgpmdW5jdGlvbiBta1Rlcm0oeCkKewoJeCA9IHgudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccy9nLCcnKS4KCQlyZXBsYWNlKC9mKFwofFx7fFxbKXgoXCl8XH18XF0pXD0vZywgJycpLgoJCXJlcGxhY2UoL21hdGhcLi9nLCcnKS4KCQlyZXBsYWNlKC9cLipcOysvZywnOycpLgoJCXJlcGxhY2UoL1tcLlw7XSokLywnJykuCgkJcmVwbGFjZSgvXHwoW15cfF0qKVx8L2csJ2FicygkMSknKS4KCQlyZXBsYWNlKC86L2csJ1wvJykuCgkJcmVwbGFjZSgvsi9nLCdeMicpLgoJCXJlcGxhY2UoL7MvZywnXjMnKS4KCQlyZXBsYWNlKC9bXCJcJ10vZywnXicpLgoJCXJlcGxhY2UoL2UvZywnRScpLgoJCXJlcGxhY2UoL2xvZyhcZCkvZywnTE9HJDEnKS4KCQlyZXBsYWNlKC9sbihcZCkvZywnTE4kMScpLgoJCXJlcGxhY2UoL2FyYyh1cyk/fGFyRWF8YXIvZywnYScpLgoJCXJlcGxhY2UoL2h5cChFcmJvbGljdXMpPy9nLCdoJykuCgkJcmVwbGFjZSgvY29zaW4odXN8RSk/L2csJ2NvcycpLgoJCXJlcGxhY2UoL3Npbih1c3xFKS9nLCdzaW4nKS4KCQlyZXBsYWNlKC9zRWMoYW4oc3x0KSk/L2csJ3NlYycpLgoJCXJlcGxhY2UoL2Nvc2VjL2csJ2NzYycpLgoJCXJlcGxhY2UoL3RhbmdFbltzdF0vZywndGFuJykuCgkJcmVwbGFjZSgvY290YW4vZywnY290JykuCgkJcmVwbGFjZSgvcmFuZG9tKFwofFx7fFxbKShcKXxcfXxcXSl8cmFuZChvbSk/L2csJ3JhbmRvbSgpJykuCgkJcmVwbGFjZSgvKHB8cG93ZXIpKFwofFx7fFxbKS9nLCdwb3ckMicpLgoJCXJlcGxhY2UoLyhifHEpcihcKHxce3xcWykvZywnJDFydCQyJykuCgkJcmVwbGFjZSgvKHNxcnxzcXJ0KShcZCkvZywnU1FSVCQyJykuCgkJcmVwbGFjZSgvdGFuMi9nLCAndGFueicpLgoJCXJlcGxhY2UoL21heC9nLCdtYXonKS4KCQlyZXBsYWNlKC9waS9nLCdQSScpLgoJCXJlcGxhY2UoL3BoaS9nLCdQSEknKS4KCQlyZXBsYWNlKC95LywnbnV0cycpLgoJCXJlcGxhY2UoL2NFaWwvZywnY2VpbCcpLgoJCXJlcGxhY2UoL0V4cG93fEV4cC9nLCdleHAnKS4KCQlyZXBsYWNlKC8oW15tXXxeKShcKHxce3xcWykoXCl8XH18XF0pL2csJyQxJDJ4JDMnKS4KCQlyZXBsYWNlKC8oXCh8XHt8XFspXCwvZywnJDF4LCcpLgoJCXJlcGxhY2UoL1wsKFwpfFx9fFxdKS9nLCcseCQxJykuCgkJcmVwbGFjZSgvXCxcLC9nLCcseCwnKTsKCXggPSB4LnJlcGxhY2UoLyhbXkddXGRcZHxbXkdcZF1cZHxeXGR8XlxkXGQpRS9nLCckMSpFJyk7Cgl4ID0geC5yZXBsYWNlKC8oUlQxXzJ8UlQyfExOMTB8TE4yKShcZCkvZywnJDEqJDInKTsKCXZhciByZWcgPSAvKHh8RXxQSXxcKXxcfXxcXSkoRXxcZCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJcmVnID0gLyhcZHxFfFBJfHh8XCl8XH18XF0pKFwofFx7fFxbfHh8YXxjfGV4cHxmfGdhdXN8bHxtfHBvd3xyfHN8dGFufEx8UEl8U1FSVCkvZzsKCXdoaWxlICh4Lm1hdGNoKHJlZykpIHggPSB4LnJlcGxhY2UocmVnLCckMSokMicpOwoJeCA9IHgucmVwbGFjZSgvdGFuei9nLCd0YW4yJykucmVwbGFjZSgvbWF6L2csJ21heCcpOwoJcmV0dXJuIHg7Cn0KCgpmdW5jdGlvbiBXek1hdGgoKQp7Cgl0aGlzLlBISSA9IDEuNjE4MDMzOTg4NzQ5ODk0ODQ4MjA0NTg2ODM0MzY1NjsKCXRoaXMucm9vdCA9IGZ1bmN0aW9uKHgsIHhwKSB7cmV0dXJuIE1hdGgucG93KHgsIDEveHApO307Cgl0aGlzLmNicnQgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgucG93KHgsIDEvMyk7fTsKCXRoaXMubG9nbiA9IGZ1bmN0aW9uKHgsIGJzKSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGgubG9nKGJzKTt9OwoJdGhpcy5sbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coeCk7fTsKCXRoaXMubGcgPSBmdW5jdGlvbiAoeCkge3JldHVybiBNYXRoLmxvZyh4KS9NYXRoLkxOMTA7fTsKCXRoaXMubGIgPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKHgpL01hdGguTE4yO307Cgl0aGlzLmNvdCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5jb3MoeCkvTWF0aC5zaW4oeCk7fTsKCXRoaXMuc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiAxL01hdGguY29zKHgpO307Cgl0aGlzLmNzYyA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMS9NYXRoLnNpbih4KTt9OwoJdGhpcy5hY290ID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmF0YW4oLXgpK01hdGguUEkvMjt9OwoJdGhpcy5hc2VjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFjb3MoMS94KTt9OwoJdGhpcy5hY3NjID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmFzaW4oMS94KTt9OwoJdGhpcy5zaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiAoTWF0aC5leHAoeCktTWF0aC5leHAoLXgpKS8yO307Cgl0aGlzLmNvc2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCh4KStNYXRoLmV4cCgteCkpLzI7fTsKCXRoaXMuc2VjaCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gMi8oTWF0aC5leHAoeCkrTWF0aC5leHAoLXgpKTt9OwoJdGhpcy5jc2NoID0gZnVuY3Rpb24oeCkge3JldHVybiAyLyhNYXRoLmV4cCh4KS1NYXRoLmV4cCgteCkpO307Cgl0aGlzLnRhbmggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpLTEpLyhNYXRoLmV4cCgyKngpKzEpO307Cgl0aGlzLmNvdGggPSBmdW5jdGlvbih4KSB7cmV0dXJuIChNYXRoLmV4cCgyKngpKzEpLyhNYXRoLmV4cCgyKngpLTEpO307Cgl0aGlzLmFzaW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngrMSkpO307Cgl0aGlzLmFjb3NoID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZyh4K01hdGguc3FydCh4KngtMSkpO307Cgl0aGlzLmF0YW5oID0gZnVuY3Rpb24oeCkge3JldHVybiBNYXRoLmxvZygoMSt4KS8oMS14KSkvMjt9OwoJdGhpcy5hY290aCA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gTWF0aC5sb2coKHgrMSkvKHgtMSkpLzI7fTsKCXRoaXMuYXNlY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KS0xKSk7fTsKCXRoaXMuYWNzY2ggPSBmdW5jdGlvbih4KSB7cmV0dXJuIE1hdGgubG9nKDEveCtNYXRoLnNxcnQoMS8oeCp4KSsxKSk7fTsKCXRoaXMuZ2F1c3NkID0gZnVuY3Rpb24oeCxtLHMpIHtyZXR1cm4gMS8ocyoyLjUwNjYyODI3NDYzMTAwMDIpKk1hdGguZXhwKC0oeCAtPSBtKSp4LygyKnMqcykpO307Cgl0aGlzLnNnbiA9IGZ1bmN0aW9uKHgpIHtyZXR1cm4gKHggPCAwKT8gLTEgOiAoeCA+IDApPyAxIDogMDt9OwoJdGhpcy5mYWN0ID0gZnVuY3Rpb24oeCkKCXsKCQl4ID0gTWF0aC5yb3VuZChNYXRoLmFicyh4KSk7CgkJaWYgKHggPiAxKSByZXR1cm4geCp0aGlzLmZhY3QoeC0xKTsKCQlyZXR1cm4gMTsKCX07IAp9Cld6TWF0aC5wcm90b3R5cGUgPSBNYXRoOwpXek1hdGggPSBuZXcgV3pNYXRoKCk7ICAgICAgICAKCgpmdW5jdGlvbiBta1Bvdyh4KQp7Cgl4ID0geC5yZXBsYWNlKC9ce3xcWy9nLCcoJykucmVwbGFjZSgvXH18XF0vZywnKScpOwoJd2hpbGUgKC9cXi8udGVzdCh4KSkKCXsKCQl2YXIgYXogPSB4LnNlYXJjaCgvXF4vKSwKCQlhID0geC5zdWJzdHJpbmcoMCwgYXopLCB6ID0geC5zdWJzdHJpbmcoYXorMSksCgkJcCA9IDAsIGNoLCBsaW0gPSBhei0xOwoJCXdoaWxlICh0cnVlKQoJCXsKCQkJY2ggPSBhLmNoYXJBdChsaW0pOwoJCQlpZiAoY2ggPT0gJyknKSBwKys7CgkJCWVsc2UgaWYgKGNoID09ICcoJykgcC0tOwoJCQlpZiAocCA8IDAgfHwgIXAgJiYgKCEobGltKzEpIHx8IC9bXCtcLVwqXC9cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbS0tOwoJCX0KCQlhID0gYS5zdWJzdHJpbmcoMCwgbGltKzEpICsgJ3BvdygnICsgYS5zdWJzdHJpbmcobGltKzEsIGF6KTsKCQlsaW0gPSAwOyBwID0gMDsKCQl3aGlsZSAodHJ1ZSkKCQl7CgkJCWNoID0gei5jaGFyQXQobGltKTsKCQkJaWYgKGNoID09ICcoJykgcCsrOwoJCQllbHNlIGlmIChjaCA9PSAnKScpIHAtLTsKCQkJaWYgKHAgPCAwIHx8ICFwICYmIChsaW0gPT0gei5sZW5ndGggfHwgbGltID4gMCAmJiAvW1wrXC1cKlwvXF5cLF0vLnRlc3QoY2gpKSkgYnJlYWs7CgkJCWxpbSsrOwoJCX0KCQl6ID0gei5zdWJzdHJpbmcoMCwgbGltKSArICcpJyArIHouc3Vic3RyaW5nKGxpbSk7CgkJeCA9IGErJywnK3o7Cgl9CglyZXR1cm4geDsKfQoKCk51bWJlci5wcm90b3R5cGUubGltID0gZnVuY3Rpb24oaSwgaiwgeGRpciwgeWRpcikKewoJdmFyIHl5ID0gcGFyc2VGbG9hdCh0aGlzKSwgeSwKCWluY3IgPSBnX2R4LzEwMCwgX2luY3IgPSBpbmNyKnhkaXIsIHF0ID0gMSwgbGltID0gKGdfeGErKGoreGRpcikqZ19keCksCgl4ID0gZ194YStqKmdfZHg7Cgl3aGlsZSAocXQgPCAweDEwMDAwMCAmJiAhISgoeGRpciA8IDApPyAoeC1saW0gPiAwKSA6ICh4LWxpbSA8IDApKSkKCXsKCQl4ICs9IF9pbmNyOwoJCXkgPSBnRXZhbCh4LCBnX3Rlcm1baV0pOwoJCWlmIChpc051bSh5KSAmJiB5KnlkaXIteXkqeWRpciA+IDApIHl5ID0geTsKCQllbHNlCgkJewoJCQl4IC09IF9pbmNyOwoJCQlfaW5jciA9IGluY3IqeGRpci8ocXQgPDw9IDMpOwoJCX0KCX0KCXJldHVybiB5eTsKfQoKCmZ1bmN0aW9uIGdFdmFsKHgsIHRlcm0sIHkpCnsKCXdpdGggKFd6TWF0aCkgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHBhcnNlRmxvYXQoZXZhbCh0ZXJtKSksLWdfaW5maW4pLGdfaW5maW4pOwp9CgoKZnVuY3Rpb24gbWtHcmFwaChmKQp7CglpZiAoIWdfY252KQoJewoJCWFsZXJ0KFNfT0xEQlJPV1NFUik7CgkJcmV0dXJuOwoJfQoJZ19odG0gPSAnJzsKCXZhciB4YSA9IGdldFZhbChmLlhBKSwKCXh6ID0gZ2V0VmFsKGYuWFopOwoJaWYgKCFpc051bSh4YSkpIHJldHVybiBhbGVydEVycihmLlhBLCAneCBtaW4nKTsKCWlmICghaXNOdW0oeHopKSByZXR1cm4gYWxlcnRFcnIoZi5YWiwgJ3ggbWF4Jyk7CglpZiAoeGEgPj0geHopIHJldHVybiBhbGVydEVycihmLlhBLCBTX0VSUl9YUkFOR0UpOwoJaWYgKCFmLkFkZC5jaGVja2VkKSBnX24gPSAwOwoJaWYgKCFnX24pCgl7CgkJdmFyIHlhID0gZ2V0VmFsKGYuWUEpLAoJCXl6ID0gZ2V0VmFsKGYuWVopOwoJCWlmICghaXNOdW0oeWEpICYmIHlhICE9ICcnKSByZXR1cm4gYWxlcnRFcnIoZi5ZQSwgJ3kgbWluJyk7CgkJaWYgKCFpc051bSh5eikgJiYgeXogIT0gJycpIHJldHVybiBhbGVydEVycihmLllaLCAneSBtYXgnKTsKCQlpZiAoaXNOdW0oeWEpICYmIGlzTnVtKHl6KSAmJiB5YSA+PSB5eikgcmV0dXJuIGFsZXJ0RXJyKGYuWUEsIFNfRVJSX1lSQU5HRSk7CgkJZml0V25kKCk7CgkJZ194YSA9IHhhOwoJCWdfeHogPSB4ejsKCQlnX2R4ID0gKHh6LXhhKS9nX3c7CgkJZ195YSA9IHlhOwoJCWdfeXogPSB5ejsKCQlpZiAoIWlzTnVtKHlhKSkgeWEgPSBnX2luZmluOwoJCWlmICghaXNOdW0oeXopKSB5eiA9IC1nX2luZmluOwoJCWRlbEdyYXBocygpOwoJfQoJZ190ZXJtID0gbWtUZXJtKGYuRi52YWx1ZSkuc3BsaXQoJzsnKTsKCXZhciB0ZXJtID0gW107Cgl2YXIgeXkgPSBbXSwgeTsKCXRyeQoJewoJCWZvciAoaSA9IDA7IGkgPCBnX3Rlcm0ubGVuZ3RoOyBpKyspCgkJewoJCQlnX3Rlcm1baV0gPSBta1Bvdyh0ZXJtW2ldID0gZ190ZXJtW2ldKTsKCQkJd2hpbGUgKHRydWUpCgkJCXsKCQkJCXZhciBjb21zID0gKGdfdGVybVtpXS5tYXRjaCgvXCwvZykgfHwgW10pLmxlbmd0aCwgbWV0aHMgPSAoZ190ZXJtW2ldLm1hdGNoKC9wb3d8bWlufG1heHxhdGFuMnxyb290fGxvZ258Z2F1fHNzZD8vZykgfHwgW10pLmxlbmd0aDsKCQkJCWlmIChjb21zID4gbWV0aHMgJiYgZ190ZXJtW2ldLm1hdGNoKC9cZCtcLFxkLykpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RERUNJKTsKCQkJCWVsc2UgaWYgKGNvbXMgPiBtZXRocykgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVENPTU0pOwoJCQkJZWxzZSBpZiAoY29tcyA8IG1ldGhzKSByZXR1cm4gYWxlcnRFcnIoZi5GLCBTX0VSUl9UTUlTU0NPTU0pOwoJCQkJZWxzZSBicmVhazsKCQkJfQoJCQlpZiAoL1x8Ly50ZXN0KGdfdGVybVtpXSkpIHJldHVybiBhbGVydEVycihmLkYsIFNfRVJSX1RQSVBFKTsKCQkJaWYgKChnX3Rlcm1baV0ubWF0Y2goL1woL2cpIHx8IFtdKS5sZW5ndGggIT0gKGdfdGVybVtpXS5tYXRjaCgvXCkvZykgfHwgW10pLmxlbmd0aCkgcmV0dXJuIGFsZXJ0RXJyKGYuRiwgU19FUlJfVFBBUkVOVEgpOwoJCQl2YXIgcmFuZCA9ICEoZ190ZXJtW2ldLmluZGV4T2YoJ3JhbicpIDwgMCk7CgkJCXl5W2ldID0gW107CgkJCXl5W2ldW2dfd10gPSBnRXZhbChnX3h6LCBnX3Rlcm1baV0pOwoJCQl2YXIgaiA9IGdfdysxOyB3aGlsZSAoai0tKQoJCQl7CgkJCQlpZiAoaikgeXlbaV1bai0xXSA9IGdFdmFsKGdfeGErKGotMSkqZ19keCwgZ190ZXJtW2ldKTsKCQkJCWlmIChpc051bSh5ID0geXlbaV1bal0pKQoJCQkJewoJCQkJCWlmICghcmFuZCkKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJewoJCQkJCQkJaWYgKHl5W2ldW2otMV0gPCAwICYmIHkgPiAwICYmIHl5W2ldW2orMV0teSA8IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwxKTsKCQkJCQkJCWVsc2UgaWYgKHl5W2ldW2otMV0gPiAwICYmIHkgPCAwICYmIHl5W2ldW2orMV0teSA+IDApCgkJCQkJCQkJeSA9IHkubGltKGksaiwtMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdID4gMCAmJiB5IDwgMCAmJiB5eVtpXVtqLTFdLXkgPiAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwtMSk7CgkJCQkJCQllbHNlIGlmICh5eVtpXVtqKzFdIDwgMCAmJiB5ID4gMCAmJiB5eVtpXVtqLTFdLXkgPCAwKQoJCQkJCQkJCXkgPSB5LmxpbShpLGosMSwxKTsKCQkJCQkJfQoJCQkJCQllbHNlIGlmIChqLWdfdyAmJiAhaXNOdW0oeXlbaV1baisxXSkgJiYgaXNOdW0oeXlbaV1bai0xXSkpCgkJCQkJCQl5ID0geS5saW0oaSxqLDEsKHkteXlbaV1bai0xXSA+IDApPyAxIDogLTEpOwoJCQkJCQllbHNlIGlmIChqICYmICFpc051bSh5eVtpXVtqLTFdKSAmJiBpc051bSh5eVtpXVtqKzFdKSkKCQkJCQkJCXkgPSB5LmxpbShpLGosLTEsKHkteXlbaV1baisxXSA+IDApPyAxIDogLTEpOwoJCQkJCQl5eVtpXVtqXSA9IHk7CgkJCQkJfQoJCQkJCWlmICghaXNOdW0oZ195YSkpIHlhID0gTWF0aC5taW4oeWEsIHkpOwoJCQkJCWlmICghaXNOdW0oZ195eikpIHl6ID0gTWF0aC5tYXgoeXosIHkpOwoJCQkJfQoJCQl9CgkJfQoJfQoJY2F0Y2ggKGVycikKCXsKCQlhbGVydEVycihmLkYsIFNfRVJSX1RFUk0pOwoJCXJldHVybjsKCX0KCWlmICghZ19uKQoJewoJCWdfeXogPSB5ejsKCQlnX3lhID0geWE7CgkJdmFyIG9sZGggPSBnX2g7CgkJaWYgKGRvY3VtZW50LmZvcm1zLmZvLlhZUkFUSU8uY2hlY2tlZCkKCQl7CgkJCWdfZHkgPSBnX2R4OwoJCQl2YXIgaCA9IChnX3l6LWdfeWEpL2dfZHk7CgkJCWlmIChoID4gMTAwKmdfdykKCQkJewoJCQkJaWYgKGdfeWEgPCAwICYmIGdfeWEgPCAtZ193KmdfZHkpIGdfeWEgKj0gMTAwKmdfdy9oOwoJCQkJaWYgKGdfeXogPiAwICYmIGdfeXogPiBnX3cqZ19keSkgZ195eiAqPSAxMDAqZ193L2g7CgkJCX0KCQkJaWYgKGgtMSA8IDApIGdfeWEgLT0gZ19keTsKCQkJZ19oID0gTWF0aC5yb3VuZCgoZ195ei1nX3lhKS9nX2R5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKCEoZ195ei1nX3lhKSkKCQkJewoJCQkJZ195YSAtPSAoZ194ei1nX3hhKS8yOwoJCQkJZ195eiArPSAoZ194ei1nX3hhKS8yOwoJCQl9CgkJCWdfaCA9IGdfdzsKCQkJZ19keSA9IChnX3l6LWdfeWEpL2dfaDsKCQl9CgkJaWYgKG9sZGggIT0gZ19oKSByZXNpemVDbnYoKTsKCQlta1NjYWxlKCk7Cgl9Cgl2YXIgdGVybWh0bSA9ICcnLCBjaSA9IDAsIHg7CgkvL3ZhciB0MCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Cglmb3IgKGkgPSAwOyBpIDwgZ190ZXJtLmxlbmd0aDsgaSsrKQoJewoJCXZhciBjID0gJyMnICsgR1JBUEhDT0xPUlsoY2krKyklR1JBUEhDT0xPUi5sZW5ndGhdOwoJCXZhciB0cCwgYm90OwoJCXZhciBveCA9IGdfdysxOwoJCXZhciBveSA9ICcnOwoJCXZhciBueSA9IChpc051bSh5eVtpXVtnX3ddKSk/IHNjYWxlWSh5eVtpXVtnX3ddKSA6ICcnOwoJCXggPSBnX3crMTsgd2hpbGUgKHgtLSkKCQl7CgkJCXkgPSBueTsKCQkJbnkgPSAoeCAmJiBpc051bSh5eVtpXVt4LTFdKSk/IHNjYWxlWSh5eVtpXVt4LTFdKSA6ICcnOwoJCQlpZiAoaXNOdW0oeSkpCgkJCXsKCQkJCWlmICghaXNOdW0ob3kpKSBveSA9IHk7CgkJCQlpZiAoIWlzTnVtKG55KSkKCQkJCXsKCQkJCQlpZiAob3gteC0xIHx8ICEob3kteSkpCgkJCQkJewoJCQkJCQl0cCA9IHk7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAob3kteSA8IDApCgkJCQkJewoJCQkJCQl0cCA9IG95OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXRwID0geTsKCQkJCQkJYm90ID0gb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveCA9IHg7CgkJCQkJb3kgPSAnJzsKCQkJCX0KCQkJCWVsc2UgaWYgKG55LXkgPiAwKQoJCQkJewoJCQkJCWlmIChveC14LTEpCgkJCQkJewoJCQkJCQlib3QgPSB5KzE7CgkJCQkJCXRwID0geTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKG95LXkgPiAwIHx8ICEob3kteSkgJiYgeSA8IDApICYmIG55ID4gb3kgJiYgKGlzTnVtKHl5W2ldW3gtMl0pPyB5eVtpXVt4LTJdLXl5W2ldW3gtMV0gPj0gMCA6IHRydWUpKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSAhaXNOdW0oeXlbaV1beCsxXSk/IG55IDogb3k7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmIChpc051bSh5eVtpXVt4LTJdKSAmJiBzY2FsZVkoeXlbaV1beC0yXSktbnkgPD0gMCkgYm90ID0gbnk7CgkJCQkJCWVsc2UgYm90ID0geStNYXRoLnJvdW5kKChueS15KS8yKTsKCQkJCQkJdHAgPSAob3kteSA+IDApPyB5IDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IGJvdDsKCQkJCQlveCA9IHg7CgkJCQl9CgkJCQllbHNlIGlmIChueS15IDwgMCkKCQkJCXsKCQkJCQlpZiAob3gteC0xKQoJCQkJCXsKCQkJCQkJdHAgPSB5OwoJCQkJCQlib3QgPSB5KzE7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKChveS15IDwgMCB8fCAhKG95LXkpICYmIHktZ19oID4gMCkgJiYgbnkgPCBveSkKCQkJCQl7CgkJCQkJCXRwID0gIWlzTnVtKHl5W2ldW3grMV0pPyBueSsxIDogb3k7CgkJCQkJCWJvdCA9IHkrMTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGlzTnVtKHl5W2ldW3gtMl0pICYmIHNjYWxlWSh5eVtpXVt4LTJdKS1ueSA+PSAwKSB0cCA9IG55KzE7CgkJCQkJCWVsc2UgdHAgPSB5LU1hdGguZmxvb3IoKHktbnkpLzIpOwoJCQkJCQlib3QgPSAob3kteSA8PSAwKT8geSsxIDogb3k7CgkJCQkJfQoJCQkJCWdfaHRtICs9IG1rRGl2KCcnLCAnJywgeCwgdHAsIG94LXgsIGJvdC10cCwgYywgJycsIGZhbHNlLCB0cnVlKTsKCQkJCQlveSA9IHRwOwoJCQkJCW94ID0geDsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCW95ID0gJyc7CgkJCQlveCA9IHg7CgkJCX0KCQl9CgkJLy90ZXJtW2ldID0gZ190ZXJtW2ldOwoJCXRlcm1odG0gKz0gKCc8c21hbGwgc3R5bGU9ImNvbG9yOicgKyBjICsgJyI+PGI+JyArIHRlcm1baV0ucmVwbGFjZSgvcmFuZG9tXChcKS9nLCdyYW5kJykucmVwbGFjZSgvcG93L2csJ3AnKS5yZXBsYWNlKC9sb2dcKC9nLCdsbignKS5yZXBsYWNlKC9ydFwoL2csJ3IoJykucmVwbGFjZSgvUlQvZywnUicpICsgJzxcL2I+PFwvc21hbGw+PGJyPicpOwoJCWdfbiArKzsKCX0KCXBhaW50KGdfY252LCBnX2h0bSwgdHJ1ZSk7CgkvL2FsZXJ0KChuZXcgRGF0ZSgpKS5nZXRUaW1lKCktdDApOwoJcGFpbnQoZ190ZXJtbHlyLCB0ZXJtaHRtLCB0cnVlKTsKCWlmICghZ19jb29yZHRpcCkgaW5pdENvb3JkdGlwKCk7Cn0KCgpmdW5jdGlvbiBjb29yZFRpcChlKQp7CglpZiAoZ193YWl0KSByZXR1cm47CglnX3dhaXQgPSAxOwoJc2V0VGltZW91dCgnZ193YWl0ID0gMDsnLCAxKTsKCXZhciB4ID0gKGUgPSBlIHx8IHdpbmRvdy5ldmVudCkucGFnZVggfHwgZS5jbGllbnRYIHx8IDAsCgl5ID0gZS5wYWdlWSB8fCBlLmNsaWVudFkgfHwgMDsKCWlmIChnX2llIHx8IGdfa3EpCgl7CgkJeCArPSBnX2RiLnNjcm9sbExlZnQtKGdfaWUgJiYgIWdfaWVtYWMpKjI7CgkJeSArPSBnX2RiLnNjcm9sbFRvcC0oZ19pZSAmJiAhZ19pZW1hYykqMjsKCX0KCWlmICh4LWdfcGFnZVggPj0gMCAmJiB4LWdfcGFnZVgtZ193IDw9IDAgJiYgeS1nX3BhZ2VZID49IDAgJiYgeS1nX3BhZ2VZLWdfaCA8PSAwKQoJewoJCWdfY29vcmR0aXAuc3R5bGUubGVmdCA9ICh4KzE2KSsncHgnOwoJCWdfY29vcmR0aXAuc3R5bGUudG9wID0gKHktMTIpKydweCc7CgkJcGFpbnQoZ19jb29yZHRpcCwKCQkJJzxzbWFsbCBzdHlsZT0iYmFja2dyb3VuZDonK0NOVkNPTE9SKyc7d2hpdGUtc3BhY2U6bm93cmFwOyI+eCA9ICcrCgkJCW1rTnVtU3RyKHgtZ19wYWdlWCtNYXRoLnJvdW5kKGdfeGEvZ19keCksIGdfZHgpKycmbmJzcDs8YnI+eSA9ICcrCgkJCW1rTnVtU3RyKGdfaC15K2dfcGFnZVkrTWF0aC5yb3VuZChnX3lhL2dfZHkpLCBnX2R5KSsnJm5ic3A7PFwvc21hbGw+JywKCQkJZmFsc2UKCQkpOwoJCWlmIChnX2Nvb3JkdGlwLnN0eWxlLnZpc2liaWxpdHkgPT0gJ2hpZGRlbicpIGdfY29vcmR0aXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKCX0KCWVsc2UgZ19jb29yZHRpcC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCgpkb2N1bWVudC53cml0ZShnX2llPyBnUmVwbGFjZShta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSkgOiBta0RpdignJywgJycsIDAsIDAsIDAsIDAsICcnLCAnY29vcmR0aXAnLCB0cnVlKSk7CndpbmRvdy5vbmxvYWQgPSBpbml0Owo=">
			</script id="script_b64_wz_grapher_end">
			

<!--		<script id="script_wz_grapherstr" type="text/javascript" src="/js/wz/wz_grapherstr.js"></script> -->
		<script id="script_b64_wz_grapherstr"
			src="data:/text/plain;base64,aWYod2luZG93LkdfTEFORyAmJiBHX0xBTkcgPT0gIkQiKQ0Kew0KICAgIHZhciBTX1NIT1dHUklEID0gJ0dpdHRlciB6ZWlnZW4nOw0KICAgIHZhciBTX1NBTUVTQ0FMRSA9ICdpZGVudC4gTWEmc3psaWc7c3RhYiBmJnV1bWw7ciBiZWlkZSBBY2hzZW4gWypdJzsNCiAgICB2YXIgU19GSVRXTkQgPSAnRGlhZ3JhbW0tIEdyJm91bWw7JnN6bGlnO2UgYW4gRmVuc3RlciBhbnBhc3NlbiBbKl0nOw0KICAgIHZhciBTX1BSVFZJRVcgPSAnRHJ1Y2thbnNpY2h0JzsNCiAgICB2YXIgU19QT1NUUkVQSU5HID0gJ1sqXSBzaWNodGJhciBlcnN0IG5hY2ggTmV1emVpY2huZW4nOw0KICAgIHZhciBTX0NPT1JEVElQID0gJ1dlcnRlIGltIERpYWdyYW1tIGsmb3VtbDtubmVuIG1pdCBkZXIgTWF1cyBuJmF1bWw7aGVydW5nc3dlaXNlIGFiZ2V0YXN0ZXQgd2VyZGVuJzsNCiAgICB2YXIgU19ERUxHUkFQSFMgPSAnU29sbGVuIGFsbGUgR3JhcGhlbiBhdXMgZGVyIFplaWNoZW5mbORjaGUgZ2Vs9nNjaHQgd2VyZGVuPyc7DQogICAgdmFyIFNfREVMTEFTVEdSQVBIID0gJ1NvbGwgZGVyIGxldHp0ZSBHcmFwaCB3aXJrbGljaCBnZWz2c2NodCB3ZXJkZW4/JzsNCiAgICB2YXIgU19PTERCUk9XU0VSID0gJ0RpZSBKYXZhU2NyaXB0LVVudGVyc3R1ZXR6dW5nIElocmVzIEJyb3dzZXJzIGlzdCB1bnp1cmVpY2hlbmQnOw0KICAgIHZhciBTX0VSUl9CQVNFID0gJ1VuZ/xsdGlnZSBFaW5nYWJlIGb8ciAnOw0KICAgIHZhciBTX0VSUl9YUkFOR0UgPSAnRGVmaW5pdGlvbnNiZXJlaWNoIHZvbiB4LlxueCBtaW4gbXVzcyBrbGVpbmVyIGFscyB4IG1heCBzZWluLic7DQogICAgdmFyIFNfRVJSX1lSQU5HRSA9ICdXZXJ0ZWJlcmVpY2ggdm9uIHkuXG55IG1pbiBtdXNzIGtsZWluZXIgYWxzIHkgbWF4IHNlaW4uJzsNCiAgICB2YXIgU19FUlJfVEVSTSA9ICdGdW5rdGlvbnN0ZXJtLlxuS2VpbiBUaXBwZmVobGVyP1xuTnVyIGVybGF1YnRlIFJlY2hlbm9wZXJhdG9yZW4gdmVyd2VuZGV0P1xuS2xhbW1lcnVuZyBvaz9cbkJpdHRlIFN5bnRheCD8YmVycHL8ZmVuLic7DQogICAgdmFyIFNfRVJSX1RDT01NID0gJ0Z1bmt0aW9uc3Rlcm0uXG5adSB2aWVsZSBLb21tYXRhLic7DQogICAgdmFyIFNfRVJSX1RERUNJID0gJ0Z1bmt0aW9uc3Rlcm0uXG5adSB2aWVsZSBLb21tYXRhLlxuQml0dGUgUHVua3QgYWxzIERlemltYWx0cmVubnplaWNoZW4gdmVyd2VuZGVuLic7DQogICAgdmFyIFNfRVJSX1RNSVNTQ09NTSA9ICdGdW5rdGlvbnN0ZXJtLlxuKE1pbmRlc3RlbnMpIGVpbmUgZGVyIEhpbGZzZnVua3Rpb25lbiBiZW72dGlndCB6d2VpIChnYXVzc2QoKSBkcmVpKSBBcmd1bWVudGUuXG5BbnNjaGVpbmVuZCBmZWhsdCBlaW4gQXJndW1lbnQsIGJ6dy4gZGFzIEtvbW1hIHp3aXNjaGVuIGRlbiBBcmd1bWVudGVuLic7DQogICAgdmFyIFNfRVJSX1RQSVBFID0gJ0Z1bmt0aW9uc3Rlcm0uXG5FaW4gc2Vua3JlY2h0ZXIgU3RyaWNoIChQaXBlKSB6dXZpZWwgb2RlciB6dXdlbmlnLic7DQogICAgdmFyIFNfRVJSX1RQQVJFTlRIID0gJ0Z1bmt0aW9uc3Rlcm0uXG5GYWxzY2hlIEtsYW1tZXJ1bmcuXG5BbnphaGwg9mZmbmVuZGVyIHVuZCBzY2hsaWXfZW5kZXIgS2xhbW1lcm4gc3RpbW10IG5pY2h0IPxiZXJlaW4uJzsNCn0NCmVsc2UNCnsNCiAgICB2YXIgU19TSE9XR1JJRCA9ICdTaG93IGdyaWQgbGluZXMnOw0KICAgIHZhciBTX1NBTUVTQ0FMRSA9ICdTYW1lIHNjYWxlIGZvciBib3RoIGF4ZXMgWypdJzsNCiAgICB2YXIgU19GSVRXTkQgPSAnRml0IGRpYWdyYW0gaW50byB3aW5kb3cgWypdJzsNCiAgICB2YXIgU19QUlRWSUVXID0gJ1ByaW50IHByZXZpZXcnOw0KICAgIHZhciBTX1BPU1RSRVBJTkcgPSAnWypdIHZpc2libGUgYWZ0ZXIgcmVkcmF3aW5nJzsNCiAgICB2YXIgU19DT09SRFRJUCA9ICdNb3ZlIG1vdXNlIG92ZXIgZGlhZ3JhbSB0byBzY2FuIGNvb3JkaW5hdGVzJzsNCiAgICB2YXIgU19ERUxHUkFQSFMgPSAnRGVsZXRlIGFsbCBncmFwaHM/JzsNCiAgICB2YXIgU19ERUxMQVNUR1JBUEggPSAnRGVsZXRlIGxhdGVzdCBncmFwaD8nOw0KICAgIHZhciBTX09MREJST1dTRVIgPSAnWW91ciBicm93c2VyXCdzIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gaXMgaW5zdWZmaWNpZW50Lic7DQogICAgdmFyIFNfRVJSX0JBU0UgPSAnSW52YWxpZCAnOw0KICAgIHZhciBTX0VSUl9YUkFOR0UgPSAnaW50ZXJ2YWwgc3BlY2lmaWVkIGZvciB4LlxueCBtaW4gbXVzdCBiZSBsZXNzZXIgdGhhbiB4IG1heC4nOw0KICAgIHZhciBTX0VSUl9ZUkFOR0UgPSAncmFuZ2UgZm9yIHkuXG55IG1pbiBtdXN0IGJlIGxlc3NlciB0aGFuIHkgbWF4Lic7DQogICAgdmFyIFNfRVJSX1RFUk0gPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cblR5cG8/XG5JbnZhbGlkIHVzYWdlIG9mIG9wZXJhdG9ycz9cbkVycm9yIHdpdGggb3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcz9cblBsZWFzZSBjaGVjayBzeW50YXguJzsNCiAgICB2YXIgU19FUlJfVENPTU0gPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cblRvbyBtYW55IGNvbW1hcy4nOw0KICAgIHZhciBTX0VSUl9UREVDSSA9ICdmdW5jdGlvbiBleHByZXNzaW9uLlxuVG9vIG1hbnkgY29tbWFzLlxuVXNlIHBvaW50IGFzIGRlY2ltYWwgcG9pbnQuJzsNCiAgICB2YXIgU19FUlJfVE1JU1NDT01NID0gJ2Z1bmN0aW9uIGV4cHJlc3Npb24uXG4oQXQgbGVhc3QpIG9uZSBvZiB0aGUgaGVscGVyIGZ1bmN0aW9ucyByZXF1aXJlcyB0d28gKG9yIGdhdXNzZCgpOiB0aHJlZSkgYXJndW1lbnRzLlxuQXBwYXJlbnRseSBvbmUgYXJndW1lbnQgaXMgbWlzc2luZywgb3IgYSBjb21tYSBzZXBhcmF0aW5nIGFyZ3VtZW50cyBmcm9tIGVhY2ggb3RoZXIuJzsNCiAgICB2YXIgU19FUlJfVFBJUEUgPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cbkFwcGFyZW50bHkgdHlwby4gT25lIHRvbyBtYW55IHBpcGVzIChcJ3xcJykuJzsNCiAgICB2YXIgU19FUlJfVFBBUkVOVEggPSAnZnVuY3Rpb24gZXhwcmVzc2lvbi5cbk9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMgZG9uXCd0IG1hdGNoLic7DQp9DQo=">
			</script id="script_b64_wz_grapherstr_end">
		<script id="script_wz_grapherstr" >
			if(window.G_LANG && G_LANG == "D") {
				var S_SHOWGRID='Gitter zeigen';
				var S_SAMESCALE='ident. Ma&szlig;stab f&uuml;r beide Achsen [*]';
				var S_FITWND='Diagramm- Gr&ouml;&szlig;e an Fenster anpassen [*]';
				var S_PRTVIEW='Druckansicht';
				var S_POSTREPING='[*] sichtbar erst nach Neuzeichnen';
				var S_COORDTIP='Werte im Diagramm k&ouml;nnen mit der Maus n&auml;herungsweise abgetastet werden';
				var S_DELGRAPHS='Sollen alle Graphen aus der Zeichenfläche gelöscht werden?';
				var S_DELLASTGRAPH='Soll der letzte Graph wirklich gelöscht werden?';
				var S_OLDBROWSER='Die JavaScript-Unterstuetzung Ihres Browsers ist unzureichend';
				var S_ERR_BASE='Ungültige Eingabe für ';
				var S_ERR_XRANGE='Definitionsbereich von x.\nx min muss kleiner als x max sein.';
				var S_ERR_YRANGE='Wertebereich von y.\ny min muss kleiner als y max sein.';
				var S_ERR_TERM='Funktionsterm.\nKein Tippfehler?\nNur erlaubte Rechenoperatoren verwendet?\nKlammerung ok?\nBitte Syntax überprüfen.';
				var S_ERR_TCOMM='Funktionsterm.\nZu viele Kommata.';
				var S_ERR_TDECI='Funktionsterm.\nZu viele Kommata.\nBitte Punkt als Dezimaltrennzeichen verwenden.';
				var S_ERR_TMISSCOMM='Funktionsterm.\n(Mindestens) eine der Hilfsfunktionen benötigt zwei (gaussd() drei) Argumente.\nAnscheinend fehlt ein Argument, bzw. das Komma zwischen den Argumenten.';
				var S_ERR_TPIPE='Funktionsterm.\nEin senkrechter Strich (Pipe) zuviel oder zuwenig.';
				var S_ERR_TPARENTH='Funktionsterm.\nFalsche Klammerung.\nAnzahl öffnender und schließender Klammern stimmt nicht überein.';
				}
			else {
				var S_SHOWGRID='Show grid lines';
				var S_SAMESCALE='Same scale for both axes [*]';
				var S_FITWND='Fit diagram into window [*]';
				var S_PRTVIEW='Print preview';
				var S_POSTREPING='[*] visible after redrawing';
				var S_COORDTIP='Move mouse over diagram to scan coordinates';
				var S_DELGRAPHS='Delete all graphs?';
				var S_DELLASTGRAPH='Delete latest graph?';
				var S_OLDBROWSER='Your browser\'s JavaScript implementation is insufficient.';
				var S_ERR_BASE='Invalid ';
				var S_ERR_XRANGE='interval specified for x.\nx min must be lesser than x max.';
				var S_ERR_YRANGE='range for y.\ny min must be lesser than y max.';
				var S_ERR_TERM='function expression.\nTypo?\nInvalid usage of operators?\nError with opening and closing parentheses?\nPlease check syntax.';
				var S_ERR_TCOMM='function expression.\nToo many commas.';
				var S_ERR_TDECI='function expression.\nToo many commas.\nUse point as decimal point.';
				var S_ERR_TMISSCOMM='function expression.\n(At least) one of the helper functions requires two (or gaussd(): three) arguments.\nApparently one argument is missing, or a comma separating arguments from each other.';
				var S_ERR_TPIPE='function expression.\nApparently typo. One too many pipes (\'|\').';
				var S_ERR_TPARENTH='function expression.\nOpening and closing parentheses don\'t match.';
				}
			</script id="script_wz_grapherstr_end">
			
		</div id="div_wz_grapher_end">
	</body>
	</html>


//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer