#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ 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_(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_262 = *(from);
  k = x_262;
  int const x_263 = *(from);
  i = x_263;
  int const x_264 = *(mid);
  j = as_type<int>((as_type<uint>(x_264) + as_type<uint>(1)));
  while (true) {
    int const x_270 = i;
    int const x_271 = *(mid);
    int const x_273 = j;
    int const x_274 = *(to);
    if (((x_270 <= x_271) & (x_273 <= x_274))) {
    } else {
      break;
    }
    int const x_278 = i;
    int const x_280 = (*(tint_symbol_3)).arr[x_278];
    int const x_281 = j;
    int const x_283 = (*(tint_symbol_3)).arr[x_281];
    if ((x_280 < x_283)) {
      int const x_288 = k;
      k = as_type<int>((as_type<uint>(x_288) + as_type<uint>(1)));
      int const x_290 = i;
      i = as_type<int>((as_type<uint>(x_290) + as_type<uint>(1)));
      int const x_293 = (*(tint_symbol_3)).arr[x_290];
      (*(tint_symbol_4)).arr[x_288] = x_293;
    } else {
      int const x_295 = k;
      k = as_type<int>((as_type<uint>(x_295) + as_type<uint>(1)));
      int const x_297 = j;
      j = as_type<int>((as_type<uint>(x_297) + as_type<uint>(1)));
      int const x_300 = (*(tint_symbol_3)).arr[x_297];
      (*(tint_symbol_4)).arr[x_295] = x_300;
    }
  }
  while (true) {
    int const x_306 = i;
    int const x_308 = i;
    int const x_309 = *(mid);
    if (((x_306 < 10) & (x_308 <= x_309))) {
    } else {
      break;
    }
    int const x_313 = k;
    k = as_type<int>((as_type<uint>(x_313) + as_type<uint>(1)));
    int const x_315 = i;
    i = as_type<int>((as_type<uint>(x_315) + as_type<uint>(1)));
    int const x_318 = (*(tint_symbol_3)).arr[x_315];
    (*(tint_symbol_4)).arr[x_313] = x_318;
  }
  int const x_320 = *(from);
  i_1 = x_320;
  while (true) {
    int const x_325 = i_1;
    int const x_326 = *(to);
    if ((x_325 <= x_326)) {
    } else {
      break;
    }
    int const x_329 = i_1;
    int const x_330 = i_1;
    int const x_332 = (*(tint_symbol_4)).arr[x_330];
    (*(tint_symbol_3)).arr[x_329] = x_332;
    {
      int const x_334 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_334) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(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_341 = m;
    int const x_342 = high;
    if ((x_341 <= x_342)) {
    } else {
      break;
    }
    int const x_345 = low;
    i_2 = x_345;
    while (true) {
      int const x_350 = i_2;
      int const x_351 = high;
      if ((x_350 < x_351)) {
      } else {
        break;
      }
      int const x_354 = i_2;
      from_1 = x_354;
      int const x_355 = i_2;
      int const x_356 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_355) + as_type<uint>(x_356)))) - as_type<uint>(1)));
      int const x_359 = i_2;
      int const x_360 = m;
      int const x_364 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_359) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_360))))))) - as_type<uint>(1))), x_364);
      int const x_366 = from_1;
      param = x_366;
      int const x_367 = mid_1;
      param_1 = x_367;
      int const x_368 = to_1;
      param_2 = x_368;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_5, tint_symbol_6);
      {
        int const x_370 = m;
        int const x_372 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_372) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_370))))));
      }
    }
    {
      int const x_374 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_374)));
    }
  }
  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_86 = x_28.injectionSwitch.x;
  i_3 = int(x_86);
  while (true) {
    int const x_92 = i_3;
    switch(x_92) {
      case 9: {
        int const x_122 = i_3;
        (*(tint_symbol_7)).arr[x_122] = -5;
        break;
      }
      case 8: {
        int const x_120 = i_3;
        (*(tint_symbol_7)).arr[x_120] = -4;
        break;
      }
      case 7: {
        int const x_118 = i_3;
        (*(tint_symbol_7)).arr[x_118] = -3;
        break;
      }
      case 6: {
        int const x_116 = i_3;
        (*(tint_symbol_7)).arr[x_116] = -2;
        break;
      }
      case 5: {
        int const x_114 = i_3;
        (*(tint_symbol_7)).arr[x_114] = -1;
        break;
      }
      case 4: {
        int const x_112 = i_3;
        (*(tint_symbol_7)).arr[x_112] = 0;
        break;
      }
      case 3: {
        int const x_110 = i_3;
        (*(tint_symbol_7)).arr[x_110] = 1;
        break;
      }
      case 2: {
        int const x_108 = i_3;
        (*(tint_symbol_7)).arr[x_108] = 2;
        break;
      }
      case 1: {
        int const x_106 = i_3;
        (*(tint_symbol_7)).arr[x_106] = 3;
        break;
      }
      case 0: {
        int const x_104 = i_3;
        (*(tint_symbol_7)).arr[x_104] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_124 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_124) + as_type<uint>(1)));
    {
      int const x_126 = i_3;
      if ((x_126 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_132 = j_1;
    bool const x_133 = (x_132 < 10);
    float const x_135 = x_28.injectionSwitch.x;
    if (!((x_135 <= 1.0f))) {
      grey = 1.0f;
    }
    if (x_133) {
    } else {
      break;
    }
    int const x_140 = j_1;
    int const x_141 = j_1;
    int const x_143 = (*(tint_symbol_7)).arr[x_141];
    (*(tint_symbol_8)).arr[x_140] = x_143;
    {
      int const x_145 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_145) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_7, tint_symbol_8);
  float const x_149 = (*(tint_symbol_9)).y;
  if ((int(x_149) < 30)) {
    int const x_156 = (*(tint_symbol_7)).arr[0];
    grey = (0.5f + (float(x_156) / 10.0f));
  } else {
    float const x_161 = (*(tint_symbol_9)).y;
    if ((int(x_161) < 60)) {
      int const x_168 = (*(tint_symbol_7)).arr[1];
      grey = (0.5f + (float(x_168) / 10.0f));
    } else {
      float const x_173 = (*(tint_symbol_9)).y;
      if ((int(x_173) < 90)) {
        int const x_180 = (*(tint_symbol_7)).arr[2];
        grey = (0.5f + (float(x_180) / 10.0f));
      } else {
        float const x_185 = (*(tint_symbol_9)).y;
        if ((int(x_185) < 120)) {
          int const x_192 = (*(tint_symbol_7)).arr[3];
          grey = (0.5f + (float(x_192) / 10.0f));
        } else {
          float const x_197 = (*(tint_symbol_9)).y;
          if ((int(x_197) < 150)) {
            discard_fragment();
          } else {
            float const x_204 = (*(tint_symbol_9)).y;
            if ((int(x_204) < 180)) {
              int const x_211 = (*(tint_symbol_7)).arr[5];
              grey = (0.5f + (float(x_211) / 10.0f));
            } else {
              float const x_216 = (*(tint_symbol_9)).y;
              if ((int(x_216) < 210)) {
                int const x_223 = (*(tint_symbol_7)).arr[6];
                grey = (0.5f + (float(x_223) / 10.0f));
              } else {
                float const x_228 = (*(tint_symbol_9)).y;
                if ((int(x_228) < 240)) {
                  int const x_235 = (*(tint_symbol_7)).arr[7];
                  grey = (0.5f + (float(x_235) / 10.0f));
                } else {
                  float const x_240 = (*(tint_symbol_9)).y;
                  bool guard233 = true;
                  if ((int(x_240) < 270)) {
                    int const x_247 = (*(tint_symbol_7)).arr[8];
                    grey = (0.5f + (float(x_247) / 10.0f));
                    guard233 = false;
                  } else {
                    if (guard233) {
                      float const x_252 = x_28.injectionSwitch.y;
                      if (!((0.0f < x_252))) {
                        guard233 = false;
                      }
                      if (guard233) {
                        discard_fragment();
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_255 = grey;
  float3 const x_256 = float3(x_255, x_255, x_255);
  *(tint_symbol_10) = float4(x_256.x, x_256.y, x_256.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;
}

