{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/41154197","id":41154197,"diff_hunk":"@@ -0,0 +1,268 @@\n+// Copyright (c) Microsoft. All rights reserved.\n+// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.Diagnostics;\n+using System.Numerics;\n+using System.Security.Cryptography;\n+using System.Security.Cryptography.X509Certificates;\n+\n+namespace Internal.Cryptography.Pal\n+{\n+    internal partial class FindPal\n+    {\n+        private static readonly Dictionary<string, X509KeyUsageFlags> s_keyUsages =\n+            new Dictionary<string, X509KeyUsageFlags>(StringComparer.OrdinalIgnoreCase)\n+            {\n+                { \"DigitalSignature\", X509KeyUsageFlags.DigitalSignature },\n+                { \"NonRepudiation\", X509KeyUsageFlags.NonRepudiation },\n+                { \"KeyEncipherment\", X509KeyUsageFlags.KeyEncipherment },\n+                { \"DataEncipherment\", X509KeyUsageFlags.DataEncipherment },\n+                { \"KeyAgreement\", X509KeyUsageFlags.KeyAgreement },\n+                { \"KeyCertSign\", X509KeyUsageFlags.KeyCertSign },\n+                { \"CrlSign\", X509KeyUsageFlags.CrlSign },\n+                { \"EncipherOnly\", X509KeyUsageFlags.EncipherOnly },\n+                { \"DecipherOnly\", X509KeyUsageFlags.DecipherOnly },\n+            };\n+\n+        public static X509Certificate2Collection FindFromCollection(\n+            X509Certificate2Collection coll,\n+            X509FindType findType,\n+            object findValue,\n+            bool validOnly)\n+        {\n+            X509Certificate2Collection results = new X509Certificate2Collection();\n+\n+            using (IFindPal findPal = OpenPal(coll, results, validOnly))\n+            {\n+                switch (findType)\n+                {\n+                    case X509FindType.FindByThumbprint:\n+                    {\n+                        byte[] thumbPrint = ConfirmedCast<string>(findValue).DecodeHexString();\n+                        findPal.FindByThumbprint(thumbPrint);\n+                        break;\n+                    }\n+                    case X509FindType.FindBySubjectName:\n+                    {\n+                        string subjectName = ConfirmedCast<string>(findValue);\n+                        findPal.FindBySubjectName(subjectName);\n+                        break;\n+                    }\n+                    case X509FindType.FindBySubjectDistinguishedName:\n+                    {\n+                        string subjectDistinguishedName = ConfirmedCast<string>(findValue);\n+                        findPal.FindBySubjectDistinguishedName(subjectDistinguishedName);\n+                        break;\n+                    }\n+                    case X509FindType.FindByIssuerName:\n+                    {\n+                        string issuerName = ConfirmedCast<string>(findValue);\n+                        findPal.FindByIssuerName(issuerName);\n+                        break;\n+                    }\n+                    case X509FindType.FindByIssuerDistinguishedName:\n+                    {\n+                        string issuerDistinguishedName = ConfirmedCast<string>(findValue);\n+                        findPal.FindByIssuerDistinguishedName(issuerDistinguishedName);\n+                        break;\n+                    }\n+                    case X509FindType.FindBySerialNumber:\n+                    {\n+                        string decimalOrHexString = ConfirmedCast<string>(findValue);\n+\n+                        // FindBySerialNumber allows the input format to be either in\n+                        // hex or decimal. Since we can't know which one was intended,\n+                        // it compares against both interpretations and treats a match\n+                        // of either as a successful find.\n+\n+                        // String is big-endian, BigInteger constructor requires little-endian.\n+                        byte[] hexBytes = decimalOrHexString.DecodeHexString();\n+                        Array.Reverse(hexBytes);\n+\n+                        BigInteger hexValue = PositiveBigIntegerFromByteArray(hexBytes);\n+                        BigInteger decimalValue = LaxParseDecimalBigInteger(decimalOrHexString);\n+                        findPal.FindBySerialNumber(hexValue, decimalValue);\n+                        break;\n+                    }\n+                    case X509FindType.FindByTimeValid:\n+                    {\n+                        DateTime dateTime = ConfirmedCast<DateTime>(findValue);\n+                        findPal.FindByTimeValid(dateTime);\n+                        break;\n+                    }\n+                    case X509FindType.FindByTimeNotYetValid:\n+                    {\n+                        DateTime dateTime = ConfirmedCast<DateTime>(findValue);\n+                        findPal.FindByTimeNotYetValid(dateTime);\n+                        break;\n+                    }\n+                    case X509FindType.FindByTimeExpired:\n+                    {\n+                        DateTime dateTime = ConfirmedCast<DateTime>(findValue);\n+                        findPal.FindByTimeExpired(dateTime);\n+                        break;\n+                    }\n+                    case X509FindType.FindByTemplateName:\n+                    {\n+                        string expected = ConfirmedCast<string>(findValue);\n+                        findPal.FindByTemplateName(expected);\n+                        break;\n+                    }\n+                    case X509FindType.FindByApplicationPolicy:\n+                    {\n+                        string oidValue = ConfirmedOidValue(findPal, findValue, OidGroup.Policy);\n+                        findPal.FindByApplicationPolicy(oidValue);\n+                        break;\n+                    }\n+                    case X509FindType.FindByCertificatePolicy:\n+                    {\n+                        string oidValue = ConfirmedOidValue(findPal, findValue, OidGroup.Policy);\n+                        findPal.FindByCertificatePolicy(oidValue);\n+                        break;\n+                    }\n+                    case X509FindType.FindByExtension:\n+                    {\n+                        string oidValue = ConfirmedOidValue(findPal, findValue, OidGroup.ExtensionOrAttribute);\n+                        findPal.FindByExtension(oidValue);\n+                        break;\n+                    }\n+                    case X509FindType.FindByKeyUsage:\n+                    {\n+                        X509KeyUsageFlags keyUsage = ConfirmedX509KeyUsage(findValue);\n+                        findPal.FindByKeyUsage(keyUsage);\n+                        break;\n+                    }\n+                    case X509FindType.FindBySubjectKeyIdentifier:\n+                    {\n+                        byte[] keyIdentifier = ConfirmedCast<string>(findValue).DecodeHexString();\n+                        findPal.FindBySubjectKeyIdentifier(keyIdentifier);\n+                        break;\n+                    }\n+                    default:\n+                        throw new CryptographicException(SR.Cryptography_X509_InvalidFindType);\n+                }\n+            }\n+           \n+            return results;\n+        }\n+\n+        private static T ConfirmedCast<T>(object findValue)\n+        {\n+            Debug.Assert(findValue != null);\n+\n+            if (findValue.GetType() != typeof(T))\n+                throw new CryptographicException(SR.Cryptography_X509_InvalidFindValue);\n+\n+            return (T)findValue;\n+        }\n+\n+        private static string ConfirmedOidValue(IFindPal findPal, object findValue, OidGroup oidGroup)\n+        {\n+            string maybeOid = ConfirmedCast<string>(findValue);\n+\n+            if (maybeOid.Length == 0)\n+            {\n+                throw new ArgumentException(SR.Argument_InvalidOidValue);\n+            }\n+\n+            return findPal.NormalizeOid(maybeOid, oidGroup);\n+        }\n+\n+        private static X509KeyUsageFlags ConfirmedX509KeyUsage(object findValue)\n+        {\n+            if (findValue is X509KeyUsageFlags)\n+                return (X509KeyUsageFlags)findValue;\n+\n+            if (findValue is int)\n+                return (X509KeyUsageFlags)(int)findValue;\n+\n+            if (findValue is uint)\n+                return (X509KeyUsageFlags)(uint)findValue;\n+\n+            string findValueString = findValue as string;\n+\n+            if (findValueString != null)\n+            {\n+                X509KeyUsageFlags usageFlags;\n+\n+                if (s_keyUsages.TryGetValue(findValueString, out usageFlags))\n+                {\n+                    return usageFlags;\n+                }\n+            }\n+\n+            throw new CryptographicException(SR.Cryptography_X509_InvalidFindValue);\n+        }\n+\n+        //\n+        // verify the passed keyValue is valid as per X.208\n+        //\n+        // The first number must be 0, 1 or 2.\n+        // Enforce all characters are digits and dots.\n+        // Enforce that no dot starts or ends the Oid, and disallow double dots.\n+        // Enforce there is at least one dot separator.\n+        //\n+        internal static void ValidateOidValue(string keyValue)\n+        {\n+            if (keyValue == null)\n+                throw new ArgumentNullException(\"keyValue\");\n+\n+            int len = keyValue.Length;\n+            if (len < 2)\n+                throw new ArgumentException(SR.Argument_InvalidOidValue);\n+\n+            // should not start with a dot. The first digit must be 0, 1 or 2.\n+            char c = keyValue[0];\n+            if (c != '0' && c != '1' && c != '2')\n+                throw new ArgumentException(SR.Argument_InvalidOidValue);\n+            if (keyValue[1] != '.' || keyValue[len - 1] == '.') // should not end in a dot\n+                throw new ArgumentException(SR.Argument_InvalidOidValue);\n+\n+            // While characters 0 and 1 were both validated, start at character 1 to validate\n+            // that there aren't two dots in a row.\n+            for (int i = 1; i < len; i++)\n+            {\n+                // ensure every character is either a digit or a dot\n+                if (char.IsDigit(keyValue[i]))\n+                    continue;\n+                if (keyValue[i] != '.' || keyValue[i + 1] == '.') // disallow double dots\n+                    throw new ArgumentException(SR.Argument_InvalidOidValue);\n+            }\n+        }\n+\n+        internal static BigInteger PositiveBigIntegerFromByteArray(byte[] bytes)\n+        {\n+            // To prevent the big integer from misinterpreted as a negative number,\n+            // add a \"leading 0\" to the byte array.\n+            // Since BigInteger(bytes[]) requires a little-endian byte array,\n+            // the \"leading 0\" actually goes at the end of the array.","path":"src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/FindPal.cs","position":240,"original_position":240,"commit_id":"737b66984f123b37de9003e81ac207843f44df64","original_commit_id":"737b66984f123b37de9003e81ac207843f44df64","user":{"login":"stephentoub","id":2642209,"avatar_url":"https://avatars.githubusercontent.com/u/2642209?v=3","gravatar_id":"","url":"https://api.github.com/users/stephentoub","html_url":"https://github.com/stephentoub","followers_url":"https://api.github.com/users/stephentoub/followers","following_url":"https://api.github.com/users/stephentoub/following{/other_user}","gists_url":"https://api.github.com/users/stephentoub/gists{/gist_id}","starred_url":"https://api.github.com/users/stephentoub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephentoub/subscriptions","organizations_url":"https://api.github.com/users/stephentoub/orgs","repos_url":"https://api.github.com/users/stephentoub/repos","events_url":"https://api.github.com/users/stephentoub/events{/privacy}","received_events_url":"https://api.github.com/users/stephentoub/received_events","type":"User","site_admin":false},"body":"Cool; in that case, can you add that to the comment?  The 0x80 looks magical.","created_at":"2015-10-05T15:03:16Z","updated_at":"2015-10-05T15:03:16Z","html_url":"https://github.com/dotnet/corefx/pull/3627#discussion_r41154197","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/3627","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/41154197"},"html":{"href":"https://github.com/dotnet/corefx/pull/3627#discussion_r41154197"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3627"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/3627","id":46685309,"html_url":"https://github.com/dotnet/corefx/pull/3627","diff_url":"https://github.com/dotnet/corefx/pull/3627.diff","patch_url":"https://github.com/dotnet/corefx/pull/3627.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/3627","number":3627,"state":"open","locked":false,"title":"Implement X509CertificateCollection2.Find for Unix.","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":"* All of the object->rich type parsing code is in the common FindPal class.\r\n* Each of the X509FindType types dispatches pre-parsed data to an IFindPal instance.\r\n* There are still two sources of disabled tests for the Unix port\r\n    * Issue 1985: Distingushed Names have (e.g.) \"S=Washington\" on Windows, \"ST=Washington\" on Unix.\r\n    * Issue 3099: The Unix and Windows implementations are choosing different certificates out of a multi-file PFX\r\n* Across the various [Theory] components, a little over 100 test cases were added to verify consistent behavior","created_at":"2015-10-02T21:39:00Z","updated_at":"2015-10-05T15:03:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ca4e2e8ac62b0c56b63232e22f2d2b3398b875b8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/3627/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/3627/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/3627/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/737b66984f123b37de9003e81ac207843f44df64","head":{"label":"bartonjs:unix_x509_find","ref":"unix_x509_find","sha":"737b66984f123b37de9003e81ac207843f44df64","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},"repo":{"id":29888389,"name":"corefx","full_name":"bartonjs/corefx","owner":{"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},"private":false,"html_url":"https://github.com/bartonjs/corefx","description":"This repository contains the foundational libraries that make up the .NET Core development stack.","fork":true,"url":"https://api.github.com/repos/bartonjs/corefx","forks_url":"https://api.github.com/repos/bartonjs/corefx/forks","keys_url":"https://api.github.com/repos/bartonjs/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bartonjs/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bartonjs/corefx/teams","hooks_url":"https://api.github.com/repos/bartonjs/corefx/hooks","issue_events_url":"https://api.github.com/repos/bartonjs/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/bartonjs/corefx/events","assignees_url":"https://api.github.com/repos/bartonjs/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/bartonjs/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/bartonjs/corefx/tags","blobs_url":"https://api.github.com/repos/bartonjs/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bartonjs/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bartonjs/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/bartonjs/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bartonjs/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/bartonjs/corefx/languages","stargazers_url":"https://api.github.com/repos/bartonjs/corefx/stargazers","contributors_url":"https://api.github.com/repos/bartonjs/corefx/contributors","subscribers_url":"https://api.github.com/repos/bartonjs/corefx/subscribers","subscription_url":"https://api.github.com/repos/bartonjs/corefx/subscription","commits_url":"https://api.github.com/repos/bartonjs/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/bartonjs/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/bartonjs/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/bartonjs/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/bartonjs/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/bartonjs/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bartonjs/corefx/merges","archive_url":"https://api.github.com/repos/bartonjs/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bartonjs/corefx/downloads","issues_url":"https://api.github.com/repos/bartonjs/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/bartonjs/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/bartonjs/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/bartonjs/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bartonjs/corefx/labels{/name}","releases_url":"https://api.github.com/repos/bartonjs/corefx/releases{/id}","created_at":"2015-01-26T23:55:53Z","updated_at":"2015-08-21T07:07:58Z","pushed_at":"2015-10-03T04:03:30Z","git_url":"git://github.com/bartonjs/corefx.git","ssh_url":"git@github.com:bartonjs/corefx.git","clone_url":"https://github.com/bartonjs/corefx.git","svn_url":"https://github.com/bartonjs/corefx","homepage":"","size":34341,"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":"c942505ba2012140fefad34128347e256ba88683","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}","created_at":"2014-11-06T23:42:48Z","updated_at":"2015-10-05T09:46:51Z","pushed_at":"2015-10-05T14:49:27Z","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":"http://dotnet.github.io/core/","size":75382,"stargazers_count":8419,"watchers_count":8419,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1833,"mirror_url":null,"open_issues_count":639,"forks":1833,"open_issues":639,"watchers":8419,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3627"},"html":{"href":"https://github.com/dotnet/corefx/pull/3627"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3627"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3627/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3627/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3627/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/737b66984f123b37de9003e81ac207843f44df64"}}}}