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

typedef E<invariant T extends core::Object? = dynamic> = (T%) → T%;
extension Ext<T extends core::Object? = dynamic> on T% {
  method st = self::Ext|st;
  method tearoff st = self::Ext|get#st;
}
static method main() → void {
  self::foo<core::num>(false, 0, 0);
}
static method foo<X extends core::Object? = dynamic>(core::bool test, self::foo::X% a, self::foo::X% b) → void {
  if(!(a is core::int))
    return;
  {
    self::foo::X% c = let final self::foo::X% & core::int /* '%' & '!' = '!' */ #t1 = test ?{self::foo::X% & core::int /* '%' & '!' = '!' */} a{self::foo::X% & core::int /* '%' & '!' = '!' */} : a{self::foo::X% & core::int /* '%' & '!' = '!' */} in block {
      #t1.{core::int::toRadixString}(2){(core::int) → core::String};
      self::Ext|st<self::foo::X%, (self::foo::X%) → self::foo::X%>(#t1);
    } =>#t1;
    {
      self::foo::X% v1 = c{self::foo::X% & core::int /* '%' & '!' = '!' */};
      core::int v2 = c{self::foo::X% & core::int /* '%' & '!' = '!' */};
      self::Ext|get#st<self::foo::X%>(c{self::foo::X% & core::int /* '%' & '!' = '!' */})<(self::foo::X%) → self::foo::X%>;
      c = a{self::foo::X% & core::int /* '%' & '!' = '!' */} as{Unchecked} self::foo::X%;
    }
  }
  if(!(b is core::int))
    return;
  {
    self::foo::X% c = let final self::foo::X% & core::int /* '%' & '!' = '!' */ #t2 = test ?{self::foo::X% & core::int /* '%' & '!' = '!' */} a{self::foo::X% & core::int /* '%' & '!' = '!' */} : b{self::foo::X% & core::int /* '%' & '!' = '!' */} in block {
      #t2.{core::int::toRadixString}(2){(core::int) → core::String};
      self::Ext|st<self::foo::X%, (self::foo::X%) → self::foo::X%>(#t2);
    } =>#t2;
    {
      self::foo::X% v1 = c{self::foo::X% & core::int /* '%' & '!' = '!' */};
      core::int v2 = c{self::foo::X% & core::int /* '%' & '!' = '!' */};
      self::Ext|get#st<self::foo::X%>(c{self::foo::X% & core::int /* '%' & '!' = '!' */})<(self::foo::X%) → self::foo::X%>;
      c = a{self::foo::X% & core::int /* '%' & '!' = '!' */} as{Unchecked} self::foo::X%;
    }
  }
}
static extension-member method Ext|st<T extends core::Object? = dynamic, S extends (self::Ext|st::T%) → self::Ext|st::T% = (dynamic) → dynamic>(lowered final self::Ext|st::T% #this) → void {}
static extension-member method Ext|get#st<T extends core::Object? = dynamic>(lowered final self::Ext|get#st::T% #this) → <S extends (self::Ext|get#st::T%) → self::Ext|get#st::T% = (dynamic) → dynamic>() → void
  return <S extends (self::Ext|get#st::T%) → self::Ext|get#st::T% = (dynamic) → dynamic>() → void => self::Ext|st<self::Ext|get#st::T%, S>(#this);
