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