#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 x_104 = 0.0f;
  float x_104_phi = 0.0f;
  int x_107_phi = 0;
  x_104_phi = -0.5f;
  x_107_phi = 1;
  while (true) {
    float x_126 = 0.0f;
    float x_125 = 0.0f;
    int x_108 = 0;
    float x_105_phi = 0.0f;
    x_104 = x_104_phi;
    int const x_107 = x_107_phi;
    if ((x_107 < 800)) {
    } else {
      break;
    }
    float x_124 = 0.0f;
    float x_125_phi = 0.0f;
    if (((x_107 % 32) == 0)) {
      x_126 = (x_104 + 0.400000006f);
      x_105_phi = x_126;
    } else {
      float const x_118 = *(thirty_two);
      x_125_phi = x_104;
      if (((float(x_107) - (rint(x_118) * floor((float(x_107) / rint(x_118))))) <= 0.01f)) {
        x_124 = (x_104 + 100.0f);
        x_125_phi = x_124;
      }
      x_125 = x_125_phi;
      x_105_phi = x_125;
    }
    float x_105 = 0.0f;
    x_105 = x_105_phi;
    float const x_128 = *(limit);
    if ((float(x_107) >= x_128)) {
      return x_105;
    }
    {
      x_108 = (x_107 + 1);
      x_104_phi = x_105;
      x_107_phi = x_108;
    }
  }
  return x_104;
}

void main_1(constant buf0& x_10, constant buf1& x_16, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  float3 x_54 = 0.0f;
  int x_74_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_56 = x_10.resolution.x;
  float const x_58 = rint((x_56 * 0.125f));
  float const x_60 = (*(tint_symbol_5)).x;
  param = x_60;
  param_1 = x_58;
  float const x_61 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_61;
  float const x_64 = (*(tint_symbol_5)).y;
  param_2 = x_64;
  param_3 = x_58;
  float const x_65 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_65;
  float const x_67 = c.x;
  float3 const x_68 = c;
  x_54 = x_68;
  float const x_70 = x_54.y;
  c.z = (x_67 + x_70);
  x_74_phi = 0;
  while (true) {
    int x_75 = 0;
    int const x_74 = x_74_phi;
    if ((x_74 < 3)) {
    } else {
      break;
    }
    int const x_80_save = x_74;
    float const x_81 = c[x_80_save];
    if ((x_81 >= 1.0f)) {
      float const x_86 = x_16.injectionSwitch.x;
      float const x_88 = x_16.injectionSwitch.y;
      if ((x_86 > x_88)) {
        discard_fragment();
      }
      float const x_92 = c[x_80_save];
      float const x_93 = c[x_80_save];
      c[x_80_save] = (x_92 * x_93);
    }
    {
      x_75 = (x_74 + 1);
      x_74_phi = x_75;
    }
  }
  float3 const x_95 = c;
  float3 const x_97 = normalize(fabs(x_95));
  *(tint_symbol_6) = float4(x_97.x, x_97.y, x_97.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_16 [[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_10, x_16, &(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;
}

