#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct buf1 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_144 = i;
    if ((x_144 < 800)) {
    } else {
      break;
    }
    int const x_147 = i;
    if (((x_147 % 32) == 0)) {
      float const x_153 = result;
      result = (x_153 + 0.400000006f);
    } else {
      int const x_155 = i;
      float const x_157 = *(thirty_two);
      if (((float(x_155) - (rint(x_157) * floor((float(x_155) / rint(x_157))))) <= 0.01f)) {
        float const x_163 = result;
        result = (x_163 + 100.0f);
      }
    }
    int const x_165 = i;
    float const x_167 = *(limit);
    if ((float(x_165) >= x_167)) {
      float const x_171 = result;
      return x_171;
    }
    {
      int const x_172 = i;
      i = (x_172 + 1);
    }
  }
  float const x_174 = result;
  return x_174;
}

void main_1(constant buf0& x_13, constant buf1& x_19, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  float3 x_61 = 0.0f;
  int i_1 = 0;
  float j = 0.0f;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_63 = x_13.resolution.x;
  thirty_two_1 = rint((x_63 / 8.0f));
  float const x_67 = (*(tint_symbol_5)).x;
  param = x_67;
  float const x_68 = thirty_two_1;
  param_1 = x_68;
  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  float const x_72 = (*(tint_symbol_5)).y;
  param_2 = x_72;
  float const x_73 = thirty_two_1;
  param_3 = x_73;
  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  float const x_77 = c.x;
  if (true) {
    float3 const x_81 = c;
    x_61 = x_81;
  } else {
    float3 const x_82 = c;
    float const x_84 = x_19.injectionSwitch.x;
    x_61 = (x_82 * x_84);
  }
  float const x_87 = x_61.y;
  c.z = (x_77 + x_87);
  i_1 = 0;
  while (true) {
    int const x_94 = i_1;
    if ((x_94 < 3)) {
    } else {
      break;
    }
    int const x_97 = i_1;
    float const x_99 = c[x_97];
    if ((x_99 >= 1.0f)) {
      int const x_103 = i_1;
      int const x_104 = i_1;
      float const x_106 = c[x_104];
      int const x_107 = i_1;
      float const x_109 = c[x_107];
      c[x_103] = (x_106 * x_109);
    }
    j = 0.0f;
    while (true) {
      float const x_117 = x_19.injectionSwitch.x;
      float const x_119 = x_19.injectionSwitch.y;
      if ((x_117 > x_119)) {
      } else {
        break;
      }
      float const x_122 = j;
      float const x_124 = x_19.injectionSwitch.x;
      if ((x_122 >= x_124)) {
        break;
      }
      float const x_128 = j;
      j = (x_128 + 1.0f);
    }
    {
      int const x_130 = i_1;
      i_1 = (x_130 + 1);
    }
  }
  float3 const x_132 = c;
  float3 const x_134 = normalize(fabs(x_132));
  *(tint_symbol_6) = float4(x_134.x, x_134.y, x_134.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_19 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_13, x_19, &(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;
}

