#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[4];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
  float4x3 m43 = float4x3(0.0f);
  tint_array_wrapper sums = {};
  int i = 0;
  int a = 0;
  int x_67_phi = 0;
  float const x_44 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float3 const x_48 = float3(0.0f, 0.0f, 0.0f);
  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
  int const x_51 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_53 = x_8.x_GLF_uniform_int_values.arr[0].el;
  float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
  m43[x_51][x_53] = x_55;
  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_62 = x_6.x_GLF_uniform_float_values.arr[0].el;
  tint_array_wrapper const tint_symbol_3 = {.arr={{.el=x_58}, {.el=x_60}, {.el=x_62}}};
  sums = tint_symbol_3;
  int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
  i = x_65;
  x_67_phi = x_65;
  while (true) {
    int const x_67 = x_67_phi;
    int const x_73 = x_8.x_GLF_uniform_int_values.arr[3].el;
    if ((x_67 < x_73)) {
    } else {
      break;
    }
    int const x_77 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_79 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_81 = m43[x_67][x_79];
    float const x_83 = sums.arr[x_77].el;
    sums.arr[x_77].el = (x_83 + x_81);
    {
      int const x_68 = as_type<int>((as_type<uint>(x_67) + as_type<uint>(1)));
      i = x_68;
      x_67_phi = x_68;
    }
  }
  int const x_87 = x_8.x_GLF_uniform_int_values.arr[1].el;
  if ((x_87 == 1)) {
    a = 4;
    int const x_92 = x_8.x_GLF_uniform_int_values.arr[2].el;
    int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_96 = m43[4][x_94];
    float const x_98 = sums.arr[x_92].el;
    sums.arr[x_92].el = (x_98 + x_96);
  }
  int const x_102 = x_8.x_GLF_uniform_int_values.arr[1].el;
  float const x_104 = sums.arr[x_102].el;
  int const x_106 = x_8.x_GLF_uniform_int_values.arr[0].el;
  float const x_108 = sums.arr[x_106].el;
  float const x_111 = x_6.x_GLF_uniform_float_values.arr[2].el;
  if (((x_104 + x_108) == x_111)) {
    int const x_117 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_120 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_123 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_126 = x_8.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_117), float(x_120), float(x_123), float(x_126));
  } else {
    int const x_130 = x_8.x_GLF_uniform_int_values.arr[1].el;
    float const x_131 = float(x_130);
    *(tint_symbol_5) = float4(x_131, x_131, x_131, x_131);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(x_6, x_8, &(tint_symbol_6));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_4;
}

