#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[as_type<int>((as_type<uint>(x_55) - as_type<uint>(1)))];
      int const x_59 = val;
      val = as_type<int>((as_type<uint>(x_59) + as_type<uint>(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 = as_type<int>((as_type<uint>(x_66) + as_type<uint>(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;
}

