#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[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float arr[3];
};
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_9, thread float4* const tint_symbol_5) {
  tint_array_wrapper_2 arr = {};
  int a = 0;
  bool x_69 = false;
  bool x_79 = false;
  bool x_70_phi = false;
  bool x_80_phi = false;
  float const x_34 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_34, x_36, x_38}};
  arr = tint_symbol_3;
  a = 0;
  while (true) {
    int const x_44 = a;
    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
    if ((x_44 <= x_46)) {
    } else {
      break;
    }
    int const x_49 = a;
    a = as_type<int>((as_type<uint>(x_49) + as_type<uint>(1)));
    float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
    arr.arr[x_49] = x_52;
  }
  int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
  float const x_57 = arr.arr[x_55];
  float const x_59 = x_6.x_GLF_uniform_float_values.arr[0].el;
  bool const x_60 = (x_57 == x_59);
  x_70_phi = x_60;
  if (x_60) {
    int const x_64 = x_9.x_GLF_uniform_int_values.arr[2].el;
    float const x_66 = arr.arr[x_64];
    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
    x_69 = (x_66 == x_68);
    x_70_phi = x_69;
  }
  bool const x_70 = x_70_phi;
  x_80_phi = x_70;
  if (x_70) {
    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
    float const x_76 = arr.arr[x_74];
    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
    x_79 = (x_76 == x_78);
    x_80_phi = x_79;
  }
  bool const x_80 = x_80_phi;
  if (x_80) {
    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
    float const x_87 = arr.arr[x_85];
    float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
    float const x_93 = x_6.x_GLF_uniform_float_values.arr[0].el;
    *(tint_symbol_5) = float4(x_87, x_89, x_91, x_93);
  } else {
    float const x_96 = x_6.x_GLF_uniform_float_values.arr[1].el;
    *(tint_symbol_5) = float4(x_96, x_96, x_96, x_96);
  }
  return;
}

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

