struct buf0 {
  one : f32,
}

@group(0) @binding(0) var<uniform> x_6 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var f : f32;
  var a : i32;
  var b : i32;
  var c : i32;
  var i : i32;
  var v : vec3<f32>;
  let x_42 : f32 = x_6.one;
  f = x_42;
  a = 1;
  b = 0;
  c = 1;
  i = 0;
  loop {
    let x_47 : i32 = i;
    if ((x_47 < 3)) {
    } else {
      break;
    }
    let x_50 : i32 = i;
    let x_51 : f32 = f;
    let x_52 : i32 = i;
    v[x_50] = (x_51 + f32(x_52));

    continuing {
      let x_56 : i32 = i;
      i = (x_56 + 1);
    }
  }
  let x_59 : f32 = x_6.one;
  if ((x_59 == 1.0)) {
    loop {
      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);

      continuing {
        let x_67 : i32 = c;
        let x_68 : i32 = a;
        let x_69 : i32 = b;
        if (((x_67 & (x_68 | x_69)) == 0)) {
        } else {
          break;
        }
      }
    }
    let x_74 : f32 = x_6.one;
    if ((x_74 == 1.0)) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    }
  }
  let x_79 : f32 = v.x;
  let x_83 : f32 = v.y;
  let x_87 : f32 = v.z;
  let x_90 : vec3<f32> = vec3<f32>(select(0.0, 1.0, (x_79 == 1.0)), select(1.0, 0.0, (x_83 == 2.0)), select(1.0, 0.0, (x_87 == 3.0)));
  let x_91 : vec4<f32> = x_GLF_color;
  x_GLF_color = vec4<f32>(x_90.x, x_90.y, x_90.z, x_91.w);
  x_GLF_color.w = 1.0;
  return;
}

struct main_out {
  @location(0)
  x_GLF_color_1 : vec4<f32>,
}

@stage(fragment)
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
