beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(late, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, late)
      handleNoType(late)
      handleClassExtends(null)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, g)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(g, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(1)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(required, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, required)
      handleNoType(required)
      handleClassExtends(null)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginMethod(null, null, null, null, get, g)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(g, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(2)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, int, =>, null, ;)
        endMember()
      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, C)
      handleNoType(C)
      handleClassExtends(null)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinBody(DeclarationKind.Class, {)
        beginMetadataStar(late)
        endMetadataStar(0)
        beginMember()
          handleIdentifier(late, typeReference)
          handleNoTypeArguments(l)
          handleType(late, null)
          handleIdentifier(l, fieldDeclaration)
          beginFieldInitializer(=)
            handleIdentifier(late, expression)
            handleNoTypeArguments(()
            beginArguments(()
            endArguments(0, (, ))
            handleSend(late, ;)
          endFieldInitializer(=, ;)
        endClassFields(null, null, null, null, 1, late, ;)
      endMember()
      beginMetadataStar(required)
      endMetadataStar(0)
      beginMember()
        handleIdentifier(required, typeReference)
        handleNoTypeArguments(r)
        handleType(required, null)
        handleIdentifier(r, fieldDeclaration)
        beginFieldInitializer(=)
          handleIdentifier(required, expression)
          handleNoTypeArguments(()
          beginArguments(()
          endArguments(0, (, ))
          handleSend(required, ;)
        endFieldInitializer(=, ;)
      endClassFields(null, null, null, null, 1, required, ;)
    endMember()
  endClassOrMixinBody(DeclarationKind.Class, 2, {, })
endClassDeclaration(class, })
endTopLevelDeclaration()
endCompilationUnit(3, )
