#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[5];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float const x_33 = (*(tint_symbol_5)).x;
  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_33 > x_35)) {
    float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
    *(tint_symbol_6) = float4(x_40, x_40, x_40, x_40);
    float const x_43 = (*(tint_symbol_5)).y;
    if ((x_43 > x_35)) {
      float const x_48 = x_6.x_GLF_uniform_float_values.arr[4].el;
      *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
    }
    float const x_51 = x_6.x_GLF_uniform_float_values.arr[3].el;
    *(tint_symbol_6) = float4(x_51, x_51, x_51, x_51);
  }
  float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
  *(tint_symbol_6) = float4(x_35, x_54, x_54, 10.0f);
  float4 const x_61 = *(tint_symbol_6);
  *(tint_symbol_6) = (float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)) * x_61);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

