[
  {
    "path": ".github/ISSUE_TEMPLATE/issuer-icon-request.md",
    "content": "---\nname: Issuer Icon Request\nabout: Use this template when asking for an icon to be added to the app.\ntitle: Add an icon for Example\nlabels: icon request\nassignees: ''\n\n---\n\nHi! Could you please add an icon for Example?\n\nTheir website is at https://example.com.\n\nWhen scanning their QR code with Tofu, the account issuer shows up as Example.\n"
  },
  {
    "path": ".gitignore",
    "content": "xcuserdata\n.DS_Store\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of\nexperience, nationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, or to ban temporarily or permanently any\ncontributor for other behaviors that they deem inappropriate, threatening,\noffensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at <conduct@tofuauth.com>. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an\nincident. Further details of specific enforcement policies may be posted\nseparately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 1.4, available at\n[http://contributor-covenant.org/version/1/4][version].\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nWe love pull requests from everyone. By participating in this project, you agree\nto abide by its [code of conduct].\n\n[code of conduct]: https://github.com/calleerlandsson/Tofu/blob/master/CODE_OF_CONDUCT.md\n\n## Getting Started\n\nTo get started contributing to Tofu, follow these steps:\n\n1. Fork and clone the repo.\n2. Make your changes. If you're contributing code, please include tests that\n   fail without your code and pass with it.\n3. Make sure all automated tests pass. One way of running them is to use the ⌘U\n   keyboard shortcut in Xcode.\n4. Submit a pull request\n\nWe try to respond to, if not merge, pull requests as soon as we can.\n"
  },
  {
    "path": "GenerateIssuerIconAssets.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\nget_name() {\n  echo $1 | sed -E 's:.+/(.+)\\.png:\\1:'\n}\n\nwrite_json() {\n  # JSON copied from Xcode output\n  cat << EOF > \"$2\"\n{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"${1}.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"${1}@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"${1}@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\nEOF\n}\n\ncd \"$(dirname \"$0\")\"\nfor file in ./IssuerIcons/*.png; do\n  name=\"$(get_name $file)\"\n  echo \"Generating icon for ${name}\"\n  imageset=\"./Tofu/Assets.xcassets/${name}.imageset/\"\n  mkdir -p \"$imageset\"\n  sips --resampleWidth 192 \"$file\" --out \"${imageset}${name}@3x.png\" >/dev/null\n  sips --resampleWidth 128 \"$file\" --out \"${imageset}${name}@2x.png\" >/dev/null\n  sips --resampleWidth 64 \"$file\" --out \"${imageset}${name}.png\" >/dev/null\n  write_json \"$name\" \"${imageset}Contents.json\"\ndone\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2016 Calle Erlandsson\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Tofu\n\nAn easy-to-use, open-source two-factor authentication app designed specifically\nfor iOS.\n\nTofu generates one-time passwords to help you protect your online accounts.\nThese passwords are used together with your normal password when you sign into\nservices like Google, Facebook, Dropbox, Amazon, and GitHub.\n\nTofu works with all services that provide two-factor authentication using the\nHOTP and TOTP algorithms. It does not require a network or cellular connection\nand can be used in airplane mode.\n\n## New maintainer\n\nHey there, [Calle](https://github.com/calleluks) here, the original author of Tofu Authenticator. Over the last few years I haven’t had as much time to work on the app as I had hoped for. While Tofu has been working fine (I still use the app every day), few improvements have been made and no new platform features have been integrated. Luckily, my friend [Daniel Kennett](https://github.com/ikenndac) who is both a long-time user of Tofu and a way more experienced iOS developer than I am, has offered to take over maintenance and ownership of the app going forward. I’m really thankful for being able to place the app in Daniel’s safe hands and look forward to following the future development of it!\n\n## Installation\n\nTofu is available for free on the App Store.\n\n[![Download on the App Store](https://tofuauth.com/images/app-store.svg)](https://itunes.apple.com/app/tofu-authenticator/id1082229305)\n\n## Issuer icons\n\nHere's how you can help add new icons to the app:\n\n1. Fork and clone this repo.\n\n2. Add your icon to the `IssuerIcons/` directory.\n\n   The icon should be a square PNG without rounded corners and without borders.\n   It must be at least 196x196 pixels but we prefer larger sizes such as\n   1024x1024.\n\n3. Run `./GenerateIssuerIconAssets.sh` from the root of the repo.\n\n4. Add an entry for the icon to [the `imageNames` dictionary](https://github.com/calleerlandsson/Tofu/blob/master/Tofu/AccountCell.swift#L15).\n\n   The key should be the string that shows up in the account's Issuer field\n   when scanning a QR code for the service. The value should be the name of the\n   icon file.\n\n5. Commit your changes and open a PR.\n\nHere's an example commit for adding a new icon: [692e32a](https://github.com/calleerlandsson/Tofu/commit/692e32a9744bcaa360e4d7db9f00c4e90f6f66ac)\n\nIf you don't feel comfortable adding icons yourself, you can ask others to do\nso by [opening issues using the Issuer Icon Request template](https://github.com/calleerlandsson/Tofu/issues/new?labels=icon+request&template=issuer-icon-request.md&title=Add+an+icon+for+Example).\n"
  },
  {
    "path": "Tofu/AppDelegate.swift",
    "content": "import UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n    \n    func application(\n        _ application: UIApplication,\n        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n\n        return true\n    }\n\n    func application(\n        _ application: UIApplication,\n        open url: URL,\n        options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {\n\n        let rootViewController = window!.rootViewController!\n\n        guard let account = Account(url: url) else {\n            let alert = UIAlertController(\n                title: \"Could Not Import Account\",\n                message: \"The account information was not of the expected format.\",\n                preferredStyle: .alert)\n\n            alert.addAction(UIAlertAction(title: \"Close\", style: .default))\n\n            rootViewController.present(alert, animated: true)\n\n            return false\n        }\n\n        let accountsViewController = rootViewController.children.first as! AccountsViewController\n\n        accountsViewController.createAccount(account)\n\n        let alert = UIAlertController(\n            title: \"Account Imported\",\n            message: \"Successfully imported \\(account.description)\",\n            preferredStyle: .alert)\n\n        alert.addAction(UIAlertAction(title: \"OK\", style: .default))\n\n        rootViewController.present(alert, animated: true)\n\n        return true\n    }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/17thShard.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"17thShard.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"17thShard@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"17thShard@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/AWS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AWS.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AWS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AWS@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Adobe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Adobe.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Adobe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Adobe@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Allegro.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Allegro.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Allegro@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Allegro@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Amazon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Amazon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Amazon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Amazon@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/AnonAddy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AnonAddy.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AnonAddy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AnonAddy@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon29@2x-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon40@2x-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"AppIcon-iTC.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Tofu/Assets.xcassets/Atlassian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Atlassian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Atlassian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Atlassian@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Backblaze.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Backblaze.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Backblaze@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Backblaze@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Basecamp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Basecamp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Basecamp@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Basecamp@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Binance.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Binance.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Binance@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Binance@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/BitBay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"BitBay.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"BitBay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"BitBay@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Bitbucket.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitbucket.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitbucket@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitbucket@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Bitstamp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitstamp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitstamp@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitstamp@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Bittrex.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bittrex.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bittrex@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bittrex@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Bitwarden.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitwarden.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitwarden@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Bitwarden@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/CircularProgressViewBorderThick.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CircularProgressViewBorderThick@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CircularProgressViewBorderThick@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Tofu/Assets.xcassets/CircularProgressViewBorderThin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CircularProgressViewBorderThin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CircularProgressViewBorderThin@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "Tofu/Assets.xcassets/Cloudflare.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Cloudflare.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Cloudflare@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Cloudflare@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Coinbase.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Coinbase.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Coinbase@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Coinbase@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Contentful.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Contentful.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Contentful@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Contentful@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/CorporateTrust.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorporateTrust.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorporateTrust@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorporateTrust@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/CyDIS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CyDIS.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CyDIS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CyDIS@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/DNSimple.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DNSimple.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DNSimple@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DNSimple@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/DigitalOcean.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DigitalOcean.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DigitalOcean@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DigitalOcean@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Discord.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Discord.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Discord@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Discord@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Docker.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Docker.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Docker@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Docker@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Dropbox.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Dropbox.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Dropbox@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Dropbox@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/ElectronicArts.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ElectronicArts.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ElectronicArts@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ElectronicArts@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/EpicGames.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"EpicGames.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"EpicGames@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"EpicGames@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Evernote.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Evernote.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Evernote@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Evernote@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Facebook.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Facebook.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Facebook@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Facebook@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/FastMail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"FastMail.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"FastMail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"FastMail@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Fidelity.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Fidelity.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Fidelity@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Fidelity@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Figma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Figma.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Figma@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Figma@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Firefox.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Firefox.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Firefox@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Firefox@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Gandi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gandi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gandi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gandi@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/GitHub.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitHub.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitHub@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitHub@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/GitLab.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitLab.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitLab@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GitLab@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Gitea.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gitea.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gitea@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Gitea@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/GoDaddy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GoDaddy.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GoDaddy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GoDaddy@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Google.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Google.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Google@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Google@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/GreenAddress.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GreenAddress.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GreenAddress@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"GreenAddress@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/HEY.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HEY.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HEY@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HEY@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/HackTheBox.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"hackthebox.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"hackthebox@2x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"hackthebox@3x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Heroku.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Heroku.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Heroku@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Heroku@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Hetzner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hetzner.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hetzner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hetzner@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/HomeAssistant.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HomeAssistant.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HomeAssistant@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HomeAssistant@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Honeybadger.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Honeybadger.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Honeybadger@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Honeybadger@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Hostek.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hostek.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hostek@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hostek@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Hover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hover.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Hover@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/HumbleBundle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HumbleBundle.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HumbleBundle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"HumbleBundle@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/IDme.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IDme.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IDme@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IDme@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/IFTTT.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IFTTT.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IFTTT@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IFTTT@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Instagram.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Instagram.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Instagram@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Instagram@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Intercom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Intercom.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Intercom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Intercom@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/JetBrains.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"JetBrains.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"JetBrains@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"JetBrains@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Kickstarter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Kickstarter.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Kickstarter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Kickstarter@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/LastPass.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LastPass.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LastPass@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LastPass@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/LinkedIn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LinkedIn.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LinkedIn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LinkedIn@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Linode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Linode.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Linode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Linode@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Lobsters.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Lobsters.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Lobsters@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Lobsters@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/LocalBitcoins.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LocalBitcoins.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LocalBitcoins@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LocalBitcoins@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Mailchimp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mailchimp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mailchimp@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mailchimp@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Mastodon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mastodon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mastodon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mastodon@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Mega.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mega.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mega@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Mega@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Microsoft.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Microsoft.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Microsoft@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Microsoft@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Name.com.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Name.com.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Name.com@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Name.com@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Netlify.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Netlify.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Netlify@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Netlify@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Nextcloud.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nextcloud.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nextcloud@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nextcloud@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/NexusMods.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NexusMods.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NexusMods@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NexusMods@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/NiceHash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NiceHash.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NiceHash@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NiceHash@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Nintendo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nintendo.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nintendo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nintendo@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Njalla.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Njalla.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Njalla@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Njalla@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Nodecraft.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nodecraft.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nodecraft@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Nodecraft@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/NordPass.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NordPass.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NordPass@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NordPass@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/PaladinExtensions.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PaladinExtensions.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PaladinExtensions@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PaladinExtensions@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Parler.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Parler.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Parler@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Parler@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/PayPal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PayPal.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PayPal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PayPal@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/PhilipsHue.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PhilipsHue.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PhilipsHue@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PhilipsHue@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Posteo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Posteo.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Posteo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Posteo@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Postmark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Postmark.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Postmark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Postmark@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Privacy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Privacy.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Privacy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Privacy@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/ProfitBricks.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProfitBricks.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProfitBricks@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProfitBricks@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/ProtonMail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProtonMail.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProtonMail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ProtonMail@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Prusa.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Prusa.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Prusa@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Prusa@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/PrusaAccount.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PrusaAccount.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PrusaAccount@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PrusaAccount@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Reddit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Reddit.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Reddit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Reddit@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Robinhood.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Robinhood.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Robinhood@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Robinhood@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/RubyGems.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RubyGems.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RubyGems@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RubyGems@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/RuneScape.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RuneScape.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RuneScape@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RuneScape@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/STACK.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"STACK.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"STACK@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"STACK@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/SimpleLogin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"SimpleLogin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"SimpleLogin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"SimpleLogin@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Slack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Slack.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Slack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Slack@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Snapchat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Snapchat.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Snapchat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Snapchat@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Sony.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Sony.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Sony@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Sony@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Squarespace.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Squarespace.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Squarespace@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Squarespace@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/StandardNotes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"StandardNotes.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"StandardNotes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"StandardNotes@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Stripe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Stripe.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Stripe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Stripe@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Surfshark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Surfshark.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Surfshark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Surfshark@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/TETR.IO.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TETR.IO.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TETR.IO@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TETR.IO@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Time4VPS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Time4VPS.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Time4VPS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Time4VPS@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/TorGuard.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TorGuard.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TorGuard@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TorGuard@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Tresorit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tresorit.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tresorit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tresorit@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Tumblr.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tumblr.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tumblr@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tumblr@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/TurboTax.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TurboTax.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TurboTax@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"TurboTax@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Tutanota.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tutanota.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tutanota@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tutanota@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Tweakers.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tweakers.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tweakers@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Tweakers@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Twilio.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twilio.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twilio@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twilio@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Twitch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitch.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitch@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitch@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Twitter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitter.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Twitter@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Uber.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Uber.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Uber@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Uber@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Ubisoft.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ubisoft.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ubisoft@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ubisoft@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Unity.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Unity.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Unity@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Unity@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/VKontakte.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VKontakte.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VKontakte@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VKontakte@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Wallabag.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Wallabag.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Wallabag@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Wallabag@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/WordPress.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WordPress.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WordPress@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WordPress@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/YNAB.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"YNAB.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"YNAB@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"YNAB@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/Zoom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Zoom.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Zoom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Zoom@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Assets.xcassets/ownCloud.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ownCloud.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ownCloud@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ownCloud@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Tofu/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"9531\" systemVersion=\"15C50\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9529\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Tofu/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"nkx-Kv-qqz\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Add Account-->\n        <scene sceneID=\"Cvd-WL-bZB\">\n            <objects>\n                <viewController id=\"I3F-x1-Uca\" customClass=\"ScanningViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"ZUh-E7-1wK\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"SqE-V3-zwh\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Y7o-gx-74K\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"647\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"964-37-yur\">\n                                <rect key=\"frame\" x=\"16\" y=\"272\" width=\"343\" height=\"103.5\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"To add an account by scanning a QR code, please allow Tofu to access your camera in the Settings application.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QSo-RK-FII\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"343\" height=\"50.5\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                        <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"No Camera Access\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VOq-gD-H4m\">\n                                        <rect key=\"frame\" x=\"8\" y=\"8\" width=\"327\" height=\"29\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"24\"/>\n                                        <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailingMargin\" secondItem=\"VOq-gD-H4m\" secondAttribute=\"trailing\" id=\"2ak-bF-ZNV\"/>\n                                    <constraint firstItem=\"VOq-gD-H4m\" firstAttribute=\"top\" secondItem=\"964-37-yur\" secondAttribute=\"topMargin\" id=\"LxM-yn-CnD\"/>\n                                    <constraint firstItem=\"VOq-gD-H4m\" firstAttribute=\"leading\" secondItem=\"964-37-yur\" secondAttribute=\"leadingMargin\" id=\"Np2-bg-05n\"/>\n                                    <constraint firstItem=\"QSo-RK-FII\" firstAttribute=\"top\" secondItem=\"VOq-gD-H4m\" secondAttribute=\"bottom\" constant=\"8\" id=\"PGI-i7-H6e\"/>\n                                    <constraint firstItem=\"QSo-RK-FII\" firstAttribute=\"leading\" secondItem=\"964-37-yur\" secondAttribute=\"leading\" id=\"fc6-je-Fng\"/>\n                                    <constraint firstAttribute=\"bottomMargin\" secondItem=\"QSo-RK-FII\" secondAttribute=\"bottom\" id=\"iCy-wQ-HvK\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"QSo-RK-FII\" secondAttribute=\"trailing\" id=\"xmj-ui-9Hl\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"964-37-yur\" firstAttribute=\"centerY\" secondItem=\"Y7o-gx-74K\" secondAttribute=\"centerY\" id=\"YQ2-Bn-vd1\"/>\n                            <constraint firstItem=\"964-37-yur\" firstAttribute=\"leading\" secondItem=\"Y7o-gx-74K\" secondAttribute=\"leadingMargin\" id=\"eHq-nS-la4\"/>\n                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"964-37-yur\" secondAttribute=\"trailing\" id=\"onr-1Y-n1r\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Add Account\" id=\"G5L-6K-n5t\">\n                        <barButtonItem key=\"leftBarButtonItem\" systemItem=\"cancel\" id=\"t02-9l-NcV\">\n                            <connections>\n                                <action selector=\"didPressCancel:\" destination=\"I3F-x1-Uca\" id=\"9f4-zp-3H8\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"allowCameraAccessView\" destination=\"964-37-yur\" id=\"vKo-Wj-meQ\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"TSJ-k5-Por\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2166\" y=\"96\"/>\n        </scene>\n        <!--Accounts-->\n        <scene sceneID=\"eJy-We-MJo\">\n            <objects>\n                <tableViewController definesPresentationContext=\"YES\" id=\"bOu-aX-zXX\" customClass=\"AccountsViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" allowsSelectionDuringEditing=\"YES\" rowHeight=\"84\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"CH7-nX-hsd\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" showsReorderControl=\"YES\" indentationWidth=\"10\" reuseIdentifier=\"AccountCell\" editingAccessoryType=\"disclosureIndicator\" id=\"xpz-Pg-oK7\" customClass=\"AccountCell\" customModule=\"Tofu\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"375\" height=\"84\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"xpz-Pg-oK7\" id=\"Zor-2e-g7q\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"84\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oPs-iT-b8F\">\n                                            <rect key=\"frame\" x=\"16\" y=\"10\" width=\"64\" height=\"64\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"64\" id=\"Dn5-np-gTx\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"64\" id=\"zjG-If-dUP\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AVc-5o-PUk\">\n                                            <rect key=\"frame\" x=\"90\" y=\"10.5\" width=\"259\" height=\"63\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"012 345\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumScaleFactor=\"0.5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kuh-hx-0vn\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"-4\" width=\"259\" height=\"53\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"44\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Example (test@example.com)\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S0M-xR-VeY\">\n                                                    <rect key=\"frame\" x=\"1\" y=\"45\" width=\"258\" height=\"18\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"15\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"S0M-xR-VeY\" firstAttribute=\"top\" secondItem=\"kuh-hx-0vn\" secondAttribute=\"bottom\" constant=\"-4\" id=\"DtD-gk-rhr\"/>\n                                                <constraint firstItem=\"kuh-hx-0vn\" firstAttribute=\"top\" secondItem=\"AVc-5o-PUk\" secondAttribute=\"top\" constant=\"-4\" id=\"N82-Rp-eOG\"/>\n                                                <constraint firstItem=\"kuh-hx-0vn\" firstAttribute=\"top\" secondItem=\"S0M-xR-VeY\" secondAttribute=\"bottom\" id=\"QmR-d0-PvZ\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"S0M-xR-VeY\" secondAttribute=\"bottom\" id=\"U66-XA-dxf\"/>\n                                                <constraint firstItem=\"S0M-xR-VeY\" firstAttribute=\"leading\" secondItem=\"AVc-5o-PUk\" secondAttribute=\"leading\" constant=\"1\" id=\"aUW-Tz-Gup\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"S0M-xR-VeY\" secondAttribute=\"trailing\" id=\"bja-Jr-CGz\"/>\n                                                <constraint firstItem=\"kuh-hx-0vn\" firstAttribute=\"top\" secondItem=\"S0M-xR-VeY\" secondAttribute=\"bottom\" id=\"ifn-B8-o1g\"/>\n                                                <constraint firstItem=\"kuh-hx-0vn\" firstAttribute=\"leading\" secondItem=\"AVc-5o-PUk\" secondAttribute=\"leading\" id=\"rk4-vG-rqV\"/>\n                                                <constraint firstItem=\"S0M-xR-VeY\" firstAttribute=\"top\" secondItem=\"kuh-hx-0vn\" secondAttribute=\"top\" id=\"w5J-wK-Gum\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"kuh-hx-0vn\" secondAttribute=\"trailing\" id=\"xv2-Zg-oKh\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"QmR-d0-PvZ\"/>\n                                                    <exclude reference=\"ifn-B8-o1g\"/>\n                                                    <exclude reference=\"w5J-wK-Gum\"/>\n                                                </mask>\n                                            </variation>\n                                        </view>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"?\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wMT-Jm-ygj\">\n                                            <rect key=\"frame\" x=\"39.5\" y=\"20.5\" width=\"17\" height=\"43\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"ultraLight\" pointSize=\"36\"/>\n                                            <color key=\"textColor\" systemColor=\"tertiaryLabelColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"AVc-5o-PUk\" firstAttribute=\"leading\" secondItem=\"oPs-iT-b8F\" secondAttribute=\"trailing\" constant=\"10\" id=\"82O-j3-8aN\"/>\n                                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"AVc-5o-PUk\" secondAttribute=\"trailing\" constant=\"10\" id=\"Mg9-dJ-khj\"/>\n                                        <constraint firstItem=\"wMT-Jm-ygj\" firstAttribute=\"centerX\" secondItem=\"oPs-iT-b8F\" secondAttribute=\"centerX\" id=\"Nqn-2y-prV\"/>\n                                        <constraint firstItem=\"wMT-Jm-ygj\" firstAttribute=\"centerY\" secondItem=\"oPs-iT-b8F\" secondAttribute=\"centerY\" id=\"RjH-lT-vDX\"/>\n                                        <constraint firstItem=\"oPs-iT-b8F\" firstAttribute=\"centerY\" secondItem=\"Zor-2e-g7q\" secondAttribute=\"centerY\" id=\"rf0-aj-3Nw\"/>\n                                        <constraint firstItem=\"oPs-iT-b8F\" firstAttribute=\"leading\" secondItem=\"Zor-2e-g7q\" secondAttribute=\"leadingMargin\" id=\"tz5-ui-ym2\"/>\n                                        <constraint firstItem=\"AVc-5o-PUk\" firstAttribute=\"centerY\" secondItem=\"Zor-2e-g7q\" secondAttribute=\"centerY\" id=\"zwv-gB-bgJ\"/>\n                                    </constraints>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <outlet property=\"accountImageView\" destination=\"oPs-iT-b8F\" id=\"r8w-J4-8lf\"/>\n                                    <outlet property=\"identifierLabel\" destination=\"S0M-xR-VeY\" id=\"eXU-1X-Uwo\"/>\n                                    <outlet property=\"issuerLabel\" destination=\"wMT-Jm-ygj\" id=\"joU-Ty-sig\"/>\n                                    <outlet property=\"valueLabel\" destination=\"kuh-hx-0vn\" id=\"NV7-fj-bZQ\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"bOu-aX-zXX\" id=\"QCb-RT-fC5\"/>\n                            <outlet property=\"delegate\" destination=\"bOu-aX-zXX\" id=\"6qu-NV-7lB\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Accounts\" id=\"QD1-ot-U1H\">\n                        <barButtonItem key=\"rightBarButtonItem\" systemItem=\"add\" id=\"JTL-yM-y0g\">\n                            <connections>\n                                <action selector=\"addAccount:\" destination=\"bOu-aX-zXX\" id=\"Gxq-TA-Oug\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"emptyView\" destination=\"hT8-ZY-D3A\" id=\"eqL-UC-LWT\"/>\n                        <segue destination=\"ERk-zj-Q6A\" kind=\"show\" identifier=\"EditAccountSegue\" id=\"rWD-gI-uHe\"/>\n                        <segue destination=\"fMR-de-62D\" kind=\"presentation\" identifier=\"ScanSegue\" id=\"Eo2-wA-mmS\"/>\n                        <segue destination=\"yTV-zU-3QS\" kind=\"presentation\" identifier=\"EnterManuallySegue\" id=\"sz3-ZJ-SNl\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"RZK-WF-dPC\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <view contentMode=\"scaleToFill\" id=\"hT8-ZY-D3A\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"240\" height=\"128\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NHh-Ks-F0R\">\n                            <rect key=\"frame\" x=\"16\" y=\"21\" width=\"208\" height=\"86.5\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Add one by tapping the add button in the upper right corner.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iub-lm-UUY\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"208\" height=\"33.5\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                    <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"No Accounts\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RGz-NF-3aU\">\n                                    <rect key=\"frame\" x=\"8\" y=\"8\" width=\"192\" height=\"29\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"24\"/>\n                                    <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <constraints>\n                                <constraint firstItem=\"iub-lm-UUY\" firstAttribute=\"leading\" secondItem=\"NHh-Ks-F0R\" secondAttribute=\"leading\" id=\"2BF-CA-u6f\"/>\n                                <constraint firstItem=\"iub-lm-UUY\" firstAttribute=\"top\" secondItem=\"RGz-NF-3aU\" secondAttribute=\"bottom\" constant=\"8\" id=\"4ub-V1-vTw\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"iub-lm-UUY\" secondAttribute=\"trailing\" id=\"Bb5-ss-CAr\"/>\n                                <constraint firstAttribute=\"bottomMargin\" secondItem=\"iub-lm-UUY\" secondAttribute=\"bottom\" id=\"EAB-pt-d9C\"/>\n                                <constraint firstItem=\"RGz-NF-3aU\" firstAttribute=\"top\" secondItem=\"NHh-Ks-F0R\" secondAttribute=\"topMargin\" id=\"ilP-Rf-Ydi\"/>\n                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"RGz-NF-3aU\" secondAttribute=\"trailing\" id=\"tvl-mg-btC\"/>\n                                <constraint firstItem=\"RGz-NF-3aU\" firstAttribute=\"leading\" secondItem=\"NHh-Ks-F0R\" secondAttribute=\"leadingMargin\" id=\"zIc-ha-jWl\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <constraints>\n                        <constraint firstItem=\"NHh-Ks-F0R\" firstAttribute=\"leading\" secondItem=\"hT8-ZY-D3A\" secondAttribute=\"leadingMargin\" id=\"0NQ-Lv-ccR\"/>\n                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"NHh-Ks-F0R\" secondAttribute=\"trailing\" id=\"2FO-d5-1lx\"/>\n                        <constraint firstItem=\"NHh-Ks-F0R\" firstAttribute=\"centerY\" secondItem=\"hT8-ZY-D3A\" secondAttribute=\"centerY\" id=\"Vdh-wl-iNf\"/>\n                    </constraints>\n                </view>\n            </objects>\n            <point key=\"canvasLocation\" x=\"87\" y=\"459\"/>\n        </scene>\n        <!--Edit Account-->\n        <scene sceneID=\"shn-2G-AZX\">\n            <objects>\n                <tableViewController id=\"ERk-zj-Q6A\" customClass=\"AccountUpdateViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" separatorStyle=\"default\" allowsSelection=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"18\" sectionFooterHeight=\"18\" id=\"Flh-7t-GjH\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"groupTableViewBackgroundColor\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Display\" id=\"OPD-Ia-5ZL\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"Awa-te-ZQi\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"55.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"Awa-te-ZQi\" id=\"rsx-Y5-IhP\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" text=\"test@example.com\" placeholder=\"Name\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HKm-Ia-bHS\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"359\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"50W-oD-lKM\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"HKm-Ia-bHS\" firstAttribute=\"leading\" secondItem=\"rsx-Y5-IhP\" secondAttribute=\"leadingMargin\" id=\"68u-86-C5j\"/>\n                                                <constraint firstItem=\"HKm-Ia-bHS\" firstAttribute=\"top\" secondItem=\"rsx-Y5-IhP\" secondAttribute=\"top\" id=\"Ndc-4D-YGz\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"HKm-Ia-bHS\" secondAttribute=\"trailing\" id=\"SH6-r8-L0e\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"HKm-Ia-bHS\" secondAttribute=\"bottom\" id=\"sTW-FC-ZCP\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"5ET-nQ-wKW\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"99.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"5ET-nQ-wKW\" id=\"G0d-Sj-yaL\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" text=\"Example\" placeholder=\"Issuer\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"agH-Lg-BOE\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"359\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"NoQ-LD-MHT\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"agH-Lg-BOE\" secondAttribute=\"bottom\" id=\"08v-fA-sy9\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"agH-Lg-BOE\" secondAttribute=\"trailing\" id=\"6FA-0G-cs8\"/>\n                                                <constraint firstItem=\"agH-Lg-BOE\" firstAttribute=\"leading\" secondItem=\"G0d-Sj-yaL\" secondAttribute=\"leadingMargin\" id=\"FrO-J5-4Bd\"/>\n                                                <constraint firstItem=\"agH-Lg-BOE\" firstAttribute=\"top\" secondItem=\"G0d-Sj-yaL\" secondAttribute=\"top\" id=\"aMf-1x-7eA\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"ERk-zj-Q6A\" id=\"Lum-DP-HU3\"/>\n                            <outlet property=\"delegate\" destination=\"ERk-zj-Q6A\" id=\"wbU-ej-fRc\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Edit Account\" largeTitleDisplayMode=\"never\" id=\"Ogh-nQ-SzX\"/>\n                    <connections>\n                        <outlet property=\"issuerField\" destination=\"agH-Lg-BOE\" id=\"WTi-Bz-0YE\"/>\n                        <outlet property=\"nameField\" destination=\"HKm-Ia-bHS\" id=\"m5a-sw-8U2\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"xAt-39-x93\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"86\" y=\"1210\"/>\n        </scene>\n        <!--Add Account-->\n        <scene sceneID=\"EfE-dR-QMF\">\n            <objects>\n                <tableViewController id=\"paP-7e-SE0\" customClass=\"AccountCreationViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"18\" sectionFooterHeight=\"18\" id=\"tne-qv-Me8\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"647\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"groupTableViewBackgroundColor\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Display\" id=\"gdN-Ye-UUr\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"WKR-La-e5Q\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"55.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"WKR-La-e5Q\" id=\"vux-RZ-ucS\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Name\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"H3V-Eb-wcl\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"359\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"kkd-hn-Go4\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"H3V-Eb-wcl\" firstAttribute=\"top\" secondItem=\"vux-RZ-ucS\" secondAttribute=\"top\" id=\"1xA-DL-9dH\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"H3V-Eb-wcl\" secondAttribute=\"bottom\" id=\"YTX-rZ-1Kd\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"H3V-Eb-wcl\" secondAttribute=\"trailing\" id=\"cZM-zJ-8w8\"/>\n                                                <constraint firstItem=\"H3V-Eb-wcl\" firstAttribute=\"leading\" secondItem=\"vux-RZ-ucS\" secondAttribute=\"leadingMargin\" id=\"iTr-ZG-Doh\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"2sG-OR-j28\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"99.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"2sG-OR-j28\" id=\"CMm-zw-ybS\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Issuer\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"df2-wV-cFm\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"359\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"R7V-Iv-ySL\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"df2-wV-cFm\" firstAttribute=\"leading\" secondItem=\"CMm-zw-ybS\" secondAttribute=\"leadingMargin\" id=\"5Mi-tK-tcA\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"df2-wV-cFm\" secondAttribute=\"trailing\" id=\"DpX-Pq-Yh4\"/>\n                                                <constraint firstItem=\"df2-wV-cFm\" firstAttribute=\"top\" secondItem=\"CMm-zw-ybS\" secondAttribute=\"top\" id=\"JpI-wO-6Zz\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"df2-wV-cFm\" secondAttribute=\"bottom\" id=\"myn-Iv-07v\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Details\" id=\"K0Y-0M-mzD\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"1w4-M9-lQ1\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"199.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"1w4-M9-lQ1\" id=\"ifn-NR-Tgv\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"Secret\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jBF-0n-DLb\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"359\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\" keyboardType=\"alphabet\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"3Ui-rk-wo7\"/>\n                                                    </connections>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"jBF-0n-DLb\" firstAttribute=\"top\" secondItem=\"ifn-NR-Tgv\" secondAttribute=\"top\" id=\"Mp2-TN-8XS\"/>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"jBF-0n-DLb\" secondAttribute=\"bottom\" id=\"b6v-Nu-b1l\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"jBF-0n-DLb\" secondAttribute=\"trailing\" id=\"eY5-Mn-CaA\"/>\n                                                <constraint firstItem=\"jBF-0n-DLb\" firstAttribute=\"leading\" secondItem=\"ifn-NR-Tgv\" secondAttribute=\"leadingMargin\" id=\"fog-T0-q0d\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" textLabel=\"buM-CA-edQ\" detailTextLabel=\"ya0-u2-x0a\" style=\"IBUITableViewCellStyleValue1\" id=\"kxL-Xc-94s\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"243.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"kxL-Xc-94s\" id=\"9CF-bF-0me\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"348\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Algorithm\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"buM-CA-edQ\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"13\" width=\"70.5\" height=\"19.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"SHA1\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"ya0-u2-x0a\">\n                                                    <rect key=\"frame\" x=\"301.5\" y=\"13\" width=\"38.5\" height=\"19.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" red=\"0.55686274509803924\" green=\"0.55686274509803924\" blue=\"0.57647058823529407\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                        <connections>\n                                            <segue destination=\"EPo-Jj-mKT\" kind=\"show\" id=\"qHo-Cb-rBv\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"hM1-Cj-zIU\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"287.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"hM1-Cj-zIU\" id=\"jsg-Cn-TRW\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Eight digits\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xFw-JK-Cmq\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"11.5\" width=\"278\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0gM-IY-7nI\">\n                                                    <rect key=\"frame\" x=\"302\" y=\"6.5\" width=\"51\" height=\"31\"/>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"xFw-JK-Cmq\" firstAttribute=\"leading\" secondItem=\"jsg-Cn-TRW\" secondAttribute=\"leadingMargin\" id=\"7GS-hW-zbc\"/>\n                                                <constraint firstItem=\"0gM-IY-7nI\" firstAttribute=\"leading\" secondItem=\"xFw-JK-Cmq\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"Be3-lU-3el\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"0gM-IY-7nI\" secondAttribute=\"trailing\" constant=\"8\" id=\"Hfj-XW-irw\"/>\n                                                <constraint firstItem=\"xFw-JK-Cmq\" firstAttribute=\"centerY\" secondItem=\"jsg-Cn-TRW\" secondAttribute=\"centerY\" id=\"V3Y-1W-Oxj\"/>\n                                                <constraint firstItem=\"0gM-IY-7nI\" firstAttribute=\"centerY\" secondItem=\"jsg-Cn-TRW\" secondAttribute=\"centerY\" id=\"tHn-uv-f1G\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"fC0-23-SKh\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"331.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"fC0-23-SKh\" id=\"K8h-dm-pIT\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Time based\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YDo-nS-Jmv\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"11.5\" width=\"278\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"veQ-Xe-FIX\">\n                                                    <rect key=\"frame\" x=\"302\" y=\"6.5\" width=\"51\" height=\"31\"/>\n                                                    <connections>\n                                                        <action selector=\"valueChangedForTimeBasedSwitch\" destination=\"paP-7e-SE0\" eventType=\"valueChanged\" id=\"LED-gv-7Md\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"veQ-Xe-FIX\" secondAttribute=\"trailing\" constant=\"8\" id=\"1Ho-0l-8hV\"/>\n                                                <constraint firstItem=\"veQ-Xe-FIX\" firstAttribute=\"leading\" secondItem=\"YDo-nS-Jmv\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"7LY-qa-wD6\"/>\n                                                <constraint firstItem=\"YDo-nS-Jmv\" firstAttribute=\"leading\" secondItem=\"K8h-dm-pIT\" secondAttribute=\"leadingMargin\" id=\"QSj-Mj-LF8\"/>\n                                                <constraint firstItem=\"YDo-nS-Jmv\" firstAttribute=\"centerY\" secondItem=\"K8h-dm-pIT\" secondAttribute=\"centerY\" id=\"Vx7-mr-n8q\"/>\n                                                <constraint firstItem=\"veQ-Xe-FIX\" firstAttribute=\"centerY\" secondItem=\"K8h-dm-pIT\" secondAttribute=\"centerY\" id=\"zGC-UR-w3j\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"Gnt-ZA-6Kq\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"375.5\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"Gnt-ZA-6Kq\" id=\"0gY-vK-2qQ\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"30\" textAlignment=\"natural\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fvK-Gg-1Yw\">\n                                                    <rect key=\"frame\" x=\"73\" y=\"0.0\" width=\"302\" height=\"44\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\" keyboardType=\"numberPad\"/>\n                                                    <connections>\n                                                        <action selector=\"editingChangedForTextField:\" destination=\"paP-7e-SE0\" eventType=\"editingChanged\" id=\"bnP-zU-Smv\"/>\n                                                    </connections>\n                                                </textField>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Period\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vtS-NL-KFI\">\n                                                    <rect key=\"frame\" x=\"16\" y=\"11.5\" width=\"49\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"fvK-Gg-1Yw\" secondAttribute=\"bottom\" id=\"6b6-ew-ZqF\"/>\n                                                <constraint firstItem=\"fvK-Gg-1Yw\" firstAttribute=\"top\" secondItem=\"0gY-vK-2qQ\" secondAttribute=\"top\" id=\"Dv4-1x-9z9\"/>\n                                                <constraint firstItem=\"vtS-NL-KFI\" firstAttribute=\"leading\" secondItem=\"0gY-vK-2qQ\" secondAttribute=\"leadingMargin\" id=\"KtX-kB-YYr\"/>\n                                                <constraint firstItem=\"fvK-Gg-1Yw\" firstAttribute=\"leading\" secondItem=\"vtS-NL-KFI\" secondAttribute=\"trailing\" constant=\"8\" id=\"aMf-25-YJg\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"fvK-Gg-1Yw\" secondAttribute=\"trailing\" id=\"ebm-GH-tYx\"/>\n                                                <constraint firstItem=\"vtS-NL-KFI\" firstAttribute=\"centerY\" secondItem=\"0gY-vK-2qQ\" secondAttribute=\"centerY\" id=\"leD-Y9-JIW\"/>\n                                                <constraint firstItem=\"fvK-Gg-1Yw\" firstAttribute=\"leading\" secondItem=\"0gY-vK-2qQ\" secondAttribute=\"leadingMargin\" constant=\"8\" id=\"vOl-EC-hID\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"vOl-EC-hID\"/>\n                                                </mask>\n                                            </variation>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"paP-7e-SE0\" id=\"Aei-rD-IB8\"/>\n                            <outlet property=\"delegate\" destination=\"paP-7e-SE0\" id=\"Shk-pE-Ock\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Add Account\" id=\"CVg-F9-sJ7\">\n                        <barButtonItem key=\"leftBarButtonItem\" systemItem=\"cancel\" id=\"rqL-eo-CGV\">\n                            <connections>\n                                <action selector=\"didPressCancel:\" destination=\"paP-7e-SE0\" id=\"N8U-nq-O45\"/>\n                            </connections>\n                        </barButtonItem>\n                        <barButtonItem key=\"rightBarButtonItem\" enabled=\"NO\" systemItem=\"done\" id=\"SYd-13-MGt\">\n                            <connections>\n                                <action selector=\"didPressDone:\" destination=\"paP-7e-SE0\" id=\"hB0-oY-Pb6\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"algorithmLabel\" destination=\"ya0-u2-x0a\" id=\"M76-3q-IdM\"/>\n                        <outlet property=\"doneItem\" destination=\"SYd-13-MGt\" id=\"bPh-jW-7wC\"/>\n                        <outlet property=\"eightDigitsSwitch\" destination=\"0gM-IY-7nI\" id=\"8mK-d8-bJS\"/>\n                        <outlet property=\"issuerField\" destination=\"df2-wV-cFm\" id=\"FYX-Qv-isO\"/>\n                        <outlet property=\"nameField\" destination=\"H3V-Eb-wcl\" id=\"1V2-DF-66g\"/>\n                        <outlet property=\"periodCounterCell\" destination=\"Gnt-ZA-6Kq\" id=\"PN3-8b-l7t\"/>\n                        <outlet property=\"periodCounterField\" destination=\"fvK-Gg-1Yw\" id=\"nJI-fX-fIQ\"/>\n                        <outlet property=\"periodCounterLabel\" destination=\"vtS-NL-KFI\" id=\"3dV-d1-61Y\"/>\n                        <outlet property=\"secretField\" destination=\"jBF-0n-DLb\" id=\"3Jl-hm-sw3\"/>\n                        <outlet property=\"timeBasedSwitch\" destination=\"veQ-Xe-FIX\" id=\"qMy-mo-JAH\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"gXl-Go-K0m\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2166\" y=\"863\"/>\n        </scene>\n        <!--Algorithm-->\n        <scene sceneID=\"Z6Y-tk-aSh\">\n            <objects>\n                <tableViewController id=\"EPo-Jj-mKT\" customClass=\"AlgorithmsViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"PMa-2f-5kk\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"647\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"AlgorithmCell\" textLabel=\"5Py-FS-moK\" style=\"IBUITableViewCellStyleDefault\" id=\"uo2-Up-1mv\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"375\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"uo2-Up-1mv\" id=\"Lmz-CM-uYu\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"SHA1\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"5Py-FS-moK\">\n                                            <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"343\" height=\"44\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"EPo-Jj-mKT\" id=\"5Xo-n1-w7n\"/>\n                            <outlet property=\"delegate\" destination=\"EPo-Jj-mKT\" id=\"oNU-NP-HPl\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Algorithm\" id=\"aYa-4m-4vv\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"I5s-KS-GkW\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"3076\" y=\"862\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"9ta-rc-HC8\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"nkx-Kv-qqz\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" largeTitles=\"YES\" id=\"8ap-TA-U0q\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"96\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"bOu-aX-zXX\" kind=\"relationship\" relationship=\"rootViewController\" id=\"d4N-G7-0cE\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"h3W-ZH-MHn\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-750\" y=\"460\"/>\n        </scene>\n        <!--Account Search Results View Controller-->\n        <scene sceneID=\"aqF-ES-gLR\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"AccountSearchResultsViewController\" id=\"sSp-X7-dXp\" customClass=\"AccountSearchResultsViewController\" customModule=\"Tofu\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"84\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"rcD-1Q-m4Q\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" showsReorderControl=\"YES\" indentationWidth=\"10\" reuseIdentifier=\"AccountCell\" editingAccessoryType=\"disclosureIndicator\" id=\"vUX-eq-yhI\" customClass=\"AccountCell\" customModule=\"Tofu\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"375\" height=\"84\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" tableViewCell=\"vUX-eq-yhI\" id=\"zV8-t9-Xea\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"84\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OqZ-2E-QdG\">\n                                            <rect key=\"frame\" x=\"16\" y=\"10\" width=\"64\" height=\"64\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"64\" id=\"7ee-yQ-kfJ\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"64\" id=\"Epl-9c-aST\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"?\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Jfp-qZ-bht\">\n                                            <rect key=\"frame\" x=\"39.5\" y=\"20.5\" width=\"17\" height=\"43\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"ultraLight\" pointSize=\"36\"/>\n                                            <color key=\"textColor\" systemColor=\"tertiaryLabelColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7Nf-UQ-uOc\">\n                                            <rect key=\"frame\" x=\"90\" y=\"10.5\" width=\"259\" height=\"63\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"012 345\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumScaleFactor=\"0.5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vJ5-cX-O3i\">\n                                                    <rect key=\"frame\" x=\"0.0\" y=\"-4\" width=\"259\" height=\"53\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"44\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Example (test@example.com)\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QVG-tW-0HS\">\n                                                    <rect key=\"frame\" x=\"1\" y=\"45\" width=\"258\" height=\"18\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"medium\" pointSize=\"15\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottom\" secondItem=\"QVG-tW-0HS\" secondAttribute=\"bottom\" id=\"6vk-3j-QoM\"/>\n                                                <constraint firstItem=\"QVG-tW-0HS\" firstAttribute=\"top\" secondItem=\"vJ5-cX-O3i\" secondAttribute=\"bottom\" constant=\"-4\" id=\"L8O-Dm-nTy\"/>\n                                                <constraint firstItem=\"vJ5-cX-O3i\" firstAttribute=\"top\" secondItem=\"QVG-tW-0HS\" secondAttribute=\"bottom\" id=\"LlH-fJ-iBa\"/>\n                                                <constraint firstItem=\"vJ5-cX-O3i\" firstAttribute=\"top\" secondItem=\"QVG-tW-0HS\" secondAttribute=\"bottom\" id=\"W4D-nn-rDb\"/>\n                                                <constraint firstItem=\"vJ5-cX-O3i\" firstAttribute=\"top\" secondItem=\"7Nf-UQ-uOc\" secondAttribute=\"top\" constant=\"-4\" id=\"a3O-jc-W86\"/>\n                                                <constraint firstItem=\"QVG-tW-0HS\" firstAttribute=\"top\" secondItem=\"vJ5-cX-O3i\" secondAttribute=\"top\" id=\"fAb-Bd-2uO\"/>\n                                                <constraint firstItem=\"vJ5-cX-O3i\" firstAttribute=\"leading\" secondItem=\"7Nf-UQ-uOc\" secondAttribute=\"leading\" id=\"fpc-Mz-axz\"/>\n                                                <constraint firstItem=\"QVG-tW-0HS\" firstAttribute=\"leading\" secondItem=\"7Nf-UQ-uOc\" secondAttribute=\"leading\" constant=\"1\" id=\"gam-gy-x7I\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"vJ5-cX-O3i\" secondAttribute=\"trailing\" id=\"ozS-KQ-4fr\"/>\n                                                <constraint firstAttribute=\"trailing\" secondItem=\"QVG-tW-0HS\" secondAttribute=\"trailing\" id=\"zcX-DM-zy2\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"LlH-fJ-iBa\"/>\n                                                    <exclude reference=\"W4D-nn-rDb\"/>\n                                                    <exclude reference=\"fAb-Bd-2uO\"/>\n                                                </mask>\n                                            </variation>\n                                        </view>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"Jfp-qZ-bht\" firstAttribute=\"centerX\" secondItem=\"OqZ-2E-QdG\" secondAttribute=\"centerX\" id=\"5sl-On-QRD\"/>\n                                        <constraint firstItem=\"7Nf-UQ-uOc\" firstAttribute=\"leading\" secondItem=\"OqZ-2E-QdG\" secondAttribute=\"trailing\" constant=\"10\" id=\"MKt-9F-EmG\"/>\n                                        <constraint firstItem=\"OqZ-2E-QdG\" firstAttribute=\"centerY\" secondItem=\"zV8-t9-Xea\" secondAttribute=\"centerY\" id=\"QQw-hq-Btf\"/>\n                                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"7Nf-UQ-uOc\" secondAttribute=\"trailing\" constant=\"10\" id=\"aPk-pg-hba\"/>\n                                        <constraint firstItem=\"Jfp-qZ-bht\" firstAttribute=\"centerY\" secondItem=\"OqZ-2E-QdG\" secondAttribute=\"centerY\" id=\"cUS-7J-iy6\"/>\n                                        <constraint firstItem=\"OqZ-2E-QdG\" firstAttribute=\"leading\" secondItem=\"zV8-t9-Xea\" secondAttribute=\"leadingMargin\" id=\"gpb-CK-ETn\"/>\n                                        <constraint firstItem=\"7Nf-UQ-uOc\" firstAttribute=\"centerY\" secondItem=\"zV8-t9-Xea\" secondAttribute=\"centerY\" id=\"qvC-HZ-VCH\"/>\n                                    </constraints>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <outlet property=\"accountImageView\" destination=\"OqZ-2E-QdG\" id=\"8DV-Pj-IyK\"/>\n                                    <outlet property=\"identifierLabel\" destination=\"QVG-tW-0HS\" id=\"dSH-pR-lh7\"/>\n                                    <outlet property=\"issuerLabel\" destination=\"Jfp-qZ-bht\" id=\"Wgk-IQ-USs\"/>\n                                    <outlet property=\"valueLabel\" destination=\"vJ5-cX-O3i\" id=\"9Uq-sE-j5u\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"sSp-X7-dXp\" id=\"Iwj-Qa-rpu\"/>\n                            <outlet property=\"delegate\" destination=\"sSp-X7-dXp\" id=\"voW-av-d5P\"/>\n                        </connections>\n                    </tableView>\n                    <connections>\n                        <outlet property=\"emptyView\" destination=\"jac-9u-ovS\" id=\"PNR-uC-9UD\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"PN9-uO-Ydg\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <view contentMode=\"scaleToFill\" id=\"jac-9u-ovS\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"240\" height=\"128\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KJv-Gt-yp3\">\n                            <rect key=\"frame\" x=\"16\" y=\"21\" width=\"208\" height=\"86.5\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"No accounts matching your search query could be found.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aA9-U5-djV\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"208\" height=\"33.5\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                    <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"No Results\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kBP-eM-zUM\">\n                                    <rect key=\"frame\" x=\"8\" y=\"8\" width=\"192\" height=\"29\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"24\"/>\n                                    <color key=\"textColor\" systemColor=\"secondaryLabelColor\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <constraints>\n                                <constraint firstItem=\"aA9-U5-djV\" firstAttribute=\"top\" secondItem=\"kBP-eM-zUM\" secondAttribute=\"bottom\" constant=\"8\" id=\"0A5-lT-i9L\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"aA9-U5-djV\" secondAttribute=\"trailing\" id=\"Ee1-9L-bzp\"/>\n                                <constraint firstItem=\"kBP-eM-zUM\" firstAttribute=\"top\" secondItem=\"KJv-Gt-yp3\" secondAttribute=\"topMargin\" id=\"IhW-lQ-lX2\"/>\n                                <constraint firstItem=\"aA9-U5-djV\" firstAttribute=\"leading\" secondItem=\"KJv-Gt-yp3\" secondAttribute=\"leading\" id=\"KFE-aQ-lgh\"/>\n                                <constraint firstItem=\"kBP-eM-zUM\" firstAttribute=\"leading\" secondItem=\"KJv-Gt-yp3\" secondAttribute=\"leadingMargin\" id=\"QIc-fB-EUQ\"/>\n                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"kBP-eM-zUM\" secondAttribute=\"trailing\" id=\"fEV-aX-CRx\"/>\n                                <constraint firstAttribute=\"bottomMargin\" secondItem=\"aA9-U5-djV\" secondAttribute=\"bottom\" id=\"ghZ-sg-67c\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <constraints>\n                        <constraint firstItem=\"KJv-Gt-yp3\" firstAttribute=\"centerY\" secondItem=\"jac-9u-ovS\" secondAttribute=\"centerY\" id=\"9ec-Vm-pkR\"/>\n                        <constraint firstItem=\"KJv-Gt-yp3\" firstAttribute=\"leading\" secondItem=\"jac-9u-ovS\" secondAttribute=\"leadingMargin\" id=\"V8f-4A-uyZ\"/>\n                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"KJv-Gt-yp3\" secondAttribute=\"trailing\" id=\"odp-2T-mw3\"/>\n                    </constraints>\n                </view>\n            </objects>\n            <point key=\"canvasLocation\" x=\"86\" y=\"-426\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"F4a-Ti-NYA\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"yTV-zU-3QS\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"AMg-L0-de5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"56\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"paP-7e-SE0\" kind=\"relationship\" relationship=\"rootViewController\" id=\"OJy-JP-9ae\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vkD-Qa-Pd5\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1262\" y=\"864\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"xhX-qS-E8o\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"fMR-de-62D\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"owt-wI-o0t\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"56\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"I3F-x1-Uca\" kind=\"relationship\" relationship=\"rootViewController\" id=\"p8q-va-NZu\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"pvr-cf-N6M\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1262\" y=\"96\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"groupTableViewBackgroundColor\">\n            <color red=\"0.94901960784313721\" green=\"0.94901960784313721\" blue=\"0.96862745098039216\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"secondaryLabelColor\">\n            <color red=\"0.23529411764705882\" green=\"0.23529411764705882\" blue=\"0.2627450980392157\" alpha=\"0.59999999999999998\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"tertiaryLabelColor\">\n            <color red=\"0.23529411764705882\" green=\"0.23529411764705882\" blue=\"0.2627450980392157\" alpha=\"0.29999999999999999\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "Tofu/Controllers/AccountCreationViewController.swift",
    "content": "import UIKit\n\nprivate let formatter: NumberFormatter = {\n    let formatter = NumberFormatter()\n    formatter.numberStyle = .none\n    return formatter\n}()\n\nclass AccountCreationViewController: UITableViewController, AlgorithmSelectionDelegate {\n    @IBOutlet weak var doneItem: UIBarButtonItem!\n    @IBOutlet weak var nameField: UITextField!\n    @IBOutlet weak var issuerField: UITextField!\n    @IBOutlet weak var secretField: UITextField!\n    @IBOutlet weak var algorithmLabel: UILabel!\n    @IBOutlet weak var eightDigitsSwitch: UISwitch!\n    @IBOutlet weak var timeBasedSwitch: UISwitch!\n    @IBOutlet weak var periodCounterCell: UITableViewCell!\n    @IBOutlet weak var periodCounterLabel: UILabel!\n    @IBOutlet weak var periodCounterField: UITextField!\n    var delegate: AccountCreationDelegate?\n    private var algorithm = Algorithm.sha1\n    private var periodString: String?\n    private var counterString: String?\n    private var period: Int? {\n        guard periodCounterField.text?.count ?? 0 > 0 else { return 30 }\n        return formatter.number(from: periodCounterField.text!)?.intValue\n    }\n    private var counter: Int? {\n        guard periodCounterField.text?.count ?? 0 > 0 else { return 0 }\n        return formatter.number(from: periodCounterField.text!)?.intValue\n    }\n\n    @IBAction func didPressCancel(_ sender: UIBarButtonItem) {\n        presentingViewController?.dismiss(animated: true, completion: nil)\n    }\n\n    @IBAction func didPressDone(_ sender: UIBarButtonItem) {\n        let password = Password()\n        password.timeBased = timeBasedSwitch.isOn\n        password.algorithm = algorithm\n        password.digits = eightDigitsSwitch.isOn ? 8 : 6\n        password.secret = Data(base32Encoded: secretField.text!)!\n\n        if timeBasedSwitch.isOn {\n            password.period = period!\n        } else {\n            password.counter = counter!\n        }\n\n        let account = Account()\n        account.name = nameField.text\n        account.issuer = issuerField.text\n        account.password = password\n\n        presentingViewController?.dismiss(animated: true) {\n            self.delegate?.createAccount(account)\n        }\n    }\n\n    @IBAction func editingChangedForTextField(_ textField: UITextField) {\n        validate()\n    }\n\n    @IBAction func valueChangedForTimeBasedSwitch() {\n        if self.timeBasedSwitch.isOn {\n            counterString = periodCounterField.text\n        } else {\n            periodString = periodCounterField.text\n        }\n        UIView.transition(with: periodCounterCell,\n                          duration: 0.2,\n                          options: .transitionCrossDissolve,\n                          animations: {\n                            if self.timeBasedSwitch.isOn {\n                                self.periodCounterLabel.text = \"Period\"\n                                self.periodCounterField.placeholder = String(30)\n                                self.periodCounterField.text = self.periodString\n                            } else {\n                                self.periodCounterLabel.text = \"Counter\"\n                                self.periodCounterField.placeholder = String(0)\n                                self.periodCounterField.text = self.counterString\n                            }\n        }, completion: { _ in\n            self.validate()\n        })\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        nameField.becomeFirstResponder()\n        algorithmLabel.text = algorithm.name\n    }\n\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if let algorithmsController = segue.destination as? AlgorithmsViewController {\n            algorithmsController.algorithms = [.sha1, .sha256, .sha512]\n            algorithmsController.selected = algorithm\n            algorithmsController.delegate = self\n        }\n    }\n\n    private func validate() {\n        doneItem.isEnabled = secretField.text?.count ?? 0 > 0 &&\n            Data(base32Encoded: secretField.text!) != nil &&\n            (timeBasedSwitch.isOn ? period != nil : counter != nil)\n    }\n\n    // MARK: AlgorithmSelectionDelegate\n\n    func selectAlgorithm(_ algorithm: Algorithm) {\n        self.algorithm = algorithm\n        algorithmLabel.text = algorithm.name\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/AccountSearchResultsViewController.swift",
    "content": "import UIKit\n\nprivate let accountCellIdentifier = \"AccountCell\"\n\nclass AccountSearchResultsViewController: UITableViewController, AccountUpdateDelegate {\n    @IBOutlet var emptyView: UIView!\n    var accounts: [Account]! {\n        didSet {\n            tableView.reloadData()\n            tableView.backgroundView = accounts.count == 0 ? emptyView : nil\n            tableView.separatorStyle = accounts.count == 0 ? .none : .singleLine\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let updater = AccountsTableViewUpdater(tableView: tableView)\n        updater.startUpdating()\n\n        NotificationCenter.default.addObserver(\n            self,\n            selector: #selector(deselectSelectedTableViewRow),\n            name: UIMenuController.willHideMenuNotification,\n            object: nil)\n    }\n\n    @objc func deselectSelectedTableViewRow() {\n        if let indexPath = tableView.indexPathForSelectedRow {\n            tableView.deselectRow(at: indexPath, animated: true)\n        }\n    }\n    \n    // MARK: UITableViewDataSource\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        if let cell = tableView.cellForRow(at: indexPath) {\n            guard let cellSuperview = cell.superview else {\n                assertionFailure(\"The cell does not seem to be in the view hierarchy. How is that even possible!?\")\n                return\n            }\n\n            let menuController = UIMenuController.shared\n\n            // If you tap the same cell twice, this condition prevents the menu from being\n            // hidden and then instantly shown again causing an unpleasant flash.\n            //\n            // Since the cell could already be the first responder (from previously showing\n            // its menu and then scrolling the table view) and the menu could already be\n            // visible for another cell, we make sure to check both values.\n            if !(cell.isFirstResponder && menuController.isMenuVisible) {\n                cell.becomeFirstResponder()\n\n                menuController.showMenu(from: cellSuperview, rect: cell.frame)\n            }\n        }\n    }\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return accounts.count\n    }\n    \n    override func tableView(_ tableView: UITableView,\n                            cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: accountCellIdentifier,\n                                                 for: indexPath) as! AccountCell\n        cell.account = accounts[indexPath.row]\n        cell.delegate = self\n        return cell\n    }\n    \n    // MARK: UITableViewDelegate\n    \n    override func tableView(_ tableView: UITableView,\n                            shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {\n        return true\n    }\n    \n    override func tableView(_ tableView: UITableView, canPerformAction action: Selector,\n                            forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {\n        return action == #selector(copy(_:))\n    }\n    \n    override func tableView(_ tableView: UITableView, performAction action: Selector,\n                            forRowAt indexPath: IndexPath, withSender sender: Any?) {\n        if action == #selector(copy(_:)) {\n            let cell = tableView.cellForRow(at: indexPath) as! AccountCell\n            cell.copy(self)\n        }\n    }\n    \n    // MARK: AccountUpdateDelegate\n    \n    func updateAccount(_ account: Account) {\n        (presentingViewController as! AccountUpdateDelegate).updateAccount(account)\n        let row = accounts.firstIndex { $0 === account }!\n        let indexPath = IndexPath(row: row, section: 0)\n        guard let cell = tableView.cellForRow(at: indexPath) as? AccountCell else { return }\n        cell.updateWithDate(Date())\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/AccountUpdateViewController.swift",
    "content": "import UIKit\n\nclass AccountUpdateViewController: UITableViewController {\n    @IBOutlet weak var nameField: UITextField!\n    @IBOutlet weak var issuerField: UITextField!\n    var delegate: AccountUpdateDelegate?\n    var account: Account!\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        \n        nameField.text = account.name\n        issuerField.text = account.issuer\n    }\n    \n    override func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        \n        account.name = nameField.text\n        account.issuer = issuerField.text\n        delegate?.updateAccount(account)\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/AccountsTableViewUpdater.swift",
    "content": "import UIKit\n\nclass AccountsTableViewUpdater: NSObject {\n    var tableView: UITableView\n    \n    init(tableView: UITableView) {\n        self.tableView = tableView\n    }\n    \n    func startUpdating() {\n        let timer = Timer(timeInterval: 1, target: self, selector: #selector(updateCells),\n                          userInfo: nil, repeats: true)\n        RunLoop.main.add(timer, forMode: RunLoop.Mode.common)\n    }\n    \n    @objc func updateCells() {\n        let now = Date()\n        for cell in tableView.visibleCells {\n            let accountCell = cell as! AccountCell\n            accountCell.updateWithDate(now)\n        }\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/AccountsViewController.swift",
    "content": "import UIKit\n\nprivate let accountOrderKey = \"persistentRefs\"\n\nclass AccountsViewController: UITableViewController {\n    @IBOutlet weak var emptyView: UIView!\n\n    private let keychain = Keychain()\n    private var accounts = [Account]()\n\n    private lazy var searchController = makeSearchController()\n    private lazy var addAccountAlertController = makeAddAccountAlertController()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        accounts = keychain.accounts\n        let sortedPersistentRefs = UserDefaults.standard.array(forKey: accountOrderKey) as? [Data] ?? []\n        accounts.sort { a, b in\n            let aIndex = sortedPersistentRefs.firstIndex(of: a.persistentRef! as Data) ?? 0\n            let bIndex = sortedPersistentRefs.firstIndex(of: b.persistentRef! as Data) ?? 0\n            return aIndex < bIndex\n        }\n        persistAccountOrder()\n\n        navigationItem.searchController = searchController\n\n        let updater = AccountsTableViewUpdater(tableView: tableView)\n        updater.startUpdating()\n\n        updateEditing()\n\n        NotificationCenter.default.addObserver(\n            self,\n            selector: #selector(deselectSelectedTableViewRow),\n            name: UIMenuController.willHideMenuNotification,\n            object: nil)\n    }\n\n    @objc func deselectSelectedTableViewRow() {\n        if let indexPath = tableView.indexPathForSelectedRow {\n            tableView.deselectRow(at: indexPath, animated: true)\n        }\n    }\n\n    @IBAction func addAccount(_ sender: Any) {\n        present(addAccountAlertController, animated: true, completion: nil)\n    }\n\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if let navigationController = segue.destination as? UINavigationController {\n            if let accountCreationViewController = navigationController.topViewController\n                as? AccountCreationViewController {\n                accountCreationViewController.delegate = self\n            } else {\n                let scanningViewController = navigationController.topViewController\n                    as! ScanningViewController\n                scanningViewController.delegate = self\n            }\n        } else {\n            let accountUpdateViewController = segue.destination\n                as! AccountUpdateViewController\n            let cell = sender as! AccountCell\n            accountUpdateViewController.delegate = self\n            accountUpdateViewController.account = cell.account\n        }\n    }\n\n    private func makeSearchController() -> UISearchController {\n        let searchResultsController = storyboard!.instantiateViewController(withIdentifier: \"AccountSearchResultsViewController\") as! AccountSearchResultsViewController\n        let searchController = UISearchController(searchResultsController: searchResultsController)\n        searchController.searchResultsUpdater = self\n        return searchController\n    }\n\n    private func makeAddAccountAlertController() -> UIAlertController {\n        let title = \"Add Account\"\n        let message = \"Add an account by scanning a QR code, importing a QR image, or entering a secret manually.\"\n        let alertController = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)\n\n        let scanQRCode = UIAlertAction(title: \"Scan QR Code\", style: .default) { [unowned self] _ in\n            self.performSegue(withIdentifier: \"ScanSegue\", sender: self)\n        }\n        \n        let importQRCode = UIAlertAction(title: \"Import QR Image\", style: .default) { [unowned self] _ in\n            if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {\n                let imagePickerController = UIImagePickerController()\n\n                imagePickerController.delegate = self\n                imagePickerController.allowsEditing = false\n                imagePickerController.sourceType = .photoLibrary\n\n                self.present(imagePickerController, animated: true, completion: nil)\n            } else {\n                presentErrorAlert(title: \"Photo Library Empty\",\n                                  message: \"The photo library is empty and there are no images to import.\")\n            }\n        }\n\n        let enterManually = UIAlertAction(title: \"Enter Manually\", style: .default) { [unowned self] _ in\n            self.performSegue(withIdentifier: \"EnterManuallySegue\", sender: self)\n        }\n\n        let cancel = UIAlertAction(title: \"Cancel\", style: .cancel, handler: nil)\n\n        alertController.addAction(scanQRCode)\n        alertController.addAction(importQRCode)\n        alertController.addAction(enterManually)\n        alertController.addAction(cancel)\n\n        return alertController\n    }\n\n    private func persistAccountOrder() {\n        let sortedPersistentRefs = accounts.map { $0.persistentRef! }\n        UserDefaults.standard.set(sortedPersistentRefs, forKey: accountOrderKey)\n    }\n\n    private func updateEditing() {\n        if accounts.count == 0 {\n            tableView.backgroundView = emptyView\n            tableView.separatorStyle = .none\n            navigationItem.leftBarButtonItem = nil\n            setEditing(false, animated: true)\n        } else {\n            tableView.backgroundView = nil\n            tableView.separatorStyle = .singleLine\n            navigationItem.leftBarButtonItem = editButtonItem\n        }\n    }\n\n    // MARK: UITableViewDataSource\n\n    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) ->\n        Bool {\n            return true\n    }\n\n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath,\n                            to destinationIndexPath: IndexPath) {\n        accounts.insert(accounts.remove(at: sourceIndexPath.row),\n                        at: destinationIndexPath.row)\n        persistAccountOrder()\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return accounts.count\n    }\n\n    override func tableView(_ tableView: UITableView,\n                            cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"AccountCell\",\n                                                 for: indexPath) as! AccountCell\n        cell.account = accounts[indexPath.row]\n        cell.delegate = self\n        return cell\n    }\n\n    override func tableView(\n        _ tableView: UITableView,\n        commit editingStyle: UITableViewCell.EditingStyle,\n        forRowAt indexPath: IndexPath) {\n        if editingStyle == .delete {\n            let alertController = UIAlertController(\n                title: \"Deleting This Account Will Not Turn Off Two-Factor Authentication\",\n                message: \"Please make sure two-factor authentication is turned off in the issuer's sett\" +\n                \"ings before deleting this account to prevent being locked out.\",\n                preferredStyle: .actionSheet)\n\n            let deleteAccountAction = UIAlertAction(title: \"Delete Account\", style: .destructive) { _ in\n                self.deleteAccountForRowAtIndexPath(indexPath)\n            }\n\n            let cancelAction = UIAlertAction(title: \"Cancel\", style: .cancel, handler: nil)\n\n            alertController.addAction(deleteAccountAction)\n            alertController.addAction(cancelAction)\n\n            present(alertController, animated: true, completion: nil)\n        }\n    }\n\n    private func deleteAccountForRowAtIndexPath(_ indexPath: IndexPath) {\n        let account = self.accounts[indexPath.row]\n        guard self.keychain.deleteAccount(account) else {\n            presentTryAgainAlertWithTitle(\n                \"Could Not Delete Account\",\n                message: \"An error occurred when deleting the account from the keychain.\") {\n                    self.deleteAccountForRowAtIndexPath(indexPath)\n            }\n            return\n        }\n        accounts.remove(at: indexPath.row)\n        persistAccountOrder()\n        tableView.deleteRows(at: [indexPath], with: .automatic)\n        updateEditing()\n    }\n\n    // MARK: UITableViewDelegate\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        if tableView.isEditing {\n            tableView.deselectRow(at: indexPath, animated: true)\n\n            if let cell = tableView.cellForRow(at: indexPath) as? AccountCell {\n                performSegue(withIdentifier: \"EditAccountSegue\", sender: cell)\n            }\n        } else { // Not editing\n            if let cell = tableView.cellForRow(at: indexPath) {\n                guard let cellSuperview = cell.superview else {\n                    assertionFailure(\"The cell does not seem to be in the view hierarchy. How is that even possible!?\")\n                    return\n                }\n\n                let menuController = UIMenuController.shared\n\n                // If you tap the same cell twice, this condition prevents the menu from being\n                // hidden and then instantly shown again causing an unpleasant flash.\n                //\n                // Since the cell could already be the first responder (from previously showing\n                // its menu and then scrolling the table view) and the menu could already be\n                // visible for another cell, we make sure to check both values.\n                if !(cell.isFirstResponder && menuController.isMenuVisible) {\n                    cell.becomeFirstResponder()\n\n                    menuController.showMenu(from: cellSuperview, rect: cell.frame)\n                }\n            }\n        }\n    }\n\n    override func tableView(_ tableView: UITableView,\n                            shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {\n        return true\n    }\n\n    override func tableView(_ tableView: UITableView, canPerformAction action: Selector,\n                            forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {\n        return action == #selector(copy(_:))\n    }\n\n    override func tableView(_ tableView: UITableView, performAction action: Selector,\n                            forRowAt indexPath: IndexPath, withSender sender: Any?) {\n        if action == #selector(copy(_:)) {\n            let cell = tableView.cellForRow(at: indexPath) as! AccountCell\n            cell.copy(self)\n        }\n    }\n}\n\nextension AccountsViewController: UISearchResultsUpdating {\n    func updateSearchResults(for searchController: UISearchController) {\n        let accountSearchResultsViewController = searchController.searchResultsController\n            as! AccountSearchResultsViewController\n        accountSearchResultsViewController.accounts = accounts.filter {\n            guard let string = searchController.searchBar.text else { return false }\n            return $0.description.range(of: string, options: .caseInsensitive, range: nil,\n                                        locale: nil) != nil\n        }\n    }\n}\n\nextension AccountsViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {\n    func imagePickerController(_ picker: UIImagePickerController,\n                               didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {\n        dismiss(animated: true, completion: nil)\n\n        guard let selectedQRCode = info[UIImagePickerController.InfoKey.originalImage] as? UIImage,\n              let detector = CIDetector(ofType: CIDetectorTypeQRCode,\n                                        context: nil,\n                                        options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]),\n              let ciImage = CIImage(image: selectedQRCode),\n              let features = detector.features(in: ciImage) as? [CIQRCodeFeature],\n              let messageString = features.first?.messageString else {\n\n            presentErrorAlert(title: \"Could Not Detect QR Code\",\n                              message: \"No QR code was detected in the provided image. Please try importing a different image.\")\n            return\n        }\n\n        guard let qrCodeURL = URL(string: messageString),\n              let account = Account(url: qrCodeURL) else {\n\n            presentErrorAlert(title: \"Invalid QR Code\",\n                              message: \"The QR code detected in the provided image is invalid. Please try a different image.\")\n            return\n        }\n\n        self.createAccount(account)\n    }\n}\n\nextension AccountsViewController: AccountCreationDelegate {\n    func createAccount(_ account: Account) {\n        guard keychain.insertAccount(account) else {\n            presentTryAgainAlertWithTitle(\n                \"Could Not Create Account\",\n                message: \"An error occurred when inserting the account into the keychain.\") {\n                    self.createAccount(account)\n            }\n            return\n        }\n        accounts.append(account)\n        persistAccountOrder()\n        let lastRow = accounts.count - 1\n        let indexPaths = [IndexPath(row: lastRow, section: 0)]\n        tableView.insertRows(at: indexPaths, with: .automatic)\n        updateEditing()\n    }\n}\n\nextension AccountsViewController: AccountUpdateDelegate {\n    func updateAccount(_ account: Account) {\n        guard keychain.updateAccount(account) else {\n            presentTryAgainAlertWithTitle(\n                \"Could Not Update Account\",\n                message: \"An error occurred when persisting the account updates to the keychain.\") {\n                    self.updateAccount(account)\n            }\n            return\n        }\n        let row = accounts.firstIndex { $0 === account }!\n        let indexPath = IndexPath(row: row, section: 0)\n        guard let cell = tableView.cellForRow(at: indexPath) as? AccountCell else { return }\n        cell.updateWithDate(Date())\n    }\n\n    private func presentTryAgainAlertWithTitle(_ title: String, message: String, handler: @escaping () -> Void) {\n        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)\n\n        let tryAgainAccountAction = UIAlertAction(title: \"Try again\", style: .default) { _ in\n            handler()\n        }\n\n        let cancelAction = UIAlertAction(title: \"Cancel\", style: .cancel, handler: nil)\n\n        alertController.addAction(tryAgainAccountAction)\n        alertController.addAction(cancelAction)\n\n        present(alertController, animated: true, completion: nil)\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/AlgorithmsViewController.swift",
    "content": "import UIKit\n\nprivate let algorithmCellIdentifier = \"AlgorithmCell\"\n\nclass AlgorithmsViewController: UITableViewController {\n    var algorithms = [Algorithm]()\n    var selected: Algorithm!\n    var delegate: AlgorithmSelectionDelegate?\n    \n    // MARK: UITableViewDataSource\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return algorithms.count\n    }\n    \n    override func tableView(_ tableView: UITableView,\n                            cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: algorithmCellIdentifier,\n                                                 for: indexPath)\n        let algorithm = algorithms[indexPath.row]\n        cell.textLabel?.text = algorithm.name\n        cell.accessoryType = selected == algorithm ? .checkmark : .none\n        return cell\n    }\n    \n    // MARK: UITableViewDelegate\n    \n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        tableView.deselectRow(at: indexPath, animated: true)\n        let previouslySelectedCell = tableView.cellForRow(\n            at: IndexPath(row: algorithms.firstIndex(of: selected)!, section: 0))!\n        previouslySelectedCell.accessoryType = .none\n        let selectedCell = tableView.cellForRow(at: indexPath)!\n        selectedCell.accessoryType = .checkmark\n        selected = algorithms[indexPath.row]\n        delegate?.selectAlgorithm(selected)\n    }\n}\n"
  },
  {
    "path": "Tofu/Controllers/ScanningViewController.swift",
    "content": "import UIKit\nimport AVFoundation\n\nclass ScanningViewController: UIViewController,\nAVCaptureMetadataOutputObjectsDelegate {\n    @IBOutlet weak var allowCameraAccessView: UIView!\n    var delegate: AccountCreationDelegate?\n    private var session = AVCaptureSession()\n    private let output = AVCaptureMetadataOutput()\n    private var layer: AVCaptureVideoPreviewLayer?\n    \n    @IBAction func didPressCancel(_ sender: UIBarButtonItem) {\n        output.setMetadataObjectsDelegate(nil, queue: nil)\n        presentingViewController?.dismiss(animated: true, completion: nil)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        if AVCaptureDevice.authorizationStatus(for: .video) == .authorized {\n            startScanning()\n        } else {\n            AVCaptureDevice.requestAccess(for: .video) { granted in\n                guard granted else { return }\n                DispatchQueue.main.async {\n                    self.startScanning()\n                }\n            }\n        }\n    }\n    \n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        updateLayerFrameAndOrientation()\n    }\n    \n    private func startScanning() {\n        if let device = AVCaptureDevice.default(for: .video),\n            let input = try? AVCaptureDeviceInput(device: device) {\n            allowCameraAccessView.isHidden = true\n            navigationItem.prompt = \"Point your camera at a QR code to scan it.\"\n            session.addInput(input)\n            session.addOutput(output)\n            output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)\n            output.metadataObjectTypes = [.qr]\n            layer = AVCaptureVideoPreviewLayer(session: session)\n            layer!.videoGravity = .resizeAspectFill\n            view.layer.addSublayer(layer!)\n            updateLayerFrameAndOrientation()\n            session.startRunning()\n        }\n    }\n    \n    private func updateLayerFrameAndOrientation() {\n        layer?.frame = view.layer.bounds\n        switch UIDevice.current.orientation {\n        case .landscapeLeft:\n            layer?.connection?.videoOrientation = .landscapeRight\n        case .landscapeRight:\n            layer?.connection?.videoOrientation = .landscapeLeft\n        default:\n            layer?.connection?.videoOrientation = .portrait\n        }\n    }\n    \n    // MARK: AVCaptureMetadataOutputObjectsDelegate\n    \n    func metadataOutput(\n        _ output: AVCaptureMetadataOutput,\n        didOutput metadataObjects: [AVMetadataObject],\n        from connection: AVCaptureConnection) {\n\n        guard presentedViewController == nil, // Not presenting an error alert\n              metadataObjects.count > 0,\n              let metadataObject = metadataObjects.first as? AVMetadataMachineReadableCodeObject,\n              metadataObject.type == .qr,\n              let urlString = metadataObject.stringValue else { return }\n\n        guard let url = URL(string: urlString),\n              let account = Account(url: url) else {\n\n            presentErrorAlert(title: \"Invalid QR Code\",\n                              message: \"The detected QR code is invalid. Please try scanning a different code.\")\n            return\n        }\n\n        output.setMetadataObjectsDelegate(nil, queue: nil)\n        delegate?.createAccount(account)\n        presentingViewController?.dismiss(animated: true, completion: nil)\n    }\n}\n"
  },
  {
    "path": "Tofu/Extensions/Data.swift",
    "content": "import Foundation\n\nprivate enum DecodedByte {\n    case valid(UInt8)\n    case invalid\n    case padding\n}\n\nprivate let padding: UInt8 = 61 // =\n\nprivate let byteMappings: [CountableRange<UInt8>] = [\n    65 ..< 91, // A-Z\n    50 ..< 56, // 2-7\n]\n\nprivate func decode(byte encodedByte: UInt8) -> DecodedByte {\n    if encodedByte == padding { return .padding }\n    var decodedStart: UInt8 = 0\n    for range in byteMappings {\n        if range.contains(encodedByte) {\n            let result = decodedStart + (encodedByte - range.lowerBound)\n            return .valid(result)\n        }\n        decodedStart += range.upperBound - range.lowerBound\n    }\n    return .invalid\n}\n\nprivate func decoded(bytes encodedBytes: [UInt8]) -> [UInt8]? {\n    var decodedBytes = [UInt8]()\n    decodedBytes.reserveCapacity(encodedBytes.count / 8 * 5)\n\n    var decodedByte: UInt8 = 0\n    var characterCount = 0\n    var paddingCount = 0\n    var index = 0\n\n    for encodedByte in encodedBytes {\n        let value: UInt8\n\n        switch decode(byte: encodedByte) {\n        case .valid(let v):\n            value = v\n            characterCount += 1\n        case .invalid:\n            return nil\n        case .padding:\n            paddingCount += 1\n            continue\n        }\n\n        // Only allow padding at the end of the sequence\n        if paddingCount > 0 { return nil }\n\n        switch index % 8 {\n        case 0:\n            decodedByte = value << 3\n        case 1:\n            decodedByte |= value >> 2\n            decodedBytes.append(decodedByte)\n            decodedByte = value << 6\n        case 2:\n            decodedByte |= value << 1\n        case 3:\n            decodedByte |= value >> 4\n            decodedBytes.append(decodedByte)\n            decodedByte = value << 4\n        case 4:\n            decodedByte |= value >> 1\n            decodedBytes.append(decodedByte)\n            decodedByte = value << 7\n        case 5:\n            decodedByte |= value << 2\n        case 6:\n            decodedByte |= value >> 3\n            decodedBytes.append(decodedByte)\n            decodedByte = value << 5\n        case 7:\n            decodedByte |= value\n            decodedBytes.append(decodedByte)\n        default:\n            fatalError()\n        }\n\n        index += 1\n    }\n\n    let characterCountIsValid = [0, 2, 4, 5, 7].contains(characterCount % 8)\n    let paddingCountIsValid = paddingCount == 0 || (characterCount + paddingCount) % 8 == 0\n    guard characterCountIsValid && paddingCountIsValid else { return nil }\n\n    return decodedBytes\n}\n\nextension Data {\n    init?(base32Encoded string: String) {\n        let encodedBytes = Array(string.uppercased().utf8)\n        guard let decodedBytes = decoded(bytes: encodedBytes) else { return nil }\n        self.init(decodedBytes)\n    }\n\n    /// Read a given type from a Data's buffer.\n    ///\n    /// Very much like UnsafeRawBufferPointer's load(fromByteOffset:as:), but doesn't barf if the value\n    /// isn't at an aligned position.\n    ///\n    /// - Parameters:\n    ///   - offset: The offset to load the value from.\n    ///   - type: The type of the value.\n    /// - Returns: The value loaded from the data.\n    func alignmentSafeLoad<T>(fromByteOffset offset: Int = 0, as type: T.Type) throws -> T {\n        guard count >= (offset + MemoryLayout<T>.size) else { throw NSError(domain: \"com.calleerlandsson.Tofu\", code: -1) }\n        let chunk = subdata(in: offset..<(offset + MemoryLayout<T>.size))\n        return chunk.withUnsafeBytes({ (bytePointer: UnsafeRawBufferPointer) -> T in\n            return bytePointer.load(as: T.self)\n        })\n    }\n}\n"
  },
  {
    "path": "Tofu/Extensions/UIViewController.swift",
    "content": "import UIKit\n\nextension UIViewController {\n    func presentErrorAlert(title: String, message: String) {\n        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)\n        alertController.addAction(UIAlertAction(title: \"OK\", style: .default, handler: nil))\n        self.present(alertController, animated: true, completion: nil)\n    }\n}\n"
  },
  {
    "path": "Tofu/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>com.calleerlandsson.Tofu.otpauth</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>otpauth</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>TOFU_BUNDLE_VERSION</string>\n\t<key>ITSAppUsesNonExemptEncryption</key>\n\t<false/>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSCameraUsageDescription</key>\n\t<string>Used to scan QR codes</string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tofu/Models/Account.swift",
    "content": "import Foundation\n\n@objc(Account) class Account: NSObject, NSSecureCoding {\n    static var supportsSecureCoding: Bool { return true }\n\n    /// This is a \"pointer\" to the account in the Keychain, and is set upon encode to/decode from such. It's not\n    /// included in serialisation or equality checks, since it's not required for exporting to/importing from from\n    /// elsewhere, and isn't useful for duplicate checking etc.\n    var persistentRef: Data?\n    var name: String?\n    var issuer: String?\n    var password = Password()\n\n    override init() {}\n\n    init?(url: URL) {\n        let label = url.path.trimmingCharacters(in: CharacterSet(charactersIn: \"/\"))\n        guard let host = url.host, host == \"hotp\" || host == \"totp\" else { return nil }\n        let labelComponents = label.components(separatedBy: \":\")\n        guard labelComponents.count > 0,\n            let components = URLComponents(url: url, resolvingAgainstBaseURL: false),\n            let queryItems = components.queryItems,\n            queryItems.count > 0\n            else { return nil }\n\n        name = labelComponents.last?.trimmingCharacters(in: CharacterSet.whitespaces)\n        issuer = labelComponents.count > 1 ? labelComponents.first : nil\n        password.timeBased = host == \"totp\"\n        for queryItem in queryItems {\n            switch queryItem.name {\n            case \"secret\":\n                guard let secretString = queryItem.value,\n                    let secret = Data(base32Encoded: secretString)\n                    else { break }\n                password.secret = secret\n            case \"algorithm\":\n                switch queryItem.value {\n                case .some(\"SHA256\"): password.algorithm = .sha256\n                case .some(\"SHA512\"): password.algorithm = .sha512\n                default: break\n                }\n            case \"digits\":\n                guard let string = queryItem.value, let digits = Int(string) else { break }\n                if digits < 6 || digits > 9 { return nil }\n                password.digits = digits\n            case \"issuer\": issuer = queryItem.value\n            case \"counter\":\n                guard let string = queryItem.value, let counter = Int(string) else { break }\n                password.counter = counter\n            case \"period\":\n                guard let string = queryItem.value, let period = Int(string) else { break }\n                if period < 1 { return nil }\n                password.period = period\n            default: break\n            }\n        }\n        if password.secret.count == 0 { return nil }\n    }\n\n    required init?(coder: NSCoder) {\n        guard let secret = coder.decodeObject(of: NSData.self, forKey: \"secret\") as? Data else { return nil }\n        guard coder.containsValue(forKey: \"algorithm\") else { return nil }\n        guard let algorithm = Algorithm(rawValue: coder.decodeInt32(forKey: \"algorithm\")) else { return nil }\n        password.algorithm = algorithm\n        password.secret = secret\n        password.digits = Int(coder.decodeInt32(forKey: \"digits\"))\n        password.timeBased = coder.decodeBool(forKey: \"timeBased\")\n        password.counter = Int(coder.decodeInt32(forKey: \"counter\"))\n        password.period = Int(coder.decodeInt32(forKey: \"period\"))\n\n        name = coder.decodeObject(of: NSString.self, forKey: \"name\") as? String\n        issuer = coder.decodeObject(of: NSString.self, forKey: \"issuer\") as? String\n    }\n\n    func encode(with coder: NSCoder) {\n        coder.encode(password.timeBased, forKey: \"timeBased\")\n        coder.encode(password.algorithm.rawValue, forKey: \"algorithm\")\n        coder.encode(Int32(password.digits), forKey: \"digits\")\n        coder.encode(password.secret, forKey: \"secret\")\n        coder.encode(Int32(password.counter), forKey: \"counter\")\n        coder.encode(Int32(password.period), forKey: \"period\")\n        coder.encode(name, forKey: \"name\")\n        coder.encode(issuer, forKey: \"issuer\")\n    }\n\n    override func isEqual(_ object: Any?) -> Bool {\n        guard let other = object as? Account else { return false }\n        return name == other.name && issuer == other.issuer && password == other.password\n    }\n\n    override var hash: Int { \n        var hasher = Hasher()\n        hasher.combine(name)\n        hasher.combine(issuer)\n        hasher.combine(password)\n        return hasher.finalize()\n    }\n\n    override var description: String {\n        guard let issuer = issuer, issuer.count > 0 else { return name ?? \"\" }\n        guard let name = name, name.count > 0 else { return issuer }\n        return \"\\(issuer) (\\(name))\"\n    }\n}\n"
  },
  {
    "path": "Tofu/Models/Algorithm.swift",
    "content": "import Foundation\nimport CommonCrypto\n\nenum Algorithm: Int32 {\n    case sha1 = 0\n    case sha256 = 1\n    case sha512 = 2\n    \n    var name: String {\n        switch self {\n        case .sha1: return \"SHA1\"\n        case .sha256: return \"SHA256\"\n        case .sha512: return \"SHA512\"\n        }\n    }\n    \n    var digestLength: Int {\n        switch self {\n        case .sha1: return Int(CC_SHA1_DIGEST_LENGTH)\n        case .sha256: return Int(CC_SHA256_DIGEST_LENGTH)\n        case .sha512: return Int(CC_SHA512_DIGEST_LENGTH)\n        }\n    }\n    \n    var hmacAlgorithm: CCHmacAlgorithm {\n        switch self {\n        case .sha1: return CCHmacAlgorithm(kCCHmacAlgSHA1)\n        case .sha256: return CCHmacAlgorithm(kCCHmacAlgSHA256)\n        case .sha512: return CCHmacAlgorithm(kCCHmacAlgSHA512)\n        }\n    }\n}\n"
  },
  {
    "path": "Tofu/Models/ExternalDataInterop.swift",
    "content": "import Foundation\nimport CryptoKit\nimport CommonCrypto\n\nclass ExternalDataInterop {\n\n    enum ExternalDataInteropError: Error {\n        case invalidPasscode\n        case invalidData\n        case encryptionFailed\n    }\n\n    /// Encrypt the given accounts with the given passcode. A random salt will be generated.\n    func encryptedData(for accounts: [Account], with passcode: String) throws -> Data {\n        let encodedAccounts = try NSKeyedArchiver.archivedData(withRootObject: accounts, requiringSecureCoding: true)\n        let container = try EncryptedAccountContainer(encrypting: encodedAccounts,\n                                                      with: .aesGCMWithSalted256BitSHAPBKDF2DerivedKey,\n                                                      password: passcode)\n        return try NSKeyedArchiver.archivedData(withRootObject: container, requiringSecureCoding: true)\n    }\n\n    /// Attempt to decrypt the given accounts with using the given passcode.\n    func decryptAccounts(from encryptedAccountData: Data, with passcode: String) throws -> [Account] {\n\n        guard let decodedContainer = try NSKeyedUnarchiver.unarchivedObject(ofClass: EncryptedAccountContainer.self,\n                                                                            from: encryptedAccountData) else {\n            throw ExternalDataInteropError.invalidData\n        }\n\n        let decryptedData = try decodedContainer.decryptedData(with: passcode)\n\n        guard let accounts: [Account] = try {\n            let unarchiver = try NSKeyedUnarchiver(forReadingFrom: decryptedData)\n            unarchiver.requiresSecureCoding = true\n            return unarchiver.decodeObject(of: [NSArray.self, Account.self], forKey: NSKeyedArchiveRootObjectKey) as? [Account]\n        }() else {\n            throw ExternalDataInteropError.invalidData\n        }\n        return accounts\n    }\n\n    /// This class encapsulates the encryption/decryption implementation details.\n    @objc(EncryptedAccountContainer) private class EncryptedAccountContainer: NSObject, NSSecureCoding {\n\n        static let supportsSecureCoding: Bool = true\n\n        enum Algorithm: Int {\n            // AES-GCM with a 256-bit encryption key derived with PBKDF2 with the SHA256 pseudo-random algorithm.\n            case aesGCMWithSalted256BitSHAPBKDF2DerivedKey = 0\n        }\n        \n        /// Initialise a container with the given unencrypted data. The data will be encrypted with the given algorithm\n        /// using sensible defaults for it. If a salt is needed, it'll be randomly generated.\n        init(encrypting unEncryptedData: Data, with algorithm: Algorithm, password: String) throws {\n\n            // 600k figure from https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2\n            self.rounds = 600_000\n            self.algorithm = algorithm\n\n            let (u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15,u16) = UUID().uuid\n            let uuidArray = [u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15,u16]\n            self.salt = Data(uuidArray)\n\n            super.init()\n            let key = try encryptionKey(from: password, salt: salt, rounds: rounds)\n            self.encryptedData = try AES.GCM.seal(unEncryptedData, using: key).combined!\n        }\n\n        required init?(coder: NSCoder) {\n            let rounds = coder.decodeInteger(forKey: \"rounds\")\n            guard rounds > 0, let salt = coder.decodeObject(of: NSData.self, forKey: \"salt\") as? Data,\n                  let algorithm = Algorithm(rawValue: coder.decodeInteger(forKey: \"algorithm\")),\n                  let encryptedData = coder.decodeObject(of: NSData.self, forKey: \"payload\") as? Data else {\n                return nil\n            }\n\n            self.salt = salt\n            self.rounds = rounds\n            self.algorithm = algorithm\n            self.encryptedData = encryptedData\n        }\n\n        let salt: Data\n        let rounds: Int\n        let algorithm: Algorithm\n        private(set) var encryptedData: Data = Data()\n\n        func encode(with coder: NSCoder) {\n            coder.encode(salt, forKey: \"salt\")\n            coder.encode(rounds, forKey: \"rounds\")\n            coder.encode(algorithm.rawValue, forKey: \"algorithm\")\n            coder.encode(encryptedData, forKey: \"payload\")\n        }\n\n        func decryptedData(with password: String) throws -> Data {\n            let key = try encryptionKey(from: password, salt: salt, rounds: rounds)\n            let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)\n            return try AES.GCM.open(sealedBox, using: key)\n        }\n\n        /// Generate an encryption/decryption key for the given passcode.\n        private func encryptionKey(from passcode: String, salt: Data, rounds: Int) throws -> SymmetricKey {\n            guard !passcode.isEmpty else { throw ExternalDataInteropError.invalidPasscode }\n            return SymmetricKey(data: try derivedPBKDF2Key(from: passcode, salt: salt, keySize: .bits256, rounds: rounds))\n        }\n\n        /// Generate a PBKDF2 derived key from the given password, salt, and rounds.\n        private func derivedPBKDF2Key(from password: String, salt saltData: Data, keySize: SymmetricKeySize, rounds: Int) throws -> Data {\n\n            // To perform PBKDF2 key derivation, we need to use CommonCrypto, which isn't very Swift-y.\n            let passwordData = Data(password.utf8)\n            let saltLength = saltData.count\n\n            let derivedKeyByteLength = keySize.bitCount / 8\n            var derivedKeyData = Data(repeating: 0, count: derivedKeyByteLength)\n\n            let derivationStatus: Int32 = derivedKeyData.withUnsafeMutableBytes { derivedKeyBytes in\n                saltData.withUnsafeBytes { saltBytes in\n                    let keyBuffer: UnsafeMutablePointer<UInt8> = derivedKeyBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)\n                    let saltBuffer: UnsafePointer<UInt8> = saltBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)\n                    return CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), password, passwordData.count, saltBuffer, saltLength,\n                                                CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256), UInt32(rounds),\n                                                keyBuffer, derivedKeyByteLength)\n                }\n            }\n\n            guard derivationStatus == kCCSuccess else { throw ExternalDataInteropError.encryptionFailed }\n            return derivedKeyData\n        }\n    }\n}\n"
  },
  {
    "path": "Tofu/Models/Keychain.swift",
    "content": "import Foundation\n\nprivate enum KeychainEncodingVersion: UInt8 {\n    case version1 = 1\n    case version2 = 2\n}\n\nprivate func archivedDataForKeychainWithAccount(_ account: Account) throws -> Data {\n    let data = try NSKeyedArchiver.archivedData(withRootObject: account, requiringSecureCoding: true)\n    let version: UInt8 = KeychainEncodingVersion.version2.rawValue\n    var versionedData = Data([version])\n    versionedData.append(data)\n    return versionedData\n}\n\nprivate func unarchiveAccountWithData(_ data: Data) -> Account? {\n    guard !data.isEmpty else { return nil }\n    guard let version = KeychainEncodingVersion(rawValue: data.first!) else { return nil }\n    let encodedData = data.subdata(in: 1..<data.count)\n\n    switch version {\n    case .version1: return unarchiveV1AccountWithData(encodedData)\n    case .version2: return try? NSKeyedUnarchiver.unarchivedObject(ofClass: Account.self, from: encodedData)\n    }\n}\n\nprivate func unarchiveV1AccountWithData(_ data: Data) -> Account? {\n    // This is here to decode accounts saved with Tofu >= 1.11. Since then, we've moved to a\n    // slightly different encoding method (Accounts now conform to NSSecureCoding directly).\n    guard let coder = try? NSKeyedUnarchiver(forReadingFrom: data),\n          let secret = coder.decodeObject(of: NSData.self, forKey: \"secret\") as? Data,\n          coder.containsValue(forKey: \"algorithm\"),\n          let algorithm = Algorithm(rawValue: coder.decodeInt32(forKey: \"algorithm\")) else { return nil }\n\n    let password = Password()\n    password.algorithm = algorithm\n    password.secret = secret\n    password.digits = Int(coder.decodeInt32(forKey: \"digits\"))\n    password.timeBased = coder.decodeBool(forKey: \"timeBased\")\n    password.counter = Int(coder.decodeInt32(forKey: \"counter\"))\n    password.period = Int(coder.decodeInt32(forKey: \"period\"))\n\n    let account = Account()\n    account.name = coder.decodeObject(of: NSString.self, forKey: \"name\") as? String\n    account.issuer = coder.decodeObject(of: NSString.self, forKey: \"issuer\") as? String\n    account.password = password\n    return account\n}\n\nprivate func accountWithPersistentRef(_ persistentRef: Data) -> Account? {\n    let query: [NSString: AnyObject] = [\n        kSecClass: kSecClassGenericPassword,\n        kSecValuePersistentRef: persistentRef as AnyObject,\n        kSecReturnData: kCFBooleanTrue,\n    ]\n    var result: AnyObject?\n    let code = SecItemCopyMatching(query as CFDictionary, &result)\n    guard code == errSecSuccess,\n        let data = result as? Data,\n        let account = unarchiveAccountWithData(data) else { return nil }\n    account.persistentRef = persistentRef\n    return account\n}\n\nclass Keychain {\n    var accounts: [Account] {\n        let query: [NSString: AnyObject] = [\n            kSecClass: kSecClassGenericPassword,\n            kSecReturnPersistentRef: kCFBooleanTrue,\n            kSecMatchLimit: kSecMatchLimitAll,\n        ]\n        var result: AnyObject?\n        let code = SecItemCopyMatching(query as CFDictionary, &result)\n        guard code == errSecSuccess, let persistentRefs = result as? [Data] else { return [] }\n        return persistentRefs.compactMap { accountWithPersistentRef($0) }\n    }\n\n    func insertAccount(_ account: Account) -> Bool {\n        guard let accountData = try? archivedDataForKeychainWithAccount(account) else { return false }\n        let query: [NSString: AnyObject] = [\n            kSecClass: kSecClassGenericPassword,\n            kSecAttrAccount: ProcessInfo().globallyUniqueString as AnyObject,\n            kSecAttrDescription: account.description as AnyObject,\n            kSecValueData: accountData as AnyObject,\n            kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked,\n            kSecReturnPersistentRef: true as AnyObject,\n        ]\n        var result: AnyObject?\n        guard SecItemAdd(query as CFDictionary, &result) == errSecSuccess else { return false }\n        account.persistentRef = (result as! Data)\n        return true\n    }\n\n    func updateAccount(_ account: Account) -> Bool {\n        guard let accountData = try? archivedDataForKeychainWithAccount(account) else { return false }\n        let query: [NSString: Any] = [\n            kSecClass: kSecClassGenericPassword,\n            kSecValuePersistentRef: account.persistentRef!\n        ]\n        let attributes: [NSString: AnyObject] = [\n            kSecAttrDescription: account.description as AnyObject,\n            kSecValueData: accountData as AnyObject,\n            kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked,\n        ]\n        return SecItemUpdate(query as CFDictionary, attributes as CFDictionary) == errSecSuccess\n    }\n\n    func deleteAccount(_ account: Account) -> Bool {\n        let query: [NSString: Any] = [\n            kSecClass: kSecClassGenericPassword,\n            kSecValuePersistentRef: account.persistentRef!\n        ]\n        return SecItemDelete(query as CFDictionary) == errSecSuccess\n    }\n}\n"
  },
  {
    "path": "Tofu/Models/Password.swift",
    "content": "import Foundation\nimport CommonCrypto\n\nclass Password: Equatable, Hashable {\n\n    static func == (lhs: Password, rhs: Password) -> Bool {\n        return lhs.algorithm == rhs.algorithm && lhs.secret == rhs.secret && lhs.digits == rhs.digits &&\n        lhs.period == rhs.period && lhs.counter == rhs.counter && lhs.timeBased == rhs.timeBased\n    }\n\n    func hash(into hasher: inout Hasher) {\n        hasher.combine(algorithm)\n        hasher.combine(counter)\n        hasher.combine(digits)\n        hasher.combine(secret)\n        hasher.combine(period)\n        hasher.combine(timeBased)\n    }\n\n    var algorithm: Algorithm = .sha1\n    var counter = 0\n\n    private var _digits = 6\n    var digits: Int {\n        get { return _digits }\n        set {\n            if newValue < 6 {\n                assertionFailure(\"digits must be >= 6\")\n                _digits = 6\n            } else if newValue > 9 {\n                assertionFailure(\"digits must be <= 9\")\n                _digits = 9\n            } else {\n                _digits = newValue\n            }\n        }\n    }\n\n    private var _period = 30\n    var period: Int {\n        get { return _period }\n        set {\n            if newValue < 1 {\n                assertionFailure(\"period must be > 1\")\n                _period = 30\n            } else {\n                _period = newValue\n            }\n        }\n    }\n\n    var secret = Data()\n    var timeBased = false\n    \n    func valueForDate(_ date: Date) -> String {\n        let counter = timeBased ? UInt64(date.timeIntervalSince1970) / UInt64(period) : UInt64(self.counter)\n        var input = counter.bigEndian\n        let digest = UnsafeMutablePointer<UInt8>.allocate(capacity: algorithm.digestLength)\n        defer { digest.deallocate() }\n        secret.withUnsafeBytes { secretBytes in CCHmac(algorithm.hmacAlgorithm, secretBytes.baseAddress, secret.count, &input, MemoryLayout.size(ofValue: input), digest) }\n        let offset = digest[algorithm.digestLength - 1] & 0x0f\n        let digestData = Data(bytes: digest, count: algorithm.digestLength)\n        let bigEndianNumber = try! digestData.alignmentSafeLoad(fromByteOffset: Int(offset), as: UInt32.self)\n        let number = UInt32(bigEndian: bigEndianNumber) & 0x7fffffff\n        return String(format: \"%0\\(digits)d\", number % UInt32(pow(10, Float(digits))))\n    }\n    \n    func progressForDate(_ date: Date) -> Double {\n        return timeIntervalRemainingForDate(date) / Double(period)\n    }\n    \n    func timeIntervalRemainingForDate(_ date: Date) -> Double {\n        let period = Double(self.period)\n        return period - (date.timeIntervalSince1970.truncatingRemainder(dividingBy: period))\n    }\n}\n"
  },
  {
    "path": "Tofu/Protocols/AccountCreationDelegate.swift",
    "content": "protocol AccountCreationDelegate: AnyObject {\n    func createAccount(_ account: Account)\n}\n"
  },
  {
    "path": "Tofu/Protocols/AccountUpdateDelegate.swift",
    "content": "protocol AccountUpdateDelegate: AnyObject {\n    func updateAccount(_ account: Account)\n}\n"
  },
  {
    "path": "Tofu/Protocols/AlgorithmSelectionDelegate.swift",
    "content": "protocol AlgorithmSelectionDelegate: AnyObject {\n    func selectAlgorithm(_ algorithm: Algorithm)\n}\n"
  },
  {
    "path": "Tofu/Tofu.xcconfig",
    "content": "// Configuration settings file format documentation can be found at:\n// https://help.apple.com/xcode/#/dev745c5c974\n\nMARKETING_VERSION = 1.11\n"
  },
  {
    "path": "Tofu/Views/AccountCell.swift",
    "content": "import UIKit\n\nprivate struct CaseInsensitiveString: Hashable, ExpressibleByStringLiteral {\n    let value: String\n\n    init(stringLiteral: String) {\n        self.init(stringLiteral)\n    }\n\n    init(_ string: String) {\n        self.value = string.lowercased()\n    }\n}\n\nprivate let imageNames: [CaseInsensitiveString: String] = [\n    \"17th Shard\": \"17thShard\",\n    \"Adobe ID\": \"Adobe\",\n    \"Allegro\": \"Allegro\",\n    \"Amazon Web Services\": \"AWS\",\n    \"Amazon\": \"Amazon\",\n    \"AnonAddy\": \"AnonAddy\",\n    \"Atlassian\": \"Atlassian\",\n    \"AWS\": \"AWS\",\n    \"Backblaze\": \"Backblaze\",\n    \"Basecamp's+Launchpad\": \"Basecamp\",\n    \"Binance.com\": \"Binance\",\n    \"BitBayAuth\": \"BitBay\",\n    \"Bitbucket\": \"Bitbucket\",\n    \"Bitstamp\": \"Bitstamp\",\n    \"Bittrex\": \"Bittrex\",\n    \"Bitwarden\": \"Bitwarden\",\n    \"Cloudflare\": \"Cloudflare\",\n    \"Coinbase\": \"Coinbase\",\n    \"Contentful\": \"Contentful\",\n    \"CorporateTrust\": \"CorporateTrust\",\n    \"CyDIS\": \"CyDIS\",\n    \"DigitalOcean\": \"DigitalOcean\",\n    \"Discord\": \"Discord\",\n    \"DNSimple\": \"DNSimple\",\n    \"Dropbox\": \"Dropbox\",\n    \"Electronic Arts\": \"ElectronicArts\",\n    \"Epic+Games\": \"EpicGames\",\n    \"Evernote\": \"Evernote\",\n    \"Facebook\": \"Facebook\",\n    \"Fastmail\": \"FastMail\",\n    \"Fidelity\": \"Fidelity\",\n    \"Figma\": \"Figma\",\n    \"Firefox\": \"Firefox\",\n    \"gandi.net\": \"Gandi\",\n    \"Gitea\": \"Gitea\",\n    \"GitHub\": \"GitHub\",\n    \"gitlab.com\": \"GitLab\",\n    \"GoDaddy\": \"GoDaddy\",\n    \"Google\": \"Google\",\n    \"GreenAddress\": \"GreenAddress\",\n    \"Hack The Box\": \"HackTheBox\",\n    \"Heroku\": \"Heroku\",\n    \"Hetzner\": \"Hetzner\",\n    \"HEY\": \"HEY\",\n    \"Home Assistant\": \"HomeAssistant\",\n    \"Honeybadger.io\": \"Honeybadger\",\n    \"Hostek\": \"Hostek\",\n    \"Hover\": \"Hover\",\n    \"hub.docker.com\": \"Docker\",\n    \"HumbleBundle\": \"HumbleBundle\",\n    \"id.unity.com\": \"Unity\",\n    \"IFTTT\": \"IFTTT\",\n    \"ID.me\": \"IDme\",\n    \"Instagram\": \"Instagram\",\n    \"Intercom\": \"Intercom\",\n    \"JetBrains+Account\": \"JetBrains\",\n    \"Kickstarter\": \"Kickstarter\",\n    \"LastPass\": \"LastPass\",\n    \"LinkedIn\": \"LinkedIn\",\n    \"LinodeManager\": \"Linode\",\n    \"Lobsters\": \"Lobsters\",\n    \"LocalBitcoins\": \"LocalBitcoins\",\n    \"Mastodon\": \"Mastodon\",\n    \"Mailchimp\": \"Mailchimp\",\n    \"Mega\": \"Mega\",\n    \"Microsoft\": \"Microsoft\",\n    \"Name.com\": \"Name.com\",\n    \"Netlify\": \"Netlify\",\n    \"Nextcloud\": \"Nextcloud\",\n    \"Nexus Mods\": \"NexusMods\",\n    \"NiceHash - New platform\": \"NiceHash\",\n    \"NiceHash\": \"NiceHash\",\n    \"Nintendo Account\": \"Nintendo\",\n    \"Njalla\": \"Njalla\",\n    \"Nodecraft Inc\": \"Nodecraft\",\n    \"NordPass\": \"NordPass\",\n    \"ownCloud\": \"ownCloud\",\n    \"Paladin Extensions\": \"PaladinExtensions\",\n    \"Parler\": \"Parler\",\n    \"PayPal\": \"PayPal\",\n    \"Philips Hue\": \"PhilipsHue\",\n    \"Posteo\": \"Posteo\",\n    \"Postmark\": \"Postmark\",\n    \"Privacy.com\": \"Privacy\",\n    \"ProfitBricks\": \"ProfitBricks\",\n    \"ProtonMail\": \"ProtonMail\",\n    \"PrusaAccount\": \"PrusaAccount\",\n    \"Reddit\": \"Reddit\",\n    \"Robinhood\": \"Robinhood\",\n    \"rubygems.org\": \"RubyGems\",\n    \"RuneScape\": \"RuneScape\",\n    \"SimpleLogin\": \"SimpleLogin\",\n    \"Slack\": \"Slack\",\n    \"Snapchat\": \"Snapchat\",\n    \"Sony\": \"Sony\",\n    \"Squarespace\": \"Squarespace\",\n    \"STACK\": \"STACK\",\n    \"Standard Notes\": \"StandardNotes\",\n    \"Stripe\": \"Stripe\",\n    \"Surfshark\": \"Surfshark\",\n    \"TETR.IO\": \"TETR.IO\",\n    \"Time4VPS\": \"Time4VPS\",\n    \"TorGuard\": \"TorGuard\",\n    \"Tresorit\": \"Tresorit\",\n    \"Tumblr\": \"Tumblr\",\n    \"TurboTax\": \"TurboTax\",\n    \"Tutanota\": \"Tutanota\",\n    \"Tweakers\": \"Tweakers\",\n    \"Twilio\": \"Twilio\",\n    \"Twitch\": \"Twitch\",\n    \"Twitter\": \"Twitter\",\n    \"Uber\": \"Uber\",\n    \"Ubisoft\": \"Ubisoft\",\n    \"VKontakte\": \"VKontakte\",\n    \"Wallabag\": \"Wallabag\",\n    \"WordPress\": \"WordPress\",\n    \"WordPress.com\": \"WordPress\",\n    \"YNAB\": \"YNAB\",\n    \"Zoom\": \"Zoom\",\n]\n\nprivate func image(for account: Account) -> UIImage? {\n    if let issuer = account.issuer,\n       let imageName = imageNames[CaseInsensitiveString(issuer)] {\n        return UIImage(named: imageName)!\n    }\n\n    // Scanning Mailchimp's QR codes generates accounts without issuers and with names similar to this: username@us20.admin.mailchimp.com\n    if let name = account.name,\n       name.contains(\"admin.mailchimp.com\") {\n        return UIImage(named: \"Mailchimp\")!\n    }\n\n    return nil\n}\n\nprivate func imageWithColor(_ color: UIColor, size: CGSize) -> UIImage {\n    UIGraphicsBeginImageContext(size)\n    color.setFill()\n    UIRectFill(CGRect(x: 0, y: 0, width: size.width, height: size.height))\n    let image = UIGraphicsGetImageFromCurrentImageContext()\n    UIGraphicsEndImageContext()\n    return image!;\n}\n\nprivate func formattedValue(_ value: String) -> String {\n    let length = value.count\n    let prefix = String(value.prefix(length / 2))\n    let suffix = String(value.suffix(length - length / 2))\n    return \"\\(prefix) \\(suffix)\"\n}\n\nclass AccountCell: UITableViewCell {\n    @IBOutlet weak var accountImageView: UIImageView!\n    @IBOutlet weak var issuerLabel: UILabel!\n    @IBOutlet weak var valueLabel: UILabel!\n    @IBOutlet weak var identifierLabel: UILabel!\n    var delegate: AccountUpdateDelegate?\n    private let button = UIButton(type: .custom)\n    private let progressView = CircularProgressView()\n\n    var account: Account! {\n        didSet {\n            accessoryView = account.password.timeBased ? progressView : button\n            let now = Date()\n            updateWithDate(now)\n        }\n    }\n\n    override func awakeFromNib() {\n        accountImageView.layer.cornerRadius = accountImageView.bounds.size.width / 4.5\n        accountImageView.layer.cornerCurve = .continuous\n        accountImageView.layer.masksToBounds = true\n        accountImageView.layer.borderWidth = 1\n\n        updateColors()\n\n        let featureSettings: [[UIFontDescriptor.FeatureKey: Any]] =\n            [[.featureIdentifier: kNumberSpacingType, .typeIdentifier: kMonospacedNumbersSelector]]\n        let fontDescriptor = valueLabel.font.fontDescriptor.addingAttributes([.featureSettings: featureSettings])\n        valueLabel.font = UIFont(descriptor: fontDescriptor, size: 0)\n        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 13)\n        button.setTitle(\"NEXT\", for: UIControl.State())\n        button.setTitleColor(tintColor, for: UIControl.State())\n        button.setTitleColor(UIColor.white, for: .highlighted)\n        button.setTitleColor(UIColor.white, for: .selected)\n        button.layer.borderColor = button.tintColor.cgColor\n        button.layer.borderWidth = 1\n        button.layer.cornerRadius = 4\n        button.contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)\n        button.sizeToFit()\n        let image = imageWithColor(tintColor, size: button.bounds.size)\n        button.setBackgroundImage(image, for: .highlighted)\n        button.setBackgroundImage(image, for: .selected)\n        button.clipsToBounds = true\n        button.addTarget(self, action: #selector(didPressButton(_:)), for: .touchUpInside)\n    }\n\n    @objc func didPressButton(_ sender: UIButton) {\n        account.password.counter += 1\n        delegate?.updateAccount(account)\n    }\n\n    func updateWithDate(_ date: Date) {\n        accountImageView.image = Tofu.image(for: account)\n        issuerLabel.text = (account.description.first ?? \"?\").uppercased()\n        issuerLabel.isHidden = accountImageView.image != nil\n        valueLabel.text = formattedValue(account.password.valueForDate(date))\n        identifierLabel.text = account.description\n        progressView.progress = account.password.progressForDate(date)\n        progressView.tintColor = account.password.timeIntervalRemainingForDate(date) < 5 ?\n            .systemRed : tintColor\n    }\n\n    override func copy(_ sender: Any?) {\n        guard let labelText = valueLabel.text else { return }\n\n        UIPasteboard.general.string = labelText.replacingOccurrences(of: \" \", with: \"\")\n    }\n\n    override var canBecomeFirstResponder: Bool {\n        return true\n    }\n\n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        super.traitCollectionDidChange(previousTraitCollection)\n\n        if traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle,\n           let account = account {\n            // When we change between light and dark mode, placeholder images need to be re-generated.\n            accountImageView.image = Tofu.image(for: account)\n\n            updateColors()\n        }\n    }\n\n    private func updateColors() {\n        if traitCollection.userInterfaceStyle == .dark {\n            accountImageView.layer.backgroundColor = CGColor(red: 0.08, green: 0.08, blue: 0.1, alpha: 1)\n            accountImageView.layer.borderColor = CGColor(red: 1, green: 1, blue: 1, alpha: 0.1)\n        } else {\n            accountImageView.layer.backgroundColor = CGColor(red: 0.97, green: 0.97, blue: 0.98, alpha: 1)\n            accountImageView.layer.borderColor = CGColor(red: 0, green: 0, blue: 0, alpha: 0.1)\n        }\n    }\n}\n"
  },
  {
    "path": "Tofu/Views/CircularProgressView.swift",
    "content": "import UIKit\n\nclass CircularProgressView: UIView {\n    var progress: Double = 0 {\n        didSet {\n            maskLayer.strokeEnd = min(max(CGFloat(progress), 0), 1)\n        }\n    }\n    override var tintColor: UIColor! {\n        didSet {\n            imageView.tintColor = tintColor\n            backgroundImageView.tintColor = tintColor\n        }\n    }\n    private let maskLayer = CAShapeLayer()\n    private let imageView: UIImageView\n    private let backgroundImageView: UIImageView\n\n    init() {\n        let backgroundImage = UIImage(named: \"CircularProgressViewBorderThin\")!\n        backgroundImageView = UIImageView(image: backgroundImage)\n        let image = UIImage(named: \"CircularProgressViewBorderThick\")!\n        imageView = UIImageView(image: image)\n        super.init(frame: backgroundImageView.frame)\n        let x = frame.size.width / 2\n        let y = frame.size.height / 2\n        let radius = max(x, y)\n        let path = CGMutablePath()\n        path.move(to: CGPoint(x: x, y: y - radius / 2))\n        path.addArc(center: CGPoint(x: x, y: y), radius: radius / 2, startAngle: -CGFloat.pi / 2, endAngle: 3 * CGFloat.pi / 2, clockwise: false)\n        maskLayer.fillColor = UIColor.clear.cgColor\n        maskLayer.strokeColor = UIColor.black.cgColor\n        maskLayer.lineWidth = radius\n        maskLayer.path = path\n        maskLayer.strokeEnd = CGFloat(progress)\n        imageView.layer.mask = maskLayer\n        addSubview(backgroundImageView)\n        addSubview(imageView)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "Tofu.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t2506E6E31C6F83AE00E694D3 /* Password.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2506E6E21C6F83AE00E694D3 /* Password.swift */; };\n\t\t2506E6E51C6F9A5A00E694D3 /* Algorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2506E6E41C6F9A5A00E694D3 /* Algorithm.swift */; };\n\t\t250CB0111C81BF0B00D48AC9 /* AccountsTableViewUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 250CB0101C81BF0B00D48AC9 /* AccountsTableViewUpdater.swift */; };\n\t\t251A79871C7A68BC00E2747E /* AccountSearchResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251A79861C7A68BC00E2747E /* AccountSearchResultsViewController.swift */; };\n\t\t259FAC501C765BB00013B4F7 /* AccountCreationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259FAC4F1C765BB00013B4F7 /* AccountCreationDelegate.swift */; };\n\t\t259FAC521C765F4B0013B4F7 /* AccountUpdateDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259FAC511C765F4B0013B4F7 /* AccountUpdateDelegate.swift */; };\n\t\t259FAC541C765FEB0013B4F7 /* AlgorithmSelectionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 259FAC531C765FEB0013B4F7 /* AlgorithmSelectionDelegate.swift */; };\n\t\t25A81D0E1C500E9C008E51B9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D0D1C500E9C008E51B9 /* AppDelegate.swift */; };\n\t\t25A81D101C500E9C008E51B9 /* AccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D0F1C500E9C008E51B9 /* AccountsViewController.swift */; };\n\t\t25A81D131C500E9C008E51B9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 25A81D111C500E9C008E51B9 /* Main.storyboard */; };\n\t\t25A81D151C500E9C008E51B9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 25A81D141C500E9C008E51B9 /* Assets.xcassets */; };\n\t\t25A81D181C500E9C008E51B9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 25A81D161C500E9C008E51B9 /* LaunchScreen.storyboard */; };\n\t\t25A81D2E1C500E9C008E51B9 /* TofuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D2D1C500E9C008E51B9 /* TofuUITests.swift */; };\n\t\t25A81D3C1C502755008E51B9 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D3B1C502755008E51B9 /* Keychain.swift */; };\n\t\t25A81D3E1C51758C008E51B9 /* AccountCreationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D3D1C51758C008E51B9 /* AccountCreationViewController.swift */; };\n\t\t25A81D431C5176F0008E51B9 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D421C5176F0008E51B9 /* Account.swift */; };\n\t\t25A81D451C53923D008E51B9 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D441C53923D008E51B9 /* Data.swift */; };\n\t\t25A81D471C539253008E51B9 /* DataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D461C539253008E51B9 /* DataTests.swift */; };\n\t\t25A81D4B1C540058008E51B9 /* PasswordTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D4A1C540058008E51B9 /* PasswordTests.swift */; };\n\t\t25A81D511C551F17008E51B9 /* AccountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D501C551F17008E51B9 /* AccountCell.swift */; };\n\t\t25A81D531C5558A2008E51B9 /* AccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D521C5558A2008E51B9 /* AccountTests.swift */; };\n\t\t25A81D551C5BC31B008E51B9 /* AccountUpdateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D541C5BC31B008E51B9 /* AccountUpdateViewController.swift */; };\n\t\t25A81D571C5DFC5C008E51B9 /* ScanningViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D561C5DFC5C008E51B9 /* ScanningViewController.swift */; };\n\t\t25A81D5B1C5F656A008E51B9 /* CircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A81D5A1C5F656A008E51B9 /* CircularProgressView.swift */; };\n\t\t25CF8B6C1C57946B00665FFE /* AlgorithmsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25CF8B6B1C57946B00665FFE /* AlgorithmsViewController.swift */; };\n\t\t50C456A12B2325A0009C83C6 /* ExternalDataInterop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C456A02B2325A0009C83C6 /* ExternalDataInterop.swift */; };\n\t\tEB61B64D25D2BE15000B1735 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB61B64C25D2BE15000B1735 /* UIViewController.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t25A81D1F1C500E9C008E51B9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 25A81D021C500E9B008E51B9 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 25A81D091C500E9C008E51B9;\n\t\t\tremoteInfo = Tofu;\n\t\t};\n\t\t25A81D2A1C500E9C008E51B9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 25A81D021C500E9B008E51B9 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 25A81D091C500E9C008E51B9;\n\t\t\tremoteInfo = Tofu;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t2506E6E21C6F83AE00E694D3 /* Password.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Password.swift; sourceTree = \"<group>\"; };\n\t\t2506E6E41C6F9A5A00E694D3 /* Algorithm.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Algorithm.swift; sourceTree = \"<group>\"; };\n\t\t250CB0101C81BF0B00D48AC9 /* AccountsTableViewUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsTableViewUpdater.swift; sourceTree = \"<group>\"; };\n\t\t251A79861C7A68BC00E2747E /* AccountSearchResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountSearchResultsViewController.swift; sourceTree = \"<group>\"; };\n\t\t259FAC4F1C765BB00013B4F7 /* AccountCreationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountCreationDelegate.swift; sourceTree = \"<group>\"; };\n\t\t259FAC511C765F4B0013B4F7 /* AccountUpdateDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountUpdateDelegate.swift; sourceTree = \"<group>\"; };\n\t\t259FAC531C765FEB0013B4F7 /* AlgorithmSelectionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlgorithmSelectionDelegate.swift; sourceTree = \"<group>\"; };\n\t\t25A81D0A1C500E9C008E51B9 /* Tofu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tofu.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t25A81D0D1C500E9C008E51B9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t25A81D0F1C500E9C008E51B9 /* AccountsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsViewController.swift; sourceTree = \"<group>\"; };\n\t\t25A81D121C500E9C008E51B9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t25A81D141C500E9C008E51B9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t25A81D171C500E9C008E51B9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t25A81D191C500E9C008E51B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t25A81D1E1C500E9C008E51B9 /* TofuTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TofuTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t25A81D241C500E9C008E51B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t25A81D291C500E9C008E51B9 /* TofuUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TofuUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t25A81D2D1C500E9C008E51B9 /* TofuUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TofuUITests.swift; sourceTree = \"<group>\"; };\n\t\t25A81D2F1C500E9C008E51B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t25A81D3B1C502755008E51B9 /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = \"<group>\"; };\n\t\t25A81D3D1C51758C008E51B9 /* AccountCreationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountCreationViewController.swift; sourceTree = \"<group>\"; };\n\t\t25A81D421C5176F0008E51B9 /* Account.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = \"<group>\"; };\n\t\t25A81D441C53923D008E51B9 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = \"<group>\"; };\n\t\t25A81D461C539253008E51B9 /* DataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataTests.swift; sourceTree = \"<group>\"; };\n\t\t25A81D4A1C540058008E51B9 /* PasswordTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordTests.swift; sourceTree = \"<group>\"; };\n\t\t25A81D501C551F17008E51B9 /* AccountCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountCell.swift; sourceTree = \"<group>\"; };\n\t\t25A81D521C5558A2008E51B9 /* AccountTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountTests.swift; sourceTree = \"<group>\"; };\n\t\t25A81D541C5BC31B008E51B9 /* AccountUpdateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountUpdateViewController.swift; sourceTree = \"<group>\"; };\n\t\t25A81D561C5DFC5C008E51B9 /* ScanningViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanningViewController.swift; sourceTree = \"<group>\"; };\n\t\t25A81D5A1C5F656A008E51B9 /* CircularProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircularProgressView.swift; sourceTree = \"<group>\"; };\n\t\t25CF8B6B1C57946B00665FFE /* AlgorithmsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlgorithmsViewController.swift; sourceTree = \"<group>\"; };\n\t\t50C456992B232054009C83C6 /* Tofu.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Tofu.xcconfig; path = Tofu/Tofu.xcconfig; sourceTree = \"<group>\"; };\n\t\t50C456A02B2325A0009C83C6 /* ExternalDataInterop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalDataInterop.swift; sourceTree = \"<group>\"; };\n\t\tEB61B64C25D2BE15000B1735 /* UIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewController.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t25A81D071C500E9C008E51B9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D1B1C500E9C008E51B9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D261C500E9C008E51B9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t25A81D011C500E9B008E51B9 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50C456992B232054009C83C6 /* Tofu.xcconfig */,\n\t\t\t\t25A81D0C1C500E9C008E51B9 /* Tofu */,\n\t\t\t\t25A81D211C500E9C008E51B9 /* TofuTests */,\n\t\t\t\t25A81D2C1C500E9C008E51B9 /* TofuUITests */,\n\t\t\t\t25A81D0B1C500E9C008E51B9 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25A81D0B1C500E9C008E51B9 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D0A1C500E9C008E51B9 /* Tofu.app */,\n\t\t\t\t25A81D1E1C500E9C008E51B9 /* TofuTests.xctest */,\n\t\t\t\t25A81D291C500E9C008E51B9 /* TofuUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25A81D0C1C500E9C008E51B9 /* Tofu */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50C4569B2B2324E2009C83C6 /* Extensions */,\n\t\t\t\t50C4569C2B2324F3009C83C6 /* Protocols */,\n\t\t\t\t50C4569D2B232507009C83C6 /* Models */,\n\t\t\t\t50C4569E2B23251B009C83C6 /* Views */,\n\t\t\t\t50C4569F2B23252D009C83C6 /* Controllers */,\n\t\t\t\t25A81D0D1C500E9C008E51B9 /* AppDelegate.swift */,\n\t\t\t\t25A81D111C500E9C008E51B9 /* Main.storyboard */,\n\t\t\t\t25A81D161C500E9C008E51B9 /* LaunchScreen.storyboard */,\n\t\t\t\t25A81D141C500E9C008E51B9 /* Assets.xcassets */,\n\t\t\t\t25A81D191C500E9C008E51B9 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tofu;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25A81D211C500E9C008E51B9 /* TofuTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D461C539253008E51B9 /* DataTests.swift */,\n\t\t\t\t25A81D4A1C540058008E51B9 /* PasswordTests.swift */,\n\t\t\t\t25A81D521C5558A2008E51B9 /* AccountTests.swift */,\n\t\t\t\t25A81D241C500E9C008E51B9 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = TofuTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25A81D2C1C500E9C008E51B9 /* TofuUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D2D1C500E9C008E51B9 /* TofuUITests.swift */,\n\t\t\t\t25A81D2F1C500E9C008E51B9 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = TofuUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50C4569B2B2324E2009C83C6 /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D441C53923D008E51B9 /* Data.swift */,\n\t\t\t\tEB61B64C25D2BE15000B1735 /* UIViewController.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50C4569C2B2324F3009C83C6 /* Protocols */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t259FAC4F1C765BB00013B4F7 /* AccountCreationDelegate.swift */,\n\t\t\t\t259FAC511C765F4B0013B4F7 /* AccountUpdateDelegate.swift */,\n\t\t\t\t259FAC531C765FEB0013B4F7 /* AlgorithmSelectionDelegate.swift */,\n\t\t\t);\n\t\t\tpath = Protocols;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50C4569D2B232507009C83C6 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D421C5176F0008E51B9 /* Account.swift */,\n\t\t\t\t25A81D3B1C502755008E51B9 /* Keychain.swift */,\n\t\t\t\t2506E6E21C6F83AE00E694D3 /* Password.swift */,\n\t\t\t\t2506E6E41C6F9A5A00E694D3 /* Algorithm.swift */,\n\t\t\t\t50C456A02B2325A0009C83C6 /* ExternalDataInterop.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50C4569E2B23251B009C83C6 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D501C551F17008E51B9 /* AccountCell.swift */,\n\t\t\t\t25A81D5A1C5F656A008E51B9 /* CircularProgressView.swift */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50C4569F2B23252D009C83C6 /* Controllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D0F1C500E9C008E51B9 /* AccountsViewController.swift */,\n\t\t\t\t25A81D3D1C51758C008E51B9 /* AccountCreationViewController.swift */,\n\t\t\t\t25CF8B6B1C57946B00665FFE /* AlgorithmsViewController.swift */,\n\t\t\t\t25A81D541C5BC31B008E51B9 /* AccountUpdateViewController.swift */,\n\t\t\t\t25A81D561C5DFC5C008E51B9 /* ScanningViewController.swift */,\n\t\t\t\t251A79861C7A68BC00E2747E /* AccountSearchResultsViewController.swift */,\n\t\t\t\t250CB0101C81BF0B00D48AC9 /* AccountsTableViewUpdater.swift */,\n\t\t\t);\n\t\t\tpath = Controllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t25A81D091C500E9C008E51B9 /* Tofu */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 25A81D321C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"Tofu\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50C4569A2B2321D0009C83C6 /* Generate Version Headers */,\n\t\t\t\t25A81D061C500E9C008E51B9 /* Sources */,\n\t\t\t\t25A81D071C500E9C008E51B9 /* Frameworks */,\n\t\t\t\t25A81D081C500E9C008E51B9 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tofu;\n\t\t\tproductName = Tofu;\n\t\t\tproductReference = 25A81D0A1C500E9C008E51B9 /* Tofu.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t25A81D1D1C500E9C008E51B9 /* TofuTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 25A81D351C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"TofuTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t25A81D1A1C500E9C008E51B9 /* Sources */,\n\t\t\t\t25A81D1B1C500E9C008E51B9 /* Frameworks */,\n\t\t\t\t25A81D1C1C500E9C008E51B9 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t25A81D201C500E9C008E51B9 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TofuTests;\n\t\t\tproductName = TofuTests;\n\t\t\tproductReference = 25A81D1E1C500E9C008E51B9 /* TofuTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t25A81D281C500E9C008E51B9 /* TofuUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 25A81D381C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"TofuUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t25A81D251C500E9C008E51B9 /* Sources */,\n\t\t\t\t25A81D261C500E9C008E51B9 /* Frameworks */,\n\t\t\t\t25A81D271C500E9C008E51B9 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t25A81D2B1C500E9C008E51B9 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TofuUITests;\n\t\t\tproductName = TofuUITests;\n\t\t\tproductReference = 25A81D291C500E9C008E51B9 /* TofuUITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t25A81D021C500E9B008E51B9 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"Daniel Kennett\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t25A81D091C500E9C008E51B9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tDevelopmentTeam = QG8TM5XJ84;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\t25A81D1D1C500E9C008E51B9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tTestTargetID = 25A81D091C500E9C008E51B9;\n\t\t\t\t\t};\n\t\t\t\t\t25A81D281C500E9C008E51B9 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tTestTargetID = 25A81D091C500E9C008E51B9;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 25A81D051C500E9B008E51B9 /* Build configuration list for PBXProject \"Tofu\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 25A81D011C500E9B008E51B9;\n\t\t\tproductRefGroup = 25A81D0B1C500E9C008E51B9 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t25A81D091C500E9C008E51B9 /* Tofu */,\n\t\t\t\t25A81D1D1C500E9C008E51B9 /* TofuTests */,\n\t\t\t\t25A81D281C500E9C008E51B9 /* TofuUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t25A81D081C500E9C008E51B9 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t25A81D181C500E9C008E51B9 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t25A81D151C500E9C008E51B9 /* Assets.xcassets in Resources */,\n\t\t\t\t25A81D131C500E9C008E51B9 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D1C1C500E9C008E51B9 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D271C500E9C008E51B9 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t50C4569A2B2321D0009C83C6 /* Generate Version Headers */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Generate Version Headers\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/include/TofuVersions.h\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"GIT_RELEASE_VERSION=$(git describe --tags --always --dirty --long)\\nGIT_RELEASE_VERSION=${GIT_RELEASE_VERSION/-0-/-}\\n\\nCOMMITS=$(git rev-list HEAD | wc -l)\\nCOMMITS=$(($COMMITS))\\n\\nFINAL_HEADER_LOCATION=\\\"${BUILT_PRODUCTS_DIR}/include/TofuVersions.h\\\"\\nTEMP_HEADER_LOCATION=\\\"${FINAL_HEADER_LOCATION}~\\\"\\n\\nmkdir -p \\\"${BUILT_PRODUCTS_DIR}/include\\\"\\n\\necho \\\"#define TOFU_VERBOSE_VERSION ${GIT_RELEASE_VERSION#*v}\\\" > \\\"${TEMP_HEADER_LOCATION}\\\"\\necho \\\"#define TOFU_BUNDLE_VERSION ${COMMITS}\\\" >> \\\"${TEMP_HEADER_LOCATION}\\\"\\necho \\\"#define TOFU_MARKETING_VERSION ${MARKETING_VERSION}\\\" >> \\\"${TEMP_HEADER_LOCATION}\\\"\\n\\ncmp --silent \\\"${FINAL_HEADER_LOCATION}\\\" \\\"${TEMP_HEADER_LOCATION}\\\"\\n\\nif [ $? -eq 0 ]\\nthen\\n    echo \\\"Versions unchanged - skipping.\\\"\\n    rm \\\"${TEMP_HEADER_LOCATION}\\\"\\nelse\\n    rm -f \\\"${FINAL_HEADER_LOCATION}\\\"\\n    mv \\\"${TEMP_HEADER_LOCATION}\\\" \\\"${FINAL_HEADER_LOCATION}\\\"\\nfi\\n\\necho \\\"${FINAL_HEADER_LOCATION}\\\"\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t25A81D061C500E9C008E51B9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t25A81D101C500E9C008E51B9 /* AccountsViewController.swift in Sources */,\n\t\t\t\t259FAC521C765F4B0013B4F7 /* AccountUpdateDelegate.swift in Sources */,\n\t\t\t\t25A81D511C551F17008E51B9 /* AccountCell.swift in Sources */,\n\t\t\t\tEB61B64D25D2BE15000B1735 /* UIViewController.swift in Sources */,\n\t\t\t\t251A79871C7A68BC00E2747E /* AccountSearchResultsViewController.swift in Sources */,\n\t\t\t\t25A81D0E1C500E9C008E51B9 /* AppDelegate.swift in Sources */,\n\t\t\t\t25A81D451C53923D008E51B9 /* Data.swift in Sources */,\n\t\t\t\t2506E6E51C6F9A5A00E694D3 /* Algorithm.swift in Sources */,\n\t\t\t\t259FAC541C765FEB0013B4F7 /* AlgorithmSelectionDelegate.swift in Sources */,\n\t\t\t\t25A81D5B1C5F656A008E51B9 /* CircularProgressView.swift in Sources */,\n\t\t\t\t2506E6E31C6F83AE00E694D3 /* Password.swift in Sources */,\n\t\t\t\t25A81D571C5DFC5C008E51B9 /* ScanningViewController.swift in Sources */,\n\t\t\t\t25CF8B6C1C57946B00665FFE /* AlgorithmsViewController.swift in Sources */,\n\t\t\t\t25A81D3C1C502755008E51B9 /* Keychain.swift in Sources */,\n\t\t\t\t250CB0111C81BF0B00D48AC9 /* AccountsTableViewUpdater.swift in Sources */,\n\t\t\t\t259FAC501C765BB00013B4F7 /* AccountCreationDelegate.swift in Sources */,\n\t\t\t\t25A81D551C5BC31B008E51B9 /* AccountUpdateViewController.swift in Sources */,\n\t\t\t\t25A81D3E1C51758C008E51B9 /* AccountCreationViewController.swift in Sources */,\n\t\t\t\t25A81D431C5176F0008E51B9 /* Account.swift in Sources */,\n\t\t\t\t50C456A12B2325A0009C83C6 /* ExternalDataInterop.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D1A1C500E9C008E51B9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t25A81D4B1C540058008E51B9 /* PasswordTests.swift in Sources */,\n\t\t\t\t25A81D471C539253008E51B9 /* DataTests.swift in Sources */,\n\t\t\t\t25A81D531C5558A2008E51B9 /* AccountTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t25A81D251C500E9C008E51B9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t25A81D2E1C500E9C008E51B9 /* TofuUITests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t25A81D201C500E9C008E51B9 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 25A81D091C500E9C008E51B9 /* Tofu */;\n\t\t\ttargetProxy = 25A81D1F1C500E9C008E51B9 /* PBXContainerItemProxy */;\n\t\t};\n\t\t25A81D2B1C500E9C008E51B9 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 25A81D091C500E9C008E51B9 /* Tofu */;\n\t\t\ttargetProxy = 25A81D2A1C500E9C008E51B9 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t25A81D111C500E9C008E51B9 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D121C500E9C008E51B9 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25A81D161C500E9C008E51B9 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t25A81D171C500E9C008E51B9 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t25A81D301C500E9C008E51B9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t25A81D311C500E9C008E51B9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t25A81D331C500E9C008E51B9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 50C456992B232054009C83C6 /* Tofu.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = QG8TM5XJ84;\n\t\t\t\tINFOPLIST_FILE = Tofu/Info.plist;\n\t\t\t\tINFOPLIST_OTHER_PREPROCESSOR_FLAGS = \"-traditional\";\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"${BUILT_PRODUCTS_DIR}/include/TofuVersions.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.Tofu;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t25A81D341C500E9C008E51B9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 50C456992B232054009C83C6 /* Tofu.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = QG8TM5XJ84;\n\t\t\t\tINFOPLIST_FILE = Tofu/Info.plist;\n\t\t\t\tINFOPLIST_OTHER_PREPROCESSOR_FLAGS = \"-traditional\";\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"${BUILT_PRODUCTS_DIR}/include/TofuVersions.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.Tofu;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t25A81D361C500E9C008E51B9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tINFOPLIST_FILE = TofuTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.TofuTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Tofu.app/Tofu\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t25A81D371C500E9C008E51B9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tINFOPLIST_FILE = TofuTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.TofuTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Tofu.app/Tofu\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t25A81D391C500E9C008E51B9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = TofuUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.TofuUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_TARGET_NAME = Tofu;\n\t\t\t\tUSES_XCTRUNNER = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t25A81D3A1C500E9C008E51B9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = TofuUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.calleerlandsson.TofuUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_TARGET_NAME = Tofu;\n\t\t\t\tUSES_XCTRUNNER = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t25A81D051C500E9B008E51B9 /* Build configuration list for PBXProject \"Tofu\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t25A81D301C500E9C008E51B9 /* Debug */,\n\t\t\t\t25A81D311C500E9C008E51B9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t25A81D321C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"Tofu\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t25A81D331C500E9C008E51B9 /* Debug */,\n\t\t\t\t25A81D341C500E9C008E51B9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t25A81D351C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"TofuTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t25A81D361C500E9C008E51B9 /* Debug */,\n\t\t\t\t25A81D371C500E9C008E51B9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t25A81D381C500E9C008E51B9 /* Build configuration list for PBXNativeTarget \"TofuUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t25A81D391C500E9C008E51B9 /* Debug */,\n\t\t\t\t25A81D3A1C500E9C008E51B9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 25A81D021C500E9B008E51B9 /* Project object */;\n}\n"
  },
  {
    "path": "Tofu.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tofu.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Tofu.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "TofuTests/AccountTests.swift",
    "content": "import XCTest\n@testable import Tofu\n\nclass AccountTests: XCTestCase {\n    func testInitWithURL() {\n        var account = Account(url: URL(\n            string: \"otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        XCTAssertEqual(account?.issuer, \"Example\")\n        XCTAssertEqual(account?.password.timeBased, true)\n        XCTAssertEqual(account?.password.secret, Data(base32Encoded: \"JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.password.algorithm, .sha1)\n        XCTAssertEqual(account?.password.digits, 6)\n        XCTAssertEqual(account?.password.period, 30)\n        \n        account = Account(url: URL(\n            string: \"otpauth://hotp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&counter=1\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        XCTAssertEqual(account?.issuer, \"Example\")\n        XCTAssertEqual(account?.password.timeBased, false)\n        XCTAssertEqual(account?.password.secret, Data(base32Encoded: \"JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.password.algorithm, .sha1)\n        XCTAssertEqual(account?.password.digits, 6)\n        XCTAssertEqual(account?.password.counter, 1)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/Example%3Aalice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/Example:%20%20alice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/Example%3A%20%20alice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.name, \"alice@example.com\")\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/example.com/alice?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.name, \"example.com/alice\")\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.issuer, \"Example\")\n        \n        account = Account(url: URL(string: \"otpauth://totp/alice@example.com\")!)\n        XCTAssertNil(account)\n        \n        account = Account(url: URL(string: \"otpauth://totp/alice@example.com?secret=AAA\")!)\n        XCTAssertNil(account)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA1\")!)\n        XCTAssertEqual(account?.password.algorithm, .sha1)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA256\")!)\n        XCTAssertEqual(account?.password.algorithm, .sha256)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA512\")!)\n        XCTAssertEqual(account?.password.algorithm, .sha512)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&digits=6\")!)\n        XCTAssertEqual(account?.password.digits, 6)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&digits=8\")!)\n        XCTAssertEqual(account?.password.digits, 8)\n        \n        account = Account(url: URL(\n            string: \"otpauth://hotp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP\")!)\n        XCTAssertEqual(account?.password.timeBased, false)\n        XCTAssertEqual(account?.password.digits, 6)\n        XCTAssertEqual(account?.password.counter, 0)\n        \n        account = Account(url: URL(\n            string: \"otpauth://totp/alice@example.com?secret=JBSWY3DPEHPK3PXP&period=60\")!)\n        XCTAssertEqual(account?.password.period, 60)\n    }\n    \n    func testDescription() {\n        let account = Account()\n        \n        account.name =  \"test@example.com\"\n        account.issuer = \"Example\"\n        XCTAssertEqual(account.description, \"Example (test@example.com)\")\n        \n        account.name =  \"test@example.com\"\n        account.issuer = nil\n        XCTAssertEqual(account.description, \"test@example.com\")\n        \n        account.name =  \"test@example.com\"\n        account.issuer = \"\"\n        XCTAssertEqual(account.description, \"test@example.com\")\n        \n        account.name =  nil\n        account.issuer = \"Example\"\n        XCTAssertEqual(account.description, \"Example\")\n        \n        account.name =  \"\"\n        account.issuer = \"Example\"\n        XCTAssertEqual(account.description, \"Example\")\n        \n        account.name =  nil\n        account.issuer = nil\n        XCTAssertEqual(account.description, \"\")\n        \n        account.name =  \"\"\n        account.issuer = \"\"\n        XCTAssertEqual(account.description, \"\")\n    }\n}\n"
  },
  {
    "path": "TofuTests/DataTests.swift",
    "content": "import XCTest\n@testable import Tofu\n\nclass DataTests: XCTestCase {\n    func testInitBase32Encoded() {\n        let examples: [(encoded: String, decoded: String)] = [\n            (\"\", \"\"),\n            (\"MY======\", \"f\"),\n            (\"MZXQ====\", \"fo\"),\n            (\"MZXW6===\", \"foo\"),\n            (\"MZXW6YQ=\", \"foob\"),\n            (\"MZXW6YTB\", \"fooba\"),\n            (\"MZXW6YTBOI======\", \"foobar\"),\n            (\"MY\", \"f\"),\n            (\"MZXQ\", \"fo\"),\n            (\"MZXW6\", \"foo\"),\n            (\"MZXW6YQ\", \"foob\"),\n            (\"MZXW6YTB\", \"fooba\"),\n            (\"MZXW6YTBOI\", \"foobar\"),\n            (\"mzxw6ytboi\", \"foobar\"),\n        ]\n        \n        for example in examples {\n            let actual = Data(base32Encoded: example.encoded)\n            let expected = example.decoded.data(using: .ascii)\n\n            XCTAssertEqual(actual, expected)\n        }\n        \n        XCTAssertNil(Data(base32Encoded: \"1\")) // Invalid character\n        XCTAssertNil(Data(base32Encoded: \"A\")) // Invalid length\n        XCTAssertNil(Data(base32Encoded: \"AAA\"))\n        XCTAssertNil(Data(base32Encoded: \"AAAAAA\"))\n        XCTAssertNil(Data(base32Encoded: \"MY==\")) // Invalid padding\n        XCTAssertNil(Data(base32Encoded: \"MY=====\"))\n        XCTAssertNil(Data(base32Encoded: \"MZXW6Y===\"))\n    }\n\n    func testExportRoundTrip() throws {\n        let interop = ExternalDataInterop()\n\n        let account1 = Account()\n        account1.name = \"Test\"\n        account1.issuer = \"Xcode\"\n        account1.password.algorithm = .sha1\n        account1.password.secret = Data(base32Encoded: \"aaaaaaa\")!\n        account1.password.timeBased = true\n        account1.password.period = 30\n        account1.password.digits = 6\n\n        let account2 = Account()\n        account2.name = \"Test 2\"\n        account2.issuer = \"Xcode\"\n        account2.password.algorithm = .sha1\n        account2.password.secret = Data(base32Encoded: \"bbbbbbb\")!\n        account2.password.timeBased = true\n        account2.password.period = 30\n        account2.password.digits = 6\n\n        XCTAssertNotEqual(account1, account2)\n\n        let sourceAccounts: [Account] = [account1, account2]\n        let encryptedAccounts = try interop.encryptedData(for: sourceAccounts, with: \"12345678\")\n        let decryptedAccounts = try interop.decryptAccounts(from: encryptedAccounts, with: \"12345678\")\n        XCTAssertEqual(sourceAccounts, decryptedAccounts)\n        XCTAssertThrowsError(try interop.decryptAccounts(from: encryptedAccounts, with: \"87654321\"))\n    }\n}\n"
  },
  {
    "path": "TofuTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "TofuTests/PasswordTests.swift",
    "content": "import XCTest\n@testable import Tofu\n\nclass PasswordTests: XCTestCase {\n    func testValueForDate() {\n        let secret = \"12345678901234567890\".data(using: String.Encoding.ascii)!\n        let counterBasedTests: [(Int, String, String, String)] = [\n            (0, \"755224\", \"875740\", \"125165\"),\n            (1, \"287082\", \"247374\", \"342147\"),\n            (2, \"359152\", \"254785\", \"730102\"),\n            (3, \"969429\", \"496144\", \"778726\"),\n            (4, \"338314\", \"480556\", \"937510\"),\n            (5, \"254676\", \"697997\", \"848329\"),\n            (6, \"287922\", \"191609\", \"266680\"),\n            (7, \"162583\", \"579288\", \"588359\"),\n            (8, \"399871\", \"895912\", \"039399\"),\n            (9, \"520489\", \"184989\", \"643409\"),\n            ]\n        let timeBasedTests = [\n            (Date(timeIntervalSince1970: 59), \"94287082\", \"32247374\", \"69342147\"),\n            (Date(timeIntervalSince1970: 1111111109), \"07081804\", \"34756375\", \"63049338\"),\n            (Date(timeIntervalSince1970: 1111111111), \"14050471\", \"74584430\", \"54380122\"),\n            (Date(timeIntervalSince1970: 1234567890), \"89005924\", \"42829826\", \"76671578\"),\n            (Date(timeIntervalSince1970: 2000000000), \"69279037\", \"78428693\", \"56464532\"),\n            (Date(timeIntervalSince1970: 20000000000), \"65353130\", \"24142410\", \"69481994\"),\n            ]\n        let counterBasedSHA1Password = passwordWithSecret(secret, algorithm: .sha1, digits: 6,\n                                                          timeBased: false)\n        let counterBasedSHA256Password = passwordWithSecret(secret, algorithm: .sha256, digits: 6,\n                                                            timeBased: false)\n        let counterBasedSHA512Password = passwordWithSecret(secret, algorithm: .sha512, digits: 6,\n                                                            timeBased: false)\n        let timeBasedSHA1Password = passwordWithSecret(secret, algorithm: .sha1, digits: 8,\n                                                       timeBased: true)\n        let timeBasedSHA256Password = passwordWithSecret(secret, algorithm: .sha256, digits: 8,\n                                                         timeBased: true)\n        let timeBasedSHA512Password = passwordWithSecret(secret, algorithm: .sha512, digits: 8,\n                                                         timeBased: true)\n        \n        for (counter, expSHA1, expSHA256, expSHA512) in counterBasedTests {\n            counterBasedSHA1Password.counter = counter\n            XCTAssertEqual(counterBasedSHA1Password.valueForDate(Date()), expSHA1)\n            counterBasedSHA256Password.counter = counter\n            XCTAssertEqual(counterBasedSHA256Password.valueForDate(Date()), expSHA256)\n            counterBasedSHA512Password.counter = counter\n            XCTAssertEqual(counterBasedSHA512Password.valueForDate(Date()), expSHA512)\n        }\n        \n        for (date, expSHA1, expSHA256, expSHA512) in timeBasedTests {\n            XCTAssertEqual(timeBasedSHA1Password.valueForDate(date), expSHA1)\n            XCTAssertEqual(timeBasedSHA256Password.valueForDate(date), expSHA256)\n            XCTAssertEqual(timeBasedSHA512Password.valueForDate(date), expSHA512)\n        }\n    }\n    \n    func testProgressForDate() {\n        let password = Password()\n        password.period = 30\n        \n        XCTAssertEqual(password.progressForDate(Date(timeIntervalSince1970: 0)), 1)\n        XCTAssertEqual(password.progressForDate(Date(timeIntervalSince1970: 15)), 0.5)\n        XCTAssertEqual(password.progressForDate(Date(timeIntervalSince1970: 22.5)), 0.25)\n        XCTAssertEqual(password.progressForDate(Date(timeIntervalSince1970: 30)), 1)\n    }\n    \n    func timeIntervalRemainingForDate() {\n        let password = Password()\n        password.period = 30\n        \n        XCTAssertEqual(password.timeIntervalRemainingForDate(Date(timeIntervalSince1970: 0)), 30)\n        XCTAssertEqual(password.timeIntervalRemainingForDate(Date(timeIntervalSince1970: 15)), 15)\n        XCTAssertEqual(password.timeIntervalRemainingForDate(Date(timeIntervalSince1970: 22.5)), 7.5)\n        XCTAssertEqual(password.timeIntervalRemainingForDate(Date(timeIntervalSince1970: 30)), 0)\n    }\n    \n    private func passwordWithSecret(_ secret: Data, algorithm: Algorithm, digits: Int,\n                                        timeBased: Bool) -> Password {\n        let password = Password()\n        password.secret = secret\n        password.algorithm = algorithm\n        password.digits = digits\n        password.timeBased = timeBased\n        return password\n    }\n}\n"
  },
  {
    "path": "TofuUITests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "TofuUITests/TofuUITests.swift",
    "content": "//\n//  TofuUITests.swift\n//  TofuUITests\n//\n//  Created by Calle Erlandsson on 20/01/16.\n//  Copyright © 2016 Calle Erlandsson. All rights reserved.\n//\n\nimport XCTest\n\nclass TofuUITests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        \n        // Put setup code here. This method is called before the invocation of each test method in the class.\n        \n        // In UI tests it is usually best to stop immediately when a failure occurs.\n        continueAfterFailure = false\n        // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.\n        XCUIApplication().launch()\n        \n        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // Use recording to get started writing UI tests.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n    \n}\n"
  }
]