(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:dosay)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(which)} {(say)})])
                  left_token: <Left_Backtick '`'>
                  spids: [12 16]
                ) (' --quality=127')
              )
            }
          spids: [10]
        )
      ]
      spids: [10]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:format)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(which)} {(fmt)})])
                  left_token: <Left_Backtick '`'>
                  spids: [22 26]
                ) (' -w 70')
              )
            }
          spids: [20]
        )
      ]
      spids: [20]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:voice) op:Equal rhs:{(DQ )} spids:[31])]
      spids: [31]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:rate) op:Equal rhs:{(DQ )} spids:[38])]
      spids: [38]
    )
    (FuncDef
      name: demovoices
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:voicelist)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (Pipeline
                                children: [
                                  (C {(say)} {(-v)} {(EscapedLiteralPart token:<Lit_EscapedChar '\\?'>)})
                                  (C {(grep)} {(DQ (en_))})
                                  (C {(cut)} {(-c1-12)})
                                  (C {(sed)} {(SQ <'s/ /_/;s/ //g;s/_$//'>)})
                                ]
                                negated: False
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [59 90]
                      )
                    }
                  spids: [58]
                )
              ]
              spids: [58]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(DQ ($ VSub_Number '$1'))} {(Lit_Other '=')} {(DQ (list))} 
                          {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Pipeline
                      children: [
                        (C {(echo)} {(Available)} {(voices) (Lit_Other ':')} 
                          {
                            (CommandSubPart
                              command_list: 
                                (CommandList
                                  children: [
                                    (Pipeline
                                      children: [
                                        (C {(echo)} {($ VSub_Name '$voicelist')})
                                        (C {(sed)} {(SQ <'s/ /, /g;s/_/ /g'>)})
                                      ]
                                      negated: False
                                    )
                                  ]
                                )
                              left_token: <Left_CommandSub '$('>
                              spids: [122 134]
                            )
                          }
                        )
                        (C {($ VSub_Name '$format')})
                      ]
                      negated: False
                    )
                    (C {(echo)} 
                      {
                        (DQ ('HANDY TIP: use ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                          (CommandSubPart
                            command_list: 
                              (CommandList
                                children: [(C {(basename)} {($ VSub_Number '$0')})]
                              )
                            left_token: <Left_CommandSub '$('>
                            spids: [146 150]
                          ) (' demo') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' to hear all the voices')
                        )
                      }
                    )
                    (C {(exit)} {(0)})
                  ]
                  spids: [-1 112]
                )
              ]
              spids: [-1 162]
            )
            (ForEach
              iter_name: name
              iter_words: [{($ VSub_Name '$voicelist')}]
              do_arg_iter: False
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:myname)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (C {(echo)} {($ VSub_Name '$name')})
                                          (C {(sed)} {(SQ <'s/_/ /'>)})
                                        ]
                                        negated: False
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [180 192]
                              )
                            }
                          spids: [179]
                        )
                      ]
                      spids: [179]
                    )
                    (C {(echo)} {(DQ ('Voice: ') ($ VSub_Name '$myname'))})
                    (C {($ VSub_Name '$dosay')} {(-v)} {(DQ ($ VSub_Name '$myname'))} 
                      {(DQ ("Hello! I'm ") ($ VSub_Name '$myname') ('. This is what I sound like.'))}
                    )
                  ]
                  spids: [176 218]
                )
              spids: [171 174]
            )
            (C {(exit)} {(0)})
          ]
          spids: [50]
        )
      spids: [46 49]
    )
    (FuncDef
      name: usage
      body: 
        (BraceGroup
          children: [
            (C {(echo)} {(DQ ('Usage: sayit [-v voice] [-r rate] [-f file] phrase'))})
            (C {(echo)} {(DQ ('   or: sayit demo'))})
            (C {(exit)} {(0)})
          ]
          spids: [233]
        )
      spids: [229 232]
    )
    (While
      cond: [(Sentence child:(C {(getopts)} {(DQ ('df:r:v:'))} {(opt)}) terminator:<Op_Semi ';'>)]
      body: 
        (DoGroup
          children: [
            (Case
              to_match: {($ VSub_Name '$opt')}
              arms: [
                (case_arm
                  pat_list: [{(d)}]
                  action: [(C {(demovoices)} {(list)})]
                  spids: [278 280 286 -1]
                )
                (case_arm
                  pat_list: [{(f)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:input)
                          op: Equal
                          rhs: {(DQ ($ VSub_Name '$OPTARG'))}
                          spids: [293]
                        )
                      ]
                      spids: [293]
                    )
                  ]
                  spids: [289 291 298 -1]
                )
                (case_arm
                  pat_list: [{(r)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:rate)
                          op: Equal
                          rhs: {(DQ ('-r ') ($ VSub_Name '$OPTARG'))}
                          spids: [305]
                        )
                      ]
                      spids: [305]
                    )
                  ]
                  spids: [301 303 311 -1]
                )
                (case_arm
                  pat_list: [{(v)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:voice)
                          op: Equal
                          rhs: {(DQ ($ VSub_Name '$OPTARG'))}
                          spids: [318]
                        )
                      ]
                      spids: [318]
                    )
                  ]
                  spids: [314 316 323 -1]
                )
              ]
              spids: [271 275 326]
            )
          ]
          spids: [268 328]
        )
    )
    (C {(shift)} 
      {
        (ArithSubPart
          anode: 
            (ArithBinary
              op_id: Arith_Minus
              left: (ArithWord w:{($ VSub_Name '$OPTIND')})
              right: (ArithWord w:{(Lit_Digits 1)})
            )
          spids: [333 340]
        )
      }
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {($ VSub_Pound '$#')} {(-eq)} {(0)} {(-a)} {(-z)} 
                  {(DQ ($ VSub_Name '$input'))} {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {($ VSub_Name '$dosay')} 
              {(DQ ("Dude! You haven't given me any parameters to work with."))}
            )
            (C {(echo)} {(DQ ('Error: no parameters specified. Specify a file or phrase'))})
            (C {(exit)} {(0)})
          ]
          spids: [-1 365]
        )
      ]
      spids: [-1 386]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {(DQ ($ VSub_Number '$1'))} {(Lit_Other '=')} {(DQ (demo))} 
                  {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [(C {(demovoices)})]
          spids: [-1 407]
        )
      ]
      spids: [-1 412]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {(KW_Bang '!')} {(-z)} {(DQ ($ VSub_Name '$input'))} 
                  {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {($ VSub_Name '$dosay')} {($ VSub_Name '$rate')} {(-v)} {(DQ ($ VSub_Name '$voice'))} 
              {(-f)} {($ VSub_Name '$input')}
            )
          ]
          spids: [-1 431]
        )
      ]
      else_action: [
        (C {($ VSub_Name '$dosay')} {($ VSub_Name '$rate')} {(-v)} {(DQ ($ VSub_Name '$voice'))} 
          {(DQ ($ VSub_Star '$*'))}
        )
      ]
      spids: [448 465]
    )
    (C {(exit)} {(0)})
  ]
)