(CommandList
  children: [
    (FuncDef
      name: warn
      body: 
        (BraceGroup
          children: [
            (Sentence
              child: 
                (SimpleCommand
                  words: [{(echo)} {(DQ ('WARNING: ') ($ VSub_At '$@'))}]
                  redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[38])]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [29]
        )
      spids: [25 28]
    )
    (AndOr
      children: [
        (C {(Lit_Other '[')} {(-r)} {(bashttpd.conf)} {(Lit_Other ']')})
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(cat)}]
              redirects: [
                (Redir op_id:Redir_Great fd:-1 arg_word:{(bashttpd.conf)} spids:[60])
                (HereDoc
                  op_id: Redir_DLess
                  fd: -1
                  body: 
                    {('#\n') ('# bashttpd.conf - configuration for bashttpd\n') ('#\n') 
                      ('# The behavior of bashttpd is dictated by the evaluation\n') ('# of rules specified in this configuration file.  Each rule\n') 
                      ('# is evaluated until one is matched.  If no rule is matched,\n') ('# bashttpd will serve a 500 Internal Server Error.\n') ('#\n') ('# The format of the rules are:\n') 
                      ('#    on_uri_match REGEX command [args]\n') ('#    unconditionally command [args]\n') ('#\n') ('# on_uri_match:\n') 
                      ('#   On an incoming request, the URI is checked against the specified\n') ('#   (bash-supported extended) regular expression, and if encounters a match the\n') 
                      ('#   specified command is executed with the specified arguments.\n') ('#\n') ('#   For additional flexibility, on_uri_match will also pass the results of the\n') 
                      (
'#   regular expression match, ${BASH_REMATCH[@]} as additional arguments to the\n'
                      ) ('#   command.\n') ('#\n') ('# unconditionally:\n') 
                      ('#   Always serve via the specified command.  Useful for catchall rules.\n') ('#\n') ('# The following commands are available for use:\n') ('#\n') ('#   serve_file FILE\n') 
                      ('#     Statically serves a single file.\n') ('#\n') ('#   serve_dir_with_tree DIRECTORY\n') 
                      (
"#     Statically serves the specified directory using 'tree'.  It must be\n"
                      ) ('#     installed and in the PATH.\n') ('#\n') ('#   serve_dir_with_ls DIRECTORY\n') 
                      ("#     Statically serves the specified directory using 'ls -al'.\n") ('#\n') ('#   serve_dir  DIRECTORY\n') 
                      (
"#     Statically serves a single directory listing.  Will use 'tree' if it is\n"
                      ) ("#     installed and in the PATH, otherwise, 'ls -al'\n") ('#\n') 
                      ('#   serve_dir_or_file_from DIRECTORY\n') ('#     Serves either a directory listing (using serve_dir) or a file (using\n') 
                      (
'#     serve_file).  Constructs local path by appending the specified root\n'
                      ) ('#     directory, and the URI portion of the client request.\n') ('#\n') 
                      ('#   serve_static_string STRING\n') ('#     Serves the specified static string with Content-Type text/plain.\n') ('#\n') 
                      ('# Examples of rules:\n') ('#\n') ('# on_uri_match \'^/issue$\' serve_file "/etc/issue"\n') ('#\n') 
                      (
"#   When a client's requested URI matches the string '/issue', serve them the\n"
                      ) ('#   contents of /etc/issue\n') ('#\n') ("# on_uri_match 'root' serve_dir /\n") ('#\n') 
                      ("#   When a client's requested URI has the word 'root' in it, serve up\n") ('#   a directory listing of /\n') ('#\n') ('# DOCROOT=/var/www/html\n') 
                      ('# on_uri_match \'/(.*)\' serve_dir_or_file_from "$DOCROOT"\n') ('#   When any URI request is made, attempt to serve a directory listing\n') 
                      ("#   or file content based on the request URI, by mapping URI's to local\n") ('#   paths relative to the specified "$DOCROOT"\n') ('#\n') ('\n') 
                      (
"unconditionally serve_static_string 'Hello, world!  You can configure bashttpd by modifying bashttpd.conf.'\n"
                      ) ('\n') ('# More about commands:\n') ('#\n') 
                      (
'# It is possible to somewhat easily write your own commands.  An example\n'
                      ) ('# may help.  The following example will serve "Hello, $x!" whenever\n') 
                      ('# a client sends a request with the URI /say_hello_to/$x:\n') ('#\n') ('# serve_hello() {\n') ('#    add_response_header "Content-Type" "text/plain"\n') 
                      ('#    send_response_ok_exit <<< "Hello, $2!"\n') ('# }\n') ("# on_uri_match '^/say_hello_to/(.*)$' serve_hello\n") ('#\n') 
                      ('# Like mentioned before, the contents of ${BASH_REMATCH[@]} are passed\n') ('# to your command, so its possible to use regular expression groups\n') ('# to pull out info.\n') 
                      ('#\n') ('# With this example, when the requested URI is /say_hello_to/Josh, serve_hello\n') 
                      ("# is invoked with the arguments '/say_hello_to/Josh' 'Josh',\n") ('# (${BASH_REMATCH[0]} is always the full match)\n')
                    }
                  do_expansion: False
                  here_end: EOF
                  was_filled: True
                  spids: [63]
                )
              ]
            )
            (C {(warn)} 
              {
                (DQ 
                  (
'Created bashttpd.conf using defaults.  Please review it/configure before running bashttpd again.'
                  )
                )
              }
            )
            (C {(exit)} {(1)})
          ]
          spids: [55]
        )
      ]
      op_id: Op_DPipe
    )
    (FuncDef
      name: recv
      body: 
        (BraceGroup
          children: [
            (Sentence
              child: 
                (SimpleCommand
                  words: [{(echo)} {(DQ ('< ') ($ VSub_At '$@'))}]
                  redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[96])]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [87]
        )
      spids: [83 86]
    )
    (FuncDef
      name: send
      body: 
        (BraceGroup
          children: [
            (Sentence
              child: 
                (SimpleCommand
                  words: [{(echo)} {(DQ ('> ') ($ VSub_At '$@'))}]
                  redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[115])]
                )
              terminator: <Op_Semi ';'>
            )
            (Sentence
              child: (C {(printf)} {(SQ <'%s\\r\\n'>)} {(DQ ($ VSub_Star '$*'))})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [106]
        )
      spids: [102 105]
    )
    (AndOr
      children: [
        (DBracket
          expr: (BoolBinary op_id:BoolBinary_GlobEqual left:{($ VSub_Name '$UID')} right:{(0)})
        )
        (C {(warn)} {(DQ ('It is not recommended to run bashttpd as root.'))})
      ]
      op_id: Op_DAmp
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:DATE)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [(C {(date)} {(Lit_Other '+') (DQ ('%a, %d %b %Y %H:%M:%S %Z'))})]
                  )
                left_token: <Left_CommandSub '$('>
                spids: [154 161]
              )
            }
          spids: [153]
        )
      ]
      spids: [153]
    )
    (Assignment
      keyword: Assign_Declare
      flags: ["'-a'"]
      pairs: [
        (assign_pair
          lhs: (LhsName name:RESPONSE_HEADERS)
          op: Equal
          rhs: 
            {
              (ArrayLiteralPart
                words: [
                  {(DQ ('Date: ') ($ VSub_Name '$DATE'))}
                  {(DQ ('Expires: ') ($ VSub_Name '$DATE'))}
                  {(DQ ('Server: Slash Bin Slash Bash'))}
                ]
              )
            }
          spids: [167]
        )
      ]
      spids: [163]
    )
    (FuncDef
      name: add_response_header
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:RESPONSE_HEADERS)
                  op: PlusEqual
                  rhs: 
                    {
                      (ArrayLiteralPart
                        words: [{(DQ ($ VSub_Number '$1') (': ') ($ VSub_Number '$2'))}]
                      )
                    }
                  spids: [197]
                )
              ]
              spids: [197]
            )
          ]
          spids: [194]
        )
      spids: [190 193]
    )
    (Assignment
      keyword: Assign_Declare
      flags: ["'-a'"]
      pairs: [
        (assign_pair
          lhs: (LhsName name:HTTP_RESPONSE)
          op: Equal
          rhs: 
            {
              (ArrayLiteralPart
                words: [
                  {(Lit_Other '[') (200) (Lit_Other ']') (Lit_Other '=') (DQ (OK))}
                  {(Lit_Other '[') (400) (Lit_Other ']') (Lit_Other '=') (DQ ('Bad Request'))}
                  {(Lit_Other '[') (403) (Lit_Other ']') (Lit_Other '=') (DQ (Forbidden))}
                  {(Lit_Other '[') (404) (Lit_Other ']') (Lit_Other '=') (DQ ('Not Found'))}
                  {(Lit_Other '[') (405) (Lit_Other ']') (Lit_Other '=') (DQ ('Method Not Allowed'))}
                  {(Lit_Other '[') (500) (Lit_Other ']') (Lit_Other '=') (DQ ('Internal Server Error'))}
                ]
              )
            }
          spids: [213]
        )
      ]
      spids: [209]
    )
    (FuncDef
      name: send_response
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:code)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [282]
                )
              ]
              spids: [280]
            )
            (C {(send)} 
              {
                (DQ ('HTTP/1.0 ') ($ VSub_Number '$1') (' ') 
                  (BracedVarSub
                    token: <VSub_Name HTTP_RESPONSE>
                    bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Number '$1')}))
                    spids: [292 297]
                  )
                )
              }
            )
            (ForEach
              iter_name: i
              iter_words: [
                {
                  (DQ 
                    (BracedVarSub
                      token: <VSub_Name RESPONSE_HEADERS>
                      bracket_op: (WholeArray op_id:Lit_At)
                      spids: [308 313]
                    )
                  )
                }
              ]
              do_arg_iter: False
              body: (DoGroup children:[(C {(send)} {(DQ ($ VSub_Name '$i'))})] spids:[317327])
              spids: [306 315]
            )
            (C {(send)})
            (While
              cond: [(Sentence child:(C {(read)} {(-r)} {(line)}) terminator:<Op_Semi ';'>)]
              body: (DoGroup children:[(C {(send)} {(DQ ($ VSub_Name '$line'))})] spids:[342352])
            )
          ]
          spids: [277]
        )
      spids: [273 276]
    )
    (FuncDef
      name: send_response_ok_exit
      body: 
        (BraceGroup
          children: [
            (Sentence child:(C {(send_response)} {(200)}) terminator:<Op_Semi ';'>)
            (Sentence child:(C {(exit)} {(0)}) terminator:<Op_Semi ';'>)
          ]
          spids: [361]
        )
      spids: [357 360]
    )
    (FuncDef
      name: fail_with
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(send_response)} {(DQ ($ VSub_Number '$1'))}]
              redirects: [
                (Redir
                  op_id: Redir_TLess
                  fd: -1
                  arg_word: 
                    {
                      (DQ ($ VSub_Number '$1') (' ') 
                        (BracedVarSub
                          token: <VSub_Name HTTP_RESPONSE>
                          bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Number '$1')}))
                          spids: [394 399]
                        )
                      )
                    }
                  spids: [389]
                )
              ]
            )
            (C {(exit)} {(1)})
          ]
          spids: [380]
        )
      spids: [376 379]
    )
    (FuncDef
      name: serve_file
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:file)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [419]
                )
              ]
              spids: [417]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:CONTENT_TYPE) op:Equal rhs:{(SQ )} spids:[424])]
              spids: [424]
            )
            (Case
              to_match: {(DQ ($ VSub_Name '$file'))}
              arms: [
                (case_arm
                  pat_list: [
                    {(Lit_Other '*') (EscapedLiteralPart token:<Lit_EscapedChar '\\.'>) (css)}
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:CONTENT_TYPE)
                          op: Equal
                          rhs: {(DQ (text/css))}
                          spids: [442]
                        )
                      ]
                      spids: [442]
                    )
                  ]
                  spids: [436 439 448 -1]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*') (EscapedLiteralPart token:<Lit_EscapedChar '\\.'>) (js)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:CONTENT_TYPE)
                          op: Equal
                          rhs: {(DQ (text/javascript))}
                          spids: [457]
                        )
                      ]
                      spids: [457]
                    )
                  ]
                  spids: [451 454 463 -1]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (SimpleCommand
                      words: [{(read)} {(-r)} {(CONTENT_TYPE)}]
                      redirects: [
                        (Redir
                          op_id: Redir_Less
                          fd: -1
                          arg_word: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(file)} {(-b)} {(--mime-type)} {(DQ ($ VSub_Name '$file'))})
                                    ]
                                  )
                                left_token: <Left_ProcSubIn '<('>
                                spids: [478 488]
                              )
                            }
                          spids: [476]
                        )
                      ]
                    )
                  ]
                  spids: [466 467 491 -1]
                )
              ]
              spids: [427 433 494]
            )
            (Sentence
              child: 
                (C {(add_response_header)} {(DQ (Content-Type))} {(DQ ($ VSub_Name '$CONTENT_TYPE'))})
              terminator: <Op_Semi ';'>
            )
            (AndOr
              children: [
                (SimpleCommand
                  words: [{(read)} {(-r)} {(CONTENT_LENGTH)}]
                  redirects: [
                    (Redir
                      op_id: Redir_Less
                      fd: -1
                      arg_word: 
                        {
                          (CommandSubPart
                            command_list: 
                              (CommandList
                                children: [(C {(stat)} {(-c) (SQ <'%s'>)} {(DQ ($ VSub_Name '$file'))})]
                              )
                            left_token: <Left_ProcSubIn '<('>
                            spids: [519 530]
                          )
                        }
                      spids: [517]
                    )
                  ]
                )
                (C {(add_response_header)} {(DQ (Content-Length))} {(DQ ($ VSub_Name '$CONTENT_LENGTH'))})
              ]
              op_id: Op_DAmp
            )
            (SimpleCommand
              words: [{(send_response_ok_exit)}]
              redirects: [
                (Redir
                  op_id: Redir_Less
                  fd: -1
                  arg_word: {(DQ ($ VSub_Name '$file'))}
                  spids: [550]
                )
              ]
            )
          ]
          spids: [414]
        )
      spids: [410 413]
    )
    (FuncDef
      name: serve_dir_with_tree
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:dir)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [568]
                )
                (assign_pair lhs:(LhsName name:tree_vers) op:Equal spids:[573])
                (assign_pair lhs:(LhsName name:tree_opts) op:Equal spids:[575])
                (assign_pair lhs:(LhsName name:basehref) op:Equal spids:[577])
                (assign_pair lhs:(LhsName name:x) op:Equal spids:[579])
              ]
              spids: [566]
            )
            (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/html))})
            (SimpleCommand
              words: [{(read)} {(x)} {(tree_vers)} {(x)}]
              redirects: [
                (Redir
                  op_id: Redir_Less
                  fd: -1
                  arg_word: 
                    {
                      (CommandSubPart
                        command_list: (CommandList children:[(C {(tree)} {(--version)})])
                        left_token: <Left_ProcSubIn '<('>
                        spids: [609 613]
                      )
                    }
                  spids: [607]
                )
              ]
            )
            (AndOr
              children: [
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {($ VSub_Name '$tree_vers')}
                      right: {(v1.6) (Lit_Other '*')}
                    )
                )
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:tree_opts)
                      op: Equal
                      rhs: {(DQ (--du))}
                      spids: [629]
                    )
                  ]
                  spids: [629]
                )
              ]
              op_id: Op_DAmp
            )
            (SimpleCommand
              words: [{(send_response_ok_exit)}]
              redirects: [
                (Redir
                  op_id: Redir_Less
                  fd: -1
                  arg_word: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (C {(tree)} {(-H)} {(DQ ($ VSub_Number '$2'))} {(-L)} {(1)} 
                                {(DQ ($ VSub_Name '$tree_opts'))} {(-D)} {(DQ ($ VSub_Name '$dir'))}
                              )
                            ]
                          )
                        left_token: <Left_ProcSubIn '<('>
                        spids: [642 664]
                      )
                    }
                  spids: [638]
                )
              ]
            )
          ]
          spids: [563]
        )
      spids: [559 562]
    )
    (FuncDef
      name: serve_dir_with_ls
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:dir)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [678]
                )
              ]
              spids: [676]
            )
            (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/plain))})
            (SimpleCommand
              words: [{(send_response_ok_exit)}]
              redirects: [
                (Redir
                  op_id: Redir_Less
                  fd: -1
                  arg_word: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [(C {(ls)} {(-la)} {(DQ ($ VSub_Name '$dir'))})]
                          )
                        left_token: <Left_ProcSubIn '<('>
                        spids: [701 709]
                      )
                    }
                  spids: [697]
                )
              ]
            )
          ]
          spids: [673]
        )
      spids: [669 672]
    )
    (FuncDef
      name: serve_dir
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:dir)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [723]
                )
              ]
              spids: [721]
            )
            (Sentence child:(C {(which)} {(tree)}) terminator:<Op_Amp '&'>)
            (AndOr
              children: [
                (SimpleCommand
                  redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[737])]
                )
                (C {(serve_dir_with_tree)} {(DQ ($ VSub_At '$@'))})
              ]
              op_id: Op_DAmp
            )
            (C {(serve_dir_with_ls)} {(DQ ($ VSub_At '$@'))})
            (C {(fail_with)} {(500)})
          ]
          spids: [718]
        )
      spids: [714 717]
    )
    (FuncDef
      name: serve_dir_or_file_from
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:URL_PATH)
                  op: Equal
                  rhs: {($ VSub_Number '$1') (/) ($ VSub_Number '$3')}
                  spids: [776]
                )
              ]
              spids: [774]
            )
            (C {(shift)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:URL_PATH)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name URL_PATH>
                        suffix_op: 
                          (PatSub
                            pat: 
                              {('[^a-zA-Z0-9_~') (EscapedLiteralPart token:<Lit_EscapedChar '\\-'>) 
                                (EscapedLiteralPart
                                  token: <Lit_EscapedChar '\\.'>
                                ) (EscapedLiteralPart token:<Lit_EscapedChar '\\/'>) (']')
                              }
                            replace: {}
                            do_all: True
                            do_prefix: False
                            do_suffix: False
                          )
                        spids: [791 801]
                      )
                    }
                  spids: [790]
                )
              ]
              spids: [790]
            )
            (AndOr
              children: [
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {($ VSub_Name '$URL_PATH')}
                      right: {(Lit_Other '*') (..) (Lit_Other '*')}
                    )
                )
                (C {(fail_with)} {(400)})
              ]
              op_id: Op_DAmp
            )
            (AndOr
              children: [
                (DBracket
                  expr: 
                    (LogicalAnd
                      left: (BoolUnary op_id:BoolUnary_d child:{($ VSub_Name '$URL_PATH')})
                      right: 
                        (LogicalAnd
                          left: 
                            (BoolUnary
                              op_id: BoolUnary_f
                              child: {($ VSub_Name '$URL_PATH') (/index.html)}
                            )
                          right: 
                            (BoolUnary
                              op_id: BoolUnary_r
                              child: {($ VSub_Name '$URL_PATH') (/index.html)}
                            )
                        )
                    )
                )
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:URL_PATH)
                      op: Equal
                      rhs: {(DQ ($ VSub_Name '$URL_PATH') (/index.html))}
                      spids: [854]
                    )
                  ]
                  spids: [854]
                )
              ]
              op_id: Op_DAmp
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_f child:{($ VSub_Name '$URL_PATH')})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (AndOr
                      children: [
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_r child:{($ VSub_Name '$URL_PATH')})
                        )
                        (AndOr
                          children: [
                            (C {(serve_file)} {(DQ ($ VSub_Name '$URL_PATH'))} {(DQ ($ VSub_At '$@'))})
                            (C {(fail_with)} {(403)})
                          ]
                          op_id: Op_DPipe
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  spids: [-1 873]
                )
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_d child:{($ VSub_Name '$URL_PATH')})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (AndOr
                      children: [
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_x child:{($ VSub_Name '$URL_PATH')})
                        )
                        (AndOr
                          children: [
                            (C {(serve_dir)} {(DQ ($ VSub_Name '$URL_PATH'))} {(DQ ($ VSub_At '$@'))})
                            (C {(fail_with)} {(403)})
                          ]
                          op_id: Op_DPipe
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  spids: [905 916]
                )
              ]
              spids: [-1 948]
            )
            (C {(fail_with)} {(404)})
          ]
          spids: [771]
        )
      spids: [767 770]
    )
    (FuncDef
      name: serve_static_string
      body: 
        (BraceGroup
          children: [
            (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/plain))})
            (SimpleCommand
              words: [{(send_response_ok_exit)}]
              redirects: [
                (Redir
                  op_id: Redir_TLess
                  fd: -1
                  arg_word: {(DQ ($ VSub_Number '$1'))}
                  spids: [979]
                )
              ]
            )
          ]
          spids: [963]
        )
      spids: [959 962]
    )
    (FuncDef
      name: on_uri_match
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:regex)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [997]
                )
              ]
              spids: [995]
            )
            (C {(shift)})
            (AndOr
              children: [
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_EqualTilde
                      left: {($ VSub_Name '$REQUEST_URI')}
                      right: {($ VSub_Name '$regex')}
                    )
                )
                (C {(DQ ($ VSub_At '$@'))} 
                  {
                    (DQ 
                      (BracedVarSub
                        token: <VSub_Name BASH_REMATCH>
                        bracket_op: (WholeArray op_id:Lit_At)
                        spids: [1024 1029]
                      )
                    )
                  }
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [992]
        )
      spids: [988 991]
    )
    (FuncDef
      name: unconditionally
      body: 
        (BraceGroup
          children: [(C {(DQ ($ VSub_At '$@'))} {(DQ ($ VSub_Name '$REQUEST_URI'))})]
          spids: [1039]
        )
      spids: [1035 1038]
    )
    (AndOr children:[(C {(read)} {(-r)} {(line)})(C {(fail_with)} {(400)})] op_id:Op_DPipe)
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:line)
          op: Equal
          rhs: 
            {
              (BracedVarSub
                token: <VSub_Name line>
                suffix_op: (StringUnary op_id:VOp1_DPercent arg_word:{(SQ <Lit_EscapedChar '\\r'>)})
                spids: [1073 1079]
              )
            }
          spids: [1072]
        )
      ]
      spids: [1072]
    )
    (C {(recv)} {(DQ ($ VSub_Name '$line'))})
    (SimpleCommand
      words: [{(read)} {(-r)} {(REQUEST_METHOD)} {(REQUEST_URI)} {(REQUEST_HTTP_VERSION)}]
      redirects: [(Redir op_id:Redir_TLess fd:-1 arg_word:{(DQ ($ VSub_Name '$line'))} spids:[1098])]
    )
    (AndOr
      children: [
        (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_METHOD'))} {(Lit_Other ']')})
        (AndOr
          children: [
            (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_URI'))} {(Lit_Other ']')})
            (AndOr
              children: [
                (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_HTTP_VERSION'))} 
                  {(Lit_Other ']')}
                )
                (C {(fail_with)} {(400)})
              ]
              op_id: Op_DPipe
            )
          ]
          op_id: Op_DAmp
        )
      ]
      op_id: Op_DAmp
    )
    (AndOr
      children: [
        (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$REQUEST_METHOD'))} {(Lit_Other '=')} {(DQ (GET))} 
          {(Lit_Other ']')}
        )
        (C {(fail_with)} {(405)})
      ]
      op_id: Op_DPipe
    )
    (Assignment
      keyword: Assign_Declare
      flags: ["'-a'"]
      pairs: [(assign_pair lhs:(LhsName name:REQUEST_HEADERS) op:Equal spids:[1177])]
      spids: [1173]
    )
    (While
      cond: [(Sentence child:(C {(read)} {(-r)} {(line)}) terminator:<Op_Semi ';'>)]
      body: 
        (DoGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:line)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name line>
                        suffix_op: 
                          (StringUnary
                            op_id: VOp1_DPercent
                            arg_word: {(SQ <Lit_EscapedChar '\\r'>)}
                          )
                        spids: [1193 1199]
                      )
                    }
                  spids: [1192]
                )
              ]
              spids: [1192]
            )
            (C {(recv)} {(DQ ($ VSub_Name '$line'))})
            (AndOr
              children: [
                (C {(Lit_Other '[')} {(-z)} {(DQ ($ VSub_Name '$line'))} {(Lit_Other ']')})
                (ControlFlow token:<ControlFlow_Break break>)
              ]
              op_id: Op_DAmp
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REQUEST_HEADERS)
                  op: PlusEqual
                  rhs: {(ArrayLiteralPart words:[{(DQ ($ VSub_Name '$line'))}])}
                  spids: [1230]
                )
              ]
              spids: [1230]
            )
          ]
          spids: [1189 1237]
        )
    )
    (C {(source)} 
      {
        (DQ 
          (BracedVarSub
            token: <VSub_Name BASH_SOURCE>
            bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 0)}))
            suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ('*')})
            spids: [1243 1251]
          )
        ) (/bashttpd.conf)
      }
    )
    (C {(fail_with)} {(500)})
  ]
)