#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)]];
};

void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int odd_index = 0;
  int even_index = 0;
  int j = 0;
  int ll = 0;
  bool x_59 = false;
  bool x_60_phi = false;
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_53 = (*(tint_symbol_6)).x;
  bool const x_54 = (x_53 < 128.0f);
  x_60_phi = x_54;
  if (x_54) {
    float const x_58 = (*(tint_symbol_6)).y;
    x_59 = (x_58 < 128.0f);
    x_60_phi = x_59;
  }
  bool const x_60 = x_60_phi;
  if (x_60) {
    return;
  }
  odd_index = 0;
  while (true) {
    int const x_11 = odd_index;
    if ((x_11 <= 1)) {
    } else {
      break;
    }
    float const x_70 = (*(tint_symbol_5)).x;
    (*(tint_symbol_5)).x = (x_70 + 0.25f);
    int const x_12 = odd_index;
    odd_index = (x_12 + 1);
  }
  even_index = 1;
  while (true) {
    int const x_14 = even_index;
    if ((x_14 >= 0)) {
    } else {
      break;
    }
    float const x_80 = (*(tint_symbol_5)).x;
    (*(tint_symbol_5)).x = (x_80 + 0.25f);
    float const x_84 = x_8.injectionSwitch.x;
    float const x_86 = x_8.injectionSwitch.y;
    if ((x_84 > x_86)) {
      continue;
    }
    int const x_15 = even_index;
    if ((x_15 >= 1)) {
      discard_fragment();
    }
    j = 1;
    while (true) {
      if (true) {
      } else {
        break;
      }
      int const x_16 = ll;
      if ((x_16 >= 3)) {
        break;
      }
      int const x_17 = ll;
      ll = (x_17 + 1);
      int const x_19 = j;
      if ((as_type<uint>(x_19) < 1u)) {
        {
          int const x_20 = j;
          j = (x_20 + 1);
        }
        continue;
      }
      float const x_106 = x_8.injectionSwitch.x;
      float const x_108 = x_8.injectionSwitch.y;
      if ((x_106 > x_108)) {
        break;
      }
      {
        int const x_20 = j;
        j = (x_20 + 1);
      }
    }
    float const x_113 = x_8.injectionSwitch.x;
    float const x_115 = x_8.injectionSwitch.y;
    if ((x_113 > x_115)) {
      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    }
    int const x_22 = even_index;
    even_index = (x_22 - 1);
  }
  return;
}

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

