library;
import self as self;
import "dart:core" as core;

abstract class _B&Object&M1 = core::Object with self::M1 {
}
abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
}
class B extends self::_B&Object&M1&M2 {
  constructor •(dynamic value) → void
    : super core::Object::•()
    ;
}
abstract class M1 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print("M1");
}
abstract class M2 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print("M2");
}
abstract class _C&Object&M1 = core::Object with self::M1 {
}
abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
}
class C extends self::_C&Object&M1&M2 {
  constructor •(dynamic value) → void
    : super core::Object::•()
    ;
}
abstract class G1<T extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print(self::G1::T);
}
abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
}
class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
static method main() → dynamic {
  new self::B::•(null).m();
  new self::C::•(null).m();
  new self::D::•<dynamic>().m();
  new self::D::•<core::int>().m();
  new self::D::•<core::List<core::int>>().m();
}
