#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_4) {
  int a = 0;
  int b = 0;
  int i = 0;
  int i_1 = 0;
  int i_2 = 0;
  tint_array_wrapper indexable = {};
  a = 0;
  b = 1;
  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  i = 0;
  while (true) {
    int const x_38 = i;
    if ((x_38 < 10)) {
    } else {
      break;
    }
    int const x_41 = i;
    if ((x_41 > 1)) {
      int const x_45 = a;
      a = as_type<int>((as_type<uint>(x_45) + as_type<uint>(1)));
      if (false) {
        i_1 = 0;
        while (true) {
          int const x_53 = i_1;
          if ((x_53 < 10)) {
          } else {
            break;
          }
          return;
        }
      }
    }
    {
      int const x_56 = i;
      i = as_type<int>((as_type<uint>(x_56) + as_type<uint>(1)));
    }
  }
  i_2 = 0;
  while (true) {
    int const x_62 = i_2;
    if ((x_62 < 10)) {
    } else {
      break;
    }
    int const x_65 = b;
    tint_array_wrapper const tint_symbol_2 = {.arr={1, 2}};
    indexable = tint_symbol_2;
    int const x_67 = indexable.arr[x_65];
    int const x_68 = a;
    a = as_type<int>((as_type<uint>(x_68) + as_type<uint>(x_67)));
    {
      int const x_70 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_70) + as_type<uint>(1)));
    }
  }
  int const x_72 = a;
  if ((x_72 == 28)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(thread float4* const tint_symbol_5) {
  main_1(tint_symbol_5);
  main_out const tint_symbol_3 = {.x_GLF_color_1=*(tint_symbol_5)};
  return tint_symbol_3;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_6 = 0.0f;
  main_out const inner_result = tint_symbol_inner(&(tint_symbol_6));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

