(command.CommandList
  children: [
    (C {(Id.KW_Set set)} {(-o)} {(nounset)})
    (C {(Id.KW_Set set)} {(-o)} {(pipefail)})
    (C {(Id.KW_Set set)} {(-o)} {(errexit)})
    (C {(readonly)} 
      {(Id.Lit_VarLike 'OIL_VERSION=') 
        (command_sub
          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:110)
          command_list: 
            (command.CommandList
              children: [(C {(head)} {(-n)} {(1)} {(oil-version.txt)})]
            )
        )
      }
    )
    (C {(readonly)} 
      {(Id.Lit_VarLike 'OSH_RELEASE_BINARY=') (_tmp/oil-tar-test/oil-) 
        ($ Id.VSub_DollarName '$OIL_VERSION') (/_bin/osh)
      }
    )
    (command.ShFunction
      name: log
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(echo)} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_GreatAnd val:'1>&' span_id:145)
                  fd: 1
                  arg_word: {(2)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _clean-tmp-dirs
      body: 
        (command.BraceGroup
          children: [
            (C {(rm)} {(-r)} {(-f)} 
              (word.BracedTree
                parts: [
                  (_tmp/)
                  (word_part.BracedTuple
                    words: [{(spec)} {(wild)} {(unit)} {(gold)} {(osh2oil)}]
                  )
                ]
              ) 
              (word.BracedTree
                parts: [
                  (_tmp/)
                  (word_part.BracedTuple
                    words: [{(osh-parser)} {(osh-runtime)} {(vm-baseline)} {(ovm-build)} {(oheap)}]
                  )
                ]
              ) {(_tmp/metrics)} {(_tmp/oil-tar-test)}
            )
          ]
        )
    )
    (command.ShFunction
      name: _clean
      body: 
        (command.BraceGroup
          children: [
            (C {(_clean-tmp-dirs)})
            (C {(rm)} {(-r)} {(-f)} {(_devbuild)})
            (C {(build/actions.sh)} {(clean-repo)})
          ]
        )
    )
    (command.ShFunction
      name: _dev-build
      body: (command.BraceGroup children:[(C {(build/dev.sh)} {(all)})])
    )
    (command.ShFunction
      name: _release-build
      body: 
        (command.BraceGroup
          children: [
            (C {(build/prepare.sh)} {(configure)})
            (C {(build/prepare.sh)} {(build-python)})
            (C {($ Id.VSub_Number '$0')} {(oil)})
            (C {(build/test.sh)} {(oil-tar)})
            (C {(ln)} {(-s)} {(-f)} {(--no-target-directory)} {(-v)} {(oil.ovm)} 
              {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
            )
          ]
        )
    )
    (command.ShFunction
      name: _test-release-build
      body: 
        (command.BraceGroup
          children: [
            (C {(test/alpine.sh)} {(copy-tar)} {(SQ )} {(oil)})
            (C {(test/alpine.sh)} {(test-tar)} {(SQ )} {(oil)})
            (C {(test/spec.sh)} {(link-busybox-ash)})
            (C {(test/spec.sh)} {(smoke)})
            (C {(test/osh2oil.sh)} {(run-for-release)})
            (C {(test/gold.sh)} {(run-for-release)})
            (command.Simple
              words: [{(test/spec.sh)} {(all)}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [554]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: build-and-test
      body: 
        (command.BraceGroup
          children: [
            (C {(_clean)})
            (C {(_dev-build)})
            (C {(test/unit.sh)} {(run-for-release)})
            (C {(_release-build)})
            (C {(_test-release-build)})
          ]
        )
    )
    (command.ShFunction
      name: _install
      body: 
        (command.BraceGroup
          children: [
            (C {(test/spec.sh)} {(install-shells)})
            (C {(sudo)} {(apt)} {(install)} {(python-dev)})
          ]
        )
    )
    (command.ShFunction
      name: benchmark-build
      body: 
        (command.BraceGroup
          children: [(C {(_install)}) (C {(_clean)}) (C {(_dev-build)}) (C {(_release-build)})]
        )
    )
    (command.ShFunction
      name: benchmark-run
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(benchmarks/auto.sh)} {(all)}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [666]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: benchmark-run-on-1-machine
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(benchmarks/oheap.sh)} {(measure)}]
              more_env: [
                (env_pair
                  name: OSH_OVM
                  val: {($ Id.VSub_DollarName '$OSH_RELEASE_BINARY')}
                  spids: [683]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _compressed-tarball
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} 
              {(Id.Lit_VarLike 'name=') 
                (braced_var_sub
                  token: (Token id:Id.VSub_Number val:1 span_id:704)
                  suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(hello)})
                )
              }
            )
            (C {(local)} 
              {(Id.Lit_VarLike 'version=') 
                (braced_var_sub
                  token: (Token id:Id.VSub_Number val:2 span_id:714)
                  suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(0.0.0)})
                )
              }
            )
            (C {(local)} {(Id.Lit_VarLike 'in=') (_release/) ($ Id.VSub_DollarName '$name') (.tar)})
            (C {(local)} 
              {(Id.Lit_VarLike 'out=') (_release/) ($ Id.VSub_DollarName '$name') (-) 
                ($ Id.VSub_DollarName '$version') (.tar.gz)
              }
            )
            (C {(build/actions.sh)} {(write-release-date)})
            (C {(make)} {($ Id.VSub_DollarName '$in')})
            (command.TimeBlock
              pipeline: 
                (command.Simple
                  words: [{(gzip)} {(-c)} {($ Id.VSub_DollarName '$in')}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:771)
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$out')}
                    )
                  ]
                )
            )
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$out')})
            (C {(local)} 
              {(Id.Lit_VarLike 'out2=') (_release/) ($ Id.VSub_DollarName '$name') (-) 
                ($ Id.VSub_DollarName '$version') (.tar.xz)
              }
            )
            (command.TimeBlock
              pipeline: 
                (command.Simple
                  words: [{(xz)} {(-c)} {($ Id.VSub_DollarName '$in')}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:806)
                      fd: -1
                      arg_word: {($ Id.VSub_DollarName '$out2')}
                    )
                  ]
                )
            )
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$out2')})
          ]
        )
    )
    (command.ShFunction
      name: oil
      body: 
        (command.BraceGroup
          children: [(C {(_compressed-tarball)} {(oil)} {($ Id.VSub_DollarName '$OIL_VERSION')})]
        )
    )
    (command.ShFunction
      name: hello
      body: 
        (command.BraceGroup
          children: [
            (C {(_compressed-tarball)} {(hello)} 
              {
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:847)
                  command_list: 
                    (command.CommandList
                      children: [(C {(head)} {(-n)} {(1)} {(build/testdata/hello-version.txt)})]
                    )
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: escape-segments
      body: 
        (command.BraceGroup
          children: [
            (C {(python)} {(-c)} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:887) 
                  (Token id:Id.Lit_Chars val:'import cgi, re, sys\n' span_id:888) (Token id:Id.Lit_Chars val:'\n' span_id:889) (Token id:Id.Lit_Chars val:'print re.sub(\n' span_id:890) 
                  (Token id:Id.Lit_Chars val:'  r"\\x00(.*)\\x01", \n' span_id:891) (Token id:Id.Lit_Chars val:'  lambda match: cgi.escape(match.group(1)),\n' span_id:892) 
                  (Token id:Id.Lit_Chars val:'  sys.stdin.read())\n' span_id:893)
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog-body
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'prev_branch=') ($ Id.VSub_Number '$1')})
            (C {(local)} {(Id.Lit_VarLike 'cur_branch=') ($ Id.VSub_Number '$2')})
            (C {(local)} 
              {(Id.Lit_VarLike 'format=') 
                (SQ (Token id:Id.Lit_Chars val:'<tr>\n' span_id:944) 
                  (Token
                    id: Id.Lit_Chars
                    val: '    <td><a class="checksum"\n'
                    span_id: 945
                  ) 
                  (Token
                    id: Id.Lit_Chars
                    val: '           href="https://github.com/oilshell/oil/commit/%H">%h</a>\n'
                    span_id: 946
                  ) (Token id:Id.Lit_Chars val:'    </td>\n' span_id:947) 
                  (Token
                    id: Id.Lit_Chars
                    val: '    <td class="date">%ad</td>\n'
                    span_id: 948
                  ) (Token id:Id.Lit_Chars val:'    <td>%x00%an%x01</td>\n' span_id:949) 
                  (Token
                    id: Id.Lit_Chars
                    val: '    <td class="subject">%x00%s%x01</td>\n'
                    span_id: 950
                  ) (Token id:Id.Lit_Chars val:'  </tr>' span_id:951)
                )
              }
            )
            (command.Pipeline
              children: [
                (C {(git)} {(log)} 
                  {($ Id.VSub_DollarName '$prev_branch') (..) ($ Id.VSub_DollarName '$cur_branch')} {(--reverse)} {(--pretty) (Id.Lit_Equals '=') (DQ ('format:') ($ Id.VSub_DollarName '$format'))} 
                  {(--date) (Id.Lit_Equals '=') (short)}
                )
                (C {(escape-segments)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog-header
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'prev_branch=') ($ Id.VSub_Number '$1')})
            (C {(local)} {(Id.Lit_VarLike 'cur_branch=') ($ Id.VSub_Number '$2')})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1015)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1065
                  stdin_parts: [
                    ('<!DOCTYPE html>\n')
                    ('<html>\n')
                    ('  <head>\n')
                    ('    <title>Commits Between ')
                    ($ Id.VSub_DollarName '$prev_branch')
                    (' and ')
                    ($ Id.VSub_DollarName '$cur_branch')
                    ('</title>\n')
                    ('    <style>\n')
                    ('      /* Make it centered and skinny for readability */\n')
                    ('      body {\n')
                    ('        margin: 0 auto;\n')
                    ('        width: 60em;\n')
                    ('      }\n')
                    ('      table {\n')
                    ('        width: 100%;\n')
                    ('      }\n')
                    ('      code {\n')
                    ('        color: green;\n')
                    ('      }\n')
                    ('      .checksum {\n')
                    ('        font-family: monospace;\n')
                    ('      }\n')
                    ('      .date {\n')
                    ('        /*font-family: monospace;*/\n')
                    ('      }\n')
                    ('      .subject {\n')
                    ('        font-family: monospace;\n')
                    ('      }\n')
                    ('\n')
                    ('      /* Copied from oilshell.org bundle.css */\n')
                    ('      .date {\n')
                    ('        font-size: medium;\n')
                    ('        color: #555;\n')
                    ('        padding-left: 1em;\n')
                    ('      }\n')
                    ('    </style>\n')
                    ('  </head>\n')
                    ('  <body>\n')
                    ('    <h3>Commits Between Branches <code>')
                    ($ Id.VSub_DollarName '$prev_branch')
                    ('</code> and\n')
                    ('       <code>')
                    ($ Id.VSub_DollarName '$cur_branch')
                    ('</code></h3>\n')
                    ('    <table>\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _git-changelog
      body: 
        (command.BraceGroup
          children: [
            (C {(_git-changelog-header)} {(DQ ($ Id.VSub_At '$@'))})
            (C {(_git-changelog-body)} {(DQ ($ Id.VSub_At '$@'))})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1116)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1121
                  stdin_parts: [('  </table>\n')]
                )
              ]
            )
            (C {(_html-footer)})
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.1
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} 
              {(Id.Lit_VarLike 'version=') (SQ (Token id:Id.Lit_Chars val:0.1.0 span_id:1139))}
            )
            (command.Simple
              words: [{(_git-changelog)} {(release/0.0.0)} {(release/0.1.0)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1151)
                  fd: -1
                  arg_word: 
                    {(../oilshell.org__deploy/release/) ($ Id.VSub_DollarName '$version') 
                      (/changelog.html)
                    }
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.1.0)} {(release/0.2.alpha1)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1175)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.2.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.1.0)} {(release/0.2.0)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1197)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.2.0)} {(release/0.3.alpha1)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1219)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.3.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.2.0)} {(release/0.3.0)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1241)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.4.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.3.0)} {(release/0.4.0)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1263)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha1
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.4.0)} {(release/0.5.alpha1)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1285)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha2
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.5.alpha1)} {(release/0.5.alpha2)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1310)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: git-changelog-0.5.alpha3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(_git-changelog)} {(release/0.5.alpha2)} {(release/0.5.alpha3)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1332)
                  fd: -1
                  arg_word: {(_release/VERSION/changelog.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: html-redirect
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'url=') ($ Id.VSub_Number '$1')})
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1358)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1386
                  stdin_parts: [
                    ('<!DOCTYPE html>\n')
                    ('<html>\n')
                    ('  <head>\n')
                    ('    <meta http-equiv=')
                    (Id.Right_DoubleQuote '"')
                    (refresh)
                    (Id.Right_DoubleQuote '"')
                    (' content=')
                    (Id.Right_DoubleQuote '"')
                    ('0; url=')
                    ($ Id.VSub_DollarName '$url')
                    (Id.Right_DoubleQuote '"')
                    (' />\n')
                    ('  </head>\n')
                    ('  <body>\n')
                    ('    <p>Redirect to<a href=')
                    (Id.Right_DoubleQuote '"')
                    ($ Id.VSub_DollarName '$url')
                    (Id.Right_DoubleQuote '"')
                    ('>')
                    ($ Id.VSub_DollarName '$url')
                    ('</a></p>\n')
                    ('  </body>\n')
                    ('</html>  \n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: no-announcement
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:1399)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 1411
                  stdin_parts: [
                    ('<!DOCTYPE html>\n')
                    ('<html>\n')
                    ('  <head>\n')
                    ('  </head>\n')
                    ('  <body>\n')
                    ('    <p>No announcement for this release.</p>\n')
                    ('  </body>\n')
                    ('</html>  \n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: write-no-announcement
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(no-announcement)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1424)
                  fd: -1
                  arg_word: {(_release/VERSION/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.0
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2017/07/23.html span_id:1441))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1446)
                  fd: -1
                  arg_word: {(../oilshell.org__deploy/release/0.0.0/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.1
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} 
              {(Id.Lit_VarLike 'version=') (SQ (Token id:Id.Lit_Chars val:0.1.0 span_id:1464))}
            )
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2017/09/09.html span_id:1471))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1476)
                  fd: -1
                  arg_word: 
                    {(../oilshell.org__deploy/release/) ($ Id.VSub_DollarName '$version') 
                      (/announcement.html)
                    }
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.2
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2017/11/10.html span_id:1495))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1498)
                  fd: -1
                  arg_word: {(_release/VERSION/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2017/12/22.html span_id:1515))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1518)
                  fd: -1
                  arg_word: {(_release/VERSION/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.4
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2018/02/03.html span_id:1539))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1542)
                  fd: -1
                  arg_word: {(_release/VERSION/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: announcement-0.5.alpha3
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(html-redirect)}
                {(SQ (Token id:Id.Lit_Chars val:/blog/2018/04/30.html span_id:1559))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:1562)
                  fd: -1
                  arg_word: {(_release/VERSION/announcement.html)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _link
      body: 
        (command.BraceGroup
          children: [
            (C {(ln)} {(-s)} {(-f)} {(-v)} {(--no-target-directory)} {(DQ ($ Id.VSub_At '$@'))})
          ]
        )
    )
    (command.ShFunction
      name: compress-txt
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'name=') ($ Id.VSub_Number '$1')})
            (C {(log)} {(DQ ('--- test/') ($ Id.VSub_DollarName '$name'))})
            (C {(local)} 
              {(Id.Lit_VarLike 'out=') 
                (DQ ($ Id.VSub_DollarName '$root') (/test/) ($ Id.VSub_DollarName '$name') (.wwz))
              }
            )
            (C {(pushd)} {(_tmp/) ($ Id.VSub_DollarName '$name')})
            (command.TimeBlock
              pipeline: (C {(zip)} {(-r)} {(-q)} {($ Id.VSub_DollarName '$out')} {(.)})
            )
            (C {(popd)})
          ]
        )
    )
    (command.ShFunction
      name: compress
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'root=') ($ Id.VSub_DollarName '$PWD') (/_release/VERSION/)})
            (C {(compress-txt)} {(osh2oil)})
            (C {(compress-txt)} {(gold)})
            (C {(log)} {(DQ ('--- test/unit'))})
            (C {(local)} {(Id.Lit_VarLike 'out=') (DQ ($ Id.VSub_DollarName '$root') (/test/unit.wwz))})
            (C {(pushd)} {(_tmp/unit)})
            (command.TimeBlock
              pipeline: (C {(zip)} {(-r)} {(-q)} {($ Id.VSub_DollarName '$out')} {(.)})
            )
            (C {(popd)})
            (C {(log)} {(DQ ('--- test/spec'))})
            (C {(local)} {(Id.Lit_VarLike 'out=') (DQ ($ Id.VSub_DollarName '$root') (/test/spec.wwz))})
            (C {(pushd)} {(_tmp/spec)})
            (command.TimeBlock
              pipeline: (C {(zip)} {(-r)} {(-q)} {($ Id.VSub_DollarName '$out')} {(.)})
            )
            (C {(popd)})
            (C {(log)} {(DQ ('--- test/wild'))})
            (C {(local)} {(Id.Lit_VarLike 'out=') (DQ ($ Id.VSub_DollarName '$root') (/test/wild.wwz))})
            (C {(pushd)} {(_tmp/wild/www)})
            (command.TimeBlock
              pipeline: (C {(zip)} {(-r)} {(-q)} {($ Id.VSub_DollarName '$out')} {(.)})
            )
            (C {(popd)})
            (C {(log)} {(DQ ('--- metrics'))})
            (C {(local)} {(Id.Lit_VarLike 'out=') (DQ ($ Id.VSub_DollarName '$root') (/metrics.wwz))})
            (C {(pushd)} {(_tmp/metrics)})
            (command.TimeBlock
              pipeline: (C {(zip)} {(-r)} {(-q)} {($ Id.VSub_DollarName '$out')} {(.)})
            )
            (C {(popd)})
            (C {(compress-benchmarks)})
            (C {(tree)} {(_release/VERSION)})
          ]
        )
    )
    (command.ShFunction
      name: compress-benchmarks
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'root=') ($ Id.VSub_DollarName '$PWD') (/_release/VERSION/)})
            (C {(mkdir)} {(-p)} {($ Id.VSub_DollarName '$root')})
            (C {(log)} {(DQ ('--- benchmarks'))})
            (C {(local)} {(Id.Lit_VarLike 'out=') (DQ ($ Id.VSub_DollarName '$root') (/benchmarks.wwz))})
            (C {(pushd)} {(_tmp)})
            (command.Pipeline
              children: [
                (C {(find)} 
                  (word.BracedTree
                    parts: [
                      (osh-parser/)
                      (word_part.BracedTuple
                        words: [{(stage1)} {(stage2)} {(index.html)}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      (osh-runtime/)
                      (word_part.BracedTuple
                        words: [{(stage1)} {(stage2)} {(index.html)}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      (vm-baseline/)
                      (word_part.BracedTuple
                        words: [{(stage1)} {(stage2)} {(index.html)}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      (ovm-build/)
                      (word_part.BracedTuple
                        words: [{(stage1)} {(stage2)} {(index.html)}]
                      )
                    ]
                  ) 
                  (word.BracedTree
                    parts: [
                      (oheap/)
                      (word_part.BracedTuple
                        words: [{(stage1)} {(stage2)} {(index.html)}]
                      )
                    ]
                  ) {(-type)} {(f)}
                )
                (C {(xargs)} {(--verbose)} {(--)} {(zip)} {(-q)} {($ Id.VSub_DollarName '$out')})
              ]
              negated: F
            )
            (C {(popd)})
          ]
        )
    )
    (command.ShFunction
      name: line-counts
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'out=') ($ Id.VSub_Number '$1')})
            (C {(mkdir)} {(-p)} {($ Id.VSub_DollarName '$out')})
            (command.Simple
              words: [{(build/metrics.sh)} {(linecount-pydeps)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2028)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/pydeps.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(build/metrics.sh)} {(linecount-nativedeps)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2038)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/nativedeps.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(scripts/count.sh)} {(all)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2053)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/src.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(scripts/count.sh)} {(parser)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2071)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/parser.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(scripts/count.sh)} {(runtime)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2081)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/runtime.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(scripts/count.sh)} {(oil-osh-cloc)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2092)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/oil-osh-cloc.txt)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: metrics
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'out=') (_tmp/metrics)})
            (C {(mkdir)} {(-p)} {($ Id.VSub_DollarName '$out')})
            (command.Simple
              words: [{(build/metrics.sh)} {(pyc-bytes)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2125)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out') (/pyc-bytes.txt)}
                )
              ]
            )
            (C {(line-counts)} {($ Id.VSub_DollarName '$out') (/line-counts)})
            (C {(tree)} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (command.ShFunction
      name: _copy-path
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'src=') ($ Id.VSub_Number '$1')} 
              {(Id.Lit_VarLike 'dest=') ($ Id.VSub_Number '$2')}
            )
            (C {(mkdir)} {(-p)} 
              {
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2166)
                  command_list: 
                    (command.CommandList
                      children: [(C {(dirname)} {($ Id.VSub_DollarName '$dest')})]
                    )
                )
              }
            )
            (C {(cp)} {(-v)} {($ Id.VSub_DollarName '$src')} {($ Id.VSub_DollarName '$dest')})
          ]
        )
    )
    (command.ShFunction
      name: copy-web
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(find)} {(web)} 
                  {
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\(' span_id:2197)
                    )
                  } {(-name)} {(_tmp)} {(-a)} {(-prune)} 
                  {
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\)' span_id:2207)
                    )
                  } {(-o)} {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\(' span_id:2213))} {(-name)} 
                  {(SQ (Token id:Id.Lit_Chars val:'*.css' span_id:2218))} {(-o)} {(-name)} {(SQ (Token id:Id.Lit_Chars val:'*.js' span_id:2226))} 
                  {
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\)' span_id:2229)
                    )
                  } {(-a)} {(-printf)} {(SQ (Token id:Id.Lit_Chars val:'%p _release/VERSION/%p\\n' span_id:2236))}
                )
                (C {(xargs)} {(-n)} {(2)} {(--)} {($ Id.VSub_Number '$0')} {(_copy-path)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: build-tree
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'root=') (_release/VERSION)})
            (C {(mkdir)} {(-p)} 
              (word.BracedTree
                parts: [
                  ($ Id.VSub_DollarName '$root')
                  (/)
                  (word_part.BracedTuple words:[{(doc)} {(test)}])
                ]
              )
            )
            (C {(cp)} {(-v)} {(_build/release-date.txt)} {(oil-version.txt)} 
              {($ Id.VSub_DollarName '$root')}
            )
            (C {(build/doc.sh)} {(osh-quick-ref)} {(_release/VERSION)})
            (C {(build/doc.sh)} {(install)})
            (C {(build/doc.sh)} {(release-index)} {($ Id.VSub_DollarName '$root') (/index.html)})
            (C {(copy-web)})
            (C {(tree)} {($ Id.VSub_DollarName '$root')})
          ]
        )
    )
    (command.ShFunction
      name: deploy-doc
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} 
              {(Id.Lit_VarLike 'deploy_repo=') 
                (SQ (Token id:Id.Lit_Chars val:../oilshell.org__deploy span_id:2393))
              }
            )
            (C {(local)} 
              {(Id.Lit_VarLike 'release_root_dir=') 
                (DQ ($ Id.VSub_DollarName '$deploy_repo') (/release))
              }
            )
            (C {(local)} 
              {(Id.Lit_VarLike 'release_dir=') 
                (DQ ($ Id.VSub_DollarName '$release_root_dir') (/) 
                  ($ Id.VSub_DollarName '$OIL_VERSION')
                )
              }
            )
            (C {(cp)} {(-v)} {(-r)} {(--force)} {(--no-target-directory)} {(_release/VERSION/)} 
              {($ Id.VSub_DollarName '$release_dir') (/)}
            )
            (C {(html-index)} {($ Id.VSub_DollarName '$release_root_dir')} {(_tmp/releases.html)})
            (C {(cp)} {(-v)} {(_tmp/releases.html)} {($ Id.VSub_DollarName '$deploy_repo')})
            (C {(tree)} {(-L)} {(3)} {($ Id.VSub_DollarName '$release_root_dir')})
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$deploy_repo') (/releases.html)})
          ]
        )
    )
    (command.ShFunction
      name: deploy-tar
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} 
              {(Id.Lit_VarLike 'download_dir=') 
                (SQ (Token id:Id.Lit_Chars val:../oilshell.org__deploy/download/ span_id:2498))
              }
            )
            (C {(mkdir)} {(-p)} {($ Id.VSub_DollarName '$download_dir')})
            (C {(cp)} {(-v)} 
              {(_release/oil-) ($ Id.VSub_DollarName '$OIL_VERSION') (.tar.) (Id.Lit_Star '*')} {($ Id.VSub_DollarName '$download_dir')}
            )
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$download_dir')})
          ]
        )
    )
    (command.ShFunction
      name: _release-files-html
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'version=') ($ Id.VSub_Number '$1')})
            (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:'<table class="file-table">' span_id:2587))})
            (C {(echo)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 
'<tr><thead> <td>File</td> <td>Size</td> <td>SHA256 Checksum</td> </thead></tr>'
                    span_id: 2594
                  )
                )
              }
            )
            (command.ForEach
              iter_name: name
              iter_words: [
                (word.BracedTree
                  parts: [
                    (oil-)
                    ($ Id.VSub_DollarName '$version')
                    (.tar.)
                    (word_part.BracedTuple words:[{(xz)} {(gz)}])
                  ]
                )
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (C {(local)} 
                      {(Id.Lit_VarLike 'url=') (DQ (download/) ($ Id.VSub_DollarName '$name'))}
                    )
                    (C {(local)} 
                      {(Id.Lit_VarLike 'path=') (../oilshell.org__deploy/download/) 
                        ($ Id.VSub_DollarName '$name')
                      }
                    )
                    (C {(local)} 
                      {(Id.Lit_VarLike 'checksum=') 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2640)
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.Pipeline
                                  children: [
                                    (C {(sha256sum)} {($ Id.VSub_DollarName '$path')})
                                    (C {(awk)} 
                                      {(SQ (Token id:Id.Lit_Chars val:'{print $1}' span_id:2650))}
                                    )
                                  ]
                                  negated: F
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {(local)} 
                      {(Id.Lit_VarLike 'size=') 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2658)
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {(stat)} {(--format)} 
                                  {(SQ (Token id:Id.Lit_Chars val:'%s' span_id:2664))} {($ Id.VSub_DollarName '$path')}
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {(echo)} 
                      {
                        (SQ 
                          (Token
                            id: Id.Lit_Chars
                            val: '<tr> <td class="filename"><a href="'
                            span_id: 2680
                          )
                        ) ($ Id.VSub_DollarName '$url') (SQ (Token id:Id.Lit_Chars val:'">' span_id:2684)) 
                        ($ Id.VSub_DollarName '$name') 
                        (SQ (Token id:Id.Lit_Chars val:'</a></td>\n' span_id:2688) 
                          (Token
                            id: Id.Lit_Chars
                            val: '               <td class="size">'
                            span_id: 2689
                          )
                        ) ($ Id.VSub_DollarName '$size') 
                        (SQ (Token id:Id.Lit_Chars val:'</td>\n' span_id:2693) 
                          (Token
                            id: Id.Lit_Chars
                            val: '               <td class="checksum">'
                            span_id: 2694
                          )
                        ) ($ Id.VSub_DollarName '$checksum') 
                        (SQ (Token id:Id.Lit_Chars val:'</td>\n' span_id:2698) 
                          (Token
                            id: Id.Lit_Chars
                            val: '         </tr>'
                            span_id: 2699
                          )
                        )
                      }
                    )
                  ]
                )
            )
            (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:'</table>' span_id:2709))})
          ]
        )
    )
    (command.ShFunction
      name: _html-index
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'release_root_dir=') ($ Id.VSub_Number '$1')})
            (command.ForEach
              iter_name: entry
              iter_words: [{($ Id.VSub_DollarName '$release_root_dir') (/) (Id.Lit_Star '*')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (command.Pipeline
                                  children: [(C {(test)} {(-d)} {($ Id.VSub_DollarName '$entry')})]
                                  negated: T
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:2810)
                            )
                          ]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:2815)
                            )
                          ]
                          spids: [2801 2812]
                        )
                      ]
                    )
                    (C {(local)} {(Id.Lit_VarLike 'dir=') ($ Id.VSub_DollarName '$entry')})
                    (C {(local)} 
                      {(Id.Lit_VarLike 'version=') 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2831)
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {(head)} {(-n)} {(1)} 
                                  {($ Id.VSub_DollarName '$dir') (/oil-version.txt)}
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {(local)} 
                      {(Id.Lit_VarLike 'release_date=') 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:2846)
                          command_list: 
                            (command.CommandList
                              children: [
                                (C {(head)} {(-n)} {(1)} 
                                  {($ Id.VSub_DollarName '$dir') (/release-date.txt)}
                                )
                              ]
                            )
                        )
                      }
                    )
                    (C {(log)} {(DQ ('-- ') ($ Id.VSub_DollarName '$dir'))})
                    (C {(log)} {(DQ ('Version: ') ($ Id.VSub_DollarName '$version'))})
                    (C {(log)} {(DQ ('Release Date: ') ($ Id.VSub_DollarName '$release_date'))})
                    (C {(log)} {(DQ )})
                    (C {(echo)} 
                      {
                        (DQ ($ Id.VSub_DollarName '$release_date') (' ') 
                          ($ Id.VSub_DollarName '$version')
                        )
                      }
                    )
                  ]
                )
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2901)
                  fd: -1
                  arg_word: {(_tmp/release-meta.txt)}
                )
              ]
            )
            (command.Simple
              words: [{(sort)} {(-r)} {(_tmp/release-meta.txt)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:2917)
                  fd: -1
                  arg_word: {(_tmp/sorted-releases.txt)}
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:2923)
              cond: [
                (command.Sentence
                  child: (C {(read)} {(date)} {(_)} {(version)})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:2932)
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (C {(log)} {(DQ ('Release Date: ') ($ Id.VSub_DollarName '$date'))})
                    (C {(log)} {(DQ ('Version: ') ($ Id.VSub_DollarName '$version'))})
                    (C {(echo)} 
                      {(SQ (Token id:Id.Lit_Chars val:'<a name="' span_id:2961)) 
                        ($ Id.VSub_DollarName '$version') (SQ (Token id:Id.Lit_Chars val:'"></a>' span_id:2965))
                      }
                    )
                    (C {(echo)} {(DQ ('<h2>Version ') ($ Id.VSub_DollarName '$version') ('</h2>'))})
                    (C {(echo)} 
                      {(DQ ('<p class=')) (date) (DQ ('>') ($ Id.VSub_DollarName '$date') ('</p>'))}
                    )
                    (C {(echo)} 
                      {
                        (SQ 
                          (Token
                            id: Id.Lit_Chars
                            val: '<p>                 <a href="release/'
                            span_id: 2996
                          )
                        ) ($ Id.VSub_DollarName '$version') 
                        (SQ 
                          (Token
                            id: Id.Lit_Chars
                            val: '/announcement.html">Release Announcement</a>\n'
                            span_id: 3000
                          ) (Token id:Id.Lit_Chars val:'              &nbsp; | &nbsp; <a href="release/' span_id:3001)
                        ) ($ Id.VSub_DollarName '$version') 
                        (SQ 
                          (Token
                            id: Id.Lit_Chars
                            val: '/doc/INSTALL.html">INSTALL</a>\n'
                            span_id: 3005
                          ) (Token id:Id.Lit_Chars val:'              &nbsp; | &nbsp; <a href="release/' span_id:3006)
                        ) ($ Id.VSub_DollarName '$version') 
                        (SQ (Token id:Id.Lit_Chars val:'/">Docs and Details</a>\n' span_id:3010) 
                          (Token
                            id: Id.Lit_Chars
                            val: '          </p>'
                            span_id: 3011
                          )
                        )
                      }
                    )
                    (C {(_release-files-html)} {($ Id.VSub_DollarName '$version')})
                  ]
                )
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:3023)
                  fd: -1
                  arg_word: {(_tmp/sorted-releases.txt)}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _releases-html-header
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:3039)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 3100
                  stdin_parts: [
                    ('<!DOCTYPE html>\n')
                    ('<html>\n')
                    ('  <head>\n')
                    ('    <title>Oil Releases</title>\n')
                    ('    <style>\n')
                    ('      /* Make it centered and skinny for readability */\n')
                    ('      body {\n')
                    ('        margin: 0 auto;\n')
                    ('        width: 60em;\n')
                    ('      }\n')
                    ('      h1 {\n')
                    ('        text-align: center;\n')
                    ('      }\n')
                    ('      thead {\n')
                    ('        font-weight: bold;\n')
                    ('      }\n')
                    ('      /* Style for checksum, file size, etc. */\n')
                    ('\n')
                    ('      .file-table {\n')
                    ('        width: 100%;\n')
                    ('      }\n')
                    ('\n')
                    ('      .filename {\n')
                    ('        font-family: monospace;\n')
                    ('      }\n')
                    ('\n')
                    ('      .size {\n')
                    ('      }\n')
                    ('      .checksum {\n')
                    ('        font-family: monospace;\n')
                    ('        color: #555;\n')
                    ('      }\n')
                    ('\n')
                    ('      /* Copied from oilshell.org bundle.css */\n')
                    ('      .date {\n')
                    ('        font-size: medium;\n')
                    ('        color: #555;\n')
                    ('        padding-left: 1em;\n')
                    ('      }\n')
                    ('      #home-link {\n')
                    ('        text-align: right;\n')
                    ('      }\n')
                    ('    </style>\n')
                    ('  </head>\n')
                    ('  <body>\n')
                    ('    <p id=')
                    (Id.Right_DoubleQuote '"')
                    (home-link)
                    (Id.Right_DoubleQuote '"')
                    ('>\n')
                    ('      <a href=')
                    (Id.Right_DoubleQuote '"')
                    (/)
                    (Id.Right_DoubleQuote '"')
                    ('>oilshell.org</a>\n')
                    ('    </p>\n')
                    ('    <h1>Oil Releases</h1>\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: _html-footer
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:3113)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 3119
                  stdin_parts: [('  </body>\n') ('</html>\n')]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: html-index
      body: 
        (command.BraceGroup
          children: [
            (C {(local)} {(Id.Lit_VarLike 'release_root_dir=') ($ Id.VSub_Number '$1')})
            (C {(local)} 
              {(Id.Lit_VarLike 'out=') 
                (braced_var_sub
                  token: (Token id:Id.VSub_Number val:2 span_id:3140)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: {(_tmp) (Id.Lit_Slash /) (releases.html)}
                    )
                )
              }
            )
            (command.BraceGroup
              children: [
                (C {(_releases-html-header)})
                (C {(_html-index)} {($ Id.VSub_DollarName '$release_root_dir')})
                (C {(_html-footer)})
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:3164)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$out')}
                )
              ]
            )
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$out')})
          ]
        )
    )
    (C {(DQ ($ Id.VSub_At '$@'))})
  ]
)