#include <metal_stdlib>

using namespace metal;
struct ssbOut {
  /* 0x0000 */ float result[1];
};
struct ssbA {
  /* 0x0000 */ float A[1];
};
struct Uniforms {
  /* 0x0000 */ float tint_symbol;
  /* 0x0004 */ int aShape;
  /* 0x0008 */ int outShape;
  /* 0x000c */ int outShapeStrides;
  /* 0x0010 */ int size;
};

float getAAtOutCoords_(const device ssbA& x_20, thread uint3* const tint_symbol_2) {
  uint const x_42 = (*(tint_symbol_2))[0];
  float const x_44 = x_20.A[x_42];
  return x_44;
}

float unaryOperation_f1_(thread float* const a) {
  float const x_47 = *(a);
  if ((x_47 < 0.0f)) {
    return INFINITY;
  }
  float const x_55 = *(a);
  return log(x_55);
}

void setOutput_i1_f1_(device ssbOut& x_16, thread int* const flatIndex, thread float* const value) {
  int const x_27 = *(flatIndex);
  float const x_28 = *(value);
  x_16.result[x_27] = x_28;
  return;
}

void main_1(constant Uniforms& x_24, const device ssbA& x_20, device ssbOut& x_16, thread uint3* const tint_symbol_3) {
  int index = 0;
  float a_1 = 0.0f;
  float param = 0.0f;
  int param_1 = 0;
  float param_2 = 0.0f;
  uint const x_61 = (*(tint_symbol_3))[0];
  index = as_type<int>(x_61);
  int const x_63 = index;
  int const x_70 = x_24.size;
  if ((x_63 < x_70)) {
    float const x_75 = getAAtOutCoords_(x_20, tint_symbol_3);
    a_1 = x_75;
    float const x_77 = a_1;
    param = x_77;
    float const x_78 = unaryOperation_f1_(&(param));
    int const x_80 = index;
    param_1 = x_80;
    param_2 = x_78;
    setOutput_i1_f1_(x_16, &(param_1), &(param_2));
  }
  return;
}

void tint_symbol_1_inner(constant Uniforms& x_24, const device ssbA& x_20, device ssbOut& x_16, uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_4) {
  *(tint_symbol_4) = gl_GlobalInvocationID_param;
  main_1(x_24, x_20, x_16, tint_symbol_4);
}

kernel void tint_symbol_1(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], constant Uniforms& x_24 [[buffer(0)]], const device ssbA& x_20 [[buffer(2)]], device ssbOut& x_16 [[buffer(1)]]) {
  thread uint3 tint_symbol_5 = 0u;
  tint_symbol_1_inner(x_24, x_20, x_16, gl_GlobalInvocationID_param, &(tint_symbol_5));
  return;
}

