#include <metal_stdlib>

using namespace metal;
struct doesNotMatter {
  /* 0x0000 */ int global_seed;
  /* 0x0004 */ int data[1];
};
struct buf1 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};

void main_1(constant buf1& x_10, device doesNotMatter& x_7, thread uint3* const tint_symbol_2) {
  int lid = 0;
  int val = 0;
  int i = 0;
  uint const x_40 = (*(tint_symbol_2)).x;
  lid = as_type<int>(x_40);
  int const x_43 = x_7.global_seed;
  val = x_43;
  i = 0;
  while (true) {
    int const x_48 = i;
    if ((x_48 < 2)) {
    } else {
      break;
    }
    int const x_51 = lid;
    if ((x_51 > 0)) {
      int const x_55 = lid;
      int const x_58 = x_7.data[(x_55 - 1)];
      int const x_59 = val;
      val = (x_59 + x_58);
      float const x_62 = x_10.injectionSwitch.x;
      if ((x_62 > 100.0f)) {
        break;
      }
    }
    threadgroup_barrier(mem_flags::mem_threadgroup);
    {
      int const x_66 = i;
      i = (x_66 + 1);
    }
  }
  int const x_68 = lid;
  if ((x_68 == 0)) {
    x_7.data[0] = 42;
  }
  return;
}

kernel void tint_symbol(uint3 gl_LocalInvocationID_param [[thread_position_in_threadgroup]], constant buf1& x_10 [[buffer(1)]], device doesNotMatter& x_7 [[buffer(0)]]) {
  thread uint3 tint_symbol_3 = 0u;
  tint_symbol_3 = gl_LocalInvocationID_param;
  main_1(x_10, x_7, &(tint_symbol_3));
  return;
}

