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

extension BestCom<T extends core::num* = core::num*> on core::Iterable<T*>* {
  method best = self::BestCom|best;
  tearoff best = self::BestCom|get#best;
}
extension BestList<T extends core::Object* = dynamic> on core::List<T*>* {
  method best = self::BestList|best;
  tearoff best = self::BestList|get#best;
}
extension BestSpec on core::List<core::num*>* {
  method best = self::BestSpec|best;
  tearoff best = self::BestSpec|get#best;
}
static method BestCom|best<T extends core::num* = core::num*>(final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
  return null;
static method BestCom|get#best<T extends core::num* = core::num*>(final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
  return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
static method BestList|best<T extends core::Object* = dynamic>(final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
  return null;
static method BestList|get#best<T extends core::Object* = dynamic>(final core::List<self::BestList|get#best::T*>* #this) → () →* self::BestList|get#best::T*
  return () → self::BestList|get#best::T* => self::BestList|best<self::BestList|get#best::T*>(#this);
static method BestSpec|best(final core::List<core::num*>* #this) → core::num*
  return null;
static method BestSpec|get#best(final core::List<core::num*>* #this) → () →* core::num*
  return () → core::num* => self::BestSpec|best(#this);
static method main() → dynamic {
  core::List<core::int*>* x;
  core::int* v = self::BestList|best<core::int*>(x);
  core::List<core::num*>* y;
  core::num* w = self::BestSpec|best(y);
}
