#include <metal_stdlib>

using namespace metal;
struct main_out {
  int out_data_1;
};
struct tint_symbol_1 {
  int out_data_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_3, thread int* const tint_symbol_4) {
  bool x_is_odd = false;
  bool y_is_odd = false;
  float const x_24 = (*(tint_symbol_3)).x;
  x_is_odd = ((int(x_24) & 1) == 1);
  float const x_29 = (*(tint_symbol_3)).y;
  y_is_odd = ((int(x_29) & 1) == 1);
  bool const x_33 = x_is_odd;
  bool const x_34 = y_is_odd;
  *(tint_symbol_4) = select(0, 1, (x_33 | x_34));
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.out_data_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread int tint_symbol_8 = 0;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.out_data_1 = inner_result.out_data_1;
  return wrapper_result;
}

