#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

struct tint_array_wrapper {
  /* 0x0000 */ int4 arr[4];
};
struct Inner {
  /* 0x0000 */ packed_int3 a;
  /* 0x000c */ int b;
  /* 0x0010 */ packed_uint3 c;
  /* 0x001c */ uint d;
  /* 0x0020 */ packed_float3 e;
  /* 0x002c */ float f;
  /* 0x0030 */ float2x3 g;
  /* 0x0050 */ float3x2 h;
  /* 0x0068 */ int8_t tint_pad[8];
  /* 0x0070 */ tint_array_wrapper i;
};
struct S {
  /* 0x0000 */ Inner arr[1];
};

void tint_symbol_inner(uint idx, const device S* const tint_symbol_1) {
  int3 const a = (*(tint_symbol_1)).arr[idx].a;
  int const b = (*(tint_symbol_1)).arr[idx].b;
  uint3 const c = (*(tint_symbol_1)).arr[idx].c;
  uint const d = (*(tint_symbol_1)).arr[idx].d;
  float3 const e = (*(tint_symbol_1)).arr[idx].e;
  float const f = (*(tint_symbol_1)).arr[idx].f;
  float2x3 const g = (*(tint_symbol_1)).arr[idx].g;
  float3x2 const h = (*(tint_symbol_1)).arr[idx].h;
  tint_array_wrapper const i = (*(tint_symbol_1)).arr[idx].i;
}

kernel void tint_symbol(const device S* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
  tint_symbol_inner(idx, tint_symbol_2);
  return;
}

