#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
struct tint_array_wrapper {
  int arr[10];
};
struct tint_array_wrapper_1 {
  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(constant buf0& x_8, thread float4* const tint_symbol_4) {
  bool x_68 = false;
  int x_29 = 0;
  int x_30 = 0;
  int x_31 = 0;
  tint_array_wrapper globalNumbers = {};
  int x_17 = 0;
  int acc = 0;
  int i_1 = 0;
  tint_array_wrapper_1 localNumbers = {};
  int param = 0;
  int x_24 = 0;
  int x_24_phi = 0;
  int x_23_phi = 0;
  acc = 0;
  i_1 = 0;
  x_24_phi = 0;
  x_23_phi = 0;
  while (true) {
    int x_33 = 0;
    int x_92 = 0;
    bool x_76_phi = false;
    int x_34_phi = 0;
    int x_25_phi = 0;
    x_24 = x_24_phi;
    int const x_23 = x_23_phi;
    if ((x_23 < 4)) {
    } else {
      break;
    }
    x_68 = false;
    x_76_phi = false;
    while (true) {
      bool x_81 = false;
      int x_32 = 0;
      bool x_81_phi = false;
      int x_32_phi = 0;
      int x_33_phi = 0;
      bool x_90_phi = false;
      bool const x_76 = x_76_phi;
      x_30 = 0;
      x_81_phi = x_76;
      x_32_phi = 0;
      while (true) {
        x_81 = x_81_phi;
        x_32 = x_32_phi;
        float const x_86 = x_8.one;
        x_33_phi = 0;
        x_90_phi = x_81;
        if ((x_32 < int(x_86))) {
        } else {
          break;
        }
        x_68 = true;
        x_29 = x_32;
        x_33_phi = x_32;
        x_90_phi = true;
        break;
        {
          x_81_phi = false;
          x_32_phi = 0;
        }
      }
      x_33 = x_33_phi;
      bool const x_90 = x_90_phi;
      x_34_phi = x_33;
      if (x_90) {
        break;
      }
      x_92 = 0;
      x_68 = true;
      x_29 = x_92;
      x_34_phi = x_92;
      break;
      {
        x_76_phi = false;
      }
    }
    int const x_34 = x_34_phi;
    x_31 = x_34;
    int const x_93 = x_31;
    tint_array_wrapper_1 const x_21 = localNumbers;
    tint_array_wrapper_1 x_22_1 = x_21;
    x_22_1.arr[1u] = x_93;
    tint_array_wrapper_1 const x_22 = x_22_1;
    localNumbers = x_22;
    globalNumbers.arr[0] = 0;
    int const x_13 = x_22.arr[1u];
    param = x_13;
    x_17 = 0;
    x_25_phi = 0;
    while (true) {
      int const x_25 = x_25_phi;
      if ((x_25 <= x_13)) {
      } else {
        break;
      }
      int const x_102_save = x_13;
      int const x_18 = globalNumbers.arr[x_102_save];
      if ((x_18 <= 1)) {
        globalNumbers.arr[x_102_save] = 1;
      }
      {
        int const x_19 = as_type<int>((as_type<uint>(x_25) + as_type<uint>(1)));
        x_17 = x_19;
        x_25_phi = x_19;
      }
    }
    float const x_107 = x_8.one;
    int const x_14 = globalNumbers.arr[as_type<int>((as_type<uint>(int(x_107)) - as_type<uint>(1)))];
    int const x_15 = as_type<int>(as_type<int>((as_type<uint>(x_24) + as_type<uint>(as_type<int>(x_14)))));
    acc = x_15;
    {
      int const x_16 = as_type<int>((as_type<uint>(x_23) + as_type<uint>(1)));
      i_1 = x_16;
      x_24_phi = x_15;
      x_23_phi = x_16;
    }
  }
  if ((x_24 == as_type<int>(4))) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

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

int yieldsZero_(constant buf0& x_8) {
  bool x_116 = false;
  int x_20 = 0;
  int i = 0;
  int x_26 = 0;
  int x_134 = 0;
  bool x_118_phi = false;
  int x_27_phi = 0;
  x_118_phi = false;
  while (true) {
    bool x_123 = false;
    int x_28 = 0;
    bool x_123_phi = false;
    int x_28_phi = 0;
    int x_26_phi = 0;
    bool x_132_phi = false;
    bool const x_118 = x_118_phi;
    i = 0;
    x_123_phi = x_118;
    x_28_phi = 0;
    while (true) {
      x_123 = x_123_phi;
      x_28 = x_28_phi;
      float const x_128 = x_8.one;
      x_26_phi = 0;
      x_132_phi = x_123;
      if ((x_28 < int(x_128))) {
      } else {
        break;
      }
      x_116 = true;
      x_20 = x_28;
      x_26_phi = x_28;
      x_132_phi = true;
      break;
      {
        x_123_phi = false;
        x_28_phi = 0;
      }
    }
    x_26 = x_26_phi;
    bool const x_132 = x_132_phi;
    x_27_phi = x_26;
    if (x_132) {
      break;
    }
    x_134 = 0;
    x_116 = true;
    x_20 = x_134;
    x_27_phi = x_134;
    break;
    {
      x_118_phi = false;
    }
  }
  int const x_27 = x_27_phi;
  return x_27;
}

