void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 norm = fragCoord.xy / iResolution.xy;
    vec2 pos = (norm - vec2(0.5, 0.5)) * vec2(3.6, 2.0);
    float r = sqrt(dot(pos, pos));
    r *= 1.0 + 0.4 * sin(iTime * 0.12);
    float b = 1.0;
    if (r < 1.0)
    {
        norm = vec2(1.0, 1.0) - norm;
        norm *= sqrt(r);
        b -= pow(r, 10.0);
        b *= 0.9 + 0.2 * sin(iTime * 3.1);
    }

    vec2 uv = norm;
    uv.x += 0.6 * sin(iTime + norm.y * 3.0);
    uv.y += 0.6 * sin(iTime + norm.x * 3.0);
	fragColor = vec4(uv,0.5+0.5*sin(iTime * 1.228),1.0);
    uv.x += 0.2 * sin(iTime + norm.y * 29.0);
    uv.y += 0.2 * sin(iTime + norm.x * 29.0);
	fragColor +=  0.3 * vec4(uv,0.5+0.5*sin(iTime),1.0);
    
    uv.x += 0.2 * sin(iTime * 5.0 + norm.y * 129.0);
    uv.y += 0.2 * sin(iTime * 5.0 + norm.x * 129.0);
	fragColor +=  max(uv.x * uv.y - (sin(iTime * 0.04) + 1.0) * 0.1, 0.0);

 	fragColor -=  0.7*r;
 	fragColor *=  b;
 	fragColor.b =  max(fragColor.b, -0.2);
 	fragColor.b +=  fragColor.g * 0.4;
    
 	fragColor =  max(fragColor, vec4(0.0, 0.0, 0.0, 0.0));
    if (r > 1.0)
    {
        float a = atan(pos.y / pos.x);
 		float halo = 0.2 * pow(0.5, r * r + sin(a * 12.0 + iTime));
 		halo += 0.2 * pow(0.5, r * r + sin(a * 8.0 - iTime * 1.3));
 		halo += 0.2 * pow(0.5, r * r + sin(a * 18.0 + iTime * 1.2));
 		vec4 col = vec4(halo - 0.1, halo - 0.08, halo, 0);
        col + max(col, vec4(0.0, 0.0, 0.0, 0.0));
        fragColor += col;
    }
}
