#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_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int loop_count = 0;
  loop_count = 0;
  float const x_33 = x_7.injectionSwitch.x;
  float const x_35 = x_7.injectionSwitch.y;
  bool const x_36 = (x_33 > x_35);
  if (x_36) {
    return;
  }
  float const x_40 = (*(tint_symbol_5)).x;
  bool const x_41 = (x_40 < 0.0f);
  while (true) {
    int const x_43 = loop_count;
    if ((x_43 < 100)) {
    } else {
      break;
    }
    if (x_36) {
      break;
    }
    if (x_36) {
      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      if (x_41) {
        return;
      }
    }
    if (x_36) {
      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    }
    if (x_36) {
      return;
    }
    if (x_41) {
      while (true) {
        int const x_63 = loop_count;
        if ((x_63 < 100)) {
        } else {
          break;
        }
        {
          int const x_67 = loop_count;
          loop_count = as_type<int>((as_type<uint>(x_67) + as_type<uint>(1)));
        }
      }
    }
    {
      int const x_69 = loop_count;
      loop_count = as_type<int>((as_type<uint>(x_69) + as_type<uint>(1)));
    }
  }
  int const x_71 = loop_count;
  if ((x_71 >= 100)) {
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[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_7, &(tint_symbol_7), &(tint_symbol_8));
  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;
}

