struct Inner {
  float16_t scalar_f16;
  vector<float16_t, 3> vec3_f16;
  matrix<float16_t, 2, 4> mat2x4_f16;
};
struct S {
  Inner inner;
};

ByteAddressBuffer tint_symbol : register(t0, space0);
RWByteAddressBuffer tint_symbol_1 : register(u1, space0);

matrix<float16_t, 2, 4> tint_symbol_6(ByteAddressBuffer buffer, uint offset) {
  return matrix<float16_t, 2, 4>(buffer.Load<vector<float16_t, 4> >((offset + 0u)), buffer.Load<vector<float16_t, 4> >((offset + 8u)));
}

Inner tint_symbol_3(ByteAddressBuffer buffer, uint offset) {
  const Inner tint_symbol_14 = {buffer.Load<float16_t>((offset + 0u)), buffer.Load<vector<float16_t, 3> >((offset + 8u)), tint_symbol_6(buffer, (offset + 16u))};
  return tint_symbol_14;
}

S tint_symbol_2(ByteAddressBuffer buffer, uint offset) {
  const S tint_symbol_15 = {tint_symbol_3(buffer, (offset + 0u))};
  return tint_symbol_15;
}

void tint_symbol_12(RWByteAddressBuffer buffer, uint offset, matrix<float16_t, 2, 4> value) {
  buffer.Store<vector<float16_t, 4> >((offset + 0u), value[0u]);
  buffer.Store<vector<float16_t, 4> >((offset + 8u), value[1u]);
}

void tint_symbol_9(RWByteAddressBuffer buffer, uint offset, Inner value) {
  buffer.Store<float16_t>((offset + 0u), value.scalar_f16);
  buffer.Store<vector<float16_t, 3> >((offset + 8u), value.vec3_f16);
  tint_symbol_12(buffer, (offset + 16u), value.mat2x4_f16);
}

void tint_symbol_8(RWByteAddressBuffer buffer, uint offset, S value) {
  tint_symbol_9(buffer, (offset + 0u), value.inner);
}

[numthreads(1, 1, 1)]
void main() {
  const S t = tint_symbol_2(tint_symbol, 0u);
  tint_symbol_8(tint_symbol_1, 0u, t);
  return;
}
