#include <metal_stdlib>

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

void main_1(constant buf1& x_10, device doesNotMatter& x_7, thread uint3* const tint_symbol_1) {
  int lid = 0;
  int val = 0;
  int i = 0;
  uint const x_40 = (*(tint_symbol_1)).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;
}

void tint_symbol_inner(constant buf1& x_10, device doesNotMatter& x_7, uint3 gl_LocalInvocationID_param, thread uint3* const tint_symbol_2) {
  *(tint_symbol_2) = gl_LocalInvocationID_param;
  main_1(x_10, x_7, tint_symbol_2);
}

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

