{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/86394189","pull_request_review_id":7055466,"id":86394189,"diff_hunk":"@@ -2,30 +2,827 @@\n // The .NET Foundation licenses this file to you under the MIT license.\n // See the LICENSE file in the project root for more information.s\n \n+using System.Collections;\n+using System.Text;\n+using System.Globalization;\n+using System.IO;\n+using System.Diagnostics;\n+\n namespace System.Security\n {\n+    internal enum SecurityElementType\n+    {\n+        Regular = 0,\n+        Format = 1,\n+        Comment = 2\n+    }\n+\n+    internal interface ISecurityElementFactory\n+    {\n+        SecurityElement CreateSecurityElement();\n+\n+        object Copy();\n+\n+        string GetTag();\n+\n+        string Attribute(string attributeName);\n+    }\n+\n     [Serializable]\n-    public sealed partial class SecurityElement\n+    sealed public class SecurityElement : ISecurityElementFactory\n     {\n-        public SecurityElement(string tag) { }\n-        public SecurityElement(string tag, string text) { }\n-        public System.Collections.Hashtable Attributes { get; set; }\n-        public System.Collections.ArrayList Children { get; set; }\n-        public string Tag { get; set; }\n-        public string Text { get; set; }\n-        public void AddAttribute(string name, string value) { }\n-        public void AddChild(SecurityElement child) { }\n-        public string Attribute(string name) { return default(string); }\n-        public SecurityElement Copy() { return this; }\n-        public bool Equal(SecurityElement other) { return false; }\n-        public static string Escape(string str) { return default(string); }\n-        public static SecurityElement FromString(string xml) { return default(SecurityElement); }\n-        public static bool IsValidAttributeName(string name) { return false; }\n-        public static bool IsValidAttributeValue(string value) { return false; }\n-        public static bool IsValidTag(string tag) { return false; }\n-        public static bool IsValidText(string text) { return false; }\n-        public SecurityElement SearchForChildByTag(string tag) { return default(SecurityElement); }\n-        public string SearchForTextOfTag(string tag) { return default(string); }\n-        public override string ToString() => base.ToString();\n+        internal string m_strTag;\n+        internal string m_strText;\n+        private ArrayList m_lChildren;\n+        internal ArrayList m_lAttributes;\n+\n+        internal readonly SecurityElementType m_type = SecurityElementType.Regular;\n+        private const int c_AttributesTypical = 4 * 2;  // 4 attributes, times 2 strings per attribute\n+        private const int c_ChildrenTypical = 1;\n+\n+        private static readonly char[] s_tagIllegalCharacters = new char[] { ' ', '<', '>' };\n+        private static readonly char[] s_textIllegalCharacters = new char[] { '<', '>' };\n+        private static readonly char[] s_valueIllegalCharacters = new char[] { '<', '>', '\\\"' };\n+        private const string s_strIndent = \"   \";\n+\n+        private static readonly string[] s_escapeStringPairs = new string[]\n+        {\n+            // these must be all once character escape sequences or a new escaping algorithm is needed\n+            \"<\", \"&lt;\",\n+            \">\", \"&gt;\",\n+            \"\\\"\", \"&quot;\",\n+            \"\\'\", \"&apos;\",\n+            \"&\", \"&amp;\"\n+        };\n+\n+        private static readonly char[] s_escapeChars = new char[] { '<', '>', '\\\"', '\\'', '&' };\n+\n+        //-------------------------- Constructors ---------------------------\n+\n+        internal SecurityElement()\n+        {\n+        }\n+\n+        public SecurityElement(string tag)\n+        {\n+            if (tag == null)\n+                throw new ArgumentNullException(nameof(tag));\n+\n+            if (!IsValidTag(tag))\n+                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementTag, tag));\n+\n+            m_strTag = tag;\n+            m_strText = null;\n+        }\n+\n+        public SecurityElement(string tag, string text)\n+        {\n+            if (tag == null)\n+                throw new ArgumentNullException(nameof(tag));\n+\n+            if (!IsValidTag(tag))\n+                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementTag, tag));\n+\n+            if (text != null && !IsValidText(text))\n+                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementText, text));\n+\n+            m_strTag = tag;\n+            m_strText = text;\n+        }\n+\n+        //-------------------------- Properties -----------------------------\n+\n+        public string Tag\n+        {\n+            get\n+            {\n+                return m_strTag;\n+            }\n+\n+            set\n+            {\n+                if (value == null)\n+                    throw new ArgumentNullException(nameof(Tag));\n+\n+                if (!IsValidTag(value))\n+                    throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementTag, value));\n+\n+                m_strTag = value;\n+            }\n+        }\n+\n+        public Hashtable Attributes\n+        {\n+            get\n+            {\n+                if (m_lAttributes == null || m_lAttributes.Count == 0)\n+                {\n+                    return null;\n+                }\n+                else\n+                {\n+                    Hashtable hashtable = new Hashtable(m_lAttributes.Count / 2);\n+\n+                    int iMax = m_lAttributes.Count;\n+                    Debug.Assert(iMax % 2 == 0, \"Odd number of strings means the attr/value pairs were not added correctly\");\n+\n+                    for (int i = 0; i < iMax; i += 2)\n+                    {\n+                        hashtable.Add(m_lAttributes[i], m_lAttributes[i + 1]);\n+                    }\n+\n+                    return hashtable;\n+                }\n+            }\n+\n+            set\n+            {\n+                if (value == null || value.Count == 0)\n+                {\n+                    m_lAttributes = null;\n+                }\n+                else\n+                {\n+                    ArrayList list = new ArrayList(value.Count);\n+                    IDictionaryEnumerator enumerator = value.GetEnumerator();\n+\n+                    while (enumerator.MoveNext())\n+                    {\n+                        string attrName = (string)enumerator.Key;\n+                        string attrValue = (string)enumerator.Value;\n+\n+                        if (!IsValidAttributeName(attrName))\n+                            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementName, (string)enumerator.Current));\n+\n+                        if (!IsValidAttributeValue(attrValue))\n+                            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementValue, (string)enumerator.Value));\n+\n+                        list.Add(attrName);\n+                        list.Add(attrValue);\n+                    }\n+\n+                    m_lAttributes = list;\n+                }\n+            }\n+        }\n+\n+        public string Text\n+        {\n+            get\n+            {\n+                return Unescape(m_strText);\n+            }\n+\n+            set\n+            {\n+                if (value == null)\n+                {\n+                    m_strText = null;\n+                }\n+                else\n+                {\n+                    if (!IsValidText(value))\n+                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementTag, value));\n+\n+                    m_strText = value;\n+                }\n+            }\n+        }\n+\n+        public ArrayList Children\n+        {\n+            get\n+            {\n+                ConvertSecurityElementFactories();\n+                return m_lChildren;\n+            }\n+\n+            set\n+            {\n+                if (value != null)\n+                {\n+                    IEnumerator enumerator = value.GetEnumerator();\n+\n+                    while (enumerator.MoveNext())\n+                    {\n+                        if (enumerator.Current == null)\n+                            throw new ArgumentException(SR.ArgumentNull_Child);\n+                    }\n+                }\n+\n+                m_lChildren = value;\n+            }\n+        }\n+\n+        internal void ConvertSecurityElementFactories()\n+        {\n+            if (m_lChildren == null)\n+                return;\n+\n+            for (int i = 0; i < m_lChildren.Count; ++i)\n+            {\n+                ISecurityElementFactory iseFactory = m_lChildren[i] as ISecurityElementFactory;\n+                if (iseFactory != null && !(m_lChildren[i] is SecurityElement))\n+                    m_lChildren[i] = iseFactory.CreateSecurityElement();\n+            }\n+        }\n+\n+        internal ArrayList InternalChildren\n+        {\n+            get\n+            {\n+                // Beware!  This array list can contain SecurityElements and other ISecurityElementFactories.\n+                // If you want to get a consistent SecurityElement view, call get_Children.\n+                return m_lChildren;\n+            }\n+        }\n+\n+        //-------------------------- Public Methods -----------------------------\n+\n+        internal void AddAttributeSafe(string name, string value)\n+        {\n+            if (m_lAttributes == null)\n+            {\n+                m_lAttributes = new ArrayList(c_AttributesTypical);\n+            }\n+            else\n+            {\n+                int iMax = m_lAttributes.Count;\n+                Debug.Assert(iMax % 2 == 0, \"Odd number of strings means the attr/value pairs were not added correctly\");\n+\n+                for (int i = 0; i < iMax; i += 2)\n+                {\n+                    string strAttrName = (string)m_lAttributes[i];\n+\n+                    if (string.Equals(strAttrName, name))\n+                        throw new ArgumentException(SR.Argument_AttributeNamesMustBeUnique);\n+                }\n+            }\n+\n+            m_lAttributes.Add(name);\n+            m_lAttributes.Add(value);\n+        }\n+\n+        public void AddAttribute(string name, string value)\n+        {\n+            if (name == null)\n+                throw new ArgumentNullException(nameof(name));\n+\n+            if (value == null)\n+                throw new ArgumentNullException(nameof(value));\n+\n+            if (!IsValidAttributeName(name))\n+                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementName, name));\n+\n+            if (!IsValidAttributeValue(value))\n+                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, SR.Argument_InvalidElementValue, value));\n+\n+            AddAttributeSafe(name, value);\n+        }\n+\n+        public void AddChild(SecurityElement child)\n+        {\n+            if (child == null)\n+                throw new ArgumentNullException(nameof(child));\n+\n+            if (m_lChildren == null)\n+                m_lChildren = new ArrayList(c_ChildrenTypical);\n+\n+            m_lChildren.Add(child);\n+        }\n+\n+        internal void AddChild(ISecurityElementFactory child)\n+        {\n+            if (child == null)\n+                throw new ArgumentNullException(nameof(child));\n+            \n+\n+            if (m_lChildren == null)\n+                m_lChildren = new ArrayList(c_ChildrenTypical);\n+\n+            m_lChildren.Add(child);\n+        }\n+\n+        internal void AddChildNoDuplicates(ISecurityElementFactory child)\n+        {\n+            if (child == null)\n+                throw new ArgumentNullException(nameof(child));\n+\n+            if (m_lChildren == null)\n+            {\n+                m_lChildren = new ArrayList(c_ChildrenTypical);\n+                m_lChildren.Add(child);\n+            }\n+            else\n+            {\n+                for (int i = 0; i < m_lChildren.Count; ++i)\n+                {\n+                    if (m_lChildren[i] == child)\n+                        return;\n+                }\n+                m_lChildren.Add(child);\n+            }\n+        }\n+\n+        public bool Equal(SecurityElement other)\n+        {\n+            if (other == null)\n+                return false;\n+\n+            // Check if the tags are the same\n+            if (!string.Equals(m_strTag, other.m_strTag))\n+                return false;\n+\n+            // Check if the text is the same\n+            if (!string.Equals(m_strText, other.m_strText))\n+                return false;\n+\n+            // Check if the attributes are the same and appear in the same\n+            // order.\n+            if (m_lAttributes == null || other.m_lAttributes == null)\n+            {\n+                if (m_lAttributes != other.m_lAttributes)\n+                    return false;\n+            }\n+            else\n+            {\n+                int iMax = m_lAttributes.Count;\n+                Debug.Assert(iMax % 2 == 0, \"Odd number of strings means the attr/value pairs were not added correctly\");\n+\n+                // Maybe we can get away by only checking the number of attributes\n+                if (iMax != other.m_lAttributes.Count)\n+                    return false;\n+\n+                for (int i = 0; i < iMax; i++)\n+                {\n+                    string lhs = (string)m_lAttributes[i];\n+                    string rhs = (string)other.m_lAttributes[i];\n+\n+                    if (!string.Equals(lhs, rhs))\n+                        return false;\n+                }\n+            }\n+\n+            // Finally we must check the child and make sure they are\n+            // equal and in the same order\n+            if (m_lChildren == null || other.m_lChildren == null)\n+            {\n+                if (m_lChildren != other.m_lChildren)\n+                    return false;\n+            }\n+            else\n+            {\n+                // Maybe we can get away by only checking the number of children\n+                if (m_lChildren.Count != other.m_lChildren.Count)\n+                    return false;\n+\n+                ConvertSecurityElementFactories();\n+                other.ConvertSecurityElementFactories();\n+\n+                IEnumerator lhs = m_lChildren.GetEnumerator();\n+                IEnumerator rhs = other.m_lChildren.GetEnumerator();\n+\n+                SecurityElement e1, e2;\n+                while (lhs.MoveNext())\n+                {\n+                    rhs.MoveNext();\n+                    e1 = (SecurityElement)lhs.Current;\n+                    e2 = (SecurityElement)rhs.Current;\n+                    if (e1 == null || !e1.Equal(e2))\n+                        return false;\n+                }\n+            }\n+            return true;\n+        }\n+\n+        public SecurityElement Copy()\n+        {\n+            SecurityElement element = new SecurityElement(m_strTag, m_strText);\n+            element.m_lChildren = m_lChildren == null ? null : new ArrayList(m_lChildren);\n+            element.m_lAttributes = m_lAttributes == null ? null : new ArrayList(m_lAttributes);\n+\n+            return element;\n+        }\n+\n+        public static bool IsValidTag(string tag)\n+        {\n+            if (tag == null)\n+                return false;\n+\n+            return tag.IndexOfAny(s_tagIllegalCharacters) == -1;\n+        }\n+\n+        public static bool IsValidText(string text)\n+        {\n+            if (text == null)\n+                return false;\n+\n+            return text.IndexOfAny(s_textIllegalCharacters) == -1;\n+        }\n+\n+        public static bool IsValidAttributeName(string name)\n+        {\n+            return IsValidTag(name);\n+        }\n+\n+        public static bool IsValidAttributeValue(string value)\n+        {\n+            if (value == null)\n+                return false;\n+\n+            return value.IndexOfAny(s_valueIllegalCharacters) == -1;\n+        }\n+\n+        private static string GetEscapeSequence(char c)\n+        {\n+            int iMax = s_escapeStringPairs.Length;\n+            Debug.Assert(iMax % 2 == 0, \"Odd number of strings means the attr/value pairs were not added correctly\");\n+\n+            for (int i = 0; i < iMax; i += 2)\n+            {\n+                string strEscSeq = s_escapeStringPairs[i];\n+                string strEscValue = s_escapeStringPairs[i + 1];\n+\n+                if (strEscSeq[0] == c)\n+                    return strEscValue;\n+            }\n+\n+            Debug.Assert(false, \"Unable to find escape sequence for this character\");","path":"src/System.Security.Permissions/src/System/Security/SecurityElement.cs","position":470,"original_position":470,"commit_id":"2b3ecd1d833bd7dc777155fcc416d8f6c684279e","original_commit_id":"2b3ecd1d833bd7dc777155fcc416d8f6c684279e","user":{"login":"bartonjs","id":10642668,"avatar_url":"https://avatars.githubusercontent.com/u/10642668?v=3","gravatar_id":"","url":"https://api.github.com/users/bartonjs","html_url":"https://github.com/bartonjs","followers_url":"https://api.github.com/users/bartonjs/followers","following_url":"https://api.github.com/users/bartonjs/following{/other_user}","gists_url":"https://api.github.com/users/bartonjs/gists{/gist_id}","starred_url":"https://api.github.com/users/bartonjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bartonjs/subscriptions","organizations_url":"https://api.github.com/users/bartonjs/orgs","repos_url":"https://api.github.com/users/bartonjs/repos","events_url":"https://api.github.com/users/bartonjs/events{/privacy}","received_events_url":"https://api.github.com/users/bartonjs/received_events","type":"User","site_admin":false},"body":"Nit: Debug.Fail","created_at":"2016-11-03T17:07:06Z","updated_at":"2016-11-03T17:07:06Z","html_url":"https://github.com/dotnet/corefx/pull/13275#discussion_r86394189","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/13275","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/86394189"},"html":{"href":"https://github.com/dotnet/corefx/pull/13275#discussion_r86394189"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/13275"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/13275","id":92033820,"html_url":"https://github.com/dotnet/corefx/pull/13275","diff_url":"https://github.com/dotnet/corefx/pull/13275.diff","patch_url":"https://github.com/dotnet/corefx/pull/13275.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/13275","number":13275,"state":"open","locked":false,"title":"Implement System.Security.PrincipalPermission and SecurityElement","user":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"body":"- Ports desktop code for SecurityELement and PrincipalPermission\r\n- To be used in Security.Permissions, some of the members in System.Sec.Principal.Windows need to be moved into common.\r\n- Fixes the old desktop implementation of the two functions to work in .net core. Originally the plan was to only implement PrincipalPermission, but it relied heavily on SecurityElement functionality so I opted to implement that as well. The only remaining item not fully implemented is SecurityElement.FromString.\r\n- Required splitting PrincipalPermission (and the assembly) based on Unix/Windows.\r\n- Adds tests for SecurityElement and PrincipalPermission\r\n\r\nresolves https://github.com/dotnet/corefx/issues/9641\r\n\r\n@AlexGhiondea @joperezr @stephentoub ","created_at":"2016-11-02T18:56:14Z","updated_at":"2016-11-03T17:42:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d08d78b80d80b317bb349576999f033f3a19d84b","assignee":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"assignees":[{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/dotnet/corefx/milestones/4","html_url":"https://github.com/dotnet/corefx/milestones/1.2.0","labels_url":"https://api.github.com/repos/dotnet/corefx/milestones/4/labels","id":1248719,"number":4,"title":"1.2.0","description":".NET Core 1.2 Placeholder.  https://github.com/dotnet/core/blob/master/roadmap.md","creator":{"login":"joshfree","id":1302850,"avatar_url":"https://avatars.githubusercontent.com/u/1302850?v=3","gravatar_id":"","url":"https://api.github.com/users/joshfree","html_url":"https://github.com/joshfree","followers_url":"https://api.github.com/users/joshfree/followers","following_url":"https://api.github.com/users/joshfree/following{/other_user}","gists_url":"https://api.github.com/users/joshfree/gists{/gist_id}","starred_url":"https://api.github.com/users/joshfree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshfree/subscriptions","organizations_url":"https://api.github.com/users/joshfree/orgs","repos_url":"https://api.github.com/users/joshfree/repos","events_url":"https://api.github.com/users/joshfree/events{/privacy}","received_events_url":"https://api.github.com/users/joshfree/received_events","type":"User","site_admin":false},"open_issues":545,"closed_issues":1491,"state":"open","created_at":"2015-08-10T18:04:00Z","updated_at":"2016-11-03T16:08:20Z","due_on":"2017-04-30T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/13275/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/13275/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/13275/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/2b3ecd1d833bd7dc777155fcc416d8f6c684279e","head":{"label":"ianhays:api_security_principal","ref":"api_security_principal","sha":"2b3ecd1d833bd7dc777155fcc416d8f6c684279e","user":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"repo":{"id":37934303,"name":"corefx","full_name":"ianhays/corefx","owner":{"login":"ianhays","id":2606879,"avatar_url":"https://avatars.githubusercontent.com/u/2606879?v=3","gravatar_id":"","url":"https://api.github.com/users/ianhays","html_url":"https://github.com/ianhays","followers_url":"https://api.github.com/users/ianhays/followers","following_url":"https://api.github.com/users/ianhays/following{/other_user}","gists_url":"https://api.github.com/users/ianhays/gists{/gist_id}","starred_url":"https://api.github.com/users/ianhays/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianhays/subscriptions","organizations_url":"https://api.github.com/users/ianhays/orgs","repos_url":"https://api.github.com/users/ianhays/repos","events_url":"https://api.github.com/users/ianhays/events{/privacy}","received_events_url":"https://api.github.com/users/ianhays/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ianhays/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":true,"url":"https://api.github.com/repos/ianhays/corefx","forks_url":"https://api.github.com/repos/ianhays/corefx/forks","keys_url":"https://api.github.com/repos/ianhays/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ianhays/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ianhays/corefx/teams","hooks_url":"https://api.github.com/repos/ianhays/corefx/hooks","issue_events_url":"https://api.github.com/repos/ianhays/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/ianhays/corefx/events","assignees_url":"https://api.github.com/repos/ianhays/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/ianhays/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/ianhays/corefx/tags","blobs_url":"https://api.github.com/repos/ianhays/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ianhays/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ianhays/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/ianhays/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ianhays/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/ianhays/corefx/languages","stargazers_url":"https://api.github.com/repos/ianhays/corefx/stargazers","contributors_url":"https://api.github.com/repos/ianhays/corefx/contributors","subscribers_url":"https://api.github.com/repos/ianhays/corefx/subscribers","subscription_url":"https://api.github.com/repos/ianhays/corefx/subscription","commits_url":"https://api.github.com/repos/ianhays/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/ianhays/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/ianhays/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/ianhays/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/ianhays/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/ianhays/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ianhays/corefx/merges","archive_url":"https://api.github.com/repos/ianhays/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ianhays/corefx/downloads","issues_url":"https://api.github.com/repos/ianhays/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/ianhays/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/ianhays/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/ianhays/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ianhays/corefx/labels{/name}","releases_url":"https://api.github.com/repos/ianhays/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/ianhays/corefx/deployments","created_at":"2015-06-23T17:36:59Z","updated_at":"2016-01-11T18:31:07Z","pushed_at":"2016-11-02T20:46:01Z","git_url":"git://github.com/ianhays/corefx.git","ssh_url":"git@github.com:ianhays/corefx.git","clone_url":"https://github.com/ianhays/corefx.git","svn_url":"https://github.com/ianhays/corefx","homepage":"http://dotnet.github.io/core/","size":113059,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"495e020ba6f6a8c7a3c1275625b8dd50e55e6a09","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2016-11-03T17:37:33Z","pushed_at":"2016-11-03T17:35:15Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"https://docs.microsoft.com/dotnet/","size":158954,"stargazers_count":10736,"watchers_count":10736,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2709,"mirror_url":null,"open_issues_count":1448,"forks":2709,"open_issues":1448,"watchers":10736,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/13275"},"html":{"href":"https://github.com/dotnet/corefx/pull/13275"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/13275"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/13275/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/13275/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/13275/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/2b3ecd1d833bd7dc777155fcc416d8f6c684279e"}}}}
{"actor":{"display_login":"bartonjs"}}