#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[5];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
  int a = 0;
  int b = 0;
  int i = 0;
  int i_1 = 0;
  int i_2 = 0;
  tint_array_wrapper_1 indexable = {};
  int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
  a = x_36;
  int const x_38 = x_6.x_GLF_uniform_int_values.arr[3].el;
  b = x_38;
  int const x_40 = x_6.x_GLF_uniform_int_values.arr[2].el;
  float const x_41 = float(x_40);
  *(tint_symbol_5) = float4(x_41, x_41, x_41, x_41);
  int const x_44 = x_6.x_GLF_uniform_int_values.arr[2].el;
  i = x_44;
  while (true) {
    int const x_49 = i;
    int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
    if ((x_49 < x_51)) {
    } else {
      break;
    }
    int const x_54 = i;
    int const x_56 = x_6.x_GLF_uniform_int_values.arr[3].el;
    if ((x_54 > x_56)) {
      int const x_60 = a;
      a = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
      if (false) {
        int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
        i_1 = x_65;
        while (true) {
          int const x_70 = i_1;
          int const x_72 = x_6.x_GLF_uniform_int_values.arr[0].el;
          if ((x_70 < x_72)) {
          } else {
            break;
          }
          return;
        }
      }
    }
    {
      int const x_75 = i;
      i = as_type<int>((as_type<uint>(x_75) + as_type<uint>(1)));
    }
  }
  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
  i_2 = x_78;
  while (true) {
    int const x_83 = i_2;
    int const x_85 = x_6.x_GLF_uniform_int_values.arr[0].el;
    if ((x_83 < x_85)) {
    } else {
      break;
    }
    int const x_89 = x_6.x_GLF_uniform_int_values.arr[3].el;
    int const x_91 = x_6.x_GLF_uniform_int_values.arr[4].el;
    int const x_93 = b;
    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_89, x_91}};
    indexable = tint_symbol_3;
    int const x_95 = indexable.arr[x_93];
    int const x_96 = a;
    a = as_type<int>((as_type<uint>(x_96) + as_type<uint>(x_95)));
    {
      int const x_98 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_98) + as_type<uint>(1)));
    }
  }
  int const x_100 = a;
  int const x_102 = x_6.x_GLF_uniform_int_values.arr[1].el;
  if ((x_100 == x_102)) {
    int const x_107 = x_6.x_GLF_uniform_int_values.arr[3].el;
    int const x_110 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_113 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_116 = x_6.x_GLF_uniform_int_values.arr[3].el;
    *(tint_symbol_5) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(x_6, &(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;
}

