(command.CommandList
  children: [
    (command.ShAssignment
      left: <Id.Lit_VarLike 'include_dir='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'include_dir='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'include_dir='> name:include_dir)
          op: assign_op.Equal
          rhs: {<'../../include/openssl'>}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'out='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'out='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'out='> name:out)
          op: assign_op.Equal
          rhs: {(${ Id.VSub_Name include_dir) <'/lhash_macros.h'>}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      words: [{<cat>}]
      redirects: [
        (Redir
          op: <Id.Redir_Great '>'>
          loc: (redir_loc.Fd fd:1)
          arg: {($ Id.VSub_DollarName out)}
        )
        (Redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'/* Copyright (c) 2014, Google Inc.\n'>
                <' *\n'>
                <' * Permission to use, copy, modify, and/or distribute this software for any\n'>
                <' * purpose with or without fee is hereby granted, provided that the above\n'>
                <' * copyright notice and this permission notice appear in all copies.\n'>
                <' *\n'>
                <' * THE SOFTWARE IS PROVIDED '>
                <Id.Right_DoubleQuote '"'>
                <'AS IS'>
                <Id.Right_DoubleQuote '"'>
                <' AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n'>
                <' * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n'>
                <' * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n'>
                <' * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n'>
                <
' * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n'
                >
                <' * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n'>
                <' * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */\n'>
                <'\n'>
                <'#if !defined(IN_LHASH_H)\n'>
                <'#error '>
                <Id.Right_DoubleQuote '"'>
                <'Don\'t include this file directly. Include lhash.h'>
                <Id.Right_DoubleQuote '"'>
                <'\n'>
                <'#endif\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.ShFunction
      name_tok: <output_lhash>
      name: output_lhash
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'type='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'type='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'type='> name:type)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <cat>
              more_env: []
              words: [{<cat>}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {($ Id.VSub_DollarName out)}
                )
                (Redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<EOF>}
                      here_end_tok: <Id.Undefined_Tok ''>
                      stdin_parts: [
                        <'/* '>
                        (${ Id.VSub_Name type)
                        <' */\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_new(hash, comp)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'((LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*) lh_new(CHECKED_CAST(lhash_hash_func, uint32_t (*) (const '>
                        (${ Id.VSub_Name type)
                        <' *), hash), CHECKED_CAST(lhash_cmp_func, int (*) (const '>
                        (${ Id.VSub_Name type)
                        <' *a, const '>
                        (${ Id.VSub_Name type)
                        <' *b), comp)))\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_free(lh)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  lh_free(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh));\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_num_items(lh)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  lh_num_items(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh))\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_retrieve(lh, data)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  (('>
                        (${ Id.VSub_Name type)
                        <'*) lh_retrieve(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh), CHECKED_CAST(void*, '>
                        (${ Id.VSub_Name type)
                        <'*, data)))\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_insert(lh, old_data, data)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  lh_insert(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh), CHECKED_CAST(void**, '>
                        (${ Id.VSub_Name type)
                        <'**, old_data), CHECKED_CAST(void*, '>
                        (${ Id.VSub_Name type)
                        <'*, data))\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_delete(lh, data)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  (('>
                        (${ Id.VSub_Name type)
                        <'*) lh_delete(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh), CHECKED_CAST(void*, '>
                        (${ Id.VSub_Name type)
                        <'*, data)))\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_doall(lh, func)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  lh_doall(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh), CHECKED_CAST(void (*)(void*), void (*) ('>
                        (${ Id.VSub_Name type)
                        <'*), func));\n'>
                        <'\n'>
                        <'#define lh_'>
                        (${ Id.VSub_Name type)
                        <'_doall_arg(lh, func, arg)'>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\\\'>
                          ch: '\\'
                        )
                        <'\n'>
                        <'  lh_doall_arg(CHECKED_CAST(_LHASH*, LHASH_OF('>
                        (${ Id.VSub_Name type)
                        <')*, lh), CHECKED_CAST(void (*)(void*, void*), void (*) ('>
                        (${ Id.VSub_Name type)
                        <'*, void*), func), arg);\n'>
                        <'\n'>
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'lhash_types='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'lhash_types='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'lhash_types='> name:lhash_types)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Pipeline
                    children: [
                      (command.Simple
                        blame_tok: <cat>
                        more_env: []
                        words: [{<cat>} {(${ Id.VSub_Name include_dir) <'/lhash.h'>}]
                        redirects: []
                        do_fork: T
                      )
                      (command.Simple
                        blame_tok: <grep>
                        more_env: []
                        words: [{<grep>} {(SQ <'^ \\* LHASH_OF:'>)}]
                        redirects: []
                        do_fork: T
                      )
                      (command.Simple
                        blame_tok: <sed>
                        more_env: []
                        words: [{<sed>} {<-e>} {(SQ <'s/.*LHASH_OF://'>)} {<-e>} {(SQ <'s/ .*//'>)}]
                        redirects: []
                        do_fork: T
                      )
                    ]
                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [type]
      iterable: (for_iter.Words words:[{($ Id.VSub_DollarName lhash_types)}])
      semi_tok: <Id.Op_Semi _>
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {<Hash>} {<of>} {(${ Id.VSub_Name type)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <output_lhash>
              more_env: []
              words: [{<output_lhash>} {(DQ (${ Id.VSub_Name type))}]
              redirects: []
              do_fork: T
            )
          ]
          right: <Id.KW_Done done>
        )
      redirects: []
    )
    (command.Simple
      blame_tok: <clang-format>
      more_env: []
      words: [{<clang-format>} {<-i>} {($ Id.VSub_DollarName out)}]
      redirects: []
      do_fork: T
    )
  ]
)