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);
}
