#include <metal_stdlib>

using namespace metal;
uint4 tint_extract_bits(uint4 v, uint offset, uint count) {
  uint const s = min(offset, 32u);
  uint const e = min(32u, (s + count));
  return extract_bits(v, s, (e - s));
}

uint4 extractBits_631377() {
  uint4 arg_0 = uint4(1u);
  uint arg_1 = 1u;
  uint arg_2 = 1u;
  uint4 res = tint_extract_bits(arg_0, arg_1, arg_2);
  return res;
}

fragment void fragment_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
  *(tint_symbol_1) = extractBits_631377();
  return;
}

kernel void compute_main(device uint4* tint_symbol_2 [[buffer(0)]]) {
  *(tint_symbol_2) = extractBits_631377();
  return;
}

struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};

struct tint_symbol {
  uint4 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = extractBits_631377();
  return out;
}

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

