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

static method method1(core::List<dynamic> o) → dynamic {
  #L1:
  {
    final synthesized core::List<dynamic> #0#0 = o;
    {
      if(true) {
        {
          core::print(o);
        }
      }
    }
  }
  #L2:
  {
    final synthesized core::List<dynamic> #1#0 = o;
    final const synthesized core::int #1#2 = #C1;
    {
      if(#1#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L3:
  {
    final synthesized core::List<dynamic> #2#0 = o;
    final const synthesized core::int #2#2 = #C1;
    {
      if(#2#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L4:
  {
    final synthesized core::List<dynamic> #3#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(let final dynamic #t1 = a = #3#0.{core::List::sublist}(0){(core::int, [core::int?]) → core::List<dynamic>} in true) {
        {
          core::print(a);
        }
      }
    }
  }
  #L5:
  {
    final synthesized core::List<dynamic> #4#0 = o;
    final const synthesized core::int #4#2 = #C1;
    {
      hoisted core::List<dynamic> a;
      if(#4#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t2 = a = #4#0.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
  #L6:
  {
    final synthesized core::List<dynamic> #5#0 = o;
    synthesized core::int #5#1;
    synthesized core::bool #5#1#isSet = false;
    final const synthesized core::int #5#2 = #C1;
    {
      hoisted core::List<dynamic> a;
      if((#5#1#isSet ?{core::int} #5#1 : let final dynamic #t3 = #5#1#isSet = true in #5#1 = #5#0.{core::List::length}{core::int}).{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t4 = a = #5#0.{core::List::sublist}(0, (#5#1#isSet ?{core::int} #5#1 : let final dynamic #t5 = #5#1#isSet = true in #5#1 = #5#0.{core::List::length}{core::int}).{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
}
static method method2(dynamic o) → dynamic {
  #L7:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is core::List<dynamic>) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L8:
  {
    final synthesized dynamic #1#0 = o;
    final const synthesized core::int #1#3 = #C1;
    {
      if(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L9:
  {
    final synthesized dynamic #2#0 = o;
    final const synthesized core::int #2#3 = #C1;
    {
      if(#2#0 is core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L10:
  {
    final synthesized dynamic #3#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(#3#0 is core::List<dynamic> && (let final dynamic #t6 = a = #3#0{core::List<dynamic>}.{core::List::sublist}(0){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
  #L11:
  {
    final synthesized dynamic #4#0 = o;
    final const synthesized core::int #4#3 = #C1;
    {
      hoisted core::List<dynamic> a;
      if(#4#0 is core::List<dynamic> && #4#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t7 = a = #4#0{core::List<dynamic>}.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
  #L12:
  {
    final synthesized dynamic #5#0 = o;
    synthesized core::int #5#2;
    synthesized core::bool #5#2#isSet = false;
    final const synthesized core::int #5#3 = #C1;
    {
      hoisted core::List<dynamic> a;
      if(#5#0 is core::List<dynamic> && (#5#2#isSet ?{core::int} #5#2 : let final dynamic #t8 = #5#2#isSet = true in #5#2 = #5#0{core::List<dynamic>}.{core::List::length}{core::int}).{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t9 = a = #5#0{core::List<dynamic>}.{core::List::sublist}(0, (#5#2#isSet ?{core::int} #5#2 : let final dynamic #t10 = #5#2#isSet = true in #5#2 = #5#0{core::List<dynamic>}.{core::List::length}{core::int}).{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
}

constants  {
  #C1 = 1
}
