#include <metal_stdlib>

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

int GLF_live6search_(thread tint_array_wrapper* const tint_symbol_3) {
  int GLF_live6index = 0;
  int GLF_live6currentNode = 0;
  GLF_live6index = 0;
  while (true) {
    if (true) {
    } else {
      break;
    }
    int const x_10 = GLF_live6index;
    int const x_11 = (*(tint_symbol_3)).arr[x_10];
    GLF_live6currentNode = x_11;
    int const x_12 = GLF_live6currentNode;
    if ((x_12 != 1)) {
      return 1;
    }
    GLF_live6index = 1;
  }
  return 1;
}

void main_1(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float const x_40 = x_9.injectionSwitch.x;
  if ((x_40 > 1.0f)) {
    int const x_13 = GLF_live6search_(tint_symbol_4);
  }
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
  main_1(x_9, tint_symbol_6, tint_symbol_7);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
  thread tint_array_wrapper tint_symbol_8 = {};
  thread float4 tint_symbol_9 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_9, &(tint_symbol_8), &(tint_symbol_9));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

