#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_53 = 0.0f;
  float x_57 = 0.0f;
  float x_58 = 0.0f;
  float x_83 = 0.0f;
  float x_84 = 0.0f;
  float x_124 = 0.0f;
  float x_125 = 0.0f;
  float x_57_phi = 0.0f;
  int x_60_phi = 0;
  float x_83_phi = 0.0f;
  float x_84_phi = 0.0f;
  bool x_85_phi = false;
  float x_87_phi = 0.0f;
  float x_128_phi = 0.0f;
  int x_135_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_47 = x_7.resolution.x;
  float2 const x_48 = float2(1.0f, x_47);
  float const x_50 = rint((x_47 * 0.125f));
  float2 const x_51 = float2(0.0f, -0.5f);
  x_53 = (*(tint_symbol_5)).x;
  switch(0u) {
    default: {
      x_57_phi = -0.5f;
      x_60_phi = 1;
      while (true) {
        float x_70 = 0.0f;
        float x_78 = 0.0f;
        int x_61 = 0;
        float x_58_phi = 0.0f;
        x_57 = x_57_phi;
        int const x_60 = x_60_phi;
        x_83_phi = 0.0f;
        x_84_phi = x_57;
        x_85_phi = false;
        if ((x_60 < 800)) {
        } else {
          break;
        }
        float x_77 = 0.0f;
        float x_78_phi = 0.0f;
        if (((x_60 % 32) == 0)) {
          x_70 = (x_57 + 0.400000006f);
          x_58_phi = x_70;
        } else {
          x_78_phi = x_57;
          if (((float(x_60) - (rint(x_50) * floor((float(x_60) / rint(x_50))))) <= 0.01f)) {
            x_77 = (x_57 + 100.0f);
            x_78_phi = x_77;
          }
          x_78 = x_78_phi;
          x_58_phi = x_78;
        }
        x_58 = x_58_phi;
        if ((float(x_60) >= x_53)) {
          x_83_phi = x_58;
          x_84_phi = x_58;
          x_85_phi = true;
          break;
        }
        {
          x_61 = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
          x_57_phi = x_58;
          x_60_phi = x_61;
        }
      }
      x_83 = x_83_phi;
      x_84 = x_84_phi;
      bool const x_85 = x_85_phi;
      x_87_phi = x_83;
      if (x_85) {
        break;
      }
      x_87_phi = x_84;
      break;
    }
  }
  float x_92 = 0.0f;
  float x_98 = 0.0f;
  float x_99 = 0.0f;
  float x_98_phi = 0.0f;
  int x_101_phi = 0;
  float x_124_phi = 0.0f;
  float x_125_phi = 0.0f;
  bool x_126_phi = false;
  float const x_87 = x_87_phi;
  float4 const x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
  c.x = x_87;
  x_92 = (*(tint_symbol_5)).y;
  switch(0u) {
    default: {
      float4 const x_95 = float4(x_51, 0.0f, x_57);
      float const x_96 = float3(x_48, -0.5f).z;
      x_98_phi = x_96;
      x_101_phi = 1;
      while (true) {
        float x_111 = 0.0f;
        float x_119 = 0.0f;
        int x_102 = 0;
        float x_99_phi = 0.0f;
        x_98 = x_98_phi;
        int const x_101 = x_101_phi;
        x_124_phi = 0.0f;
        x_125_phi = x_98;
        x_126_phi = false;
        if ((x_101 < 800)) {
        } else {
          break;
        }
        float x_118 = 0.0f;
        float x_119_phi = 0.0f;
        if (((x_101 % 32) == 0)) {
          x_111 = (x_98 + 0.400000006f);
          x_99_phi = x_111;
        } else {
          x_119_phi = x_98;
          if (((float(x_101) - (rint(x_50) * floor((float(x_101) / rint(x_50))))) <= 0.01f)) {
            x_118 = (x_98 + 100.0f);
            x_119_phi = x_118;
          }
          x_119 = x_119_phi;
          x_99_phi = x_119;
        }
        x_99 = x_99_phi;
        if ((float(x_101) >= x_92)) {
          x_124_phi = x_99;
          x_125_phi = x_99;
          x_126_phi = true;
          break;
        }
        {
          x_102 = as_type<int>((as_type<uint>(x_101) + as_type<uint>(1)));
          x_98_phi = x_99;
          x_101_phi = x_102;
        }
      }
      x_124 = x_124_phi;
      x_125 = x_125_phi;
      bool const x_126 = x_126_phi;
      x_128_phi = x_124;
      if (x_126) {
        break;
      }
      x_128_phi = x_125;
      break;
    }
  }
  float const x_128 = x_128_phi;
  c.y = x_128;
  float const x_130 = c.x;
  float const x_131 = c.y;
  c.z = (x_130 + x_131);
  x_135_phi = 0;
  while (true) {
    int x_136 = 0;
    int const x_135 = x_135_phi;
    if ((x_135 < 3)) {
    } else {
      break;
    }
    int const x_141_save = x_135;
    float const x_142 = c[x_141_save];
    if ((x_142 >= 1.0f)) {
      float const x_146 = c[x_141_save];
      float const x_147 = c[x_141_save];
      c[x_141_save] = (x_146 * x_147);
    }
    {
      x_136 = as_type<int>((as_type<uint>(x_135) + as_type<uint>(1)));
      x_135_phi = x_136;
    }
  }
  float3 const x_149 = c;
  float3 const x_151 = normalize(fabs(x_149));
  *(tint_symbol_6) = float4(x_151.x, x_151.y, x_151.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;
}

