#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 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[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 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 buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
  float f0 = 0.0f;
  float f1 = 0.0f;
  int i = 0;
  bool x_63 = false;
  bool x_64_phi = false;
  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
  f0 = x_34;
  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
  f1 = x_36;
  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
  i = x_38;
  while (true) {
    int const x_43 = i;
    int const x_45 = x_10.x_GLF_uniform_int_values.arr[0].el;
    if ((x_43 < x_45)) {
    } else {
      break;
    }
    float const x_48 = f0;
    f0 = fabs((1.100000024f * x_48));
    float const x_51 = f0;
    f1 = x_51;
    {
      int const x_52 = i;
      i = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
    }
  }
  float const x_54 = f1;
  float const x_56 = x_6.x_GLF_uniform_float_values.arr[1].el;
  bool const x_57 = (x_54 > x_56);
  x_64_phi = x_57;
  if (x_57) {
    float const x_60 = f1;
    float const x_62 = x_6.x_GLF_uniform_float_values.arr[2].el;
    x_63 = (x_60 < x_62);
    x_64_phi = x_63;
  }
  bool const x_64 = x_64_phi;
  if (x_64) {
    int const x_69 = x_10.x_GLF_uniform_int_values.arr[2].el;
    int const x_72 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_78 = x_10.x_GLF_uniform_int_values.arr[2].el;
    *(tint_symbol_4) = float4(float(x_69), float(x_72), float(x_75), float(x_78));
  } else {
    int const x_82 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_83 = float(x_82);
    *(tint_symbol_4) = float4(x_83, x_83, x_83, x_83);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, x_10, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

