beginCompilationUnit(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginTryStatement(try)
          beginBlock({, BlockKind(try statement))
          endBlock(0, {, }, BlockKind(try statement))
          beginCatchClause(catch)
            beginFormalParameters((, MemberKind.Catch)
              beginMetadataStar(e)
              endMetadataStar(0)
              beginFormalParameter(e, MemberKind.Catch, null, null, null)
                handleNoType(()
                handleIdentifier(e, formalParameterDeclaration)
                handleFormalParameterWithoutValue(,)
              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
              beginMetadataStar(s)
              endMetadataStar(0)
              beginFormalParameter(s, MemberKind.Catch, null, null, null)
                handleNoType(,)
                handleIdentifier(s, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
            endFormalParameters(2, (, ), MemberKind.Catch)
          endCatchClause({)
          beginBlock({, BlockKind(catch clause))
          endBlock(0, {, }, BlockKind(catch clause))
          handleCatchBlock(null, catch, ,)
        endTryStatement(1, try, null)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
