struct buf0 {
  resolution : vec2<f32>;
};

var<private> gl_FragCoord : vec4<f32>;

[[group(0), binding(0)]] var<uniform> x_6 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var indexable : array<vec4<f32>, 16>;
  var x_77 : vec2<i32>;
  var x_110 : vec2<i32>;
  var x_116 : i32;
  var x_77_phi : vec2<i32>;
  var x_80_phi : i32;
  var x_111_phi : vec2<i32>;
  var x_113_phi : vec2<i32>;
  let x_56 : vec4<f32> = gl_FragCoord;
  let x_59 : vec2<f32> = x_6.resolution;
  let x_60 : vec2<f32> = (vec2<f32>(x_56.x, x_56.y) / x_59);
  let x_63 : i32 = i32((x_60.x * 8.0));
  let x_66 : i32 = i32((x_60.y * 8.0));
  let x_75 : vec2<i32> = vec2<i32>(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
  x_77_phi = x_75;
  x_80_phi = 0;
  loop {
    var x_91 : vec2<i32>;
    var x_99 : vec2<i32>;
    var x_81 : i32;
    var x_92_phi : vec2<i32>;
    var x_100_phi : vec2<i32>;
    x_77 = x_77_phi;
    let x_80 : i32 = x_80_phi;
    if ((x_80 < 100)) {
    } else {
      break;
    }
    x_92_phi = x_77;
    if ((x_77.x > 0)) {
      x_91 = x_77;
      x_91.y = (x_77.y - 1);
      x_92_phi = x_91;
    }
    let x_92 : vec2<i32> = x_92_phi;
    x_100_phi = x_92;
    if ((x_92.x < 0)) {
      x_99 = x_92;
      x_99.y = (x_92.y + 1);
      x_100_phi = x_99;
    }
    let x_100 : vec2<i32> = x_100_phi;
    var x_78_1 : vec2<i32> = x_100;
    x_78_1.x = (x_100.x + (x_100.y / 2));
    let x_78 : vec2<i32> = x_78_1;

    continuing {
      x_81 = (x_80 + 1);
      x_77_phi = x_78;
      x_80_phi = x_81;
    }
  }
  let x_105 : i32 = x_77.x;
  x_111_phi = x_77;
  if ((x_105 < 0)) {
    x_110 = vec2<i32>(0, 0);
    x_110.x = -(x_105);
    x_111_phi = x_110;
  }
  let x_111 : vec2<i32> = x_111_phi;
  x_113_phi = x_111;
  loop {
    var x_114 : vec2<i32>;
    let x_113 : vec2<i32> = x_113_phi;
    x_116 = x_113.x;
    if ((x_116 > 15)) {
    } else {
      break;
    }

    continuing {
      x_114 = vec2<i32>(0, 0);
      x_114.x = bitcast<i32>((x_116 - bitcast<i32>(16)));
      x_113_phi = x_114;
    }
  }
  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
  let x_121 : vec4<f32> = indexable[x_116];
  x_GLF_color = x_121;
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
