type Arr = [[stride(16)]] array<i32, 7>;

[[block]]
struct buf0 {
  x_GLF_uniform_int_values : Arr;
};

type Arr_1 = [[stride(16)]] array<f32, 3>;

[[block]]
struct buf1 {
  x_GLF_uniform_float_values : Arr_1;
};

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

[[group(0), binding(1)]] var<uniform> x_8 : buf1;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var sums : array<f32, 2>;
  var a : i32;
  var b : i32;
  var c : i32;
  var d : i32;
  var e : i32;
  var f : i32;
  var g : i32;
  var h : i32;
  var i : i32;
  var j : i32;
  var x_215 : bool;
  var x_216_phi : bool;
  let x_20 : i32 = x_6.x_GLF_uniform_int_values[1];
  let x_110 : f32 = x_8.x_GLF_uniform_float_values[0];
  sums[x_20] = x_110;
  let x_22 : i32 = x_6.x_GLF_uniform_int_values[2];
  let x_114 : f32 = x_8.x_GLF_uniform_float_values[0];
  sums[x_22] = x_114;
  let x_23 : i32 = x_6.x_GLF_uniform_int_values[1];
  a = x_23;
  loop {
    let x_24 : i32 = a;
    let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
    if ((x_24 < x_25)) {
    } else {
      break;
    }
    let x_26 : i32 = x_6.x_GLF_uniform_int_values[5];
    b = x_26;
    loop {
      let x_27 : i32 = b;
      let x_28 : i32 = x_6.x_GLF_uniform_int_values[3];
      if ((x_27 < x_28)) {
      } else {
        break;
      }
      let x_29 : i32 = x_6.x_GLF_uniform_int_values[6];
      c = x_29;
      loop {
        let x_30 : i32 = c;
        let x_31 : i32 = x_6.x_GLF_uniform_int_values[4];
        if ((x_30 <= x_31)) {
        } else {
          break;
        }
        let x_32 : i32 = x_6.x_GLF_uniform_int_values[1];
        d = x_32;
        loop {
          let x_33 : i32 = d;
          let x_34 : i32 = x_6.x_GLF_uniform_int_values[6];
          if ((x_33 < x_34)) {
          } else {
            break;
          }
          let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
          e = x_35;
          loop {
            let x_36 : i32 = e;
            let x_37 : i32 = x_6.x_GLF_uniform_int_values[4];
            if ((x_36 <= x_37)) {
            } else {
              break;
            }
            let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
            f = x_38;
            loop {
              let x_39 : i32 = f;
              let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
              if ((x_39 < x_40)) {
              } else {
                break;
              }
              let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
              g = x_41;
              loop {
                let x_42 : i32 = g;
                let x_43 : i32 = x_6.x_GLF_uniform_int_values[6];
                if ((x_42 < x_43)) {
                } else {
                  break;
                }
                let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
                h = x_44;
                loop {
                  let x_45 : i32 = h;
                  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
                  if ((x_45 < x_46)) {
                  } else {
                    break;
                  }
                  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
                  i = x_47;
                  loop {
                    let x_48 : i32 = i;
                    let x_49 : i32 = x_6.x_GLF_uniform_int_values[4];
                    if ((x_48 < x_49)) {
                    } else {
                      break;
                    }
                    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
                    j = x_50;
                    loop {
                      let x_51 : i32 = j;
                      let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
                      if ((x_51 > x_52)) {
                      } else {
                        break;
                      }
                      let x_53 : i32 = a;
                      let x_197 : f32 = x_8.x_GLF_uniform_float_values[2];
                      let x_199 : f32 = sums[x_53];
                      sums[x_53] = (x_199 + x_197);

                      continuing {
                        let x_54 : i32 = j;
                        j = (x_54 - 1);
                      }
                    }

                    continuing {
                      let x_56 : i32 = i;
                      i = (x_56 + 1);
                    }
                  }

                  continuing {
                    let x_58 : i32 = h;
                    h = (x_58 + 1);
                  }
                }

                continuing {
                  let x_60 : i32 = g;
                  g = (x_60 + 1);
                }
              }

              continuing {
                let x_62 : i32 = f;
                f = (x_62 + 1);
              }
            }

            continuing {
              let x_64 : i32 = e;
              e = (x_64 + 1);
            }
          }

          continuing {
            let x_66 : i32 = d;
            d = (x_66 + 1);
          }
        }

        continuing {
          let x_68 : i32 = c;
          c = (x_68 + 1);
        }
      }

      continuing {
        let x_70 : i32 = b;
        b = (x_70 + 1);
      }
    }

    continuing {
      let x_72 : i32 = a;
      a = (x_72 + 1);
    }
  }
  let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
  let x_204 : f32 = sums[x_74];
  let x_206 : f32 = x_8.x_GLF_uniform_float_values[1];
  let x_207 : bool = (x_204 == x_206);
  x_216_phi = x_207;
  if (x_207) {
    let x_75 : i32 = x_6.x_GLF_uniform_int_values[2];
    let x_212 : f32 = sums[x_75];
    let x_214 : f32 = x_8.x_GLF_uniform_float_values[1];
    x_215 = (x_212 == x_214);
    x_216_phi = x_215;
  }
  let x_216 : bool = x_216_phi;
  if (x_216) {
    let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
    let x_79 : i32 = x_6.x_GLF_uniform_int_values[2];
    x_GLF_color = vec4<f32>(f32(x_76), f32(x_77), f32(x_78), f32(x_79));
  } else {
    let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
    let x_230 : f32 = f32(x_80);
    x_GLF_color = vec4<f32>(x_230, x_230, x_230, x_230);
  }
  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);
}
