#include <metal_stdlib>

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

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float x_51 = 0.0f;
  float x_55 = 0.0f;
  float x_56 = 0.0f;
  float x_81 = 0.0f;
  float x_82 = 0.0f;
  float x_118 = 0.0f;
  float x_119 = 0.0f;
  float x_55_phi = 0.0f;
  int x_58_phi = 0;
  float x_81_phi = 0.0f;
  float x_82_phi = 0.0f;
  bool x_83_phi = false;
  float x_85_phi = 0.0f;
  float x_122_phi = 0.0f;
  int x_129_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_47 = x_7.resolution.x;
  float const x_49 = rint((x_47 * 0.125f));
  x_51 = (*(tint_symbol_5)).x;
  switch(0u) {
    default: {
      x_55_phi = -0.5f;
      x_58_phi = 1;
      while (true) {
        float x_68 = 0.0f;
        float x_76 = 0.0f;
        int x_59 = 0;
        float x_56_phi = 0.0f;
        x_55 = x_55_phi;
        int const x_58 = x_58_phi;
        x_81_phi = 0.0f;
        x_82_phi = x_55;
        x_83_phi = false;
        if ((x_58 < 800)) {
        } else {
          break;
        }
        float x_75 = 0.0f;
        float x_76_phi = 0.0f;
        if (((x_58 % 32) == 0)) {
          x_68 = (x_55 + 0.400000006f);
          x_56_phi = x_68;
        } else {
          x_76_phi = x_55;
          if ((fmod(float(x_58), rint(x_49)) <= 0.01f)) {
            x_75 = (x_55 + 100.0f);
            x_76_phi = x_75;
          }
          x_76 = x_76_phi;
          x_56_phi = x_76;
        }
        x_56 = x_56_phi;
        if ((float(x_58) >= x_51)) {
          x_81_phi = x_56;
          x_82_phi = x_56;
          x_83_phi = true;
          break;
        }
        {
          x_59 = (x_58 + 1);
          x_55_phi = x_56;
          x_58_phi = x_59;
        }
      }
      x_81 = x_81_phi;
      x_82 = x_82_phi;
      bool const x_83 = x_83_phi;
      x_85_phi = x_81;
      if (x_83) {
        break;
      }
      x_85_phi = x_82;
      break;
    }
  }
  float x_88 = 0.0f;
  float x_92 = 0.0f;
  float x_93 = 0.0f;
  float x_92_phi = 0.0f;
  int x_95_phi = 0;
  float x_118_phi = 0.0f;
  float x_119_phi = 0.0f;
  bool x_120_phi = false;
  float const x_85 = x_85_phi;
  c.x = x_85;
  x_88 = (*(tint_symbol_5)).y;
  switch(0u) {
    default: {
      x_92_phi = -0.5f;
      x_95_phi = 1;
      while (true) {
        float x_113 = 0.0f;
        float x_112 = 0.0f;
        int x_96 = 0;
        float x_93_phi = 0.0f;
        x_92 = x_92_phi;
        int const x_95 = x_95_phi;
        x_118_phi = 0.0f;
        x_119_phi = x_92;
        x_120_phi = false;
        if ((x_95 < 800)) {
        } else {
          break;
        }
        float x_111 = 0.0f;
        float x_112_phi = 0.0f;
        if (((x_95 % 32) == 0)) {
          x_113 = (x_92 + 0.400000006f);
          x_93_phi = x_113;
        } else {
          x_112_phi = x_92;
          if ((fmod(float(x_95), rint(x_49)) <= 0.01f)) {
            x_111 = (x_92 + 100.0f);
            x_112_phi = x_111;
          }
          x_112 = x_112_phi;
          x_93_phi = x_112;
        }
        x_93 = x_93_phi;
        if ((float(x_95) >= x_88)) {
          x_118_phi = x_93;
          x_119_phi = x_93;
          x_120_phi = true;
          break;
        }
        {
          x_96 = (x_95 + 1);
          x_92_phi = x_93;
          x_95_phi = x_96;
        }
      }
      x_118 = x_118_phi;
      x_119 = x_119_phi;
      bool const x_120 = x_120_phi;
      x_122_phi = x_118;
      if (x_120) {
        break;
      }
      x_122_phi = x_119;
      break;
    }
  }
  float const x_122 = x_122_phi;
  c.y = x_122;
  float const x_124 = c.x;
  float const x_125 = c.y;
  c.z = (x_124 + x_125);
  x_129_phi = 0;
  while (true) {
    int x_130 = 0;
    int const x_129 = x_129_phi;
    if ((x_129 < 3)) {
    } else {
      break;
    }
    int const x_135_save = x_129;
    float const x_136 = c[x_135_save];
    if ((x_136 >= 1.0f)) {
      float const x_140 = c[x_135_save];
      float const x_141 = c[x_135_save];
      c[x_135_save] = (x_140 * x_141);
    }
    {
      x_130 = (x_129 + 1);
      x_129_phi = x_130;
    }
  }
  float3 const x_143 = c;
  float3 const x_145 = normalize(fabs(x_143));
  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
  return;
}

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

