void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    //Setup the coordinates & base color
    vec2 uv = (fragCoord.xy / iResolution.xy)*2.0-1.0;
    vec3 color = vec3(0.0);
    float a = 0.2 + sin(iTime+cos(iTime))*0.2;
    
    //Fractalize the coordinates
    uv *= 0.8+sin(iTime+uv.x-uv.y)*0.2;
    for(int i = 0; i < 4; i++) {
        uv = abs(uv);
        uv -= 0.5;
        uv *= 1.1;
        uv *= mat2(cos(a), -sin(a), sin(a), cos(a));
        uv += 0.5;
    }
    
    
    //Setup the angle of rotation & the center of the circle
    float angle = atan(-uv.y,uv.x-0.5)*0.1;
    float len = length(uv-vec2(0.2,0.5));

    //Rotate the UV coordinates as color
    color.r += sin(len*40.0+angle*40.0+iTime);
    color.g += cos(len*30.0+angle*50.0-iTime);
    color.b += sin(len*50.0+angle*60.0+3.0);

    //Add in the fractal component
    color = color * fract(color * 3.0);
    fragColor = vec4(color,1.0);
}
