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

class E extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E> values = #C10;
  enum-element static const field self::E a = #C3;
  enum-element static const field self::E b = #C6;
  enum-element static const field self::E c = #C9;
  const constructor •(core::int #index, core::String #name) → self::E
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
}
class PrimitiveEquals extends core::Object /*hasConstConstructor*/  {
  final field core::int field;
  const constructor •(core::int field) → self::PrimitiveEquals
    : self::PrimitiveEquals::field = field, super core::Object::•()
    ;
}
class NonPrimitiveEquals extends core::Object /*hasConstConstructor*/  {
  final field core::int field;
  const constructor •(core::int field) → self::NonPrimitiveEquals
    : self::NonPrimitiveEquals::field = field, super core::Object::•()
    ;
  get hashCode() → core::int
    return this.{self::NonPrimitiveEquals::field}{core::int}.{core::num::hashCode}{core::int};
  operator ==(core::Object other) → core::bool {
    if(core::identical(this, other))
      return true;
    return other is{ForNonNullableByDefault} self::NonPrimitiveEquals && this.{self::NonPrimitiveEquals::field}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::NonPrimitiveEquals}.{self::NonPrimitiveEquals::field}{core::int};
  }
}
static method switchStatement(dynamic o) → dynamic {
  #L1:
  {
    final synthesized dynamic #0#0 = o;
    late final synthesized core::int #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int};
    dynamic #t1;
    {
      lowered hoisted dynamic a#case#0;
      lowered hoisted dynamic a#case#1;
      if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t2 = a#case#0 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && a#case#0{dynamic}.>(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t3 = #t1 = a#case#0 in true) || #0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C7 && (let final dynamic #t4 = a#case#1 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} in true) && a#case#1{dynamic}.<(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t5 = #t1 = a#case#1 in true)) {
        dynamic a = #t1{dynamic};
        {
          core::print(a);
          break #L1;
        }
      }
    }
    {
      hoisted dynamic a;
      if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t6 = a = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
        {
          core::print(a);
        }
      }
    }
  }
}
static method switchStatementWithLabel(dynamic o) → dynamic {
  #L2:
  {
    final synthesized dynamic #0#0 = o;
    late final synthesized core::int #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int};
    dynamic #t7;
    {
      lowered hoisted dynamic a#case#0;
      lowered hoisted dynamic a#case#1;
      if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t8 = a#case#0 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && a#case#0{dynamic}.>(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t9 = #t7 = a#case#0 in true) || #0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C7 && (let final dynamic #t10 = a#case#1 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} in true) && a#case#1{dynamic}.<(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t11 = #t7 = a#case#1 in true)) {
        dynamic a = #t7{dynamic};
        {
          core::print(a);
          break #L2;
        }
      }
    }
    {
      hoisted dynamic a;
      if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t12 = a = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
        {
          core::print(a);
          break #L2;
        }
      }
    }
    {
      if(#C4 =={core::num::==}{(core::Object) → core::bool} #0#0) {
        {
          core::print(1);
        }
      }
    }
  }
}
static method switchStatementWithContinue(dynamic o) → dynamic {
  #L3:
  {
    core::int #t13 = 1.{core::int::unary-}(){() → core::int};
    final synthesized dynamic #0#0 = o;
    late final synthesized core::int #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int};
    dynamic #t14;
    #L4:
    {
      {
        lowered hoisted dynamic a#case#0;
        lowered hoisted dynamic a#case#1;
        if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t15 = a#case#0 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && a#case#0{dynamic}.>(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t16 = #t14 = a#case#0 in true) || #0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C7 && (let final dynamic #t17 = a#case#1 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} in true) && a#case#1{dynamic}.<(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t18 = #t14 = a#case#1 in true)) {
          dynamic a = #t14{dynamic};
          {
            core::print(a);
            break #L3;
          }
        }
      }
      {
        hoisted dynamic a;
        if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t19 = a = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
          {
            core::print(a);
            #t13 = 0;
            break #L4;
          }
        }
      }
      {
        if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
          {
            core::print(o);
            break #L3;
          }
        }
      }
      {
        if(#C4 =={core::num::==}{(core::Object) → core::bool} #0#0) {
          #t13 = 0;
          break #L4;
        }
      }
      {
        if(#C7 =={core::num::==}{(core::Object) → core::bool} #0#0) {
          #t13 = 1;
          break #L4;
        }
      }
    }
    switch(#t13) {
      #L5:
      case #C1:
        {
          {
            core::print(1);
            continue #L6;
          }
        }
      #L6:
      case #C4:
        {
          {
            core::print(2);
          }
        }
    }
  }
}
static method switchStatementWithContinueNested(dynamic o1, dynamic o2) → dynamic {
  #L7:
  {
    core::int #t20 = 1.{core::int::unary-}(){() → core::int};
    final synthesized dynamic #2#0 = o1;
    #L8:
    {
      {
        hoisted dynamic a;
        if(#2#0 is{ForNonNullableByDefault} core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t21 = a = #2#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)) {
          {
            core::print(a);
            break #L7;
          }
        }
      }
      {
        hoisted dynamic a;
        if(#2#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #2#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t22 = a = #2#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
          {
            core::print(a);
            #L9:
            {
              core::int #t23 = 1.{core::int::unary-}(){() → core::int};
              final synthesized dynamic #0#0 = o2;
              late final synthesized core::int #0#2 = #0#0{core::List<dynamic>}.{core::List::length}{core::int};
              dynamic #t24;
              #L10:
              {
                {
                  lowered hoisted dynamic a#case#0;
                  lowered hoisted dynamic a#case#1;
                  if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t25 = a#case#0 = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && a#case#0{dynamic}.>(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t26 = #t24 = a#case#0 in true) || #0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#2 =={core::num::==}{(core::Object) → core::bool} #C7 && (let final dynamic #t27 = a#case#1 = #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} in true) && a#case#1{dynamic}.<(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t28 = #t24 = a#case#1 in true)) {
                    dynamic a = #t24{dynamic};
                    {
                      core::print(a);
                      break #L9;
                    }
                  }
                }
                {
                  hoisted dynamic a;
                  if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t29 = a = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
                    {
                      core::print(a);
                      #t20 = 1;
                      break #L8;
                    }
                  }
                }
                {
                  if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
                    {
                      core::print(o2);
                      #t23 = 0;
                      break #L10;
                    }
                  }
                }
                {
                  if(#C4 =={core::num::==}{(core::Object) → core::bool} #0#0) {
                    #t23 = 0;
                    break #L10;
                  }
                }
                {
                  if(#C7 =={core::num::==}{(core::Object) → core::bool} #0#0) {
                    #t23 = 1;
                    break #L10;
                  }
                }
              }
              switch(#t23) {
                #L11:
                case #C1:
                  {
                    {
                      core::print(1);
                      continue #L12;
                    }
                  }
                #L12:
                case #C4:
                  {
                    {
                      core::print(2);
                      #t20 = 0;
                      break #L8;
                    }
                  }
              }
            }
            break #L7;
          }
        }
      }
      {
        if(#C1 =={core::num::==}{(core::Object) → core::bool} #2#0) {
          {
            core::print(o1);
            break #L7;
          }
        }
      }
      {
        if(#C4 =={core::num::==}{(core::Object) → core::bool} #2#0) {
          #t20 = 0;
          break #L8;
        }
      }
      {
        if(#C7 =={core::num::==}{(core::Object) → core::bool} #2#0) {
          #t20 = 1;
          break #L8;
        }
      }
    }
    switch(#t20) {
      #L13:
      case #C1:
        {
          {
            core::print(1);
            continue #L14;
          }
        }
      #L14:
      case #C4:
        {
          {
            core::print(2);
            #L15:
            {
              core::int #t30 = 1.{core::int::unary-}(){() → core::int};
              final synthesized dynamic #1#0 = o2;
              late final synthesized core::int #1#2 = #1#0{core::List<dynamic>}.{core::List::length}{core::int};
              dynamic #t31;
              #L16:
              {
                {
                  lowered hoisted dynamic a#case#0;
                  lowered hoisted dynamic a#case#1;
                  if(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#2 =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t32 = a#case#0 = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && a#case#0{dynamic}.>(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t33 = #t31 = a#case#0 in true) || #1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#2 =={core::num::==}{(core::Object) → core::bool} #C7 && (let final dynamic #t34 = a#case#1 = #1#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} in true) && a#case#1{dynamic}.<(5) as{TypeError,ForNonNullableByDefault} core::bool && (let final dynamic #t35 = #t31 = a#case#1 in true)) {
                    dynamic a = #t31{dynamic};
                    {
                      core::print(a);
                      break #L15;
                    }
                  }
                }
                {
                  hoisted dynamic a;
                  if(#1#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #1#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t36 = a = #1#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
                    {
                      core::print(a);
                      continue #L14;
                    }
                  }
                }
                {
                  if(#C1 =={core::num::==}{(core::Object) → core::bool} #1#0) {
                    {
                      core::print(o2);
                      #t30 = 0;
                      break #L16;
                    }
                  }
                }
                {
                  if(#C4 =={core::num::==}{(core::Object) → core::bool} #1#0) {
                    #t30 = 0;
                    break #L16;
                  }
                }
                {
                  if(#C7 =={core::num::==}{(core::Object) → core::bool} #1#0) {
                    #t30 = 1;
                    break #L16;
                  }
                }
              }
              switch(#t30) {
                #L17:
                case #C1:
                  {
                    {
                      core::print(1);
                      continue #L18;
                    }
                  }
                #L18:
                case #C4:
                  {
                    {
                      core::print(2);
                      continue #L13;
                    }
                  }
              }
            }
          }
        }
    }
  }
}
static method switchStatementEnum(self::E o) → dynamic {
  #L19:
  switch(o) /*isExplicitlyExhaustive*/ {
    #L20:
    case #C3:
      {
        core::print("a");
        break #L19;
      }
    #L21:
    case #C6:
      {
        core::print("b");
        break #L19;
      }
    #L22:
    case #C9:
      {
        core::print("c");
        break #L19;
      }
    #L23:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch statement with a non-nullable type.");
  }
}
static method switchStatementEnumWithGuard(self::E o) → dynamic {
  #L24:
  {
    final synthesized self::E #0#0 = o;
    {
      if(#C3 =={core::Object::==}{(core::Object) → core::bool} #0#0 && true) {
        {
          core::print("a");
          break #L24;
        }
      }
    }
    {
      if(#C6 =={core::Object::==}{(core::Object) → core::bool} #0#0) {
        {
          core::print("b");
          break #L24;
        }
      }
    }
    {
      if(true) {
      }
    }
    throw new _in::ReachabilityError::•("`null` encountered as case in a switch statement with a non-nullable type.");
  }
}
static method switchStatementEnumWithLabel(self::E o) → dynamic {
  #L25:
  switch(o) /*isExplicitlyExhaustive*/ {
    #L26:
    case #C3:
      {
        core::print("a");
        break #L25;
      }
    #L27:
    case #C6:
      {
        core::print("b");
        break #L25;
      }
    #L28:
    case #C9:
      {
        core::print("c");
        break #L25;
      }
    #L29:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch statement with a non-nullable type.");
  }
}
static method switchStatementEnumWithContinue(self::E o) → dynamic {
  #L30:
  switch(o) /*isExplicitlyExhaustive*/ {
    #L31:
    case #C3:
      {
        core::print("a");
        continue #L32;
      }
    #L32:
    case #C6:
      {
        core::print("b");
        continue #L33;
      }
    #L33:
    case #C9:
      {
        core::print("c");
        break #L30;
      }
    #L34:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch statement with a non-nullable type.");
  }
}
static method switchStatementPrimitiveEquals(dynamic o) → dynamic {
  #L35:
  switch(o) {
    #L36:
    case #C11:
      {
        core::print("a");
        break #L35;
      }
    #L37:
    case #C12:
      {
        core::print("b");
      }
  }
}
static method switchStatementNonPrimitiveEquals(dynamic o) → dynamic {
  #L38:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#C13 =={self::NonPrimitiveEquals::==}{(core::Object) → core::bool} #0#0) {
        {
          core::print("a");
          break #L38;
        }
      }
    }
    {
      if(#C14 =={self::NonPrimitiveEquals::==}{(core::Object) → core::bool} #0#0) {
        {
          core::print("b");
        }
      }
    }
  }
}
static method switchExpression(dynamic o) → dynamic {
  return block {
    dynamic #t37;
    final synthesized dynamic #0#0 = o;
    #L39:
    {
      {
        hoisted dynamic a;
        if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C4 && (let final dynamic #t38 = a = #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true)) {
          #t37 = a;
          break #L39;
        }
      }
      {
        hoisted dynamic a;
        if(#0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && (let final dynamic #t39 = a = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic} in true)) {
          #t37 = a;
          break #L39;
        }
      }
      {
        if(true) {
          #t37 = null;
          break #L39;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t37;
}
static method switchExpressionEnum(self::E o) → dynamic {
  return block {
    core::int #t40;
    #L40:
    switch(o) /*isExplicitlyExhaustive*/ {
      #L41:
      case #C3:
        {
          #t40 = 0;
          break #L40;
        }
      #L42:
      case #C6:
        {
          #t40 = 1;
          break #L40;
        }
      #L43:
      case #C9:
        {
          #t40 = 2;
          break #L40;
        }
      #L44:
      default:
        throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t40;
}
static method switchExpressionEnumWithGuard(self::E o) → dynamic {
  return block {
    core::int #t41;
    final synthesized self::E #0#0 = o;
    #L45:
    {
      {
        if(#C3 =={core::Object::==}{(core::Object) → core::bool} #0#0 && true) {
          #t41 = 0;
          break #L45;
        }
      }
      {
        if(#C6 =={core::Object::==}{(core::Object) → core::bool} #0#0) {
          #t41 = 1;
          break #L45;
        }
      }
      {
        if(true) {
          #t41 = 2;
          break #L45;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t41;
}
static method switchExpressionPrimitiveEquals(dynamic o) → dynamic {
  return block {
    core::int #t42;
    final synthesized dynamic #0#0 = o;
    #L46:
    {
      {
        if(#C11 =={core::Object::==}{(core::Object) → core::bool} #0#0) {
          #t42 = 0;
          break #L46;
        }
      }
      {
        if(#C12 =={core::Object::==}{(core::Object) → core::bool} #0#0) {
          #t42 = 1;
          break #L46;
        }
      }
      {
        if(true) {
          #t42 = 2;
          break #L46;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t42;
}
static method switchExpressionNonPrimitiveEquals(dynamic o) → dynamic {
  return block {
    core::int #t43;
    final synthesized dynamic #0#0 = o;
    #L47:
    {
      {
        if(#C13 =={self::NonPrimitiveEquals::==}{(core::Object) → core::bool} #0#0) {
          #t43 = 0;
          break #L47;
        }
      }
      {
        if(#C14 =={self::NonPrimitiveEquals::==}{(core::Object) → core::bool} #0#0) {
          #t43 = 1;
          break #L47;
        }
      }
      {
        if(true) {
          #t43 = 2;
          break #L47;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t43;
}
static method switchStatementSymbol(core::Symbol s) → dynamic {
  #L48:
  {
    final synthesized core::Symbol #0#0 = s;
    {
      if(#C15 =={core::Symbol::==}{(core::Object) → core::bool} #0#0) {
        {
          return 0;
        }
      }
    }
    {
      if(#C16 =={core::Symbol::==}{(core::Object) → core::bool} #0#0) {
        {
          return 1;
        }
      }
    }
    {
      {
        {
          return 2;
        }
      }
    }
  }
}
static method switchExpressionSymbol(core::Symbol s) → dynamic {
  return block {
    core::int #t44;
    final synthesized core::Symbol #0#0 = s;
    #L49:
    {
      {
        if(#C15 =={core::Symbol::==}{(core::Object) → core::bool} #0#0) {
          #t44 = 0;
          break #L49;
        }
      }
      {
        if(#C16 =={core::Symbol::==}{(core::Object) → core::bool} #0#0) {
          #t44 = 1;
          break #L49;
        }
      }
      {
        if(true) {
          #t44 = 2;
          break #L49;
        }
      }
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type.");
    }
  } =>#t44;
}

constants  {
  #C1 = 0
  #C2 = "a"
  #C3 = self::E {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "b"
  #C6 = self::E {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "c"
  #C9 = self::E {index:#C7, _name:#C8}
  #C10 = <self::E*>[#C3, #C6, #C9]
  #C11 = self::PrimitiveEquals {field:#C1}
  #C12 = self::PrimitiveEquals {field:#C4}
  #C13 = self::NonPrimitiveEquals {field:#C1}
  #C14 = self::NonPrimitiveEquals {field:#C4}
  #C15 = #a
  #C16 = #b
}


Constructor coverage from constants:
org-dartlang-testcase:///switch_encoding.dart:
- E. (from org-dartlang-testcase:///switch_encoding.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- PrimitiveEquals. (from org-dartlang-testcase:///switch_encoding.dart:10:9)
- NonPrimitiveEquals. (from org-dartlang-testcase:///switch_encoding.dart:16:9)
