#include <metal_stdlib>

using namespace metal;
struct block0 {
  /* 0x0000 */ packed_float4 in_color;
};
struct main_out {
  float4 gl_Position;
  float4 frag_color_1;
};
struct tint_symbol_2 {
  float4 position_param [[attribute(0)]];
};
struct tint_symbol_3 {
  float4 frag_color_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(constant block0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float4 const x_24 = *(tint_symbol_5);
  *(tint_symbol_6) = x_24;
  float4 const x_27 = x_8.in_color;
  *(tint_symbol_7) = x_27;
  return;
}

main_out tint_symbol_inner(constant block0& x_8, float4 position_param, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_8) = position_param;
  main_1(x_8, tint_symbol_8, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_4 = {.gl_Position=*(tint_symbol_9), .frag_color_1=*(tint_symbol_10)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant block0& x_8 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread float4 tint_symbol_12 = 0.0f;
  thread float4 tint_symbol_13 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_8, tint_symbol_1.position_param, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.gl_Position = inner_result.gl_Position;
  wrapper_result.frag_color_1 = inner_result.frag_color_1;
  return wrapper_result;
}

