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

class C1 extends core::Object {
  synthetic constructor •() → void
    ;
}
class C2 extends core::Object {
  synthetic constructor •() → void
    ;
}
class C3 extends core::Object {
  synthetic constructor •() → void
    ;
}
class A<T extends core::Object = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
  constructor internal() → void
    ;
  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
    let dynamic #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
    let dynamic #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
    let dynamic #redirecting_factory = "Missing" in invalid-expression;
}
class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
  static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
  constructor internal() → void
    ;
  static factory a<S extends core::Object = dynamic>() → self::B<self::B::a::S>
    let dynamic #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
    let dynamic #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
}
class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
  constructor •() → void
    ;
}
static method main() → dynamic
  ;
