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

var<private> data : array<i32, 10>;

var<private> temp : array<i32, 10>;

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
  var k : i32;
  var i : i32;
  var j : i32;
  var i_1 : i32;
  let x_260 : i32 = *(from);
  k = x_260;
  let x_261 : i32 = *(from);
  i = x_261;
  let x_262 : i32 = *(mid);
  j = (x_262 + 1);
  loop {
    let x_268 : i32 = i;
    let x_269 : i32 = *(mid);
    let x_271 : i32 = j;
    let x_272 : i32 = *(to);
    if (((x_268 <= x_269) & (x_271 <= x_272))) {
    } else {
      break;
    }
    let x_276 : i32 = i;
    let x_278 : i32 = data[x_276];
    let x_279 : i32 = j;
    let x_281 : i32 = data[x_279];
    if ((x_278 < x_281)) {
      let x_286 : i32 = k;
      k = (x_286 + 1);
      let x_288 : i32 = i;
      i = (x_288 + 1);
      let x_291 : i32 = data[x_288];
      temp[x_286] = x_291;
    } else {
      let x_293 : i32 = k;
      k = (x_293 + 1);
      let x_295 : i32 = j;
      j = (x_295 + 1);
      let x_298 : i32 = data[x_295];
      temp[x_293] = x_298;
    }
  }
  loop {
    let x_304 : i32 = i;
    let x_306 : i32 = i;
    let x_307 : i32 = *(mid);
    if (((x_304 < 10) & (x_306 <= x_307))) {
    } else {
      break;
    }
    let x_311 : i32 = k;
    k = (x_311 + 1);
    let x_313 : i32 = i;
    i = (x_313 + 1);
    let x_316 : i32 = data[x_313];
    temp[x_311] = x_316;
  }
  let x_318 : i32 = *(from);
  i_1 = x_318;
  loop {
    let x_323 : i32 = i_1;
    let x_324 : i32 = *(to);
    if ((x_323 <= x_324)) {
    } else {
      break;
    }
    let x_327 : i32 = i_1;
    let x_328 : i32 = i_1;
    let x_330 : i32 = temp[x_328];
    data[x_327] = x_330;

    continuing {
      let x_332 : i32 = i_1;
      i_1 = (x_332 + 1);
    }
  }
  return;
}

fn func_i1_i1_(m : ptr<function, i32>, high : ptr<function, i32>) -> i32 {
  var x : i32;
  var x_335 : i32;
  var x_336 : i32;
  let x_338 : f32 = gl_FragCoord.x;
  if ((x_338 >= 0.0)) {
    if (false) {
      let x_346 : i32 = *(high);
      x_336 = (x_346 << bitcast<u32>(0));
    } else {
      x_336 = 4;
    }
    let x_348 : i32 = x_336;
    x_335 = (1 << bitcast<u32>(x_348));
  } else {
    x_335 = 1;
  }
  let x_350 : i32 = x_335;
  x = x_350;
  let x_351 : i32 = x;
  x = (x_351 >> bitcast<u32>(4));
  let x_353 : i32 = *(m);
  let x_355 : i32 = *(m);
  let x_357 : i32 = *(m);
  let x_359 : i32 = x;
  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
}

fn mergeSort_() {
  var low : i32;
  var high_1 : i32;
  var m_1 : i32;
  var i_2 : i32;
  var from_1 : i32;
  var mid_1 : i32;
  var to_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  var param_4 : i32;
  low = 0;
  high_1 = 9;
  m_1 = 1;
  loop {
    let x_367 : i32 = m_1;
    let x_368 : i32 = high_1;
    if ((x_367 <= x_368)) {
    } else {
      break;
    }
    let x_371 : i32 = low;
    i_2 = x_371;
    loop {
      let x_376 : i32 = i_2;
      let x_377 : i32 = high_1;
      if ((x_376 < x_377)) {
      } else {
        break;
      }
      let x_380 : i32 = i_2;
      from_1 = x_380;
      let x_381 : i32 = i_2;
      let x_382 : i32 = m_1;
      mid_1 = ((x_381 + x_382) - 1);
      let x_385 : i32 = i_2;
      let x_386 : i32 = m_1;
      let x_390 : i32 = high_1;
      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
      let x_392 : i32 = from_1;
      param = x_392;
      let x_393 : i32 = mid_1;
      param_1 = x_393;
      let x_394 : i32 = to_1;
      param_2 = x_394;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));

      continuing {
        let x_396 : i32 = m_1;
        param_3 = x_396;
        let x_397 : i32 = high_1;
        param_4 = x_397;
        let x_398 : i32 = func_i1_i1_(&(param_3), &(param_4));
        let x_399 : i32 = i_2;
        i_2 = (x_399 + x_398);
      }
    }

    continuing {
      let x_401 : i32 = m_1;
      m_1 = (2 * x_401);
    }
  }
  return;
}

fn main_1() {
  var i_3 : i32;
  var j_1 : i32;
  var grey : f32;
  let x_93 : f32 = x_34.injectionSwitch.x;
  i_3 = i32(x_93);
  loop {
    let x_99 : i32 = i_3;
    switch(x_99) {
      case 9: {
        let x_129 : i32 = i_3;
        data[x_129] = -5;
      }
      case 8: {
        let x_127 : i32 = i_3;
        data[x_127] = -4;
      }
      case 7: {
        let x_125 : i32 = i_3;
        data[x_125] = -3;
      }
      case 6: {
        let x_123 : i32 = i_3;
        data[x_123] = -2;
      }
      case 5: {
        let x_121 : i32 = i_3;
        data[x_121] = -1;
      }
      case 4: {
        let x_119 : i32 = i_3;
        data[x_119] = 0;
      }
      case 3: {
        let x_117 : i32 = i_3;
        data[x_117] = 1;
      }
      case 2: {
        let x_115 : i32 = i_3;
        data[x_115] = 2;
      }
      case 1: {
        let x_113 : i32 = i_3;
        data[x_113] = 3;
      }
      case 0: {
        let x_111 : i32 = i_3;
        data[x_111] = 4;
      }
      default: {
      }
    }
    let x_131 : i32 = i_3;
    i_3 = (x_131 + 1);

    continuing {
      let x_133 : i32 = i_3;
      if ((x_133 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  loop {
    let x_139 : i32 = j_1;
    if ((x_139 < 10)) {
    } else {
      break;
    }
    let x_142 : i32 = j_1;
    let x_143 : i32 = j_1;
    let x_145 : i32 = data[x_143];
    temp[x_142] = x_145;

    continuing {
      let x_147 : i32 = j_1;
      j_1 = (x_147 + 1);
    }
  }
  mergeSort_();
  let x_151 : f32 = gl_FragCoord.y;
  if ((i32(x_151) < 30)) {
    let x_158 : i32 = data[0];
    grey = (0.5 + (f32(x_158) / 10.0));
  } else {
    let x_163 : f32 = gl_FragCoord.y;
    if ((i32(x_163) < 60)) {
      let x_170 : i32 = data[1];
      grey = (0.5 + (f32(x_170) / 10.0));
    } else {
      let x_175 : f32 = gl_FragCoord.y;
      if ((i32(x_175) < 90)) {
        let x_182 : i32 = data[2];
        grey = (0.5 + (f32(x_182) / 10.0));
      } else {
        let x_187 : f32 = gl_FragCoord.y;
        if ((i32(x_187) < 120)) {
          let x_194 : i32 = data[3];
          grey = (0.5 + (f32(x_194) / 10.0));
        } else {
          let x_199 : f32 = gl_FragCoord.y;
          if ((i32(x_199) < 150)) {
            discard;
          } else {
            let x_206 : f32 = gl_FragCoord.y;
            if ((i32(x_206) < 180)) {
              let x_213 : i32 = data[5];
              grey = (0.5 + (f32(x_213) / 10.0));
            } else {
              let x_218 : f32 = gl_FragCoord.y;
              if ((i32(x_218) < 210)) {
                let x_225 : i32 = data[6];
                grey = (0.5 + (f32(x_225) / 10.0));
              } else {
                let x_230 : f32 = gl_FragCoord.y;
                if ((i32(x_230) < 240)) {
                  let x_237 : i32 = data[7];
                  grey = (0.5 + (f32(x_237) / 10.0));
                } else {
                  let x_242 : f32 = gl_FragCoord.y;
                  if ((i32(x_242) < 270)) {
                    let x_249 : i32 = data[8];
                    grey = (0.5 + (f32(x_249) / 10.0));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  let x_253 : f32 = grey;
  let x_254 : vec3<f32> = vec3<f32>(x_253, x_253, x_253);
  x_GLF_color = vec4<f32>(x_254.x, x_254.y, x_254.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);
}
