#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 A1 = {};
  int a = 0;
  float b = 0.0f;
  bool c = false;
  bool x_36 = false;
  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].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[1].el;
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42}};
  A1 = tint_symbol_3;
  int const x_45 = x_9.x_GLF_uniform_int_values.arr[0].el;
  int const x_47 = x_9.x_GLF_uniform_int_values.arr[0].el;
  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
  a = clamp(x_45, x_47, x_49);
  int const x_51 = a;
  int const x_53 = x_9.x_GLF_uniform_int_values.arr[1].el;
  int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
  float const x_58 = A1.arr[clamp(x_51, x_53, x_55)];
  b = x_58;
  float const x_59 = b;
  int const x_61 = x_9.x_GLF_uniform_int_values.arr[1].el;
  float const x_63 = A1.arr[x_61];
  if ((x_59 < x_63)) {
    float const x_69 = x_6.x_GLF_uniform_float_values.arr[0].el;
    float const x_71 = x_6.x_GLF_uniform_float_values.arr[2].el;
    x_36 = (x_69 > x_71);
  } else {
    float const x_74 = x_6.x_GLF_uniform_float_values.arr[0].el;
    int const x_76 = x_9.x_GLF_uniform_int_values.arr[2].el;
    float const x_78 = A1.arr[x_76];
    x_36 = (x_74 < x_78);
  }
  bool const x_80 = x_36;
  c = x_80;
  bool const x_81 = c;
  if (x_81) {
    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
    int const x_89 = x_9.x_GLF_uniform_int_values.arr[1].el;
    int const x_92 = x_9.x_GLF_uniform_int_values.arr[1].el;
    int const x_95 = x_9.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_86), float(x_89), float(x_92), float(x_95));
  } else {
    float const x_99 = x_6.x_GLF_uniform_float_values.arr[0].el;
    *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
  }
  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;
}

