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

void main_1(constant buf0& x_7, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  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_3)).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_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      if (x_41) {
        return;
      }
    }
    if (x_36) {
      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      *(tint_symbol_4) = 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_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return;
}

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

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

