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

import "org-dartlang-testcase:///main_lib.dart";

typedef H<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
static field dynamic H_new = #C1;
static field dynamic H_named = #C2;
static field dynamic H_fact = #C3;
static field dynamic H_redirect = #C4;
static field dynamic F_new = #C5;
static field dynamic F_named = #C6;
static field dynamic F_fact = #C7;
static field dynamic F_redirect = #C8;
static method main() → dynamic {
  self::expect(true, core::identical(self::F_new, mai::F_new_lib));
  self::expect(false, core::identical(self::F_new, mai::F_named_lib));
  self::expect(false, core::identical(self::F_new, mai::F_fact_lib));
  self::expect(false, core::identical(self::F_new, mai::F_redirect_lib));
  self::expect(false, core::identical(self::F_new, mai::G_new_lib));
  self::expect(false, core::identical(self::F_new, mai::G_named_lib));
  self::expect(false, core::identical(self::F_new, mai::G_fact_lib));
  self::expect(false, core::identical(self::F_new, mai::G_redirect_lib));
  self::expect(false, core::identical(self::F_new, self::H_new));
  self::expect(false, core::identical(self::F_new, self::H_named));
  self::expect(false, core::identical(self::F_new, self::H_fact));
  self::expect(false, core::identical(self::F_new, self::H_redirect));
  self::expect(false, core::identical(self::F_named, mai::F_new_lib));
  self::expect(true, core::identical(self::F_named, mai::F_named_lib));
  self::expect(false, core::identical(self::F_named, mai::F_fact_lib));
  self::expect(false, core::identical(self::F_named, mai::F_redirect_lib));
  self::expect(false, core::identical(self::F_named, mai::G_new_lib));
  self::expect(false, core::identical(self::F_named, mai::G_named_lib));
  self::expect(false, core::identical(self::F_named, mai::G_fact_lib));
  self::expect(false, core::identical(self::F_named, mai::G_redirect_lib));
  self::expect(false, core::identical(self::F_named, self::H_new));
  self::expect(false, core::identical(self::F_named, self::H_named));
  self::expect(false, core::identical(self::F_named, self::H_fact));
  self::expect(false, core::identical(self::F_named, self::H_redirect));
  self::expect(false, core::identical(self::F_fact, mai::F_new_lib));
  self::expect(false, core::identical(self::F_fact, mai::F_named_lib));
  self::expect(true, core::identical(self::F_fact, mai::F_fact_lib));
  self::expect(false, core::identical(self::F_fact, mai::F_redirect_lib));
  self::expect(false, core::identical(self::F_fact, mai::G_new_lib));
  self::expect(false, core::identical(self::F_fact, mai::G_named_lib));
  self::expect(false, core::identical(self::F_fact, mai::G_fact_lib));
  self::expect(false, core::identical(self::F_fact, mai::G_redirect_lib));
  self::expect(false, core::identical(self::F_fact, self::H_new));
  self::expect(false, core::identical(self::F_fact, self::H_named));
  self::expect(false, core::identical(self::F_fact, self::H_fact));
  self::expect(false, core::identical(self::F_fact, self::H_redirect));
  self::expect(false, core::identical(self::F_redirect, mai::F_new_lib));
  self::expect(false, core::identical(self::F_redirect, mai::F_named_lib));
  self::expect(false, core::identical(self::F_redirect, mai::F_fact_lib));
  self::expect(true, core::identical(self::F_redirect, mai::F_redirect_lib));
  self::expect(false, core::identical(self::F_redirect, mai::G_new_lib));
  self::expect(false, core::identical(self::F_redirect, mai::G_named_lib));
  self::expect(false, core::identical(self::F_redirect, mai::G_fact_lib));
  self::expect(false, core::identical(self::F_redirect, mai::G_redirect_lib));
  self::expect(false, core::identical(self::F_redirect, self::H_new));
  self::expect(false, core::identical(self::F_redirect, self::H_named));
  self::expect(false, core::identical(self::F_redirect, self::H_fact));
  self::expect(false, core::identical(self::F_redirect, self::H_redirect));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<self::_#H#fact#tearOff::Y%>
  return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
  return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
  return new mai::A::•<self::_#H#new#tearOff::Y%>();
static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<self::_#H#named#tearOff::Y%>
  return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);

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

typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
class A<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[mai::A::redirect]/*isLegacy*/;
  constructor •() → mai::A<mai::A::T%>
    : super core::Object::•()
    ;
  constructor named(mai::A::T% a, [core::int? b = #C9]) → mai::A<mai::A::T%>
    : super core::Object::•()
    ;
  static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#new#tearOff::T%>
    return new mai::A::•<mai::A::_#new#tearOff::T%>();
  static method _#named#tearOff<T extends core::Object? = dynamic>(mai::A::_#named#tearOff::T% a, [core::int? b = #C9]) → mai::A<mai::A::_#named#tearOff::T%>
    return new mai::A::named<mai::A::_#named#tearOff::T%>(a, b);
  static factory fact<T extends core::Object? = dynamic>(mai::A::fact::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::fact::T%>
    return new mai::A::•<mai::A::fact::T%>();
  static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::_#fact#tearOff::T%>
    return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
  static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
    return new mai::A::•<mai::A::redirect::T%>();
  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
    return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
}
static field dynamic F_new_lib = #C5;
static field dynamic F_named_lib = #C6;
static field dynamic F_fact_lib = #C7;
static field dynamic F_redirect_lib = #C8;
static field dynamic G_new_lib = #C11;
static field dynamic G_named_lib = #C12;
static field dynamic G_fact_lib = #C13;
static field dynamic G_redirect_lib = #C14;
static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#new#tearOff::Y%>
  return new mai::A::•<mai::_#F#new#tearOff::Y%>();
static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#F#named#tearOff::Y%>
  return new mai::A::named<mai::_#F#named#tearOff::Y%>(a, b);
static method _#F#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#F#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::_#F#fact#tearOff::Y%>
  return mai::A::fact<mai::_#F#fact#tearOff::Y%>(a, b: b, c: c);
static method _#F#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#F#redirect#tearOff::Y%>
  return mai::A::_#redirect#tearOff<mai::_#F#redirect#tearOff::Y%>();
static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#G#new#tearOff::Y%>
  return new mai::A::•<mai::_#G#new#tearOff::Y%>();
static method _#G#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#G#named#tearOff::Y% a, [core::int? b = #C9]) → mai::A<mai::_#G#named#tearOff::Y%>
  return new mai::A::named<mai::_#G#named#tearOff::Y%>(a, b);
static method _#G#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(mai::_#G#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::_#G#fact#tearOff::Y%>
  return mai::A::fact<mai::_#G#fact#tearOff::Y%>(a, b: b, c: c);
static method _#G#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<mai::_#G#redirect#tearOff::Y%>
  return mai::A::_#redirect#tearOff<mai::_#G#redirect#tearOff::Y%>();

constants  {
  #C1 = static-tearoff self::_#H#new#tearOff
  #C2 = static-tearoff self::_#H#named#tearOff
  #C3 = static-tearoff self::_#H#fact#tearOff
  #C4 = static-tearoff self::_#H#redirect#tearOff
  #C5 = static-tearoff mai::_#F#new#tearOff
  #C6 = static-tearoff mai::_#F#named#tearOff
  #C7 = static-tearoff mai::_#F#fact#tearOff
  #C8 = static-tearoff mai::_#F#redirect#tearOff
  #C9 = null
  #C10 = 42
  #C11 = static-tearoff mai::_#G#new#tearOff
  #C12 = static-tearoff mai::_#G#named#tearOff
  #C13 = static-tearoff mai::_#G#fact#tearOff
  #C14 = static-tearoff mai::_#G#redirect#tearOff
}
