{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/comments/35296779","id":35296779,"diff_hunk":"@@ -0,0 +1,484 @@\n+///<reference path='../../editor/messages.ts'/>\n+///<reference path='../../typings/jquery/jquery.d.ts'/>\n+\n+\n+module TDev {\n+\n+  // ---------- Communication protocol\n+\n+  var allowedOrigins = [\n+    /^http:\\/\\/localhost/,\n+    /^https?:\\/\\/.*\\.microbit\\.co\\.uk/,\n+    /^https?:\\/\\/microbit\\.co\\.uk/,\n+  ];\n+\n+  function isAllowedOrigin(origin: string) {\n+    return allowedOrigins.filter(x => !!origin.match(x)).length > 0;\n+  }\n+\n+  // Both of these are written once when we receive the first (trusted)\n+  // message.\n+  var outer: Window = null;\n+  var origin: string = null;\n+\n+  // A global that remembers the current version we're editing\n+  var currentVersion: string;\n+  var inMerge: boolean = false;\n+\n+  window.addEventListener(\"message\", (event) => {\n+    if (!isAllowedOrigin(event.origin)) {\n+      console.error(\"[inner message] not from the right origin!\", event.origin);\n+      return;\n+    }\n+\n+    if (!outer || !origin) {\n+      outer = event.source;\n+      origin = event.origin;\n+    }\n+\n+    receive(<External.Message>event.data);\n+  });\n+\n+  function receive(message: External.Message) {\n+    console.log(\"[inner message]\", message);\n+\n+    switch (message.type) {\n+      case External.MessageType.Init:\n+        setupEditor(<External.Message_Init> message);\n+        setupButtons((<External.Message_Init> message).fota);\n+        setupCurrentVersion(<External.Message_Init> message);\n+        break;\n+\n+      case External.MessageType.SaveAck:\n+        saveAck(<External.Message_SaveAck> message);\n+        break;\n+\n+      case External.MessageType.Merge:\n+        promptMerge((<External.Message_Merge> message).merge);\n+        break;\n+\n+      case External.MessageType.CompileAck:\n+        compileAck(<External.Message_CompileAck> message);\n+        break;\n+\n+      case External.MessageType.NewBaseVersion:\n+        newBaseVersion(<External.Message_NewBaseVersion> message);\n+        break;\n+    }\n+  }\n+\n+  function post(message: External.Message) {\n+    if (!outer)\n+      console.error(\"Invalid state\");\n+    outer.postMessage(message, origin);\n+  }\n+\n+  // ---------- Revisions\n+\n+  function prefix(where: External.SaveLocation) {\n+    switch (where) {\n+      case External.SaveLocation.Cloud:\n+        return(\"☁  [cloud]\");\n+      case External.SaveLocation.Local:\n+        return(\"⌂ [local]\");\n+    }\n+  }\n+\n+  function statusIcon(icon: string) {\n+    var i = $(\"#cloud-status i\");\n+    i.attr(\"class\", \"fa fa-\"+icon);\n+    switch (icon) {\n+      case \"cloud-upload\":\n+        i.attr(\"title\", \"Saved to cloud\");\n+        break;\n+      case \"floppy-o\":\n+        i.attr(\"title\", \"Saved locally\");\n+        break;\n+      case \"exclamation-triangle\":\n+        i.attr(\"title\", \"Error while saving -- see ⓘ for more information\");\n+        break;\n+      case \"pencil\":\n+        i.attr(\"title\", \"Local changes\");\n+        break;\n+      default:\n+        i.attr(\"title\", \"\");\n+    }\n+  }\n+\n+  function saveAck(message: External.Message_SaveAck) {\n+    switch (message.status) {\n+      case External.Status.Error:\n+        statusMsg(prefix(message.where)+\" error: \"+message.error, message.status);\n+        statusIcon(\"exclamation-triangle\");\n+        break;\n+      case External.Status.Ok:\n+        if (message.where == External.SaveLocation.Cloud) {\n+          statusMsg(prefix(message.where)+\" successfully saved version (cloud in sync? \"+\n+            message.cloudIsInSync +\", \"+\n+            \"from \"+currentVersion+\" to \"+message.newBaseSnapshot+\")\",\n+            message.status);\n+          currentVersion = message.newBaseSnapshot;\n+          if (message.cloudIsInSync)\n+            statusIcon(\"cloud-upload\");\n+          else\n+            statusIcon(\"exclamation-triangle\");\n+        } else {\n+          statusIcon(\"floppy-o\");\n+          statusMsg(prefix(message.where)+\" successfully saved\", message.status);\n+        }\n+        break;\n+    }\n+  }\n+\n+  function compileAck(message: External.Message_CompileAck) {\n+    $(\"#command-compile > .roundsymbol\").removeClass(\"compiling\");\n+    switch (message.status) {\n+      case External.Status.Error:\n+        statusMsg(\"compilation error: \"+message.error, message.status);\n+        showPopup($(\"#link-log\"), $(\"#popup-log\"));\n+        break;\n+      case External.Status.Ok:\n+        statusMsg(\"compilation successful\", message.status);\n+        break;\n+    }\n+  }\n+\n+  var mergeDisabled = true;\n+\n+  function newBaseVersion(msg: External.Message_NewBaseVersion) {\n+    statusMsg(\"✎ got assigned our first base version\", External.Status.Ok);\n+    // We've been assigned a base version number for the first time. All further\n+    // save messages will be on top of that current version.\n+    currentVersion = msg.baseSnapshot;\n+  }\n+\n+  function promptMerge(merge: External.PendingMerge) {\n+    if (mergeDisabled) {\n+      inMerge = false;\n+      currentVersion = merge.theirs.baseSnapshot;\n+      statusMsg(\"✎ ignoring merge, forcing changes\", External.Status.Ok);\n+      doSave(true);\n+      return;\n+    }\n+\n+    console.log(\"[merge] merge request, base = \"+merge.base.baseSnapshot +\n+      \", theirs = \"+merge.theirs.baseSnapshot +\n+      \", mine = \"+currentVersion);\n+    var mkButton = function (symbol: string, label: string, f: () => void) {\n+      return $(\"<div>\").text(symbol+\" \"+label).click(f);\n+    };\n+    var box = $(\"#merge-commands\");\n+    var clearMerge = () => {\n+      box.empty();\n+    };\n+    var mineText = saveCK();\n+    var mineName = getName();\n+    var mineDescription = getDescription();\n+    var mineButton = mkButton(\"🔍\", \"see mine\", () => {\n+      loadCK(mineText);\n+      setName(mineName);\n+      setDescription(mineDescription);\n+    });\n+    var theirsButton = mkButton(\"🔍\", \"see theirs\", () => {\n+      loadCK(merge.theirs.scriptText);\n+      setName(merge.theirs.metadata.name);\n+      setDescription(merge.theirs.metadata.comment);\n+    });\n+    var baseButton = mkButton(\"🔍\", \"see base\", () => {\n+      loadCK(merge.base.scriptText);\n+      setName(merge.base.metadata.name);\n+      setDescription(merge.base.metadata.comment);\n+    });\n+    var mergeButton = mkButton(\"👍\", \"finish merge\", () => {\n+      inMerge = false;\n+      currentVersion = merge.theirs.baseSnapshot;\n+      clearMerge();\n+      doSave(true);\n+    });\n+    clearMerge();\n+    inMerge = true;\n+    box.append($(\"<div>\").addClass(\"label\").text(\"Merge conflict\"));\n+    [ mineButton, theirsButton, baseButton, mergeButton ].forEach(button => {\n+      box.append(button);\n+      box.append($(\" \"));\n+    });\n+  }\n+\n+  function setupCurrentVersion(message: External.Message_Init) {\n+    currentVersion = message.script.baseSnapshot;\n+    console.log(\"[revisions] current version is \"+currentVersion);\n+\n+    if (message.merge)\n+      promptMerge(message.merge);\n+  }\n+\n+  // ---------- UI functions\n+\n+  interface EditorState {\n+    lastSave: Date;\n+  }\n+\n+  function statusMsg(s: string, st: External.Status) {\n+    var box = $(\"#log\");\n+    var elt = $(\"<div>\").addClass(\"status\").text(s);\n+    if (st == External.Status.Error)\n+      elt.addClass(\"error\");\n+    else\n+      elt.removeClass(\"error\");\n+    box.append(elt);\n+    box.scrollTop(box.prop(\"scrollHeight\"));\n+  }\n+\n+  function loadCK(s: string) {\n+    // var text = s || \"<xml></xml>\";\n+    // var xml = Blockly.Xml.textToDom(text);\n+    // Blockly.mainWorkspace.clear();\n+    // try {\n+    //   Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xml);\n+    // } catch (e) {\n+    //   console.error(\"Cannot load saved Blockly script. Too recent?\");\n+    //   console.error(e);\n+    // }\n+  }\n+\n+  function saveCK(): string {\n+    // var xml = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);\n+    // var text = Blockly.Xml.domToPrettyText(xml);\n+    // return text;\n+    return '';\n+  }\n+\n+  function setDescription(x: string) {\n+    $(\"#script-description\").text(x);\n+  }\n+\n+  function setName(x: string) {\n+    $(\"#script-name\").text(x);\n+  }\n+\n+  function getDescription() {\n+    return $(\"#script-description\").text();\n+  }\n+\n+  function getName() {\n+    return $(\"#script-name\").text();\n+  }\n+\n+  var dirty = false;\n+\n+  /* Some popup routines... */\n+  function clearPopups() {\n+    $(\".popup\").addClass(\"hidden\");\n+  }\n+  function setupPopups() {\n+    /* Hide all popups when user clicks elsewhere. */\n+    $(document).click(clearPopups);\n+    /* Catch clicks on popups themselves to disable above handler. */\n+    $(\".popup\").click((e: Event) => {\n+      e.stopPropagation();\n+    });\n+  }\n+\n+  function setupPopup(link: JQuery, popup: JQuery) {\n+    link.click((e: Event) => {\n+      if (popup.hasClass(\"hidden\"))\n+        showPopup(link, popup);\n+      else\n+        popup.addClass(\"hidden\");\n+      e.stopPropagation();\n+    });\n+  }\n+\n+  function showPopup(link: JQuery, popup: JQuery) {\n+    clearPopups();\n+    popup.removeClass(\"hidden\");\n+    var x = link[0].offsetLeft;\n+    var w = link[0].clientWidth;\n+    var y = link[0].offsetTop;\n+    var h = link[0].clientHeight;\n+    popup.css(\"left\", Math.round(x - 500 + w/2 + 5 + 15)+\"px\");\n+    popup.css(\"top\", Math.round(y + h + 10 + 5)+\"px\");\n+  }\n+\n+  // Called once at startup\n+  function setupEditor(message: External.Message_Init) {\n+    var state = <MyEditorState> message.script.editorState;\n+\n+    // Blockly.inject($(\"#editor\")[0], {\n+    //   toolbox: $(\"#blockly-toolbox\")[0],\n+    //   scrollbars: true\n+    // });\n+    loadCK(message.script.scriptText);\n+    // Hack alert! Blockly's [fireUiEvent] function [setTimeout]'s (with a 0 delay) the actual\n+    // firing of the event, meaning that the call to [inject] above schedule a change event to\n+    // be fired immediately after the current function is done. To make sure our change handler\n+    // does not receive that initial event, we schedule it for slightly later.\n+    window.setTimeout(() => {\n+      // Blockly.addChangeListener(() => {\n+      //   statusMsg(\"✎ local changes\", External.Status.Ok);\n+      //   statusIcon(\"pencil\");\n+      //   dirty = true;\n+      // });\n+    }, 1);\n+    $(\"#script-name\").on(\"input keyup blur\", () => {\n+      statusMsg(\"✎ local changes\", External.Status.Ok);\n+      statusIcon(\"pencil\");\n+      dirty = true;\n+    });\n+    $(\"#script-description\").on(\"input keyup blur\", () => {\n+      statusMsg(\"✎ local changes\", External.Status.Ok);\n+      statusIcon(\"pencil\");\n+      dirty = true;\n+    });\n+\n+    setName(message.script.metadata.name);\n+    setDescription(message.script.metadata.comment);\n+    if (!message.script.baseSnapshot && !message.script.metadata.comment)\n+      setDescription(\"A #blocks script\");\n+\n+    // That's triggered when the user closes or reloads the whole page, but\n+    // doesn't help if the user hits the \"back\" button in our UI.\n+    window.addEventListener(\"beforeunload\", e => {\n+      if (dirty) {\n+        var confirmationMessage = \"Some of your changes have not been saved. Quit anyway?\";\n+        (e || window.event).returnValue = confirmationMessage;\n+        return confirmationMessage;\n+      }\n+    });\n+\n+    window.setInterval(() => {\n+      doSave();\n+    }, 5000);\n+\n+    setupPopup($(\"#link-log\"), $(\"#popup-log\"));\n+    setupPopups();\n+\n+    console.log(\"[loaded] cloud version \" + message.script.baseSnapshot +\n+      \"(dated from: \"+state.lastSave+\")\");\n+  }\n+\n+  interface MyEditorState extends External.EditorState {\n+      lastSave: Date\n+  }\n+\n+  function doSave(force = false) {\n+    if (!dirty && !force)\n+      return;\n+\n+    var text = saveCK();\n+    console.log(\"[saving] on top of: \", currentVersion);\n+    post(<External.Message_Save>{\n+      type: External.MessageType.Save,\n+      script: {\n+        scriptText: text,\n+        editorState: <MyEditorState> {\n+          // XXX test values\n+          // tutorialStep: 1,\n+          // tutorialNumSteps: 10,\n+          lastSave: new Date()\n+        },\n+        baseSnapshot: currentVersion,\n+        metadata: {\n+          name: getName(),\n+          comment: getDescription()\n+        }\n+      },\n+    });\n+    dirty = false;\n+  }\n+\n+  /*function compileOrError(msgSel?: string) {\n+    var ast: TDev.AST.Json.JApp;\n+\n+    $(\".blocklySelected, .blocklyError\").attr(\"class\", \"\");\n+    clearPopups();\n+    $(\"#errorsGraduate\").addClass(\"hidden\");\n+    $(\"#errorsCompile\").addClass(\"hidden\");\n+    $(\"#errorsRun\").addClass(\"hidden\");\n+\n+    try {\n+      ast = compile(Blockly.mainWorkspace, {\n+        name: getName(),\n+        description: getDescription()\n+      });\n+    } catch (e) {\n+      statusMsg(\"⚠ compilation error: \"+e, External.Status.Error);\n+      showPopup($(\"#link-log\"), $(\"#popup-log\"));\n+    }\n+\n+    var errors = Errors.get();\n+    if (errors.length && msgSel) {\n+      var text = \"\";\n+      errors.forEach((e: Errors.CompilationError) => {\n+        var block = e.block;\n+        $(block.svgGroup_).attr(\"class\", \"blocklySelected blocklyError\");\n+        text += e.msg + \"\\n\";\n+      });\n+      statusMsg(text, External.Status.Error);\n+      $(msgSel).removeClass(\"hidden\");\n+      showPopup($(\"#link-log\"), $(\"#popup-log\"));\n+      return null;\n+    }\n+\n+    return ast;\n+  }*/\n+\n+  /*function doGraduate(msgSel?: string) {\n+    var ast = compileOrError(msgSel);\n+    if (!ast)\n+      return;\n+    post(<External.Message_Upgrade> {\n+      type: External.MessageType.Upgrade,\n+      ast: ast,\n+      name: getName()+\" (converted)\",\n+    });\n+  }\n+\n+  function doCompile(msgSel?: string) {\n+    var ast = compileOrError(msgSel);\n+    if (!ast)\n+      return;\n+    $(\"#command-compile > .roundsymbol\").addClass(\"compiling\");\n+    post(<External.Message_Compile> {\n+      type: External.MessageType.Compile,\n+      text: ast,\n+      language: External.Language.TouchDevelop,\n+      name: getName(),\n+    });\n+  }*/\n+\n+  function setupButtons(fota: boolean) {\n+    if (fota)\n+      $(\"body\").addClass(\"hasFota\");\n+\n+    // $(\"#command-quit\").click(() => {","path":"www/codekingdoms/codekingdoms-main.ts","position":454,"original_position":454,"commit_id":"a9b1d18d41fe174873d6df9c45289242dfaf042d","original_commit_id":"a9b1d18d41fe174873d6df9c45289242dfaf042d","user":{"login":"inversion","id":1159424,"avatar_url":"https://avatars.githubusercontent.com/u/1159424?v=3","gravatar_id":"","url":"https://api.github.com/users/inversion","html_url":"https://github.com/inversion","followers_url":"https://api.github.com/users/inversion/followers","following_url":"https://api.github.com/users/inversion/following{/other_user}","gists_url":"https://api.github.com/users/inversion/gists{/gist_id}","starred_url":"https://api.github.com/users/inversion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inversion/subscriptions","organizations_url":"https://api.github.com/users/inversion/orgs","repos_url":"https://api.github.com/users/inversion/repos","events_url":"https://api.github.com/users/inversion/events{/privacy}","received_events_url":"https://api.github.com/users/inversion/received_events","type":"User","site_admin":false},"body":"review dead code","created_at":"2015-07-23T07:46:52Z","updated_at":"2015-07-23T07:46:52Z","html_url":"https://github.com/Microsoft/TouchDevelop/pull/255#discussion_r35296779","pull_request_url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/comments/35296779"},"html":{"href":"https://github.com/Microsoft/TouchDevelop/pull/255#discussion_r35296779"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255","id":40644849,"html_url":"https://github.com/Microsoft/TouchDevelop/pull/255","diff_url":"https://github.com/Microsoft/TouchDevelop/pull/255.diff","patch_url":"https://github.com/Microsoft/TouchDevelop/pull/255.patch","issue_url":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/255","number":255,"state":"open","locked":false,"title":"Code Kingdoms JavaScript Editor","user":{"login":"inversion","id":1159424,"avatar_url":"https://avatars.githubusercontent.com/u/1159424?v=3","gravatar_id":"","url":"https://api.github.com/users/inversion","html_url":"https://github.com/inversion","followers_url":"https://api.github.com/users/inversion/followers","following_url":"https://api.github.com/users/inversion/following{/other_user}","gists_url":"https://api.github.com/users/inversion/gists{/gist_id}","starred_url":"https://api.github.com/users/inversion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/inversion/subscriptions","organizations_url":"https://api.github.com/users/inversion/orgs","repos_url":"https://api.github.com/users/inversion/repos","events_url":"https://api.github.com/users/inversion/events{/privacy}","received_events_url":"https://api.github.com/users/inversion/received_events","type":"User","site_admin":false},"body":"This is to add the Code Kingdoms JavaScript editor to TouchDevelop.\r\n\r\nI have added some comments in the diff at places which need review.","created_at":"2015-07-23T07:43:55Z","updated_at":"2015-07-23T07:46:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"362b516f8e50446cb2a6de5c8004e8fd8537ec9f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255/commits","review_comments_url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255/comments","review_comment_url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/255/comments","statuses_url":"https://api.github.com/repos/Microsoft/TouchDevelop/statuses/a9b1d18d41fe174873d6df9c45289242dfaf042d","head":{"label":"CodeKingdomsTeam:codekingdoms","ref":"codekingdoms","sha":"a9b1d18d41fe174873d6df9c45289242dfaf042d","user":{"login":"CodeKingdomsTeam","id":11870763,"avatar_url":"https://avatars.githubusercontent.com/u/11870763?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeKingdomsTeam","html_url":"https://github.com/CodeKingdomsTeam","followers_url":"https://api.github.com/users/CodeKingdomsTeam/followers","following_url":"https://api.github.com/users/CodeKingdomsTeam/following{/other_user}","gists_url":"https://api.github.com/users/CodeKingdomsTeam/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeKingdomsTeam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeKingdomsTeam/subscriptions","organizations_url":"https://api.github.com/users/CodeKingdomsTeam/orgs","repos_url":"https://api.github.com/users/CodeKingdomsTeam/repos","events_url":"https://api.github.com/users/CodeKingdomsTeam/events{/privacy}","received_events_url":"https://api.github.com/users/CodeKingdomsTeam/received_events","type":"Organization","site_admin":false},"repo":{"id":39527627,"name":"TouchDevelop","full_name":"CodeKingdomsTeam/TouchDevelop","owner":{"login":"CodeKingdomsTeam","id":11870763,"avatar_url":"https://avatars.githubusercontent.com/u/11870763?v=3","gravatar_id":"","url":"https://api.github.com/users/CodeKingdomsTeam","html_url":"https://github.com/CodeKingdomsTeam","followers_url":"https://api.github.com/users/CodeKingdomsTeam/followers","following_url":"https://api.github.com/users/CodeKingdomsTeam/following{/other_user}","gists_url":"https://api.github.com/users/CodeKingdomsTeam/gists{/gist_id}","starred_url":"https://api.github.com/users/CodeKingdomsTeam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodeKingdomsTeam/subscriptions","organizations_url":"https://api.github.com/users/CodeKingdomsTeam/orgs","repos_url":"https://api.github.com/users/CodeKingdomsTeam/repos","events_url":"https://api.github.com/users/CodeKingdomsTeam/events{/privacy}","received_events_url":"https://api.github.com/users/CodeKingdomsTeam/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CodeKingdomsTeam/TouchDevelop","description":"TouchDevelop is a touch-friendly app creation environment for iPad, iPhone, Android, Windows, Mac, Linux. Our mobile-friendly editor makes coding fun, even on your phone or tablet!","fork":true,"url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop","forks_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/forks","keys_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/teams","hooks_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/hooks","issue_events_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/issues/events{/number}","events_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/events","assignees_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/assignees{/user}","branches_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/branches{/branch}","tags_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/tags","blobs_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/git/refs{/sha}","trees_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/statuses/{sha}","languages_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/languages","stargazers_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/stargazers","contributors_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/contributors","subscribers_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/subscribers","subscription_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/subscription","commits_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/commits{/sha}","git_commits_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/git/commits{/sha}","comments_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/comments{/number}","issue_comment_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/issues/comments{/number}","contents_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/contents/{+path}","compare_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/merges","archive_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/downloads","issues_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/issues{/number}","pulls_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/pulls{/number}","milestones_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/milestones{/number}","notifications_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/labels{/name}","releases_url":"https://api.github.com/repos/CodeKingdomsTeam/TouchDevelop/releases{/id}","created_at":"2015-07-22T20:04:39Z","updated_at":"2015-07-22T20:04:41Z","pushed_at":"2015-07-23T07:43:19Z","git_url":"git://github.com/CodeKingdomsTeam/TouchDevelop.git","ssh_url":"git@github.com:CodeKingdomsTeam/TouchDevelop.git","clone_url":"https://github.com/CodeKingdomsTeam/TouchDevelop.git","svn_url":"https://github.com/CodeKingdomsTeam/TouchDevelop","homepage":null,"size":21876,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"Microsoft:master","ref":"master","sha":"3c760fbd463955d5c2f599b058fe0b1335f45a4b","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":30051348,"name":"TouchDevelop","full_name":"Microsoft/TouchDevelop","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/TouchDevelop","description":"TouchDevelop is a touch-friendly app creation environment for iPad, iPhone, Android, Windows, Mac, Linux. Our mobile-friendly editor makes coding fun, even on your phone or tablet!","fork":false,"url":"https://api.github.com/repos/Microsoft/TouchDevelop","forks_url":"https://api.github.com/repos/Microsoft/TouchDevelop/forks","keys_url":"https://api.github.com/repos/Microsoft/TouchDevelop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/TouchDevelop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/TouchDevelop/teams","hooks_url":"https://api.github.com/repos/Microsoft/TouchDevelop/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/TouchDevelop/events","assignees_url":"https://api.github.com/repos/Microsoft/TouchDevelop/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/TouchDevelop/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/TouchDevelop/tags","blobs_url":"https://api.github.com/repos/Microsoft/TouchDevelop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/TouchDevelop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/TouchDevelop/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/TouchDevelop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/TouchDevelop/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/TouchDevelop/languages","stargazers_url":"https://api.github.com/repos/Microsoft/TouchDevelop/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/TouchDevelop/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/TouchDevelop/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/TouchDevelop/subscription","commits_url":"https://api.github.com/repos/Microsoft/TouchDevelop/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/TouchDevelop/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/TouchDevelop/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/TouchDevelop/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/TouchDevelop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/TouchDevelop/merges","archive_url":"https://api.github.com/repos/Microsoft/TouchDevelop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/TouchDevelop/downloads","issues_url":"https://api.github.com/repos/Microsoft/TouchDevelop/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/TouchDevelop/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/TouchDevelop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/TouchDevelop/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/TouchDevelop/releases{/id}","created_at":"2015-01-30T01:59:33Z","updated_at":"2015-07-22T03:16:16Z","pushed_at":"2015-07-23T07:43:55Z","git_url":"git://github.com/Microsoft/TouchDevelop.git","ssh_url":"git@github.com:Microsoft/TouchDevelop.git","clone_url":"https://github.com/Microsoft/TouchDevelop.git","svn_url":"https://github.com/Microsoft/TouchDevelop","homepage":null,"size":21876,"stargazers_count":1067,"watchers_count":1067,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":102,"mirror_url":null,"open_issues_count":109,"forks":102,"open_issues":109,"watchers":1067,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255"},"html":{"href":"https://github.com/Microsoft/TouchDevelop/pull/255"},"issue":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/255"},"comments":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/issues/255/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/pulls/255/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/TouchDevelop/statuses/a9b1d18d41fe174873d6df9c45289242dfaf042d"}}}}