(command.CommandList children: [ (C {<.>} {<library.sh>}) (C {<initializeANSI>}) (C {<echon>} {(DQ <'First off, do you have echo in your path? (1=yes, 2=no) '>)}) (C {<read>} {<answer>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [(C {<validint>} {($ Id.VSub_DollarName '$answer')} {<1>} {<2>})] negated: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echon>} { (DQ (${ Id.VSub_Name boldon) <'Try again'> (${ Id.VSub_Name boldoff) <'. Do you have echo '> ) } ) (C {<echon>} {(DQ <'in your path? (1=yes, 2=no) '>)}) (C {<read>} {<answer>}) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [(C {<checkForCmdInPath>} {(DQ <echo>)})] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<echo>} {(DQ <'Nope, can\'t find the echo command.'>)})] spids: [82 94] ) ] else_action: [(C {<echo>} {(DQ <'The echo command is in the PATH.'>)})] ) (C {<echo>} {(DQ )}) (C {<echon>} {(DQ <'Enter a year you think might be a leap year: '>)}) (C {<read>} {<year>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [(C {<validint>} {($ Id.VSub_DollarName '$year')} {<1>} {<9999>})] negated: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echon>} { (DQ <'Please enter a year in the '> (${ Id.VSub_Name boldon) <correct> (${ Id.VSub_Name boldoff) <' format: '> ) } ) (C {<read>} {<year>}) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<isLeapYear>} {($ Id.VSub_DollarName '$year')}) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} { (DQ (${ Id.VSub_Name greenf) <'You\'re right! '> ($ Id.VSub_DollarName '$year') <' was a leap year.'> (${ Id.VSub_Name reset) ) } ) ] spids: [179 187] ) ] else_action: [ (C {<echo>} {(DQ (${ Id.VSub_Name redf) <'Nope, that\'s not a leap year.'> (${ Id.VSub_Name reset))} ) ] ) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<0>}) ] )