#include <metal_stdlib>

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

void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_302 = *(from);
  k = x_302;
  int const x_303 = *(from);
  i = x_303;
  int const x_304 = *(mid);
  j = as_type<int>((as_type<uint>(x_304) + as_type<uint>(1)));
  while (true) {
    int const x_310 = i;
    int const x_311 = *(mid);
    int const x_313 = j;
    int const x_314 = *(to);
    if (((x_310 <= x_311) & (x_313 <= x_314))) {
    } else {
      break;
    }
    int const x_318 = i;
    int const x_320 = (*(tint_symbol_5)).arr[x_318];
    int const x_321 = j;
    int const x_323 = (*(tint_symbol_5)).arr[x_321];
    if ((x_320 < x_323)) {
      int const x_328 = k;
      k = as_type<int>((as_type<uint>(x_328) + as_type<uint>(1)));
      int const x_330 = i;
      i = as_type<int>((as_type<uint>(x_330) + as_type<uint>(1)));
      int const x_333 = (*(tint_symbol_5)).arr[x_330];
      (*(tint_symbol_6)).arr[x_328] = x_333;
    } else {
      int const x_335 = k;
      k = as_type<int>((as_type<uint>(x_335) + as_type<uint>(1)));
      int const x_337 = j;
      j = as_type<int>((as_type<uint>(x_337) + as_type<uint>(1)));
      int const x_340 = (*(tint_symbol_5)).arr[x_337];
      (*(tint_symbol_6)).arr[x_335] = x_340;
    }
  }
  while (true) {
    int const x_346 = i;
    int const x_348 = i;
    int const x_349 = *(mid);
    if (((x_346 < 10) & (x_348 <= x_349))) {
    } else {
      break;
    }
    int const x_353 = k;
    k = as_type<int>((as_type<uint>(x_353) + as_type<uint>(1)));
    int const x_355 = i;
    i = as_type<int>((as_type<uint>(x_355) + as_type<uint>(1)));
    int const x_358 = (*(tint_symbol_5)).arr[x_355];
    (*(tint_symbol_6)).arr[x_353] = x_358;
  }
  int const x_360 = *(from);
  i_1 = x_360;
  while (true) {
    int const x_365 = i_1;
    int const x_366 = *(to);
    if ((x_365 <= x_366)) {
    } else {
      break;
    }
    int const x_369 = i_1;
    int const x_370 = i_1;
    int const x_372 = (*(tint_symbol_6)).arr[x_370];
    (*(tint_symbol_5)).arr[x_369] = x_372;
    {
      int const x_374 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_374) + as_type<uint>(1)));
    }
  }
  return;
}

void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int x_85 = 0;
  int x_86 = 0;
  int x_87 = 0;
  int x_88 = 0;
  int x_89 = 0;
  int x_90 = 0;
  int x_91 = 0;
  int x_92 = 0;
  int x_93 = 0;
  int x_94 = 0;
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_96 = x_28.injectionSwitch.x;
  i_3 = int(x_96);
  while (true) {
    int const x_102 = i_3;
    switch(x_102) {
      case 9: {
        int const x_132 = i_3;
        (*(tint_symbol_7)).arr[x_132] = -5;
        break;
      }
      case 8: {
        int const x_130 = i_3;
        (*(tint_symbol_7)).arr[x_130] = -4;
        break;
      }
      case 7: {
        int const x_128 = i_3;
        (*(tint_symbol_7)).arr[x_128] = -3;
        break;
      }
      case 6: {
        int const x_126 = i_3;
        (*(tint_symbol_7)).arr[x_126] = -2;
        break;
      }
      case 5: {
        int const x_124 = i_3;
        (*(tint_symbol_7)).arr[x_124] = -1;
        break;
      }
      case 4: {
        int const x_122 = i_3;
        (*(tint_symbol_7)).arr[x_122] = 0;
        break;
      }
      case 3: {
        int const x_120 = i_3;
        (*(tint_symbol_7)).arr[x_120] = 1;
        break;
      }
      case 2: {
        int const x_118 = i_3;
        (*(tint_symbol_7)).arr[x_118] = 2;
        break;
      }
      case 1: {
        int const x_116 = i_3;
        (*(tint_symbol_7)).arr[x_116] = 3;
        break;
      }
      case 0: {
        int const x_114 = i_3;
        (*(tint_symbol_7)).arr[x_114] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_134 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_134) + as_type<uint>(1)));
    {
      int const x_136 = i_3;
      if ((x_136 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_142 = j_1;
    if ((x_142 < 10)) {
    } else {
      break;
    }
    int const x_145 = j_1;
    int const x_146 = j_1;
    int const x_148 = (*(tint_symbol_7)).arr[x_146];
    (*(tint_symbol_8)).arr[x_145] = x_148;
    {
      int const x_150 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_150) + as_type<uint>(1)));
    }
  }
  x_94 = 0;
  x_93 = 9;
  x_92 = 1;
  while (true) {
    int const x_156 = x_92;
    int const x_157 = x_93;
    if ((x_156 <= x_157)) {
    } else {
      break;
    }
    int const x_160 = x_94;
    x_91 = x_160;
    while (true) {
      int const x_165 = x_91;
      int const x_166 = x_93;
      if ((x_165 < x_166)) {
      } else {
        break;
      }
      int const x_169 = x_91;
      x_90 = x_169;
      int const x_170 = x_91;
      int const x_171 = x_92;
      x_89 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_170) + as_type<uint>(x_171)))) - as_type<uint>(1)));
      int const x_174 = x_91;
      int const x_175 = x_92;
      int const x_179 = x_93;
      x_88 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_174) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_175))))))) - as_type<uint>(1))), x_179);
      int const x_181 = x_90;
      x_87 = x_181;
      int const x_182 = x_89;
      x_86 = x_182;
      int const x_183 = x_88;
      x_85 = x_183;
      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85), tint_symbol_7, tint_symbol_8);
      {
        int const x_185 = x_92;
        int const x_187 = x_91;
        x_91 = as_type<int>((as_type<uint>(x_187) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_185))))));
      }
    }
    {
      int const x_189 = x_92;
      x_92 = as_type<int>((as_type<uint>(2) * as_type<uint>(x_189)));
    }
  }
  float const x_193 = (*(tint_symbol_9)).y;
  if ((int(x_193) < 30)) {
    int const x_200 = (*(tint_symbol_7)).arr[0];
    grey = (0.5f + (float(x_200) / 10.0f));
  } else {
    float const x_205 = (*(tint_symbol_9)).y;
    if ((int(x_205) < 60)) {
      int const x_212 = (*(tint_symbol_7)).arr[1];
      grey = (0.5f + (float(x_212) / 10.0f));
    } else {
      float const x_217 = (*(tint_symbol_9)).y;
      if ((int(x_217) < 90)) {
        int const x_224 = (*(tint_symbol_7)).arr[2];
        grey = (0.5f + (float(x_224) / 10.0f));
      } else {
        float const x_229 = (*(tint_symbol_9)).y;
        if ((int(x_229) < 120)) {
          int const x_236 = (*(tint_symbol_7)).arr[3];
          grey = (0.5f + (float(x_236) / 10.0f));
        } else {
          float const x_241 = (*(tint_symbol_9)).y;
          if ((int(x_241) < 150)) {
            discard_fragment();
          } else {
            float const x_248 = (*(tint_symbol_9)).y;
            if ((int(x_248) < 180)) {
              int const x_255 = (*(tint_symbol_7)).arr[5];
              grey = (0.5f + (float(x_255) / 10.0f));
            } else {
              float const x_260 = (*(tint_symbol_9)).y;
              if ((int(x_260) < 210)) {
                int const x_267 = (*(tint_symbol_7)).arr[6];
                grey = (0.5f + (float(x_267) / 10.0f));
              } else {
                float const x_272 = (*(tint_symbol_9)).y;
                if ((int(x_272) < 240)) {
                  int const x_279 = (*(tint_symbol_7)).arr[7];
                  grey = (0.5f + (float(x_279) / 10.0f));
                } else {
                  float const x_284 = (*(tint_symbol_9)).y;
                  if ((int(x_284) < 270)) {
                    int const x_291 = (*(tint_symbol_7)).arr[8];
                    grey = (0.5f + (float(x_291) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_295 = grey;
  float3 const x_296 = float3(x_295, x_295, x_295);
  *(tint_symbol_10) = float4(x_296.x, x_296.y, x_296.z, 1.0f);
  return;
}

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

void mergeSort_(thread tint_array_wrapper* const tint_symbol_15, thread tint_array_wrapper* const tint_symbol_16) {
  int low = 0;
  int high = 0;
  int m = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  low = 0;
  high = 9;
  m = 1;
  while (true) {
    int const x_381 = m;
    int const x_382 = high;
    if ((x_381 <= x_382)) {
    } else {
      break;
    }
    int const x_385 = low;
    i_2 = x_385;
    while (true) {
      int const x_390 = i_2;
      int const x_391 = high;
      if ((x_390 < x_391)) {
      } else {
        break;
      }
      int const x_394 = i_2;
      from_1 = x_394;
      int const x_395 = i_2;
      int const x_396 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_395) + as_type<uint>(x_396)))) - as_type<uint>(1)));
      int const x_399 = i_2;
      int const x_400 = m;
      int const x_404 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_399) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_400))))))) - as_type<uint>(1))), x_404);
      int const x_406 = from_1;
      param = x_406;
      int const x_407 = mid_1;
      param_1 = x_407;
      int const x_408 = to_1;
      param_2 = x_408;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_15, tint_symbol_16);
      {
        int const x_410 = m;
        int const x_412 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_412) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_410))))));
      }
    }
    {
      int const x_414 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_414)));
    }
  }
  return;
}

