#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
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_8, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float2 a = 0.0f;
  float3 b = 0.0f;
  bool x_105 = false;
  bool x_111 = false;
  bool x_106_phi = false;
  bool x_112_phi = false;
  a = float2(1.0f, 1.0f);
  b = float3(0.0f, 0.0f, 0.0f);
  float const x_52 = (*(tint_symbol_3)).y;
  if ((int(x_52) < 40)) {
    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
  } else {
    float const x_59 = (*(tint_symbol_3)).y;
    if ((int(x_59) < 60)) {
      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
    } else {
      float const x_66 = (*(tint_symbol_3)).y;
      if ((x_66 < 80.0f)) {
        float const x_72 = a.x;
        float const x_74 = x_8.one;
        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
      } else {
        float const x_82 = (*(tint_symbol_3)).y;
        if ((int(x_82) < 100)) {
          float const x_89 = x_8.one;
          b = cos(float3(x_89, x_89, x_89));
        } else {
          float const x_93 = (*(tint_symbol_3)).y;
          if ((int(x_93) < 500)) {
            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
          }
        }
      }
    }
  }
  float const x_99 = b.x;
  bool const x_100 = (x_99 < 1.019999981f);
  x_106_phi = x_100;
  if (x_100) {
    float const x_104 = b.y;
    x_105 = (x_104 < 1.019999981f);
    x_106_phi = x_105;
  }
  bool const x_106 = x_106_phi;
  x_112_phi = x_106;
  if (x_106) {
    float const x_110 = b.z;
    x_111 = (x_110 < 1.019999981f);
    x_112_phi = x_111;
  }
  bool const x_112 = x_112_phi;
  if (x_112) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, 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_8, 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_8 [[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_8, 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;
}

