#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ uint el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[1];
};
struct buf2 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_padded_array_element_2 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_2[12];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_padded_array_element_2 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_2 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 buf2& x_6, constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_3) {
  float f = 0.0f;
  uint const x_36 = x_6.x_GLF_uniform_uint_values.arr[0].el;
  f = as_type<float>(max(100u, x_36));
  float const x_39 = f;
  float const x_41 = x_8.x_GLF_uniform_float_values.arr[0].el;
  if ((x_39 == x_41)) {
    int const x_47 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_50 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_53 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_56 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_3) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
  } else {
    int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_61 = float(x_60);
    *(tint_symbol_3) = float4(x_61, x_61, x_61, x_61);
  }
  return;
}

main_out tint_symbol_inner(constant buf2& x_6, constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
  main_1(x_6, x_8, x_10, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf2& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(2)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_6, x_8, x_10, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

