#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float func_(constant buf0& x_10, thread float4* const tint_symbol_5) {
  bool alwaysFalse = false;
  float4 value = 0.0f;
  float2 a = 0.0f;
  int i = 0;
  bool x_121 = false;
  bool x_122_phi = false;
  float const x_71 = (*(tint_symbol_5)).x;
  alwaysFalse = (x_71 < -1.0f);
  bool const x_73 = alwaysFalse;
  if (x_73) {
    float2 const x_76 = a;
    float4 const x_77 = value;
    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
  }
  bool const x_79 = alwaysFalse;
  if (!(x_79)) {
    float2 const x_84 = x_10.injectionSwitch;
    float4 const x_85 = value;
    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
  }
  float4 const x_87 = *(tint_symbol_5);
  float4 const x_89 = value;
  float4 const x_93 = value;
  float2 const x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
  float4 const x_96 = value;
  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
  i = 0;
  while (true) {
    int const x_102 = i;
    float const x_104 = x_10.injectionSwitch.y;
    if ((x_102 < as_type<int>((as_type<uint>(int(x_104)) + as_type<uint>(1))))) {
    } else {
      break;
    }
    int const x_109 = i;
    value.x = float(x_109);
    {
      int const x_112 = i;
      i = as_type<int>((as_type<uint>(x_112) + as_type<uint>(1)));
    }
  }
  float const x_115 = value.x;
  bool const x_116 = (x_115 == 1.0f);
  x_122_phi = x_116;
  if (x_116) {
    float const x_120 = value.y;
    x_121 = (x_120 == 1.0f);
    x_122_phi = x_121;
  }
  bool const x_122 = x_122_phi;
  if (x_122) {
    return 1.0f;
  } else {
    return 0.0f;
  }
  return 0.0f;
}

void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  int count = 0;
  int i_1 = 0;
  count = 0;
  i_1 = 0;
  while (true) {
    int const x_51 = i_1;
    float const x_53 = x_10.injectionSwitch.y;
    if ((x_51 < as_type<int>((as_type<uint>(int(x_53)) + as_type<uint>(1))))) {
    } else {
      break;
    }
    float const x_58 = func_(x_10, tint_symbol_6);
    int const x_60 = count;
    count = as_type<int>((as_type<uint>(x_60) + as_type<uint>(int(x_58))));
    {
      int const x_62 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_62) + as_type<uint>(1)));
    }
  }
  int const x_64 = count;
  if ((x_64 == 2)) {
    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

