library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef ListList<T extends core::Object? = dynamic> = core::List<core::List<T%>>;
class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static method stat<T extends core::Object? = dynamic>(self::C::stat::T% value) → self::C::stat::T%
    return value;
  method inst<T extends core::Object? = dynamic>(self::C::inst::T% value) → self::C::inst::T%
    return value;
  method method() → void {
    (core::int) → core::int f1 = #C2;
    core::String f1TypeName = (#C2).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f2 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f2TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f3 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f3TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
abstract class M extends self::C /*isMixinDeclaration*/  {
  static method mstat<T extends core::Object? = dynamic>(self::M::mstat::T% value) → self::M::mstat::T%
    return value;
  method minst<T extends core::Object? = dynamic>(self::M::minst::T% value) → self::M::minst::T%
    return value;
  method mmethod() → void {
    (core::int) → core::int f1 = #C4;
    core::String f1TypeName = (#C4).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f2 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f2TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
    (core::int) → core::int f3 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
    core::String f3TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
abstract class _D&C&M = self::C with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_D&C&M
    : super self::C::•()
    ;
  mixin-super-stub method minst<T extends core::Object? = dynamic>(self::_D&C&M::minst::T% value) → self::_D&C&M::minst::T%
    return super.{self::M::minst}<self::_D&C&M::minst::T%>(value);
  mixin-super-stub method mmethod() → void
    return super.{self::M::mmethod}();
}
class D extends self::_D&C&M {
  synthetic constructor •() → self::D
    : super self::_D&C&M::•()
    ;
  method method() → void {
    (core::int) → core::int f4 = super.{self::C::inst}<core::int>;
    core::String f4TypeName = (super.{self::C::inst}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  }
}
extension Ext on self::C {
  static method estat = self::Ext|estat;
  method einst = self::Ext|einst;
  tearoff einst = self::Ext|get#einst;
  method emethod = self::Ext|emethod;
  tearoff emethod = self::Ext|get#emethod;
}
static method top<T extends core::Object? = dynamic>(self::top::T% value) → self::top::T%
  return value;
static method Ext|estat<T extends core::Object? = dynamic>(self::Ext|estat::T% value) → self::Ext|estat::T%
  return value;
static method Ext|einst<T extends core::Object? = dynamic>(lowered final self::C #this, self::Ext|einst::T% value) → self::Ext|einst::T%
  return value;
static method Ext|get#einst(lowered final self::C #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% value) → T% => self::Ext|einst<T%>(#this, value);
static method Ext|emethod(lowered final self::C #this) → void {
  (core::int) → core::int f1 = #C6;
  core::String f1TypeName = (#C6).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  (core::int) → core::int f2 = self::Ext|get#einst(#this)<core::int>;
  core::String f2TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
  (core::int) → core::int f3 = self::Ext|get#einst(#this)<core::int>;
  core::String f3TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
}
static method Ext|get#emethod(lowered final self::C #this) → () → void
  return () → void => self::Ext|emethod(#this);
static method main() → void {
  core::Type t1 = #C7;
  core::Type t2 = #C8;
  function local<T extends core::Object? = dynamic>(T% value) → T%
    return value;
  (core::int) → core::int f3 = local<core::int>;
  self::D d = new self::D::•();
  (core::int) → core::int f4 = d.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
  (core::int) → core::int f5 = d.{self::_D&C&M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
  (core::int) → core::int f6 = self::Ext|get#einst(d)<core::int>;
  core::String typeName = (#C7).{core::Type::toString}(){() → core::String};
  core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
}

constants  {
  #C1 = tearoff self::C::stat
  #C2 = partial-instantiation self::C::stat <core::int*>
  #C3 = tearoff self::M::mstat
  #C4 = partial-instantiation self::M::mstat <core::int*>
  #C5 = tearoff self::Ext|estat
  #C6 = partial-instantiation self::Ext|estat <core::int*>
  #C7 = TypeLiteralConstant(core::List<core::int*>*)
  #C8 = TypeLiteralConstant(core::List<core::List<core::int*>*>*)
}
