#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct sspp962805860buildInformationS {
  /* 0x0000 */ float4 footprint;
  /* 0x0010 */ float4 offset;
  /* 0x0020 */ int essence;
  /* 0x0024 */ tint_array<int, 6> orientation;
};

struct x_B4_BuildInformation {
  /* 0x0000 */ sspp962805860buildInformationS passthru;
};

void main_1(const device x_B4_BuildInformation* const tint_symbol_1) {
  tint_array<int, 6> orientation = {};
  tint_array<int, 6> const x_23 = (*(tint_symbol_1)).passthru.orientation;
  orientation[0] = x_23[0u];
  orientation[1] = x_23[1u];
  orientation[2] = x_23[2u];
  orientation[3] = x_23[3u];
  orientation[4] = x_23[4u];
  orientation[5] = x_23[5u];
  return;
}

fragment void tint_symbol(const device x_B4_BuildInformation* tint_symbol_2 [[buffer(0)]]) {
  main_1(tint_symbol_2);
  return;
}

