#include <metal_stdlib>

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

float func_(constant buf0& x_10, thread float4* const tint_symbol_3) {
  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_3)).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_3);
  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_4, thread float4* const tint_symbol_5) {
  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_4);
    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_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_10, float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(x_10, tint_symbol_6, tint_symbol_7);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_2;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_10, gl_FragCoord_param, &(tint_symbol_8), &(tint_symbol_9));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

