#include <metal_stdlib>

using namespace metal;
struct struct_base {
  int data;
  int leftIndex;
  int rightIndex;
};
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct tint_array_wrapper {
  struct_base arr[3];
};
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 tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8) {
  int index = 0;
  struct_base const tint_symbol_2 = {.data=1, .leftIndex=1, .rightIndex=1};
  struct_base const tint_symbol_3 = {.data=1, .leftIndex=1, .rightIndex=1};
  struct_base const tint_symbol_4 = {.data=1, .leftIndex=1, .rightIndex=1};
  tint_array_wrapper const tint_symbol_5 = {.arr={tint_symbol_2, tint_symbol_3, tint_symbol_4}};
  *(tint_symbol_7) = tint_symbol_5;
  index = 1;
  (*(tint_symbol_7)).arr[1].rightIndex = 1;
  int const x_39 = (*(tint_symbol_7)).arr[1].leftIndex;
  if ((x_39 == 1)) {
    float const x_45 = x_8.injectionSwitch.x;
    int const x_48 = (*(tint_symbol_7)).arr[int(x_45)].rightIndex;
    index = x_48;
  } else {
    float const x_50 = x_8.injectionSwitch.y;
    int const x_53 = (*(tint_symbol_7)).arr[int(x_50)].leftIndex;
    index = x_53;
  }
  int const x_55 = (*(tint_symbol_7)).arr[1].leftIndex;
  if ((x_55 == 1)) {
    *(tint_symbol_8) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_8) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
  main_1(x_8, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_6 = {.x_GLF_color_1=*(tint_symbol_10)};
  return tint_symbol_6;
}

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

