#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 float* const tint_symbol_3, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float lv = 0.0f;
  float x_43 = 0.0f;
  int GLF_live5r = 0;
  int GLF_live5_looplimiter6 = 0;
  float const x_45 = x_7.injectionSwitch.y;
  if ((1.0f > x_45)) {
    float const x_50 = *(tint_symbol_3);
    x_43 = fabs(x_50);
  } else {
    x_43 = 260.0f;
  }
  float const x_52 = x_43;
  lv = x_52;
  float const x_53 = lv;
  if ((int(x_53) < 250)) {
    float const x_58 = lv;
    if ((int(x_58) < 180)) {
      float const x_64 = lv;
      float const x_65 = clamp(x_64, 1.0f, 1.0f);
    } else {
      float const x_67 = (*(tint_symbol_4)).y;
      if ((x_67 < 0.0f)) {
        float const x_71 = lv;
        if ((int(x_71) < 210)) {
          while (true) {
            {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        while (true) {
          if (true) {
          } else {
            break;
          }
          int const x_11 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          int const x_12 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
        }
      }
    }
  }
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float* const tint_symbol_7, thread float4* const tint_symbol_8) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(x_7, tint_symbol_7, tint_symbol_6, tint_symbol_8);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_8)};
  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_9 = 0.0f;
  thread float tint_symbol_10 = 0.0f;
  thread float4 tint_symbol_11 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, gl_FragCoord_param, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

