beginCompilationUnit(@)
  beginMetadataStar(@)
    beginMetadata(@)
      handleIdentifier(A, metadataReference)
      beginTypeArguments(<)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(>)
        handleType(int, null)
      endTypeArguments(1, <, >)
      beginArguments(()
        handleLiteralInt(0)
      endArguments(1, (, ))
    endMetadata(@, null, ))
  endMetadataStar(1)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginTypedef(typedef)
      handleIdentifier(F, typedefDeclaration)
      beginTypeVariables(<)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, ))
        endMetadataStar(1)
        handleIdentifier(T, typeVariableDeclaration)
        beginTypeVariable(T)
          handleTypeVariablesDefined(T, 1)
          handleNoType(T)
        endTypeVariable(>, 0, null, null)
      endTypeVariables(<, >)
      beginFunctionType(int)
        beginTypeVariables(<)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, ))
          endMetadataStar(1)
          handleIdentifier(X, typeVariableDeclaration)
          beginTypeVariable(X)
            handleTypeVariablesDefined(X, 1)
            handleNoType(X)
          endTypeVariable(>, 0, null, null)
        endTypeVariables(<, >)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(Function)
        handleType(int, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, ))
          endMetadataStar(1)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments())
            handleType(int, null)
            handleNoName())
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.requiredPositional, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endTypedef(null, typedef, =, ;)
  endTopLevelDeclaration(;)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null, null)
      handleVoidKeyword(void)
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, ))
        endMetadataStar(1)
        beginFunctionType(void)
          beginTypeVariables(<)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, ))
            endMetadataStar(1)
            handleIdentifier(X, typeVariableDeclaration)
            beginTypeVariable(X)
              handleTypeVariablesDefined(X, 1)
              handleNoType(X)
            endTypeVariable(>, 0, null, null)
          endTypeVariables(<, >)
          handleVoidKeyword(void)
          beginFormalParameters((, MemberKind.GeneralizedFunctionType)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, ))
            endMetadataStar(1)
            beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(y)
              handleType(int, null)
              handleIdentifier(y, formalParameterDeclaration)
              handleFormalParameterWithoutValue())
            endFormalParameter(null, null, null, y, null, null, FormalParameterKind.requiredPositional, MemberKind.GeneralizedFunctionType)
          endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
        endFunctionType(Function, ?)
        beginVariablesDeclaration(f, null, null)
          handleIdentifier(f, localVariableDeclaration)
          beginInitializedIdentifier(f)
            beginVariableInitializer(=)
              handleLiteralNull(null)
            endVariableInitializer(=)
          endInitializedIdentifier(f)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
endCompilationUnit(2, )
