#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[2];
};
struct buf0 {
  /* 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[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float arr[5];
};
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, constant buf1& x_9, thread float4* const tint_symbol_5) {
  tint_array_wrapper_2 arr = {};
  int i = 0;
  int j = 0;
  float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_46 = x_6.x_GLF_uniform_float_values.arr[0].el;
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42, x_44, x_46}};
  arr = tint_symbol_3;
  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
  i = x_49;
  j = 0;
  while (true) {
    int const x_54 = i;
    int const x_56 = x_9.x_GLF_uniform_int_values.arr[0].el;
    if ((x_54 < x_56)) {
    } else {
      break;
    }
    int const x_59 = j;
    if ((x_59 < -1)) {
      break;
    }
    int const x_63 = j;
    float const x_65 = arr.arr[x_63];
    arr.arr[x_63] = (x_65 + 1.0f);
    {
      int const x_68 = i;
      i = (x_68 + 1);
      int const x_70 = j;
      j = (x_70 + 1);
    }
  }
  float const x_73 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_75 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float const x_77 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float const x_79 = x_6.x_GLF_uniform_float_values.arr[0].el;
  *(tint_symbol_5) = float4(x_73, x_75, x_77, x_79);
  int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
  i = x_82;
  while (true) {
    int const x_87 = i;
    int const x_89 = x_9.x_GLF_uniform_int_values.arr[0].el;
    if ((x_87 < x_89)) {
    } else {
      break;
    }
    int const x_92 = i;
    float const x_94 = arr.arr[x_92];
    if (!((x_94 == 2.0f))) {
      float const x_99 = x_6.x_GLF_uniform_float_values.arr[1].el;
      *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
    }
    {
      int const x_101 = i;
      i = (x_101 + 1);
    }
  }
  return;
}

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

