static void Main(string[] args)
        {
            //var p = new ProxyProvider(Properties.Settings.Default.TestProxyInput);
            var p = new ReflectionProvider(Properties.Settings.Default.TestInput);


        }
        private static void RenderAnyTo(ReflectionProvider r, IHTMLElement pre)
        {
            Func<bool> DelegatesParams = () => false;
            Func<bool> IsInterface = () => r.IsInterface;
            Func<bool> IsField = () => false;

            IHTMLElement Target = pre;

            Func<Color, Action<string>> ToColorWrite =
                color =>
                    text =>
                    {
                        var s = new IHTMLSpan { innerText = text };

                        s.style.color = color;
                        s.AttachTo(Target);
                    };

            Func<string, IHTMLSpan> Write = text => new IHTMLSpan(text).AttachTo(Target);

            Action WriteLine = () => Write("\r\n");
            Action WriteSpace = () => Write(" ");

            #region Write<Color>
            Action<string> WriteBlue = ToColorWrite(Color.Blue);
            Action<string> WriteBlack = ToColorWrite(Color.Black);
            Action<string> WriteGray = ToColorWrite(Color.FromRGB(0x80, 0x80, 0x80));
            Action<string> WriteCyan = ToColorWrite(Color.FromRGB(0, 0x80, 0x80));
            Action<string> WriteGreen = ToColorWrite(Color.FromRGB(0, 0x80, 0));
            #endregion

            int Indent = 1;

            Action WriteIdent = () => Write(new string(' ', 4 * Indent));


            #region Region
            Func<string, IDisposable> Region =
                text =>
                {
                    WriteIdent();
                    WriteBlue("#region");
                    WriteSpace();
                    var Collapsible = Write(text);
                    WriteLine();

                    var PreviousTarget = Target;
                    var CurrentTarget = new IHTMLElement(IHTMLElement.HTMLElementEnum.pre).AttachTo(PreviousTarget); ;

                    Collapsible.style.cursor = IStyle.CursorEnum.pointer;
                    Collapsible.onclick +=
                        delegate
                        {
                            CurrentTarget.ToggleVisible();
                        };

                    Target = CurrentTarget;

                    return new Disposable(
                        delegate
                        {


                            WriteIdent();
                            WriteBlue("#endregion");
                            WriteLine();

                            Target = PreviousTarget;
                        }
                    );
                };
            #endregion


            Func<IDisposable> CodeBlock =
                delegate
                {
                    WriteIdent();
                    Write("{");
                    WriteLine();

                    Indent++;

                    return new Disposable(
                        delegate
                        {
                            Indent--;

                            WriteIdent();
                            Write("}");
                            WriteLine();
                        }
                    );
                };

            Action<string> WriteSummary =
                text =>
                {
                    WriteIdent();
                    WriteGray("/// <summary>");
                    WriteLine();

                    WriteIdent();
                    WriteGray("/// ");
                    WriteGreen(text);
                    WriteLine();

                    WriteIdent();
                    WriteGray("/// </summary>");
                    WriteLine();
                };

            Action<string> WriteTypeName =
                text =>
                {
                    var z = FixTypeName(text.Trim());

                    if (CSharpKeywords.Contains(z))
                        WriteBlue(z);
                    else
                        WriteCyan(z);
                };

            Action<string, string> WriteVariableDefinition =
                (TypeName, VariableName) =>
                {
                    WriteTypeName(TypeName);
                    WriteSpace();
                    Write(FixVariableName(VariableName));
                };

            WriteIdent();
            WriteBlue("namespace");
            WriteSpace();
            Write(r.PackageName);
            WriteLine();

            using (CodeBlock())
            {
                WriteIdent();
                Write("[");
                WriteCyan("Script");
                Write("(");
                Write("IsNative = ");
                WriteBlue("true");
                Write(")");
                Write("]");
                WriteLine();

                WriteIdent();

                WriteBlue("public");
                WriteSpace();

                if (r.IsSealed)
                {
                    WriteBlue("sealed");
                    WriteSpace();
                }

                if (r.IsInterface)
                {
                    WriteBlue("interface");
                }
                else
                {
                    WriteBlue("class");
                }
                WriteSpace();
                WriteCyan(r.TypeName);
                WriteLine();

                using (CodeBlock())
                {
                    #region Constants
                    if (r.Constants.Count > 0)
                        using (Region("Constants"))
                            foreach (var p in r.Constants)
                            {

                                WriteSummary(p.Summary);

                                WriteIdent();

                                if (string.IsNullOrEmpty(p.Value) && p.IsAirOnly)
                                {
                                    WriteGreen("// " + p.Name + " constant was ommited due to no given value");
                                    WriteLine();
                                    continue;
                                }

                                if (p.Value == "\"?\"")
                                {
                                    WriteGreen("// " + p.Name + " constant was ommited due to no string given value");
                                    WriteLine();
                                    continue;
                                }


                                WriteBlue("public");
                                WriteSpace();

                                if (p.IsAirOnly)
                                {
                                    WriteBlue("const");
                                    WriteSpace();
                                }
                                else
                                {
                                    WriteBlue("static");
                                    WriteSpace();
                                    WriteBlue("readonly");
                                    WriteSpace();
                                }

                                WriteVariableDefinition(p.Type, p.Name);

                                if (!string.IsNullOrEmpty(p.Value))
                                {
                                    WriteSpace();
                                    Write("=");
                                    WriteSpace();
                                    Write(p.Value);
                                }

                                Write(";");

                                WriteLine();
                                WriteLine();
                            }
                    #endregion


                    #region Properties
                    using (Region("Properties"))
                        foreach (var p in r.Properties)
                        {
                            if (p.IsInherited)
                                continue;

                            WriteSummary(p.Summary);

                            WriteIdent();

                            if (IsInterface())
                            {
                            }
                            else
                            {
                                WriteBlue("public");
                                WriteSpace();

                                if (p.IsStatic)
                                {
                                    WriteBlue("static");
                                    WriteSpace();
                                }
                            }

                            WriteVariableDefinition(p.PropertyType, p.PropertyName);

                            if (IsField())
                                Write(";");
                            else
                            {
                                WriteSpace();
                                Write("{");
                                WriteSpace();
                                WriteBlue("get");
                                Write(";");
                                WriteSpace();


                                if (IsInterface())
                                {
                                    if (p.IsReadOnly)
                                    {

                                    }
                                    else
                                    {
                                        WriteBlue("set");
                                        Write(";");
                                    }
                                }
                                else
                                {
                                    if (p.IsReadOnly)
                                    {

                                        WriteBlue("private");
                                    }

                                    WriteBlue("set");
                                    Write(";");
                                  
                                }

                                WriteSpace();
                                Write("}");
                            }


                            WriteLine();
                            WriteLine();
                        }
                    #endregion

                    #region Constructors
                    if (r.GetInstanceConstructors().Count() > 0)
                        using (Region("Constructors"))
                            foreach (var p in r.GetInstanceConstructors())
                                foreach (var v in p.ParametersInfo.Variations)
                                {
                                    WriteSummary(p.Summary);

                                    WriteIdent();

                                    WriteBlue("public");
                                    WriteSpace();

                                    Write(p.Name);
                                    Write("(");

                                    for (int k = 0; k < v.Parameters.Length; k++)
                                    {
                                        if (k > 0)
                                        {
                                            Write(",");
                                            WriteSpace();
                                        }

                                        WriteVariableDefinition(v.Parameters[k].TypeName, v.Parameters[k].Name);
                                    }

                                    Write(")");

                                    if (DelegatesParams())
                                    {
                                        WriteSpace();
                                        Write(":");
                                        WriteSpace();
                                        WriteBlue("base");
                                        Write("(" + v.NamesToString() + ")");
                                    }


                                    WriteLine();


                                    using (CodeBlock()) { }

                                    WriteLine();
                                }
                    #endregion

                    #region Methods
                    using (Region("Methods"))
                        foreach (var p in r.GetInstanceMethods())
                            foreach (var v in p.ParametersInfo.Variations)
                            {
                                WriteSummary(p.Summary);

                                WriteIdent();

                                if (IsInterface())
                                {

                                }
                                else
                                {
                                    WriteBlue("public");
                                    WriteSpace();

                                    if (p.IsStatic)
                                    {
                                        WriteBlue("static");
                                        WriteSpace();
                                    }
                                }


                                WriteVariableDefinition(p.ReturnType, p.Name);

                                Write("(");

                                for (int k = 0; k < v.Parameters.Length; k++)
                                {
                                    if (k > 0)
                                    {
                                        Write(",");
                                        WriteSpace();
                                    }

                                    WriteVariableDefinition(v.Parameters[k].TypeName, v.Parameters[k].Name);
                                }

                                Write(")");

                                if (IsInterface())
                                {
                                    Write(";");
                                    WriteLine();
                                }
                                else
                                {

                                    WriteLine();

                                    using (CodeBlock())
                                    {
                                        if (!p.ReturnTypeVoid)
                                        {
                                            WriteIdent();
                                            WriteBlue("return");
                                            WriteSpace();
                                            WriteBlue("default");
                                            Write("(");
                                            WriteTypeName(p.ReturnType);
                                            Write(")");
                                            Write(";");
                                            WriteLine();
                                        }
                                    }
                                }

                                WriteLine();
                            }
                    #endregion

                }
            }

        }