[
  {
    "name": "Authentication",
    "kind": "note",
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Blockstack Authentication provides single sign on and authentication without third parties or remote servers. Blockstack Authentication is a bearer token-based authentication system. From an app user's perspective, it functions similar to legacy third-party authentication techniques that they're familiar with. For an app developer, the flow is a bit different from the typical client-server flow of centralized sign in services (e.g., OAuth). Rather, with Blockstack, the authentication flow happens entirely client-side.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 524,
                  "offset": 523
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 524,
              "offset": 523
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Quickstart",
              "position": {
                "start": {
                  "line": 3,
                  "column": 4,
                  "offset": 528
                },
                "end": {
                  "line": 3,
                  "column": 14,
                  "offset": 538
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 3,
              "column": 1,
              "offset": 525
            },
            "end": {
              "line": 3,
              "column": 14,
              "offset": 538
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "1) Install ",
              "position": {
                "start": {
                  "line": 5,
                  "column": 1,
                  "offset": 540
                },
                "end": {
                  "line": 5,
                  "column": 12,
                  "offset": 551
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack.js",
              "position": {
                "start": {
                  "line": 5,
                  "column": 12,
                  "offset": 551
                },
                "end": {
                  "line": 5,
                  "column": 27,
                  "offset": 566
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ":",
              "position": {
                "start": {
                  "line": 5,
                  "column": 27,
                  "offset": 566
                },
                "end": {
                  "line": 5,
                  "column": 28,
                  "offset": 567
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 5,
              "column": 1,
              "offset": 540
            },
            "end": {
              "line": 5,
              "column": 28,
              "offset": 567
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "bash",
          "value": "npm install blockstack --save",
          "position": {
            "start": {
              "line": 7,
              "column": 1,
              "offset": 569
            },
            "end": {
              "line": 9,
              "column": 4,
              "offset": 610
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "2) Import Blockstack into your project",
              "position": {
                "start": {
                  "line": 11,
                  "column": 1,
                  "offset": 612
                },
                "end": {
                  "line": 11,
                  "column": 39,
                  "offset": 650
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 11,
              "column": 1,
              "offset": 612
            },
            "end": {
              "line": 11,
              "column": 39,
              "offset": 650
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "import * as blockstack from 'blockstack'",
          "position": {
            "start": {
              "line": 13,
              "column": 1,
              "offset": 652
            },
            "end": {
              "line": 15,
              "column": 4,
              "offset": 702
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "3) Wire up a sign in button",
              "position": {
                "start": {
                  "line": 17,
                  "column": 1,
                  "offset": 704
                },
                "end": {
                  "line": 17,
                  "column": 28,
                  "offset": 731
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 17,
              "column": 1,
              "offset": 704
            },
            "end": {
              "line": 17,
              "column": 28,
              "offset": 731
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "document.getElementById('signin-button').addEventListener('click', function() {\n  blockstack.redirectToSignIn()\n})",
          "position": {
            "start": {
              "line": 19,
              "column": 1,
              "offset": 733
            },
            "end": {
              "line": 23,
              "column": 4,
              "offset": 857
            },
            "indent": [
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "4) Wire up a sign out button",
              "position": {
                "start": {
                  "line": 25,
                  "column": 1,
                  "offset": 859
                },
                "end": {
                  "line": 25,
                  "column": 29,
                  "offset": 887
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 25,
              "column": 1,
              "offset": 859
            },
            "end": {
              "line": 25,
              "column": 29,
              "offset": 887
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "document.getElementById('signout-button').addEventListener('click', function() {\n  blockstack.signUserOut(window.location.origin)\n})",
          "position": {
            "start": {
              "line": 27,
              "column": 1,
              "offset": 889
            },
            "end": {
              "line": 31,
              "column": 4,
              "offset": 1031
            },
            "indent": [
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "5) Include the logic to (a) load user data (b) handle the auth response",
              "position": {
                "start": {
                  "line": 33,
                  "column": 1,
                  "offset": 1033
                },
                "end": {
                  "line": 33,
                  "column": 72,
                  "offset": 1104
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 33,
              "column": 1,
              "offset": 1033
            },
            "end": {
              "line": 33,
              "column": 72,
              "offset": 1104
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "function showProfile(profile) {\n  var person = new blockstack.Person(profile)\n  document.getElementById('heading-name').innerHTML = person.name()\n  document.getElementById('avatar-image').setAttribute('src', person.avatarUrl())\n  document.getElementById('section-1').style.display = 'none'\n  document.getElementById('section-2').style.display = 'block'\n}\n\nif (blockstack.isUserSignedIn()) {\n  const userData = blockstack.loadUserData()\n  showProfile(userData.profile)\n} else if (blockstack.isSignInPending()) {\n  blockstack.handlePendingSignIn()\n  .then(userData => {\n    showProfile(userData.profile)\n  })\n}",
          "position": {
            "start": {
              "line": 35,
              "column": 1,
              "offset": 1106
            },
            "end": {
              "line": 53,
              "column": 4,
              "offset": 1724
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "6) Create a ",
              "position": {
                "start": {
                  "line": 55,
                  "column": 1,
                  "offset": 1726
                },
                "end": {
                  "line": 55,
                  "column": 13,
                  "offset": 1738
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "manifest.json",
              "position": {
                "start": {
                  "line": 55,
                  "column": 13,
                  "offset": 1738
                },
                "end": {
                  "line": 55,
                  "column": 28,
                  "offset": 1753
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " file",
              "position": {
                "start": {
                  "line": 55,
                  "column": 28,
                  "offset": 1753
                },
                "end": {
                  "line": 55,
                  "column": 33,
                  "offset": 1758
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 55,
              "column": 1,
              "offset": 1726
            },
            "end": {
              "line": 55,
              "column": 33,
              "offset": 1758
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "json",
          "value": "{\n  \"name\": \"Hello, Blockstack\",\n  \"start_url\": \"localhost:5000\",\n  \"description\": \"A simple demo of Blockstack Auth\",\n  \"icons\": [{\n    \"src\": \"https://helloblockstack.com/icon-192x192.png\",\n    \"sizes\": \"192x192\",\n    \"type\": \"image/png\"\n  }]\n}",
          "position": {
            "start": {
              "line": 57,
              "column": 1,
              "offset": 1760
            },
            "end": {
              "line": 68,
              "column": 4,
              "offset": 2018
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Make sure your ",
              "position": {
                "start": {
                  "line": 70,
                  "column": 1,
                  "offset": 2020
                },
                "end": {
                  "line": 70,
                  "column": 16,
                  "offset": 2035
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "manifest.json",
              "position": {
                "start": {
                  "line": 70,
                  "column": 16,
                  "offset": 2035
                },
                "end": {
                  "line": 70,
                  "column": 31,
                  "offset": 2050
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " file has appropriate CORS headers so that it can\nbe fetched via an http ",
              "position": {
                "start": {
                  "line": 70,
                  "column": 31,
                  "offset": 2050
                },
                "end": {
                  "line": 71,
                  "column": 24,
                  "offset": 2123
                },
                "indent": [
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "GET",
              "position": {
                "start": {
                  "line": 71,
                  "column": 24,
                  "offset": 2123
                },
                "end": {
                  "line": 71,
                  "column": 29,
                  "offset": 2128
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " from any origin.",
              "position": {
                "start": {
                  "line": 71,
                  "column": 29,
                  "offset": 2128
                },
                "end": {
                  "line": 71,
                  "column": 46,
                  "offset": 2145
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 70,
              "column": 1,
              "offset": 2020
            },
            "end": {
              "line": 71,
              "column": 46,
              "offset": 2145
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "7) Serve your application",
              "position": {
                "start": {
                  "line": 74,
                  "column": 1,
                  "offset": 2148
                },
                "end": {
                  "line": 74,
                  "column": 26,
                  "offset": 2173
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 74,
              "column": 1,
              "offset": 2148
            },
            "end": {
              "line": 74,
              "column": 26,
              "offset": 2173
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "User flow",
              "position": {
                "start": {
                  "line": 76,
                  "column": 4,
                  "offset": 2178
                },
                "end": {
                  "line": 76,
                  "column": 13,
                  "offset": 2187
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 76,
              "column": 1,
              "offset": 2175
            },
            "end": {
              "line": 76,
              "column": 13,
              "offset": 2187
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "What follows is a walk through of the experience of a user, Alice, signing in to your app with Blockstack.",
              "position": {
                "start": {
                  "line": 78,
                  "column": 1,
                  "offset": 2189
                },
                "end": {
                  "line": 78,
                  "column": 107,
                  "offset": 2295
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 78,
              "column": 1,
              "offset": 2189
            },
            "end": {
              "line": 78,
              "column": 107,
              "offset": 2295
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "First, Alice clicks the \"Sign in with Blockstack\" button on your app. She is redirected to her copy of the Blockstack Browser. The Blockstack Browser shows Alice an approval dialog with information about your app including:",
              "position": {
                "start": {
                  "line": 80,
                  "column": 1,
                  "offset": 2297
                },
                "end": {
                  "line": 80,
                  "column": 224,
                  "offset": 2520
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 80,
              "column": 1,
              "offset": 2297
            },
            "end": {
              "line": 80,
              "column": 224,
              "offset": 2520
            },
            "indent": []
          }
        },
        {
          "type": "list",
          "ordered": false,
          "start": null,
          "loose": false,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "The origin your app was served from",
                      "position": {
                        "start": {
                          "line": 82,
                          "column": 3,
                          "offset": 2524
                        },
                        "end": {
                          "line": 82,
                          "column": 38,
                          "offset": 2559
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 82,
                      "column": 3,
                      "offset": 2524
                    },
                    "end": {
                      "line": 82,
                      "column": 38,
                      "offset": 2559
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 82,
                  "column": 1,
                  "offset": 2522
                },
                "end": {
                  "line": 82,
                  "column": 38,
                  "offset": 2559
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Your app's name",
                      "position": {
                        "start": {
                          "line": 83,
                          "column": 3,
                          "offset": 2562
                        },
                        "end": {
                          "line": 83,
                          "column": 18,
                          "offset": 2577
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 83,
                      "column": 3,
                      "offset": 2562
                    },
                    "end": {
                      "line": 83,
                      "column": 18,
                      "offset": 2577
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 83,
                  "column": 1,
                  "offset": 2560
                },
                "end": {
                  "line": 83,
                  "column": 18,
                  "offset": 2577
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Your app's logo",
                      "position": {
                        "start": {
                          "line": 84,
                          "column": 3,
                          "offset": 2580
                        },
                        "end": {
                          "line": 84,
                          "column": 18,
                          "offset": 2595
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 84,
                      "column": 3,
                      "offset": 2580
                    },
                    "end": {
                      "line": 84,
                      "column": 18,
                      "offset": 2595
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 84,
                  "column": 1,
                  "offset": 2578
                },
                "end": {
                  "line": 84,
                  "column": 18,
                  "offset": 2595
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "The types of permissions and data your app is requesting",
                      "position": {
                        "start": {
                          "line": 85,
                          "column": 3,
                          "offset": 2598
                        },
                        "end": {
                          "line": 85,
                          "column": 59,
                          "offset": 2654
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 85,
                      "column": 3,
                      "offset": 2598
                    },
                    "end": {
                      "line": 85,
                      "column": 59,
                      "offset": 2654
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 85,
                  "column": 1,
                  "offset": 2596
                },
                "end": {
                  "line": 85,
                  "column": 59,
                  "offset": 2654
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 82,
              "column": 1,
              "offset": 2522
            },
            "end": {
              "line": 85,
              "column": 59,
              "offset": 2654
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Alice can choose to authenticate as one of her Blockstack IDs by selecting the ID and clicking the Approve button.",
              "position": {
                "start": {
                  "line": 87,
                  "column": 1,
                  "offset": 2656
                },
                "end": {
                  "line": 87,
                  "column": 115,
                  "offset": 2770
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 87,
              "column": 1,
              "offset": 2656
            },
            "end": {
              "line": 87,
              "column": 115,
              "offset": 2770
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "When she clicks approve, she's redirected back to your app. Your app gets cryptographic proof that she is who she claims to be, access to a dedicated bucket in her Gaia storage hub for your app to read and write its own data along with public information she's stored in her profile.",
              "position": {
                "start": {
                  "line": 89,
                  "column": 1,
                  "offset": 2772
                },
                "end": {
                  "line": 89,
                  "column": 284,
                  "offset": 3055
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 89,
              "column": 1,
              "offset": 2772
            },
            "end": {
              "line": 89,
              "column": 284,
              "offset": 3055
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Manifest file",
              "position": {
                "start": {
                  "line": 91,
                  "column": 4,
                  "offset": 3060
                },
                "end": {
                  "line": 91,
                  "column": 17,
                  "offset": 3073
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 91,
              "column": 1,
              "offset": 3057
            },
            "end": {
              "line": 91,
              "column": 17,
              "offset": 3073
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Blockstack apps have a manifest file based on the ",
              "position": {
                "start": {
                  "line": 93,
                  "column": 1,
                  "offset": 3075
                },
                "end": {
                  "line": 93,
                  "column": 51,
                  "offset": 3125
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://w3c.github.io/manifest/",
              "children": [
                {
                  "type": "text",
                  "value": "W3C web app manifest specification",
                  "position": {
                    "start": {
                      "line": 93,
                      "column": 52,
                      "offset": 3126
                    },
                    "end": {
                      "line": 93,
                      "column": 86,
                      "offset": 3160
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 93,
                  "column": 51,
                  "offset": 3125
                },
                "end": {
                  "line": 93,
                  "column": 120,
                  "offset": 3194
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ". The Blockstack Browser retrieves the manifest file from the app during the authentication process and displays some of the information in it such as the app name and icon to the user. The location of the app manifest file is specific in the authentication request token and ",
              "position": {
                "start": {
                  "line": 93,
                  "column": 120,
                  "offset": 3194
                },
                "end": {
                  "line": 93,
                  "column": 396,
                  "offset": 3470
                },
                "indent": []
              }
            },
            {
              "type": "emphasis",
              "children": [
                {
                  "type": "text",
                  "value": "MUST",
                  "position": {
                    "start": {
                      "line": 93,
                      "column": 397,
                      "offset": 3471
                    },
                    "end": {
                      "line": 93,
                      "column": 401,
                      "offset": 3475
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 93,
                  "column": 396,
                  "offset": 3470
                },
                "end": {
                  "line": 93,
                  "column": 402,
                  "offset": 3476
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " be on the same origin as the app requesting authentication.",
              "position": {
                "start": {
                  "line": 93,
                  "column": 402,
                  "offset": 3476
                },
                "end": {
                  "line": 93,
                  "column": 462,
                  "offset": 3536
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 93,
              "column": 1,
              "offset": 3075
            },
            "end": {
              "line": 93,
              "column": 462,
              "offset": 3536
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Below is an example of a manifest file:",
              "position": {
                "start": {
                  "line": 95,
                  "column": 1,
                  "offset": 3538
                },
                "end": {
                  "line": 95,
                  "column": 40,
                  "offset": 3577
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 95,
              "column": 1,
              "offset": 3538
            },
            "end": {
              "line": 95,
              "column": 40,
              "offset": 3577
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": null,
          "value": "{\n  \"name\": \"Todo App\",\n  \"start_url\": \"http://blockstack-todos.appartisan.com\",\n  \"description\": \"A simple todo app build on blockstack\",\n  \"icons\": [{\n    \"src\": \"http://blockstack-todos.appartisan.com/logo.png\",\n    \"sizes\": \"400x400\",\n    \"type\": \"image/png\"\n  }]\n}",
          "position": {
            "start": {
              "line": 97,
              "column": 1,
              "offset": 3579
            },
            "end": {
              "line": 108,
              "column": 4,
              "offset": 3856
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The manifest file ",
              "position": {
                "start": {
                  "line": 110,
                  "column": 1,
                  "offset": 3858
                },
                "end": {
                  "line": 110,
                  "column": 19,
                  "offset": 3876
                },
                "indent": []
              }
            },
            {
              "type": "emphasis",
              "children": [
                {
                  "type": "text",
                  "value": "MUST",
                  "position": {
                    "start": {
                      "line": 110,
                      "column": 20,
                      "offset": 3877
                    },
                    "end": {
                      "line": 110,
                      "column": 24,
                      "offset": 3881
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 110,
                  "column": 19,
                  "offset": 3876
                },
                "end": {
                  "line": 110,
                  "column": 25,
                  "offset": 3882
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " have ",
              "position": {
                "start": {
                  "line": 110,
                  "column": 25,
                  "offset": 3882
                },
                "end": {
                  "line": 110,
                  "column": 31,
                  "offset": 3888
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://en.wikipedia.org/wiki/Cross-origin_resource_sharing",
              "children": [
                {
                  "type": "text",
                  "value": "Cross-origin resource sharing (CORS) headers",
                  "position": {
                    "start": {
                      "line": 110,
                      "column": 32,
                      "offset": 3889
                    },
                    "end": {
                      "line": 110,
                      "column": 76,
                      "offset": 3933
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 110,
                  "column": 31,
                  "offset": 3888
                },
                "end": {
                  "line": 110,
                  "column": 138,
                  "offset": 3995
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " that allow the manifest file to be fetched from any arbitrary source. This usually means returning:",
              "position": {
                "start": {
                  "line": 110,
                  "column": 138,
                  "offset": 3995
                },
                "end": {
                  "line": 110,
                  "column": 238,
                  "offset": 4095
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 110,
              "column": 1,
              "offset": 3858
            },
            "end": {
              "line": 110,
              "column": 238,
              "offset": 4095
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": null,
          "value": "Access-Control-Allow-Origin: *",
          "position": {
            "start": {
              "line": 112,
              "column": 1,
              "offset": 4097
            },
            "end": {
              "line": 114,
              "column": 4,
              "offset": 4135
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Key pairs",
              "position": {
                "start": {
                  "line": 116,
                  "column": 4,
                  "offset": 4140
                },
                "end": {
                  "line": 116,
                  "column": 13,
                  "offset": 4149
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 116,
              "column": 1,
              "offset": 4137
            },
            "end": {
              "line": 116,
              "column": 13,
              "offset": 4149
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Blockstack Authentication makes extensive use of public key cryptography. As mentioned above, we use ECDSA with the secp256k1 curve. What follows is a description of the various public-private key pairs used in the authentication process including how they're generated, where they're used and to whom the private key is disclosed.",
              "position": {
                "start": {
                  "line": 118,
                  "column": 1,
                  "offset": 4151
                },
                "end": {
                  "line": 118,
                  "column": 332,
                  "offset": 4482
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 118,
              "column": 1,
              "offset": 4151
            },
            "end": {
              "line": 118,
              "column": 332,
              "offset": 4482
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Transit private key",
              "position": {
                "start": {
                  "line": 120,
                  "column": 5,
                  "offset": 4488
                },
                "end": {
                  "line": 120,
                  "column": 24,
                  "offset": 4507
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 120,
              "column": 1,
              "offset": 4484
            },
            "end": {
              "line": 120,
              "column": 24,
              "offset": 4507
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The transit private is an ephemeral key that is used to encrypt secrets that need to be passed from the Blockstack Browser to the app during the authentication process. It is randomly generated by the app at the beginning of the authentication response. The public key that corresponds to the transit private key is stored in a single element array in the ",
              "position": {
                "start": {
                  "line": 122,
                  "column": 1,
                  "offset": 4509
                },
                "end": {
                  "line": 122,
                  "column": 357,
                  "offset": 4865
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "public_keys",
              "position": {
                "start": {
                  "line": 122,
                  "column": 357,
                  "offset": 4865
                },
                "end": {
                  "line": 122,
                  "column": 370,
                  "offset": 4878
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " key of the authentication request token. The Blockstack Browser encrypts secret data such as the app private key using this public key and sends it back to the app when the user signs in to the app. The transit private key signs the app authentication request.",
              "position": {
                "start": {
                  "line": 122,
                  "column": 370,
                  "offset": 4878
                },
                "end": {
                  "line": 122,
                  "column": 631,
                  "offset": 5139
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 122,
              "column": 1,
              "offset": 4509
            },
            "end": {
              "line": 122,
              "column": 631,
              "offset": 5139
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Blockstack ID Identity address private key",
              "position": {
                "start": {
                  "line": 124,
                  "column": 5,
                  "offset": 5145
                },
                "end": {
                  "line": 124,
                  "column": 47,
                  "offset": 5187
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 124,
              "column": 1,
              "offset": 5141
            },
            "end": {
              "line": 124,
              "column": 47,
              "offset": 5187
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The identity address private key is derived from the user's keychain phrase and is the private key of the Blockstack ID that the user chooses to use to sign in to the app. It is a secret owned by the user and never leaves the user's instance of the Blockstack browser. This private key signs the authentication response token for an app to indicate that the user approves sign in to that app.",
              "position": {
                "start": {
                  "line": 126,
                  "column": 1,
                  "offset": 5189
                },
                "end": {
                  "line": 126,
                  "column": 393,
                  "offset": 5581
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 126,
              "column": 1,
              "offset": 5189
            },
            "end": {
              "line": 126,
              "column": 393,
              "offset": 5581
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "App private key",
              "position": {
                "start": {
                  "line": 128,
                  "column": 5,
                  "offset": 5587
                },
                "end": {
                  "line": 128,
                  "column": 20,
                  "offset": 5602
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 128,
              "column": 1,
              "offset": 5583
            },
            "end": {
              "line": 128,
              "column": 20,
              "offset": 5602
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The app private key is an app-specific private key that is generated from the user's identity address private key using the ",
              "position": {
                "start": {
                  "line": 130,
                  "column": 1,
                  "offset": 5604
                },
                "end": {
                  "line": 130,
                  "column": 125,
                  "offset": 5728
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "domain_name",
              "position": {
                "start": {
                  "line": 130,
                  "column": 125,
                  "offset": 5728
                },
                "end": {
                  "line": 130,
                  "column": 138,
                  "offset": 5741
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " as input. It is deterministic in that for a given Blockstack ID and ",
              "position": {
                "start": {
                  "line": 130,
                  "column": 138,
                  "offset": 5741
                },
                "end": {
                  "line": 130,
                  "column": 207,
                  "offset": 5810
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "domain_name",
              "position": {
                "start": {
                  "line": 130,
                  "column": 207,
                  "offset": 5810
                },
                "end": {
                  "line": 130,
                  "column": 220,
                  "offset": 5823
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ", the same private key will be generated each time. The app private key is securely shared with the app on each authentication, encrypted by the Blockstack browser with the transit public key.",
              "position": {
                "start": {
                  "line": 130,
                  "column": 220,
                  "offset": 5823
                },
                "end": {
                  "line": 130,
                  "column": 412,
                  "offset": 6015
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 130,
              "column": 1,
              "offset": 5604
            },
            "end": {
              "line": 130,
              "column": 412,
              "offset": 6015
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The app private key serves three functions.",
              "position": {
                "start": {
                  "line": 132,
                  "column": 1,
                  "offset": 6017
                },
                "end": {
                  "line": 132,
                  "column": 44,
                  "offset": 6060
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 132,
              "column": 1,
              "offset": 6017
            },
            "end": {
              "line": 132,
              "column": 44,
              "offset": 6060
            },
            "indent": []
          }
        },
        {
          "type": "list",
          "ordered": false,
          "start": null,
          "loose": false,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "It is used to create the credentials that give an app access to the gaia hub storage bucket for that specific app.",
                      "position": {
                        "start": {
                          "line": 133,
                          "column": 3,
                          "offset": 6063
                        },
                        "end": {
                          "line": 133,
                          "column": 117,
                          "offset": 6177
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 133,
                      "column": 3,
                      "offset": 6063
                    },
                    "end": {
                      "line": 133,
                      "column": 117,
                      "offset": 6177
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 133,
                  "column": 1,
                  "offset": 6061
                },
                "end": {
                  "line": 133,
                  "column": 117,
                  "offset": 6177
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "It is used in the end-to-end encryption of files stored for the app on the user's gaia hub.",
                      "position": {
                        "start": {
                          "line": 134,
                          "column": 3,
                          "offset": 6180
                        },
                        "end": {
                          "line": 134,
                          "column": 94,
                          "offset": 6271
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 134,
                      "column": 3,
                      "offset": 6180
                    },
                    "end": {
                      "line": 134,
                      "column": 94,
                      "offset": 6271
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 134,
                  "column": 1,
                  "offset": 6178
                },
                "end": {
                  "line": 134,
                  "column": 94,
                  "offset": 6271
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "It serves as a cryptographic secret that apps can use to perform other cryptographic functions.",
                      "position": {
                        "start": {
                          "line": 135,
                          "column": 3,
                          "offset": 6274
                        },
                        "end": {
                          "line": 135,
                          "column": 98,
                          "offset": 6369
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 135,
                      "column": 3,
                      "offset": 6274
                    },
                    "end": {
                      "line": 135,
                      "column": 98,
                      "offset": 6369
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 135,
                  "column": 1,
                  "offset": 6272
                },
                "end": {
                  "line": 135,
                  "column": 98,
                  "offset": 6369
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 133,
              "column": 1,
              "offset": 6061
            },
            "end": {
              "line": 135,
              "column": 98,
              "offset": 6369
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Scopes",
              "position": {
                "start": {
                  "line": 137,
                  "column": 4,
                  "offset": 6374
                },
                "end": {
                  "line": 137,
                  "column": 10,
                  "offset": 6380
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 137,
              "column": 1,
              "offset": 6371
            },
            "end": {
              "line": 137,
              "column": 10,
              "offset": 6380
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Scopes define the information and permissions an app requests from the\nuser during authentication. Requested scopes may be any of the following:",
              "position": {
                "start": {
                  "line": 139,
                  "column": 1,
                  "offset": 6382
                },
                "end": {
                  "line": 140,
                  "column": 74,
                  "offset": 6526
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 139,
              "column": 1,
              "offset": 6382
            },
            "end": {
              "line": 140,
              "column": 74,
              "offset": 6526
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "list",
          "ordered": false,
          "start": null,
          "loose": true,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "store_write",
                      "position": {
                        "start": {
                          "line": 142,
                          "column": 3,
                          "offset": 6530
                        },
                        "end": {
                          "line": 142,
                          "column": 16,
                          "offset": 6543
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " - read and write data to the user's Gaia hub in an app-specific storage bucket",
                      "position": {
                        "start": {
                          "line": 142,
                          "column": 16,
                          "offset": 6543
                        },
                        "end": {
                          "line": 142,
                          "column": 95,
                          "offset": 6622
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 142,
                      "column": 3,
                      "offset": 6530
                    },
                    "end": {
                      "line": 142,
                      "column": 95,
                      "offset": 6622
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 142,
                  "column": 1,
                  "offset": 6528
                },
                "end": {
                  "line": 142,
                  "column": 95,
                  "offset": 6622
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "publish_data",
                      "position": {
                        "start": {
                          "line": 143,
                          "column": 3,
                          "offset": 6625
                        },
                        "end": {
                          "line": 143,
                          "column": 17,
                          "offset": 6639
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " - publish data so that other users of the app can discover and interact with the user",
                      "position": {
                        "start": {
                          "line": 143,
                          "column": 17,
                          "offset": 6639
                        },
                        "end": {
                          "line": 143,
                          "column": 103,
                          "offset": 6725
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 143,
                      "column": 3,
                      "offset": 6625
                    },
                    "end": {
                      "line": 143,
                      "column": 103,
                      "offset": 6725
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 143,
                  "column": 1,
                  "offset": 6623
                },
                "end": {
                  "line": 143,
                  "column": 103,
                  "offset": 6725
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": true,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "email",
                      "position": {
                        "start": {
                          "line": 144,
                          "column": 3,
                          "offset": 6728
                        },
                        "end": {
                          "line": 144,
                          "column": 10,
                          "offset": 6735
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " - requests the user's email if available",
                      "position": {
                        "start": {
                          "line": 144,
                          "column": 10,
                          "offset": 6735
                        },
                        "end": {
                          "line": 144,
                          "column": 51,
                          "offset": 6776
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 144,
                      "column": 3,
                      "offset": 6728
                    },
                    "end": {
                      "line": 144,
                      "column": 51,
                      "offset": 6776
                    },
                    "indent": []
                  }
                },
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": " If no ",
                      "position": {
                        "start": {
                          "line": 146,
                          "column": 1,
                          "offset": 6778
                        },
                        "end": {
                          "line": 146,
                          "column": 8,
                          "offset": 6785
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "scopes",
                      "position": {
                        "start": {
                          "line": 146,
                          "column": 8,
                          "offset": 6785
                        },
                        "end": {
                          "line": 146,
                          "column": 16,
                          "offset": 6793
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " array is provided to the ",
                      "position": {
                        "start": {
                          "line": 146,
                          "column": 16,
                          "offset": 6793
                        },
                        "end": {
                          "line": 146,
                          "column": 42,
                          "offset": 6819
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "redirectToSignIn",
                      "position": {
                        "start": {
                          "line": 146,
                          "column": 42,
                          "offset": 6819
                        },
                        "end": {
                          "line": 146,
                          "column": 60,
                          "offset": 6837
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " or\n",
                      "position": {
                        "start": {
                          "line": 146,
                          "column": 60,
                          "offset": 6837
                        },
                        "end": {
                          "line": 147,
                          "column": 1,
                          "offset": 6841
                        },
                        "indent": [
                          1
                        ]
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "makeAuthRequest",
                      "position": {
                        "start": {
                          "line": 147,
                          "column": 1,
                          "offset": 6841
                        },
                        "end": {
                          "line": 147,
                          "column": 18,
                          "offset": 6858
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " functions, the default is to request ",
                      "position": {
                        "start": {
                          "line": 147,
                          "column": 18,
                          "offset": 6858
                        },
                        "end": {
                          "line": 147,
                          "column": 56,
                          "offset": 6896
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "['store_write']",
                      "position": {
                        "start": {
                          "line": 147,
                          "column": 56,
                          "offset": 6896
                        },
                        "end": {
                          "line": 147,
                          "column": 73,
                          "offset": 6913
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": ".",
                      "position": {
                        "start": {
                          "line": 147,
                          "column": 73,
                          "offset": 6913
                        },
                        "end": {
                          "line": 147,
                          "column": 74,
                          "offset": 6914
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 146,
                      "column": 1,
                      "offset": 6778
                    },
                    "end": {
                      "line": 147,
                      "column": 74,
                      "offset": 6914
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 144,
                  "column": 1,
                  "offset": 6726
                },
                "end": {
                  "line": 147,
                  "column": 74,
                  "offset": 6914
                },
                "indent": [
                  1,
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 142,
              "column": 1,
              "offset": 6528
            },
            "end": {
              "line": 147,
              "column": 74,
              "offset": 6914
            },
            "indent": [
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Authentication tokens",
              "position": {
                "start": {
                  "line": 149,
                  "column": 4,
                  "offset": 6919
                },
                "end": {
                  "line": 149,
                  "column": 25,
                  "offset": 6940
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 149,
              "column": 1,
              "offset": 6916
            },
            "end": {
              "line": 149,
              "column": 25,
              "offset": 6940
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The app and the Blockstack Browser communicate during the authentication flow by passing back and forth two tokens:",
              "position": {
                "start": {
                  "line": 151,
                  "column": 1,
                  "offset": 6942
                },
                "end": {
                  "line": 151,
                  "column": 116,
                  "offset": 7057
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 151,
              "column": 1,
              "offset": 6942
            },
            "end": {
              "line": 151,
              "column": 116,
              "offset": 7057
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The requesting application sends the Blockstack Browser an authRequest token.\nOnce a user approves a sign in, the Blockstack Browser responds to the application with an authResponse token.",
              "position": {
                "start": {
                  "line": 153,
                  "column": 1,
                  "offset": 7059
                },
                "end": {
                  "line": 154,
                  "column": 111,
                  "offset": 7247
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 153,
              "column": 1,
              "offset": 7059
            },
            "end": {
              "line": 154,
              "column": 111,
              "offset": 7247
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "These tokens are ",
              "position": {
                "start": {
                  "line": 156,
                  "column": 1,
                  "offset": 7249
                },
                "end": {
                  "line": 156,
                  "column": 18,
                  "offset": 7266
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://jwt.io/",
              "children": [
                {
                  "type": "text",
                  "value": "JSON Web Tokens",
                  "position": {
                    "start": {
                      "line": 156,
                      "column": 19,
                      "offset": 7267
                    },
                    "end": {
                      "line": 156,
                      "column": 34,
                      "offset": 7282
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 156,
                  "column": 18,
                  "offset": 7266
                },
                "end": {
                  "line": 156,
                  "column": 52,
                  "offset": 7300
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ", and they are passed via URL query strings.",
              "position": {
                "start": {
                  "line": 156,
                  "column": 52,
                  "offset": 7300
                },
                "end": {
                  "line": 156,
                  "column": 96,
                  "offset": 7344
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 156,
              "column": 1,
              "offset": 7249
            },
            "end": {
              "line": 156,
              "column": 96,
              "offset": 7344
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "JSON Web Token signatures",
              "position": {
                "start": {
                  "line": 158,
                  "column": 5,
                  "offset": 7350
                },
                "end": {
                  "line": 158,
                  "column": 30,
                  "offset": 7375
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 158,
              "column": 1,
              "offset": 7346
            },
            "end": {
              "line": 158,
              "column": 30,
              "offset": 7375
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Blockstack's authentication tokens are based on the ",
              "position": {
                "start": {
                  "line": 160,
                  "column": 1,
                  "offset": 7377
                },
                "end": {
                  "line": 160,
                  "column": 53,
                  "offset": 7429
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://tools.ietf.org/html/rfc7519",
              "children": [
                {
                  "type": "text",
                  "value": "RFC 7519 OAuth JSON Web Token (JWT)",
                  "position": {
                    "start": {
                      "line": 160,
                      "column": 54,
                      "offset": 7430
                    },
                    "end": {
                      "line": 160,
                      "column": 89,
                      "offset": 7465
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 160,
                  "column": 53,
                  "offset": 7429
                },
                "end": {
                  "line": 160,
                  "column": 127,
                  "offset": 7503
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " with additional support for the secp256k1 curve used by bitcoin and many other cryptocurrencies.",
              "position": {
                "start": {
                  "line": 160,
                  "column": 127,
                  "offset": 7503
                },
                "end": {
                  "line": 160,
                  "column": 224,
                  "offset": 7600
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 160,
              "column": 1,
              "offset": 7377
            },
            "end": {
              "line": 160,
              "column": 224,
              "offset": 7600
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "This signature algorithm is indicated by specifying ",
              "position": {
                "start": {
                  "line": 162,
                  "column": 1,
                  "offset": 7602
                },
                "end": {
                  "line": 162,
                  "column": 53,
                  "offset": 7654
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "ES256K",
              "position": {
                "start": {
                  "line": 162,
                  "column": 53,
                  "offset": 7654
                },
                "end": {
                  "line": 162,
                  "column": 61,
                  "offset": 7662
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " in the token's ",
              "position": {
                "start": {
                  "line": 162,
                  "column": 61,
                  "offset": 7662
                },
                "end": {
                  "line": 162,
                  "column": 77,
                  "offset": 7678
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "alg",
              "position": {
                "start": {
                  "line": 162,
                  "column": 77,
                  "offset": 7678
                },
                "end": {
                  "line": 162,
                  "column": 82,
                  "offset": 7683
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " key, specifying that the JWT signature uses ECDSA with the secp256k1 curve. We provide both ",
              "position": {
                "start": {
                  "line": 162,
                  "column": 82,
                  "offset": 7683
                },
                "end": {
                  "line": 162,
                  "column": 175,
                  "offset": 7776
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://github.com/blockstack/jsontokens-js",
              "children": [
                {
                  "type": "text",
                  "value": "JavaScript",
                  "position": {
                    "start": {
                      "line": 162,
                      "column": 176,
                      "offset": 7777
                    },
                    "end": {
                      "line": 162,
                      "column": 186,
                      "offset": 7787
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 162,
                  "column": 175,
                  "offset": 7776
                },
                "end": {
                  "line": 162,
                  "column": 232,
                  "offset": 7833
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " and ",
              "position": {
                "start": {
                  "line": 162,
                  "column": 232,
                  "offset": 7833
                },
                "end": {
                  "line": 162,
                  "column": 237,
                  "offset": 7838
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://github.com/blockstack/ruby-jwt-blockstack/tree/ruby-jwt-blockstack",
              "children": [
                {
                  "type": "text",
                  "value": "Ruby",
                  "position": {
                    "start": {
                      "line": 162,
                      "column": 238,
                      "offset": 7839
                    },
                    "end": {
                      "line": 162,
                      "column": 242,
                      "offset": 7843
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 162,
                  "column": 237,
                  "offset": 7838
                },
                "end": {
                  "line": 162,
                  "column": 319,
                  "offset": 7920
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " JWT libraries with support for this signing algorithm.",
              "position": {
                "start": {
                  "line": 162,
                  "column": 319,
                  "offset": 7920
                },
                "end": {
                  "line": 162,
                  "column": 374,
                  "offset": 7975
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 162,
              "column": 1,
              "offset": 7602
            },
            "end": {
              "line": 162,
              "column": 374,
              "offset": 7975
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Authentication request payload schema",
              "position": {
                "start": {
                  "line": 164,
                  "column": 5,
                  "offset": 7981
                },
                "end": {
                  "line": 164,
                  "column": 42,
                  "offset": 8018
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 164,
              "column": 1,
              "offset": 7977
            },
            "end": {
              "line": 164,
              "column": 42,
              "offset": 8018
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": "const requestPayload = {\n    jti, // UUID\n    iat, // JWT creation time in seconds\n    exp, // JWT expiration time in seconds\n    iss, // legacy decentralized identifier generated from transit key\n    public_keys, // single entry array with public key of transit key\n    domain_name, // app origin\n    manifest_uri, // url to manifest file - must be hosted on app origin\n    redirect_uri, // url to which browser redirects user on auth approval - must be hosted on app origin\n    version, // version tuple\n    do_not_include_profile, // a boolean flag asking browser to send profile url instead of profile object\n    supports_hub_url, // a boolean flag indicating gaia hub support\n    scopes // an array of string values indicating scopes requested by the app\n  }",
          "position": {
            "start": {
              "line": 166,
              "column": 1,
              "offset": 8020
            },
            "end": {
              "line": 181,
              "column": 4,
              "offset": 8802
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Authentication response payload schema",
              "position": {
                "start": {
                  "line": 184,
                  "column": 5,
                  "offset": 8809
                },
                "end": {
                  "line": 184,
                  "column": 43,
                  "offset": 8847
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 184,
              "column": 1,
              "offset": 8805
            },
            "end": {
              "line": 184,
              "column": 43,
              "offset": 8847
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": "    const responsePayload = {\n    jti, // UUID\n    iat, // JWT creation time in seconds\n    exp, // JWT expiration time in seconds\n    iss, // legacy decentralized identifier (string prefix + identity address) - this uniquely identifies the user\n    private_key, // encrypted private key payload\n    public_keys, // single entry array with public key\n    profile, // profile object or null if passed by profile_url\n    username, // blockstack id username (if any)\n    core_token, // encrypted core token payload\n    email, // email if email scope is requested & email available\n    profile_url, // url to signed profile token\n    hubUrl, // url pointing to user's gaia hub\n    version // version tuple\n  }",
          "position": {
            "start": {
              "line": 186,
              "column": 1,
              "offset": 8849
            },
            "end": {
              "line": 202,
              "column": 4,
              "offset": 9572
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "inlineCode",
              "value": "blockstack:",
              "position": {
                "start": {
                  "line": 204,
                  "column": 4,
                  "offset": 9577
                },
                "end": {
                  "line": 204,
                  "column": 17,
                  "offset": 9590
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " custom protocol handler",
              "position": {
                "start": {
                  "line": 204,
                  "column": 17,
                  "offset": 9590
                },
                "end": {
                  "line": 204,
                  "column": 41,
                  "offset": 9614
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 204,
              "column": 1,
              "offset": 9574
            },
            "end": {
              "line": 204,
              "column": 41,
              "offset": 9614
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The ",
              "position": {
                "start": {
                  "line": 206,
                  "column": 1,
                  "offset": 9616
                },
                "end": {
                  "line": 206,
                  "column": 5,
                  "offset": 9620
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack:",
              "position": {
                "start": {
                  "line": 206,
                  "column": 5,
                  "offset": 9620
                },
                "end": {
                  "line": 206,
                  "column": 18,
                  "offset": 9633
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " custom protocol handler is how Blockstack apps send their authentication requests to the Blockstack Browser. When the Blockstack Browser is installed on a user's computer, it registers itself as the handler for the ",
              "position": {
                "start": {
                  "line": 206,
                  "column": 18,
                  "offset": 9633
                },
                "end": {
                  "line": 206,
                  "column": 234,
                  "offset": 9849
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack:",
              "position": {
                "start": {
                  "line": 206,
                  "column": 234,
                  "offset": 9849
                },
                "end": {
                  "line": 206,
                  "column": 247,
                  "offset": 9862
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " customer protocol.",
              "position": {
                "start": {
                  "line": 206,
                  "column": 247,
                  "offset": 9862
                },
                "end": {
                  "line": 206,
                  "column": 266,
                  "offset": 9881
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 206,
              "column": 1,
              "offset": 9616
            },
            "end": {
              "line": 206,
              "column": 266,
              "offset": 9881
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "When an application calls ",
              "position": {
                "start": {
                  "line": 208,
                  "column": 1,
                  "offset": 9883
                },
                "end": {
                  "line": 208,
                  "column": 27,
                  "offset": 9909
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "http://blockstack.github.io/blockstack.js/index.html#redirecttosignin",
              "children": [
                {
                  "type": "inlineCode",
                  "value": "redirectToSignIn",
                  "position": {
                    "start": {
                      "line": 208,
                      "column": 28,
                      "offset": 9910
                    },
                    "end": {
                      "line": 208,
                      "column": 46,
                      "offset": 9928
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 208,
                  "column": 27,
                  "offset": 9909
                },
                "end": {
                  "line": 208,
                  "column": 118,
                  "offset": 10000
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " or ",
              "position": {
                "start": {
                  "line": 208,
                  "column": 118,
                  "offset": 10000
                },
                "end": {
                  "line": 208,
                  "column": 122,
                  "offset": 10004
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "http://blockstack.github.io/blockstack.js/index.html#redirecttosigninwithauthrequest",
              "children": [
                {
                  "type": "inlineCode",
                  "value": "redirectToSignInWithAuthRequest",
                  "position": {
                    "start": {
                      "line": 208,
                      "column": 123,
                      "offset": 10005
                    },
                    "end": {
                      "line": 208,
                      "column": 156,
                      "offset": 10038
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 208,
                  "column": 122,
                  "offset": 10004
                },
                "end": {
                  "line": 208,
                  "column": 243,
                  "offset": 10125
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ", blockstack.js checks if a blockstack: protocol handler is installed and, if so, redirects the user to ",
              "position": {
                "start": {
                  "line": 208,
                  "column": 243,
                  "offset": 10125
                },
                "end": {
                  "line": 208,
                  "column": 347,
                  "offset": 10229
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack:<authRequestToken>",
              "position": {
                "start": {
                  "line": 208,
                  "column": 347,
                  "offset": 10229
                },
                "end": {
                  "line": 208,
                  "column": 378,
                  "offset": 10260
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ". This passes the authentication request token from the app to the Blockstack Browser, which will in turn validate the request and display an authentication dialog.",
              "position": {
                "start": {
                  "line": 208,
                  "column": 378,
                  "offset": 10260
                },
                "end": {
                  "line": 208,
                  "column": 542,
                  "offset": 10424
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 208,
              "column": 1,
              "offset": 9883
            },
            "end": {
              "line": 208,
              "column": 542,
              "offset": 10424
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Adding Blockstack Authentication to your app",
              "position": {
                "start": {
                  "line": 211,
                  "column": 4,
                  "offset": 10430
                },
                "end": {
                  "line": 211,
                  "column": 48,
                  "offset": 10474
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 211,
              "column": 1,
              "offset": 10427
            },
            "end": {
              "line": 211,
              "column": 48,
              "offset": 10474
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The way you can add Blockstack Authentication to you app depends on whether your app is a modern decentralized Blockstack App where code runs client-side without trusted servers or a legacy client-server app where a server is trusted.",
              "position": {
                "start": {
                  "line": 213,
                  "column": 1,
                  "offset": 10476
                },
                "end": {
                  "line": 213,
                  "column": 235,
                  "offset": 10710
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 213,
              "column": 1,
              "offset": 10476
            },
            "end": {
              "line": 213,
              "column": 235,
              "offset": 10710
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Authentication in Client-side apps",
              "position": {
                "start": {
                  "line": 215,
                  "column": 5,
                  "offset": 10716
                },
                "end": {
                  "line": 215,
                  "column": 39,
                  "offset": 10750
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 215,
              "column": 1,
              "offset": 10712
            },
            "end": {
              "line": 215,
              "column": 39,
              "offset": 10750
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "This method is appropriate for decentralized client-side apps where the user's zone of trust - the parts of the app that the user is trusting - begins and ends with the code running on their own computer. In apps like these, any code the app interacts with that's not on their own computer such as external servers does not need to know who she is.",
              "position": {
                "start": {
                  "line": 217,
                  "column": 1,
                  "offset": 10752
                },
                "end": {
                  "line": 217,
                  "column": 349,
                  "offset": 11100
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 217,
              "column": 1,
              "offset": 10752
            },
            "end": {
              "line": 217,
              "column": 349,
              "offset": 11100
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "link",
              "title": null,
              "url": "https://github.com/blockstack/blockstack.js",
              "children": [
                {
                  "type": "text",
                  "value": "Blockstack.js",
                  "position": {
                    "start": {
                      "line": 219,
                      "column": 2,
                      "offset": 11103
                    },
                    "end": {
                      "line": 219,
                      "column": 15,
                      "offset": 11116
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 219,
                  "column": 1,
                  "offset": 11102
                },
                "end": {
                  "line": 219,
                  "column": 61,
                  "offset": 11162
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " provides API methods that help you to implement Blockstack Authentication in your client-side app.",
              "position": {
                "start": {
                  "line": 219,
                  "column": 61,
                  "offset": 11162
                },
                "end": {
                  "line": 219,
                  "column": 160,
                  "offset": 11261
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 219,
              "column": 1,
              "offset": 11102
            },
            "end": {
              "line": 219,
              "column": 160,
              "offset": 11261
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 4,
          "children": [
            {
              "type": "text",
              "value": "Standard flow",
              "position": {
                "start": {
                  "line": 221,
                  "column": 6,
                  "offset": 11268
                },
                "end": {
                  "line": 221,
                  "column": 19,
                  "offset": 11281
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 221,
              "column": 1,
              "offset": 11263
            },
            "end": {
              "line": 221,
              "column": 19,
              "offset": 11281
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The preferred way to implement authentication in these apps is to use the standard flow. This flow hides much of the process behind a few easy function calls and makes it very fast to get up and running.",
              "position": {
                "start": {
                  "line": 222,
                  "column": 1,
                  "offset": 11282
                },
                "end": {
                  "line": 222,
                  "column": 204,
                  "offset": 11485
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 222,
              "column": 1,
              "offset": 11282
            },
            "end": {
              "line": 222,
              "column": 204,
              "offset": 11485
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "In this process you'll use these four functions:",
              "position": {
                "start": {
                  "line": 224,
                  "column": 1,
                  "offset": 11487
                },
                "end": {
                  "line": 224,
                  "column": 49,
                  "offset": 11535
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 224,
              "column": 1,
              "offset": 11487
            },
            "end": {
              "line": 224,
              "column": 49,
              "offset": 11535
            },
            "indent": []
          }
        },
        {
          "type": "list",
          "ordered": false,
          "start": null,
          "loose": false,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "redirectToSignIn",
                      "position": {
                        "start": {
                          "line": 226,
                          "column": 3,
                          "offset": 11539
                        },
                        "end": {
                          "line": 226,
                          "column": 21,
                          "offset": 11557
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 226,
                      "column": 3,
                      "offset": 11539
                    },
                    "end": {
                      "line": 226,
                      "column": 21,
                      "offset": 11557
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 226,
                  "column": 1,
                  "offset": 11537
                },
                "end": {
                  "line": 226,
                  "column": 21,
                  "offset": 11557
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "isSignInPending",
                      "position": {
                        "start": {
                          "line": 227,
                          "column": 3,
                          "offset": 11560
                        },
                        "end": {
                          "line": 227,
                          "column": 20,
                          "offset": 11577
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 227,
                      "column": 3,
                      "offset": 11560
                    },
                    "end": {
                      "line": 227,
                      "column": 20,
                      "offset": 11577
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 227,
                  "column": 1,
                  "offset": 11558
                },
                "end": {
                  "line": 227,
                  "column": 20,
                  "offset": 11577
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "handlePendingSignIn",
                      "position": {
                        "start": {
                          "line": 228,
                          "column": 3,
                          "offset": 11580
                        },
                        "end": {
                          "line": 228,
                          "column": 24,
                          "offset": 11601
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 228,
                      "column": 3,
                      "offset": 11580
                    },
                    "end": {
                      "line": 228,
                      "column": 24,
                      "offset": 11601
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 228,
                  "column": 1,
                  "offset": 11578
                },
                "end": {
                  "line": 228,
                  "column": 24,
                  "offset": 11601
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "inlineCode",
                      "value": "loadUserData",
                      "position": {
                        "start": {
                          "line": 229,
                          "column": 3,
                          "offset": 11604
                        },
                        "end": {
                          "line": 229,
                          "column": 17,
                          "offset": 11618
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 229,
                      "column": 3,
                      "offset": 11604
                    },
                    "end": {
                      "line": 229,
                      "column": 17,
                      "offset": 11618
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 229,
                  "column": 1,
                  "offset": 11602
                },
                "end": {
                  "line": 229,
                  "column": 17,
                  "offset": 11618
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 226,
              "column": 1,
              "offset": 11537
            },
            "end": {
              "line": 229,
              "column": 17,
              "offset": 11618
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 5,
          "children": [
            {
              "type": "text",
              "value": "Starting the sign in process",
              "position": {
                "start": {
                  "line": 231,
                  "column": 7,
                  "offset": 11626
                },
                "end": {
                  "line": 231,
                  "column": 35,
                  "offset": 11654
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 231,
              "column": 1,
              "offset": 11620
            },
            "end": {
              "line": 231,
              "column": 35,
              "offset": 11654
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "When your app wants to start the sign in process, typically when the user clicks a \"Sign in with Blockstack\" button, your app will call the ",
              "position": {
                "start": {
                  "line": 233,
                  "column": 1,
                  "offset": 11656
                },
                "end": {
                  "line": 233,
                  "column": 141,
                  "offset": 11796
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "http://blockstack.github.io/blockstack.js/index.html#redirecttosignin",
              "children": [
                {
                  "type": "inlineCode",
                  "value": "redirectToSignIn",
                  "position": {
                    "start": {
                      "line": 233,
                      "column": 142,
                      "offset": 11797
                    },
                    "end": {
                      "line": 233,
                      "column": 160,
                      "offset": 11815
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 233,
                  "column": 141,
                  "offset": 11796
                },
                "end": {
                  "line": 233,
                  "column": 232,
                  "offset": 11887
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " method of ",
              "position": {
                "start": {
                  "line": 233,
                  "column": 232,
                  "offset": 11887
                },
                "end": {
                  "line": 233,
                  "column": 243,
                  "offset": 11898
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://github.com/blockstack/blockstack.js",
              "children": [
                {
                  "type": "text",
                  "value": "blockstack.js",
                  "position": {
                    "start": {
                      "line": 233,
                      "column": 244,
                      "offset": 11899
                    },
                    "end": {
                      "line": 233,
                      "column": 257,
                      "offset": 11912
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 233,
                  "column": 243,
                  "offset": 11898
                },
                "end": {
                  "line": 233,
                  "column": 303,
                  "offset": 11958
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ".",
              "position": {
                "start": {
                  "line": 233,
                  "column": 303,
                  "offset": 11958
                },
                "end": {
                  "line": 233,
                  "column": 304,
                  "offset": 11959
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 233,
              "column": 1,
              "offset": 11656
            },
            "end": {
              "line": 233,
              "column": 304,
              "offset": 11959
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "This creates an ephemeral transit key, stores it in the web browser's ",
              "position": {
                "start": {
                  "line": 235,
                  "column": 1,
                  "offset": 11961
                },
                "end": {
                  "line": 235,
                  "column": 71,
                  "offset": 12031
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "localStorage",
              "position": {
                "start": {
                  "line": 235,
                  "column": 71,
                  "offset": 12031
                },
                "end": {
                  "line": 235,
                  "column": 85,
                  "offset": 12045
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ", uses it to create an authentication request token and finally redirects the user to the Blockstack browser to approve the sign in request.",
              "position": {
                "start": {
                  "line": 235,
                  "column": 85,
                  "offset": 12045
                },
                "end": {
                  "line": 235,
                  "column": 225,
                  "offset": 12185
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 235,
              "column": 1,
              "offset": 11961
            },
            "end": {
              "line": 235,
              "column": 225,
              "offset": 12185
            },
            "indent": []
          }
        },
        {
          "type": "heading",
          "depth": 5,
          "children": [
            {
              "type": "text",
              "value": "Handling an authentication response",
              "position": {
                "start": {
                  "line": 237,
                  "column": 7,
                  "offset": 12193
                },
                "end": {
                  "line": 237,
                  "column": 42,
                  "offset": 12228
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 237,
              "column": 1,
              "offset": 12187
            },
            "end": {
              "line": 237,
              "column": 42,
              "offset": 12228
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "When a user approves a sign in request, the Blockstack Browser will return the signed authentication response token to the ",
              "position": {
                "start": {
                  "line": 239,
                  "column": 1,
                  "offset": 12230
                },
                "end": {
                  "line": 239,
                  "column": 124,
                  "offset": 12353
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "redirectURI",
              "position": {
                "start": {
                  "line": 239,
                  "column": 124,
                  "offset": 12353
                },
                "end": {
                  "line": 239,
                  "column": 137,
                  "offset": 12366
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " specified in ",
              "position": {
                "start": {
                  "line": 239,
                  "column": 137,
                  "offset": 12366
                },
                "end": {
                  "line": 239,
                  "column": 151,
                  "offset": 12380
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "redirectToSignIn",
              "position": {
                "start": {
                  "line": 239,
                  "column": 151,
                  "offset": 12380
                },
                "end": {
                  "line": 239,
                  "column": 169,
                  "offset": 12398
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ".",
              "position": {
                "start": {
                  "line": 239,
                  "column": 169,
                  "offset": 12398
                },
                "end": {
                  "line": 239,
                  "column": 170,
                  "offset": 12399
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 239,
              "column": 1,
              "offset": 12230
            },
            "end": {
              "line": 239,
              "column": 170,
              "offset": 12399
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "To check for the presence of this token, your app should call ",
              "position": {
                "start": {
                  "line": 241,
                  "column": 1,
                  "offset": 12401
                },
                "end": {
                  "line": 241,
                  "column": 63,
                  "offset": 12463
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "isSignInPending",
              "position": {
                "start": {
                  "line": 241,
                  "column": 63,
                  "offset": 12463
                },
                "end": {
                  "line": 241,
                  "column": 80,
                  "offset": 12480
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ". If this returns ",
              "position": {
                "start": {
                  "line": 241,
                  "column": 80,
                  "offset": 12480
                },
                "end": {
                  "line": 241,
                  "column": 98,
                  "offset": 12498
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "true",
              "position": {
                "start": {
                  "line": 241,
                  "column": 98,
                  "offset": 12498
                },
                "end": {
                  "line": 241,
                  "column": 104,
                  "offset": 12504
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ", the app should then call ",
              "position": {
                "start": {
                  "line": 241,
                  "column": 104,
                  "offset": 12504
                },
                "end": {
                  "line": 241,
                  "column": 131,
                  "offset": 12531
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "handlePendingSignIn",
              "position": {
                "start": {
                  "line": 241,
                  "column": 131,
                  "offset": 12531
                },
                "end": {
                  "line": 241,
                  "column": 152,
                  "offset": 12552
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ". This decodes the token, returns the signed-in-user's data, and simultaneously storing it to ",
              "position": {
                "start": {
                  "line": 241,
                  "column": 152,
                  "offset": 12552
                },
                "end": {
                  "line": 241,
                  "column": 246,
                  "offset": 12646
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "localStorage",
              "position": {
                "start": {
                  "line": 241,
                  "column": 246,
                  "offset": 12646
                },
                "end": {
                  "line": 241,
                  "column": 260,
                  "offset": 12660
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " so that it can be retrieved later with ",
              "position": {
                "start": {
                  "line": 241,
                  "column": 260,
                  "offset": 12660
                },
                "end": {
                  "line": 241,
                  "column": 300,
                  "offset": 12700
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "loadUserData",
              "position": {
                "start": {
                  "line": 241,
                  "column": 300,
                  "offset": 12700
                },
                "end": {
                  "line": 241,
                  "column": 314,
                  "offset": 12714
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ".",
              "position": {
                "start": {
                  "line": 241,
                  "column": 314,
                  "offset": 12714
                },
                "end": {
                  "line": 241,
                  "column": 315,
                  "offset": 12715
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 241,
              "column": 1,
              "offset": 12401
            },
            "end": {
              "line": 241,
              "column": 315,
              "offset": 12715
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "import * as blockstack from 'blockstack'\n\nif (blockstack.isSignInPending()) {\n    blockstack.handlePendingSignIn()\n    .then(userData => {\n        const profile = userData.profile\n    })\n}",
          "position": {
            "start": {
              "line": 243,
              "column": 1,
              "offset": 12717
            },
            "end": {
              "line": 253,
              "column": 4,
              "offset": 12916
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 4,
          "children": [
            {
              "type": "text",
              "value": "Manual flow",
              "position": {
                "start": {
                  "line": 255,
                  "column": 6,
                  "offset": 12923
                },
                "end": {
                  "line": 255,
                  "column": 17,
                  "offset": 12934
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 255,
              "column": 1,
              "offset": 12918
            },
            "end": {
              "line": 255,
              "column": 17,
              "offset": 12934
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Alternatively, you can manually generate your own transit private key and/or authentication request token. This gives you more control over the experience.",
              "position": {
                "start": {
                  "line": 257,
                  "column": 1,
                  "offset": 12936
                },
                "end": {
                  "line": 257,
                  "column": 156,
                  "offset": 13091
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 257,
              "column": 1,
              "offset": 12936
            },
            "end": {
              "line": 257,
              "column": 156,
              "offset": 13091
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "For example, you could use the following code to generate an authentication request on ",
              "position": {
                "start": {
                  "line": 259,
                  "column": 1,
                  "offset": 13093
                },
                "end": {
                  "line": 259,
                  "column": 88,
                  "offset": 13180
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "https://alice.example.com",
              "position": {
                "start": {
                  "line": 259,
                  "column": 88,
                  "offset": 13180
                },
                "end": {
                  "line": 259,
                  "column": 115,
                  "offset": 13207
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " or ",
              "position": {
                "start": {
                  "line": 259,
                  "column": 115,
                  "offset": 13207
                },
                "end": {
                  "line": 259,
                  "column": 119,
                  "offset": 13211
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "https://bob.example.com",
              "position": {
                "start": {
                  "line": 259,
                  "column": 119,
                  "offset": 13211
                },
                "end": {
                  "line": 259,
                  "column": 144,
                  "offset": 13236
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " for an app running on origin ",
              "position": {
                "start": {
                  "line": 259,
                  "column": 144,
                  "offset": 13236
                },
                "end": {
                  "line": 259,
                  "column": 174,
                  "offset": 13266
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "https://example.com",
              "position": {
                "start": {
                  "line": 259,
                  "column": 174,
                  "offset": 13266
                },
                "end": {
                  "line": 259,
                  "column": 195,
                  "offset": 13287
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ".",
              "position": {
                "start": {
                  "line": 259,
                  "column": 195,
                  "offset": 13287
                },
                "end": {
                  "line": 259,
                  "column": 196,
                  "offset": 13288
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 259,
              "column": 1,
              "offset": 13093
            },
            "end": {
              "line": 259,
              "column": 196,
              "offset": 13288
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "const transitPrivateKey = generateAndStoreTransitKey()\nconst redirectURI = 'https://example.com/authLandingPage'\nconst manifestURI = 'https://example.com/manifest.json'\nconst scopes = ['scope_write', 'publish_data']\nconst appDomain = 'https://example.com'\n\nconst authRequest = makeAuthRequest(transitPrivateKey, redirectURI, manifestURI, scopes, appDomain)\n\nredirectToSignInWithAuthRequest(authRequest)",
          "position": {
            "start": {
              "line": 261,
              "column": 1,
              "offset": 13290
            },
            "end": {
              "line": 272,
              "column": 4,
              "offset": 13703
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Authentication in client-server apps",
              "position": {
                "start": {
                  "line": 274,
                  "column": 5,
                  "offset": 13709
                },
                "end": {
                  "line": 274,
                  "column": 41,
                  "offset": 13745
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 274,
              "column": 1,
              "offset": 13705
            },
            "end": {
              "line": 274,
              "column": 41,
              "offset": 13745
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "emphasis",
              "children": [
                {
                  "type": "text",
                  "value": "Note: Client-server authentication requires using a library written in the language of your server app. There are private methods in blockstack.js that can be accomplish this on node.js server apps, but they are not currently part of our public, supported API.",
                  "position": {
                    "start": {
                      "line": 276,
                      "column": 2,
                      "offset": 13748
                    },
                    "end": {
                      "line": 276,
                      "column": 262,
                      "offset": 14008
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 276,
                  "column": 1,
                  "offset": 13747
                },
                "end": {
                  "line": 276,
                  "column": 263,
                  "offset": 14009
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 276,
              "column": 1,
              "offset": 13747
            },
            "end": {
              "line": 276,
              "column": 263,
              "offset": 14009
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Using Blockstack Authentication in client-server apps is very similar to client-side apps. You generate the authentication request using the same code in the client as described above.",
              "position": {
                "start": {
                  "line": 278,
                  "column": 1,
                  "offset": 14011
                },
                "end": {
                  "line": 278,
                  "column": 185,
                  "offset": 14195
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 278,
              "column": 1,
              "offset": 14011
            },
            "end": {
              "line": 278,
              "column": 185,
              "offset": 14195
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The main difference is that you need to verify the authentication response token on the server after the user approves sign in to your app.",
              "position": {
                "start": {
                  "line": 280,
                  "column": 1,
                  "offset": 14197
                },
                "end": {
                  "line": 280,
                  "column": 140,
                  "offset": 14336
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 280,
              "column": 1,
              "offset": 14197
            },
            "end": {
              "line": 280,
              "column": 140,
              "offset": 14336
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "For an example of how verification can be done server side, take a look at the ",
              "position": {
                "start": {
                  "line": 282,
                  "column": 1,
                  "offset": 14338
                },
                "end": {
                  "line": 282,
                  "column": 80,
                  "offset": 14417
                },
                "indent": []
              }
            },
            {
              "type": "link",
              "title": null,
              "url": "https://github.com/blockstack/blockstack-ruby#to-verify-an-auth-response",
              "children": [
                {
                  "type": "text",
                  "value": "blockstack-ruby",
                  "position": {
                    "start": {
                      "line": 282,
                      "column": 81,
                      "offset": 14418
                    },
                    "end": {
                      "line": 282,
                      "column": 96,
                      "offset": 14433
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 282,
                  "column": 80,
                  "offset": 14417
                },
                "end": {
                  "line": 282,
                  "column": 171,
                  "offset": 14508
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " library.",
              "position": {
                "start": {
                  "line": 282,
                  "column": 171,
                  "offset": 14508
                },
                "end": {
                  "line": 282,
                  "column": 180,
                  "offset": 14517
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 282,
              "column": 1,
              "offset": 14338
            },
            "end": {
              "line": 282,
              "column": 180,
              "offset": 14517
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 283,
          "column": 1,
          "offset": 14518
        }
      }
    },
    "path": [
      {
        "name": "Authentication",
        "kind": "note"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "Authentication"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Generates an authentication request and redirects the user to the Blockstack\nbrowser to approve the sign in request.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 40,
                  "offset": 116
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 40,
              "offset": 116
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Please note that this requires that the web browser properly handles the\n",
              "position": {
                "start": {
                  "line": 4,
                  "column": 1,
                  "offset": 118
                },
                "end": {
                  "line": 5,
                  "column": 1,
                  "offset": 191
                },
                "indent": [
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack:",
              "position": {
                "start": {
                  "line": 5,
                  "column": 1,
                  "offset": 191
                },
                "end": {
                  "line": 5,
                  "column": 14,
                  "offset": 204
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " URL protocol handler.",
              "position": {
                "start": {
                  "line": 5,
                  "column": 14,
                  "offset": 204
                },
                "end": {
                  "line": 5,
                  "column": 36,
                  "offset": 226
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 4,
              "column": 1,
              "offset": 118
            },
            "end": {
              "line": 5,
              "column": 36,
              "offset": 226
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Most applications should use this\nmethod for sign in unless they require more fine grained control over how the\nauthentication request is generated. If your app falls into this category,\nuse ",
              "position": {
                "start": {
                  "line": 7,
                  "column": 1,
                  "offset": 228
                },
                "end": {
                  "line": 10,
                  "column": 5,
                  "offset": 419
                },
                "indent": [
                  1,
                  1,
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "makeAuthRequest",
              "position": {
                "start": {
                  "line": 10,
                  "column": 5,
                  "offset": 419
                },
                "end": {
                  "line": 10,
                  "column": 22,
                  "offset": 436
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " and ",
              "position": {
                "start": {
                  "line": 10,
                  "column": 22,
                  "offset": 436
                },
                "end": {
                  "line": 10,
                  "column": 27,
                  "offset": 441
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "redirectToSignInWithAuthRequest",
              "position": {
                "start": {
                  "line": 10,
                  "column": 27,
                  "offset": 441
                },
                "end": {
                  "line": 10,
                  "column": 60,
                  "offset": 474
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " to build your own sign in process.",
              "position": {
                "start": {
                  "line": 10,
                  "column": 60,
                  "offset": 474
                },
                "end": {
                  "line": 10,
                  "column": 95,
                  "offset": 509
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 7,
              "column": 1,
              "offset": 228
            },
            "end": {
              "line": 10,
              "column": 95,
              "offset": 509
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 10,
          "column": 95,
          "offset": 509
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "The location to which the identity provider will redirect the user after\nthe user approves sign in.",
        "lineNumber": 12,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "redirectURI",
        "default": "`${window.location.origin}/`"
      },
      {
        "title": "param",
        "description": "Location of the manifest file.",
        "lineNumber": 15,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "manifestURI",
        "default": "`${window.location.origin}/manifest.json`"
      },
      {
        "title": "param",
        "description": "Defaults to requesting write access to\nthis app's data store.\nAn array of strings indicating which permissions this app is requesting.",
        "lineNumber": 17,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Array"
          }
        },
        "name": "scopes",
        "default": "DEFAULT_SCOPE"
      },
      {
        "title": "return",
        "description": null,
        "lineNumber": 20,
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 265,
        "column": 0
      },
      "end": {
        "line": 286,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 287,
          "column": 0
        },
        "end": {
          "line": 294,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "redirectURI",
        "lineNumber": 12,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The location to which the identity provider will redirect the user after\nthe user approves sign in.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 27,
                      "offset": 99
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 27,
                  "offset": 99
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 27,
              "offset": 99
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "`${window.location.origin}/`"
      },
      {
        "title": "param",
        "name": "manifestURI",
        "lineNumber": 15,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "Location of the manifest file.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 31,
                      "offset": 30
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 31,
                  "offset": 30
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 31,
              "offset": 30
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "`${window.location.origin}/manifest.json`"
      },
      {
        "title": "param",
        "name": "scopes",
        "lineNumber": 17,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "Defaults to requesting write access to\nthis app's data store.\nAn array of strings indicating which permissions this app is requesting.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 3,
                      "column": 73,
                      "offset": 134
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 73,
                  "offset": 134
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 3,
              "column": 73,
              "offset": 134
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Array"
        },
        "default": "DEFAULT_SCOPE"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 1,
              "offset": 0
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "redirectToSignIn",
    "kind": "function",
    "path": [
      {
        "name": "redirectToSignIn",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "redirectToSignIn"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Check if there is a authentication request that hasn't been handled.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 69,
                  "offset": 68
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 69,
              "offset": 68
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 69,
          "offset": 68
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "`true` if there is a pending sign in, otherwise `false`",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "Boolean"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 305,
        "column": 0
      },
      "end": {
        "line": 308,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 309,
          "column": 0
        },
        "end": {
          "line": 311,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "inlineCode",
                  "value": "true",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 7,
                      "offset": 6
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " if there is a pending sign in, otherwise ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 7,
                      "offset": 6
                    },
                    "end": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "false",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "end": {
                      "line": 1,
                      "column": 56,
                      "offset": 55
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 56,
                  "offset": 55
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 56,
              "offset": 55
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Boolean"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "isSignInPending",
    "kind": "function",
    "path": [
      {
        "name": "isSignInPending",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "isSignInPending"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Try to process any pending sign in request by returning a ",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 59,
                  "offset": 58
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "Promise",
              "position": {
                "start": {
                  "line": 1,
                  "column": 59,
                  "offset": 58
                },
                "end": {
                  "line": 1,
                  "column": 68,
                  "offset": 67
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " that resolves\nto the user data object if the sign in succeeds.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 68,
                  "offset": 67
                },
                "end": {
                  "line": 2,
                  "column": 49,
                  "offset": 130
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 49,
              "offset": 130
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 49,
          "offset": 130
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the endpoint against which to verify public\nkeys match claimed username",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "nameLookupURL"
      },
      {
        "title": "param",
        "description": "the signed authentication response token",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "authResponseToken"
      },
      {
        "title": "param",
        "description": "the transit private key that corresponds to the transit public key\nthat was provided in the authentication request",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "transitKey"
      },
      {
        "title": "return",
        "description": "that resolves to the user data object if successful and rejects\nif handling the sign in request fails or there was no pending sign in request.",
        "lineNumber": 9,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 314,
        "column": 0
      },
      "end": {
        "line": 325,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 326,
          "column": 0
        },
        "end": {
          "line": 433,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "nameLookupURL",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the endpoint against which to verify public\nkeys match claimed username",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 28,
                      "offset": 71
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 28,
                  "offset": 71
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 28,
              "offset": 71
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "''"
      },
      {
        "title": "param",
        "name": "authResponseToken",
        "lineNumber": 6,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the signed authentication response token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 41,
                  "offset": 40
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 41,
              "offset": 40
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "getAuthResponseToken()"
      },
      {
        "title": "param",
        "name": "transitKey",
        "lineNumber": 7,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the transit private key that corresponds to the transit public key\nthat was provided in the authentication request",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 48,
                      "offset": 114
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 48,
                  "offset": 114
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 48,
              "offset": 114
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "getTransitKey()"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to the user data object if successful and rejects\nif handling the sign in request fails or there was no pending sign in request.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 79,
                      "offset": 142
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 79,
                  "offset": 142
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 79,
              "offset": 142
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "handlePendingSignIn",
    "kind": "function",
    "path": [
      {
        "name": "handlePendingSignIn",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "handlePendingSignIn"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Retrieves the user data object. The user's profile is stored in the key ",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 73,
                  "offset": 72
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "profile",
              "position": {
                "start": {
                  "line": 1,
                  "column": 73,
                  "offset": 72
                },
                "end": {
                  "line": 1,
                  "column": 82,
                  "offset": 81
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": ".",
              "position": {
                "start": {
                  "line": 1,
                  "column": 82,
                  "offset": 81
                },
                "end": {
                  "line": 1,
                  "column": 83,
                  "offset": 82
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 83,
              "offset": 82
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 83,
          "offset": 82
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "User data object.",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 435,
        "column": 0
      },
      "end": {
        "line": 438,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 439,
          "column": 0
        },
        "end": {
          "line": 441,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "User data object.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 18,
                      "offset": 17
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 18,
                  "offset": 17
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 18,
              "offset": 17
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "loadUserData",
    "kind": "function",
    "path": [
      {
        "name": "loadUserData",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "loadUserData"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Check if a user is currently signed in.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 40,
                  "offset": 39
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 40,
              "offset": 39
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 40,
          "offset": 39
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "`true` if the user is signed in, `false` if not.",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "Boolean"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 53,
        "column": 0
      },
      "end": {
        "line": 56,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 57,
          "column": 0
        },
        "end": {
          "line": 59,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "inlineCode",
                  "value": "true",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 7,
                      "offset": 6
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " if the user is signed in, ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 7,
                      "offset": 6
                    },
                    "end": {
                      "line": 1,
                      "column": 34,
                      "offset": 33
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "false",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 34,
                      "offset": 33
                    },
                    "end": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " if not.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "end": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 49,
                  "offset": 48
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 49,
              "offset": 48
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Boolean"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "isUserSignedIn",
    "kind": "function",
    "path": [
      {
        "name": "isUserSignedIn",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "isUserSignedIn"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Sign the user out and optionally redirect to given location.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 61,
                  "offset": 60
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 61,
              "offset": 60
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 61,
          "offset": 60
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "Location to redirect user to after sign out.",
        "lineNumber": 2,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "redirectURL",
        "default": "null"
      },
      {
        "title": "return",
        "description": null,
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 443,
        "column": 0
      },
      "end": {
        "line": 447,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 448,
          "column": 0
        },
        "end": {
          "line": 455,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "redirectURL",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "Location to redirect user to after sign out.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 45,
                      "offset": 44
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 45,
                  "offset": 44
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 45,
              "offset": 44
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "null"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 1,
              "offset": 0
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "signUserOut",
    "kind": "function",
    "path": [
      {
        "name": "signUserOut",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "signUserOut"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Generates an authentication request that can be sent to the Blockstack\nbrowser for the user to approve sign in. This authentication request can\nthen be used for sign in by passing it to the ",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 47,
                  "offset": 190
                },
                "indent": [
                  1,
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "redirectToSignInWithAuthRequest",
              "position": {
                "start": {
                  "line": 3,
                  "column": 47,
                  "offset": 190
                },
                "end": {
                  "line": 3,
                  "column": 80,
                  "offset": 223
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": "\nmethod.",
              "position": {
                "start": {
                  "line": 3,
                  "column": 80,
                  "offset": 223
                },
                "end": {
                  "line": 4,
                  "column": 8,
                  "offset": 231
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 4,
              "column": 8,
              "offset": 231
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "emphasis",
              "children": [
                {
                  "type": "text",
                  "value": "Note: This method should only be used if you want to roll your own authentication\nflow. Typically you'd use ",
                  "position": {
                    "start": {
                      "line": 6,
                      "column": 2,
                      "offset": 234
                    },
                    "end": {
                      "line": 7,
                      "column": 27,
                      "offset": 342
                    },
                    "indent": [
                      1
                    ]
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "redirectToSignIn",
                  "position": {
                    "start": {
                      "line": 7,
                      "column": 27,
                      "offset": 342
                    },
                    "end": {
                      "line": 7,
                      "column": 45,
                      "offset": 360
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " which takes care of this\nunder the hood.",
                  "position": {
                    "start": {
                      "line": 7,
                      "column": 45,
                      "offset": 360
                    },
                    "end": {
                      "line": 8,
                      "column": 16,
                      "offset": 401
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 6,
                  "column": 1,
                  "offset": 233
                },
                "end": {
                  "line": 8,
                  "column": 17,
                  "offset": 402
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 6,
              "column": 1,
              "offset": 233
            },
            "end": {
              "line": 8,
              "column": 17,
              "offset": 402
            },
            "indent": [
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 8,
          "column": 17,
          "offset": 402
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "hex encoded transit\n  private key",
        "lineNumber": 10,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "transitPrivateKey",
        "default": "generateAndStoreTransitKey()"
      },
      {
        "title": "param",
        "description": "location to redirect user to after sign in approval",
        "lineNumber": 12,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "redirectURI"
      },
      {
        "title": "param",
        "description": "location of this app's manifest file",
        "lineNumber": 13,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "manifestURI"
      },
      {
        "title": "param",
        "description": "the permissions this app is requesting",
        "lineNumber": 14,
        "type": {
          "type": "TypeApplication",
          "expression": {
            "type": "NameExpression",
            "name": "Array"
          },
          "applications": [
            {
              "type": "NameExpression",
              "name": "String"
            }
          ]
        },
        "name": "scopes"
      },
      {
        "title": "param",
        "description": "the origin of this app",
        "lineNumber": 15,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "appDomain"
      },
      {
        "title": "param",
        "description": "the time at which this request is no longer valid",
        "lineNumber": 16,
        "type": {
          "type": "NameExpression",
          "name": "Number"
        },
        "name": "expiresAt"
      },
      {
        "title": "param",
        "description": "Any extra parameters you'd like to pass to the authenticator.\nUse this to pass options that aren't part of the Blockstack auth spec, but might be supported\nby special authenticators.",
        "lineNumber": 17,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "name": "extraParams"
      },
      {
        "title": "return",
        "description": "the authentication request",
        "lineNumber": 20,
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 29,
        "column": 0
      },
      "end": {
        "line": 50,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 51,
          "column": 0
        },
        "end": {
          "line": 87,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authMessages.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "transitPrivateKey",
        "lineNumber": 10,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "hex encoded transit\n  private key",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 14,
                      "offset": 33
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 14,
                  "offset": 33
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 14,
              "offset": 33
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "generateAndStoreTransitKey()"
      },
      {
        "title": "param",
        "name": "redirectURI",
        "lineNumber": 12,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "location to redirect user to after sign in approval",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 52,
                      "offset": 51
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 52,
                  "offset": 51
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 52,
              "offset": 51
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "`${window.location.origin}/`"
      },
      {
        "title": "param",
        "name": "manifestURI",
        "lineNumber": 13,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "location of this app's manifest file",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 37,
                      "offset": 36
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 37,
                  "offset": 36
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 37,
              "offset": 36
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "`${window.location.origin}/manifest.json`"
      },
      {
        "title": "param",
        "name": "scopes",
        "lineNumber": 14,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the permissions this app is requesting",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 39,
                      "offset": 38
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 39,
                  "offset": 38
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 39,
              "offset": 38
            }
          }
        },
        "type": {
          "type": "TypeApplication",
          "expression": {
            "type": "NameExpression",
            "name": "Array"
          },
          "applications": [
            {
              "type": "NameExpression",
              "name": "String"
            }
          ]
        },
        "default": "DEFAULT_SCOPE"
      },
      {
        "title": "param",
        "name": "appDomain",
        "lineNumber": 15,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the origin of this app",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 23,
                      "offset": 22
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 23,
                  "offset": 22
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 23,
              "offset": 22
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "window.location.origin"
      },
      {
        "title": "param",
        "name": "expiresAt",
        "lineNumber": 16,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the time at which this request is no longer valid",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 50,
                      "offset": 49
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 50,
                  "offset": 49
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 50,
              "offset": 49
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Number"
        },
        "default": "nextHour().getTime()"
      },
      {
        "title": "param",
        "name": "extraParams",
        "lineNumber": 17,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "Any extra parameters you'd like to pass to the authenticator.\nUse this to pass options that aren't part of the Blockstack auth spec, but might be supported\nby special authenticators.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 3,
                      "column": 27,
                      "offset": 182
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 27,
                  "offset": 182
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 3,
              "column": 27,
              "offset": 182
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "{}"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the authentication request",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 27,
                      "offset": 26
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 27,
                  "offset": 26
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 27,
              "offset": 26
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "makeAuthRequest",
    "kind": "function",
    "path": [
      {
        "name": "makeAuthRequest",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "makeAuthRequest"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Generates a ECDSA keypair to\nuse as the ephemeral app transit private key\nand stores the hex value of the private key in\nlocal storage.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 4,
                  "column": 15,
                  "offset": 135
                },
                "indent": [
                  1,
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 4,
              "column": 15,
              "offset": 135
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 4,
          "column": 15,
          "offset": 135
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "the hex encoded private key",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 40,
        "column": 0
      },
      "end": {
        "line": 46,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 47,
          "column": 0
        },
        "end": {
          "line": 51,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the hex encoded private key",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 28,
                      "offset": 27
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 28,
                  "offset": 27
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 28,
              "offset": 27
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "generateAndStoreTransitKey",
    "kind": "function",
    "path": [
      {
        "name": "generateAndStoreTransitKey",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "generateAndStoreTransitKey"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Redirects the user to the Blockstack browser to approve the sign in request\ngiven.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 7,
                  "offset": 82
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 7,
              "offset": 82
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The user is redirected to the ",
              "position": {
                "start": {
                  "line": 4,
                  "column": 1,
                  "offset": 84
                },
                "end": {
                  "line": 4,
                  "column": 31,
                  "offset": 114
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstackIDHost",
              "position": {
                "start": {
                  "line": 4,
                  "column": 31,
                  "offset": 114
                },
                "end": {
                  "line": 4,
                  "column": 49,
                  "offset": 132
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " if the ",
              "position": {
                "start": {
                  "line": 4,
                  "column": 49,
                  "offset": 132
                },
                "end": {
                  "line": 4,
                  "column": 57,
                  "offset": 140
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "blockstack:",
              "position": {
                "start": {
                  "line": 4,
                  "column": 57,
                  "offset": 140
                },
                "end": {
                  "line": 4,
                  "column": 70,
                  "offset": 153
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": "\nprotocol handler is not detected. Please note that the protocol handler detection\ndoes not work on all browsers.",
              "position": {
                "start": {
                  "line": 4,
                  "column": 70,
                  "offset": 153
                },
                "end": {
                  "line": 6,
                  "column": 31,
                  "offset": 266
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 4,
              "column": 1,
              "offset": 84
            },
            "end": {
              "line": 6,
              "column": 31,
              "offset": 266
            },
            "indent": [
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 6,
          "column": 31,
          "offset": 266
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the authentication request generated by `makeAuthRequest`",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "authRequest"
      },
      {
        "title": "param",
        "description": "the URL to redirect the user to if the blockstack\n                                    protocol handler is not detected",
        "lineNumber": 8,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "blockstackIDHost"
      },
      {
        "title": "return",
        "description": null,
        "lineNumber": 10,
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 228,
        "column": 0
      },
      "end": {
        "line": 239,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 240,
          "column": 0
        },
        "end": {
          "line": 263,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "authRequest",
        "lineNumber": 7,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the authentication request generated by ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "makeAuthRequest",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "end": {
                      "line": 1,
                      "column": 58,
                      "offset": 57
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 58,
                  "offset": 57
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 58,
              "offset": 57
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "makeAuthRequest()"
      },
      {
        "title": "param",
        "name": "blockstackIDHost",
        "lineNumber": 8,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the URL to redirect the user to if the blockstack\n                                    protocol handler is not detected",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 69,
                      "offset": 118
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 69,
                  "offset": 118
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 69,
              "offset": 118
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "DEFAULT_BLOCKSTACK_HOST"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 1,
              "offset": 0
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "redirectToSignInWithAuthRequest",
    "kind": "function",
    "path": [
      {
        "name": "redirectToSignInWithAuthRequest",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "redirectToSignInWithAuthRequest"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Retrieve the authentication token from the URL query",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 53,
                  "offset": 52
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 53,
              "offset": 52
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 53,
          "offset": 52
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "the authentication token if it exists otherwise `null`",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 296,
        "column": 0
      },
      "end": {
        "line": 299,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 300,
          "column": 0
        },
        "end": {
          "line": 303,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the authentication token if it exists otherwise ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "null",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "end": {
                      "line": 1,
                      "column": 55,
                      "offset": 54
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 55,
                  "offset": 54
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 55,
              "offset": 54
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAuthResponseToken",
    "kind": "function",
    "path": [
      {
        "name": "getAuthResponseToken",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "getAuthResponseToken"
  },
  {
    "name": "Profiles",
    "kind": "note",
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Follow these steps to create and register a profile for a Blockchain ID:",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 73,
                  "offset": 72
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 73,
              "offset": 72
            },
            "indent": []
          }
        },
        {
          "type": "list",
          "ordered": true,
          "start": 1,
          "loose": false,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Create a JSON profile object",
                      "position": {
                        "start": {
                          "line": 3,
                          "column": 4,
                          "offset": 77
                        },
                        "end": {
                          "line": 3,
                          "column": 32,
                          "offset": 105
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 3,
                      "column": 4,
                      "offset": 77
                    },
                    "end": {
                      "line": 3,
                      "column": 32,
                      "offset": 105
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 3,
                  "column": 1,
                  "offset": 74
                },
                "end": {
                  "line": 3,
                  "column": 32,
                  "offset": 105
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Split up the profile into tokens, sign the tokens, and put them in a token file",
                      "position": {
                        "start": {
                          "line": 4,
                          "column": 4,
                          "offset": 109
                        },
                        "end": {
                          "line": 4,
                          "column": 83,
                          "offset": 188
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 4,
                      "column": 4,
                      "offset": 109
                    },
                    "end": {
                      "line": 4,
                      "column": 83,
                      "offset": 188
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 4,
                  "column": 1,
                  "offset": 106
                },
                "end": {
                  "line": 4,
                  "column": 83,
                  "offset": 188
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Create a zone file that points to the web location of the profile token file",
                      "position": {
                        "start": {
                          "line": 5,
                          "column": 4,
                          "offset": 192
                        },
                        "end": {
                          "line": 5,
                          "column": 80,
                          "offset": 268
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 5,
                      "column": 4,
                      "offset": 192
                    },
                    "end": {
                      "line": 5,
                      "column": 80,
                      "offset": 268
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 5,
                  "column": 1,
                  "offset": 189
                },
                "end": {
                  "line": 5,
                  "column": 80,
                  "offset": 268
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 3,
              "column": 1,
              "offset": 74
            },
            "end": {
              "line": 5,
              "column": 80,
              "offset": 268
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Create a profile",
              "position": {
                "start": {
                  "line": 7,
                  "column": 5,
                  "offset": 274
                },
                "end": {
                  "line": 7,
                  "column": 21,
                  "offset": 290
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 7,
              "column": 1,
              "offset": 270
            },
            "end": {
              "line": 7,
              "column": 21,
              "offset": 290
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "es6",
          "value": "const profileOfNaval = {\n  \"@context\": \"http://schema.org/\",\n  \"@type\": \"Person\",\n  \"name\": \"Naval Ravikant\",\n  \"description\": \"Co-founder of AngelList\"\n}",
          "position": {
            "start": {
              "line": 9,
              "column": 1,
              "offset": 292
            },
            "end": {
              "line": 16,
              "column": 4,
              "offset": 457
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Sign a profile as a single token",
              "position": {
                "start": {
                  "line": 18,
                  "column": 5,
                  "offset": 463
                },
                "end": {
                  "line": 18,
                  "column": 37,
                  "offset": 495
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 18,
              "column": 1,
              "offset": 459
            },
            "end": {
              "line": 18,
              "column": 37,
              "offset": 495
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "es6",
          "value": "import { makeECPrivateKey, wrapProfileToken, Person } from 'blockstack'\n\nconst privateKey = makeECPrivateKey()\n\nconst person = new Person(profileOfNaval)\nconst token = person.toToken(privateKey)\nconst tokenFile = [wrapProfileToken(token)]",
          "position": {
            "start": {
              "line": 20,
              "column": 1,
              "offset": 497
            },
            "end": {
              "line": 28,
              "column": 4,
              "offset": 746
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Verify an individual token",
              "position": {
                "start": {
                  "line": 30,
                  "column": 5,
                  "offset": 752
                },
                "end": {
                  "line": 30,
                  "column": 31,
                  "offset": 778
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 30,
              "column": 1,
              "offset": 748
            },
            "end": {
              "line": 30,
              "column": 31,
              "offset": 778
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "import { verifyProfileToken } from 'blockstack'\n\ntry {\n  const decodedToken = verifyProfileToken(tokenFile[0].token, publicKey)\n} catch(e) {\n  console.log(e)\n}",
          "position": {
            "start": {
              "line": 32,
              "column": 1,
              "offset": 780
            },
            "end": {
              "line": 40,
              "column": 4,
              "offset": 949
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Recover a profile from a token file",
              "position": {
                "start": {
                  "line": 42,
                  "column": 5,
                  "offset": 955
                },
                "end": {
                  "line": 42,
                  "column": 40,
                  "offset": 990
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 42,
              "column": 1,
              "offset": 951
            },
            "end": {
              "line": 42,
              "column": 40,
              "offset": 990
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "const recoveredProfile = Person.fromToken(tokenFile, publicKey)",
          "position": {
            "start": {
              "line": 44,
              "column": 1,
              "offset": 992
            },
            "end": {
              "line": 46,
              "column": 4,
              "offset": 1065
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Validate profile schema",
              "position": {
                "start": {
                  "line": 48,
                  "column": 5,
                  "offset": 1071
                },
                "end": {
                  "line": 48,
                  "column": 28,
                  "offset": 1094
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 48,
              "column": 1,
              "offset": 1067
            },
            "end": {
              "line": 48,
              "column": 28,
              "offset": 1094
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "const validationResults = Person.validateSchema(recoveredProfile)",
          "position": {
            "start": {
              "line": 50,
              "column": 1,
              "offset": 1096
            },
            "end": {
              "line": 52,
              "column": 4,
              "offset": 1171
            },
            "indent": [
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Where profile data is stored",
              "position": {
                "start": {
                  "line": 54,
                  "column": 5,
                  "offset": 1177
                },
                "end": {
                  "line": 54,
                  "column": 33,
                  "offset": 1205
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 54,
              "column": 1,
              "offset": 1173
            },
            "end": {
              "line": 54,
              "column": 33,
              "offset": 1205
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Profile data is stored using Gaia on the user's selected storage provider.",
              "position": {
                "start": {
                  "line": 56,
                  "column": 1,
                  "offset": 1207
                },
                "end": {
                  "line": 56,
                  "column": 75,
                  "offset": 1281
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 56,
              "column": 1,
              "offset": 1207
            },
            "end": {
              "line": 56,
              "column": 75,
              "offset": 1281
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "An example of a profile.json file URL using Blockstack provided storage:\n",
              "position": {
                "start": {
                  "line": 58,
                  "column": 1,
                  "offset": 1283
                },
                "end": {
                  "line": 59,
                  "column": 1,
                  "offset": 1356
                },
                "indent": [
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "https://gaia.blockstack.org/hub/1EeZtGNdFrVB2AgLFsZbyBCF7UTZcEWhHk/profile.json",
              "position": {
                "start": {
                  "line": 59,
                  "column": 1,
                  "offset": 1356
                },
                "end": {
                  "line": 59,
                  "column": 82,
                  "offset": 1437
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 58,
              "column": 1,
              "offset": 1283
            },
            "end": {
              "line": 59,
              "column": 82,
              "offset": 1437
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Validate a proof",
              "position": {
                "start": {
                  "line": 62,
                  "column": 5,
                  "offset": 1444
                },
                "end": {
                  "line": 62,
                  "column": 21,
                  "offset": 1460
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 62,
              "column": 1,
              "offset": 1440
            },
            "end": {
              "line": 62,
              "column": 21,
              "offset": 1460
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "es6",
          "value": "import { validateProofs } from 'blockstack'\n\nconst domainName = \"naval.id\"\nvalidateProofs(profile, domainName).then((proofs) => {\n  console.log(proofs)\n})",
          "position": {
            "start": {
              "line": 64,
              "column": 1,
              "offset": 1462
            },
            "end": {
              "line": 71,
              "column": 4,
              "offset": 1627
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "How proofs are validated",
              "position": {
                "start": {
                  "line": 73,
                  "column": 5,
                  "offset": 1633
                },
                "end": {
                  "line": 73,
                  "column": 29,
                  "offset": 1657
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 73,
              "column": 1,
              "offset": 1629
            },
            "end": {
              "line": 73,
              "column": 29,
              "offset": 1657
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The ",
              "position": {
                "start": {
                  "line": 74,
                  "column": 1,
                  "offset": 1658
                },
                "end": {
                  "line": 74,
                  "column": 5,
                  "offset": 1662
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "validateProofs",
              "position": {
                "start": {
                  "line": 74,
                  "column": 5,
                  "offset": 1662
                },
                "end": {
                  "line": 74,
                  "column": 21,
                  "offset": 1678
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " function checks each of the proofs listed in the\nprofile by fetching the proof URL and verifying the proof message.",
              "position": {
                "start": {
                  "line": 74,
                  "column": 21,
                  "offset": 1678
                },
                "end": {
                  "line": 75,
                  "column": 67,
                  "offset": 1794
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 74,
              "column": 1,
              "offset": 1658
            },
            "end": {
              "line": 75,
              "column": 67,
              "offset": 1794
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The proof message must be of the form:",
              "position": {
                "start": {
                  "line": 77,
                  "column": 1,
                  "offset": 1796
                },
                "end": {
                  "line": 77,
                  "column": 39,
                  "offset": 1834
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 77,
              "column": 1,
              "offset": 1796
            },
            "end": {
              "line": 77,
              "column": 39,
              "offset": 1834
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": null,
          "value": "Verifying my Blockstack ID is secured with the address\n1EeZtGNdFrVB2AgLFsZbyBCF7UTZcEWhHk",
          "position": {
            "start": {
              "line": 78,
              "column": 1,
              "offset": 1835
            },
            "end": {
              "line": 81,
              "column": 4,
              "offset": 1932
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The proof message also must appear in the required location on the\nproof page specific to each type of social media account.",
              "position": {
                "start": {
                  "line": 83,
                  "column": 1,
                  "offset": 1934
                },
                "end": {
                  "line": 84,
                  "column": 58,
                  "offset": 2058
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 83,
              "column": 1,
              "offset": 1934
            },
            "end": {
              "line": 84,
              "column": 58,
              "offset": 2058
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The account from which the proof message is posted must match exactly\nthe account identifier/username claimed in the user profile. The\n",
              "position": {
                "start": {
                  "line": 86,
                  "column": 1,
                  "offset": 2060
                },
                "end": {
                  "line": 88,
                  "column": 1,
                  "offset": 2195
                },
                "indent": [
                  1,
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "validateProofs",
              "position": {
                "start": {
                  "line": 88,
                  "column": 1,
                  "offset": 2195
                },
                "end": {
                  "line": 88,
                  "column": 17,
                  "offset": 2211
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " function will check this in the body of the proof or\nin the proof URL depending on the service.",
              "position": {
                "start": {
                  "line": 88,
                  "column": 17,
                  "offset": 2211
                },
                "end": {
                  "line": 89,
                  "column": 43,
                  "offset": 2307
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 86,
              "column": 1,
              "offset": 2060
            },
            "end": {
              "line": 89,
              "column": 43,
              "offset": 2307
            },
            "indent": [
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Adding additional social account validation services",
              "position": {
                "start": {
                  "line": 91,
                  "column": 5,
                  "offset": 2313
                },
                "end": {
                  "line": 91,
                  "column": 57,
                  "offset": 2365
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 91,
              "column": 1,
              "offset": 2309
            },
            "end": {
              "line": 91,
              "column": 57,
              "offset": 2365
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The ",
              "position": {
                "start": {
                  "line": 92,
                  "column": 1,
                  "offset": 2366
                },
                "end": {
                  "line": 92,
                  "column": 5,
                  "offset": 2370
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "Service",
              "position": {
                "start": {
                  "line": 92,
                  "column": 5,
                  "offset": 2370
                },
                "end": {
                  "line": 92,
                  "column": 14,
                  "offset": 2379
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " class can be extended to provide proof validation service\nto additional social account types. You will need to override the\n",
              "position": {
                "start": {
                  "line": 92,
                  "column": 14,
                  "offset": 2379
                },
                "end": {
                  "line": 94,
                  "column": 1,
                  "offset": 2504
                },
                "indent": [
                  1,
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "getProofStatement(searchText: string)",
              "position": {
                "start": {
                  "line": 94,
                  "column": 1,
                  "offset": 2504
                },
                "end": {
                  "line": 94,
                  "column": 40,
                  "offset": 2543
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " method which parses the proof\nbody and returns the proof message text. Additionally, the identifier\nclaimed should be verified in the proof URL or in the body by implementing\n",
              "position": {
                "start": {
                  "line": 94,
                  "column": 40,
                  "offset": 2543
                },
                "end": {
                  "line": 97,
                  "column": 1,
                  "offset": 2719
                },
                "indent": [
                  1,
                  1,
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "getProofIdentity(searchText: string)",
              "position": {
                "start": {
                  "line": 97,
                  "column": 1,
                  "offset": 2719
                },
                "end": {
                  "line": 97,
                  "column": 39,
                  "offset": 2757
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " and setting ",
              "position": {
                "start": {
                  "line": 97,
                  "column": 39,
                  "offset": 2757
                },
                "end": {
                  "line": 97,
                  "column": 52,
                  "offset": 2770
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "shouldValidateIdentityInBody()",
              "position": {
                "start": {
                  "line": 97,
                  "column": 52,
                  "offset": 2770
                },
                "end": {
                  "line": 97,
                  "column": 84,
                  "offset": 2802
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": "\nto return true.",
              "position": {
                "start": {
                  "line": 97,
                  "column": 84,
                  "offset": 2802
                },
                "end": {
                  "line": 98,
                  "column": 16,
                  "offset": 2818
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 92,
              "column": 1,
              "offset": 2366
            },
            "end": {
              "line": 98,
              "column": 16,
              "offset": 2818
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "The following snippet uses the meta tags in the proof page to retrieve the proof message.",
              "position": {
                "start": {
                  "line": 100,
                  "column": 1,
                  "offset": 2820
                },
                "end": {
                  "line": 100,
                  "column": 90,
                  "offset": 2909
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 100,
              "column": 1,
              "offset": 2820
            },
            "end": {
              "line": 100,
              "column": 90,
              "offset": 2909
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "static getProofStatement(searchText: string) {\n\tconst $ = cheerio.load(searchText)\n\tconst statement = $('meta[property=\"og:description\"]')\n\t                    .attr('content')\n\n\tif (statement !== undefined && statement.split(':').length > 1) {\n\t  return statement.split(':')[1].trim().replace('“', '').replace('”', '')\n\t} else {\n\t  return ''\n\t}\n}",
          "position": {
            "start": {
              "line": 101,
              "column": 1,
              "offset": 2910
            },
            "end": {
              "line": 113,
              "column": 4,
              "offset": 3267
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Currently supported proof validation services",
              "position": {
                "start": {
                  "line": 115,
                  "column": 5,
                  "offset": 3273
                },
                "end": {
                  "line": 115,
                  "column": 50,
                  "offset": 3318
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 115,
              "column": 1,
              "offset": 3269
            },
            "end": {
              "line": 115,
              "column": 50,
              "offset": 3318
            },
            "indent": []
          }
        },
        {
          "type": "list",
          "ordered": false,
          "start": null,
          "loose": false,
          "children": [
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Facebook",
                      "position": {
                        "start": {
                          "line": 116,
                          "column": 3,
                          "offset": 3321
                        },
                        "end": {
                          "line": 116,
                          "column": 11,
                          "offset": 3329
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 116,
                      "column": 3,
                      "offset": 3321
                    },
                    "end": {
                      "line": 116,
                      "column": 11,
                      "offset": 3329
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 116,
                  "column": 1,
                  "offset": 3319
                },
                "end": {
                  "line": 116,
                  "column": 11,
                  "offset": 3329
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Twitter",
                      "position": {
                        "start": {
                          "line": 117,
                          "column": 3,
                          "offset": 3332
                        },
                        "end": {
                          "line": 117,
                          "column": 10,
                          "offset": 3339
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 117,
                      "column": 3,
                      "offset": 3332
                    },
                    "end": {
                      "line": 117,
                      "column": 10,
                      "offset": 3339
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 117,
                  "column": 1,
                  "offset": 3330
                },
                "end": {
                  "line": 117,
                  "column": 10,
                  "offset": 3339
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Instagram",
                      "position": {
                        "start": {
                          "line": 118,
                          "column": 3,
                          "offset": 3342
                        },
                        "end": {
                          "line": 118,
                          "column": 12,
                          "offset": 3351
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 118,
                      "column": 3,
                      "offset": 3342
                    },
                    "end": {
                      "line": 118,
                      "column": 12,
                      "offset": 3351
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 118,
                  "column": 1,
                  "offset": 3340
                },
                "end": {
                  "line": 118,
                  "column": 12,
                  "offset": 3351
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "LinkedIn",
                      "position": {
                        "start": {
                          "line": 119,
                          "column": 3,
                          "offset": 3354
                        },
                        "end": {
                          "line": 119,
                          "column": 11,
                          "offset": 3362
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 119,
                      "column": 3,
                      "offset": 3354
                    },
                    "end": {
                      "line": 119,
                      "column": 11,
                      "offset": 3362
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 119,
                  "column": 1,
                  "offset": 3352
                },
                "end": {
                  "line": 119,
                  "column": 11,
                  "offset": 3362
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Hacker News",
                      "position": {
                        "start": {
                          "line": 120,
                          "column": 3,
                          "offset": 3365
                        },
                        "end": {
                          "line": 120,
                          "column": 14,
                          "offset": 3376
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 120,
                      "column": 3,
                      "offset": 3365
                    },
                    "end": {
                      "line": 120,
                      "column": 14,
                      "offset": 3376
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 120,
                  "column": 1,
                  "offset": 3363
                },
                "end": {
                  "line": 120,
                  "column": 14,
                  "offset": 3376
                },
                "indent": []
              }
            },
            {
              "type": "listItem",
              "loose": false,
              "checked": null,
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "GitHub",
                      "position": {
                        "start": {
                          "line": 121,
                          "column": 3,
                          "offset": 3379
                        },
                        "end": {
                          "line": 121,
                          "column": 9,
                          "offset": 3385
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 121,
                      "column": 3,
                      "offset": 3379
                    },
                    "end": {
                      "line": 121,
                      "column": 9,
                      "offset": 3385
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 121,
                  "column": 1,
                  "offset": 3377
                },
                "end": {
                  "line": 121,
                  "column": 9,
                  "offset": 3385
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 116,
              "column": 1,
              "offset": 3319
            },
            "end": {
              "line": 121,
              "column": 9,
              "offset": 3385
            },
            "indent": [
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 3,
          "children": [
            {
              "type": "text",
              "value": "Profile proof schema",
              "position": {
                "start": {
                  "line": 123,
                  "column": 5,
                  "offset": 3391
                },
                "end": {
                  "line": 123,
                  "column": 25,
                  "offset": 3411
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 123,
              "column": 1,
              "offset": 3387
            },
            "end": {
              "line": 123,
              "column": 25,
              "offset": 3411
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Proofs are stored under the ",
              "position": {
                "start": {
                  "line": 124,
                  "column": 1,
                  "offset": 3412
                },
                "end": {
                  "line": 124,
                  "column": 29,
                  "offset": 3440
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "account",
              "position": {
                "start": {
                  "line": 124,
                  "column": 29,
                  "offset": 3440
                },
                "end": {
                  "line": 124,
                  "column": 38,
                  "offset": 3449
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " key in the user's profile data",
              "position": {
                "start": {
                  "line": 124,
                  "column": 38,
                  "offset": 3449
                },
                "end": {
                  "line": 124,
                  "column": 69,
                  "offset": 3480
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 124,
              "column": 1,
              "offset": 3412
            },
            "end": {
              "line": 124,
              "column": 69,
              "offset": 3480
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "js",
          "value": "\"account\": [\n\t{\n\t  \"@type\": \"Account\",\n\t  \"service\": \"twitter\",\n\t  \"identifier\": \"naval\",\n\t  \"proofType\": \"http\",\n\t  \"proofUrl\": \"https://twitter.com/naval/status/12345678901234567890\"\n\t}\n]",
          "position": {
            "start": {
              "line": 125,
              "column": 1,
              "offset": 3481
            },
            "end": {
              "line": 135,
              "column": 4,
              "offset": 3680
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 136,
          "column": 1,
          "offset": 3681
        }
      }
    },
    "path": [
      {
        "name": "Profiles",
        "kind": "note"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "Profiles"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Extracts a profile from an encoded token and optionally verifies it,\nif ",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 4,
                  "offset": 72
                },
                "indent": [
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "publicKeyOrAddress",
              "position": {
                "start": {
                  "line": 2,
                  "column": 4,
                  "offset": 72
                },
                "end": {
                  "line": 2,
                  "column": 24,
                  "offset": 92
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " is provided.",
              "position": {
                "start": {
                  "line": 2,
                  "column": 24,
                  "offset": 92
                },
                "end": {
                  "line": 2,
                  "column": 37,
                  "offset": 105
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 37,
              "offset": 105
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 37,
          "offset": 105
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the token to be extracted",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "token"
      },
      {
        "title": "param",
        "description": "the public key or address of the\n  keypair that is thought to have signed the token",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "publicKeyOrAddress"
      },
      {
        "title": "returns",
        "description": "the profile extracted from the encoded token",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      },
      {
        "title": "throws",
        "description": "if the token isn't signed by the provided `publicKeyOrAddress`",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "Error"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 132,
        "column": 0
      },
      "end": {
        "line": 140,
        "column": 4
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 141,
          "column": 0
        },
        "end": {
          "line": 158,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileTokens.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "token",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the token to be extracted",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 26,
                      "offset": 25
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 26,
                  "offset": 25
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 26,
              "offset": 25
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "publicKeyOrAddress",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the public key or address of the\n  keypair that is thought to have signed the token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 51,
                      "offset": 83
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 51,
                  "offset": 83
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 51,
              "offset": 83
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "null"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the profile extracted from the encoded token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 45,
                      "offset": 44
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 45,
                  "offset": 44
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 45,
              "offset": 44
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "sees": [],
    "throws": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "if the token isn't signed by the provided ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 43,
                      "offset": 42
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "publicKeyOrAddress",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 43,
                      "offset": 42
                    },
                    "end": {
                      "line": 1,
                      "column": 63,
                      "offset": 62
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 63,
                  "offset": 62
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 63,
              "offset": 62
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Error"
        }
      }
    ],
    "todos": [],
    "name": "extractProfile",
    "kind": "function",
    "path": [
      {
        "name": "extractProfile",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "extractProfile"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Wraps a token for a profile token file",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 39,
                  "offset": 38
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 39,
              "offset": 38
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 39,
          "offset": 38
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the token to be wrapped",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "token"
      },
      {
        "title": "returns",
        "description": "including `token` and `decodedToken`",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 54,
        "column": 0
      },
      "end": {
        "line": 58,
        "column": 4
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 59,
          "column": 0
        },
        "end": {
          "line": 64,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileTokens.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "token",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the token to be wrapped",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 24,
                      "offset": 23
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 24,
                  "offset": 23
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 24,
              "offset": 23
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "including ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 11,
                      "offset": 10
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 11,
                      "offset": 10
                    },
                    "end": {
                      "line": 1,
                      "column": 18,
                      "offset": 17
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " and ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 18,
                      "offset": 17
                    },
                    "end": {
                      "line": 1,
                      "column": 23,
                      "offset": 22
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "decodedToken",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 23,
                      "offset": 22
                    },
                    "end": {
                      "line": 1,
                      "column": 37,
                      "offset": 36
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 37,
                  "offset": 36
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 37,
              "offset": 36
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "wrapProfileToken",
    "kind": "function",
    "path": [
      {
        "name": "wrapProfileToken",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "wrapProfileToken"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Signs a profile token",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 22,
                  "offset": 21
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 22,
              "offset": 21
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 22,
          "offset": 21
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the JSON of the profile to be signed",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "name": "profile"
      },
      {
        "title": "param",
        "description": "the signing private key",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "privateKey"
      },
      {
        "title": "param",
        "description": "the entity that the information is about",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "name": "subject"
      },
      {
        "title": "param",
        "description": "the entity that is issuing the token",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "name": "issuer"
      },
      {
        "title": "param",
        "description": "the signing algorithm to use",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "signingAlgorithm"
      },
      {
        "title": "param",
        "description": "the time of issuance of the token",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "Date"
        },
        "name": "issuedAt"
      },
      {
        "title": "param",
        "description": "the time of expiration of the token",
        "lineNumber": 8,
        "type": {
          "type": "NameExpression",
          "name": "Date"
        },
        "name": "expiresAt"
      },
      {
        "title": "returns",
        "description": "the signed profile token",
        "lineNumber": 9,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 8,
        "column": 0
      },
      "end": {
        "line": 18,
        "column": 4
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 19,
          "column": 0
        },
        "end": {
          "line": 52,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileTokens.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "profile",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the JSON of the profile to be signed",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 37,
                      "offset": 36
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 37,
                  "offset": 36
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 37,
              "offset": 36
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      },
      {
        "title": "param",
        "name": "privateKey",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the signing private key",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 24,
                      "offset": 23
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 24,
                  "offset": 23
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 24,
              "offset": 23
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "subject",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the entity that the information is about",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 41,
                  "offset": 40
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 41,
              "offset": 40
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null"
      },
      {
        "title": "param",
        "name": "issuer",
        "lineNumber": 5,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the entity that is issuing the token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 37,
                      "offset": 36
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 37,
                  "offset": 36
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 37,
              "offset": 36
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null"
      },
      {
        "title": "param",
        "name": "signingAlgorithm",
        "lineNumber": 6,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the signing algorithm to use",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 29,
                      "offset": 28
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 29,
                  "offset": 28
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 29,
              "offset": 28
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "'ES256K'"
      },
      {
        "title": "param",
        "name": "issuedAt",
        "lineNumber": 7,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the time of issuance of the token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 34,
                      "offset": 33
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 34,
                  "offset": 33
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 34,
              "offset": 33
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Date"
        },
        "default": "new Date()"
      },
      {
        "title": "param",
        "name": "expiresAt",
        "lineNumber": 8,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the time of expiration of the token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 36,
                      "offset": 35
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 36,
                  "offset": 35
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 36,
              "offset": 35
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Date"
        },
        "default": "nextYear()"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the signed profile token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 25,
                      "offset": 24
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 25,
                  "offset": 24
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 25,
              "offset": 24
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "signProfileToken",
    "kind": "function",
    "path": [
      {
        "name": "signProfileToken",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "signProfileToken"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Verifies a profile token",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 25,
                  "offset": 24
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 25,
              "offset": 24
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 25,
          "offset": 24
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the token to be verified",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "token"
      },
      {
        "title": "param",
        "description": "the public key or address of the\n  keypair that is thought to have signed the token",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "publicKeyOrAddress"
      },
      {
        "title": "returns",
        "description": "the verified, decoded profile token",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      },
      {
        "title": "throws",
        "description": "throws an error if token verification fails",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "Error"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 66,
        "column": 0
      },
      "end": {
        "line": 73,
        "column": 4
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 74,
          "column": 0
        },
        "end": {
          "line": 130,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileTokens.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "token",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the token to be verified",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 25,
                      "offset": 24
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 25,
                  "offset": 24
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 25,
              "offset": 24
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "publicKeyOrAddress",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the public key or address of the\n  keypair that is thought to have signed the token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 51,
                      "offset": 83
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 51,
                  "offset": 83
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 51,
              "offset": 83
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the verified, decoded profile token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 36,
                      "offset": 35
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 36,
                  "offset": 35
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 36,
              "offset": 35
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      }
    ],
    "sees": [],
    "throws": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "throws an error if token verification fails",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 44,
                      "offset": 43
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 44,
                  "offset": 43
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 44,
              "offset": 43
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Error"
        }
      }
    ],
    "todos": [],
    "name": "verifyProfileToken",
    "kind": "function",
    "path": [
      {
        "name": "verifyProfileToken",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "verifyProfileToken"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Validates the social proofs in a user's profile. Currently supports validation of \nFacebook, Twitter, GitHub, Instagram, LinkedIn and HackerNews accounts.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 72,
                  "offset": 154
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 72,
              "offset": 154
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 72,
          "offset": 154
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "The JSON of the profile to be validated",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "name": "profile"
      },
      {
        "title": "param",
        "description": "The owner bitcoin address to be validated",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "string"
        },
        "name": "ownerAddress"
      },
      {
        "title": "param",
        "description": "The Blockstack name to be validated",
        "lineNumber": 6,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "string"
          }
        },
        "name": "name",
        "default": "null"
      },
      {
        "title": "returns",
        "description": "that resolves to an array of validated proof objects",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 4,
        "column": 0
      },
      "end": {
        "line": 12,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 13,
          "column": 0
        },
        "end": {
          "line": 56,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileProofs.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "profile",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The JSON of the profile to be validated",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 40,
                      "offset": 39
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 40,
                  "offset": 39
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 40,
              "offset": 39
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        }
      },
      {
        "title": "param",
        "name": "ownerAddress",
        "lineNumber": 5,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The owner bitcoin address to be validated",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 42,
                      "offset": 41
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 42,
                  "offset": 41
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 42,
              "offset": 41
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "string"
        }
      },
      {
        "title": "param",
        "name": "name",
        "lineNumber": 6,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The Blockstack name to be validated",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 36,
                      "offset": 35
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 36,
                  "offset": 35
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 36,
              "offset": 35
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "string"
        },
        "default": "null"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to an array of validated proof objects",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 53,
                      "offset": 52
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 53,
                  "offset": 52
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 53,
              "offset": 52
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "validateProofs",
    "kind": "function",
    "path": [
      {
        "name": "validateProofs",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "validateProofs"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Look up a user profile by blockstack ID",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 40,
                  "offset": 39
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 40,
              "offset": 39
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 40,
          "offset": 39
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "The Blockstack ID of the profile to look up",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "string"
        },
        "name": "username"
      },
      {
        "title": "param",
        "description": "The URL\nto use for zonefile lookup. If falsey, lookupProfile will use the\nblockstack.js getNameInfo function.",
        "lineNumber": 4,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "string"
          }
        },
        "name": "zoneFileLookupURL",
        "default": "null"
      },
      {
        "title": "returns",
        "description": "that resolves to a profile object",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 5,
        "column": 0
      },
      "end": {
        "line": 13,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 14,
          "column": 0
        },
        "end": {
          "line": 36,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/profiles/profileLookup.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "username",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The Blockstack ID of the profile to look up",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 44,
                      "offset": 43
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 44,
                  "offset": 43
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 44,
              "offset": 43
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "string"
        }
      },
      {
        "title": "param",
        "name": "zoneFileLookupURL",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The URL\nto use for zonefile lookup. If falsey, lookupProfile will use the\nblockstack.js getNameInfo function.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 3,
                      "column": 36,
                      "offset": 109
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 36,
                  "offset": 109
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 3,
              "column": 36,
              "offset": 109
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "string"
        },
        "default": "null"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to a profile object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 34,
                      "offset": 33
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 34,
                  "offset": 33
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 34,
              "offset": 33
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "lookupProfile",
    "kind": "function",
    "path": [
      {
        "name": "lookupProfile",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "lookupProfile"
  },
  {
    "name": "Storage",
    "kind": "note",
    "description": {
      "type": "root",
      "children": [
        {
          "type": "blockquote",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "strong",
                  "children": [
                    {
                      "type": "text",
                      "value": "Notes",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 5,
                          "offset": 4
                        },
                        "end": {
                          "line": 1,
                          "column": 10,
                          "offset": 9
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 3,
                      "offset": 2
                    },
                    "end": {
                      "line": 1,
                      "column": 12,
                      "offset": 11
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": ":",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 12,
                      "offset": 11
                    },
                    "end": {
                      "line": 1,
                      "column": 13,
                      "offset": 12
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 3,
                  "offset": 2
                },
                "end": {
                  "line": 1,
                  "column": 13,
                  "offset": 12
                },
                "indent": []
              }
            },
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "1) Blockstack Gaia Storage APIs and on-disk format will change in\nupcoming pre-releases breaking backward compatibility. File encryption is currently\nopt-in on a file by file basis.",
                  "position": {
                    "start": {
                      "line": 3,
                      "column": 3,
                      "offset": 16
                    },
                    "end": {
                      "line": 5,
                      "column": 32,
                      "offset": 197
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 3,
                  "column": 3,
                  "offset": 16
                },
                "end": {
                  "line": 5,
                  "column": 32,
                  "offset": 197
                },
                "indent": [
                  1,
                  1
                ]
              }
            },
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "2) Certain storage features such as and collections are not implemented in the current\nversion. These features will be rolled out in future updates.",
                  "position": {
                    "start": {
                      "line": 7,
                      "column": 2,
                      "offset": 200
                    },
                    "end": {
                      "line": 8,
                      "column": 62,
                      "offset": 348
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 7,
                  "column": 2,
                  "offset": 200
                },
                "end": {
                  "line": 8,
                  "column": 62,
                  "offset": 348
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 8,
              "column": 62,
              "offset": 348
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Creating a file",
              "position": {
                "start": {
                  "line": 10,
                  "column": 4,
                  "offset": 353
                },
                "end": {
                  "line": 10,
                  "column": 19,
                  "offset": 368
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 10,
              "column": 1,
              "offset": 350
            },
            "end": {
              "line": 10,
              "column": 19,
              "offset": 368
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " blockstack.putFile(\"/hello.txt\", \"hello world!\")\n .then(() => {\n    // /hello.txt exists now, and has the contents \"hello world!\".\n })",
          "position": {
            "start": {
              "line": 12,
              "column": 1,
              "offset": 370
            },
            "end": {
              "line": 17,
              "column": 4,
              "offset": 523
            },
            "indent": [
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Reading a file",
              "position": {
                "start": {
                  "line": 19,
                  "column": 4,
                  "offset": 528
                },
                "end": {
                  "line": 19,
                  "column": 18,
                  "offset": 542
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 19,
              "column": 1,
              "offset": 525
            },
            "end": {
              "line": 19,
              "column": 18,
              "offset": 542
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " blockstack.getFile(\"/hello.txt\")\n .then((fileContents) => {\n    // get the contents of the file /hello.txt\n    assert(fileContents === \"hello world!\")\n });",
          "position": {
            "start": {
              "line": 21,
              "column": 1,
              "offset": 544
            },
            "end": {
              "line": 27,
              "column": 4,
              "offset": 718
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Creating an encrypted file",
              "position": {
                "start": {
                  "line": 29,
                  "column": 4,
                  "offset": 723
                },
                "end": {
                  "line": 29,
                  "column": 30,
                  "offset": 749
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 29,
              "column": 1,
              "offset": 720
            },
            "end": {
              "line": 29,
              "column": 30,
              "offset": 749
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " let options = {\n   encrypt: true\n }\n\n blockstack.putFile(\"/message.txt\", \"Secret hello!\", options)\n .then(() => {\n    // message.txt exists now, and has the contents \"hello world!\".\n })",
          "position": {
            "start": {
              "line": 31,
              "column": 1,
              "offset": 751
            },
            "end": {
              "line": 40,
              "column": 4,
              "offset": 955
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Reading an encrypted file",
              "position": {
                "start": {
                  "line": 42,
                  "column": 4,
                  "offset": 960
                },
                "end": {
                  "line": 42,
                  "column": 29,
                  "offset": 985
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 42,
              "column": 1,
              "offset": 957
            },
            "end": {
              "line": 42,
              "column": 29,
              "offset": 985
            },
            "indent": []
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " let options = {\n   decrypt: true\n }\n\n blockstack.getFile(\"/message.txt\", options)\n .then((fileContents) => {\n    // get & decrypt the contents of the file /message.txt\n    assert(fileContents === \"Secret hello!\")\n });",
          "position": {
            "start": {
              "line": 44,
              "column": 1,
              "offset": 987
            },
            "end": {
              "line": 54,
              "column": 4,
              "offset": 1223
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Reading another user's unencrypted file",
              "position": {
                "start": {
                  "line": 56,
                  "column": 4,
                  "offset": 1228
                },
                "end": {
                  "line": 56,
                  "column": 43,
                  "offset": 1267
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 56,
              "column": 1,
              "offset": 1225
            },
            "end": {
              "line": 56,
              "column": 43,
              "offset": 1267
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "In order for files to be publicly readable, the app must request\nthe ",
              "position": {
                "start": {
                  "line": 57,
                  "column": 1,
                  "offset": 1268
                },
                "end": {
                  "line": 58,
                  "column": 5,
                  "offset": 1337
                },
                "indent": [
                  1
                ]
              }
            },
            {
              "type": "inlineCode",
              "value": "publish_data",
              "position": {
                "start": {
                  "line": 58,
                  "column": 5,
                  "offset": 1337
                },
                "end": {
                  "line": 58,
                  "column": 19,
                  "offset": 1351
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " scope during authentication.",
              "position": {
                "start": {
                  "line": 58,
                  "column": 19,
                  "offset": 1351
                },
                "end": {
                  "line": 58,
                  "column": 48,
                  "offset": 1380
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 57,
              "column": 1,
              "offset": 1268
            },
            "end": {
              "line": 58,
              "column": 48,
              "offset": 1380
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " let options = {\n   user: 'ryan.id', // the Blockstack ID of the user for which to lookup the file\n   app: 'http://BlockstackApp.com' // origin of the app this file is stored for\n }\n\n blockstack.getFile(\"/message.txt\", options)\n .then((fileContents) => {\n    // get the contents of the file /message.txt\n    assert(fileContents === \"hello world!\")\n });",
          "position": {
            "start": {
              "line": 60,
              "column": 1,
              "offset": 1382
            },
            "end": {
              "line": 71,
              "column": 4,
              "offset": 1752
            },
            "indent": [
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1,
              1
            ]
          }
        },
        {
          "type": "heading",
          "depth": 2,
          "children": [
            {
              "type": "text",
              "value": "Deleting a file",
              "position": {
                "start": {
                  "line": 73,
                  "column": 4,
                  "offset": 1757
                },
                "end": {
                  "line": 73,
                  "column": 19,
                  "offset": 1772
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 73,
              "column": 1,
              "offset": 1754
            },
            "end": {
              "line": 73,
              "column": 19,
              "offset": 1772
            },
            "indent": []
          }
        },
        {
          "type": "paragraph",
          "children": [
            {
              "type": "emphasis",
              "children": [
                {
                  "type": "text",
                  "value": "Note: deleteFile is currently not implemented. For now, we recommend\nwriting an empty file to wipe data",
                  "position": {
                    "start": {
                      "line": 75,
                      "column": 2,
                      "offset": 1775
                    },
                    "end": {
                      "line": 76,
                      "column": 35,
                      "offset": 1878
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 75,
                  "column": 1,
                  "offset": 1774
                },
                "end": {
                  "line": 76,
                  "column": 36,
                  "offset": 1879
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 75,
              "column": 1,
              "offset": 1774
            },
            "end": {
              "line": 76,
              "column": 36,
              "offset": 1879
            },
            "indent": [
              1
            ]
          }
        },
        {
          "type": "code",
          "lang": "JavaScript",
          "value": " blockstack.deleteFile(\"/hello.txt\")\n .then(() => {\n    // /hello.txt is now removed.\n })",
          "position": {
            "start": {
              "line": 78,
              "column": 1,
              "offset": 1881
            },
            "end": {
              "line": 83,
              "column": 4,
              "offset": 1988
            },
            "indent": [
              1,
              1,
              1,
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 84,
          "column": 1,
          "offset": 1989
        }
      }
    },
    "path": [
      {
        "name": "Storage",
        "kind": "note"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "Storage"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Retrieves the specified file from the app's data store.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 56,
                  "offset": 55
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 56,
              "offset": 55
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 56,
          "offset": 55
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the path to the file to read",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "path"
      },
      {
        "title": "param",
        "description": "options object",
        "lineNumber": 3,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Object"
          }
        },
        "name": "options",
        "default": "null"
      },
      {
        "title": "param",
        "description": "try to decrypt the data with the app private key",
        "lineNumber": 4,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Boolean"
          }
        },
        "name": "options.decrypt",
        "default": "true"
      },
      {
        "title": "param",
        "description": "the Blockstack ID to lookup for multi-player storage",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "options.username"
      },
      {
        "title": "param",
        "description": "Whether the content should be verified, only to be used\nwhen `putFile` was set to `sign = true`",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "Boolean"
        },
        "name": "options.verify"
      },
      {
        "title": "param",
        "description": "the app to lookup for multi-player storage -\ndefaults to current origin",
        "lineNumber": 8,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "options.app"
      },
      {
        "title": "param",
        "description": "The URL\nto use for zonefile lookup. If falsey, this will use the\nblockstack.js's getNameInfo function instead.",
        "lineNumber": 10,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "options.zoneFileLookupURL",
        "default": "null"
      },
      {
        "title": "returns",
        "description": "that resolves to the raw data in the file\nor rejects with an error",
        "lineNumber": 13,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 294,
        "column": 0
      },
      "end": {
        "line": 309,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 310,
          "column": 0
        },
        "end": {
          "line": 354,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "path",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the path to the file to read",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 29,
                      "offset": 28
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 29,
                  "offset": 28
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 29,
              "offset": 28
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "options",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "options object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 15,
                      "offset": 14
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 15,
                  "offset": 14
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 15,
              "offset": 14
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null",
        "properties": [
          {
            "title": "param",
            "name": "options.decrypt",
            "lineNumber": 4,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "try to decrypt the data with the app private key",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 1,
                          "column": 49,
                          "offset": 48
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 49,
                      "offset": 48
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 49,
                  "offset": 48
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "Boolean"
            },
            "default": "true"
          },
          {
            "title": "param",
            "name": "options.username",
            "lineNumber": 5,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "the Blockstack ID to lookup for multi-player storage",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 1,
                          "column": 53,
                          "offset": 52
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 53,
                      "offset": 52
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 53,
                  "offset": 52
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            }
          },
          {
            "title": "param",
            "name": "options.verify",
            "lineNumber": 6,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "Whether the content should be verified, only to be used\nwhen ",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 6,
                          "offset": 61
                        },
                        "indent": [
                          1
                        ]
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "putFile",
                      "position": {
                        "start": {
                          "line": 2,
                          "column": 6,
                          "offset": 61
                        },
                        "end": {
                          "line": 2,
                          "column": 15,
                          "offset": 70
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "text",
                      "value": " was set to ",
                      "position": {
                        "start": {
                          "line": 2,
                          "column": 15,
                          "offset": 70
                        },
                        "end": {
                          "line": 2,
                          "column": 27,
                          "offset": 82
                        },
                        "indent": []
                      }
                    },
                    {
                      "type": "inlineCode",
                      "value": "sign = true",
                      "position": {
                        "start": {
                          "line": 2,
                          "column": 27,
                          "offset": 82
                        },
                        "end": {
                          "line": 2,
                          "column": 40,
                          "offset": 95
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 40,
                      "offset": 95
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 40,
                  "offset": 95
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "Boolean"
            }
          },
          {
            "title": "param",
            "name": "options.app",
            "lineNumber": 8,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "the app to lookup for multi-player storage -\ndefaults to current origin",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 27,
                          "offset": 71
                        },
                        "indent": [
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 27,
                      "offset": 71
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 27,
                  "offset": 71
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            }
          },
          {
            "title": "param",
            "name": "options.zoneFileLookupURL",
            "lineNumber": 10,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "The URL\nto use for zonefile lookup. If falsey, this will use the\nblockstack.js's getNameInfo function instead.",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 3,
                          "column": 46,
                          "offset": 110
                        },
                        "indent": [
                          1,
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 3,
                      "column": 46,
                      "offset": 110
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 46,
                  "offset": 110
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            },
            "default": "null"
          }
        ]
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to the raw data in the file\nor rejects with an error",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 25,
                      "offset": 66
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 25,
                  "offset": 66
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 25,
              "offset": 66
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getFile",
    "kind": "function",
    "path": [
      {
        "name": "getFile",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "getFile"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Stores the data provided in the app's data store to to the file specified.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 75,
                  "offset": 74
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 75,
              "offset": 74
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 75,
          "offset": 74
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the path to store the data in",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "path"
      },
      {
        "title": "param",
        "description": "the data to store in the file",
        "lineNumber": 3,
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        },
        "name": "content"
      },
      {
        "title": "param",
        "description": "options object",
        "lineNumber": 4,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Object"
          }
        },
        "name": "options",
        "default": "null"
      },
      {
        "title": "param",
        "description": "encrypt the data with the app private key\n                                                 or the provided public key",
        "lineNumber": 5,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "UnionType",
            "elements": [
              {
                "type": "NameExpression",
                "name": "Boolean"
              },
              {
                "type": "NameExpression",
                "name": "String"
              }
            ]
          }
        },
        "name": "options.encrypt",
        "default": "true"
      },
      {
        "title": "param",
        "description": "sign the data using ECDSA on SHA256 hashes with\n                                        the app private key",
        "lineNumber": 7,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Boolean"
          }
        },
        "name": "options.sign",
        "default": "false"
      },
      {
        "title": "param",
        "description": "set a Content-Type header for unencrypted data",
        "lineNumber": 9,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "options.contentType",
        "default": "''"
      },
      {
        "title": "return",
        "description": "that resolves if the operation succeed and rejects\nif it failed",
        "lineNumber": 10,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 356,
        "column": 0
      },
      "end": {
        "line": 368,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 369,
          "column": 0
        },
        "end": {
          "line": 460,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "path",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the path to store the data in",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 30,
                      "offset": 29
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 30,
                  "offset": 29
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 30,
              "offset": 29
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "content",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the data to store in the file",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 30,
                      "offset": 29
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 30,
                  "offset": 29
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 30,
              "offset": 29
            }
          }
        },
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        }
      },
      {
        "title": "param",
        "name": "options",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "options object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 15,
                      "offset": 14
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 15,
                  "offset": 14
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 15,
              "offset": 14
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null",
        "properties": [
          {
            "title": "param",
            "name": "options.encrypt",
            "lineNumber": 5,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "encrypt the data with the app private key\n                                                 or the provided public key",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 76,
                          "offset": 117
                        },
                        "indent": [
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 76,
                      "offset": 117
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 76,
                  "offset": 117
                }
              }
            },
            "type": {
              "type": "UnionType",
              "elements": [
                {
                  "type": "NameExpression",
                  "name": "Boolean"
                },
                {
                  "type": "NameExpression",
                  "name": "String"
                }
              ]
            },
            "default": "true"
          },
          {
            "title": "param",
            "name": "options.sign",
            "lineNumber": 7,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "sign the data using ECDSA on SHA256 hashes with\n                                        the app private key",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 60,
                          "offset": 107
                        },
                        "indent": [
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 60,
                      "offset": 107
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 60,
                  "offset": 107
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "Boolean"
            },
            "default": "false"
          },
          {
            "title": "param",
            "name": "options.contentType",
            "lineNumber": 9,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "set a Content-Type header for unencrypted data",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 1,
                          "column": 47,
                          "offset": 46
                        },
                        "indent": []
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 47,
                      "offset": 46
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 47,
                  "offset": 46
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            },
            "default": "''"
          }
        ]
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves if the operation succeed and rejects\nif it failed",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 13,
                      "offset": 63
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 13,
                  "offset": 63
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 13,
              "offset": 63
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "putFile",
    "kind": "function",
    "path": [
      {
        "name": "putFile",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "putFile"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Encrypts the data provided with the app public key.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 52,
                  "offset": 51
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 52,
              "offset": 51
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 52,
          "offset": 51
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "data to encrypt",
        "lineNumber": 2,
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        },
        "name": "content"
      },
      {
        "title": "param",
        "description": "options object",
        "lineNumber": 3,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Object"
          }
        },
        "name": "options",
        "default": "null"
      },
      {
        "title": "param",
        "description": "the hex string of the ECDSA public\nkey to use for encryption. If not provided, will use user's appPrivateKey.",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "options.publicKey"
      },
      {
        "title": "return",
        "description": "Stringified ciphertext object",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 57,
        "column": 0
      },
      "end": {
        "line": 64,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 65,
          "column": 0
        },
        "end": {
          "line": 75,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "content",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "data to encrypt",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 16,
                      "offset": 15
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 16,
                  "offset": 15
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 16,
              "offset": 15
            }
          }
        },
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        }
      },
      {
        "title": "param",
        "name": "options",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "options object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 15,
                      "offset": 14
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 15,
                  "offset": 14
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 15,
              "offset": 14
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null",
        "properties": [
          {
            "title": "param",
            "name": "options.publicKey",
            "lineNumber": 4,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "the hex string of the ECDSA public\nkey to use for encryption. If not provided, will use user's appPrivateKey.",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 75,
                          "offset": 109
                        },
                        "indent": [
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 75,
                      "offset": 109
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 75,
                  "offset": 109
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            }
          }
        ]
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "Stringified ciphertext object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 30,
                      "offset": 29
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 30,
                  "offset": 29
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 30,
              "offset": 29
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "encryptContent",
    "kind": "function",
    "path": [
      {
        "name": "encryptContent",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "encryptContent"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Decrypts data encrypted with ",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 30,
                  "offset": 29
                },
                "indent": []
              }
            },
            {
              "type": "inlineCode",
              "value": "encryptContent",
              "position": {
                "start": {
                  "line": 1,
                  "column": 30,
                  "offset": 29
                },
                "end": {
                  "line": 1,
                  "column": 46,
                  "offset": 45
                },
                "indent": []
              }
            },
            {
              "type": "text",
              "value": " with the\ntransit private key.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 46,
                  "offset": 45
                },
                "end": {
                  "line": 2,
                  "column": 21,
                  "offset": 75
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 21,
              "offset": 75
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 21,
          "offset": 75
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "encrypted content.",
        "lineNumber": 3,
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        },
        "name": "content"
      },
      {
        "title": "param",
        "description": "options object",
        "lineNumber": 4,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "Object"
          }
        },
        "name": "options",
        "default": "null"
      },
      {
        "title": "param",
        "description": "the hex string of the ECDSA private\nkey to use for decryption. If not provided, will use user's appPrivateKey.",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "options.privateKey"
      },
      {
        "title": "return",
        "description": "decrypted content.",
        "lineNumber": 7,
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        }
      }
    ],
    "loc": {
      "start": {
        "line": 77,
        "column": 0
      },
      "end": {
        "line": 85,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 86,
          "column": 0
        },
        "end": {
          "line": 105,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "content",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "encrypted content.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 19,
                      "offset": 18
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 19,
                  "offset": 18
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 19,
              "offset": 18
            }
          }
        },
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        }
      },
      {
        "title": "param",
        "name": "options",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "options object",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 15,
                      "offset": 14
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 15,
                  "offset": 14
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 15,
              "offset": 14
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Object"
        },
        "default": "null",
        "properties": [
          {
            "title": "param",
            "name": "options.privateKey",
            "lineNumber": 5,
            "description": {
              "type": "root",
              "children": [
                {
                  "type": "paragraph",
                  "children": [
                    {
                      "type": "text",
                      "value": "the hex string of the ECDSA private\nkey to use for decryption. If not provided, will use user's appPrivateKey.",
                      "position": {
                        "start": {
                          "line": 1,
                          "column": 1,
                          "offset": 0
                        },
                        "end": {
                          "line": 2,
                          "column": 75,
                          "offset": 110
                        },
                        "indent": [
                          1
                        ]
                      }
                    }
                  ],
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 75,
                      "offset": 110
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 75,
                  "offset": 110
                }
              }
            },
            "type": {
              "type": "NameExpression",
              "name": "String"
            }
          }
        ]
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "decrypted content.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 19,
                      "offset": 18
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 19,
                  "offset": 18
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 19,
              "offset": 18
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "UnionType",
          "elements": [
            {
              "type": "NameExpression",
              "name": "String"
            },
            {
              "type": "NameExpression",
              "name": "Buffer"
            }
          ]
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "decryptContent",
    "kind": "function",
    "path": [
      {
        "name": "decryptContent",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "decryptContent"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the app storage bucket URL",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 31,
                  "offset": 30
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 31,
              "offset": 30
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 31,
          "offset": 30
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the gaia hub URL",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "gaiaHubUrl"
      },
      {
        "title": "param",
        "description": "the app private key used to generate the app address",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "appPrivateKey"
      },
      {
        "title": "returns",
        "description": "That resolves to the URL of the app index file\nor rejects if it fails",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 462,
        "column": 0
      },
      "end": {
        "line": 468,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 469,
          "column": 0
        },
        "end": {
          "line": 471,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "gaiaHubUrl",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the gaia hub URL",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 17,
                      "offset": 16
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 17,
                  "offset": 16
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 17,
              "offset": 16
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "appPrivateKey",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the app private key used to generate the app address",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 53,
                      "offset": 52
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 53,
                  "offset": 52
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 53,
              "offset": 52
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "That resolves to the URL of the app index file\nor rejects if it fails",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 23,
                      "offset": 69
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 23,
                  "offset": 69
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 23,
              "offset": 69
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAppBucketUrl",
    "kind": "function",
    "path": [
      {
        "name": "getAppBucketUrl",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "getAppBucketUrl"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Fetch the public read URL of a user file for the specified app.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 64,
                  "offset": 63
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 64,
              "offset": 63
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 64,
          "offset": 63
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the path to the file to read",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "path"
      },
      {
        "title": "param",
        "description": "The Blockstack ID of the user to look up",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "username"
      },
      {
        "title": "param",
        "description": "The app origin",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "appOrigin"
      },
      {
        "title": "param",
        "description": "The URL\nto use for zonefile lookup. If falsey, this will use the\nblockstack.js's getNameInfo function instead.",
        "lineNumber": 5,
        "type": {
          "type": "OptionalType",
          "expression": {
            "type": "NameExpression",
            "name": "String"
          }
        },
        "name": "zoneFileLookupURL",
        "default": "null"
      },
      {
        "title": "return",
        "description": "that resolves to the public read URL of the file\nor rejects with an error",
        "lineNumber": 8,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 22,
        "column": 0
      },
      "end": {
        "line": 32,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 33,
          "column": 0
        },
        "end": {
          "line": 55,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "path",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the path to the file to read",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 29,
                      "offset": 28
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 29,
                  "offset": 28
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 29,
              "offset": 28
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "username",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The Blockstack ID of the user to look up",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 41,
                      "offset": 40
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 41,
                  "offset": 40
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 41,
              "offset": 40
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "appOrigin",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The app origin",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 15,
                      "offset": 14
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 15,
                  "offset": 14
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 15,
              "offset": 14
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "zoneFileLookupURL",
        "lineNumber": 5,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The URL\nto use for zonefile lookup. If falsey, this will use the\nblockstack.js's getNameInfo function instead.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 3,
                      "column": 46,
                      "offset": 110
                    },
                    "indent": [
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 46,
                  "offset": 110
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 3,
              "column": 46,
              "offset": 110
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "default": "null"
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to the public read URL of the file\nor rejects with an error",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 25,
                      "offset": 73
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 25,
                  "offset": 73
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 25,
              "offset": 73
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getUserAppFileUrl",
    "kind": "function",
    "path": [
      {
        "name": "getUserAppFileUrl",
        "kind": "function"
      }
    ],
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "namespace": "getUserAppFileUrl"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Detects if the native auth-browser is installed and is successfully \nlaunched via a custom protocol URI.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 36,
                  "offset": 104
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 36,
              "offset": 104
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 36,
          "offset": 104
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "The encoded authRequest to be used as a query param in the custom URI.",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "authRequest"
      },
      {
        "title": "param",
        "description": "The callback that is invoked when the protocol handler was detected.",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "successCallback"
      },
      {
        "title": "param",
        "description": "The callback that is invoked when the protocol handler was not detected.",
        "lineNumber": 7,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "failCallback"
      },
      {
        "title": "return",
        "description": null,
        "lineNumber": 9,
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 61,
        "column": 0
      },
      "end": {
        "line": 71,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 72,
          "column": 0
        },
        "end": {
          "line": 226,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/auth/authApp.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "authRequest",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The encoded authRequest to be used as a query param in the custom URI.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 71,
                      "offset": 70
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 71,
                  "offset": 70
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 71,
              "offset": 70
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "successCallback",
        "lineNumber": 5,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The callback that is invoked when the protocol handler was detected.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 69,
                      "offset": 68
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 69,
                  "offset": 68
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 69,
              "offset": 68
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "failCallback",
        "lineNumber": 7,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "The callback that is invoked when the protocol handler was not detected.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 73,
                      "offset": 72
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 73,
                  "offset": 72
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 73,
              "offset": 72
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 1,
              "offset": 0
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "void"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "detectProtocolLaunch",
    "kind": "function",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "detectProtocolLaunch",
        "kind": "function"
      }
    ],
    "namespace": "detectProtocolLaunch"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the price of a name.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 25,
                  "offset": 24
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 25,
              "offset": 24
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 25,
          "offset": 24
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the name to query",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "fullyQualifiedName"
      },
      {
        "title": "return",
        "description": "a promise to an Object with { units: String, amount: BigInteger }, where\n  .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and\n  .amount encodes the number of units, in the smallest denominiated amount\n  (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, \n  .amount will be microStacks)",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 227,
        "column": 2
      },
      "end": {
        "line": 235,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 236,
          "column": 2
        },
        "end": {
          "line": 240,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "fullyQualifiedName",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the name to query",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 18,
                      "offset": 17
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 18,
                  "offset": 17
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 18,
              "offset": 17
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise to an Object with { units: String, amount: BigInteger }, where\n  .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and\n  .amount encodes the number of units, in the smallest denominiated amount\n  (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, \n  .amount will be microStacks)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 5,
                      "column": 31,
                      "offset": 325
                    },
                    "indent": [
                      1,
                      1,
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 5,
                  "column": 31,
                  "offset": 325
                },
                "indent": [
                  1,
                  1,
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 5,
              "column": 31,
              "offset": 325
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNamePrice",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNamePrice",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNamePrice"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the price of a namespace",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 29,
                  "offset": 28
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 29,
              "offset": 28
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 29,
          "offset": 28
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the namespace to query",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "namespaceID"
      },
      {
        "title": "return",
        "description": "a promise to an Object with { units: String, amount: BigInteger }, where\n  .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and\n  .amount encodes the number of units, in the smallest denominiated amount\n  (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, \n  .amount will be microStacks)",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 242,
        "column": 2
      },
      "end": {
        "line": 250,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 251,
          "column": 2
        },
        "end": {
          "line": 255,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "namespaceID",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the namespace to query",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 23,
                      "offset": 22
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 23,
                  "offset": 22
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 23,
              "offset": 22
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise to an Object with { units: String, amount: BigInteger }, where\n  .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and\n  .amount encodes the number of units, in the smallest denominiated amount\n  (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, \n  .amount will be microStacks)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 5,
                      "column": 31,
                      "offset": 325
                    },
                    "indent": [
                      1,
                      1,
                      1,
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 5,
                  "column": 31,
                  "offset": 325
                },
                "indent": [
                  1,
                  1,
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 5,
              "column": 31,
              "offset": 325
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNamespacePrice",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNamespacePrice",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNamespacePrice"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "How many blocks can pass between a name expiring and the name being able to be\nre-registered by a different owner?",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 36,
                  "offset": 114
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 36,
              "offset": 114
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 36,
          "offset": 114
        }
      }
    },
    "tags": [
      {
        "title": "return",
        "description": "a promise to the number of blocks",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 257,
        "column": 2
      },
      "end": {
        "line": 261,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 262,
          "column": 2
        },
        "end": {
          "line": 264,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise to the number of blocks",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 34,
                      "offset": 33
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 34,
                  "offset": 33
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 34,
              "offset": 33
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getGracePeriod",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getGracePeriod",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getGracePeriod"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the names -- both on-chain and off-chain -- owned by an address.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 69,
                  "offset": 68
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 69,
              "offset": 68
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 69,
          "offset": 68
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the blockchain address (the hash of the owner public key)",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "return",
        "description": "a promise that resolves to a list of names (Strings)",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 266,
        "column": 2
      },
      "end": {
        "line": 270,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 271,
          "column": 2
        },
        "end": {
          "line": 276,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the blockchain address (the hash of the owner public key)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 58,
                      "offset": 57
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 58,
                  "offset": 57
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 58,
              "offset": 57
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to a list of names (Strings)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 53,
                      "offset": 52
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 53,
                  "offset": 52
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 53,
              "offset": 52
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNamesOwned",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNamesOwned",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNamesOwned"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the blockchain address to which a name's registration fee must be sent\n(the address will depend on the namespace in which it is registered.)",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 70,
                  "offset": 144
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 70,
              "offset": 144
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 70,
          "offset": 144
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the namespace ID",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "namespace"
      },
      {
        "title": "return",
        "description": "a promise that resolves to an address (String)",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 278,
        "column": 2
      },
      "end": {
        "line": 283,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 284,
          "column": 2
        },
        "end": {
          "line": 307,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "namespace",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the namespace ID",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 17,
                      "offset": 16
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 17,
                  "offset": 16
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 17,
              "offset": 16
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to an address (String)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 47,
                      "offset": 46
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 47,
                  "offset": 46
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 47,
              "offset": 46
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNamespaceBurnAddress",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNamespaceBurnAddress",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNamespaceBurnAddress"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get WHOIS-like information for a name, including the address that owns it,\nthe block at which it expires, and the zone file anchored to it (if available).",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 80,
                  "offset": 154
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 80,
              "offset": 154
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 80,
          "offset": 154
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the name to query.  Can be on-chain of off-chain.",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "fullyQualifiedName"
      },
      {
        "title": "return",
        "description": "a promise that resolves to the WHOIS-like information",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 309,
        "column": 2
      },
      "end": {
        "line": 314,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 315,
          "column": 2
        },
        "end": {
          "line": 336,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "fullyQualifiedName",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the name to query.  Can be on-chain of off-chain.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 50,
                      "offset": 49
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 50,
                  "offset": 49
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 50,
              "offset": 49
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to the WHOIS-like information",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 54,
                      "offset": 53
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 54,
                  "offset": 53
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 54,
              "offset": 53
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNameInfo",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNameInfo",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNameInfo"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the pricing parameters and creation history of a namespace.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 64,
                  "offset": 63
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 64,
              "offset": 63
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 64,
          "offset": 63
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the namespace to query",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "namespaceID"
      },
      {
        "title": "return",
        "description": "a promise that resolves to the namespace information.",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 338,
        "column": 2
      },
      "end": {
        "line": 342,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 343,
          "column": 2
        },
        "end": {
          "line": 367,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "namespaceID",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the namespace to query",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 23,
                      "offset": 22
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 23,
                  "offset": 22
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 23,
              "offset": 22
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to the namespace information.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 54,
                      "offset": 53
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 54,
                  "offset": 53
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 54,
              "offset": 53
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getNamespaceInfo",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getNamespaceInfo",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getNamespaceInfo"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get a zone file, given its hash.  Throws an exception if the zone file\nobtained does not match the hash.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 34,
                  "offset": 104
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 34,
              "offset": 104
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 34,
          "offset": 104
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the ripemd160(sha256) hash of the zone file",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "zonefileHash"
      },
      {
        "title": "return",
        "description": "a promise that resolves to the zone file's text",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 369,
        "column": 2
      },
      "end": {
        "line": 374,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 375,
          "column": 2
        },
        "end": {
          "line": 392,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "zonefileHash",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the ripemd160(sha256) hash of the zone file",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 44,
                      "offset": 43
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 44,
                  "offset": 43
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 44,
              "offset": 43
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to the zone file's text",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 48,
                      "offset": 47
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 48,
                  "offset": 47
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 48,
              "offset": 47
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getZonefile",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getZonefile",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getZonefile"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the status of an account for a particular token holding.  This includes its total number of\nexpenditures and credits, lockup times, last txid, and so on.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 62,
                  "offset": 157
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 62,
              "offset": 157
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 62,
          "offset": 157
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the account",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "param",
        "description": "the token type to query",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "tokenType"
      },
      {
        "title": "return",
        "description": "a promise that resolves to an object representing the state of the account\n  for this token",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 394,
        "column": 2
      },
      "end": {
        "line": 401,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 402,
          "column": 2
        },
        "end": {
          "line": 421,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the account",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 12,
                      "offset": 11
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 12,
                  "offset": 11
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 12,
              "offset": 11
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "tokenType",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the token type to query",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 24,
                      "offset": 23
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 24,
                  "offset": 23
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 24,
              "offset": 23
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to an object representing the state of the account\n  for this token",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 17,
                      "offset": 91
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 17,
                  "offset": 91
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 17,
              "offset": 91
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAccountStatus",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getAccountStatus",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getAccountStatus"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get a page of an account's transaction history.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 48,
                  "offset": 47
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 48,
              "offset": 47
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 48,
          "offset": 47
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the account's address",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "param",
        "description": "the page number.  Page 0 is the most recent transactions",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "number"
        },
        "name": "page"
      },
      {
        "title": "return",
        "description": "a promise that resolves to an Array of Objects, where each Object encodes\n  states of the account at various block heights (e.g. prior balances, txids, etc)",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 424,
        "column": 2
      },
      "end": {
        "line": 430,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 431,
          "column": 2
        },
        "end": {
          "line": 456,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the account's address",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 22,
                      "offset": 21
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 22,
                  "offset": 21
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 22,
              "offset": 21
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "page",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the page number.  Page 0 is the most recent transactions",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 57,
                      "offset": 56
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 57,
                  "offset": 56
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 57,
              "offset": 56
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "number"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to an Array of Objects, where each Object encodes\n  states of the account at various block heights (e.g. prior balances, txids, etc)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 83,
                      "offset": 156
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 83,
                  "offset": 156
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 83,
              "offset": 156
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAccountHistoryPage",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getAccountHistoryPage",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getAccountHistoryPage"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the state(s) of an account at a particular block height.  This includes the state of the\naccount beginning with this block's transactions, as well as all of the states the account\npassed through when this block was processed (if any).",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 3,
                  "column": 55,
                  "offset": 238
                },
                "indent": [
                  1,
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 3,
              "column": 55,
              "offset": 238
            },
            "indent": [
              1,
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 3,
          "column": 55,
          "offset": 238
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the account's address",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "param",
        "description": "the block to query",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "Integer"
        },
        "name": "blockHeight"
      },
      {
        "title": "return",
        "description": "a promise that resolves to an Array of Objects, where each Object encodes\n  states of the account at this block.",
        "lineNumber": 6,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 458,
        "column": 2
      },
      "end": {
        "line": 466,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 467,
          "column": 2
        },
        "end": {
          "line": 491,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the account's address",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 22,
                      "offset": 21
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 22,
                  "offset": 21
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 22,
              "offset": 21
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "blockHeight",
        "lineNumber": 5,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the block to query",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 19,
                      "offset": 18
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 19,
                  "offset": 18
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 19,
              "offset": 18
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "Integer"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to an Array of Objects, where each Object encodes\n  states of the account at this block.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 39,
                      "offset": 112
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 39,
                  "offset": 112
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 39,
              "offset": 112
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAccountAt",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getAccountAt",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getAccountAt"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the set of token types that this account owns",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 50,
                  "offset": 49
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 50,
              "offset": 49
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 50,
          "offset": 49
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the account's address",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "return",
        "description": "a promise that resolves to an Array of Strings, where each item encodes the \n  type of token this account holds (excluding the underlying blockchain's tokens)",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 493,
        "column": 2
      },
      "end": {
        "line": 498,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 499,
          "column": 2
        },
        "end": {
          "line": 516,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the account's address",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 22,
                      "offset": 21
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 22,
                  "offset": 21
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 22,
              "offset": 21
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to an Array of Strings, where each item encodes the \n  type of token this account holds (excluding the underlying blockchain's tokens)",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 82,
                      "offset": 158
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 82,
                  "offset": 158
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 82,
              "offset": 158
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAccountTokens",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getAccountTokens",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getAccountTokens"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "Get the number of tokens owned by an account.  If the account does not exist or has no\ntokens of this type, then 0 will be returned.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 46,
                  "offset": 132
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 46,
              "offset": 132
            },
            "indent": [
              1
            ]
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 2,
          "column": 46,
          "offset": 132
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "the account's address",
        "lineNumber": 3,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "address"
      },
      {
        "title": "param",
        "description": "the type of token to query.",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "String"
        },
        "name": "tokenType"
      },
      {
        "title": "return",
        "description": "a promise that resolves to a BigInteger that encodes the number of tokens \n  held by this account.",
        "lineNumber": 5,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 518,
        "column": 2
      },
      "end": {
        "line": 525,
        "column": 5
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 526,
          "column": 2
        },
        "end": {
          "line": 548,
          "column": 3
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/network.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "address",
        "lineNumber": 3,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the account's address",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 22,
                      "offset": 21
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 22,
                  "offset": 21
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 22,
              "offset": 21
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      },
      {
        "title": "param",
        "name": "tokenType",
        "lineNumber": 4,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "the type of token to query.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 28,
                      "offset": 27
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 28,
                  "offset": 27
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 28,
              "offset": 27
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "String"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a promise that resolves to a BigInteger that encodes the number of tokens \n  held by this account.",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 24,
                      "offset": 98
                    },
                    "indent": [
                      1
                    ]
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 24,
                  "offset": 98
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 24,
              "offset": 98
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "getAccountBalance",
    "kind": "function",
    "memberof": "BlockstackNetwork",
    "scope": "instance",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "getAccountBalance",
        "kind": "function",
        "scope": "instance"
      }
    ],
    "namespace": "#getAccountBalance"
  },
  {
    "description": {
      "type": "root",
      "children": [
        {
          "type": "paragraph",
          "children": [
            {
              "type": "text",
              "value": "List the set of files in this application's Gaia storage bucket.",
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 65,
                  "offset": 64
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 65,
              "offset": 64
            },
            "indent": []
          }
        }
      ],
      "position": {
        "start": {
          "line": 1,
          "column": 1,
          "offset": 0
        },
        "end": {
          "line": 1,
          "column": 65,
          "offset": 64
        }
      }
    },
    "tags": [
      {
        "title": "param",
        "description": "a callback to invoke on each named file that\nreturns `true` to continue the listing operation or `false` to end it",
        "lineNumber": 2,
        "type": {
          "type": "NameExpression",
          "name": "function"
        },
        "name": "callback"
      },
      {
        "title": "return",
        "description": "that resolves to the number of files listed",
        "lineNumber": 4,
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "loc": {
      "start": {
        "line": 556,
        "column": 0
      },
      "end": {
        "line": 561,
        "column": 3
      }
    },
    "context": {
      "loc": {
        "start": {
          "line": 562,
          "column": 0
        },
        "end": {
          "line": 565,
          "column": 1
        }
      },
      "file": "/Users/Yukan/Desktop/work/blockstack/blockstack.js/src/storage/index.js"
    },
    "augments": [],
    "examples": [],
    "params": [
      {
        "title": "param",
        "name": "callback",
        "lineNumber": 2,
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "a callback to invoke on each named file that\nreturns ",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 2,
                      "column": 9,
                      "offset": 53
                    },
                    "indent": [
                      1
                    ]
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "true",
                  "position": {
                    "start": {
                      "line": 2,
                      "column": 9,
                      "offset": 53
                    },
                    "end": {
                      "line": 2,
                      "column": 15,
                      "offset": 59
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " to continue the listing operation or ",
                  "position": {
                    "start": {
                      "line": 2,
                      "column": 15,
                      "offset": 59
                    },
                    "end": {
                      "line": 2,
                      "column": 53,
                      "offset": 97
                    },
                    "indent": []
                  }
                },
                {
                  "type": "inlineCode",
                  "value": "false",
                  "position": {
                    "start": {
                      "line": 2,
                      "column": 53,
                      "offset": 97
                    },
                    "end": {
                      "line": 2,
                      "column": 60,
                      "offset": 104
                    },
                    "indent": []
                  }
                },
                {
                  "type": "text",
                  "value": " to end it",
                  "position": {
                    "start": {
                      "line": 2,
                      "column": 60,
                      "offset": 104
                    },
                    "end": {
                      "line": 2,
                      "column": 70,
                      "offset": 114
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 2,
                  "column": 70,
                  "offset": 114
                },
                "indent": [
                  1
                ]
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 2,
              "column": 70,
              "offset": 114
            }
          }
        },
        "type": {
          "type": "NameExpression",
          "name": "function"
        }
      }
    ],
    "properties": [],
    "returns": [
      {
        "description": {
          "type": "root",
          "children": [
            {
              "type": "paragraph",
              "children": [
                {
                  "type": "text",
                  "value": "that resolves to the number of files listed",
                  "position": {
                    "start": {
                      "line": 1,
                      "column": 1,
                      "offset": 0
                    },
                    "end": {
                      "line": 1,
                      "column": 44,
                      "offset": 43
                    },
                    "indent": []
                  }
                }
              ],
              "position": {
                "start": {
                  "line": 1,
                  "column": 1,
                  "offset": 0
                },
                "end": {
                  "line": 1,
                  "column": 44,
                  "offset": 43
                },
                "indent": []
              }
            }
          ],
          "position": {
            "start": {
              "line": 1,
              "column": 1,
              "offset": 0
            },
            "end": {
              "line": 1,
              "column": 44,
              "offset": 43
            }
          }
        },
        "title": "returns",
        "type": {
          "type": "NameExpression",
          "name": "Promise"
        }
      }
    ],
    "sees": [],
    "throws": [],
    "todos": [],
    "name": "listFiles",
    "kind": "function",
    "members": {
      "global": [],
      "inner": [],
      "instance": [],
      "events": [],
      "static": []
    },
    "path": [
      {
        "name": "listFiles",
        "kind": "function"
      }
    ],
    "namespace": "listFiles"
  }
]