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

typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
extension StaticType<T extends core::Object? = dynamic> on T% {
  method expectStaticType = self::StaticType|expectStaticType;
  method tearoff expectStaticType = self::StaticType|get#expectStaticType;
}
extension type ET1(core::int id) {
  abstract extension-type-member representation-field get id() → core::int;
  constructor • = self::ET1|constructor#;
  constructor tearoff • = self::ET1|constructor#_#new#tearOff;
}
extension type ET2<T extends core::Object? = dynamic>(T% id) {
  abstract extension-type-member representation-field get id() → T%;
  constructor • = self::ET2|constructor#;
  constructor tearoff • = self::ET2|constructor#_#new#tearOff;
}
extension type ET3(core::int id) {
  abstract extension-type-member representation-field get id() → core::int;
  constructor • = self::ET3|constructor#;
  constructor tearoff • = self::ET3|constructor#_#new#tearOff;
}
extension type ET4<T extends core::Object? = dynamic>(T% id) {
  abstract extension-type-member representation-field get id() → T%;
  constructor • = self::ET4|constructor#;
  constructor tearoff • = self::ET4|constructor#_#new#tearOff;
}
extension type ET5(core::int id) {
  abstract extension-type-member representation-field get id() → core::int;
  constructor n = self::ET5|constructor#n;
  constructor tearoff n = self::ET5|constructor#_#n#tearOff;
}
extension type ET6<T extends core::Object? = dynamic>(T% id) {
  abstract extension-type-member representation-field get id() → T%;
  constructor n = self::ET6|constructor#n;
  constructor tearoff n = self::ET6|constructor#_#n#tearOff;
}
static extension-type-member method ET1|constructor#(core::int id) → self::ET1% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET1|constructor#_#new#tearOff(core::int id) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#(id);
static extension-type-member method ET2|constructor#<T extends core::Object? = dynamic>(self::ET2|constructor#::T% id) → self::ET2<self::ET2|constructor#::T%>% /* erasure=self::ET2|constructor#::T%, declared=! */
  ;
static extension-type-member method ET2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::ET2|constructor#_#new#tearOff::T% id) → self::ET2<self::ET2|constructor#_#new#tearOff::T%>% /* erasure=self::ET2|constructor#_#new#tearOff::T%, declared=! */
  return self::ET2|constructor#<self::ET2|constructor#_#new#tearOff::T%>(id);
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
  return self::ET3|constructor#(id);
static extension-type-member method ET4|constructor#<T extends core::Object? = dynamic>(self::ET4|constructor#::T% id) → self::ET4<self::ET4|constructor#::T%>% /* erasure=self::ET4|constructor#::T%, declared=! */
  ;
static extension-type-member method ET4|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::ET4|constructor#_#new#tearOff::T% id) → self::ET4<self::ET4|constructor#_#new#tearOff::T%>% /* erasure=self::ET4|constructor#_#new#tearOff::T%, declared=! */
  return self::ET4|constructor#<self::ET4|constructor#_#new#tearOff::T%>(id);
static extension-type-member method ET5|constructor#n(core::int id) → self::ET5% /* erasure=core::int, declared=! */
  ;
static extension-type-member method ET5|constructor#_#n#tearOff(core::int id) → self::ET5% /* erasure=core::int, declared=! */
  return self::ET5|constructor#n(id);
static extension-type-member method ET6|constructor#n<T extends core::Object? = dynamic>(self::ET6|constructor#n::T% id) → self::ET6<self::ET6|constructor#n::T%>% /* erasure=self::ET6|constructor#n::T%, declared=! */
  ;
static extension-type-member method ET6|constructor#_#n#tearOff<T extends core::Object? = dynamic>(self::ET6|constructor#_#n#tearOff::T% id) → self::ET6<self::ET6|constructor#_#n#tearOff::T%>% /* erasure=self::ET6|constructor#_#n#tearOff::T%, declared=! */
  return self::ET6|constructor#n<self::ET6|constructor#_#n#tearOff::T%>(id);
static method main() → dynamic
  ;
static extension-member method StaticType|expectStaticType<T extends core::Object? = dynamic, R extends (self::StaticType|expectStaticType::T%) → self::StaticType|expectStaticType::T% = (dynamic) → dynamic>(lowered final self::StaticType|expectStaticType::T% #this) → self::StaticType|expectStaticType::T%
  ;
static extension-member method StaticType|get#expectStaticType<T extends core::Object? = dynamic>(lowered final self::StaticType|get#expectStaticType::T% #this) → <R extends (self::StaticType|get#expectStaticType::T%) → self::StaticType|get#expectStaticType::T% = (dynamic) → dynamic>() → self::StaticType|get#expectStaticType::T%
  return <R extends (self::StaticType|get#expectStaticType::T%) → self::StaticType|get#expectStaticType::T% = (dynamic) → dynamic>() → self::StaticType|get#expectStaticType::T% => self::StaticType|expectStaticType<self::StaticType|get#expectStaticType::T%, R>(#this);
