{"url":"https://api.github.com/gists/8027637","forks_url":"https://api.github.com/gists/8027637/forks","commits_url":"https://api.github.com/gists/8027637/commits","id":"8027637","node_id":"MDQ6R2lzdDgwMjc2Mzc=","git_pull_url":"https://gist.github.com/8027637.git","git_push_url":"https://gist.github.com/8027637.git","html_url":"https://gist.github.com/mbostock/8027637","files":{".block":{"filename":".block","type":"text/plain","language":null,"raw_url":"https://gist.githubusercontent.com/mbostock/8027637/raw/703d310b399098a243a76a50bc209167e924cfd2/.block","size":17,"truncated":false,"content":"license: gpl-3.0\n","encoding":"utf-8"},"README.md":{"filename":"README.md","type":"text/markdown","language":"Markdown","raw_url":"https://gist.githubusercontent.com/mbostock/8027637/raw/4dd8b1299e50b29872cf4c7cff8d074955657ac1/README.md","size":1306,"truncated":false,"content":"This page demonstrates a simple approximate algorithm for finding the closest point on any given SVG path element. Although the algorithm is not guaranteed to return the best answer, the answer is reasonably good, and the accuracy is tunable at the expense of performance. It is based on Mike Kamermans’ excellent [Primer on Bézier Curves](https://pomax.github.io/bezierinfo/#projections).\n\nA coarse linear scan of the path provides an initial guess. Then, a binary search improves the guess to the desired level of precision (here, about 1px). The coarseness of the initial scan is configurable; for paths where there may be multiple close points at different lengths along the path, such as at intersections, a finer initial scan is needed to avoid converging on a suboptimal answer.\n\nKnowing the closest path to a given point is useful for [multi-line charts](/mbostock/3884955) in the same way the [Voronoi tessellation](/mbostock/4060366) is useful for [scatterplots](/njvack/1405439): it makes it easier to select or highlight elements using the mouse. Instead of requiring the user to hover over a line precisely, you can use this algorithm to find the line closest to the mouse. Alternatively, you can compute a [Voronoi diagram for lines](/mbostock/8027835) by sampling points along each path.\n","encoding":"utf-8"},"index.html":{"filename":"index.html","type":"text/html","language":"HTML","raw_url":"https://gist.githubusercontent.com/mbostock/8027637/raw/4b9fef28ce464abd23049687c52336e91396f670/index.html","size":2607,"truncated":false,"content":"<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<style>\n\npath {\n  fill: none;\n  stroke: #000;\n  stroke-width: 1.5px;\n}\n\nline {\n  fill: none;\n  stroke: red;\n  stroke-width: 1.5px;\n}\n\ncircle {\n  fill: red;\n}\n\nrect {\n  fill: none;\n  cursor: crosshair;\n  pointer-events: all;\n}\n\n</style>\n<body>\n<script src=\"//d3js.org/d3.v3.min.js\"></script>\n<script>\n\nvar points = [[474,276],[586,393],[378,388],[338,323],[341,138],[547,252],[589,148],[346,227],[365,108],[562,62]];\n\nvar width = 960,\n    height = 500;\n\nvar line = d3.svg.line()\n    .interpolate(\"cardinal\");\n\nvar svg = d3.select(\"body\").append(\"svg\")\n    .attr(\"width\", width)\n    .attr(\"height\", height);\n\nvar path = svg.append(\"path\")\n    .datum(points)\n    .attr(\"d\", line);\n\nvar line = svg.append(\"line\");\n\nvar circle = svg.append(\"circle\")\n    .attr(\"cx\", -10)\n    .attr(\"cy\", -10)\n    .attr(\"r\", 3.5);\n\nsvg.append(\"rect\")\n    .attr(\"width\", width)\n    .attr(\"height\", height)\n    .on(\"mousemove\", mousemoved);\n\nfunction mousemoved() {\n  var m = d3.mouse(this),\n      p = closestPoint(path.node(), m);\n  line.attr(\"x1\", p[0]).attr(\"y1\", p[1]).attr(\"x2\", m[0]).attr(\"y2\", m[1]);\n  circle.attr(\"cx\", p[0]).attr(\"cy\", p[1]);\n}\n\nfunction closestPoint(pathNode, point) {\n  var pathLength = pathNode.getTotalLength(),\n      precision = 8,\n      best,\n      bestLength,\n      bestDistance = Infinity;\n\n  // linear scan for coarse approximation\n  for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {\n    if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {\n      best = scan, bestLength = scanLength, bestDistance = scanDistance;\n    }\n  }\n\n  // binary search for precise estimate\n  precision /= 2;\n  while (precision > 0.5) {\n    var before,\n        after,\n        beforeLength,\n        afterLength,\n        beforeDistance,\n        afterDistance;\n    if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {\n      best = before, bestLength = beforeLength, bestDistance = beforeDistance;\n    } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {\n      best = after, bestLength = afterLength, bestDistance = afterDistance;\n    } else {\n      precision /= 2;\n    }\n  }\n\n  best = [best.x, best.y];\n  best.distance = Math.sqrt(bestDistance);\n  return best;\n\n  function distance2(p) {\n    var dx = p.x - point[0],\n        dy = p.y - point[1];\n    return dx * dx + dy * dy;\n  }\n}\n\n</script>\n","encoding":"utf-8"},"thumbnail.png":{"filename":"thumbnail.png","type":"image/png","language":null,"raw_url":"https://gist.githubusercontent.com/mbostock/8027637/raw/5918a93a2a1dfeb700532f3878ba53312789595a/thumbnail.png","size":5306,"truncated":false,"content":"iVBORw0KGgoAAAANSUhEUgAAAOYAAAB4CAMAAADR2H66AAAKhmlDQ1BpY20A\nAEjHlZYHUJPZFsfv96U3WkIoUkLvSK/SayjSq42QhBBKDIEgIiIq4gquBRER\nLAuyVAVXpchaEAsWFgEFuwuyCKjrYsGGyvuQR3xv3uy82TNz5vvNmTP/e+79\n7p35A0AuYwmFKbAMAKmCDFGojzsjOiaWgXsEiIAAaMAYqLDY6UK34OAA8Lfx\nbghAc99bJnNa4J+FLIebzgYACkY4npPOTkX4FJJ5bKEoAwCUFVLXXpMhnONo\nhGkiZECE59ah8eY5b47j57nkW094qAfCdQDgySyWiAcACdEEjEw2D9Eh3UbY\nTMDhCwAgoxF2ZieyOAh7Imycmrp6joUI68f/hw7vvzTjJZosFk/C83v5FnhP\nfrowhbX2Hx7H/4/UFPHCGmpIktOTw/zn1kPOLIvN8gpb4EQuM2CBhRnuoQvM\nz2CGS3rEvhELLE6OcFvg5NX+kn5B/NIgiX66R+wCZyeGRy0wh+vptcCi1aGS\n/vTMMK/v/R5LFziJ5Re8wCzR/HnNMTfFJ/T7zMGSOQUpSyV7SRB5S3q46d/3\nm5EY7ith5AJI+vneTMl+Rb7f9VOCJZoicajkHLiCCIkmh+UpOVvAB4GABdgZ\n3KyMuYE9VgvXivi8xAyGG3LrucYMpoBtasywMDO3BHNvaP4XvaF/exsQ/fr3\nWlonAPaFSJH3vcbSAuD0UwCo777XtF4jv3cXAGf72GJR5nxt7roCDPI6pZHX\nqYTcAC2gD0yABbABjsAVeAE/EATCQQxYCdggEaQCEVgDcsBGUACKwC6wF5SD\nw+AIqAPHwAnQBs6AC+AKuAH6wCB4AIbBGHgOpsA7MANBEA6iQFRICVKHdCAj\nyAKyg5whLygACoVioDiIBwkgMZQDbYaKoGKoHKqE6qFfoNPQBega1A/dg0ag\nSeg19AlGwWSYBqvCuvBi2A52g/3hcHgFzIPT4Gw4H94Bl8FV8FG4Fb4A34AH\n4WH4OTyNAigSio7SQJmg7FAeqCBULCoBJULlogpRpagqVBOqA9WNuoUaRr1A\nfURj0VQ0A22CdkT7oiPQbHQaOhe9HV2OrkO3oi+hb6FH0FPorxgKRgVjhHHA\nMDHRGB5mDaYAU4qpwbRgLmMGMWOYd1gslo7Vw9pifbEx2CTsOux27EFsM7YT\n248dxU7jcDglnBHOCReEY+EycAW4/bijuPO4AdwY7gOehFfHW+C98bF4AX4T\nvhTfgD+HH8CP42cIMgQdggMhiMAhrCXsJFQTOgg3CWOEGaIsUY/oRAwnJhE3\nEsuITcTLxIfENyQSSZNkTwoh8Ul5pDLScdJV0gjpI1mObEj2IC8ni8k7yLXk\nTvI98hsKhaJLcaXEUjIoOyj1lIuUx5QPUlQpUymmFEdqg1SFVKvUgNRLaYK0\njrSb9ErpbOlS6ZPSN6VfyBBkdGU8ZFgyuTIVMqdl7shMy1JlzWWDZFNlt8s2\nyF6TnZDDyenKeclx5PLljshdlBuloqhaVA8qm7qZWk29TB2jYWl6NCYtiVZE\nO0brpU3Jy8lbyUfKZ8lXyJ+VH6aj6Lp0Jj2FvpN+gj5E/6SgquCmwFXYptCk\nMKDwXnGRoqsiV7FQsVlxUPGTEkPJSylZabdSm9IjZbSyoXKI8hrlQ8qXlV8s\noi1yXMReVLjoxKL7KrCKoUqoyjqVIyo9KtOqaqo+qkLV/aoXVV+o0dVc1ZLU\nStTOqU2qU9Wd1fnqJern1Z8x5BlujBRGGeMSY0pDRcNXQ6xRqdGrMaOppxmh\nuUmzWfORFlHLTitBq0SrS2tKW107UDtHu1H7vg5Bx04nUWefTrfOe1093Sjd\nrbptuhN6inpMvWy9Rr2H+hR9F/00/Sr92wZYAzuDZIODBn2GsKG1YaJhheFN\nI9jIxohvdNCo3xhjbG8sMK4yvmNCNnEzyTRpNBkxpZsGmG4ybTN9uVh7cezi\n3Yu7F381szZLMas2e2AuZ+5nvsm8w/y1haEF26LC4rYlxdLbcoNlu+UrKyMr\nrtUhq7vWVOtA663WXdZfbGxtRDZNNpO22rZxtgds79jR7ILttttdtcfYu9tv\nsD9j/9HBxiHD4YTDX44mjsmODY4TS/SWcJdULxl10nRiOVU6DTsznOOcf3Ie\ndtFwYblUuTxx1XLluNa4jrsZuCW5HXV76W7mLnJvcX/v4eCx3qPTE+Xp41no\n2esl5xXhVe712FvTm+fd6D3lY+2zzqfTF+Pr77vb9w5Tlclm1jOn/Gz91vtd\n8if7h/mX+z8JMAwQBXQEwoF+gXsCHy7VWSpY2hYEgphBe4IeBesFpwX/GoIN\nCQ6pCHkaah6aE9odRg1bFdYQ9i7cPXxn+IMI/QhxRFekdOTyyPrI91GeUcVR\nw9GLo9dH34hRjuHHtMfiYiNja2Knl3kt27tsbLn18oLlQyv0VmStuLZSeWXK\nyrOrpFexVp2Mw8RFxTXEfWYFsapY0/HM+APxU2wP9j72c44rp4QzyXXiFnPH\nE5wSihMmeE68PbzJRJfE0sQXfA9+Of9Vkm/S4aT3yUHJtcmzKVEpzan41LjU\n0wI5QbLg0mq11Vmr+4VGwgLhcJpD2t60KZG/qCYdSl+R3p5BQ8xKj1hfvEU8\nkumcWZH5YU3kmpNZslmCrJ61hmu3rR3P9s7+eR16HXtdV45GzsackfVu6ytz\nodz43K4NWhvyN4zl+eTVbSRuTN742yazTcWb3m6O2tyRr5qflz+6xWdLY4FU\ngajgzlbHrYd/QP/A/6F3m+W2/du+FnIKrxeZFZUWfd7O3n79R/Mfy36c3ZGw\no3enzc5Du7C7BLuGdrvsriuWLc4uHt0TuKe1hFFSWPJ276q910qtSg/vI+4T\n7xsuCyhr36+9f9f+z+WJ5YMV7hXNB1QObDvw/iDn4MAh10NNh1UPFx3+9BP/\np7uVPpWtVbpVpUewRzKPPK2OrO7+2e7n+hrlmqKaL7WC2uG60LpL9bb19Q0q\nDTsb4UZx4+TR5Uf7jnkea28yaapspjcXHQfHxcef/RL3y9AJ/xNdJ+1ONp3S\nOXWghdpS2Aq1rm2daktsG26Pae8/7Xe6q8Oxo+VX019rz2icqTgrf3bnOeK5\n/HOz57PPT3cKO19c4F0Y7VrV9eBi9MXbl0Iu9V72v3z1iveVi91u3eevOl09\nc83h2unrdtfbbtjcaO2x7mn5zfq3ll6b3tabtjfb++z7OvqX9J8bcBm4cMvz\n1pXbzNs3BpcO9g9FDN29s/zO8F3O3Yl7Kfde3c+8P/Mg7yHmYeEjmUelj1Ue\nV/1u8HvzsM3w2RHPkZ4nYU8ejLJHn/+R/sfnsfynlKel4+rj9RMWE2cmvSf7\nni17NvZc+HzmRcGfsn8eeKn/8tRfrn/1TEVPjb0SvZp9vf2N0pvat1Zvu6aD\npx+/S303877wg9KHuo92H7s/RX0an1nzGfe57IvBl46v/l8fzqbOzgpZItY3\nK4BCEk5IAOB1LQCUGMQ79AFAlJr3uN8Cmvfl3wj8Hc/74G9hA0CtKwARiJ8O\nQDzKISR1ECYj3zm7Fu4KYEtLSf470hMsLea1yIiTw3yYnX2jCgCuA4AvotnZ\nmYOzs1+qkWHvAdCZNu+t5wIrA8BxzBz1qOX+j8f9Fyeq8Q/iFmgiAAACT1BM\nVEVra2t2dnaGhoaNjY2Pj4+QkJCSkpKTk5OUlJSVlZWXl5eYmJiZmZmampqb\nm5ucnJydnZ2enp6fn5+goKChoaGioqKjoqKjo6OkpKSlpaWmpqamra2npaWn\np6eoqKipqamqqqqrq6ursbGsrKysra2tra2ul5eurq6vr6+wsLCxsbGysrKz\ns7O0tLS1tbW2tra3tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDB\nwcHCwMDCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnKi4vKysrKy8vLy8vMy8vM\nzMzNzc3OkZHOzs7Pz8/Q0NDQ1dXR0dHS0tLT09PU1NTV1dXW1tbW2NjX19fZ\n2dna2trb29vc3Nzd3d3e3t7f39/f5eXg4ODh4eHiy8vi4uLj4+Pk5OTl5eXm\n5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT1\n9fX29vb39/f4+Pj5+fn6+vr7+/v8Vlb82tr8/Pz9+/v9/Pz9/f3+/f3+/v7/\nDQ3/oKD/o6P/pKT/paX/pqb/p6f/qKj/qan/qqr/rKz/ra3/rq7/r6//sLD/\nsbH/s7P/tLT/uLj/u7v/vLz/vr7/v7//wMD/wcH/w8P/x8f/ysr/y8v/zMz/\nz8//0ND/0dH/09P/1NT/1tb/2Nj/2tr/3d3/4eH/4+P/5OT/5eX/5ub/5+f/\n6Oj/6ur/6+v/7e3/8PD/8fH/8/P/9PT/9fX/9vb/+Pj/+fn/+vr/+/v//Pz/\n/f3//v7///83hYM7AAAHlElEQVR42u3c+19bdxkH8DrbupZSkIu5uDSJGJMQ\nYGuhXMpoIWVY6RoUBtJupINBgJZLaYCRhmxffXzUtmut7tLWuZvTbW6rm25O\np26O5POH7YeThFsgOfOckxx28hO8krxe5/16nu/zfc73+z3Zha/Fa5fBNJgG\n02AaTINpMA2mwTSYqr6YeGczmUh1Yn6ZTCIJXBrvHgDvOOZqCJcvPtbisVjc\njaM7i8lEJP01P+SvtVmcRwOhpZ2VtCwkIU33t7jMthr/E2FO2XdGCUqNQ5rq\nbXBY7A09E8vSGyQ0qUAaMDmZppcHm50We0PfFGkVQu2YJABATHRWmw8d6UkK\n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\n","encoding":"base64"}},"public":true,"created_at":"2013-12-18T18:48:26Z","updated_at":"2025-08-14T07:07:04Z","description":"Closest Point on Path","comments":102,"user":null,"comments_enabled":true,"comments_url":"https://api.github.com/gists/8027637/comments","owner":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"forks":[{"url":"https://api.github.com/gists/8028758","user":{"login":"kragen","id":31350,"node_id":"MDQ6VXNlcjMxMzUw","avatar_url":"https://avatars.githubusercontent.com/u/31350?v=4","gravatar_id":"","url":"https://api.github.com/users/kragen","html_url":"https://github.com/kragen","followers_url":"https://api.github.com/users/kragen/followers","following_url":"https://api.github.com/users/kragen/following{/other_user}","gists_url":"https://api.github.com/users/kragen/gists{/gist_id}","starred_url":"https://api.github.com/users/kragen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kragen/subscriptions","organizations_url":"https://api.github.com/users/kragen/orgs","repos_url":"https://api.github.com/users/kragen/repos","events_url":"https://api.github.com/users/kragen/events{/privacy}","received_events_url":"https://api.github.com/users/kragen/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"Kragen Javier Sitaker","company":"Distributed Expertise SA","blog":"http://www.bentwookie.org/blog","location":"Buenos Aires","email":"kragen@canonical.org","hireable":null,"bio":null,"twitter_username":null,"public_repos":77,"public_gists":95,"followers":355,"following":131,"created_at":"2008-10-28T01:10:22Z","updated_at":"2021-07-22T21:15:23Z"},"id":"8028758","created_at":"2013-12-18T19:54:16Z","updated_at":"2015-12-31T18:39:25Z"},{"url":"https://api.github.com/gists/6b961c823d8056438758","user":{"login":"praneybehl","id":2144887,"node_id":"MDQ6VXNlcjIxNDQ4ODc=","avatar_url":"https://avatars.githubusercontent.com/u/2144887?v=4","gravatar_id":"","url":"https://api.github.com/users/praneybehl","html_url":"https://github.com/praneybehl","followers_url":"https://api.github.com/users/praneybehl/followers","following_url":"https://api.github.com/users/praneybehl/following{/other_user}","gists_url":"https://api.github.com/users/praneybehl/gists{/gist_id}","starred_url":"https://api.github.com/users/praneybehl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/praneybehl/subscriptions","organizations_url":"https://api.github.com/users/praneybehl/orgs","repos_url":"https://api.github.com/users/praneybehl/repos","events_url":"https://api.github.com/users/praneybehl/events{/privacy}","received_events_url":"https://api.github.com/users/praneybehl/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"Praney Behl","company":"SeedBlocks Pty Ltd","blog":"https://vois.so","location":"Melbourne, Australia","email":null,"hireable":true,"bio":"Engineer, Creator, Builder - vois.so, orchestre.dev, ccproxy, workflowos.app, & RecastUI","twitter_username":"praneybehl","public_repos":1032,"public_gists":78,"followers":37,"following":25,"created_at":"2012-08-13T14:13:07Z","updated_at":"2026-04-02T09:41:41Z"},"id":"6b961c823d8056438758","created_at":"2015-09-29T08:48:57Z","updated_at":"2015-09-29T08:48:57Z"},{"url":"https://api.github.com/gists/c9119d00cb81bea2a064fb113644ecc4","user":{"login":"akbstone","id":1093777,"node_id":"MDQ6VXNlcjEwOTM3Nzc=","avatar_url":"https://avatars.githubusercontent.com/u/1093777?v=4","gravatar_id":"","url":"https://api.github.com/users/akbstone","html_url":"https://github.com/akbstone","followers_url":"https://api.github.com/users/akbstone/followers","following_url":"https://api.github.com/users/akbstone/following{/other_user}","gists_url":"https://api.github.com/users/akbstone/gists{/gist_id}","starred_url":"https://api.github.com/users/akbstone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akbstone/subscriptions","organizations_url":"https://api.github.com/users/akbstone/orgs","repos_url":"https://api.github.com/users/akbstone/repos","events_url":"https://api.github.com/users/akbstone/events{/privacy}","received_events_url":"https://api.github.com/users/akbstone/received_events","type":"User","user_view_type":"public","site_admin":false,"name":null,"company":null,"blog":"","location":null,"email":null,"hireable":null,"bio":null,"twitter_username":null,"public_repos":11,"public_gists":9,"followers":1,"following":0,"created_at":"2011-09-30T21:19:52Z","updated_at":"2026-04-10T17:53:53Z"},"id":"c9119d00cb81bea2a064fb113644ecc4","created_at":"2017-01-19T23:12:55Z","updated_at":"2018-02-06T14:37:30Z"},{"url":"https://api.github.com/gists/23411d85de97a3780c00f354ed232f9a","user":{"login":"valmynd","id":898878,"node_id":"MDQ6VXNlcjg5ODg3OA==","avatar_url":"https://avatars.githubusercontent.com/u/898878?v=4","gravatar_id":"","url":"https://api.github.com/users/valmynd","html_url":"https://github.com/valmynd","followers_url":"https://api.github.com/users/valmynd/followers","following_url":"https://api.github.com/users/valmynd/following{/other_user}","gists_url":"https://api.github.com/users/valmynd/gists{/gist_id}","starred_url":"https://api.github.com/users/valmynd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/valmynd/subscriptions","organizations_url":"https://api.github.com/users/valmynd/orgs","repos_url":"https://api.github.com/users/valmynd/repos","events_url":"https://api.github.com/users/valmynd/events{/privacy}","received_events_url":"https://api.github.com/users/valmynd/received_events","type":"User","user_view_type":"public","site_admin":false,"name":null,"company":null,"blog":"https://valmynd.github.io","location":null,"email":null,"hireable":null,"bio":null,"twitter_username":null,"public_repos":17,"public_gists":1,"followers":4,"following":9,"created_at":"2011-07-06T18:45:54Z","updated_at":"2025-10-19T08:20:48Z"},"id":"23411d85de97a3780c00f354ed232f9a","created_at":"2017-11-16T12:38:51Z","updated_at":"2017-11-16T12:38:52Z"},{"url":"https://api.github.com/gists/c49727f90a3c373593589e64404ed604","user":{"login":"AnweshGangula","id":22996896,"node_id":"MDQ6VXNlcjIyOTk2ODk2","avatar_url":"https://avatars.githubusercontent.com/u/22996896?v=4","gravatar_id":"","url":"https://api.github.com/users/AnweshGangula","html_url":"https://github.com/AnweshGangula","followers_url":"https://api.github.com/users/AnweshGangula/followers","following_url":"https://api.github.com/users/AnweshGangula/following{/other_user}","gists_url":"https://api.github.com/users/AnweshGangula/gists{/gist_id}","starred_url":"https://api.github.com/users/AnweshGangula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnweshGangula/subscriptions","organizations_url":"https://api.github.com/users/AnweshGangula/orgs","repos_url":"https://api.github.com/users/AnweshGangula/repos","events_url":"https://api.github.com/users/AnweshGangula/events{/privacy}","received_events_url":"https://api.github.com/users/AnweshGangula/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"Anwesh Gangula","company":null,"blog":"https://anweshgangula.com/","location":"India","email":"gangulaanwesh@gmail.com","hireable":true,"bio":"Pixel evolving into a voxel.","twitter_username":"AnweshGangula","public_repos":41,"public_gists":18,"followers":12,"following":1,"created_at":"2016-10-22T11:01:58Z","updated_at":"2026-03-28T18:16:45Z"},"id":"c49727f90a3c373593589e64404ed604","created_at":"2023-06-17T07:33:58Z","updated_at":"2023-06-17T08:44:26Z"}],"history":[{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"abcc949608c7806c883595f74e4f978d11216458","committed_at":"2016-02-19T23:04:21Z","change_status":{"total":14,"additions":7,"deletions":7},"url":"https://api.github.com/gists/8027637/abcc949608c7806c883595f74e4f978d11216458"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"18abe0de86704515f66548ba45d3ea7552dea49f","committed_at":"2016-02-09T01:59:09Z","change_status":{"total":1,"additions":1,"deletions":0},"url":"https://api.github.com/gists/8027637/18abe0de86704515f66548ba45d3ea7552dea49f"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"364b56247234155c4cc809fbf0fe337a59323a00","committed_at":"2015-10-31T02:05:17Z","change_status":{"total":2,"additions":1,"deletions":1},"url":"https://api.github.com/gists/8027637/364b56247234155c4cc809fbf0fe337a59323a00"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"ac3394ce4708a6cb3b23dfdde77fcddea16fa180","committed_at":"2015-06-11T19:09:27Z","change_status":{"total":2,"additions":1,"deletions":1},"url":"https://api.github.com/gists/8027637/ac3394ce4708a6cb3b23dfdde77fcddea16fa180"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"9c38605df3c5abd4df484b17545c5a4c272166f7","committed_at":"2013-12-18T19:12:51Z","change_status":{"total":0,"additions":0,"deletions":0},"url":"https://api.github.com/gists/8027637/9c38605df3c5abd4df484b17545c5a4c272166f7"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"826b35252e2562cd96b6838ced77cbb345b79c0a","committed_at":"2013-12-18T19:02:16Z","change_status":{"total":2,"additions":1,"deletions":1},"url":"https://api.github.com/gists/8027637/826b35252e2562cd96b6838ced77cbb345b79c0a"},{"user":{"login":"mbostock","id":230541,"node_id":"MDQ6VXNlcjIzMDU0MQ==","avatar_url":"https://avatars.githubusercontent.com/u/230541?v=4","gravatar_id":"","url":"https://api.github.com/users/mbostock","html_url":"https://github.com/mbostock","followers_url":"https://api.github.com/users/mbostock/followers","following_url":"https://api.github.com/users/mbostock/following{/other_user}","gists_url":"https://api.github.com/users/mbostock/gists{/gist_id}","starred_url":"https://api.github.com/users/mbostock/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbostock/subscriptions","organizations_url":"https://api.github.com/users/mbostock/orgs","repos_url":"https://api.github.com/users/mbostock/repos","events_url":"https://api.github.com/users/mbostock/events{/privacy}","received_events_url":"https://api.github.com/users/mbostock/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"7ef5317174558e2e85f7d966ba923f789c45a721","committed_at":"2013-12-18T18:48:26Z","change_status":{"total":115,"additions":115,"deletions":0},"url":"https://api.github.com/gists/8027637/7ef5317174558e2e85f7d966ba923f789c45a721"}],"truncated":false}