#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[10];
};
struct QuicksortObject {
  tint_array_wrapper numbers;
};
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void swap_i1_i1_(thread int* const i, thread int* const j, float3x3 x_228, thread QuicksortObject* const tint_symbol_5) {
  int temp = 0;
  int const x_230 = *(i);
  int const x_232 = (*(tint_symbol_5)).numbers.arr[x_230];
  temp = x_232;
  int const x_233 = *(i);
  int const x_234 = *(j);
  int const x_236 = (*(tint_symbol_5)).numbers.arr[x_234];
  (*(tint_symbol_5)).numbers.arr[x_233] = x_236;
  int const x_238 = *(j);
  int const x_239 = temp;
  (*(tint_symbol_5)).numbers.arr[x_238] = x_239;
  return;
}

int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
  int pivot = 0;
  int i_1 = 0;
  int j_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  int param_3 = 0;
  int const x_242 = *(h);
  int const x_244 = (*(tint_symbol_6)).numbers.arr[x_242];
  pivot = x_244;
  int const x_245 = *(l);
  i_1 = as_type<int>((as_type<uint>(x_245) - as_type<uint>(1)));
  int const x_247 = *(l);
  j_1 = x_247;
  while (true) {
    int const x_252 = j_1;
    int const x_253 = *(h);
    if ((x_252 <= as_type<int>((as_type<uint>(x_253) - as_type<uint>(1))))) {
    } else {
      break;
    }
    int const x_257 = j_1;
    int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
    int const x_260 = pivot;
    if ((x_259 <= x_260)) {
      int const x_264 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_264) + as_type<uint>(1)));
      int const x_266 = i_1;
      param = x_266;
      int const x_267 = j_1;
      param_1 = x_267;
      swap_i1_i1_(&(param), &(param_1), float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)), tint_symbol_6);
    }
    {
      int const x_269 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_269) + as_type<uint>(1)));
    }
  }
  int const x_271 = i_1;
  i_1 = as_type<int>((as_type<uint>(x_271) + as_type<uint>(1)));
  int const x_273 = i_1;
  param_2 = x_273;
  int const x_274 = *(h);
  param_3 = x_274;
  swap_i1_i1_(&(param_2), &(param_3), float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f)), tint_symbol_6);
  int const x_276 = i_1;
  return x_276;
}

void quicksort_(thread QuicksortObject* const tint_symbol_7) {
  int l_1 = 0;
  int h_1 = 0;
  int top = 0;
  tint_array_wrapper stack = {};
  int p = 0;
  int param_4 = 0;
  int param_5 = 0;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  int const x_278 = top;
  int const x_279 = as_type<int>((as_type<uint>(x_278) + as_type<uint>(1)));
  top = x_279;
  int const x_280 = l_1;
  stack.arr[x_279] = x_280;
  int const x_282 = top;
  int const x_283 = as_type<int>((as_type<uint>(x_282) + as_type<uint>(1)));
  top = x_283;
  int const x_284 = h_1;
  stack.arr[x_283] = x_284;
  while (true) {
    int const x_290 = top;
    if ((x_290 >= 0)) {
    } else {
      break;
    }
    int const x_293 = top;
    top = as_type<int>((as_type<uint>(x_293) - as_type<uint>(1)));
    int const x_296 = stack.arr[x_293];
    h_1 = x_296;
    int const x_297 = top;
    top = as_type<int>((as_type<uint>(x_297) - as_type<uint>(1)));
    int const x_300 = stack.arr[x_297];
    l_1 = x_300;
    int const x_301 = l_1;
    param_4 = x_301;
    int const x_302 = h_1;
    param_5 = x_302;
    int const x_303 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_7);
    p = x_303;
    int const x_304 = p;
    int const x_306 = l_1;
    if ((as_type<int>((as_type<uint>(x_304) - as_type<uint>(1))) > x_306)) {
      int const x_310 = top;
      int const x_311 = as_type<int>((as_type<uint>(x_310) + as_type<uint>(1)));
      top = x_311;
      int const x_312 = l_1;
      stack.arr[x_311] = x_312;
      int const x_314 = top;
      int const x_315 = as_type<int>((as_type<uint>(x_314) + as_type<uint>(1)));
      top = x_315;
      int const x_316 = p;
      stack.arr[x_315] = as_type<int>((as_type<uint>(x_316) - as_type<uint>(1)));
    }
    int const x_319 = p;
    int const x_321 = h_1;
    if ((as_type<int>((as_type<uint>(x_319) + as_type<uint>(1))) < x_321)) {
      int const x_325 = top;
      int const x_326 = as_type<int>((as_type<uint>(x_325) + as_type<uint>(1)));
      top = x_326;
      int const x_327 = p;
      stack.arr[x_326] = as_type<int>((as_type<uint>(x_327) + as_type<uint>(1)));
      int const x_330 = top;
      int const x_331 = as_type<int>((as_type<uint>(x_330) + as_type<uint>(1)));
      top = x_331;
      int const x_332 = h_1;
      stack.arr[x_331] = x_332;
    }
  }
  return;
}

void main_1(constant buf0& x_32, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int i_2 = 0;
  float2 uv = 0.0f;
  float3 color = 0.0f;
  i_2 = 0;
  while (true) {
    int const x_89 = i_2;
    if ((x_89 < 10)) {
    } else {
      break;
    }
    int const x_92 = i_2;
    int const x_93 = i_2;
    (*(tint_symbol_8)).numbers.arr[x_92] = as_type<int>((as_type<uint>(10) - as_type<uint>(x_93)));
    int const x_96 = i_2;
    int const x_97 = i_2;
    int const x_99 = (*(tint_symbol_8)).numbers.arr[x_97];
    int const x_100 = i_2;
    int const x_102 = (*(tint_symbol_8)).numbers.arr[x_100];
    (*(tint_symbol_8)).numbers.arr[x_96] = as_type<int>((as_type<uint>(x_99) * as_type<uint>(x_102)));
    {
      int const x_105 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_105) + as_type<uint>(1)));
    }
  }
  quicksort_(tint_symbol_8);
  float4 const x_108 = *(tint_symbol_9);
  float2 const x_111 = x_32.resolution;
  uv = (float2(x_108.x, x_108.y) / x_111);
  color = float3(1.0f, 2.0f, 3.0f);
  int const x_114 = (*(tint_symbol_8)).numbers.arr[0];
  float const x_117 = color.x;
  color.x = (x_117 + float(x_114));
  float const x_121 = uv.x;
  if ((x_121 > 0.25f)) {
    int const x_126 = (*(tint_symbol_8)).numbers.arr[1];
    float const x_129 = color.x;
    color.x = (x_129 + float(x_126));
  }
  float const x_133 = uv.x;
  if ((x_133 > 0.5f)) {
    int const x_138 = (*(tint_symbol_8)).numbers.arr[2];
    float const x_141 = color.y;
    color.y = (x_141 + float(x_138));
  }
  float const x_145 = uv.x;
  if ((x_145 > 0.75f)) {
    int const x_150 = (*(tint_symbol_8)).numbers.arr[3];
    float const x_153 = color.z;
    color.z = (x_153 + float(x_150));
  }
  int const x_157 = (*(tint_symbol_8)).numbers.arr[4];
  float const x_160 = color.y;
  color.y = (x_160 + float(x_157));
  float const x_164 = uv.y;
  if ((x_164 > 0.25f)) {
    int const x_169 = (*(tint_symbol_8)).numbers.arr[5];
    float const x_172 = color.x;
    color.x = (x_172 + float(x_169));
  }
  float const x_176 = uv.y;
  if ((x_176 > 0.5f)) {
    int const x_181 = (*(tint_symbol_8)).numbers.arr[6];
    float const x_184 = color.y;
    color.y = (x_184 + float(x_181));
  }
  float const x_188 = uv.y;
  if ((x_188 > 0.75f)) {
    int const x_193 = (*(tint_symbol_8)).numbers.arr[7];
    float const x_196 = color.z;
    color.z = (x_196 + float(x_193));
  }
  int const x_200 = (*(tint_symbol_8)).numbers.arr[8];
  float const x_203 = color.z;
  color.z = (x_203 + float(x_200));
  float const x_207 = uv.x;
  float const x_209 = uv.y;
  if ((fabs((x_207 - x_209)) < 0.25f)) {
    int const x_216 = (*(tint_symbol_8)).numbers.arr[9];
    float const x_219 = color.x;
    color.x = (x_219 + float(x_216));
  }
  float3 const x_222 = color;
  float3 const x_223 = normalize(x_222);
  *(tint_symbol_10) = float4(x_223.x, x_223.y, x_223.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_32 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread QuicksortObject tint_symbol_12 = {};
  thread float4 tint_symbol_13 = 0.0f;
  tint_symbol_11 = gl_FragCoord_param;
  main_1(x_32, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

