(command.CommandList
  children: [
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<.>} 
              {
                (DQ 
                  (braced_var_sub
                    token: <Id.VSub_Name srcdir>
                    suffix_op: (suffix_op.Unary tok:<Id.VTest_Equals '='> arg_word:{<.>})
                  ) <'/tests/init.sh'>
                )
              }
            )
          terminator: <Id.Op_Semi _>
        )
        (C {<path_prepend_>} {<'./src'>})
      ]
    )
    (C {<print_ver_>} {<chgrp>})
    (C {<require_membership_in_two_groups_>})
    (command.CommandList
      children: [
        (command.Sentence
          child: (C {<set>} {<Id.Lit_Underscore _>} {($ Id.VSub_DollarName '$groups')})
          terminator: <Id.Op_Semi _>
        )
        (C {<shift>})
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:g1)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [76]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:g2)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$2')}
          spids: [79]
        )
      ]
    )
    (C {<touch>} {<f>})
    (C {<ln>} {<-s>} {<f>} {<symlink>})
    (command.Simple
      words: [{<chgrp>} {<-h>} {($ Id.VSub_DollarName '$g2')} {<symlink>}]
      redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{<'/dev/null'>})]
      do_fork: T
    )
    (C {<set>} {<Id.Lit_Underscore _>} 
      {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<symlink>}))}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:g)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$5')}
          spids: [120]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
          {($ Id.VSub_DollarName '$g2')}
        )
        (C {<skip_>} {(DQ <'your system doesn\'t support changing the owner or group'>)} 
          {(DQ <'of a symbolic link.'>)}
        )
      ]
    )
    (C {<chgrp>} {($ Id.VSub_DollarName '$g1')} {<f>})
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<f>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [169]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g1')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [185]
                )
              ]
            )
          ]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<chgrp>} {<-h>} {($ Id.VSub_DollarName '$g2')} {<symlink>})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:fail)
              op: assign_op.Equal
              rhs: {<1>}
              spids: [199]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<f>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [215]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g1')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [231]
                )
              ]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<symlink>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [247]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g2')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [263]
                )
              ]
            )
          ]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<chgrp>} {<-h>} {($ Id.VSub_DollarName '$g2')} {<symlink>})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:fail)
              op: assign_op.Equal
              rhs: {<1>}
              spids: [280]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<f>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [296]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g1')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [312]
                )
              ]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<symlink>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [328]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g2')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [344]
                )
              ]
            )
          ]
        )
      ]
    )
    (C {<chgrp>} {($ Id.VSub_DollarName '$g2')} {<f>})
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<f>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [367]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g2')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [383]
                )
              ]
            )
          ]
        )
      ]
    )
    (C {<chgrp>} {<--dereference>} {($ Id.VSub_DollarName '$g1')} {<symlink>})
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<f>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [417]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g1')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [433]
                )
              ]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (C {<set>} {<Id.Lit_Underscore _>} 
              {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<ls>} {<-ln>} {<symlink>}))}
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:g)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$5')}
                  spids: [449]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (C {<test>} {(DQ ($ Id.VSub_DollarName '$g'))} {<Id.Lit_Equals '='>} 
              {($ Id.VSub_DollarName '$g2')}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fail)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [465]
                )
              ]
            )
          ]
        )
      ]
    )
    (C {<Exit>} {($ Id.VSub_DollarName '$fail')})
  ]
)