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

typedef MyList<T extends core::num> = core::List<T>;
static method main() → dynamic {
  self::expect(true, #C1);
  self::expect(false, #C2);
  self::expect(true, core::identical(#C4, #C4));
  self::expect(false, core::identical(#C4, #C6));
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
  core::bool v4 = core::identical(v1, v2);
  core::bool v5 = core::identical(v1, v3);
  self::expect(true, v4);
  self::expect(false, v5);
  self::expect(true, core::identical(v1, v2));
  self::expect(false, core::identical(v1, v3));
}
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-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
  return core::List::•<self::_#MyList#new#tearOff::T>(length);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);

constants  {
  #C1 = true
  #C2 = false
  #C3 = constructor-tearoff core::List::filled
  #C4 = instantiation #C3 <core::num*>
  #C5 = static-tearoff self::_#MyList#filled#tearOff
  #C6 = instantiation #C5 <core::num*>
  #C7 = null
}
