#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
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) {
  float4x4 m44 = float4x4(0.0f);
  int x_10_phi = 0;
  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
  x_10_phi = 0;
  while (true) {
    int x_9 = 0;
    int x_11_phi = 0;
    int const x_10 = x_10_phi;
    if ((x_10 < 4)) {
    } else {
      break;
    }
    float const x_63 = (*(tint_symbol_5)).y;
    if ((x_63 < 0.0f)) {
      break;
    }
    x_11_phi = 0;
    while (true) {
      int x_8 = 0;
      int const x_11 = x_11_phi;
      if ((x_11 < 4)) {
      } else {
        break;
      }
      {
        float const x_72 = x_7.one;
        int const x_73_save = x_10;
        int const x_73_save_1 = x_11;
        float const x_74 = m44[x_73_save][x_73_save_1];
        m44[x_73_save][x_73_save_1] = (x_74 + x_72);
        x_8 = (x_11 + 1);
        x_11_phi = x_8;
      }
    }
    {
      x_9 = (x_10 + 1);
      x_10_phi = x_9;
    }
  }
  float const x_77 = m44[1].y;
  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  x_79_1.x = (x_77 - 6.0f);
  float4 const x_79 = x_79_1;
  float const x_81 = m44[2].z;
  float4 x_83_1 = x_79;
  x_83_1.w = (x_81 - 11.0f);
  float4 const x_83 = x_83_1;
  *(tint_symbol_6) = x_83;
  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;
}

