struct buf0 {
  injectionSwitch : 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 loop_count : i32;
  loop_count = 0;
  let x_33 : f32 = x_7.injectionSwitch.x;
  let x_35 : f32 = x_7.injectionSwitch.y;
  let x_36 : bool = (x_33 > x_35);
  if (x_36) {
    return;
  }
  let x_40 : f32 = gl_FragCoord.x;
  let x_41 : bool = (x_40 < 0.0);
  loop {
    let x_43 : i32 = loop_count;
    if ((x_43 < 100)) {
    } else {
      break;
    }
    if (x_36) {
      break;
    }
    if (x_36) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    } else {
      if (x_41) {
        return;
      }
    }
    if (x_36) {
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
    } else {
      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
    }
    if (x_36) {
      return;
    }
    if (x_41) {
      loop {
        let x_63 : i32 = loop_count;
        if ((x_63 < 100)) {
        } else {
          break;
        }

        continuing {
          let x_67 : i32 = loop_count;
          loop_count = (x_67 + 1);
        }
      }
    }

    continuing {
      let x_69 : i32 = loop_count;
      loop_count = (x_69 + 1);
    }
  }
  let x_71 : i32 = loop_count;
  if ((x_71 >= 100)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 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);
}
