/*#pragma settings SkVMDebugTrace*/

uniform half4 colorRed, colorGreen;

// Should return 5
const float kZero = 0;
float return_loop(float five) {
    for (float i = kZero; i < 10; ++i) {
        if (i == five) { return i; }
    }
    return 0;
}

// Should return 35
const float kTen = kZero + 10;
float continue_loop(float five) {
    float sum = 0;
    for (float i = 0; i < kTen; ++i) {
        if (i < five) { continue; }
        sum += i;
    }
    return sum;
}

// Should return 15
float break_loop(float five) {
    float sum = 0;
    const float kOne = 1;
    for (float i = 0; i < 10; i += kOne) {
        if (i > five) { break; }
        sum += i;
    }
    return sum;
}

// Should return a value close to zero
float float_loop() {
    float sum = 0;
    for (float i = 0.123; i < 0.6; i += 0.111) {
        sum += i;
    }
    return sum - 1.725;
}

bool loop_operator_le() {
    // These loops are inside-out and execute zero times.
    for (float i = 3; i <= 1; ++i) { return false; }
    for (float i = 3; i <= 1; --i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i <= 3; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_lt() {
    // These loops are inside-out and execute zero times.
    for (float i = 4; i < 1; ++i) { return false; }
    for (float i = 4; i < 1; --i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i < 4; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_ge() {
    // These loops are inside-out and execute zero times.
    for (float i = 1; i >= 3; ++i) { return false; }
    for (float i = 1; i >= 3; --i) { return false; }

    float4 result = float4(9);
    for (float i = 3; i >= 1; --i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 3, 2, 1);
}

bool loop_operator_gt() {
    // These loops are inside-out and execute zero times.
    for (float i = 0; i > 3; ++i) { return false; }
    for (float i = 0; i > 3; --i) { return false; }

    float4 result = float4(9);
    for (float i = 3; i > 0; --i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 3, 2, 1);
}

bool loop_operator_ne() {
    // This loop executes zero times.
    for (int i = 1; i != 1; ++i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i != 4; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 1, 2, 3);
}

bool loop_operator_eq() {
    // This loops mismatches and executes zero times.
    for (float i = 1; i == 2; ++i) { return false; }

    float4 result = float4(9);
    for (float i = 1; i == 1; ++i) {
        result = float4(result.yzw, i);
    }
    return result == float4(9, 9, 9, 1);
}

half4 main(float2 pos) {
    float five = clamp(pos.x, colorGreen.g, colorGreen.a) * 5.0;
    return (return_loop(five) == 5 && continue_loop(five) == 35 &&
            break_loop(five) == 15 && abs(float_loop()) < 0.025 &&
            loop_operator_le() && loop_operator_lt() &&
            loop_operator_ge() && loop_operator_gt() &&
            loop_operator_eq() && loop_operator_ne()) ? colorGreen : colorRed;
}
