beginCompilationUnit(bool)
  beginMetadataStar(bool)
  endMetadataStar(0)
  beginTopLevelMember(bool)
    beginFields()
      handleIdentifier(bool, typeReference)
      handleNoTypeArguments(x)
      handleType(bool, null)
      handleIdentifier(x, topLevelVariableDeclaration)
      handleNoFieldInitializer(;)
    endTopLevelFields(null, null, null, null, null, 1, bool, ;)
  endTopLevelDeclaration(bool)
  beginMetadataStar(bool)
  endMetadataStar(0)
  beginTopLevelMember(bool)
    beginFields(;)
      handleIdentifier(bool, typeReference)
      handleNoTypeArguments(x)
      handleType(bool, null)
      handleIdentifier(x, topLevelVariableDeclaration)
      handleNoFieldInitializer(;)
    endTopLevelFields(null, null, null, null, null, 1, bool, ;)
  endTopLevelDeclaration(errors)
  beginMetadataStar(errors)
  endMetadataStar(0)
  beginTopLevelMember(errors)
    beginTopLevelMethod(;, null)
      handleNoType(;)
      handleIdentifier(errors, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleIdentifier(print, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleIdentifier(x, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(x, ))
        endArguments(1, (, ))
        handleSend(print, ;)
        handleExpressionStatement(;)
        handleIdentifier(print, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleIdentifier(x, expression)
          handleNoTypeArguments(!)
          handleNoArguments(!)
          handleSend(x, !)
          handleNonNullAssertExpression(!)
        endArguments(1, (, ))
        handleSend(print, ;)
        handleExpressionStatement(;)
        handleIdentifier(print, expression)
        handleNoTypeArguments(()
        beginArguments(()
          handleIdentifier(x, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(x, ))
          handleUnaryPrefixExpression(!)
        endArguments(1, (, ))
        handleSend(print, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(errors, null, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, C)
      handleNoType(C)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(C)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, C)
            handleNoType({)
            handleIdentifier(C, methodDeclaration)
            handleIdentifier(c0, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(super)
                handleSuperExpression(super, expression)
                handleNoTypeArguments(()
                beginArguments(()
                endArguments(0, (, ))
                handleSend(super, ;)
              endInitializer(;)
            endInitializers(1, :, ;)
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, C, (, :, ;)
        endMember()
        beginMetadataStar(C)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, null, C)
            handleNoType(;)
            handleIdentifier(C, methodDeclaration)
            handleIdentifier(c1, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(super)
                handleSuperExpression(super, expression)
                handleNoTypeArguments(()
                beginArguments(()
                endArguments(0, (, ))
                handleSend(super, !)
                handleNonNullAssertExpression(!)
              endInitializer(;)
            endInitializers(1, :, ;)
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, C, (, :, ;)
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 2, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(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({)
      endBlockFunctionBody(0, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(5, )
