program SCSProject;
var
A, Hmax , Hmin, L, Cn : real ;
wName : String ;
Tc, Tp, Qp, wi, D,
y , De, TC1, TC2, TC3,
Tl, S : real ;
fif : TextFile;
tcSelector : integer ;
p : Array [ 1 .. 6 ] of real ;
const tpArr : array [ 1 .. 33 ] of real = ( 0.0 ,
0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1.0 ,
1.1 , 1.2 , 1.3 , 1.4 , 1.5 , 1.6 , 1.7 , 1.8 , 1.9 , 2.0 ,
2.2 , 2.4 , 2.6 , 2.8 , 3.0 , 3.2 , 3.4 , 3.6 , 3.8 , 4.0 ,
4.5 , 5.0 ) ;
const qpArr : array [ 1 .. 33 ] of real = ( 0.0 ,
0.03 , 0.1 , 0.19 , 0.31 , 0.47 , 0.66 , 0.82 , 0.93 , 0.99 ,
1.0 , 0.99 , 0.93 , 0.86 , 0.78 , 0.68 , 0.56 , 0.46 , 0.39 ,
0.33 , 0.28 , 0.207 , 0.147 , 0.107 , 0.077 , 0.055 , 0.04 ,
0.029 , 0.021 , 0.015 , 0.011 , 0.005 , 0.0 ) ;
procedure Create( ) ;
function clcQp( ) : real ;
function clcQMax( Pi : real ) : real ;
function clcRe( Pi : real ) : real ;
function clcV( Pi : real ) : real ;
function clcCoef( Pi : real ) : real ;
procedure piPrinter( ) ;
procedure tablePrinter( ) ;
procedure calculation( ) ;
procedure writeToFile( fileName: String ) ;
procedure getInput( ) ;
procedure PrintValues( ) ;
procedure fileManager( ) ;
procedure calculation;
begin
getInput( ) ;
clcQp( ) ;
end ;
function clcCoef( Pi: real ) : real ;
begin
clcCoef : = ( clcRe( Pi) / Pi) * 100 ;
end ;
function clcQMax( Pi: real ) : real ;
begin
clcQMax : = Qp * clcRe( Pi) ;
end ;
function clcQp: Real ;
begin
// clc Wi value
Wi : = ( Hmax - Hmin) / ( 10 * L) ;
// clc Y value
y : = ( Hmax - Hmin) / ( 1000 * L) ;
// clc De value
De : = sqrt ( 4 * A / 3.1416 ) ;
// clc S value
S : = ( 1000 / Cn) - 10 ;
// clc Tc1 value
TC1 : = ( 0.666 * ( L / De) ) * power( ( ( A * A) / Wi) , 0.2 ) ;
// clc Tc2 value
TC2 : = 0.0003 * ( power( ( L * 1000 ) , 0.77 ) * power( y , - 0.385 ) ) ;
// clc Tc3 value
TC3 : = 0.057 * power( L , 0.8 ) * power( S + 1 , 0.7 ) / power( y , 0.5 ) ;
// clc Tc value for TC (1 , 2 , 3)
writeln ( format( '1. TC1= %5.2f' , [ TC1] ) ) ;
writeln ( format( '2. TC2= %5.2f' , [ TC2] ) ) ;
writeln ( format( '3. TC3= %5.2f' , [ TC3] ) ) ;
write ( 'Select TC from 1..3: ' ) ;
readln ( tcSelector) ;
case tcSelector of
1 : Tc : = TC1;
2 : Tc : = TC2;
3 : Tc : = TC3
else
Tc : = 0 ;
end ;
// clc Tl value
Tl : = 0.6 * Tc;
// clc D value
D : = 0.13 * Tc;
// clc Tp value
Tp : = ( D / 2 ) + Tl;
// clc Qp value
Qp : = ( 0.2083 * A) / Tp;
clcQp : = Qp;
end ;
function clcRe( Pi: real ) : real ;
var
reV: real ;
begin
reV : = power( Pi - ( 0.2 * S * 25.4 ) , 2.0 ) / ( Pi + ( 0.8 * S * 25.4 ) ) ;
if ( pi < ( 0.2 * S * 25.4 ) ) then
clcRe : = 0
else
clcRe : = reV;
end ;
function clcV( Pi: real ) : real ;
begin
clcV : = A * clcRe( Pi) ;
end ;
procedure Create;
begin
writeln ( '************************** S.C.S Caculator **************************' ) ;
writeln ( 'Version: 1.00 feb-2010' ) ;
writeln ( 'Programming: Ahmad daneshvar (ahmad.daneshvar@gmail.com)' ) ;
writeln ( '*********************************************************************' ) ;
writeln ;
end ;
procedure fileManager;
var
sel: String ;
begin
writeln ;
writeln ( '>> To exit just press enter key' ) ;
writeln ( '>> To save data to file enter, file name' ) ;
writeln ( '>> To select watershed name as file name enter "*"' ) ;
readln ( sel) ;
sel : = trim( sel) ;
if sel = '' then
halt;
if sel = '*' then
sel : = wName;
writeToFile( sel) ;
writeln ( 'File successful saved as name "' + sel + '.txt". Enter key to exit...' ) ;
readln ;
halt;
end ;
procedure getInput;
var
ind : integer ;
begin
write ( 'Enter watershed name: ' ) ;
readln ( wName) ;
write ( 'Enter A value: ' ) ;
readln ( A) ;
write ( 'Enter Hmax: ' ) ;
readln ( Hmax) ;
write ( 'Enter Hmin: ' ) ;
readln ( Hmin) ;
write ( 'Enter L value: ' ) ;
readln ( L) ;
write ( 'Enter Cn value: ' ) ;
readln ( Cn) ;
writeln ( 'Now you must enter six value for P:' ) ;
for ind : = 1 to 6 do
begin
write ( 'P[' + inttostr( ind) + ']: ' ) ;
readln ( P[ ind] ) ;
end ;
end ;
procedure piPrinter;
var
ind: Integer ;
begin
writeln ;
writeln ( '==========================[ Calculation ]============================' ) ;
writeln ;
writeln ( '----------+---------+---------+---------+---------+---------+--------' ) ;
writeln ( 'TR(year) | 2 | 5 | 10 | 25 | 50 | 100' ) ;
writeln ( '----------+---------+---------+---------+---------+---------+--------' ) ;
// print QMax valus;
write ( format( 'Qmax cms%2s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( format( '| %7.2f ' , [ clcQMax( p[ ind] ) ] ) ) ;
writeln ;
// print V/1000 valus;
write ( format( 'V/1000 m3%1s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( format( '| %7.2f ' , [ clcV( p[ ind] ) ] ) ) ;
writeln ;
// print RE valus;
write ( format( 'RE mm%5s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( format( '| %7.2f ' , [ clcRe( p[ ind] ) ] ) ) ;
writeln ;
// print P valus;
write ( format( 'P mm%6s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( format( '| %7.2f ' , [ p[ ind] ] ) ) ;
writeln ;
// print Coef valus;
write ( format( 'Coef %%%4s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( format( '| %7.2f ' , [ clcCoef( p[ ind] ) ] ) ) ;
writeln ;
writeln ( '----------+---------+---------+---------+---------+---------+--------' ) ;
writeln ;
end ;
procedure PrintValues;
begin
writeln ;
writeln ( 'Watershed name: ' + wName) ;
writeln ;
writeln ( '============================[ Summery ]==============================' ) ;
writeln ( format( 'Watershed area:%15s A = %5.2f km2' , [ ' ' , A] ) ) ;
writeln ( format( 'Maximum hight:%16s Hmax= %5.2f m' , [ ' ' , Hmax] ) ) ;
writeln ( format( 'Minimum hight:%16s Hmin= %5.2f m' , [ ' ' , Hmin] ) ) ;
writeln ( format( 'Hydraulic length:%13s L = %5.2f km' , [ ' ' , L] ) ) ;
writeln ( format( 'Curve number:%17s CN = %5.2f km2' , [ ' ' , Cn] ) ) ;
writeln ( format( 'Time of consenteration:%7s TC = %5.2f hrs' , [ ' ' , TC] ) ) ;
writeln ( format( 'Time of peak discharge:%7s TP = %5.2f hrs' , [ ' ' , TP] ) ) ;
writeln ( format( 'Peak discharge for U.H:%7s Qp = %5.2f cms' , [ ' ' , Qp] ) ) ;
piPrinter( ) ;
tablePrinter( ) ;
end ;
procedure tablePrinter;
var
ind: Integer ;
Qre : real ;
begin
writeln ( '=======================[ Flood hydrograph ]==========================' ) ;
writeln ;
writeln ( '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
writeln ( 't(hrs) | U.H | 2 | 5 | 10 | 25 | 50 | 100' ) ;
writeln ( '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
for ind : = 1 to 33 do
begin
Qre : = Qp * qpArr[ ind] ;
writeln ( format( '%6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f' ,
[ Tp * tpArr[ ind] , Qre, clcRe( p[ 1 ] ) * Qre, clcRe( p[ 2 ] ) * Qre,
clcRe( p[ 3 ] ) * Qre, clcRe( p[ 4 ] ) * Qre, clcRe( p[ 5 ] ) * Qre, clcRe( p[ 6 ] ) * Qre] ) ) ;
end ;
writeln ( '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
end ;
procedure writeToFile( fileName: String ) ;
var
ind : Integer ;
Qre : real ;
begin
assign( fif , fileName + '.txt' ) ;
reWrite( fif) ;
// C: Part 1 ********************************************
writeln ( fif, 'Calculation hydrograph by S.C.S method' ) ;
writeln ( fif) ;
writeln ( fif, 'Watershed name: ' + wName) ;
writeln ( fif, '============================[ Summery ]==============================' ) ;
writeln ( fif, format( 'Watershed area:%15s A = %5.2f km2' , [ ' ' , A] ) ) ;
writeln ( fif, format( 'Maximum hight:%16s Hmax= %5.2f m' , [ ' ' , Hmax] ) ) ;
writeln ( fif, format( 'Minimum hight:%16s Hmin= %5.2f m' , [ ' ' , Hmin] ) ) ;
writeln ( fif, format( 'Hydraulic length:%13s L = %5.2f km' , [ ' ' , L] ) ) ;
writeln ( fif, format( 'Curve number:%17s CN = %5.2f km2' , [ ' ' , Cn] ) ) ;
writeln ( fif, format( 'Time of consenteration:%7s TC = %5.2f hrs' , [ ' ' , TC] ) ) ;
writeln ( fif, format( 'Time of peak discharge:%7s TP = %5.2f hrs' , [ ' ' , TP] ) ) ;
writeln ( fif, format( 'Peak discharge for U.H:%7s Qp = %5.2f cms' , [ ' ' , Qp] ) ) ;
// C: Part 2 *********************************************
writeln ( fif) ;
writeln ( fif, '==========================[ Calculation ]============================' ) ;
writeln ( fif) ;
writeln ( fif, '----------+---------+---------+---------+---------+---------+--------' ) ;
writeln ( fif, 'TR(year) | 2 | 5 | 10 | 25 | 50 | 100' ) ;
writeln ( fif, '----------+---------+---------+---------+---------+---------+--------' ) ;
// print QMax valus;
write ( fif, format( 'Qmax cms%2s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( fif, format( '| %7.2f ' , [ clcQMax( p[ ind] ) ] ) ) ;
writeln ( fif) ;
// print V/1000 valus;
write ( fif, format( 'V/1000 m3%1s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( fif, format( '| %7.2f ' , [ clcV( p[ ind] ) ] ) ) ;
writeln ( fif) ;
// print RE valus;
write ( fif, format( 'RE mm%5s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( fif, format( '| %7.2f ' , [ clcRe( p[ ind] ) ] ) ) ;
writeln ( fif) ;
// print P valus;
write ( fif, format( 'P mm%6s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( fif, format( '| %7.2f ' , [ p[ ind] ] ) ) ;
writeln ( fif) ;
// print Coef valus;
write ( fif, format( 'Coef %%%4s' , [ ' ' ] ) ) ;
for ind : = 1 to 6 do
write ( fif, format( '| %7.2f ' , [ clcCoef( p[ ind] ) ] ) ) ;
writeln ( fif) ;
writeln ( fif, '----------+---------+---------+---------+---------+---------+--------' ) ;
writeln ( fif) ;
// C: part 3 **************************************************************
writeln ( fif, '=======================[ Flood hydrograph ]==========================' ) ;
writeln ( fif) ;
writeln ( fif, '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
writeln ( fif, 't(hrs) | U.H | 2 | 5 | 10 | 25 | 50 | 100' ) ;
writeln ( fif, '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
for ind : = 1 to 33 do
begin
Qre : = Qp * qpArr[ ind] ;
writeln ( fif, format( '%6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f | %6.2f' ,
[ Tp * tpArr[ ind] , Qre, clcRe( p[ 1 ] ) * Qre, clcRe( p[ 2 ] ) * Qre,
clcRe( p[ 3 ] ) * Qre, clcRe( p[ 4 ] ) * Qre, clcRe( p[ 5 ] ) * Qre, clcRe( p[ 6 ] ) * Qre] ) ) ;
end ;
writeln ( fif, '-------+--------+--------+--------+--------+--------+--------+-------' ) ;
close( fif) ;
end ;
BEGIN
Create;
calculation( ) ;
PrintValues( ) ;
fileManager( )
END .
cHJvZ3JhbSBTQ1NQcm9qZWN0OwoKCgp2YXIKICAgICAgQSwgSG1heCAsSG1pbiwgTCwgQ24gOiByZWFsOwogICAgICB3TmFtZSA6IFN0cmluZzsKICAgICAgVGMsIFRwLCBRcCwgd2ksIEQsCiAgICAgIHkgLCBEZSwgVEMxLCBUQzIsIFRDMywKICAgICAgVGwsIFMgOiByZWFsOwoKICAgICAgZmlmIDogVGV4dEZpbGU7CgogICAgICB0Y1NlbGVjdG9yIDogaW50ZWdlcjsKICAgICAgcCA6IEFycmF5IFsxLi42XSBvZiByZWFsOwogICAgICBjb25zdCB0cEFyciA6YXJyYXkgWzEuLjMzXSBvZiByZWFsID0gKDAuMCwKICAgICAgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDAuNiwgMC43LCAwLjgsIDAuOSwgMS4wLAogICAgICAxLjEsIDEuMiwgMS4zLCAxLjQsIDEuNSwgMS42LCAxLjcsIDEuOCwgMS45LCAyLjAsCiAgICAgIDIuMiwgMi40LCAyLjYsIDIuOCwgMy4wLCAzLjIsIDMuNCwgMy42LCAzLjgsIDQuMCwKICAgICAgNC41LCA1LjApOwogICAgICBjb25zdCBxcEFyciA6YXJyYXkgWzEuLjMzXSBvZiByZWFsID0gKDAuMCwKICAgICAgMC4wMywgMC4xLCAwLjE5LCAwLjMxLCAwLjQ3LCAwLjY2LCAwLjgyLCAwLjkzLDAuOTksCiAgICAgIDEuMCwgMC45OSwgMC45MywgMC44NiwgMC43OCwgMC42OCwgMC41NiwgMC40NiwgMC4zOSwKICAgICAgMC4zMywgMC4yOCwgMC4yMDcsIDAuMTQ3LCAwLjEwNywgMC4wNzcsIDAuMDU1LCAwLjA0LAogICAgICAwLjAyOSwgMC4wMjEsIDAuMDE1LCAwLjAxMSwgMC4wMDUsIDAuMCk7CgogICAgICBwcm9jZWR1cmUgQ3JlYXRlKCk7CgogICAgICBmdW5jdGlvbiBjbGNRcCgpOnJlYWw7CiAgICAgIGZ1bmN0aW9uIGNsY1FNYXgoUGkgOiByZWFsKTpyZWFsOwogICAgICBmdW5jdGlvbiBjbGNSZShQaSA6IHJlYWwpOnJlYWw7CiAgICAgIGZ1bmN0aW9uIGNsY1YoUGkgOiByZWFsKTogcmVhbDsKICAgICAgZnVuY3Rpb24gY2xjQ29lZihQaSA6IHJlYWwpOiByZWFsOwogICAgICBwcm9jZWR1cmUgcGlQcmludGVyKCk7CiAgICAgIHByb2NlZHVyZSB0YWJsZVByaW50ZXIoKTsKICAgICAgcHJvY2VkdXJlIGNhbGN1bGF0aW9uKCk7CiAgICAgIHByb2NlZHVyZSB3cml0ZVRvRmlsZShmaWxlTmFtZTogU3RyaW5nKTsKCiAgICAgIHByb2NlZHVyZSBnZXRJbnB1dCgpOwogICAgICBwcm9jZWR1cmUgUHJpbnRWYWx1ZXMoKTsKICAgICAgcHJvY2VkdXJlIGZpbGVNYW5hZ2VyKCk7CgoKcHJvY2VkdXJlIGNhbGN1bGF0aW9uOwpiZWdpbgogIGdldElucHV0KCk7CiAgY2xjUXAoKTsKZW5kOwoKZnVuY3Rpb24gY2xjQ29lZihQaTogcmVhbCk6IHJlYWw7CmJlZ2luCiAgY2xjQ29lZiA6PSAoY2xjUmUoUGkpIC8gUGkpICogMTAwOwplbmQ7CgpmdW5jdGlvbiBjbGNRTWF4KFBpOiByZWFsKTogcmVhbDsKYmVnaW4KICBjbGNRTWF4IDo9IFFwICogY2xjUmUoUGkpOwplbmQ7CgpmdW5jdGlvbiBjbGNRcDogUmVhbDsKYmVnaW4KICAvLyBjbGMgV2kgdmFsdWUKICBXaSA6PSAoSG1heCAtIEhtaW4pIC8gKDEwICogTCk7CiAgLy8gY2xjIFkgdmFsdWUKICB5IDo9IChIbWF4IC0gSG1pbikgLyAoMTAwMCAqIEwpOwogIC8vIGNsYyBEZSB2YWx1ZQogIERlIDo9IHNxcnQoNCAqIEEgLyAzLjE0MTYpOwogIC8vIGNsYyBTIHZhbHVlCiAgUyA6PSAoMTAwMCAvIENuKSAtIDEwOwogIC8vIGNsYyBUYzEgdmFsdWUKICBUQzEgOj0gKDAuNjY2ICogKEwgLyBEZSkpICogcG93ZXIoKChBICogQSkgLyBXaSkgLCAwLjIpOwogIC8vIGNsYyBUYzIgdmFsdWUKICBUQzIgOj0gMC4wMDAzICogKHBvd2VyKChMICogMTAwMCkgLCAwLjc3KSAqIHBvd2VyKHkgLCAtMC4zODUpKTsKICAvLyBjbGMgVGMzIHZhbHVlCiAgVEMzIDo9IDAuMDU3ICogcG93ZXIoTCAsIDAuOCkgKiBwb3dlcihTICsgMSAsIDAuNykgLyBwb3dlcih5ICwgMC41KTsKICAvLyBjbGMgVGMgdmFsdWUgZm9yIFRDICgxICwgMiAsIDMpCiAgd3JpdGVsbihmb3JtYXQoJzEuICBUQzE9ICU1LjJmJywgW1RDMV0pKTsKICB3cml0ZWxuKGZvcm1hdCgnMi4gIFRDMj0gJTUuMmYnLCBbVEMyXSkpOwogIHdyaXRlbG4oZm9ybWF0KCczLiAgVEMzPSAlNS4yZicsIFtUQzNdKSk7CiAgd3JpdGUoJ1NlbGVjdCBUQyBmcm9tIDEuLjM6ICcpOwogIHJlYWRsbih0Y1NlbGVjdG9yKTsKICBjYXNlIHRjU2VsZWN0b3Igb2YKICAgICAgMSA6IFRjIDo9IFRDMTsKICAgICAgMiA6IFRjIDo9IFRDMjsKICAgICAgMyA6IFRjIDo9IFRDMwogICAgZWxzZQogICAgICBUYyA6PSAwOwogIGVuZDsKICAvLyBjbGMgVGwgdmFsdWUKICBUbCA6PSAwLjYgKiBUYzsKICAvLyBjbGMgRCB2YWx1ZQogIEQgOj0gMC4xMyAqIFRjOwogIC8vIGNsYyBUcCB2YWx1ZQogIFRwIDo9IChEIC8gMikgKyBUbDsKICAvLyBjbGMgUXAgdmFsdWUKICBRcCA6PSAoMC4yMDgzICogQSkgLyBUcDsKICBjbGNRcCA6PSBRcDsKZW5kOwoKZnVuY3Rpb24gY2xjUmUoUGk6IHJlYWwpOiByZWFsOwp2YXIKICByZVY6IHJlYWw7CmJlZ2luCiAgcmVWIDo9IHBvd2VyKFBpIC0gKDAuMiAqIFMgKiAyNS40KSAsIDIuMCkgLyAoUGkgKyAoMC44ICogUyAqIDI1LjQpKTsKICBpZiAocGkgPCAoMC4yICogUyAqIDI1LjQpKSB0aGVuCiAgICBjbGNSZSA6PSAwCiAgZWxzZQogICAgY2xjUmUgOj0gcmVWOwplbmQ7CgpmdW5jdGlvbiBjbGNWKFBpOiByZWFsKTogcmVhbDsKYmVnaW4KICBjbGNWIDo9IEEgKiBjbGNSZShQaSk7CmVuZDsKCnByb2NlZHVyZSBDcmVhdGU7CmJlZ2luCiAgd3JpdGVsbignKioqKioqKioqKioqKioqKioqKioqKioqKiogUy5DLlMgQ2FjdWxhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqJyk7CiAgd3JpdGVsbignVmVyc2lvbjogMS4wMCBmZWItMjAxMCcpOwogIHdyaXRlbG4oJ1Byb2dyYW1taW5nOiBBaG1hZCBkYW5lc2h2YXIgKGFobWFkLmRhbmVzaHZhckBnbWFpbC5jb20pJyk7CiAgd3JpdGVsbignKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7CiAgd3JpdGVsbjsKZW5kOwoKcHJvY2VkdXJlIGZpbGVNYW5hZ2VyOwp2YXIKICBzZWw6IFN0cmluZzsKYmVnaW4KICB3cml0ZWxuOwogIHdyaXRlbG4oJz4+IFRvIGV4aXQganVzdCBwcmVzcyBlbnRlciBrZXknKTsKICB3cml0ZWxuKCc+PiBUbyBzYXZlIGRhdGEgdG8gZmlsZSBlbnRlciwgZmlsZSBuYW1lJyk7CiAgd3JpdGVsbignPj4gVG8gc2VsZWN0IHdhdGVyc2hlZCBuYW1lIGFzIGZpbGUgbmFtZSBlbnRlciAiKiInKTsKICByZWFkbG4oc2VsKTsKICBzZWwgOj0gdHJpbShzZWwpOwogIGlmIHNlbCA9ICcnIHRoZW4KICAgIGhhbHQ7CiAgaWYgc2VsID0gJyonIHRoZW4KICAgIHNlbCA6PSB3TmFtZTsKICB3cml0ZVRvRmlsZShzZWwpOwogIHdyaXRlbG4oJ0ZpbGUgc3VjY2Vzc2Z1bCBzYXZlZCBhcyBuYW1lICInICsgc2VsICsgJy50eHQiLiBFbnRlciBrZXkgdG8gZXhpdC4uLicpOwogIHJlYWRsbjsKICBoYWx0OwplbmQ7Cgpwcm9jZWR1cmUgZ2V0SW5wdXQ7CnZhcgogIGluZCA6IGludGVnZXI7CmJlZ2luCiAgd3JpdGUoJ0VudGVyIHdhdGVyc2hlZCBuYW1lOiAnKTsKICByZWFkbG4od05hbWUpOwogIHdyaXRlKCdFbnRlciBBIHZhbHVlOiAnKTsKICByZWFkbG4oQSk7CiAgd3JpdGUoJ0VudGVyIEhtYXg6ICcpOwogIHJlYWRsbihIbWF4KTsKICB3cml0ZSgnRW50ZXIgSG1pbjogJyk7CiAgcmVhZGxuKEhtaW4pOwogIHdyaXRlKCdFbnRlciBMIHZhbHVlOiAnKTsKICByZWFkbG4oTCk7CiAgd3JpdGUoJ0VudGVyIENuIHZhbHVlOiAnKTsKICByZWFkbG4oQ24pOwoKICB3cml0ZWxuKCdOb3cgeW91IG11c3QgZW50ZXIgc2l4IHZhbHVlIGZvciBQOicpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgYmVnaW4KICAgIHdyaXRlKCdQWycgKyBpbnR0b3N0cihpbmQpICsgJ106ICcpOwogICAgcmVhZGxuKFBbaW5kXSk7CiAgZW5kOwoKZW5kOwoKcHJvY2VkdXJlIHBpUHJpbnRlcjsKdmFyCiAgaW5kOiBJbnRlZ2VyOwpiZWdpbgogIHdyaXRlbG47CiAgd3JpdGVsbignPT09PT09PT09PT09PT09PT09PT09PT09PT1bIENhbGN1bGF0aW9uIF09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CiAgd3JpdGVsbjsKICB3cml0ZWxuKCctLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0nKTsKICB3cml0ZWxuKCdUUih5ZWFyKSAgfCAgICAyICAgIHwgICAgNSAgICB8ICAgIDEwICAgfCAgICAyNSAgIHwgICAgNTAgICB8ICAxMDAnKTsKICB3cml0ZWxuKCctLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0nKTsKICAvLyBwcmludCBRTWF4IHZhbHVzOwogIHdyaXRlKGZvcm1hdCgnUW1heCBjbXMlMnMnLFsnICddKSk7CiAgZm9yIGluZCA6PSAxIHRvIDYgZG8KICAgIHdyaXRlKGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNRTWF4KHBbaW5kXSldKSk7CiAgd3JpdGVsbjsKICAvLyBwcmludCBWLzEwMDAgdmFsdXM7CiAgd3JpdGUoZm9ybWF0KCdWLzEwMDAgbTMlMXMnLFsnICddKSk7CiAgZm9yIGluZCA6PSAxIHRvIDYgZG8KICAgIHdyaXRlKGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNWKHBbaW5kXSldKSk7CiAgd3JpdGVsbjsKICAvLyBwcmludCBSRSB2YWx1czsKICB3cml0ZShmb3JtYXQoJ1JFIG1tJTVzJyxbJyAnXSkpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgICB3cml0ZShmb3JtYXQoJ3wgJTcuMmYgJyxbY2xjUmUocFtpbmRdKV0pKTsKICB3cml0ZWxuOwogIC8vIHByaW50IFAgdmFsdXM7CiAgd3JpdGUoZm9ybWF0KCdQIG1tJTZzJyxbJyAnXSkpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgICB3cml0ZShmb3JtYXQoJ3wgJTcuMmYgJyxbcFtpbmRdXSkpOwogIHdyaXRlbG47CiAgLy8gcHJpbnQgQ29lZiB2YWx1czsKICB3cml0ZShmb3JtYXQoJ0NvZWYgJSUlNHMnLFsnICddKSk7CiAgZm9yIGluZCA6PSAxIHRvIDYgZG8KICAgIHdyaXRlKGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNDb2VmKHBbaW5kXSldKSk7CiAgd3JpdGVsbjsKICB3cml0ZWxuKCctLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0nKTsKICB3cml0ZWxuOwplbmQ7Cgpwcm9jZWR1cmUgUHJpbnRWYWx1ZXM7CmJlZ2luCiAgd3JpdGVsbjsKICB3cml0ZWxuKCdXYXRlcnNoZWQgbmFtZTogJyArIHdOYW1lKTsKICB3cml0ZWxuOwogIHdyaXRlbG4oJz09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIFN1bW1lcnkgXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwogIHdyaXRlbG4oZm9ybWF0KCdXYXRlcnNoZWQgYXJlYTolMTVzIEEgICA9ICU1LjJmIGttMicsWycgJywgQV0pKTsKICB3cml0ZWxuKGZvcm1hdCgnTWF4aW11bSBoaWdodDolMTZzIEhtYXg9ICU1LjJmIG0nLFsnICcsIEhtYXhdKSk7CiAgd3JpdGVsbihmb3JtYXQoJ01pbmltdW0gaGlnaHQ6JTE2cyBIbWluPSAlNS4yZiBtJyxbJyAnLCBIbWluXSkpOwogIHdyaXRlbG4oZm9ybWF0KCdIeWRyYXVsaWMgbGVuZ3RoOiUxM3MgTCAgID0gJTUuMmYga20nLFsnICcsIExdKSk7CiAgd3JpdGVsbihmb3JtYXQoJ0N1cnZlIG51bWJlcjolMTdzIENOICA9ICU1LjJmIGttMicsWycgJywgQ25dKSk7CiAgd3JpdGVsbihmb3JtYXQoJ1RpbWUgb2YgY29uc2VudGVyYXRpb246JTdzIFRDICA9ICU1LjJmIGhycycsWycgJywgVENdKSk7CiAgd3JpdGVsbihmb3JtYXQoJ1RpbWUgb2YgcGVhayBkaXNjaGFyZ2U6JTdzIFRQICA9ICU1LjJmIGhycycsWycgJywgVFBdKSk7CiAgd3JpdGVsbihmb3JtYXQoJ1BlYWsgZGlzY2hhcmdlIGZvciBVLkg6JTdzIFFwICA9ICU1LjJmIGNtcycsWycgJywgUXBdKSk7CiAgcGlQcmludGVyKCk7CiAgdGFibGVQcmludGVyKCk7CmVuZDsKCnByb2NlZHVyZSB0YWJsZVByaW50ZXI7CnZhcgogIGluZDogSW50ZWdlcjsKICBRcmUgOiByZWFsOwpiZWdpbgogIHdyaXRlbG4oJz09PT09PT09PT09PT09PT09PT09PT09WyBGbG9vZCBoeWRyb2dyYXBoIF09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwogIHdyaXRlbG47CiAgd3JpdGVsbignLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tJyk7CiAgd3JpdGVsbigndChocnMpIHwgIFUuSCAgIHwgICAgMiAgIHwgICAgNSAgIHwgICAxMCAgIHwgICAyNSAgIHwgICA1MCAgIHwgIDEwMCcpOwogIHdyaXRlbG4oJy0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLScpOwogIGZvciBpbmQgOj0gMSB0byAzMyBkbwogIGJlZ2luCiAgICBRcmUgOj0gUXAgKiBxcEFycltpbmRdOwogICAgd3JpdGVsbihmb3JtYXQoJyU2LjJmIHwgJTYuMmYgfCAlNi4yZiB8ICU2LjJmIHwgJTYuMmYgfCAlNi4yZiB8ICU2LjJmIHwgJTYuMmYnLAogICAgW1RwICogdHBBcnJbaW5kXSwgUXJlLCBjbGNSZShwWzFdKSAqIFFyZSwgY2xjUmUocFsyXSkgKiBRcmUsCiAgICBjbGNSZShwWzNdKSAqIFFyZSwgY2xjUmUocFs0XSkgKiBRcmUsIGNsY1JlKHBbNV0pICogUXJlLCBjbGNSZShwWzZdKSAqIFFyZV0pKTsKICBlbmQ7CiAgd3JpdGVsbignLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tJyk7CmVuZDsKCnByb2NlZHVyZSB3cml0ZVRvRmlsZShmaWxlTmFtZTogU3RyaW5nKTsKdmFyCiAgaW5kIDogSW50ZWdlcjsKICBRcmUgOiByZWFsOwpiZWdpbgogIGFzc2lnbihmaWYgLCBmaWxlTmFtZSArICcudHh0Jyk7CiAgcmVXcml0ZShmaWYpOwogIC8vIEM6IFBhcnQgMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIHdyaXRlbG4oZmlmLCAnQ2FsY3VsYXRpb24gaHlkcm9ncmFwaCBieSBTLkMuUyBtZXRob2QnKTsKICB3cml0ZWxuKGZpZik7CiAgd3JpdGVsbihmaWYsICdXYXRlcnNoZWQgbmFtZTogJyArIHdOYW1lKTsKICB3cml0ZWxuKGZpZiwgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIFN1bW1lcnkgXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwogIHdyaXRlbG4oZmlmLCBmb3JtYXQoJ1dhdGVyc2hlZCBhcmVhOiUxNXMgQSAgID0gJTUuMmYga20yJyxbJyAnLCBBXSkpOwogIHdyaXRlbG4oZmlmLCBmb3JtYXQoJ01heGltdW0gaGlnaHQ6JTE2cyBIbWF4PSAlNS4yZiBtJyxbJyAnLCBIbWF4XSkpOwogIHdyaXRlbG4oZmlmLCBmb3JtYXQoJ01pbmltdW0gaGlnaHQ6JTE2cyBIbWluPSAlNS4yZiBtJyxbJyAnLCBIbWluXSkpOwogIHdyaXRlbG4oZmlmLCBmb3JtYXQoJ0h5ZHJhdWxpYyBsZW5ndGg6JTEzcyBMICAgPSAlNS4yZiBrbScsWycgJywgTF0pKTsKICB3cml0ZWxuKGZpZiwgZm9ybWF0KCdDdXJ2ZSBudW1iZXI6JTE3cyBDTiAgPSAlNS4yZiBrbTInLFsnICcsIENuXSkpOwogIHdyaXRlbG4oZmlmLCBmb3JtYXQoJ1RpbWUgb2YgY29uc2VudGVyYXRpb246JTdzIFRDICA9ICU1LjJmIGhycycsWycgJywgVENdKSk7CiAgd3JpdGVsbihmaWYsIGZvcm1hdCgnVGltZSBvZiBwZWFrIGRpc2NoYXJnZTolN3MgVFAgID0gJTUuMmYgaHJzJyxbJyAnLCBUUF0pKTsKICB3cml0ZWxuKGZpZiwgZm9ybWF0KCdQZWFrIGRpc2NoYXJnZSBmb3IgVS5IOiU3cyBRcCAgPSAlNS4yZiBjbXMnLFsnICcsIFFwXSkpOwoKICAvLyBDOiBQYXJ0IDIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgd3JpdGVsbihmaWYpOwogIHdyaXRlbG4oZmlmLCAnPT09PT09PT09PT09PT09PT09PT09PT09PT1bIENhbGN1bGF0aW9uIF09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CiAgd3JpdGVsbihmaWYpOwogIHdyaXRlbG4oZmlmLCAnLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tJyk7CiAgd3JpdGVsbihmaWYsICdUUih5ZWFyKSAgfCAgICAyICAgIHwgICAgNSAgICB8ICAgIDEwICAgfCAgICAyNSAgIHwgICAgNTAgICB8ICAxMDAnKTsKICB3cml0ZWxuKGZpZiwgJy0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLScpOwogIC8vIHByaW50IFFNYXggdmFsdXM7CiAgd3JpdGUoZmlmLCBmb3JtYXQoJ1FtYXggY21zJTJzJyxbJyAnXSkpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgICB3cml0ZShmaWYsIGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNRTWF4KHBbaW5kXSldKSk7CiAgd3JpdGVsbihmaWYpOwogIC8vIHByaW50IFYvMTAwMCB2YWx1czsKICB3cml0ZShmaWYsIGZvcm1hdCgnVi8xMDAwIG0zJTFzJyxbJyAnXSkpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgICB3cml0ZShmaWYsIGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNWKHBbaW5kXSldKSk7CiAgd3JpdGVsbihmaWYpOwogIC8vIHByaW50IFJFIHZhbHVzOwogIHdyaXRlKGZpZiwgZm9ybWF0KCdSRSBtbSU1cycsWycgJ10pKTsKICBmb3IgaW5kIDo9IDEgdG8gNiBkbwogICAgd3JpdGUoZmlmLCBmb3JtYXQoJ3wgJTcuMmYgJyxbY2xjUmUocFtpbmRdKV0pKTsKICB3cml0ZWxuKGZpZik7CiAgLy8gcHJpbnQgUCB2YWx1czsKICB3cml0ZShmaWYsIGZvcm1hdCgnUCBtbSU2cycsWycgJ10pKTsKICBmb3IgaW5kIDo9IDEgdG8gNiBkbwogICAgd3JpdGUoZmlmLCBmb3JtYXQoJ3wgJTcuMmYgJyxbcFtpbmRdXSkpOwogIHdyaXRlbG4oZmlmKTsKICAvLyBwcmludCBDb2VmIHZhbHVzOwogIHdyaXRlKGZpZiwgZm9ybWF0KCdDb2VmICUlJTRzJyxbJyAnXSkpOwogIGZvciBpbmQgOj0gMSB0byA2IGRvCiAgICB3cml0ZShmaWYsIGZvcm1hdCgnfCAlNy4yZiAnLFtjbGNDb2VmKHBbaW5kXSldKSk7CiAgd3JpdGVsbihmaWYpOwogIHdyaXRlbG4oZmlmLCAnLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tJyk7CiAgd3JpdGVsbihmaWYpOwoKICAvLyBDOiBwYXJ0IDMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICB3cml0ZWxuKGZpZiwgJz09PT09PT09PT09PT09PT09PT09PT09WyBGbG9vZCBoeWRyb2dyYXBoIF09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwogIHdyaXRlbG4oZmlmKTsKICB3cml0ZWxuKGZpZiwgJy0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLScpOwogIHdyaXRlbG4oZmlmLCAndChocnMpIHwgIFUuSCAgIHwgICAgMiAgIHwgICAgNSAgIHwgICAxMCAgIHwgICAyNSAgIHwgICA1MCAgIHwgIDEwMCcpOwogIHdyaXRlbG4oZmlmLCAnLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tJyk7CiAgZm9yIGluZCA6PSAxIHRvIDMzIGRvCiAgYmVnaW4KICAgIFFyZSA6PSBRcCAqIHFwQXJyW2luZF07CiAgICB3cml0ZWxuKGZpZiwgZm9ybWF0KCclNi4yZiB8ICU2LjJmIHwgJTYuMmYgfCAlNi4yZiB8ICU2LjJmIHwgJTYuMmYgfCAlNi4yZiB8ICU2LjJmJywKICAgIFtUcCAqIHRwQXJyW2luZF0sIFFyZSwgY2xjUmUocFsxXSkgKiBRcmUsIGNsY1JlKHBbMl0pICogUXJlLAogICAgY2xjUmUocFszXSkgKiBRcmUsIGNsY1JlKHBbNF0pICogUXJlLCBjbGNSZShwWzVdKSAqIFFyZSwgY2xjUmUocFs2XSkgKiBRcmVdKSk7CiAgZW5kOwogIHdyaXRlbG4oZmlmLCAnLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tJyk7CiAgY2xvc2UoZmlmKTsKZW5kOwoKQkVHSU4KICBDcmVhdGU7CiAgY2FsY3VsYXRpb24oKTsKICBQcmludFZhbHVlcygpOwogIGZpbGVNYW5hZ2VyKCkKRU5ELg==