#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[2];
};
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 buf2 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
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_7, constant buf0& x_10, constant buf2& x_12, thread int* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float f = 0.0f;
  int r = 0;
  *(tint_symbol_3) = 0;
  float const x_42 = x_7.x_GLF_uniform_float_values.arr[0].el;
  f = x_42;
  int const x_44 = x_10.x_GLF_uniform_int_values.arr[1].el;
  r = x_44;
  while (true) {
    int const x_49 = r;
    int const x_51 = x_10.x_GLF_uniform_int_values.arr[2].el;
    if ((x_49 < x_51)) {
    } else {
      break;
    }
    int const x_54 = *(tint_symbol_3);
    *(tint_symbol_3) = as_type<int>((as_type<uint>(x_54) + as_type<uint>(1)));
    float2 const x_57 = x_12.injectionSwitch;
    float const x_60 = f;
    f = (x_60 + dfdx(x_57).y);
    {
      int const x_62 = r;
      r = as_type<int>((as_type<uint>(x_62) + as_type<uint>(1)));
    }
  }
  while (true) {
    int const x_68 = *(tint_symbol_3);
    if ((x_68 < 100)) {
    } else {
      break;
    }
    int const x_71 = *(tint_symbol_3);
    *(tint_symbol_3) = as_type<int>((as_type<uint>(x_71) + as_type<uint>(1)));
    float const x_74 = x_7.x_GLF_uniform_float_values.arr[0].el;
    float const x_75 = f;
    f = (x_75 + x_74);
  }
  float const x_77 = f;
  float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
  if ((x_77 == x_79)) {
    int const x_85 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_88 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_91 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_94 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_4) = float4(float(x_85), float(x_88), float(x_91), float(x_94));
  } else {
    int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_99 = float(x_98);
    *(tint_symbol_4) = float4(x_99, x_99, x_99, x_99);
  }
  return;
}

main_out tint_symbol_inner(constant buf1& x_7, constant buf0& x_10, constant buf2& x_12, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
  main_1(x_7, x_10, x_12, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

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

