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

abstract class Interface extends core::Object {
  synthetic constructor •() → self::Interface
    : super core::Object::•()
    ;
  abstract method method(core::num i) → core::String;
}
abstract class Interface2 extends core::Object {
  synthetic constructor •() → self::Interface2
    : super core::Object::•()
    ;
  abstract method method(covariant-by-declaration core::int i) → core::String;
}
abstract class A extends core::Object implements self::Interface /*isMixinDeclaration*/  {
  method method(core::num i, {core::String s = #C1}) → core::String
    return s;
}
abstract class B extends core::Object implements self::Interface {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
  abstract method method(core::num i) → core::String;
}
abstract class D extends core::Object implements self::Interface, self::Interface2 {
  synthetic constructor •() → self::D
    : super core::Object::•()
    ;
  abstract forwarding-stub method method(covariant-by-declaration core::num i) → core::String;
}
abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_E&Object&A
    : super core::Object::•()
    ;
  mixin-super-stub method method(core::num i, {core::String s = #C1}) → core::String
    return super.{self::A::method}(i, s: s);
}
abstract class _E&Object&A&D = self::_E&Object&A with self::D /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_E&Object&A&D
    : super self::_E&Object&A::•()
    ;
  forwarding-stub method method(covariant-by-declaration core::num i, {core::String s = #C1}) → core::String
    return super.{self::_E&Object&A::method}(i, s: s);
}
class E extends self::_E&Object&A&D {
  synthetic constructor •() → self::E
    : super self::_E&Object&A&D::•()
    ;
}
abstract class F extends core::Object implements self::Interface {
  synthetic constructor •() → self::F
    : super core::Object::•()
    ;
}
abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_G&Object&A
    : super core::Object::•()
    ;
  mixin-super-stub method method(core::num i, {core::String s = #C1}) → core::String
    return super.{self::A::method}(i, s: s);
}
abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_G&Object&A&F
    : super self::_G&Object&A::•()
    ;
}
class G extends self::_G&Object&A&F {
  synthetic constructor •() → self::G
    : super self::_G&Object&A&F::•()
    ;
}
static method main() → dynamic {}

constants  {
  #C1 = "hello"
}
