#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 = (x_253 + 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 = (x_277 + 1);
      int const x_279 = i;
      i = (x_279 + 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 = (x_284 + 1);
      int const x_286 = j;
      j = (x_286 + 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 = (x_302 + 1);
    int const x_304 = i;
    i = (x_304 + 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 = (x_323 + 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 = ((x_344 + x_345) - 1);
      int const x_348 = i_2;
      int const x_349 = m;
      int const x_353 = high;
      to_1 = min(((x_348 + (2 * x_349)) - 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 = (x_361 + (2 * x_359));
      }
    }
    {
      int const x_363 = m;
      m = (2 * 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 = (x_122 + 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 = (x_138 + 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;
}

