#include <metal_stdlib>

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

void main_1(constant buf0& x_11, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8) {
  int q = 0;
  int i = 0;
  int c = 0;
  q = 0;
  float const x_55 = (*(tint_symbol_5)).x;
  i = (int(x_55) % 3);
  c = 0;
  while (true) {
    int const x_14 = c;
    if ((x_14 < 3)) {
    } else {
      break;
    }
    int const x_15 = c;
    (*(tint_symbol_6)).arr[x_15] = 0.0f;
    int const x_16 = c;
    (*(tint_symbol_7)).arr[x_16] = 0.0f;
    float const x_65 = x_11.injectionSwitch.x;
    int const x_18 = q;
    switch((int(x_65) + x_18)) {
      case 51: {
        while (true) {
          if (true) {
          } else {
            break;
          }
        }
        int const x_20 = c;
        (*(tint_symbol_6)).arr[x_20] = 1.0f;
        /* fallthrough */
      }
      case 61: {
        (*(tint_symbol_7)).arr[0] = 1.0f;
        int const x_21 = c;
        (*(tint_symbol_7)).arr[x_21] = 1.0f;
        break;
      }
      case 0: {
        q = 61;
        break;
      }
      default: {
        break;
      }
    }
    {
      int const x_22 = c;
      c = (x_22 + 1);
    }
  }
  int const x_24 = i;
  float const x_79 = (*(tint_symbol_7)).arr[x_24];
  int const x_25 = i;
  float const x_81 = (*(tint_symbol_6)).arr[x_25];
  int const x_26 = i;
  float const x_83 = (*(tint_symbol_6)).arr[x_26];
  *(tint_symbol_8) = float4(x_79, x_81, x_83, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_9 = 0.0f;
  thread tint_array_wrapper tint_symbol_10 = {};
  thread tint_array_wrapper tint_symbol_11 = {};
  thread float4 tint_symbol_12 = 0.0f;
  tint_symbol_9 = gl_FragCoord_param;
  main_1(x_11, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

