struct QuicksortObject {
  numbers : array<i32, 10>;
};

struct buf0 {
  resolution : vec2<f32>;
};

var<private> obj : QuicksortObject;

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
  var temp : i32;
  let x_230 : i32 = *(i);
  let x_232 : i32 = obj.numbers[x_230];
  temp = x_232;
  let x_233 : i32 = *(i);
  let x_234 : i32 = *(j);
  let x_236 : i32 = obj.numbers[x_234];
  obj.numbers[x_233] = x_236;
  let x_238 : i32 = *(j);
  let x_239 : i32 = temp;
  obj.numbers[x_238] = x_239;
  return;
}

fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
  var pivot : i32;
  var i_1 : i32;
  var j_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  let x_242 : i32 = *(h);
  let x_244 : i32 = obj.numbers[x_242];
  pivot = x_244;
  let x_245 : i32 = *(l);
  i_1 = (x_245 - 1);
  let x_247 : i32 = *(l);
  j_1 = x_247;
  loop {
    let x_252 : i32 = j_1;
    let x_253 : i32 = *(h);
    if ((x_252 <= (x_253 - 1))) {
    } else {
      break;
    }
    let x_257 : i32 = j_1;
    let x_259 : i32 = obj.numbers[x_257];
    let x_260 : i32 = pivot;
    if ((x_259 <= x_260)) {
      let x_264 : i32 = i_1;
      i_1 = (x_264 + 1);
      let x_266 : i32 = i_1;
      param = x_266;
      let x_267 : i32 = j_1;
      param_1 = x_267;
      swap_i1_i1_(&(param), &(param_1));
    }

    continuing {
      let x_269 : i32 = j_1;
      j_1 = (x_269 + 1);
    }
  }
  let x_271 : i32 = i_1;
  i_1 = (x_271 + 1);
  let x_273 : i32 = i_1;
  param_2 = x_273;
  let x_274 : i32 = *(h);
  param_3 = x_274;
  swap_i1_i1_(&(param_2), &(param_3));
  let x_276 : i32 = i_1;
  return x_276;
}

fn quicksort_() {
  var l_1 : i32;
  var h_1 : i32;
  var top : i32;
  var stack : array<i32, 10>;
  var int_a : i32;
  var x_278 : i32;
  var x_279 : i32;
  var clamp_a : i32;
  var p : i32;
  var param_4 : i32;
  var param_5 : i32;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  let x_280 : i32 = top;
  let x_281 : i32 = (x_280 + 1);
  top = x_281;
  let x_282 : i32 = l_1;
  stack[x_281] = x_282;
  let x_285 : f32 = gl_FragCoord.y;
  if ((x_285 >= 0.0)) {
    let x_290 : i32 = h_1;
    if (false) {
      x_279 = 1;
    } else {
      let x_294 : i32 = h_1;
      x_279 = (x_294 << bitcast<u32>(0));
    }
    let x_296 : i32 = x_279;
    x_278 = (x_290 | x_296);
  } else {
    x_278 = 1;
  }
  let x_298 : i32 = x_278;
  int_a = x_298;
  let x_299 : i32 = h_1;
  let x_300 : i32 = h_1;
  let x_301 : i32 = int_a;
  clamp_a = clamp(x_299, x_300, x_301);
  let x_303 : i32 = top;
  let x_304 : i32 = (x_303 + 1);
  top = x_304;
  let x_305 : i32 = clamp_a;
  stack[x_304] = (x_305 / 1);
  loop {
    let x_312 : i32 = top;
    if ((x_312 >= 0)) {
    } else {
      break;
    }
    let x_315 : i32 = top;
    top = (x_315 - 1);
    let x_318 : i32 = stack[x_315];
    h_1 = x_318;
    let x_319 : i32 = top;
    top = (x_319 - 1);
    let x_322 : i32 = stack[x_319];
    l_1 = x_322;
    let x_323 : i32 = l_1;
    param_4 = x_323;
    let x_324 : i32 = h_1;
    param_5 = x_324;
    let x_325 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
    p = x_325;
    let x_326 : i32 = p;
    let x_328 : i32 = l_1;
    if (((x_326 - 1) > x_328)) {
      let x_332 : i32 = top;
      let x_333 : i32 = (x_332 + 1);
      top = x_333;
      let x_334 : i32 = l_1;
      stack[x_333] = x_334;
      let x_336 : i32 = top;
      let x_337 : i32 = (x_336 + 1);
      top = x_337;
      let x_338 : i32 = p;
      stack[x_337] = (x_338 - 1);
    }
    let x_341 : i32 = p;
    let x_343 : i32 = h_1;
    if (((x_341 + 1) < x_343)) {
      let x_347 : i32 = top;
      let x_348 : i32 = (x_347 + 1);
      top = x_348;
      let x_349 : i32 = p;
      stack[x_348] = (x_349 + 1);
      let x_352 : i32 = top;
      let x_353 : i32 = (x_352 + 1);
      top = x_353;
      let x_354 : i32 = h_1;
      stack[x_353] = x_354;
    }
  }
  return;
}

fn main_1() {
  var i_2 : i32;
  var uv : vec2<f32>;
  var color : vec3<f32>;
  i_2 = 0;
  loop {
    let x_90 : i32 = i_2;
    if ((x_90 < 10)) {
    } else {
      break;
    }
    let x_93 : i32 = i_2;
    let x_94 : i32 = i_2;
    obj.numbers[x_93] = (10 - x_94);
    let x_97 : i32 = i_2;
    let x_98 : i32 = i_2;
    let x_100 : i32 = obj.numbers[x_98];
    let x_101 : i32 = i_2;
    let x_103 : i32 = obj.numbers[x_101];
    obj.numbers[x_97] = (x_100 * x_103);

    continuing {
      let x_106 : i32 = i_2;
      i_2 = (x_106 + 1);
    }
  }
  quicksort_();
  let x_109 : vec4<f32> = gl_FragCoord;
  let x_112 : vec2<f32> = x_34.resolution;
  uv = (vec2<f32>(x_109.x, x_109.y) / x_112);
  color = vec3<f32>(1.0, 2.0, 3.0);
  let x_115 : i32 = obj.numbers[0];
  let x_118 : f32 = color.x;
  color.x = (x_118 + f32(x_115));
  let x_122 : f32 = uv.x;
  if ((x_122 > 0.25)) {
    let x_127 : i32 = obj.numbers[1];
    let x_130 : f32 = color.x;
    color.x = (x_130 + f32(x_127));
  }
  let x_134 : f32 = uv.x;
  if ((x_134 > 0.5)) {
    let x_139 : i32 = obj.numbers[2];
    let x_142 : f32 = color.y;
    color.y = (x_142 + f32(x_139));
  }
  let x_146 : f32 = uv.x;
  if ((x_146 > 0.75)) {
    let x_151 : i32 = obj.numbers[3];
    let x_154 : f32 = color.z;
    color.z = (x_154 + f32(x_151));
  }
  let x_158 : i32 = obj.numbers[4];
  let x_161 : f32 = color.y;
  color.y = (x_161 + f32(x_158));
  let x_165 : f32 = uv.y;
  if ((x_165 > 0.25)) {
    let x_170 : i32 = obj.numbers[5];
    let x_173 : f32 = color.x;
    color.x = (x_173 + f32(x_170));
  }
  let x_177 : f32 = uv.y;
  if ((x_177 > 0.5)) {
    let x_182 : i32 = obj.numbers[6];
    let x_185 : f32 = color.y;
    color.y = (x_185 + f32(x_182));
  }
  let x_189 : f32 = uv.y;
  if ((x_189 > 0.75)) {
    let x_194 : i32 = obj.numbers[7];
    let x_197 : f32 = color.z;
    color.z = (x_197 + f32(x_194));
  }
  let x_201 : i32 = obj.numbers[8];
  let x_204 : f32 = color.z;
  color.z = (x_204 + f32(x_201));
  let x_208 : f32 = uv.x;
  let x_210 : f32 = uv.y;
  if ((abs((x_208 - x_210)) < 0.25)) {
    let x_217 : i32 = obj.numbers[9];
    let x_220 : f32 = color.x;
    color.x = (x_220 + f32(x_217));
  }
  let x_223 : vec3<f32> = color;
  let x_224 : vec3<f32> = normalize(x_223);
  x_GLF_color = vec4<f32>(x_224.x, x_224.y, x_224.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);
}
