#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_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void merge_i1_i1_i1_(constant buf0& x_28, thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_3, thread tint_array_wrapper* const tint_symbol_4) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_255 = *(from);
  k = x_255;
  int const x_256 = *(from);
  i = x_256;
  int const x_257 = *(mid);
  j = as_type<int>((as_type<uint>(x_257) + as_type<uint>(1)));
  while (true) {
    int x_283 = 0;
    int x_284 = 0;
    int x_303 = 0;
    int x_304 = 0;
    int x_318 = 0;
    int x_322 = 0;
    int x_337 = 0;
    int x_336 = 0;
    int x_350 = 0;
    int x_349 = 0;
    int x_364 = 0;
    int x_363 = 0;
    int x_285_phi = 0;
    int x_305_phi = 0;
    int x_326_phi = 0;
    int x_338_phi = 0;
    int x_351_phi = 0;
    int x_365_phi = 0;
    if ((1.0f >= 0.0f)) {
    } else {
      continue;
    }
    int const x_264 = i;
    int const x_265 = *(mid);
    int const x_267 = j;
    int const x_268 = *(to);
    if (((x_264 <= x_265) & (x_267 <= x_268))) {
    } else {
      break;
    }
    int const x_272 = i;
    int const x_274 = (*(tint_symbol_3)).arr[x_272];
    int const x_275 = j;
    int const x_277 = (*(tint_symbol_3)).arr[x_275];
    bool const x_278 = (x_274 < x_277);
    if (x_278) {
      x_283 = k;
      x_285_phi = x_283;
    } else {
      x_284 = 0;
      x_285_phi = x_284;
    }
    int const x_285 = x_285_phi;
    int const x_286 = as_type<int>((as_type<uint>(x_285) + as_type<uint>(1)));
    if (x_278) {
      k = x_286;
      float const x_291 = x_28.injectionSwitch.x;
      if (!((1.0f <= x_291))) {
      } else {
        continue;
      }
    }
    float const x_295 = x_28.injectionSwitch.y;
    if ((x_295 >= 0.0f)) {
    } else {
      continue;
    }
    int const x_298 = 0;
    if (x_278) {
      x_303 = i;
      x_305_phi = x_303;
    } else {
      x_304 = 0;
      x_305_phi = x_304;
    }
    int const x_305 = x_305_phi;
    int const x_307 = select(x_298, x_305, x_278);
    if (x_278) {
      i = as_type<int>((as_type<uint>(x_307) + as_type<uint>(1)));
    }
    int const x_313 = 0;
    if (x_278) {
      x_318 = (*(tint_symbol_3)).arr[x_307];
      float const x_320 = x_28.injectionSwitch.y;
      x_326_phi = x_318;
      if (!((0.0f <= x_320))) {
        continue;
      }
    } else {
      x_322 = 0;
      float const x_324 = x_28.injectionSwitch.y;
      x_326_phi = x_322;
      if (!((x_324 < 0.0f))) {
      } else {
        continue;
      }
    }
    int const x_326 = x_326_phi;
    if (x_278) {
      (*(tint_symbol_4)).arr[x_285] = select(x_313, x_326, x_278);
    }
    if (x_278) {
      x_337 = 0;
      x_338_phi = x_337;
    } else {
      x_336 = k;
      x_338_phi = x_336;
    }
    int const x_338 = x_338_phi;
    if (x_278) {
    } else {
      k = as_type<int>((as_type<uint>(x_338) + as_type<uint>(1)));
    }
    float const x_343 = x_28.injectionSwitch.x;
    if (!((1.0f <= x_343))) {
    } else {
      continue;
    }
    if (x_278) {
      x_350 = 0;
      x_351_phi = x_350;
    } else {
      x_349 = j;
      x_351_phi = x_349;
    }
    int const x_351 = x_351_phi;
    int const x_353 = 0;
    int const x_355 = select(x_351, x_353, x_278);
    if (x_278) {
    } else {
      j = as_type<int>((as_type<uint>(x_355) + as_type<uint>(1)));
    }
    if (x_278) {
      x_364 = 0;
      x_365_phi = x_364;
    } else {
      x_363 = (*(tint_symbol_3)).arr[x_355];
      x_365_phi = x_363;
    }
    int const x_365 = x_365_phi;
    if (x_278) {
    } else {
      (*(tint_symbol_4)).arr[x_338] = x_365;
    }
  }
  while (true) {
    int const x_374 = i;
    int const x_376 = i;
    int const x_377 = *(mid);
    if (((x_374 < 10) & (x_376 <= x_377))) {
    } else {
      break;
    }
    int const x_381 = k;
    k = as_type<int>((as_type<uint>(x_381) + as_type<uint>(1)));
    int const x_383 = i;
    i = as_type<int>((as_type<uint>(x_383) + as_type<uint>(1)));
    int const x_386 = (*(tint_symbol_3)).arr[x_383];
    (*(tint_symbol_4)).arr[x_381] = x_386;
  }
  int const x_388 = *(from);
  i_1 = x_388;
  while (true) {
    int const x_393 = i_1;
    int const x_394 = *(to);
    if ((x_393 <= x_394)) {
    } else {
      break;
    }
    int const x_397 = i_1;
    int const x_398 = i_1;
    int const x_400 = (*(tint_symbol_4)).arr[x_398];
    (*(tint_symbol_3)).arr[x_397] = x_400;
    {
      int const x_402 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_402) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  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_409 = m;
    int const x_410 = high;
    if ((x_409 <= x_410)) {
    } else {
      break;
    }
    int const x_413 = low;
    i_2 = x_413;
    while (true) {
      int const x_418 = i_2;
      int const x_419 = high;
      if ((x_418 < x_419)) {
      } else {
        break;
      }
      int const x_422 = i_2;
      from_1 = x_422;
      int const x_423 = i_2;
      int const x_424 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_423) + as_type<uint>(x_424)))) - as_type<uint>(1)));
      int const x_427 = i_2;
      int const x_428 = m;
      int const x_432 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_427) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_428))))))) - as_type<uint>(1))), x_432);
      int const x_434 = from_1;
      param = x_434;
      int const x_435 = mid_1;
      param_1 = x_435;
      int const x_436 = to_1;
      param_2 = x_436;
      merge_i1_i1_i1_(x_28, &(param), &(param_1), &(param_2), tint_symbol_5, tint_symbol_6);
      {
        int const x_438 = m;
        int const x_440 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_440) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_438))))));
      }
    }
    {
      int const x_442 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_442)));
    }
  }
  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 i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_88 = x_28.injectionSwitch.x;
  i_3 = int(x_88);
  while (true) {
    int const x_94 = i_3;
    switch(x_94) {
      case 9: {
        int const x_124 = i_3;
        (*(tint_symbol_7)).arr[x_124] = -5;
        break;
      }
      case 8: {
        int const x_122 = i_3;
        (*(tint_symbol_7)).arr[x_122] = -4;
        break;
      }
      case 7: {
        int const x_120 = i_3;
        (*(tint_symbol_7)).arr[x_120] = -3;
        break;
      }
      case 6: {
        int const x_118 = i_3;
        (*(tint_symbol_7)).arr[x_118] = -2;
        break;
      }
      case 5: {
        int const x_116 = i_3;
        (*(tint_symbol_7)).arr[x_116] = -1;
        break;
      }
      case 4: {
        int const x_114 = i_3;
        (*(tint_symbol_7)).arr[x_114] = 0;
        break;
      }
      case 3: {
        int const x_112 = i_3;
        (*(tint_symbol_7)).arr[x_112] = 1;
        break;
      }
      case 2: {
        int const x_110 = i_3;
        (*(tint_symbol_7)).arr[x_110] = 2;
        break;
      }
      case 1: {
        int const x_108 = i_3;
        (*(tint_symbol_7)).arr[x_108] = 3;
        break;
      }
      case 0: {
        int const x_106 = i_3;
        (*(tint_symbol_7)).arr[x_106] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_126 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_126) + as_type<uint>(1)));
    {
      int const x_128 = i_3;
      if ((x_128 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_134 = j_1;
    if ((x_134 < 10)) {
    } else {
      break;
    }
    int const x_137 = j_1;
    int const x_138 = j_1;
    int const x_140 = (*(tint_symbol_7)).arr[x_138];
    (*(tint_symbol_8)).arr[x_137] = x_140;
    {
      int const x_142 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_142) + as_type<uint>(1)));
    }
  }
  mergeSort_(x_28, tint_symbol_7, tint_symbol_8);
  float const x_146 = (*(tint_symbol_9)).y;
  if ((int(x_146) < 30)) {
    int const x_153 = (*(tint_symbol_7)).arr[0];
    grey = (0.5f + (float(x_153) / 10.0f));
  } else {
    float const x_158 = (*(tint_symbol_9)).y;
    if ((int(x_158) < 60)) {
      int const x_165 = (*(tint_symbol_7)).arr[1];
      grey = (0.5f + (float(x_165) / 10.0f));
    } else {
      float const x_170 = (*(tint_symbol_9)).y;
      if ((int(x_170) < 90)) {
        int const x_177 = (*(tint_symbol_7)).arr[2];
        grey = (0.5f + (float(x_177) / 10.0f));
      } else {
        float const x_182 = (*(tint_symbol_9)).y;
        if ((int(x_182) < 120)) {
          int const x_189 = (*(tint_symbol_7)).arr[3];
          grey = (0.5f + (float(x_189) / 10.0f));
        } else {
          float const x_194 = (*(tint_symbol_9)).y;
          if ((int(x_194) < 150)) {
            discard_fragment();
          } else {
            float const x_201 = (*(tint_symbol_9)).y;
            if ((int(x_201) < 180)) {
              int const x_208 = (*(tint_symbol_7)).arr[5];
              grey = (0.5f + (float(x_208) / 10.0f));
            } else {
              float const x_213 = (*(tint_symbol_9)).y;
              if ((int(x_213) < 210)) {
                int const x_220 = (*(tint_symbol_7)).arr[6];
                grey = (0.5f + (float(x_220) / 10.0f));
              } else {
                float const x_225 = (*(tint_symbol_9)).y;
                if ((int(x_225) < 240)) {
                  int const x_232 = (*(tint_symbol_7)).arr[7];
                  grey = (0.5f + (float(x_232) / 10.0f));
                } else {
                  float const x_237 = (*(tint_symbol_9)).y;
                  if ((int(x_237) < 270)) {
                    int const x_244 = (*(tint_symbol_7)).arr[8];
                    grey = (0.5f + (float(x_244) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_248 = grey;
  float3 const x_249 = float3(x_248, x_248, x_248);
  *(tint_symbol_10) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_28, float4 gl_FragCoord_param, thread float4* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread tint_array_wrapper* const tint_symbol_13, thread float4* const tint_symbol_14) {
  *(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_2 = {.x_GLF_color_1=*(tint_symbol_14)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
  thread float4 tint_symbol_15 = 0.0f;
  thread tint_array_wrapper tint_symbol_16 = {};
  thread tint_array_wrapper tint_symbol_17 = {};
  thread float4 tint_symbol_18 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_28, gl_FragCoord_param, &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

