[[block]]
struct buf0 {
  resolution : vec2<f32>;
};

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

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var c : vec3<f32>;
  var x_53 : f32;
  var x_57 : f32;
  var x_58 : f32;
  var x_83 : f32;
  var x_84 : f32;
  var x_124 : f32;
  var x_125 : f32;
  var x_57_phi : f32;
  var x_60_phi : i32;
  var x_83_phi : f32;
  var x_84_phi : f32;
  var x_85_phi : bool;
  var x_87_phi : f32;
  var x_128_phi : f32;
  var x_135_phi : i32;
  c = vec3<f32>(7.0, 8.0, 9.0);
  let x_47 : f32 = x_7.resolution.x;
  let x_48 : vec2<f32> = vec2<f32>(1.0, x_47);
  let x_50 : f32 = round((x_47 * 0.125));
  let x_51 : vec2<f32> = vec2<f32>(0.0, -0.5);
  x_53 = gl_FragCoord.x;
  switch(0u) {
    default: {
      x_57_phi = -0.5;
      x_60_phi = 1;
      loop {
        var x_70 : f32;
        var x_78 : f32;
        var x_61 : i32;
        var x_58_phi : f32;
        x_57 = x_57_phi;
        let x_60 : i32 = x_60_phi;
        x_83_phi = 0.0;
        x_84_phi = x_57;
        x_85_phi = false;
        if ((x_60 < 800)) {
        } else {
          break;
        }
        var x_77 : f32;
        var x_78_phi : f32;
        if (((x_60 % 32) == 0)) {
          x_70 = (x_57 + 0.400000006);
          x_58_phi = x_70;
        } else {
          x_78_phi = x_57;
          if (((f32(x_60) - (round(x_50) * floor((f32(x_60) / round(x_50))))) <= 0.01)) {
            x_77 = (x_57 + 100.0);
            x_78_phi = x_77;
          }
          x_78 = x_78_phi;
          x_58_phi = x_78;
        }
        x_58 = x_58_phi;
        if ((f32(x_60) >= x_53)) {
          x_83_phi = x_58;
          x_84_phi = x_58;
          x_85_phi = true;
          break;
        }

        continuing {
          x_61 = (x_60 + 1);
          x_57_phi = x_58;
          x_60_phi = x_61;
        }
      }
      x_83 = x_83_phi;
      x_84 = x_84_phi;
      let x_85 : bool = x_85_phi;
      x_87_phi = x_83;
      if (x_85) {
        break;
      }
      x_87_phi = x_84;
    }
  }
  var x_92 : f32;
  var x_98 : f32;
  var x_99 : f32;
  var x_98_phi : f32;
  var x_101_phi : i32;
  var x_124_phi : f32;
  var x_125_phi : f32;
  var x_126_phi : bool;
  let x_87 : f32 = x_87_phi;
  let x_89 : vec4<f32> = vec4<f32>(x_84, 0.400000006, x_83, 0.400000006);
  c.x = x_87;
  x_92 = gl_FragCoord.y;
  switch(0u) {
    default: {
      let x_95 : vec4<f32> = vec4<f32>(x_51, 0.0, x_57);
      let x_96 : f32 = vec3<f32>(x_48, -0.5).z;
      x_98_phi = x_96;
      x_101_phi = 1;
      loop {
        var x_111 : f32;
        var x_119 : f32;
        var x_102 : i32;
        var x_99_phi : f32;
        x_98 = x_98_phi;
        let x_101 : i32 = x_101_phi;
        x_124_phi = 0.0;
        x_125_phi = x_98;
        x_126_phi = false;
        if ((x_101 < 800)) {
        } else {
          break;
        }
        var x_118 : f32;
        var x_119_phi : f32;
        if (((x_101 % 32) == 0)) {
          x_111 = (x_98 + 0.400000006);
          x_99_phi = x_111;
        } else {
          x_119_phi = x_98;
          if (((f32(x_101) - (round(x_50) * floor((f32(x_101) / round(x_50))))) <= 0.01)) {
            x_118 = (x_98 + 100.0);
            x_119_phi = x_118;
          }
          x_119 = x_119_phi;
          x_99_phi = x_119;
        }
        x_99 = x_99_phi;
        if ((f32(x_101) >= x_92)) {
          x_124_phi = x_99;
          x_125_phi = x_99;
          x_126_phi = true;
          break;
        }

        continuing {
          x_102 = (x_101 + 1);
          x_98_phi = x_99;
          x_101_phi = x_102;
        }
      }
      x_124 = x_124_phi;
      x_125 = x_125_phi;
      let x_126 : bool = x_126_phi;
      x_128_phi = x_124;
      if (x_126) {
        break;
      }
      x_128_phi = x_125;
    }
  }
  let x_128 : f32 = x_128_phi;
  c.y = x_128;
  let x_130 : f32 = c.x;
  let x_131 : f32 = c.y;
  c.z = (x_130 + x_131);
  x_135_phi = 0;
  loop {
    var x_136 : i32;
    let x_135 : i32 = x_135_phi;
    if ((x_135 < 3)) {
    } else {
      break;
    }
    let x_142 : f32 = c[x_135];
    if ((x_142 >= 1.0)) {
      let x_146 : f32 = c[x_135];
      let x_147 : f32 = c[x_135];
      c[x_135] = (x_146 * x_147);
    }

    continuing {
      x_136 = (x_135 + 1);
      x_135_phi = x_136;
    }
  }
  let x_149 : vec3<f32> = c;
  let x_151 : vec3<f32> = normalize(abs(x_149));
  x_GLF_color = vec4<f32>(x_151.x, x_151.y, x_151.z, 1.0);
  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);
}
