type Arr = @stride(16) array<i32, 4>;

struct buf0 {
  x_GLF_uniform_int_values : Arr;
};

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var a : i32;
  var b : i32;
  var c : i32;
  var x_65 : bool;
  var x_66_phi : bool;
  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
  a = x_29;
  let x_31 : i32 = x_6.x_GLF_uniform_int_values[1];
  b = x_31;
  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
  c = x_33;
  loop {
    let x_38 : i32 = a;
    let x_39 : i32 = b;
    if ((x_38 < x_39)) {
    } else {
      break;
    }
    let x_42 : i32 = a;
    a = (x_42 + 1);
    let x_44 : i32 = c;
    let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
    if ((x_44 == x_46)) {
      let x_52 : i32 = x_6.x_GLF_uniform_int_values[3];
      let x_53 : i32 = c;
      c = (x_53 * x_52);
    } else {
      if (true) {
        continue;
      }
    }
  }
  let x_57 : i32 = a;
  let x_58 : i32 = b;
  let x_59 : bool = (x_57 == x_58);
  x_66_phi = x_59;
  if (x_59) {
    let x_62 : i32 = c;
    let x_64 : i32 = x_6.x_GLF_uniform_int_values[3];
    x_65 = (x_62 == x_64);
    x_66_phi = x_65;
  }
  let x_66 : bool = x_66_phi;
  if (x_66) {
    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
    let x_74 : i32 = x_6.x_GLF_uniform_int_values[0];
    let x_77 : i32 = x_6.x_GLF_uniform_int_values[0];
    let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
  } else {
    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
    let x_85 : f32 = f32(x_84);
    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
  }
  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);
}
