#include <metal_stdlib>

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

int func_struct_S_i1_2_1_i1_(constant buf0& x_9, thread S* const s, thread int* const x) {
  int const x_16 = *(x);
  (*(s)).arr.arr[1] = as_type<int>((as_type<uint>(x_16) + as_type<uint>(1)));
  int const x_18 = x_9.one;
  int const x_19 = (*(s)).arr.arr[x_18];
  int const x_20 = *(x);
  if ((x_19 == x_20)) {
    return -1;
  }
  int const x_21 = *(x);
  return x_21;
}

void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
  int a = 0;
  int i = 0;
  int j = 0;
  S s_1 = {};
  S param = {};
  int param_1 = 0;
  a = 0;
  i = 0;
  while (true) {
    int const x_22 = i;
    int const x_23 = x_9.one;
    if ((x_22 < as_type<int>((as_type<uint>(2) + as_type<uint>(x_23))))) {
    } else {
      break;
    }
    j = 0;
    while (true) {
      int const x_25 = j;
      int const x_26 = x_9.one;
      if ((x_25 < as_type<int>((as_type<uint>(3) + as_type<uint>(x_26))))) {
      } else {
        break;
      }
      int const x_28 = i;
      int const x_29 = j;
      S const x_79 = s_1;
      param = x_79;
      param_1 = as_type<int>((as_type<uint>(x_28) + as_type<uint>(x_29)));
      int const x_31 = func_struct_S_i1_2_1_i1_(x_9, &(param), &(param_1));
      int const x_32 = a;
      a = as_type<int>((as_type<uint>(x_32) + as_type<uint>(x_31)));
      {
        int const x_34 = j;
        j = as_type<int>((as_type<uint>(x_34) + as_type<uint>(1)));
      }
    }
    {
      int const x_36 = i;
      i = as_type<int>((as_type<uint>(x_36) + as_type<uint>(1)));
    }
  }
  int const x_38 = a;
  if ((x_38 == 30)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_9, &(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;
}

