#include <metal_stdlib>

using namespace metal;
struct S {
  int data;
};
struct buf0 {
  /* 0x0000 */ int one;
};
struct tint_array_wrapper {
  S arr[1];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int func_struct_S_i11_i1_(thread S* const s, thread int* const x) {
  int const x_17 = (*(s)).data;
  if ((x_17 == 1)) {
    int const x_18 = *(x);
    int const x_19 = (*(s)).data;
    return as_type<int>((as_type<uint>(x_18) + as_type<uint>(x_19)));
  } else {
    int const x_21 = *(x);
    return x_21;
  }
  return 0;
}

void main_1(constant buf0& x_11, thread float4* const tint_symbol_3) {
  int a = 0;
  tint_array_wrapper arr = {};
  int i = 0;
  S param = {};
  int param_1 = 0;
  S param_2 = {};
  int param_3 = 0;
  a = 0;
  int const x_22 = x_11.one;
  arr.arr[0].data = x_22;
  i = 0;
  while (true) {
    int const x_23 = i;
    int const x_24 = x_11.one;
    if ((x_23 < as_type<int>((as_type<uint>(5) + as_type<uint>(x_24))))) {
    } else {
      break;
    }
    int const x_26 = i;
    if (((x_26 % 2) != 0)) {
      S const x_74 = arr.arr[0];
      param = x_74;
      int const x_28 = i;
      param_1 = x_28;
      int const x_29 = func_struct_S_i11_i1_(&(param), &(param_1));
      S const x_75 = param;
      arr.arr[0] = x_75;
      a = x_29;
    } else {
      S const x_78 = arr.arr[0];
      param_2 = x_78;
      param_3 = 1;
      int const x_30 = func_struct_S_i11_i1_(&(param_2), &(param_3));
      S const x_79 = param_2;
      arr.arr[0] = x_79;
      a = x_30;
    }
    {
      int const x_31 = i;
      i = as_type<int>((as_type<uint>(x_31) + as_type<uint>(1)));
    }
  }
  int const x_33 = a;
  if ((x_33 == 6)) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_11, thread float4* const tint_symbol_4) {
  main_1(x_11, 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 buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_11, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

