(command.CommandList
  children: [
    (C {<.>} {(${ Id.VSub_Name BACKEND) <'/functions.sh'>})
    (C {<.>} {(${ Id.VSub_Name BACKEND) <'/functions-parse.sh'>})
    (C {<.>} {(${ Id.VSub_Name BACKEND) <'/functions-ftp.sh'>})
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_index_by_ftp
          body: 
            (BraceGroup
              children: [
                (C {<local>} {<INDEX_FILE>})
                (C {<local>} {<FTP_SERVER>})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:FTP_SERVER)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [124]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ <INDEX>)}
                      spids: [132]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:USE_BZIP2)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [138]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(DQ <'/usr/bin/bzip2'>)} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name INDEX_FILE) <.bz2>)}
                              spids: [159]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:USE_BZIP2)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [168]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:INDEX_PATH)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name INDEXFILE) <.bz2>)}
                              spids: [172]
                            )
                          ]
                        )
                      ]
                      spids: [143 156]
                    )
                  ]
                  else_action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:INDEX_PATH)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name INDEXFILE))}
                          spids: [184]
                        )
                      ]
                    )
                  ]
                )
                (C {<fetch_file>} {(DQ (${ Id.VSub_Name FTP_SERVER) <'/'> (${ Id.VSub_Name INDEX_FILE))} 
                  {(DQ (${ Id.VSub_Name INDEX_PATH))} {(DQ <1>)}
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.AndOr
                              ops: [Id.Op_DAmp]
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-f>} {(DQ (${ Id.VSub_Name INDEX_PATH))} 
                                  {<Id.Lit_RBracket ']'>}
                                )
                                (C {<Id.Lit_LBracket '['>} {(DQ (${ Id.VSub_Name USE_BZIP2))} {<-eq>} 
                                  {(DQ <1>)} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                            )
                          ]
                        )
                      action: [(C {<bzip2>} {<-d>} {(DQ (${ Id.VSub_Name INDEX_PATH))})]
                      spids: [219 252]
                    )
                  ]
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_index_by_fs
          body: 
            (BraceGroup
              children: [
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.Sentence
                              child: 
                                (C {<Id.Lit_LBracket '['>} 
                                  {(DQ ($ Id.VSub_DollarName '$INSTALLMEDIUM'))} {<Id.Lit_Equals '='>} {(DQ <local>)} {<Id.Lit_RBracket ']'>}
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:INDEXFILE)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name LOCALPATH) <'/packages/INDEX'>)}
                              spids: [300]
                            )
                          ]
                        )
                      ]
                      spids: [279 297]
                    )
                  ]
                  else_action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:INDEXFILE)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name CDMNT) <'/packages/INDEX'>)}
                          spids: [312]
                        )
                      ]
                    )
                  ]
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_index_size
          body: 
            (BraceGroup
              children: [
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(DQ (${ Id.VSub_Name INDEXFILE))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:SIZE)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Pipeline
                                        children: [
                                          (C {<ls>} {<-l>} {(${ Id.VSub_Name INDEXFILE)})
                                          (C {<awk>} {(SQ <'{ print $5 }'>)})
                                        ]
                                        negated: F
                                      )
                                  )
                                }
                              spids: [352]
                            )
                          ]
                        )
                      ]
                      spids: [334 349]
                    )
                  ]
                  else_action: [
                    (C {<get_ftp_mirror>})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FTPHOST)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name VAL))}
                          spids: [380]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FTPDIR)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ <'/pub/FreeBSD/releases/'> (${ Id.VSub_Name FBSD_ARCH) <'/'> 
                                (${ Id.VSub_Name FBSD_BRANCH)
                              )
                            }
                          spids: [389]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:FTPPATH)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ <'ftp://'> (${ Id.VSub_Name FTPHOST) (${ Id.VSub_Name FTPDIR) 
                                <'/packages'>
                              )
                            }
                          spids: [402]
                        )
                      ]
                    )
                    (C {<fetch>} {<-s>} {(DQ (${ Id.VSub_Name FTPPATH) <'/INDEX.bz2'>)})
                  ]
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_index
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RES)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [441]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ (${ Id.VSub_Name INSTALLMODE))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (C {<get_ftp_mirror>})
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FTPHOST)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name VAL))}
                              spids: [467]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FTPDIR)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ <'/pub/FreeBSD/releases/'> (${ Id.VSub_Name FBSD_ARCH) <'/'> 
                                    (${ Id.VSub_Name FBSD_BRANCH)
                                  )
                                }
                              spids: [476]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FTPPATH)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ <'ftp://'> (${ Id.VSub_Name FTPHOST) (${ Id.VSub_Name FTPDIR) 
                                    <'/packages'>
                                  )
                                }
                              spids: [489]
                            )
                          ]
                        )
                        (C {<get_package_index_by_ftp>} {(DQ (${ Id.VSub_Name FTPPATH))})
                      ]
                      spids: [446 461]
                    )
                  ]
                  else_action: [
                    (command.Case
                      to_match: {(DQ (${ Id.VSub_Name INSTALLMEDIUM))}
                      arms: [
                        (case_arm
                          pat_list: [{<usb>} {<dvd>} {<local>}]
                          action: [(C {<get_package_index_by_fs>})]
                          spids: [528 533 537 -1]
                        )
                        (case_arm
                          pat_list: [{<ftp>}]
                          action: [
                            (C {<get_value_from_cfg>} {<ftpHost>})
                            (command.If
                              arms: [
                                (if_arm
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (C {<Id.Lit_LBracket '['>} {<-z>} 
                                              {(DQ ($ Id.VSub_DollarName '$VAL'))} {<Id.Lit_RBracket ']'>}
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  action: [
                                    (C {<exit_err>} 
                                      {
                                        (DQ 
                                          <
'ERROR: Install medium was set to ftp, but no ftpHost was provided!'
                                          >
                                        )
                                      }
                                    )
                                  ]
                                  spids: [548 561]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FTPHOST)
                                  op: assign_op.Equal
                                  rhs: {(DQ (${ Id.VSub_Name VAL))}
                                  spids: [575]
                                )
                              ]
                            )
                            (C {<get_value_from_cfg>} {<ftpDir>})
                            (command.If
                              arms: [
                                (if_arm
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (C {<Id.Lit_LBracket '['>} {<-z>} 
                                              {(DQ ($ Id.VSub_DollarName '$VAL'))} {<Id.Lit_RBracket ']'>}
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  action: [
                                    (C {<exit_err>} 
                                      {
                                        (DQ 
                                          <
'ERROR: Install medium was set to ftp, but no ftpDir was provided!'
                                          >
                                        )
                                      }
                                    )
                                  ]
                                  spids: [589 602]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FTPDIR)
                                  op: assign_op.Equal
                                  rhs: {(DQ (${ Id.VSub_Name VAL))}
                                  spids: [616]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:FTPPATH)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ <'ftp://'> (${ Id.VSub_Name FTPHOST) (${ Id.VSub_Name FTPDIR))
                                    }
                                  spids: [624]
                                )
                              ]
                            )
                            (C {<get_package_index_by_ftp>} {(DQ (${ Id.VSub_Name FTPPATH))})
                          ]
                          spids: [540 541 644 -1]
                        )
                        (case_arm pat_list:[{<sftp>}] spids:[647 648 650 -1])
                        (case_arm
                          pat_list: [{<Id.Lit_Star '*'>}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:RES)
                                  op: assign_op.Equal
                                  rhs: {<1>}
                                  spids: [656]
                                )
                              ]
                            )
                          ]
                          spids: [653 654 659 -1]
                        )
                      ]
                    )
                  ]
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {(${ Id.VSub_Name RES)}
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: parse_package_index
          body: 
            (BraceGroup
              children: [
                (C {<echo_log>} {(DQ <'Building package dep list.. Please wait..'>)})
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX'>)}
                      spids: [694]
                    )
                  ]
                )
                (command.Simple
                  words: [{<exec>}]
                  redirects: [(redir op:<Id.Redir_LessAnd '3<&'> loc:(redir_loc.Fd fd:3) arg:{<0>})]
                  do_fork: T
                )
                (command.Simple
                  words: [{<exec>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Less '0<'>
                      loc: (redir_loc.Fd fd:0)
                      arg: {(DQ (${ Id.VSub_Name INDEXFILE))}
                    )
                  ]
                  do_fork: T
                )
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: (condition.Shell commands:[(C {<read>} {<-r>} {<line>})])
                  body: 
                    (command.DoGroup
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:PKGNAME)
                              op: assign_op.Equal
                              rhs: {(DQ )}
                              spids: [733]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:CATEGORY)
                              op: assign_op.Equal
                              rhs: {(DQ )}
                              spids: [738]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:PACKAGE)
                              op: assign_op.Equal
                              rhs: {(DQ )}
                              spids: [743]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:DESC)
                              op: assign_op.Equal
                              rhs: {(DQ )}
                              spids: [748]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:DEPS)
                              op: assign_op.Equal
                              rhs: {(DQ )}
                              spids: [753]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:i)
                              op: assign_op.Equal
                              rhs: {<0>}
                              spids: [758]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:SAVE_IFS)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name IFS))}
                              spids: [763]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:IFS)
                              op: assign_op.Equal
                              rhs: {(DQ <'|'>)}
                              spids: [771]
                            )
                          ]
                        )
                        (command.ForEach
                          iter_name: part
                          iter_words: [{(${ Id.VSub_Name line)}]
                          do_arg_iter: F
                          body: 
                            (command.DoGroup
                              children: [
                                (command.If
                                  arms: [
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name i)} {<-eq>} 
                                              {<0>} {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:PKGNAME)
                                              op: assign_op.Equal
                                              rhs: {(DQ (${ Id.VSub_Name part))}
                                              spids: [810]
                                            )
                                          ]
                                        )
                                      ]
                                      spids: [792 807]
                                    )
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name i)} {<-eq>} 
                                              {<1>} {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:PACKAGE)
                                              op: assign_op.Equal
                                              rhs: 
                                                {
                                                  (command_sub
                                                    left_token: <Id.Left_Backtick '`'>
                                                    child: 
                                                      (C {<basename>} {(DQ (${ Id.VSub_Name part))})
                                                  )
                                                }
                                              spids: [837]
                                            )
                                          ]
                                        )
                                      ]
                                      spids: [819 834]
                                    )
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name i)} {<-eq>} 
                                              {<3>} {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:DESC)
                                              op: assign_op.Equal
                                              rhs: {(DQ (${ Id.VSub_Name part))}
                                              spids: [870]
                                            )
                                          ]
                                        )
                                      ]
                                      spids: [852 867]
                                    )
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name i)} {<-eq>} 
                                              {<6>} {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:CATEGORY)
                                              op: assign_op.Equal
                                              rhs: 
                                                {
                                                  (command_sub
                                                    left_token: <Id.Left_Backtick '`'>
                                                    child: 
                                                      (command.Pipeline
                                                        children: [
                                                          (C {<echo>} {(DQ (${ Id.VSub_Name part))})
                                                          (C {<cut>} {<-f1>} {<-d> (SQ <' '>)})
                                                        ]
                                                        negated: F
                                                      )
                                                  )
                                                }
                                              spids: [897]
                                            )
                                          ]
                                        )
                                      ]
                                      spids: [879 894]
                                    )
                                    (if_arm
                                      cond: 
                                        (condition.Shell
                                          commands: [
                                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name i)} {<-eq>} 
                                              {<8>} {<Id.Lit_RBracket ']'>}
                                            )
                                          ]
                                        )
                                      action: [
                                        (command.ShAssignment
                                          pairs: [
                                            (assign_pair
                                              lhs: (sh_lhs_expr.Name name:DEPS)
                                              op: assign_op.Equal
                                              rhs: {(DQ (${ Id.VSub_Name part))}
                                              spids: [941]
                                            )
                                          ]
                                        )
                                      ]
                                      spids: [923 938]
                                    )
                                  ]
                                )
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:i)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (word_part.ArithSub
                                            anode: 
                                              (arith_expr.Binary
                                                op_id: Id.Arith_Plus
                                                left: <Id.Lit_ArithVarLike i>
                                                right: {<Id.Lit_Digits 1>}
                                              )
                                          )
                                        }
                                      spids: [953]
                                    )
                                  ]
                                )
                              ]
                            )
                        )
                        (command.Simple
                          words: [
                            {<echo>}
                            {
                              (DQ (${ Id.VSub_Name CATEGORY) <'|'> (${ Id.VSub_Name PACKAGE) <'|'> 
                                (${ Id.VSub_Name DESC)
                              )
                            }
                          ]
                          redirects: [
                            (redir
                              op: <Id.Redir_DGreat '>>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {(DQ (${ Id.VSub_Name INDEX_FILE) <.parsed>)}
                            )
                          ]
                          do_fork: T
                        )
                        (command.Simple
                          words: [
                            {<echo>}
                            {
                              (DQ (${ Id.VSub_Name PACKAGE) <'|'> (${ Id.VSub_Name PKGNAME) <'|'> 
                                (${ Id.VSub_Name DEPS)
                              )
                            }
                          ]
                          redirects: [
                            (redir
                              op: <Id.Redir_DGreat '>>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {(DQ (${ Id.VSub_Name INDEX_FILE) <.deps>)}
                            )
                          ]
                          do_fork: T
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:IFS)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name SAVE_IFS))}
                              spids: [1019]
                            )
                          ]
                        )
                      ]
                    )
                )
                (command.Simple
                  words: [{<exec>}]
                  redirects: [(redir op:<Id.Redir_LessAnd '0<&'> loc:(redir_loc.Fd fd:0) arg:{<3>})]
                  do_fork: T
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: show_package_file
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PKGFILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1047]
                    )
                  ]
                )
                (C {<echo>} {(DQ <'Available Packages:'>)})
                (command.Simple
                  words: [{<exec>}]
                  redirects: [(redir op:<Id.Redir_LessAnd '3<&'> loc:(redir_loc.Fd fd:3) arg:{<0>})]
                  do_fork: T
                )
                (command.Simple
                  words: [{<exec>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Less '0<'>
                      loc: (redir_loc.Fd fd:0)
                      arg: {(DQ (${ Id.VSub_Name PKGFILE))}
                    )
                  ]
                  do_fork: T
                )
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: (condition.Shell commands:[(C {<read>} {<-r>} {<line>})])
                  body: 
                    (command.DoGroup
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:CATEGORY)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Pipeline
                                        children: [
                                          (C {<echo>} {(DQ (${ Id.VSub_Name line))})
                                          (C {<cut>} {<-f1>} {<-d> (SQ <'|'>)})
                                        ]
                                        negated: F
                                      )
                                  )
                                }
                              spids: [1093]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:PACKAGE)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Pipeline
                                        children: [
                                          (C {<echo>} {(DQ (${ Id.VSub_Name line))})
                                          (C {<cut>} {<-f2>} {<-d> (SQ <'|'>)})
                                        ]
                                        negated: F
                                      )
                                  )
                                }
                              spids: [1118]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:DESC)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Pipeline
                                        children: [
                                          (C {<echo>} {(DQ (${ Id.VSub_Name line))})
                                          (C {<cut>} {<-f3>} {<-d> (SQ <'|'>)})
                                        ]
                                        negated: F
                                      )
                                  )
                                }
                              spids: [1143]
                            )
                          ]
                        )
                        (C {<echo>} 
                          {
                            (DQ (${ Id.VSub_Name CATEGORY) <'/'> (${ Id.VSub_Name PACKAGE) <':'> 
                              (${ Id.VSub_Name DESC)
                            )
                          }
                        )
                      ]
                    )
                )
                (command.Simple
                  words: [{<exec>}]
                  redirects: [(redir op:<Id.Redir_LessAnd '0<&'> loc:(redir_loc.Fd fd:0) arg:{<3>})]
                  do_fork: T
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: show_packages_by_category
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:CATEGORY)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1206]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.parsed'>)}
                      spids: [1214]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:TMPFILE)
                      op: assign_op.Equal
                      rhs: {(DQ <'/tmp/.pkg.cat'>)}
                      spids: [1223]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {<grep>}
                    {(DQ <'^'> (${ Id.VSub_Name CATEGORY) <'|'>)}
                    {(DQ (${ Id.VSub_Name INDEX_FILE))}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {(DQ (${ Id.VSub_Name TMPFILE))}
                    )
                  ]
                  do_fork: T
                )
                (C {<show_package_file>} {(DQ (${ Id.VSub_Name TMPFILE))})
                (C {<rm>} {(DQ (${ Id.VSub_Name TMPFILE))})
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: show_package_by_name
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:CATEGORY)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1283]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 2))}
                      spids: [1291]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.parsed'>)}
                      spids: [1299]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:TMPFILE)
                      op: assign_op.Equal
                      rhs: {(DQ <'/tmp/.pkg.cat.pak'>)}
                      spids: [1308]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {<grep>}
                    {(DQ <'^'> (${ Id.VSub_Name CATEGORY) <'|'> (${ Id.VSub_Name PACKAGE))}
                    {(DQ (${ Id.VSub_Name INDEX_FILE))}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {(DQ (${ Id.VSub_Name TMPFILE))}
                    )
                  ]
                  do_fork: T
                )
                (C {<show_package_file>} {(DQ (${ Id.VSub_Name TMPFILE))})
                (C {<rm>} {(DQ (${ Id.VSub_Name TMPFILE))})
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: show_packages
          body: 
            (BraceGroup
              children: [(C {<show_package_file>} {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.parsed'>)})]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_dependencies
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1391]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:LONG)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (braced_var_sub
                              token: <Id.VSub_Number 2>
                              suffix_op: 
                                (suffix_op.Unary
                                  tok: <Id.VTest_ColonHyphen ':-'>
                                  arg_word: {<0>}
                                )
                            )
                          )
                        }
                      spids: [1399]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RES)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [1409]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.deps'>)}
                      spids: [1414]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:REGEX)
                      op: assign_op.Equal
                      rhs: {(DQ <'^'> (${ Id.VSub_Name PACKAGE) <'|'>)}
                      spids: [1423]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {(${ Id.VSub_Name LONG)} {<-ne>} {<0>} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:REGEX)
                              op: assign_op.Equal
                              rhs: {(DQ <'^.*|'> (${ Id.VSub_Name PACKAGE) <'|'>)}
                              spids: [1452]
                            )
                          ]
                        )
                      ]
                      spids: [1434 1449]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:LINE)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Simple
                                words: [
                                  {<grep>}
                                  {(DQ (${ Id.VSub_Name REGEX))}
                                  {(DQ (${ Id.VSub_Name INDEX_FILE))}
                                ]
                                redirects: [
                                  (redir
                                    op: <Id.Redir_Great '2>'>
                                    loc: (redir_loc.Fd fd:2)
                                    arg: {<'/dev/null'>}
                                  )
                                ]
                                do_fork: T
                              )
                          )
                        }
                      spids: [1466]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:DEPS)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {(DQ (${ Id.VSub_Name LINE))})
                                  (C {<cut>} {<-f3>} {<-d> (SQ <'|'>)})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [1489]
                    )
                  ]
                )
                (C {<export>} {<Id.Lit_VarLike 'VAL='> (DQ (${ Id.VSub_Name DEPS))})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ (${ Id.VSub_Name VAL))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:RES)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1542]
                            )
                          ]
                        )
                      ]
                      spids: [1524 1539]
                    )
                  ]
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {(${ Id.VSub_Name RES)}
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_name
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1567]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RES)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [1575]
                    )
                  ]
                )
                (C {<local>} {<PKGPTH>})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.Sentence
                              child: 
                                (C {<Id.Lit_LBracket '['>} {(DQ (${ Id.VSub_Name INSTALLMEDIUM))} 
                                  {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <ftp>)} {<Id.Lit_RBracket ']'>}
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      action: [
                        (command.Case
                          to_match: {(DQ (${ Id.VSub_Name INSTALLMEDIUM))}
                          arms: [
                            (case_arm
                              pat_list: [{<usb>} {<dvd>}]
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:PKGPTH)
                                      op: assign_op.Equal
                                      rhs: {(DQ (${ Id.VSub_Name CDMNT) <'/packages'>)}
                                      spids: [1629]
                                    )
                                  ]
                                )
                              ]
                              spids: [1624 1627 1637 -1]
                            )
                            (case_arm
                              pat_list: [{<Id.Lit_Star '*'>}]
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:PKGPTH)
                                      op: assign_op.Equal
                                      rhs: {(DQ (${ Id.VSub_Name LOCALPATH) <'/packages'>)}
                                      spids: [1644]
                                    )
                                  ]
                                )
                              ]
                              spids: [1641 1642 1652 -1]
                            )
                          ]
                        )
                        (command.If
                          arms: [
                            (if_arm
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: 
                                        (C {<Id.Lit_LBracket '['>} {<-e>} 
                                          {
                                            (DQ (${ Id.VSub_Name PKGPTH) <'/Latest/'> 
                                              (${ Id.VSub_Name PACKAGE) <.> (${ Id.VSub_Name PKGEXT)
                                            )
                                          } {<Id.Lit_RBracket ']'>}
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              action: [
                                (command.ShAssignment
                                  pairs: [
                                    (assign_pair
                                      lhs: (sh_lhs_expr.Name name:NAME)
                                      op: assign_op.Equal
                                      rhs: 
                                        {
                                          (command_sub
                                            left_token: <Id.Left_Backtick '`'>
                                            child: 
                                              (command.Pipeline
                                                children: [
                                                  (command.Simple
                                                    words: [
                                                      {<ls>}
                                                      {<-al>}
                                                      {(${ Id.VSub_Name PKGPTH) <'/Latest/'> 
                                                        (${ Id.VSub_Name PACKAGE) <.> (${ Id.VSub_Name PKGEXT)
                                                      }
                                                    ]
                                                    redirects: [
                                                      (redir
                                                        op: <Id.Redir_Great '2>'>
                                                        loc: (redir_loc.Fd fd:2)
                                                        arg: {<'/dev/null'>}
                                                      )
                                                    ]
                                                    do_fork: T
                                                  )
                                                  (C {<cut>} {<-d>} {(SQ <'>'>)} {<-f>} {<2>})
                                                  (C {<rev>})
                                                  (C {<cut>} {<-f1>} {<-d> (SQ <'/'>)})
                                                  (C {<rev>})
                                                  (C {<tr>} {<-s>} {(SQ <' '>)})
                                                ]
                                                negated: F
                                              )
                                          )
                                        }
                                      spids: [1691]
                                    )
                                  ]
                                )
                              ]
                              spids: [1664 1688]
                            )
                          ]
                          else_action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:NAME)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (command_sub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: 
                                          (command.Pipeline
                                            children: [
                                              (command.Simple
                                                words: [
                                                  {<ls>}
                                                  {<-al>}
                                                  {(${ Id.VSub_Name PKGPTH) <'/All/'> 
                                                    (${ Id.VSub_Name PACKAGE) <.> (${ Id.VSub_Name PKGEXT)
                                                  }
                                                ]
                                                redirects: [
                                                  (redir
                                                    op: <Id.Redir_Great '2>'>
                                                    loc: (redir_loc.Fd fd:2)
                                                    arg: {<'/dev/null'>}
                                                  )
                                                ]
                                                do_fork: T
                                              )
                                              (C {<cut>} {<-d>} {(SQ <'>'>)} {<-f>} {<2>})
                                              (C {<rev>})
                                              (C {<cut>} {<-f1>} {<-d> (SQ <'/'>)})
                                              (C {<rev>})
                                              (C {<tr>} {<-s>} {(SQ <' '>)})
                                            ]
                                            negated: F
                                          )
                                      )
                                    }
                                  spids: [1762]
                                )
                              ]
                            )
                          ]
                        )
                        (C {<export>} {<Id.Lit_VarLike 'VAL='> (DQ (${ Id.VSub_Name NAME))})
                      ]
                      spids: [1589 1610]
                    )
                  ]
                  else_action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.deps'>)}
                          spids: [1854]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:REGEX)
                          op: assign_op.Equal
                          rhs: {(DQ <'^'> (${ Id.VSub_Name PACKAGE) <'|'>)}
                          spids: [1863]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:LINE)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (command.Simple
                                    words: [
                                      {<grep>}
                                      {(DQ (${ Id.VSub_Name REGEX))}
                                      {(DQ (${ Id.VSub_Name INDEX_FILE))}
                                    ]
                                    redirects: [
                                      (redir
                                        op: <Id.Redir_Great '2>'>
                                        loc: (redir_loc.Fd fd:2)
                                        arg: {<'/dev/null'>}
                                      )
                                    ]
                                    do_fork: T
                                  )
                              )
                            }
                          spids: [1875]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:NAME)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (C {<echo>} {(DQ (${ Id.VSub_Name LINE))})
                                      (C {<cut>} {<-f2>} {<-d> (SQ <'|'>)})
                                    ]
                                    negated: F
                                  )
                              )
                            }
                          spids: [1898]
                        )
                      ]
                    )
                    (C {<export>} {<Id.Lit_VarLike 'VAL='> (DQ (${ Id.VSub_Name NAME))})
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ (${ Id.VSub_Name VAL))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:RES)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1954]
                            )
                          ]
                        )
                      ]
                      spids: [1936 1951]
                    )
                  ]
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {(${ Id.VSub_Name RES)}
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_short_name
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [1978]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RES)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [1986]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.deps'>)}
                      spids: [1991]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:REGEX)
                      op: assign_op.Equal
                      rhs: {(DQ <'^.*|'> (${ Id.VSub_Name PACKAGE) <'|'>)}
                      spids: [2000]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:LINE)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Simple
                                words: [
                                  {<grep>}
                                  {(DQ (${ Id.VSub_Name REGEX))}
                                  {(DQ (${ Id.VSub_Name INDEX_FILE))}
                                ]
                                redirects: [
                                  (redir
                                    op: <Id.Redir_Great '2>'>
                                    loc: (redir_loc.Fd fd:2)
                                    arg: {<'/dev/null'>}
                                  )
                                ]
                                do_fork: T
                              )
                          )
                        }
                      spids: [2012]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:NAME)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {(DQ (${ Id.VSub_Name LINE))})
                                  (C {<cut>} {<-f1>} {<-d> (SQ <'|'>)})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [2035]
                    )
                  ]
                )
                (C {<export>} {<Id.Lit_VarLike 'VAL='> (DQ (${ Id.VSub_Name NAME))})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ (${ Id.VSub_Name VAL))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:RES)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [2088]
                            )
                          ]
                        )
                      ]
                      spids: [2070 2085]
                    )
                  ]
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {(${ Id.VSub_Name RES)}
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: get_package_category
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [2113]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:INDEX_FILE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PKGDIR) <'/INDEX.parsed'>)}
                      spids: [2121]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:RES)
                      op: assign_op.Equal
                      rhs: {<0>}
                      spids: [2130]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:LINE)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Simple
                                words: [
                                  {<grep>}
                                  {(DQ <'|'> (${ Id.VSub_Name PACKAGE) <'|'>)}
                                  {(DQ (${ Id.VSub_Name INDEX_FILE))}
                                ]
                                redirects: [
                                  (redir
                                    op: <Id.Redir_Great '2>'>
                                    loc: (redir_loc.Fd fd:2)
                                    arg: {<'/dev/null'>}
                                  )
                                ]
                                do_fork: T
                              )
                          )
                        }
                      spids: [2135]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:NAME)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_Backtick '`'>
                            child: 
                              (command.Pipeline
                                children: [
                                  (C {<echo>} {(DQ (${ Id.VSub_Name LINE))})
                                  (C {<cut>} {<-f1>} {<-d> (SQ <'|'>)})
                                ]
                                negated: F
                              )
                          )
                        }
                      spids: [2160]
                    )
                  ]
                )
                (C {<export>} {<Id.Lit_VarLike 'VAL='> (DQ (${ Id.VSub_Name NAME))})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ (${ Id.VSub_Name VAL))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:RES)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [2213]
                            )
                          ]
                        )
                      ]
                      spids: [2195 2210]
                    )
                  ]
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {(${ Id.VSub_Name RES)}
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: fetch_package_by_ftp
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:CATEGORY)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [2238]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 2))}
                      spids: [2246]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:SAVEDIR)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 3))}
                      spids: [2254]
                    )
                  ]
                )
                (C {<get_value_from_cfg>} {<ftpHost>})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$VAL'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (C {<exit_err>} 
                          {
                            (DQ 
                              <'ERROR: Install medium was set to ftp, but no ftpHost was provided!'>
                            )
                          }
                        )
                      ]
                      spids: [2268 2281]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:FTPHOST)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name VAL))}
                      spids: [2295]
                    )
                  ]
                )
                (C {<get_value_from_cfg>} {<ftpDir>})
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$VAL'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (C {<exit_err>} 
                          {(DQ <'ERROR: Install medium was set to ftp, but no ftpDir was provided!'>)}
                        )
                      ]
                      spids: [2309 2322]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:FTPDIR)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name VAL))}
                      spids: [2336]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name PACKAGE) <.> (${ Id.VSub_Name PKGEXT))}
                      spids: [2345]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:FTP_SERVER)
                      op: assign_op.Equal
                      rhs: {(DQ <'ftp://'> (${ Id.VSub_Name FTPHOST) (${ Id.VSub_Name FTPDIR))}
                      spids: [2357]
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: 
                        (condition.Shell
                          commands: [
                            (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-f>} 
                              {(DQ (${ Id.VSub_Name SAVEDIR) <'/'> (${ Id.VSub_Name PACKAGE))} {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:PKGPATH)
                              op: assign_op.Equal
                              rhs: {(DQ (${ Id.VSub_Name CATEGORY) <'/'> (${ Id.VSub_Name PACKAGE))}
                              spids: [2394]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FTP_PATH)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ (${ Id.VSub_Name FTP_HOST) <'/packages/'> 
                                    (${ Id.VSub_Name PKGPATH)
                                  )
                                }
                              spids: [2406]
                            )
                          ]
                        )
                        (C {<fetch_file>} {(DQ (${ Id.VSub_Name FTP_PATH))} 
                          {(DQ (${ Id.VSub_Name SAVEDIR) <'/'>)} {(DQ <0>)}
                        )
                      ]
                      spids: [2370 2391]
                    )
                  ]
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.Sentence
      child: 
        (command.ShFunction
          name: fetch_package
          body: 
            (BraceGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:CATEGORY)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 1))}
                      spids: [2451]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:PACKAGE)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 2))}
                      spids: [2459]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:SAVEDIR)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Number 3))}
                      spids: [2467]
                    )
                  ]
                )
                (command.Case
                  to_match: {(DQ (${ Id.VSub_Name INSTALLMEDIUM))}
                  arms: [
                    (case_arm
                      pat_list: [{<usb>} {<dvd>} {<local>}]
                      action: [(command.ControlFlow token:<Id.ControlFlow_Return return>)]
                      spids: [2491 2496 2500 -1]
                    )
                    (case_arm
                      pat_list: [{<ftp>}]
                      action: [
                        (C {<fetch_package_by_ftp>} {(DQ (${ Id.VSub_Name CATEGORY))} 
                          {(DQ (${ Id.VSub_Name PACKAGE))} {(DQ (${ Id.VSub_Name SAVEDIR))}
                        )
                      ]
                      spids: [2503 2504 2526 -1]
                    )
                    (case_arm pat_list:[{<sftp>}] spids:[2529 2530 2532 -1])
                  ]
                )
              ]
            )
        )
      terminator: <Id.Op_Semi _>
    )
    (command.ShFunction
      name: bootstrap_pkgng
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Simple
                          words: [{<run_chroot_cmd>} {(DQ <'which pkg-static'>)}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (redir
                              op: <Id.Redir_Great '2>'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<'/dev/null'>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                    )
                  action: [(command.ControlFlow token:<Id.ControlFlow_Return return>)]
                  spids: [2552 2567]
                )
              ]
            )
            (C {<local>} {<PKGPTH>})
            (C {<echo_log>} {(DQ <'Bootstraping pkgng..'>)})
            (C {<fetch_package>} {(DQ <Latest>)} {(DQ <pkg>)} {(DQ (${ Id.VSub_Name PKGDLDIR))})
            (command.Case
              to_match: {(DQ (${ Id.VSub_Name INSTALLMEDIUM))}
              arms: [
                (case_arm
                  pat_list: [{<usb>} {<dvd>} {<local>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:PKGPTH)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ (${ Id.VSub_Name PKGTMPDIR) <'/Latest/pkg.'> (${ Id.VSub_Name PKGEXT))
                            }
                          spids: [2633]
                        )
                      ]
                    )
                  ]
                  spids: [2626 2631 2644 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:PKGPTH)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name PKGTMPDIR) <'/pkg.'> (${ Id.VSub_Name PKGEXT))}
                          spids: [2650]
                        )
                      ]
                    )
                  ]
                  spids: [2647 2648 2661 -1]
                )
              ]
            )
            (command.Sentence
              child: 
                (C {<rc_halt>} 
                  {(DQ <'pkg -c '> (${ Id.VSub_Name FSMNT) <' add '> (${ Id.VSub_Name PKGPTH))}
                )
              terminator: <Id.Op_Semi _>
            )
            (C {<run_chroot_cmd>} {(DQ <pkg2ng>)})
          ]
        )
    )
    (command.ShFunction
      name: get_package_location
      body: 
        (BraceGroup
          children: [
            (command.Case
              to_match: {(DQ (${ Id.VSub_Name INSTALLMEDIUM))}
              arms: [
                (case_arm
                  pat_list: [{<usb>} {<dvd>}]
                  action: [
                    (C {<rc_halt>} 
                      {
                        (DQ <'mount_nullfs '> (${ Id.VSub_Name CDMNT) <'/packages '> 
                          (${ Id.VSub_Name FSMNT) (${ Id.VSub_Name PKGTMPDIR)
                        )
                      }
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:PKGDLDIR)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name FSMNT) (${ Id.VSub_Name PKGTMPDIR) <'/All'>)}
                          spids: [2731]
                        )
                      ]
                    )
                  ]
                  spids: [2709 2712 2742 -1]
                )
                (case_arm
                  pat_list: [{<local>}]
                  action: [
                    (C {<rc_halt>} 
                      {
                        (DQ <'mount_nullfs '> (${ Id.VSub_Name LOCALPATH) <'/packages '> 
                          (${ Id.VSub_Name FSMNT) (${ Id.VSub_Name PKGTMPDIR)
                        )
                      }
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:PKGDLDIR)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name FSMNT) (${ Id.VSub_Name PKGTMPDIR) <'/All'>)}
                          spids: [2765]
                        )
                      ]
                    )
                  ]
                  spids: [2745 2746 2776 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:PKGDLDIR)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name FSMNT) (${ Id.VSub_Name PKGTMPDIR))}
                          spids: [2782]
                        )
                      ]
                    )
                  ]
                  spids: [2779 2780 2792 -1]
                )
              ]
            )
            (C {<export>} {<PKGDLDIR>})
          ]
        )
    )
  ]
)