//Code Entirely typed by Terence Cox
#include <iostream>
#include <string>
#include <cstdlib>
#include <math.h>
#include <iomanip>
using namespace std;
string substitute( double , double , string) ;
string simplify( bool , char , string) ;
double ** fill2Ddyrow7( int , int , double , double , double , double , double , double , double ** ) ;
double evaluator( string p_equ, bool debug)
{
start1:
int fp = - 1 , lp = - 1 ;
//Search for Paraenthesis
for ( int c = 0 ; c < p_equ.size ( ) ; c++ )
{
if ( p_equ.at ( c) == '(' )
fp = c;
if ( p_equ.at ( c) == ')' )
{
lp = c;
break ;
}
}
//if parenthesis exist extract the expression within them
if ( fp < 0 && lp < 0 )
{
if ( debug == true )
cout << "no more parentheses" << endl;
}
else
{
//extract from parenthesis and start the evauluation with the rest, then replaces solution in primary equ
string s_equ( p_equ, fp + 1 , ( lp - 1 ) - fp) ;
//solves what's in the parenthesis and eliminates the ()'s
p_equ.replace ( fp, ( lp + 1 ) - fp, to_string( evaluator( s_equ, debug) ) ) ;
goto start1;
}
//perform PEMDAS
p_equ = simplify( debug, '-' , simplify( debug, '+' , simplify( debug, '*' , simplify( debug, '/' , simplify( debug, '^' , p_equ) ) ) ) ) ;
//string fsresult(p_equ, fp + 1, lp - fp);
double fresult = stod( p_equ) ;
return fresult;
}
string simplify( bool debug, char oper, string expr)
{
start2:
int p, fnfp = - 1 , snlp = - 1 , reader = 1 , runs = 0 ;
double num1, num2, result;
bool single_neg = false ;
p = - 1 ;
for ( int c = 0 ; c < expr.size ( ) ; c++ )
{
if ( expr.at ( c) == oper)
{
if ( c > 0 ) //prevents error when a negative number is first in the expression
{
//assigns the position of the operator to p
p = c;
break ;
}
}
}
if ( p < 0 )
{
if ( debug == true )
cout << "no " << oper << endl;
}
else
{
runs++ ;
while ( expr.at ( p - reader) == '-' || expr.at ( p - reader) == '.' || isdigit ( expr.at ( p - reader) ) )
{
fnfp = p - reader;
reader++ ;
if ( p - reader < 0 ) //handles exception where this reads outside of memory
break ;
if ( expr.at ( fnfp) == '-' ) //hnadles a runtime error which causes negative numbers to be omitted
{
break ;
}
}
reader = 1 ;
while ( expr.at ( p + reader) == '-' || expr.at ( p + reader) == '.' || isdigit ( expr.at ( p + reader) ) )
{
snlp = p + reader;
//This code checks to make sure only one negative symbol is allowed, will break if another is found.
if ( expr.at ( snlp) == '-' )
{
if ( single_neg == true )
break ;
else
single_neg = true ;
}
reader++ ;
if ( p + reader > expr.size ( ) - 1 ) //handles exception where this reads outside of memory
break ;
}
string strnum1( expr, fnfp, p - fnfp) ;
string strnum2( expr, p + 1 , snlp - p) ;
double num1 = stod( strnum1) ;
double num2 = stod( strnum2) ;
switch ( oper)
{
case '^' :
result = pow ( num1, num2) ;
break ;
case '/' :
result = num1 / num2;
break ;
case '*' :
result = num1 * num2;
break ;
case '+' :
result = num1 + num2;
break ;
case '-' :
result = num1 - num2;
break ;
}
//result = (int)(result * 10000.0) / 10000.0;
if ( debug == true )
cout << "after performing " << oper << " the result is " << result << endl;
//replace the solve part of the expression into the entire expression
expr.replace ( fnfp, ( snlp + 1 ) - fnfp, to_string( result) ) ;
goto start2;
}
if ( debug == true )
cout << "solved " << runs << " " << oper << " operations" << endl;
return expr;
}
string substitute( double X, double Y, string equ)
{
//checks each character for X or Y to replace them with actual values
for ( int c = 0 ; c < equ.size ( ) ; c++ )
{
if ( equ.at ( c) == 'X' || equ.at ( c) == 'x' )
equ.replace ( c, 1 , to_string( X) ) ;
if ( equ.at ( c) == 'Y' || equ.at ( c) == 'y' )
equ.replace ( c, 1 , to_string( Y) ) ;
}
return equ;
}
double ** fill2Ddyrow7( int row, int step, double X, double Y, double K1, double K2, double K3, double K4, double ** tablef)
{
tablef[ row] [ 0 ] = step;
tablef[ row] [ 1 ] = X;
tablef[ row] [ 2 ] = Y;
tablef[ row] [ 3 ] = K1;
tablef[ row] [ 4 ] = K2;
tablef[ row] [ 5 ] = K3;
tablef[ row] [ 6 ] = K4;
return tablef;
}
int main( )
{
Begin:
cout .precision ( 5 ) ;
string equation;
int steps;
float X1, X2, Y1, K1, K2, K3, K4, Z2, Z3, Z4, h, newY;
double change;
bool debug = false , use_table = true , userres;
cout << "What is the differential equation you want to use Runge Kutta's method on?\n y'= " ;
cin >> equation;
cout << "Fill this in\n (y(x) = ___)\n | \n v \n x= " ;
cin >> X1;
cout << "and this\n (y(" << X1 << ") = __)\n |\n v\n y= " ;
cin >> Y1;
cout << "How many steps of accuracy do you want to use: " ;
cin >> steps;
cout << "What is the value of X you want to use to solve Y" << endl;
cin >> X2;
h = ( X2 - X1) / steps;
cout << "The size of h is " << h << "." << endl;
cout << "Last Question, do you want to see the table of values(Takes longer to process) 1 or 0" << endl;
cin >> use_table;
//create a new 2D Dynamic Array
double ** table = new double * [ steps + 1 ] ;
for ( int i = 0 ; i < steps + 1 ; ++ i)
table[ i] = new double [ 6 ] ;
//fill in table with obtained information
table = fill2Ddyrow7( 0 , 0 , X1, Y1,0 , 0 , 0 , 0 , table) ;
//perform the Runge Kutta process for the inputted amount of steps
//'t' represents current row
for ( int t = 0 ; t < steps; t++ )
{
K1 = evaluator( substitute( table[ t] [ 1 ] , table[ t] [ 2 ] , equation) , debug) ;
table[ t] [ 3 ] = K1;
Z2 = table[ t] [ 2 ] + 0.5 * abs ( h) * K1;
K2 = evaluator( substitute( table[ t] [ 1 ] + 0.5 * abs ( h) , Z2, equation) , debug) ;
table[ t] [ 4 ] = K2;
Z3 = table[ t] [ 2 ] + 0.5 * abs ( h) * K2;
K3 = evaluator( substitute( table[ t] [ 1 ] + 0.5 * abs ( h) , Z3, equation) , debug) ;
table[ t] [ 5 ] = K3;
Z4 = table[ t] [ 2 ] + abs ( h) * K3;
K4 = evaluator( substitute( table[ t] [ 1 ] + abs ( h) , Z4, equation) , debug) ;
table[ t] [ 6 ] = K4;
newY = table[ t] [ 2 ] + ( abs ( h) * ( K1+ ( 2 * K2) + ( 2 * K3) + K4) ) / 6 ;
table = fill2Ddyrow7( t + 1 , t + 1 , X1 + ( h* ( t + 1 ) ) , newY, 0 , 0 , 0 , 0 , table) ;
}
//outputs the values in the table into the console
if ( use_table == true || use_table == 't' || use_table == 'T' )
{
cout << left << setw( 11 ) << "step i" << setw( 11 ) << "X1" << setw( 11 ) << "Y1" << setw( 11 ) << "K1" << setw( 11 ) << "K2" << setw( 11 ) << "K3" << setw( 11 ) << "K4" << endl;
for ( int row = 0 ; row < steps + 1 ; row++ )
{
cout << endl;
for ( int column = 0 ; column < 7 ; column++ )
{
cout << setw( 11 ) << table[ row] [ column] ;
}
}
}
cout << endl;
cout << "The Final Answer is " << table[ steps] [ 2 ] << endl;
cout << "Done" << endl;
cout << "Do you want to enter another Diffy-Q?, 1(True) or 0(False)" << endl;
cin >> userres;
if ( userres == 1 )
goto Begin;
system ( "pause" ) ;
}
Ly9Db2RlIEVudGlyZWx5IHR5cGVkIGJ5IFRlcmVuY2UgQ294CiNpbmNsdWRlIDxpb3N0cmVhbT4gCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RkbGliPiAKI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPGlvbWFuaXA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIHN1YnN0aXR1dGUoZG91YmxlLCBkb3VibGUsIHN0cmluZyk7CnN0cmluZyBzaW1wbGlmeShib29sLCBjaGFyLCBzdHJpbmcpOwpkb3VibGUqKiBmaWxsMkRkeXJvdzcoaW50LCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSoqKTsKCmRvdWJsZSBldmFsdWF0b3Ioc3RyaW5nIHBfZXF1LCBib29sIGRlYnVnKQp7CnN0YXJ0MToKCWludCBmcCA9IC0xLCBscCA9IC0xOwoJLy9TZWFyY2ggZm9yIFBhcmFlbnRoZXNpcwoJZm9yIChpbnQgYyA9IDA7IGMgPCBwX2VxdS5zaXplKCk7IGMrKykKCXsKCQlpZiAocF9lcXUuYXQoYykgPT0gJygnKQoJCQlmcCA9IGM7CgkJaWYgKHBfZXF1LmF0KGMpID09ICcpJykKCQl7CgkJCWxwID0gYzsKCQkJYnJlYWs7CgkJfQoJfQoJLy9pZiBwYXJlbnRoZXNpcyBleGlzdCBleHRyYWN0IHRoZSBleHByZXNzaW9uIHdpdGhpbiB0aGVtCglpZiAoZnAgPCAwICYmIGxwIDwgMCkKCXsKCQlpZiAoZGVidWcgPT0gdHJ1ZSkKCQkJY291dCA8PCAibm8gbW9yZSBwYXJlbnRoZXNlcyIgPDwgZW5kbDsKCX0KCWVsc2UKCXsKCQkvL2V4dHJhY3QgZnJvbSBwYXJlbnRoZXNpcyBhbmQgc3RhcnQgdGhlIGV2YXVsdWF0aW9uIHdpdGggdGhlIHJlc3QsIHRoZW4gcmVwbGFjZXMgc29sdXRpb24gaW4gcHJpbWFyeSBlcXUKCQlzdHJpbmcgc19lcXUocF9lcXUsIGZwICsgMSwgKGxwIC0gMSkgLSBmcCk7CgkJLy9zb2x2ZXMgd2hhdCdzIGluIHRoZSBwYXJlbnRoZXNpcyBhbmQgZWxpbWluYXRlcyB0aGUgKCkncwoJCXBfZXF1LnJlcGxhY2UoZnAsIChscCArIDEpIC0gZnAsIHRvX3N0cmluZyhldmFsdWF0b3Ioc19lcXUsIGRlYnVnKSkpOwoJCWdvdG8gc3RhcnQxOwoJfQoJLy9wZXJmb3JtIFBFTURBUwoJcF9lcXUgPSBzaW1wbGlmeShkZWJ1ZywgJy0nLCBzaW1wbGlmeShkZWJ1ZywgJysnLCBzaW1wbGlmeShkZWJ1ZywgJyonLCBzaW1wbGlmeShkZWJ1ZywgJy8nLCBzaW1wbGlmeShkZWJ1ZywgJ14nLCBwX2VxdSkpKSkpOwoKCS8vc3RyaW5nIGZzcmVzdWx0KHBfZXF1LCBmcCArIDEsIGxwIC0gZnApOwoJZG91YmxlIGZyZXN1bHQgPSBzdG9kKHBfZXF1KTsKCXJldHVybiBmcmVzdWx0Owp9CgoKc3RyaW5nIHNpbXBsaWZ5KGJvb2wgZGVidWcsIGNoYXIgb3Blciwgc3RyaW5nIGV4cHIpCnsKc3RhcnQyOgoJaW50IHAsIGZuZnAgPSAtMSwgc25scCA9IC0xLCByZWFkZXIgPSAxLCBydW5zID0gMDsKCWRvdWJsZSBudW0xLCBudW0yLCByZXN1bHQ7Cglib29sIHNpbmdsZV9uZWcgPSBmYWxzZTsKCglwID0gLTE7Cglmb3IgKGludCBjID0gMDsgYyA8IGV4cHIuc2l6ZSgpOyBjKyspCgl7CgkJaWYgKGV4cHIuYXQoYykgPT0gb3BlcikKCQl7CgkJCWlmIChjID4gMCkgLy9wcmV2ZW50cyBlcnJvciB3aGVuIGEgbmVnYXRpdmUgbnVtYmVyIGlzIGZpcnN0IGluIHRoZSBleHByZXNzaW9uCgkJCXsKCQkJCS8vYXNzaWducyB0aGUgcG9zaXRpb24gb2YgdGhlIG9wZXJhdG9yIHRvIHAKCQkJCXAgPSBjOwoJCQkJYnJlYWs7CgkJCX0KCgkJfQoJfQoJaWYgKHAgPCAwKQoJewoJCWlmIChkZWJ1ZyA9PSB0cnVlKQoJCQljb3V0IDw8ICJubyAiIDw8IG9wZXIgPDwgZW5kbDsKCX0KCWVsc2UKCXsKCQlydW5zKys7CgkJd2hpbGUgKGV4cHIuYXQocCAtIHJlYWRlcikgPT0gJy0nIHx8IGV4cHIuYXQocCAtIHJlYWRlcikgPT0gJy4nIHx8IGlzZGlnaXQoZXhwci5hdChwIC0gcmVhZGVyKSkpCgkJewoJCQlmbmZwID0gcCAtIHJlYWRlcjsKCQkJcmVhZGVyKys7CgkJCWlmIChwIC0gcmVhZGVyIDwgMCkgLy9oYW5kbGVzIGV4Y2VwdGlvbiB3aGVyZSB0aGlzIHJlYWRzIG91dHNpZGUgb2YgbWVtb3J5CgkJCQlicmVhazsKCQkJaWYgKGV4cHIuYXQoZm5mcCkgPT0gJy0nKS8vaG5hZGxlcyBhIHJ1bnRpbWUgZXJyb3Igd2hpY2ggY2F1c2VzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgb21pdHRlZAoJCQl7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlyZWFkZXIgPSAxOwoJCXdoaWxlIChleHByLmF0KHAgKyByZWFkZXIpID09ICctJyB8fCBleHByLmF0KHAgKyByZWFkZXIpID09ICcuJyB8fCBpc2RpZ2l0KGV4cHIuYXQocCArIHJlYWRlcikpKQoJCXsKCQkJc25scCA9IHAgKyByZWFkZXI7CgkJCS8vVGhpcyBjb2RlIGNoZWNrcyB0byBtYWtlIHN1cmUgb25seSBvbmUgbmVnYXRpdmUgc3ltYm9sIGlzIGFsbG93ZWQsIHdpbGwgYnJlYWsgaWYgYW5vdGhlciBpcyBmb3VuZC4KCQkJaWYgKGV4cHIuYXQoc25scCkgPT0gJy0nKQoJCQl7CgkJCQlpZiAoc2luZ2xlX25lZyA9PSB0cnVlKQoJCQkJCWJyZWFrOwoJCQkJZWxzZQoJCQkJCXNpbmdsZV9uZWcgPSB0cnVlOwoJCQl9CgkJCXJlYWRlcisrOwoJCQlpZiAocCArIHJlYWRlciA+IGV4cHIuc2l6ZSgpIC0gMSkgLy9oYW5kbGVzIGV4Y2VwdGlvbiB3aGVyZSB0aGlzIHJlYWRzIG91dHNpZGUgb2YgbWVtb3J5CgkJCQlicmVhazsKCQl9CgkJc3RyaW5nIHN0cm51bTEoZXhwciwgZm5mcCwgcCAtIGZuZnApOwoJCXN0cmluZyBzdHJudW0yKGV4cHIsIHAgKyAxLCBzbmxwIC0gcCk7CgkJZG91YmxlIG51bTEgPSBzdG9kKHN0cm51bTEpOwoJCWRvdWJsZSBudW0yID0gc3RvZChzdHJudW0yKTsKCgoJCXN3aXRjaCAob3BlcikKCQl7CgkJY2FzZSAnXic6CgkJCXJlc3VsdCA9IHBvdyhudW0xLCBudW0yKTsKCQkJYnJlYWs7CgkJY2FzZSAnLyc6CgkJCXJlc3VsdCA9IG51bTEgLyBudW0yOwoJCQlicmVhazsKCQljYXNlICcqJzoKCQkJcmVzdWx0ID0gbnVtMSAqIG51bTI7CgkJCWJyZWFrOwoJCWNhc2UgJysnOgoJCQlyZXN1bHQgPSBudW0xICsgbnVtMjsKCQkJYnJlYWs7CgkJY2FzZSAnLSc6CgkJCXJlc3VsdCA9IG51bTEgLSBudW0yOwoJCQlicmVhazsKCQl9CgkJLy9yZXN1bHQgPSAoaW50KShyZXN1bHQgKiAxMDAwMC4wKSAvIDEwMDAwLjA7CgkJaWYgKGRlYnVnID09IHRydWUpCgkJCWNvdXQgPDwgImFmdGVyIHBlcmZvcm1pbmcgIiA8PCBvcGVyIDw8ICIgdGhlIHJlc3VsdCBpcyAiIDw8IHJlc3VsdCA8PCBlbmRsOwoJCS8vcmVwbGFjZSB0aGUgc29sdmUgcGFydCBvZiB0aGUgZXhwcmVzc2lvbiBpbnRvIHRoZSBlbnRpcmUgZXhwcmVzc2lvbgoJCWV4cHIucmVwbGFjZShmbmZwLCAoc25scCArIDEpIC0gZm5mcCwgdG9fc3RyaW5nKHJlc3VsdCkpOwoJCWdvdG8gc3RhcnQyOwoJfQoJaWYgKGRlYnVnID09IHRydWUpCgkJY291dCA8PCAic29sdmVkICIgPDwgcnVucyA8PCAiICIgPDwgb3BlciA8PCAiIG9wZXJhdGlvbnMiIDw8IGVuZGw7CglyZXR1cm4gZXhwcjsKfQoKc3RyaW5nIHN1YnN0aXR1dGUoZG91YmxlIFgsIGRvdWJsZSBZLCBzdHJpbmcgZXF1KQp7CgkvL2NoZWNrcyBlYWNoIGNoYXJhY3RlciBmb3IgWCBvciBZIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGFjdHVhbCB2YWx1ZXMKCWZvciAoaW50IGMgPSAwOyBjIDwgZXF1LnNpemUoKTsgYysrKQoJewoJCWlmIChlcXUuYXQoYykgPT0gJ1gnIHx8IGVxdS5hdChjKSA9PSAneCcpCgkJCWVxdS5yZXBsYWNlKGMsIDEsIHRvX3N0cmluZyhYKSk7CgkJaWYgKGVxdS5hdChjKSA9PSAnWScgfHwgZXF1LmF0KGMpID09ICd5JykKCQkJZXF1LnJlcGxhY2UoYywgMSwgdG9fc3RyaW5nKFkpKTsKCX0KCXJldHVybiBlcXU7Cn0KCmRvdWJsZSoqIGZpbGwyRGR5cm93NyhpbnQgcm93LCBpbnQgc3RlcCwgZG91YmxlIFgsIGRvdWJsZSBZLCBkb3VibGUgIEsxLCBkb3VibGUgSzIsIGRvdWJsZSBLMywgZG91YmxlIEs0LCBkb3VibGUqKiB0YWJsZWYpCnsKCXRhYmxlZltyb3ddWzBdID0gc3RlcDsKCXRhYmxlZltyb3ddWzFdID0gWDsKCXRhYmxlZltyb3ddWzJdID0gWTsKCXRhYmxlZltyb3ddWzNdID0gSzE7Cgl0YWJsZWZbcm93XVs0XSA9IEsyOwoJdGFibGVmW3Jvd11bNV0gPSBLMzsKCXRhYmxlZltyb3ddWzZdID0gSzQ7CglyZXR1cm4gdGFibGVmOwp9CgoKCmludCBtYWluKCkKewpCZWdpbjoKCWNvdXQucHJlY2lzaW9uKDUpOwoJc3RyaW5nIGVxdWF0aW9uOwoJaW50IHN0ZXBzOwoJZmxvYXQgWDEsIFgyLCBZMSwgSzEsIEsyLCBLMywgSzQsIFoyLCBaMywgWjQsIGgsIG5ld1k7Cglkb3VibGUgY2hhbmdlOwoJYm9vbCBkZWJ1ZyA9IGZhbHNlLCB1c2VfdGFibGUgPSB0cnVlLCB1c2VycmVzOwoJY291dCA8PCAiV2hhdCBpcyB0aGUgZGlmZmVyZW50aWFsIGVxdWF0aW9uIHlvdSB3YW50IHRvIHVzZSBSdW5nZSBLdXR0YSdzIG1ldGhvZCBvbj9cbnknPSAiOwoJY2luID4+IGVxdWF0aW9uOwoJY291dCA8PCAiRmlsbCB0aGlzIGluXG4gKHkoeCkgPSBfX18pXG4gICAgfCAgICAgXG4gICAgdiAgICAgXG54PSAiOwoJY2luID4+IFgxOwoJY291dCA8PCAiYW5kIHRoaXNcbiAoeSgiIDw8IFgxIDw8ICIpID0gX18pXG4gICAgICAgICAgIHxcbiAgICAgICAgICAgdlxuICAgICAgICB5PSAiOwoJY2luID4+IFkxOwoJY291dCA8PCAiSG93IG1hbnkgc3RlcHMgb2YgYWNjdXJhY3kgZG8geW91IHdhbnQgdG8gdXNlOiAiOwoJY2luID4+IHN0ZXBzOwoJY291dCA8PCAiV2hhdCBpcyB0aGUgdmFsdWUgb2YgWCB5b3Ugd2FudCB0byB1c2UgdG8gc29sdmUgWSIgPDwgZW5kbDsKCWNpbiA+PiBYMjsKCWggPSAoWDIgLSBYMSkgLyBzdGVwczsKCWNvdXQgPDwgIlRoZSBzaXplIG9mIGggaXMgIiA8PCBoIDw8ICIuIiA8PCBlbmRsOwoJY291dCA8PCAiTGFzdCBRdWVzdGlvbiwgZG8geW91IHdhbnQgdG8gc2VlIHRoZSB0YWJsZSBvZiB2YWx1ZXMoVGFrZXMgbG9uZ2VyIHRvIHByb2Nlc3MpIDEgb3IgMCIgPDwgZW5kbDsKCWNpbiA+PiB1c2VfdGFibGU7CgkvL2NyZWF0ZSBhIG5ldyAyRCBEeW5hbWljIEFycmF5Cglkb3VibGUqKiB0YWJsZSA9IG5ldyBkb3VibGUqW3N0ZXBzICsgMV07Cglmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzICsgMTsgKytpKQoJCXRhYmxlW2ldID0gbmV3IGRvdWJsZVs2XTsKCgkvL2ZpbGwgaW4gdGFibGUgd2l0aCBvYnRhaW5lZCBpbmZvcm1hdGlvbgoJdGFibGUgPSBmaWxsMkRkeXJvdzcoMCwgMCwgWDEsIFkxLDAsIDAsIDAsIDAsIHRhYmxlKTsKCgkvL3BlcmZvcm0gdGhlIFJ1bmdlIEt1dHRhIHByb2Nlc3MgZm9yIHRoZSBpbnB1dHRlZCBhbW91bnQgb2Ygc3RlcHMKCS8vJ3QnIHJlcHJlc2VudHMgY3VycmVudCByb3cKCWZvciAoaW50IHQgPSAwOyB0IDwgc3RlcHM7IHQrKykKCXsKCQlLMSA9IGV2YWx1YXRvcihzdWJzdGl0dXRlKHRhYmxlW3RdWzFdLCB0YWJsZVt0XVsyXSwgZXF1YXRpb24pLCBkZWJ1Zyk7CgkJdGFibGVbdF1bM10gPSBLMTsKCQlaMiA9IHRhYmxlW3RdWzJdICsgMC41KmFicyhoKSpLMTsKCQlLMiA9IGV2YWx1YXRvcihzdWJzdGl0dXRlKHRhYmxlW3RdWzFdICsgMC41KmFicyhoKSwgWjIsIGVxdWF0aW9uKSwgZGVidWcpOwoJCXRhYmxlW3RdWzRdID0gSzI7CgkJWjMgPSB0YWJsZVt0XVsyXSArIDAuNSphYnMoaCkqSzI7CgkJSzMgPSBldmFsdWF0b3Ioc3Vic3RpdHV0ZSh0YWJsZVt0XVsxXSArIDAuNSphYnMoaCksIFozLCBlcXVhdGlvbiksIGRlYnVnKTsKCQl0YWJsZVt0XVs1XSA9IEszOwoJCVo0ID0gdGFibGVbdF1bMl0gKyBhYnMoaCkqSzM7CgkJSzQgPSBldmFsdWF0b3Ioc3Vic3RpdHV0ZSh0YWJsZVt0XVsxXSArIGFicyhoKSwgWjQsIGVxdWF0aW9uKSwgZGVidWcpOwoJCXRhYmxlW3RdWzZdID0gSzQ7CgkJbmV3WSA9IHRhYmxlW3RdWzJdICsgKGFicyhoKSooSzErKDIqSzIpKygyKkszKStLNCkpLzY7CgoJCXRhYmxlID0gZmlsbDJEZHlyb3c3KHQgKyAxLCB0ICsgMSwgWDEgKyAoaCoodCArIDEpKSwgbmV3WSwgMCwgMCwgMCwgMCwgdGFibGUpOwoJfQoKCS8vb3V0cHV0cyB0aGUgdmFsdWVzIGluIHRoZSB0YWJsZSBpbnRvIHRoZSBjb25zb2xlCglpZiAodXNlX3RhYmxlID09IHRydWUgfHwgdXNlX3RhYmxlID09ICd0JyB8fCB1c2VfdGFibGUgPT0gJ1QnKQoJewoJCWNvdXQgPDwgbGVmdCA8PCBzZXR3KDExKSA8PCAic3RlcCBpIiA8PCBzZXR3KDExKSA8PCAiWDEiIDw8IHNldHcoMTEpIDw8ICJZMSIgPDwgc2V0dygxMSkgPDwgIksxIiA8PCBzZXR3KDExKSA8PCAiSzIiIDw8IHNldHcoMTEpIDw8ICJLMyIgPDwgc2V0dygxMSkgPDwgIks0IiA8PCBlbmRsOwoJCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHN0ZXBzICsgMTsgcm93KyspCgkJewoJCQljb3V0IDw8IGVuZGw7CgkJCWZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IDc7IGNvbHVtbisrKQoJCQl7CgkJCQljb3V0IDw8IHNldHcoMTEpIDw8IHRhYmxlW3Jvd11bY29sdW1uXTsKCQkJfQoJCX0KCX0KCWNvdXQgPDwgZW5kbDsKCWNvdXQgPDwgIlRoZSBGaW5hbCBBbnN3ZXIgaXMgIiA8PCB0YWJsZVtzdGVwc11bMl0gPDwgZW5kbDsKCWNvdXQgPDwgIkRvbmUiIDw8IGVuZGw7Cgljb3V0IDw8ICJEbyB5b3Ugd2FudCB0byBlbnRlciBhbm90aGVyIERpZmZ5LVE/LCAxKFRydWUpIG9yIDAoRmFsc2UpIiA8PCBlbmRsOwoJY2luID4+IHVzZXJyZXM7CglpZiAodXNlcnJlcyA9PSAxKQoJCWdvdG8gQmVnaW47CglzeXN0ZW0oInBhdXNlIik7Cn0KCgo=