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

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

var<private> obj : QuicksortObject;

var<private> x_GLF_FragCoord : vec4<f32>;

var<private> x_GLF_pos : vec4<f32>;

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

var<private> frag_color : vec4<f32>;

var<private> gl_Position : vec4<f32>;

fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
  var temp : i32;
  let x_239 : i32 = *(i);
  let x_241 : i32 = obj.numbers[x_239];
  temp = x_241;
  let x_242 : i32 = *(i);
  let x_243 : i32 = *(j);
  let x_245 : i32 = obj.numbers[x_243];
  obj.numbers[x_242] = x_245;
  let x_247 : i32 = *(j);
  let x_248 : i32 = temp;
  obj.numbers[x_247] = x_248;
  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_251 : i32 = *(h);
  let x_253 : i32 = obj.numbers[x_251];
  pivot = x_253;
  let x_254 : i32 = *(l);
  i_1 = (x_254 - 1);
  let x_256 : i32 = *(l);
  j_1 = x_256;
  loop {
    let x_261 : i32 = j_1;
    let x_262 : i32 = *(h);
    if ((x_261 <= (x_262 - 1))) {
    } else {
      break;
    }
    let x_266 : i32 = j_1;
    let x_268 : i32 = obj.numbers[x_266];
    let x_269 : i32 = pivot;
    if ((x_268 <= x_269)) {
      let x_273 : i32 = i_1;
      i_1 = (x_273 + 1);
      let x_275 : i32 = i_1;
      param = x_275;
      let x_276 : i32 = j_1;
      param_1 = x_276;
      swap_i1_i1_(&(param), &(param_1));
    }

    continuing {
      let x_278 : i32 = j_1;
      j_1 = (x_278 + 1);
    }
  }
  let x_280 : i32 = i_1;
  param_2 = (x_280 + 1);
  let x_282 : i32 = *(h);
  param_3 = x_282;
  swap_i1_i1_(&(param_2), &(param_3));
  let x_284 : i32 = i_1;
  return (x_284 + 1);
}

fn quicksort_() {
  var l_1 : i32;
  var h_1 : i32;
  var top : i32;
  var stack : array<i32, 10>;
  var p : i32;
  var param_4 : i32;
  var param_5 : i32;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  let x_287 : i32 = top;
  let x_288 : i32 = (x_287 + 1);
  top = x_288;
  let x_289 : i32 = l_1;
  stack[x_288] = x_289;
  let x_291 : i32 = top;
  let x_292 : i32 = (x_291 + 1);
  top = x_292;
  let x_293 : i32 = h_1;
  stack[x_292] = x_293;
  loop {
    let x_299 : i32 = top;
    if ((x_299 >= 0)) {
    } else {
      break;
    }
    let x_302 : i32 = top;
    top = (x_302 - 1);
    let x_305 : i32 = stack[x_302];
    h_1 = x_305;
    let x_306 : i32 = top;
    top = (x_306 - 1);
    let x_309 : i32 = stack[x_306];
    l_1 = x_309;
    let x_310 : i32 = l_1;
    param_4 = x_310;
    let x_311 : i32 = h_1;
    param_5 = x_311;
    let x_312 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
    p = x_312;
    let x_313 : i32 = p;
    let x_315 : i32 = l_1;
    if (((x_313 - 1) > x_315)) {
      let x_319 : i32 = top;
      let x_320 : i32 = (x_319 + 1);
      top = x_320;
      let x_321 : i32 = l_1;
      stack[x_320] = x_321;
      let x_323 : i32 = top;
      let x_324 : i32 = (x_323 + 1);
      top = x_324;
      let x_325 : i32 = p;
      stack[x_324] = (x_325 - 1);
    }
    let x_328 : i32 = p;
    let x_330 : i32 = h_1;
    if (((x_328 + 1) < x_330)) {
      let x_334 : i32 = top;
      let x_335 : i32 = (x_334 + 1);
      top = x_335;
      let x_336 : i32 = p;
      stack[x_335] = (x_336 + 1);
      let x_339 : i32 = top;
      let x_340 : i32 = (x_339 + 1);
      top = x_340;
      let x_341 : i32 = h_1;
      stack[x_340] = x_341;
    }
  }
  return;
}

fn main_1() {
  var i_2 : i32;
  var uv : vec2<f32>;
  var color : vec3<f32>;
  let x_90 : vec4<f32> = x_GLF_pos;
  x_GLF_FragCoord = ((x_90 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
  i_2 = 0;
  loop {
    let x_97 : i32 = i_2;
    if ((x_97 < 10)) {
    } else {
      break;
    }
    let x_100 : i32 = i_2;
    let x_101 : i32 = i_2;
    obj.numbers[x_100] = (10 - x_101);
    let x_104 : i32 = i_2;
    let x_105 : i32 = i_2;
    let x_107 : i32 = obj.numbers[x_105];
    let x_108 : i32 = i_2;
    let x_110 : i32 = obj.numbers[x_108];
    obj.numbers[x_104] = (x_107 * x_110);

    continuing {
      let x_113 : i32 = i_2;
      i_2 = (x_113 + 1);
    }
  }
  quicksort_();
  let x_116 : vec4<f32> = x_GLF_FragCoord;
  let x_119 : vec2<f32> = x_34.resolution;
  uv = (vec2<f32>(x_116.x, x_116.y) / x_119);
  color = vec3<f32>(1.0, 2.0, 3.0);
  let x_122 : i32 = obj.numbers[0];
  let x_125 : f32 = color.x;
  color.x = (x_125 + f32(x_122));
  let x_129 : f32 = uv.x;
  if ((x_129 > 0.25)) {
    let x_134 : i32 = obj.numbers[1];
    let x_137 : f32 = color.x;
    color.x = (x_137 + f32(x_134));
  }
  let x_141 : f32 = uv.x;
  if ((x_141 > 0.5)) {
    let x_146 : i32 = obj.numbers[2];
    let x_149 : f32 = color.y;
    color.y = (x_149 + f32(x_146));
  }
  let x_153 : f32 = uv.x;
  if ((x_153 > 0.75)) {
    let x_158 : i32 = obj.numbers[3];
    let x_161 : f32 = color.z;
    color.z = (x_161 + f32(x_158));
  }
  let x_165 : i32 = obj.numbers[4];
  let x_168 : f32 = color.y;
  color.y = (x_168 + f32(x_165));
  let x_172 : f32 = uv.y;
  if ((x_172 > 0.25)) {
    let x_177 : i32 = obj.numbers[5];
    let x_180 : f32 = color.x;
    color.x = (x_180 + f32(x_177));
  }
  let x_184 : f32 = uv.y;
  if ((x_184 > 0.5)) {
    let x_189 : i32 = obj.numbers[6];
    let x_192 : f32 = color.y;
    color.y = (x_192 + f32(x_189));
  }
  let x_196 : f32 = uv.y;
  if ((x_196 > 0.75)) {
    let x_201 : i32 = obj.numbers[7];
    let x_204 : f32 = color.z;
    color.z = (x_204 + f32(x_201));
  }
  let x_208 : i32 = obj.numbers[8];
  let x_211 : f32 = color.z;
  color.z = (x_211 + f32(x_208));
  let x_215 : f32 = uv.x;
  let x_217 : f32 = uv.y;
  if ((abs((x_215 - x_217)) < 0.25)) {
    let x_224 : i32 = obj.numbers[9];
    let x_227 : f32 = color.x;
    color.x = (x_227 + f32(x_224));
  }
  let x_230 : vec3<f32> = color;
  let x_231 : vec3<f32> = normalize(x_230);
  frag_color = vec4<f32>(x_231.x, x_231.y, x_231.z, 1.0);
  let x_236 : vec4<f32> = x_GLF_pos;
  gl_Position = x_236;
  return;
}

struct main_out {
  [[location(0)]]
  frag_color_1 : vec4<f32>;
  [[builtin(position)]]
  gl_Position : vec4<f32>;
};

[[stage(vertex)]]
fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
  x_GLF_pos = x_GLF_pos_param;
  main_1();
  return main_out(frag_color, gl_Position);
}
