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({)
        beginForStatement(for)
          beginMetadataStar(var)
          endMetadataStar(0)
          handleNoType(var)
          beginVariablesDeclaration(i, null, var)
            handleIdentifier(i, localVariableDeclaration)
            beginInitializedIdentifier(i)
              handleNoVariableInitializer(i)
            endInitializedIdentifier(i)
          endVariablesDeclaration(1, null)
          handleForInitializerLocalVariableDeclaration(i, true)
          beginForInExpression([])
            handleNoTypeArguments([])
            handleLiteralList(0, [, null, ])
          endForInExpression())
          handleForInLoopParts(null, for, (, in)
          beginForInBody({)
            beginBlock({, BlockKind(statement))
            endBlock(0, {, }, BlockKind(statement))
          endForInBody(})
        endForIn(})
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
