void set_float3(inout float3 vec, int idx, float val) {
  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}

void set_float2(inout float2 vec, int idx, float val) {
  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
}

cbuffer cbuffer_x_25 : register(b0, space0) {
  uint4 x_25[1];
};
static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

float3 drawShape_vf2_(inout float2 pos) {
  bool c2 = false;
  bool c3 = false;
  bool c4 = false;
  bool c5 = false;
  bool c6 = false;
  int GLF_live4i = 0;
  int GLF_live4_looplimiter5 = 0;
  float4x2 GLF_live7m42 = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float3x3 GLF_live7m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  int GLF_live7cols = 0;
  int GLF_live7_looplimiter3 = 0;
  int GLF_live7rows = 0;
  int GLF_live7_looplimiter2 = 0;
  int GLF_live7_looplimiter1 = 0;
  int GLF_live7c = 0;
  int GLF_live7r = 0;
  int GLF_live7_looplimiter0 = 0;
  int GLF_live7sum_index = 0;
  int GLF_live7_looplimiter7 = 0;
  int GLF_live7cols_1 = 0;
  int GLF_live7rows_1 = 0;
  float GLF_live7sums[9] = (float[9])0;
  int GLF_live7c_1 = 0;
  int GLF_live7r_1 = 0;
  int x_180 = 0;
  float3x3 indexable = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  const float x_182 = pos.x;
  c2 = (x_182 > 1.0f);
  if (c2) {
    return float3(1.0f, 1.0f, 1.0f);
  }
  const float x_188 = pos.y;
  c3 = (x_188 < 1.0f);
  if (c3) {
    return float3(1.0f, 1.0f, 1.0f);
  }
  const float x_194 = pos.y;
  c4 = (x_194 > 1.0f);
  if (c4) {
    return float3(1.0f, 1.0f, 1.0f);
  }
  const float x_200 = pos.x;
  c5 = (x_200 < 1.0f);
  if (c5) {
    return float3(1.0f, 1.0f, 1.0f);
  }
  const float x_206 = pos.x;
  c6 = ((x_206 + 1.0f) > 1.0f);
  if (c6) {
    return float3(1.0f, 1.0f, 1.0f);
  }
  GLF_live4i = 0;
  {
    for(; (GLF_live4i < 4); GLF_live4i = (GLF_live4i + 1)) {
      if ((GLF_live4_looplimiter5 >= 7)) {
        break;
      }
      GLF_live4_looplimiter5 = (GLF_live4_looplimiter5 + 1);
      GLF_live7m42 = float4x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f));
      GLF_live7m33 = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
      GLF_live7cols = 2;
      {
        for(; (GLF_live7cols < 4); GLF_live7cols = (GLF_live7cols + 1)) {
          if ((GLF_live7_looplimiter3 >= 7)) {
            break;
          }
          GLF_live7_looplimiter3 = (GLF_live7_looplimiter3 + 1);
          GLF_live7rows = 2;
          {
            for(; (GLF_live7rows < 4); GLF_live7rows = (GLF_live7rows + 1)) {
              if ((GLF_live7_looplimiter2 >= 7)) {
                break;
              }
              GLF_live7_looplimiter2 = (GLF_live7_looplimiter2 + 1);
              GLF_live7_looplimiter1 = 0;
              GLF_live7c = 0;
              {
                for(; (GLF_live7c < 3); GLF_live7c = (GLF_live7c + 1)) {
                  if ((GLF_live7_looplimiter1 >= 7)) {
                    break;
                  }
                  GLF_live7_looplimiter1 = (GLF_live7_looplimiter1 + 1);
                  GLF_live7r = 0;
                  {
                    for(; (GLF_live7r < 2); GLF_live7r = (GLF_live7r + 1)) {
                      if ((GLF_live7_looplimiter0 >= 7)) {
                        break;
                      }
                      GLF_live7_looplimiter0 = (GLF_live7_looplimiter0 + 1);
                      set_float3(GLF_live7m33[(((GLF_live7c >= 0) & (GLF_live7c < 3)) ? GLF_live7c : 0)], (((GLF_live7r >= 0) & (GLF_live7r < 3)) ? GLF_live7r : 0), 1.0f);
                      const float x_267 = asfloat(x_25[0].y);
                      if ((0.0f > x_267)) {
                      } else {
                        set_float2(GLF_live7m42[(((GLF_live7c >= 0) & (GLF_live7c < 4)) ? GLF_live7c : 0)], (((GLF_live7r >= 0) & (GLF_live7r < 2)) ? GLF_live7r : 0), 1.0f);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      GLF_live7sum_index = 0;
      GLF_live7_looplimiter7 = 0;
      GLF_live7cols_1 = 2;
      {
        for(; (GLF_live7cols_1 < 4); GLF_live7cols_1 = (GLF_live7cols_1 + 1)) {
          if ((GLF_live7_looplimiter7 >= 7)) {
            break;
          }
          GLF_live7_looplimiter7 = (GLF_live7_looplimiter7 + 1);
          GLF_live7rows_1 = 2;
          GLF_live7sums[(((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? GLF_live7sum_index : 0)] = 0.0f;
          GLF_live7c_1 = 0;
          {
            for(; (GLF_live7c_1 < 1); GLF_live7c_1 = (GLF_live7c_1 + 1)) {
              GLF_live7r_1 = 0;
              {
                for(; (GLF_live7r_1 < GLF_live7rows_1); GLF_live7r_1 = (GLF_live7r_1 + 1)) {
                  const int x_310 = (((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? GLF_live7sum_index : 0);
                  const float3x3 x_312 = transpose(GLF_live7m33);
                  if ((GLF_live7c_1 < 3)) {
                    x_180 = 1;
                  } else {
                    const float x_318 = asfloat(x_25[0].x);
                    x_180 = int(x_318);
                  }
                  const int x_320 = x_180;
                  const int x_93 = GLF_live7r_1;
                  indexable = x_312;
                  const float x_324 = indexable[x_320][((x_93 < 3) ? 1 : 0)];
                  const float x_326 = GLF_live7sums[x_310];
                  GLF_live7sums[x_310] = (x_326 + x_324);
                  const int x_332 = (((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? GLF_live7sum_index : 0);
                  const float x_334 = GLF_live7m42[1][GLF_live7r_1];
                  const float x_336 = GLF_live7sums[x_332];
                  GLF_live7sums[x_332] = (x_336 + x_334);
                }
              }
            }
          }
          GLF_live7sum_index = (GLF_live7sum_index + 1);
        }
      }
    }
  }
  return float3(1.0f, 1.0f, 1.0f);
}

void main_1() {
  float2 position = float2(0.0f, 0.0f);
  float2 param = float2(0.0f, 0.0f);
  float2 param_1 = float2(0.0f, 0.0f);
  int i = 0;
  float2 param_2 = float2(0.0f, 0.0f);
  const float x_161 = asfloat(x_25[0].x);
  if ((x_161 >= 2.0f)) {
    const float4 x_165 = gl_FragCoord;
    position = float2(x_165.x, x_165.y);
    param = position;
    const float3 x_168 = drawShape_vf2_(param);
    param_1 = position;
    const float3 x_170 = drawShape_vf2_(param_1);
    i = 25;
    {
      for(; (i > 0); i = (i - 1)) {
        param_2 = position;
        const float3 x_178 = drawShape_vf2_(param_2);
      }
    }
  }
  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_3 = {x_GLF_color};
  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}
