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

float fx_(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float const x_50 = (*(tint_symbol_5)).y;
  if ((x_50 >= 0.0f)) {
    float const x_55 = x_7.injectionSwitch.y;
    return x_55;
  }
  while (true) {
    if (true) {
    } else {
      break;
    }
    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return 0.0f;
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  float x2 = 0.0f;
  float B = 0.0f;
  float k0 = 0.0f;
  x2 = 1.0f;
  B = 1.0f;
  float const x_34 = fx_(x_7, tint_symbol_7, tint_symbol_8);
  *(tint_symbol_8) = float4(x_34, 0.0f, 0.0f, 1.0f);
  while (true) {
    float const x_40 = x2;
    if ((x_40 > 2.0f)) {
    } else {
      break;
    }
    float const x_43 = fx_(x_7, tint_symbol_7, tint_symbol_8);
    float const x_44 = fx_(x_7, tint_symbol_7, tint_symbol_8);
    k0 = (x_43 - x_44);
    float const x_46 = k0;
    B = x_46;
    float const x_47 = B;
    x2 = x_47;
  }
  return;
}

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

