#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_251 = *(from);
  k = x_251;
  int const x_252 = *(from);
  i = x_252;
  int const x_253 = *(mid);
  j = as_type<int>((as_type<uint>(x_253) + as_type<uint>(1)));
  while (true) {
    int const x_259 = i;
    int const x_260 = *(mid);
    int const x_262 = j;
    int const x_263 = *(to);
    if (((x_259 <= x_260) & (x_262 <= x_263))) {
    } else {
      break;
    }
    int const x_267 = i;
    int const x_269 = (*(tint_symbol_5)).arr[x_267];
    int const x_270 = j;
    int const x_272 = (*(tint_symbol_5)).arr[x_270];
    if ((x_269 < x_272)) {
      int const x_277 = k;
      k = as_type<int>((as_type<uint>(x_277) + as_type<uint>(1)));
      int const x_279 = i;
      i = as_type<int>((as_type<uint>(x_279) + as_type<uint>(1)));
      int const x_282 = (*(tint_symbol_5)).arr[x_279];
      (*(tint_symbol_6)).arr[x_277] = x_282;
    } else {
      int const x_284 = k;
      k = as_type<int>((as_type<uint>(x_284) + as_type<uint>(1)));
      int const x_286 = j;
      j = as_type<int>((as_type<uint>(x_286) + as_type<uint>(1)));
      int const x_289 = (*(tint_symbol_5)).arr[x_286];
      (*(tint_symbol_6)).arr[x_284] = x_289;
    }
  }
  while (true) {
    int const x_295 = i;
    int const x_297 = i;
    int const x_298 = *(mid);
    if (((x_295 < 10) & (x_297 <= x_298))) {
    } else {
      break;
    }
    int const x_302 = k;
    k = as_type<int>((as_type<uint>(x_302) + as_type<uint>(1)));
    int const x_304 = i;
    i = as_type<int>((as_type<uint>(x_304) + as_type<uint>(1)));
    int const x_307 = (*(tint_symbol_5)).arr[x_304];
    (*(tint_symbol_6)).arr[x_302] = x_307;
  }
  int const x_309 = *(from);
  i_1 = x_309;
  while (true) {
    int const x_314 = i_1;
    int const x_315 = *(to);
    if ((x_314 <= x_315)) {
    } else {
      break;
    }
    int const x_318 = i_1;
    int const x_319 = i_1;
    int const x_321 = (*(tint_symbol_6)).arr[x_319];
    (*(tint_symbol_5)).arr[x_318] = x_321;
    {
      int const x_323 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_323) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
  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_330 = m;
    int const x_331 = high;
    if ((x_330 <= x_331)) {
    } else {
      break;
    }
    int const x_334 = low;
    i_2 = x_334;
    while (true) {
      int const x_339 = i_2;
      int const x_340 = high;
      if ((x_339 < x_340)) {
      } else {
        break;
      }
      int const x_343 = i_2;
      from_1 = x_343;
      int const x_344 = i_2;
      int const x_345 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_344) + as_type<uint>(x_345)))) - as_type<uint>(1)));
      int const x_348 = i_2;
      int const x_349 = m;
      int const x_353 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_348) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_349))))))) - as_type<uint>(1))), x_353);
      int const x_355 = from_1;
      param = x_355;
      int const x_356 = mid_1;
      param_1 = x_356;
      int const x_357 = to_1;
      param_2 = x_357;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
      {
        int const x_359 = m;
        int const x_361 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_361) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_359))))));
      }
    }
    {
      int const x_363 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_363)));
    }
  }
  return;
}

void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_84 = x_28.injectionSwitch.x;
  i_3 = int(x_84);
  while (true) {
    int const x_90 = i_3;
    switch(x_90) {
      case 9: {
        int const x_120 = i_3;
        (*(tint_symbol_9)).arr[x_120] = -5;
        break;
      }
      case 8: {
        int const x_118 = i_3;
        (*(tint_symbol_9)).arr[x_118] = -4;
        break;
      }
      case 7: {
        int const x_116 = i_3;
        (*(tint_symbol_9)).arr[x_116] = -3;
        break;
      }
      case 6: {
        int const x_114 = i_3;
        (*(tint_symbol_9)).arr[x_114] = -2;
        break;
      }
      case 5: {
        int const x_112 = i_3;
        (*(tint_symbol_9)).arr[x_112] = -1;
        break;
      }
      case 4: {
        int const x_110 = i_3;
        (*(tint_symbol_9)).arr[x_110] = 0;
        break;
      }
      case 3: {
        int const x_108 = i_3;
        (*(tint_symbol_9)).arr[x_108] = 1;
        break;
      }
      case 2: {
        int const x_106 = i_3;
        (*(tint_symbol_9)).arr[x_106] = 2;
        break;
      }
      case 1: {
        int const x_104 = i_3;
        (*(tint_symbol_9)).arr[x_104] = 3;
        break;
      }
      case 0: {
        int const x_102 = i_3;
        (*(tint_symbol_9)).arr[x_102] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_122 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_122) + as_type<uint>(1)));
    {
      int const x_124 = i_3;
      if ((x_124 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_130 = j_1;
    if ((x_130 < 10)) {
    } else {
      break;
    }
    int const x_133 = j_1;
    int const x_134 = j_1;
    int const x_136 = (*(tint_symbol_9)).arr[x_134];
    (*(tint_symbol_10)).arr[x_133] = x_136;
    {
      int const x_138 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_138) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_9, tint_symbol_10);
  float const x_142 = (*(tint_symbol_11)).y;
  if ((int(x_142) < 30)) {
    int const x_149 = (*(tint_symbol_9)).arr[0];
    grey = (0.5f + (float(x_149) / 10.0f));
  } else {
    float const x_154 = (*(tint_symbol_11)).y;
    if ((int(x_154) < 60)) {
      int const x_161 = (*(tint_symbol_9)).arr[1];
      grey = (0.5f + (float(x_161) / 10.0f));
    } else {
      float const x_166 = (*(tint_symbol_11)).y;
      if ((int(x_166) < 90)) {
        int const x_173 = (*(tint_symbol_9)).arr[2];
        grey = (0.5f + (float(x_173) / 10.0f));
      } else {
        float const x_178 = (*(tint_symbol_11)).y;
        if ((int(x_178) < 120)) {
          int const x_185 = (*(tint_symbol_9)).arr[3];
          grey = (0.5f + (float(x_185) / 10.0f));
        } else {
          float const x_190 = (*(tint_symbol_11)).y;
          if ((int(x_190) < 150)) {
            discard_fragment();
          } else {
            float const x_197 = (*(tint_symbol_11)).y;
            if ((int(x_197) < 180)) {
              int const x_204 = (*(tint_symbol_9)).arr[5];
              grey = (0.5f + (float(x_204) / 10.0f));
            } else {
              float const x_209 = (*(tint_symbol_11)).y;
              if ((int(x_209) < 210)) {
                int const x_216 = (*(tint_symbol_9)).arr[6];
                grey = (0.5f + (float(x_216) / 10.0f));
              } else {
                float const x_221 = (*(tint_symbol_11)).y;
                if ((int(x_221) < 240)) {
                  int const x_228 = (*(tint_symbol_9)).arr[7];
                  grey = (0.5f + (float(x_228) / 10.0f));
                } else {
                  float const x_233 = (*(tint_symbol_11)).y;
                  if ((int(x_233) < 270)) {
                    int const x_240 = (*(tint_symbol_9)).arr[8];
                    grey = (0.5f + (float(x_240) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_244 = grey;
  float3 const x_245 = float3(x_244, x_244, x_244);
  *(tint_symbol_12) = float4(x_245.x, x_245.y, x_245.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_13 = 0.0f;
  thread tint_array_wrapper tint_symbol_14 = {};
  thread tint_array_wrapper tint_symbol_15 = {};
  thread float4 tint_symbol_16 = 0.0f;
  tint_symbol_13 = gl_FragCoord_param;
  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

