[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    \"@babel/preset-react\",\n    \"@babel/preset-env\"\n  ],\n  \"plugins\": [\n    \"system-import-transformer\",\n    \"transform-class-properties\",\n    \"@babel/plugin-proposal-object-rest-spread\"\n  ]\n}"
  },
  {
    "path": ".editorconfig",
    "content": "indent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n \"parser\": \"@babel/eslint-parser\",\n  \"plugins\": [\n    \"@babel\",\n    \"react\"\n  ],\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"arrowFunctions\": true,\n      \"binaryLiterals\": true,\n      \"blockBindings\": true,\n      \"classes\": true,\n      \"defaultParams\": true,\n      \"destructuring\": true,\n      \"forOf\": true,\n      \"modules\": true,\n      \"objectLiteralComputedProperties\": true,\n      \"objectLiteralDuplicateProperties\": false,\n      \"objectLiteralShorthandMethods\": true,\n      \"objectLiteralShorthandProperties\": true,\n      \"octalLiterals\": true,\n      \"restParams\": true,\n      \"spread\": true,\n      \"templateStrings\": true,\n      \"unicodeCodePointEscapes\": true,\n      \"globalReturn\": false,\n      \"jsx\": true,\n      \"experimentalObjectRestSpread\": true,\n    }\n  },\n  \"rules\": {\n    \"indent\": [\"error\", 2],\n    \"semi\": [2],\n    \"react/jsx-indent-props\":  [\"error\", 2],\n    \"react/jsx-indent\": [\"error\", 2]\n  },\n\n  \"env\": {\n    \"node\": true,\n    \"es6\": true,\n    \"jest\": true,\n    \"jasmine\": true\n  }\n}\n"
  },
  {
    "path": ".github/workflows/pull_request_javascript_check.yml",
    "content": "name: JavaScript Lint and Test Check\n\non:\n  pull_request:\n    branches: [develop]\n\njobs:\n  run_eslinter:\n    name: Runs ESLint and execute test suite\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - name: Use Node.js\n      uses: actions/setup-node@v3\n      with:\n        node-version: 14.x\n    - run: npm install\n    - run: npm run lint\n    - run: npm run mocha\n    # - run: npx playwright install-deps\n    # - run: npm test"
  },
  {
    "path": ".gitignore",
    "content": "*~\nnode_modules/\nbuild/\nleapchat\n\n# bower static assets\nstatic/lib/\n\n# docker container volumes\n_docker-volumes/\n\n# Editors\n.vscode/\n\n# Mac OS X Bullshit\n.DS_Store\n\n# Playwright tests\nplaywright-report/\n"
  },
  {
    "path": ".nvmrc",
    "content": "v14.0.0\n"
  },
  {
    "path": "LICENSE.md",
    "content": "Copyright (C) 2017 CrypTag\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "Makefile",
    "content": "build:\n\tgo build\n\tnpm run build\n\nrelease: check-env\n\t@echo 'Hopefully \"git diff\" is empty!'\n\t@echo 'Creating release for version $(version) ...'\n\t@echo 'Manually change the version in these 2 files to $(version) and I, your loyal, Makefile, shall do the rest!'\n\t@emacsclient -t package.json\n\t@emacsclient -t package-lock.json\n\t@git add -p package.json package-lock.json\n\t@git commit -m 'Version bump to v$(version)'\n\t@git tag v$(version)\n\t@git push --tags origin develop\n\ndeploy: check-env\n\t@tar zcvpf releases/leapchat-v$(version)-$$(mydate.sh).tar.gz ./leapchat ./db ./build\n\t$(MAKE) upload\n\nupload:\n\t@scp $$(ls -t releases/*.tar.gz | head -1) leapchat-minishare:~/gocode/src/github.com/cryptag/leapchat/releases/\n\t@ssh leapchat-minishare\n\nall-deploy:\n\t$(MAKE) -B build\n\t$(MAKE) release\n\t$(MAKE) deploy\n\ncheck-env:\nifndef version\n\t$(error \"version\" variable is undefined; re-run with \"version=1.2.3\" or similar)\nendif\n"
  },
  {
    "path": "README.md",
    "content": "# LeapChat\n\nLeapChat is an ephemeral chat application.  LeapChat uses\n[miniLock](https://web.archive.org/web/20180508023310/https://minilock.io/) for challenge/response-based\nauthentication. This app also enables users to create chat rooms,\ninvite others to said rooms (via a special URL with a passphrase at\nthe end of it that is used to generate a miniLock keypair), and of\ncourse send (encrypted) messages to the other chat room participants.\n\n\n## Security Features\n\n- All messages are encrypted end-to-end\n\n- The server cannot see anyone's usernames, which are encrypted and\n  attached to each message\n\n- Users can \"leap\" from one room to the next so that if an adversary\n  clicks on an old invite link, it cannot be used to join the room\n  - (Feature coming soon!)\n\n- [Very secure headers](https://securityheaders.io/?q=https%3A%2F%2Fwww.leapchat.org&followRedirects=on)\n  thanks to [gosecure](https://github.com/cryptag/gosecure).\n\n- TODO (many more)\n\n\n## Instances\n\nThere is currently one public instance running at\n[leapchat.org](https://www.leapchat.org).\n\n\n# Running LeapChat\n\n## Getting Started\n\n### Install Go\n\nIf you're on Linux or macOS _and_ if don't already have\n[Go](https://golang.org/dl/) version 1.14 or newer installed\n(`$ go version` will tell you), you can install Go by running:\n\n```\ncurl https://raw.githubusercontent.com/elimisteve/install-go/master/install-go.sh | bash\nsource ~/.bashrc\n```\n\nThen grab and build the `leapchat` source:\n\n```\ngo get github.com/cryptag/leapchat\n```\n\n### JavaScript and Node Setup\n\nInstall Node v14. We recommend using the [Node Version Manager (nvm)](https://github.com/nvm-sh/nvm) package\nto manage your node environments.\n\nIf you're using NVM, you can install the correct node version by running:\n\n```\nnvm install   # run from inside of leapchat/ dir, uses .nvmrc file\nnvm install v14.0.0   # run from anywhere\n```\n\nThen, to configure the use of the correct node version whenever you enter the project:\n\n```\ncd ~/code/leapchat && nvm use\n```\n\nTo install JavaScript dependencies:\n\n```\nnpm install\n```\n\nIn development, when you want to see your frontend code changes immediately on a browser refresh, run\nthe command that boots up a watch process to re-compile the frontend whenever a file changes:\n\n```\nnpm run dev\n```\n\nIn order to do a one-time build of the production assets:\n\n```\nnpm run build\n```\n\nThe frontend is served through an HTTP server running in the go binary. This allows us to make API requests\nfrom the browser without any CORS configuration.\n\n### macOS Instructions\n\nIf you don't already have Postgres 9.5 to Postgres 12 installed and\nrunning, install it with Homebrew:\n\n```\nbrew install postgresql@12\n```\n\n(It may ask you to append a line to your shell config; watch for this\nand follow those instructions.)\n\nNext, you'll need three terminals.\n\n**In the first terminal**, run database migrations, download `postgrest`,\nand have `postgrest` connect to Postgres:\n\nStart the PostgreSQL server:\n\n```\nbrew services start postgresql@12\n```\n\nThen, create the default database and run the migrations.\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat/db\nchmod a+rx ~/\ncreatedb\nsudo -u $USER bash init_sql.sh\n```\n\nWe use [PostgREST](https://postgrest.org/en/stable/) to expose the database to the application.\nPostgREST provides a REST API interface that maps to the underlying tables.\n\nTo install and run the REST API with the LeapChat configuration file:\n\n```\nbrew install postgrest\npostgrest db/postgrest.conf\n```\n\nIf you get an error, make sure that Postgres is running. On Mac OS,\nyou can check PostgreSQL status by running:\n\n```\nbrew services list\n```\n\n**In the second terminal**, run LeapChat's Go backend:\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat\ngo build\n./leapchat\n```\n\n**In the third terminal**, install JavaScript dependencies and start\nLeapChat's auto-reloading dev server:\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat\nnpm install\nnpm run dev\n```\n\nLeapChat's dev server should now be running on <http://localhost:8080>!\n\n\n#### macOS: Once you're set up\n\n...then run in 3 different terminals:\n\n```\nbrew services start postgresql@12\npostgrest db/postgrest.conf\n```\n\n```\n./leapchat\n```\n\n```\nnpm run dev\n```\n\n### Linux Instructions (for Ubuntu; works on Debian if other dependencies met)\n\nIf you don't already have Node 14.x installed (`node --version` will tell\nyou the installed version), install Node by running:\n\n```\ncurl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -\nsudo apt-get install nodejs\n```\n\n\nIf you don't already have Postgres 9.5 or newer installed and running,\ninstall it by running:\n\n```\nsudo apt-get install postgresql postgresql-contrib\n```\n\nNext, you'll need three terminals.\n\n**In the first terminal**, run database migrations, download `postgrest`,\nand have `postgrest` connect to Postgres:\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat/db\nchmod a+rx ~/\nsudo -u postgres bash init_sql.sh\nwget https://github.com/PostgREST/postgrest/releases/download/v7.0.0/postgrest-v7.0.0-ubuntu.tar.xz\ntar xvf postgrest-v7.0.0-ubuntu.tar.xz\n./postgrest postgrest.conf\n```\n\n**In the second terminal**, run LeapChat's Go backend:\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat\ngo build\n./leapchat\n```\n\n**In the third terminal**, install JavaScript dependencies and start\nLeapChat's auto-reloading dev server:\n\n```\ncd $(go env GOPATH)/src/github.com/cryptag/leapchat\nnpm install\nnpm run build\nnpm run start\n```\n\nLeapChat should now be running at <http://localhost:8080> !\n\n\n#### Linux: Once you're set up\n\n...then run in 3 different terminals:\n\n```\ncd db\n./postgrest postgrest.conf\n```\n\n```\n./leapchat\n```\n\n```\nnpm run start\n```\n\n\n### Production Build and Deploy\n\nMake sure you're in the default branch (currently `develop`), and make\nsure that `git diff` doesn't return anything, then run these commands\nto create a new, versioned release of LeapChat, perform a production\nbuild, then deploy that build to production:\n\n(Be sure to customize `version` to the actual new version number.)\n\n```\nmake all-deploy version=1.2.3\n```\n\nOr to run the build, release, and deploy steps individually:\n\n```\nmake -B build\nmake release version=1.2.3\nmake deploy version=1.2.3\n```\n\nIf the build and release succeed but the upload (and thus the rest of\nthe deployment) fails, you can deploy the latest local build (in\n`./releases/`) with\n\n```\nmake upload\n```\n\nOnce SSH'd in, kill the old `leapchat` process then run\n\n```\ncd ~/gocode/src/github.com/cryptag/leapchat\ntar xvf $(ls -t releases/*.tar.gz | head -1)\nsudo setcap cap_net_bind_service=+ep leapchat\n./leapchat -prod -domain www.leapchat.org -http :80 -https :443 -iframe-origin www.leapchat.org 2>&1 | tee -a logs.txt\n```\n\n## Documentation Links\n\nOpen via `npm`:\n\n```\nnpm docs bootstrap\nnpm docs react-bootstrap\nnpm docs react-icons\n```\n\n\n## JavaScript Testing\n\n### Unit Tests\n\nFor unit tests, use [mocha](https://mochajs.org/) as the testing framework and test runner, with\n[chai](http://chaijs.com/)'s expect API.\n\nUnit tests are located at `./test/` and have an extension of `.test.js`.\n\nTo run unit tests only, run:\n\n```\nnpm run mocha\n```\n\n### Browser Tests\n\nFor browser tests, we use [playwright](https://playwright.dev/). This should be installed for you \nvia `npm`, but you may need to install the playwright browser have tests run successfully:\n\n```\nnpx playwright install-deps\n```\n\nBrowser tests are located at `./test/playwright` and have an extension of `.spec.js`.\n\nTo run browser tests only, run:\n\n```\nnpm run playwright\n```\n\nBy default, the browser tests run in headless mode. To run with an interactive browser session, run:\n\n```\nnpm run webtests\n```\n\n**To run all of the tests, all together**:\n\n```\nnpm test\n```\n\n### Documentation Links\n\nPlaywright has good docs. For quick access, here are some useful links:\n\n[Accessing the DOM with Playwright](https://playwright.dev/docs/api/class-locator)\n\n[Test Assertions with Playwright](https://playwright.dev/docs/test-assertions)\n\nCurrently experimental: [Unit Testing React Components with Playwright](https://playwright.dev/docs/test-components)\n\n## Go Testing\n\nTo run the golang tests:\n\n``` $ go test [-v] ./... ```\n\n\n# Cryptography Notice\n\nThis distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software.\nBEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\nSee <http://www.wassenaar.org/> for more information.\n\nThe U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms.\nThe form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.\n"
  },
  {
    "path": "db/init_sql.sh",
    "content": "#!/bin/bash\n\nset -euo pipefail\n\n# Create 'leapchat' database, associated role\npsql -d postgres < sql/pre.sql\n\nexport pg_user=postgres\nif [ \"`uname -s`\" != \"Linux\" ]; then\n    # For Mac OS X\n    pg_user=$USER\nfi\n\n# More initialization\nfor file in sql/init*.sql; do\n    psql -U $pg_user -d leapchat < \"$file\"\ndone\n\n# Create tables\nfor file in sql/table*.sql; do\n    psql -U $pg_user -d leapchat < \"$file\"\ndone\n\n/bin/bash migrate.sh sql/migration*.sql\n"
  },
  {
    "path": "db/migrate.sh",
    "content": "#!/bin/bash\n# Steve Phillips / elimisteve\n# 2017.05.18\n\nset -euo pipefail\n\n# Run migrations\nfor file in $*; do\n    psql -U ${pg_user:-postgres} -d leapchat < \"$file\"\ndone\n"
  },
  {
    "path": "db/postgrest.conf",
    "content": "db-uri = \"postgres://superuser:superuser@localhost:5432/leapchat\"\ndb-schema = \"public\"\ndb-anon-role = \"superuser\"\ndb-pool = 10\n\nserver-host = \"127.0.0.1\"\nserver-port = 3000\n"
  },
  {
    "path": "db/sql/init001.sql",
    "content": "create extension if not exists \"uuid-ossp\";\n"
  },
  {
    "path": "db/sql/migration001.sql",
    "content": "ALTER TABLE messages ALTER COLUMN message SET DEFAULT '';\n"
  },
  {
    "path": "db/sql/migration002.sql",
    "content": "ALTER TABLE messages ALTER COLUMN ttl_secs SET NOT NULL;\n"
  },
  {
    "path": "db/sql/migration003.sql",
    "content": "CREATE FUNCTION delete_expired_messages() RETURNS void AS $$\n  DELETE FROM messages WHERE created + interval '1s' * ttl_secs < now();\n$$ LANGUAGE SQL VOLATILE;\n"
  },
  {
    "path": "db/sql/pre.sql",
    "content": "CREATE USER superuser WITH PASSWORD 'superuser';\nCREATE DATABASE leapchat OWNER superuser ENCODING 'UTF8';\nGRANT ALL ON DATABASE leapchat TO superuser;\nALTER USER superuser CREATEDB;\n"
  },
  {
    "path": "db/sql/table01_rooms.sql",
    "content": "CREATE TABLE rooms (\n    room_id text NOT NULL UNIQUE PRIMARY KEY CHECK (40 <= LENGTH(room_id) AND LENGTH(room_id) <= 55)\n);\nALTER TABLE rooms OWNER TO superuser;\n"
  },
  {
    "path": "db/sql/table02_messages.sql",
    "content": "CREATE TABLE messages (\n    message_id  uuid      NOT NULL UNIQUE PRIMARY KEY DEFAULT uuid_generate_v4(),\n    room_id     text      NOT NULL REFERENCES rooms ON DELETE CASCADE,\n    message     text      NOT NULL,\n    message_enc bytea     NOT NULL,\n    ttl_secs    integer   DEFAULT 7776000 CHECK (60 <= ttl_secs AND ttl_secs <= 7776000),\n    created     timestamp WITH time zone DEFAULT now()\n);\nALTER TABLE messages OWNER TO superuser;\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '3.1'\n\nservices:\n    postgres:\n        image: postgres:latest\n        ports:\n            - 127.0.0.1:5432:5432\n        environment:\n            - POSTGRES_PASSWORD=superuser\n            - POSTGRES_USER=superuser\n            - POSTGRES_DB=leapchat\n        volumes:\n            - ./_docker-volumes/postgres:/var/lib/postgresql/data\n    postgrest:\n        image: postgrest/postgrest:latest\n        ports:\n            - 3000:3000\n        environment:\n            PGUSER: superuser\n            PGPASSWORD: superuser\n            PGHOST: postgres\n            PGPORT: 5432\n            PGDATABASE: leapchat\n            PGSCHEMA: public\n            DB_ANON_ROLE: postgres\n        depends_on:\n            - postgres\n"
  },
  {
    "path": "fedora_install.sh",
    "content": "#!/bin/bash\n# Matthew Leeds\n# 2017.07.08\n\nsudo dnf install postgresql postgresql-server postgresql-contrib\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/cryptag/leapchat\n\ngo 1.14\n\nrequire (\n\tgithub.com/cathalgarvey/base58 v0.0.0-20150930172411-5e83fd6f66e3 // indirect\n\tgithub.com/cmars/basen v0.0.0-20150613233007-fe3947df716e // indirect\n\tgithub.com/cryptag/go-minilock v0.0.0-20230307201426-f138c5839651\n\tgithub.com/cryptag/gosecure v0.0.0-20180117073251-9b5880940d72\n\tgithub.com/dchest/blake2s v1.0.0 // indirect\n\tgithub.com/gorilla/context v1.1.1\n\tgithub.com/gorilla/mux v1.7.1\n\tgithub.com/gorilla/websocket v1.4.1\n\tgithub.com/justinas/alice v0.0.0-20171023064455-03f45bd4b7da\n\tgithub.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect\n\tgithub.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d\n\tgithub.com/sirupsen/logrus v1.4.1\n\tgithub.com/stretchr/testify v1.8.2\n\tgithub.com/tv42/base58 v1.0.0 // indirect\n\tgolang.org/x/crypto v0.7.0\n\tlaunchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=\ngithub.com/cathalgarvey/base58 v0.0.0-20150930172411-5e83fd6f66e3 h1:UiCAzJ/7RzEVGU8SxQcrgtkbOUCDYfGYHAZHYvWbW3o=\ngithub.com/cathalgarvey/base58 v0.0.0-20150930172411-5e83fd6f66e3/go.mod h1:JHU0bsaIIAwKdJ84j3JNHDGsXehsQIS6EySrtGIZ4fs=\ngithub.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw=\ngithub.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA=\ngithub.com/cryptag/go-minilock v0.0.0-20160315171457-c7289f173516 h1:2IfztZwF6swS/zXafkcBppYad9lO+Cvd2Au/IICmXTM=\ngithub.com/cryptag/go-minilock v0.0.0-20160315171457-c7289f173516/go.mod h1:caKtUaGD8uPTpeGNYJCZmHe9c1viq8LxZtlsVPgMGHc=\ngithub.com/cryptag/go-minilock v0.0.0-20230307201426-f138c5839651 h1:rOxjZMKV4wDUe1DHinSJ8oLgI7F3W8f9uI4T17KnD48=\ngithub.com/cryptag/go-minilock v0.0.0-20230307201426-f138c5839651/go.mod h1:mP3jjk8yMP5bPGrEG/jTgg3e1A3671eIPo35BVjfO+M=\ngithub.com/cryptag/gosecure v0.0.0-20180117073251-9b5880940d72 h1:Sq2y8zqJ0Jn06iwMQkp1jVAdReL2T3QCqfrVu4IhoSc=\ngithub.com/cryptag/gosecure v0.0.0-20180117073251-9b5880940d72/go.mod h1:x0RZxj8S2BI5vAoBOTvjZk1pawEY5+9n0xp8wzd3VQg=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dchest/blake2s v1.0.0 h1:gHCBR8ecSImY/Nwk7X0Q2KJAJcpI/HSkUAQDi8MCP4Q=\ngithub.com/dchest/blake2s v1.0.0/go.mod h1:GrKn2Lc4hWqAwRrbneYuvZ6kugiJMrjk3HHtcJkEhbs=\ngithub.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=\ngithub.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=\ngithub.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU=\ngithub.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=\ngithub.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=\ngithub.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=\ngithub.com/justinas/alice v0.0.0-20171023064455-03f45bd4b7da h1:5y58+OCjoHCYB8182mpf/dEsq0vwTKPOo4zGfH0xW9A=\ngithub.com/justinas/alice v0.0.0-20171023064455-03f45bd4b7da/go.mod h1:oLH0CmIaxCGXD67VKGR5AacGXZSMznlmeqM8RzPrcY8=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=\ngithub.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=\ngithub.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/tv42/base58 v1.0.0 h1:ZN6pfg9LN98oUzMfc9axMNXuWxqJezO2S+atn1S5f4U=\ngithub.com/tv42/base58 v1.0.0/go.mod h1:JvBtPdU9grJ9mB4/W/j8gK5KJwXHkwIrB9DC2snzGC4=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=\ngolang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=\ngolang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=\ngolang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\nlaunchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54=\nlaunchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM=\n"
  },
  {
    "path": "gzip.go",
    "content": "package main\n\nimport (\n\t\"compress/gzip\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n)\n\n// GZip solution derived from\n// https://www.lemoda.net/go/gzip-handler/index.html and\n// https://stackoverflow.com/a/50898293/197160\n\ntype gzipResponseWriter struct {\n\tio.Writer\n\thttp.ResponseWriter\n}\n\n// Use the Writer part of gzipResponseWriter to write the output.\n\nfunc (w gzipResponseWriter) Write(b []byte) (int, error) {\n\treturn w.Writer.Write(b)\n}\n\nfunc inAnyStr(s string, container []string) bool {\n\tfor i := 0; i < len(container); i++ {\n\t\tif strings.Contains(container[i], s) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc gzipHandler(h http.Handler) http.Handler {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tif inAnyStr(\"gzip\", r.Header[\"Accept-Encoding\"]) {\n\t\t\tw.Header().Set(\"Content-Encoding\", \"gzip\")\n\t\t\tgz := gzip.NewWriter(w)\n\t\t\tdefer gz.Close()\n\t\t\th.ServeHTTP(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r)\n\t\t\treturn\n\t\t}\n\t\th.ServeHTTP(w, r)\n\t})\n}\n"
  },
  {
    "path": "json.go",
    "content": "// Steve Phillips / elimisteve\n// 2017.01.16\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/gorilla/websocket\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\nconst contentTypeJSON = \"application/json; charset=utf-8\"\n\nfunc WriteError(w http.ResponseWriter, errStr string, secretErr error) error {\n\treturn WriteErrorStatus(w, errStr, secretErr, http.StatusInternalServerError)\n}\n\nfunc WriteErrorStatus(w http.ResponseWriter, errStr string, secretErr error, status int) error {\n\tlog.Debugf(\"Real error: %v\", secretErr)\n\tlog.Debugf(\"Returning HTTP %d w/error: %q\", status, errStr)\n\n\tw.Header().Set(\"Content-Type\", contentTypeJSON)\n\tw.WriteHeader(status)\n\t_, err := fmt.Fprintf(w, `{\"error\":%q}`, errStr)\n\treturn err\n}\n\n// WebSockets\n\nfunc WSWriteError(wsConn *websocket.Conn, errStr string, secretErr error) error {\n\tlog.Debugf(\"WebSocket error: \" + secretErr.Error())\n\n\twsErr := fmt.Sprintf(`{\"error\":%q}`, errStr)\n\terr := wsConn.WriteMessage(websocket.TextMessage, []byte(wsErr))\n\twsConn.Close() // TODO: Will this panic?\n\treturn err\n}\n"
  },
  {
    "path": "leapchat.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"strings\"\n\n\t\"github.com/cryptag/go-minilock/taber\"\n\t\"github.com/cryptag/leapchat/miniware\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\nvar (\n\trandomServerKey *taber.Keys\n\tBUILD_DIR       = \"build\"\n)\n\nfunc init() {\n\tk, err := taber.RandomKey()\n\tif err != nil {\n\t\tlog.Fatalf(\"Error generating random server key: %v\\n\", err)\n\t}\n\n\t// Setting global var\n\trandomServerKey = k\n}\n\nfunc main() {\n\thttpAddr := flag.String(\"http\", \"127.0.0.1:8080\",\n\t\t\"Address to listen on HTTP\")\n\thttpsAddr := flag.String(\"https\", \"127.0.0.1:8443\",\n\t\t\"Address to listen on HTTPS\")\n\tdomain := flag.String(\"domain\", \"\", \"Domain of this service\")\n\tiframeOrigin := flag.String(\"iframe-origin\", \"\",\n\t\t\"Origin that may embed this LeapChat instance into an iframe.\"+\n\t\t\t\" May include port. Only used with -prod flag.\")\n\tprod := flag.Bool(\"prod\", false, \"Run in Production mode.\")\n\tonionPush := flag.Bool(\"onionpush\", false, \"Serve OnionPush instead of LeapChat\")\n\tflag.Parse()\n\n\tif *onionPush {\n\t\t*httpAddr = \"127.0.0.1:5001\"\n\t\tBUILD_DIR = \"public\"\n\t}\n\n\tif *prod {\n\t\tlog.SetLevel(log.FatalLevel)\n\t} else {\n\t\tlog.SetLevel(log.DebugLevel)\n\t}\n\n\tm := miniware.NewMapper()\n\n\tsrv := NewServer(m, *httpAddr)\n\n\tif *prod {\n\t\tif *domain == \"\" {\n\t\t\tlog.Fatal(\"You must specify a -domain when using the -prod flag.\")\n\t\t}\n\n\t\tmanager := getAutocertManager(*domain)\n\n\t\t// Setup http->https redirection\n\t\thttpsPort := strings.SplitN(*httpsAddr, \":\", 2)[1]\n\t\tgo redirectToHTTPS(*httpAddr, httpsPort, *domain, manager)\n\n\t\t// Production modifications to server\n\t\tProductionServer(srv, *httpsAddr, *domain, manager, *iframeOrigin)\n\t\tlog.Infof(\"Listening on %v\", *httpsAddr)\n\t\tlog.Fatal(srv.ListenAndServeTLS(\"\", \"\"))\n\t} else {\n\t\tlog.Infof(\"Listening on %v\", *httpAddr)\n\t\tlog.Fatal(srv.ListenAndServe())\n\t}\n}\n"
  },
  {
    "path": "messages.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\n\t\"github.com/cryptag/leapchat/miniware\"\n\t\"github.com/gorilla/websocket\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\ntype Message []byte\n\ntype OutgoingPayload struct {\n\tEphemeral  []Message  `json:\"ephemeral\"`\n\tFromServer FromServer `json:\"from_server,omitempty\"`\n}\n\ntype FromServer struct {\n\tAllMessagesDeleted bool `json:\"all_messages_deleted,omitempty\"`\n}\n\ntype ToServer struct {\n\tTTL               *int `json:\"ttl_secs\"`\n\tDeleteAllMessages bool `json:\"delete_all_messages\"`\n}\n\ntype IncomingPayload struct {\n\tEphemeral []Message `json:\"ephemeral\"`\n\tToServer  ToServer  `json:\"to_server\"`\n}\n\nfunc WSMessagesHandler(rooms *RoomManager) func(w http.ResponseWriter, r *http.Request) {\n\treturn func(w http.ResponseWriter, r *http.Request) {\n\t\t// Both guaranteed by middleware\n\t\twsConn, _ := miniware.GetWebsocketConn(r)\n\t\troomID, _ := miniware.GetMinilockID(r)\n\n\t\troom := rooms.GetRoom(roomID)\n\n\t\tclient := &Client{\n\t\t\twsConn: wsConn,\n\t\t\troom:   room,\n\t\t}\n\t\troom.AddClient(client)\n\n\t\tgo messageReader(room, client)\n\t}\n}\n\nfunc messageReader(room *Room, client *Client) {\n\tmsgs, err := room.GetMessages()\n\tif err != nil {\n\t\tclient.SendError(err.Error(), err)\n\t\treturn\n\t}\n\n\t// Send them already-existing messages\n\terr = client.SendMessages(msgs...)\n\tif err != nil {\n\t\tclient.SendError(err.Error(), err)\n\t\treturn\n\t}\n\n\tfor {\n\t\tmessageType, p, err := client.wsConn.ReadMessage()\n\t\tif err != nil {\n\t\t\t// TODO: Consider adding more checks\n\t\t\tlog.Debugf(\"Error reading ws message: %s\", err)\n\t\t\troom.RemoveClient(client)\n\t\t\treturn\n\t\t}\n\n\t\t// Respond to message depending on message type\n\t\tswitch messageType {\n\t\tcase websocket.TextMessage:\n\t\t\tvar payload IncomingPayload\n\t\t\terr := json.Unmarshal(p, &payload)\n\t\t\tif err != nil {\n\t\t\t\tlog.Debugf(\"Error unmarshalling message `%s` -- %s\", p, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif payload.ToServer.DeleteAllMessages {\n\t\t\t\terr = room.DeleteAllMessages()\n\t\t\t\tif err != nil {\n\t\t\t\t\troom.BroadcastMessages(client, Message(err.Error()))\n\t\t\t\t\tlog.Errorf(\"Error deleting all messages from room %s -- %s\", room.ID, err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\troom.BroadcastDeleteSignal()\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\terr = room.AddMessages(payload.Ephemeral, payload.ToServer.TTL)\n\t\t\tif err != nil {\n\t\t\t\tlog.Debugf(\"Error from AddMessages: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\troom.BroadcastMessages(client, payload.Ephemeral...)\n\n\t\tcase websocket.BinaryMessage:\n\t\t\tlog.Debug(\"Binary messages are unsupported\")\n\n\t\tcase websocket.CloseMessage:\n\t\t\tlog.Debug(\"Got close message\")\n\t\t\troom.RemoveClient(client)\n\t\t\treturn\n\n\t\tdefault:\n\t\t\tlog.Debugf(\"Unsupport messageType: %d\", messageType)\n\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "miniware/miniware.go",
    "content": "// Steve Phillips / elimisteve\n// 2017.04.01\n\npackage miniware\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/cryptag/go-minilock/taber\"\n\tgorillacontext \"github.com/gorilla/context\"\n\t\"github.com/gorilla/websocket\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\nconst (\n\tMINILOCK_ID_KEY      = \"minilock_id\"\n\tMINILOCK_KEYPAIR_KEY = \"minilock_keypair\"\n\tWEBSOCKET_CONNECTION = \"websocket_connection\"\n\n\tAuthError = \"Error authorizing you\"\n)\n\nvar (\n\tErrAuthTokenNotFound  = errors.New(\"Auth token not found\")\n\tErrMinilockIDNotFound = errors.New(\"miniLock ID not found\")\n)\n\ntype Mapper struct {\n\tlock sync.RWMutex\n\tm    map[string]string // map[authToken]minilockID\n}\n\nfunc NewMapper() *Mapper {\n\treturn &Mapper{m: map[string]string{}}\n}\n\nfunc (m *Mapper) GetMinilockID(authToken string) (string, error) {\n\tm.lock.RLock()\n\tdefer m.lock.RUnlock()\n\n\tmID, ok := m.m[authToken]\n\tif !ok {\n\t\treturn \"\", ErrAuthTokenNotFound\n\t}\n\treturn mID, nil\n}\n\nfunc (m *Mapper) SetMinilockID(authToken, mID string) error {\n\tm.lock.Lock()\n\tdefer m.lock.Unlock()\n\n\tm.m[authToken] = mID\n\treturn nil\n}\n\nvar upgrader = websocket.Upgrader{\n\tReadBufferSize:   1024,\n\tWriteBufferSize:  1024,\n\tHandshakeTimeout: 45 * time.Second,\n\tCheckOrigin: func(r *http.Request) bool {\n\t\torigin := r.Header.Get(\"Origin\")\n\t\treturn origin == \"http://127.0.0.1:8080\" || // dev\n\t\t\torigin == \"http://localhost:8080\" || // dev\n\t\t\torigin == \"http://10.0.2.2:8080\" || // Android emulator\n\t\t\torigin == \"http://leapchat.org\" || // prod\n\t\t\torigin == \"https://leapchat.org\" || // prod\n\t\t\torigin == \"http://www.leapchat.org\" || // prod\n\t\t\torigin == \"https://www.leapchat.org\" || // prod\n\t\t\torigin == \"\" || // CLI\n\t\t\torigin == \"http://localhost\" // Capacitor\n\t},\n}\n\nfunc Auth(h http.Handler, m *Mapper) func(w http.ResponseWriter, req *http.Request) {\n\treturn func(w http.ResponseWriter, req *http.Request) {\n\t\twsConn, err := upgrader.Upgrade(w, req, nil)\n\t\tif err != nil {\n\t\t\terrStr := \"Unable to upgrade to websocket conn\"\n\t\t\tlog.Debug(errStr + \": \" + err.Error())\n\t\t\twriteError(w, errStr, http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\n\t\tvar authToken string\n\n\t\tauth := make(chan interface{})\n\n\t\tgo func() {\n\t\t\tmessageType, p, err := wsConn.ReadMessage()\n\t\t\tif err != nil {\n\t\t\t\tauth <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlog.Debugf(\"Received message of type %v: `%s`\", messageType, p)\n\t\t\tif messageType != websocket.TextMessage {\n\t\t\t\tauth <- fmt.Errorf(\"Wanted type %v (TextMessage), got %v\",\n\t\t\t\t\twebsocket.TextMessage, messageType)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tauth <- string(p)\n\t\t}()\n\n\t\ttimeout := time.After(5 * time.Second)\n\t\tselect {\n\t\tcase <-timeout:\n\t\t\terrStr := \"Timed out; didn't send miniLock ID/room ID fast enough\"\n\t\t\twriteWSError(wsConn, errStr)\n\t\t\treturn\n\n\t\tcase token := <-auth:\n\t\t\tswitch maybeToken := token.(type) {\n\t\t\tcase error:\n\t\t\t\terrStr := maybeToken.Error()\n\t\t\t\twriteWSError(wsConn, errStr)\n\t\t\t\treturn\n\n\t\t\tcase string:\n\t\t\t\tauthToken = maybeToken\n\n\t\t\t\t// FALL THROUGH\n\t\t\t}\n\t\t}\n\n\t\tmID, err := m.GetMinilockID(authToken)\n\t\tif err != nil {\n\t\t\tstatus := http.StatusInternalServerError\n\t\t\tif err == ErrAuthTokenNotFound {\n\t\t\t\tstatus = http.StatusUnauthorized\n\t\t\t}\n\t\t\tlog.Debugf(\"%v error from GetMinilockID: %v\", status, err)\n\t\t\twriteWSError(wsConn, AuthError)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Infof(\"`%s` just authed successfully; auth token: `%s`\\n\", mID,\n\t\t\tauthToken)\n\n\t\t// TODO: Update auth token's TTL/lease to be 1 hour from\n\t\t// _now_, not just 1 hour since when they first logged in\n\n\t\tkeypair, err := taber.FromID(mID)\n\t\tif err != nil {\n\t\t\tlog.Debugf(\"Error from GetMinilockID: %v\", err)\n\t\t\twriteWSError(wsConn, \"Your miniLock ID is invalid?...\")\n\t\t\treturn\n\t\t}\n\n\t\tgorillacontext.Set(req, MINILOCK_ID_KEY, mID)\n\t\tgorillacontext.Set(req, MINILOCK_KEYPAIR_KEY, keypair)\n\t\tgorillacontext.Set(req, WEBSOCKET_CONNECTION, wsConn)\n\n\t\th.ServeHTTP(w, req)\n\t}\n}\n\nfunc GetMinilockID(req *http.Request) (string, error) {\n\tmID := gorillacontext.Get(req, MINILOCK_ID_KEY)\n\tmIDStr, ok := mID.(string)\n\tif !ok {\n\t\treturn \"\", ErrMinilockIDNotFound\n\t}\n\treturn mIDStr, nil\n}\n\nfunc GetWebsocketConn(req *http.Request) (*websocket.Conn, error) {\n\twsConnInterface := gorillacontext.Get(req, WEBSOCKET_CONNECTION)\n\twsConn, ok := wsConnInterface.(*websocket.Conn)\n\tif !ok {\n\t\treturn nil, ErrMinilockIDNotFound\n\t}\n\treturn wsConn, nil\n}\n\nfunc writeWSError(wsConn *websocket.Conn, errStr string) error {\n\tlog.Debug(errStr)\n\tresp := fmt.Sprintf(`{\"error\":%q}`, errStr)\n\terr := wsConn.WriteMessage(websocket.TextMessage, []byte(resp))\n\twsConn.Close()\n\treturn err\n}\n\nfunc writeError(w http.ResponseWriter, errStr string, statusCode int) {\n\terrJSON := fmt.Sprintf(`{\"error\":%q}`, errStr)\n\thttp.Error(w, errJSON, statusCode)\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"LeapChat\",\n  \"version\": \"0.7.8\",\n  \"description\": \"Self-destructing, encrypted, in-browser chat\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"lint\": \"./node_modules/.bin/eslint ./src\",\n    \"build\": \"node_modules/.bin/webpack --config webpack.config.prod.js\",\n    \"start\": \"npm run build && ./leapchat\",\n    \"dev\": \"node_modules/.bin/webpack --config webpack.config.dev.js --progress\",\n    \"be\": \"./leapchat\",\n    \"mocha\": \"./node_modules/.bin/mocha --reporter nyan test/.setup.js test/**/*.test.js\",\n    \"playwright\": \"npx playwright test\",\n    \"webtest\": \"npx playwright test --headed\",\n    \"test\": \"npm run mocha && npm run playwright\",\n    \"lintfix\": \"./node_modules/.bin/eslint --fix --parser  @babel/eslint-parser --ext js --no-eslintrc  --rule 'indent: [\\\"error\\\", 2]' --rule 'semi: [2]' ./src\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/cryptag/leapchat.git\"\n  },\n  \"keywords\": [\n    \"cryptag\",\n    \"messaging\",\n    \"chat\",\n    \"privacy\",\n    \"security\",\n    \"encryption\",\n    \"file\",\n    \"sharing\"\n  ],\n  \"author\": \"Steve Phillips <steve@tryingtobeawesome.com>\",\n  \"license\": \"AGPL-3.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/cryptag/leapchat/issues\"\n  },\n  \"homepage\": \"https://github.com/cryptag/leapchat#readme\",\n  \"dependencies\": {\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@emoji-mart/data\": \"^1.1.2\",\n    \"atob\": \"^2.1.2\",\n    \"babel-loader\": \"^9.1.2\",\n    \"btoa\": \"^1.2.1\",\n    \"crypto-browserify\": \"^3.12.0\",\n    \"emoji-datasource-apple\": \"^3.0.0\",\n    \"emoji-js\": \"^3.5.0\",\n    \"emoji-mart\": \"^1.0.1\",\n    \"guid\": \"0.0.12\",\n    \"jquery\": \"^3.6.3\",\n    \"js-sha512\": \"^0.8.0\",\n    \"markdown-it\": \"^13.0.1\",\n    \"minisearch\": \"^6.0.1\",\n    \"react\": \"^18.2.0\",\n    \"react-bootstrap\": \"^2.7.2\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-icons\": \"^4.7.1\",\n    \"react-redux\": \"^8.0.5\",\n    \"redux\": \"^4.2.1\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"utf8\": \"^3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.12\",\n    \"@babel/eslint-parser\": \"^7.19.1\",\n    \"@babel/eslint-plugin\": \"^7.19.1\",\n    \"@babel/plugin-proposal-object-rest-spread\": \"^7.20.7\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/register\": \"^7.18.9\",\n    \"@playwright/test\": \"^1.30.0\",\n    \"@webpack-cli/generators\": \"^3.0.1\",\n    \"babel-plugin-system-import-transformer\": \"^4.0.0\",\n    \"babel-plugin-transform-class-properties\": \"^6.24.1\",\n    \"babel-plugin-transform-object-rest-spread\": \"^6.26.0\",\n    \"blake2s\": \"^1.1.0\",\n    \"bootstrap\": \"^5.2.3\",\n    \"bs58\": \"^5.0.0\",\n    \"buffer\": \"^6.0.3\",\n    \"chai\": \"^4.3.7\",\n    \"copy-webpack-plugin\": \"^4.6.0\",\n    \"css-loader\": \"^6.7.3\",\n    \"eslint\": \"^8.34.0\",\n    \"eslint-plugin-react\": \"^7.32.2\",\n    \"file-loader\": \"^6.2.0\",\n    \"html-webpack-plugin\": \"^5.5.0\",\n    \"jsdom\": \"^10.1.0\",\n    \"mini-css-extract-plugin\": \"^2.7.2\",\n    \"mocha\": \"^10.2.0\",\n    \"node-env-file\": \"^0.1.8\",\n    \"node-sass\": \"^8.0.0\",\n    \"playwright\": \"^1.30.0\",\n    \"prettier\": \"^2.8.4\",\n    \"redux-observable\": \"^0.19.0\",\n    \"rxjs\": \"^5.5.12\",\n    \"sass\": \"^1.58.0\",\n    \"sass-loader\": \"^13.2.0\",\n    \"style-loader\": \"^3.3.1\",\n    \"webpack\": \"^5.75.0\",\n    \"webpack-cli\": \"^5.0.1\",\n    \"webpack-dev-server\": \"^4.11.1\"\n  }\n}\n"
  },
  {
    "path": "pg_types.go",
    "content": "// Steve Phillips / elimisteve\n// 2017.05.18\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"time\"\n\n\tlog \"github.com/sirupsen/logrus\"\n)\n\ntype PGClient struct {\n\tBaseURL string\n}\n\nfunc NewPGClient(baseURL string) *PGClient {\n\treturn &PGClient{\n\t\tBaseURL: baseURL,\n\t}\n}\n\nfunc (cl *PGClient) Post(urlSuffix string, payload interface{}) (*http.Response, error) {\n\tvar payloadb []byte\n\tif payload != nil {\n\t\tb, err := json.Marshal(payload)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpayloadb = b\n\t}\n\n\tlog.Debugf(\"POST'ing to %s: %s\", urlSuffix, payloadb)\n\n\tr := bytes.NewReader(payloadb)\n\treq, _ := http.NewRequest(\"POST\", cl.BaseURL+urlSuffix, r)\n\t// req.Header.Add(\"Prefer\", \"return=representation\")\n\treq.Header.Add(\"Prefer\", \"return=none\")\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\treturn http.DefaultClient.Do(req)\n}\n\nfunc (cl *PGClient) PostWanted(urlSuffix string, payload interface{}, statusWanted int) error {\n\tresp, err := cl.Post(urlSuffix, payload)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != statusWanted {\n\t\tbody, _ := ioutil.ReadAll(resp.Body)\n\n\t\trespjson := map[string]interface{}{}\n\t\terr = json.Unmarshal(body, &respjson)\n\t\treturn fmt.Errorf(\n\t\t\t\"Got HTTP %v from PostgREST, wanted %v. Resp: %#v (err unmarshal: %v)\",\n\t\t\tresp.StatusCode, statusWanted, respjson, err)\n\t}\n\n\treturn nil\n}\n\nfunc (cl *PGClient) Get(urlSuffix string) (*http.Response, error) {\n\tlog.Debugf(\"GET'ing from %s\", urlSuffix)\n\n\treq, _ := http.NewRequest(\"GET\", cl.BaseURL+urlSuffix, nil)\n\t// req.Header.Add(\"Prefer\", \"return=representation\")\n\treq.Header.Add(\"Prefer\", \"return=none\")\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\treturn http.DefaultClient.Do(req)\n}\n\nfunc (cl *PGClient) Delete(urlSuffix string) (*http.Response, error) {\n\tlog.Debugf(\"DELETE'ing from %s\", urlSuffix)\n\n\treq, _ := http.NewRequest(\"DELETE\", cl.BaseURL+urlSuffix, nil)\n\t// req.Header.Add(\"Prefer\", \"return=representation\")\n\treq.Header.Add(\"Prefer\", \"return=none\")\n\t// req.Header.Add(\"Content-Type\", \"application/json\")\n\n\treturn http.DefaultClient.Do(req)\n}\n\nfunc (cl *PGClient) GetInto(urlSuffix string, respobj interface{}) error {\n\tresp, err := cl.Get(urlSuffix)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tstatusWanted := http.StatusOK\n\n\tbody, _ := ioutil.ReadAll(resp.Body)\n\n\tif resp.StatusCode != statusWanted {\n\t\trespjson := map[string]interface{}{}\n\t\terr = json.Unmarshal(body, &respjson)\n\t\treturn fmt.Errorf(\n\t\t\t\"Got HTTP %v from PostgREST, wanted %v. Resp: %#v (err unmarshal: %v)\",\n\t\t\tresp.StatusCode, statusWanted, respjson, err)\n\t}\n\n\treturn json.Unmarshal(body, respobj)\n}\n\ntype PGRoom struct {\n\tRoomID string `json:\"room_id\"`\n}\n\nfunc (room PGRoom) Create(cl *PGClient) error {\n\treturn cl.PostWanted(\"/rooms\", room, http.StatusCreated)\n}\n\ntype PGMessage struct {\n\tMessageID  string     `json:\"message_id,omitempty\"`\n\tRoomID     string     `json:\"room_id\"`\n\tMessage    string     `json:\"message,omitempty\"`\n\tMessageEnc string     `json:\"message_enc\"`\n\tTTL        *int       `json:\"ttl_secs,omitempty\"`\n\tCreated    *time.Time `json:\"created,omitempty\"`\n}\n\ntype pgPostMessage PGMessage\n\nfunc (msg *PGMessage) MarshalJSON() ([]byte, error) {\n\tm := pgPostMessage(*msg)\n\t// Store binary data in Postgres base64-encoded\n\tm.MessageEnc = base64.StdEncoding.EncodeToString([]byte(m.MessageEnc))\n\treturn json.Marshal(m)\n}\n\ntype PGMessages []*PGMessage\n\nfunc (msgs PGMessages) Create(pgClient *PGClient) error {\n\t// TODO: Parse resp.Body as []*PGMessage, return to user\n\treturn pgClient.PostWanted(\"/messages\", msgs, http.StatusCreated)\n}\n"
  },
  {
    "path": "playwright.config.js",
    "content": "const { defineConfig, devices } = require('@playwright/test');\n\nmodule.exports = defineConfig({\n  testDir: \"./test/playwright\",\n  expect: {\n    timout: 5000\n  },\n  fullyParallel: true,\n  reporter: 'html',\n  use: {\n    // does not work, wtf?\n    // baseUrl: \"http://localhost:8080/\",\n    timeout: 5 * 1000,\n    headless: true  // change to 'false' if you want to see a browser open\n  },\n  projects: [\n    {\n      name: 'webkit',\n      use: { ...devices['Desktop Safari'] },\n    },\n    {\n      name: 'firefox',\n      use: { ...devices['Desktop Firefox'] },\n    }  //,\n    // {\n    //   name: 'chromium',\n    //   use: { ...devices['Desktop Chrome'] },\n    // },\n    \n  ]\n});"
  },
  {
    "path": "room.go",
    "content": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gorilla/websocket\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\nconst (\n\tPOSTGREST_BASE_URL = \"http://localhost:3000\"\n)\n\nvar (\n\tDELETE_EXPIRED_MESSAGES_PERIOD = 10 * time.Minute\n\n\tpgClient = NewPGClient(POSTGREST_BASE_URL)\n\tAllRooms = NewRoomManager(pgClient)\n)\n\ntype RoomManager struct {\n\tlock  sync.RWMutex\n\trooms map[string]*Room // map[miniLockID]*Room\n\n\tpgClient *PGClient\n}\n\nfunc NewRoomManager(pgClient *PGClient) *RoomManager {\n\tgo func() {\n\t\ttick := time.Tick(DELETE_EXPIRED_MESSAGES_PERIOD)\n\t\tvar err error\n\t\tfor {\n\t\t\terr = pgClient.PostWanted(\"/rpc/delete_expired_messages\", nil,\n\t\t\t\t204)\n\t\t\tif err != nil {\n\t\t\t\tlog.Infof(\"Error deleting expired messages: %v\", err)\n\t\t\t} else {\n\t\t\t\tlog.Debugf(\"Just deleted expired messages\")\n\t\t\t}\n\t\t\t<-tick\n\t\t}\n\t}()\n\treturn &RoomManager{\n\t\tpgClient: pgClient,\n\t\trooms:    map[string]*Room{},\n\t}\n}\n\nfunc (rm *RoomManager) GetRoom(roomID string) *Room {\n\trm.lock.Lock()\n\tdefer rm.lock.Unlock()\n\n\troom, ok := rm.rooms[roomID]\n\tif !ok {\n\t\troom = NewRoom(roomID, rm.pgClient)\n\t\trm.rooms[roomID] = room\n\t}\n\treturn room\n}\n\ntype Room struct {\n\tID string // miniLock ID\n\n\tClients    []*Client\n\tclientLock sync.RWMutex\n\n\tpgClient *PGClient\n}\n\nfunc NewRoom(roomID string, pgClient *PGClient) *Room {\n\t// TODO: Error handling\n\t_ = PGRoom{RoomID: roomID}.Create(pgClient)\n\treturn &Room{\n\t\tID:       roomID,\n\t\tpgClient: pgClient,\n\t}\n}\n\nfunc (r *Room) GetMessages() ([]Message, error) {\n\tvar pgMessages PGMessages\n\terr := r.pgClient.GetInto(\n\t\t\"/messages?select=message_enc&order=created.desc&limit=100&room_id=eq.\"+r.ID,\n\t\t&pgMessages)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmsgs := make([]Message, len(pgMessages))\n\n\tvar bindata []byte\n\n\t// Grab just the message_enc field, reverse the order, and turn\n\t// PostgREST's hex string response back into base64\n\tfor i := 0; i < len(pgMessages); i++ {\n\t\tbindata, err = byteaToBytes(pgMessages[i].MessageEnc)\n\t\tif err != nil {\n\t\t\tlog.Debugf(\"Error from byteaToBytes: %s\", err)\n\t\t\tcontinue\n\t\t}\n\t\tmsgs[len(pgMessages)-i-1] = bindata\n\t}\n\n\treturn msgs, nil\n}\n\nfunc (r *Room) AddMessages(msgs []Message, ttlSecs *int) error {\n\tpost := make(PGMessages, len(msgs))\n\n\tfor i := 0; i < len(msgs); i++ {\n\t\tpost[i] = &PGMessage{\n\t\t\tRoomID:     r.ID,\n\t\t\tMessageEnc: string(msgs[i]),\n\t\t\tTTL:        ttlSecs,\n\t\t}\n\t}\n\n\treturn post.Create(r.pgClient)\n}\n\nfunc byteaToBytes(hexdata string) ([]byte, error) {\n\tif len(hexdata) <= 2 {\n\t\treturn []byte{}, nil\n\t}\n\n\t// Postgres prefixes the stored strings with \"\\\\x\"\n\thexdatab := []byte(hexdata[2:])\n\n\tb64b := make([]byte, hex.DecodedLen(len(hexdatab)))\n\tn, err := hex.Decode(b64b, hexdatab)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbindata := make([]byte, base64.StdEncoding.DecodedLen(len(b64b)))\n\tn, err = base64.StdEncoding.Decode(bindata, b64b)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn bindata[:n], nil\n}\n\nfunc (r *Room) AddClient(c *Client) {\n\tr.clientLock.Lock()\n\tdefer r.clientLock.Unlock()\n\n\tr.Clients = append(r.Clients, c)\n}\n\nfunc (r *Room) RemoveClient(c *Client) {\n\tr.clientLock.Lock()\n\tdefer r.clientLock.Unlock()\n\n\tfor i, client := range r.Clients {\n\t\tif client == c {\n\t\t\tr.Clients = append(r.Clients[:i], r.Clients[i+1:]...)\n\t\t\tif client.wsConn != nil {\n\t\t\t\tclient.wsConn.Close()\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// If it is a message from the room, make the sender nil.\nfunc (r *Room) BroadcastMessages(sender *Client, msgs ...Message) {\n\tr.clientLock.RLock()\n\tdefer r.clientLock.RUnlock()\n\n\tfor _, client := range r.Clients {\n\t\tgo func(client *Client) {\n\t\t\terr := client.SendMessages(msgs...)\n\t\t\tif err != nil {\n\t\t\t\tlog.Debugf(\"Error sending message. Err: %s\", err)\n\t\t\t}\n\t\t}(client)\n\t}\n}\n\nfunc (r *Room) DeleteAllMessages() error {\n\tresp, err := r.pgClient.Delete(\"/messages?room_id=eq.\" + r.ID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(body) != 0 {\n\t\treturn fmt.Errorf(\"Error deleting messages: `%s`\", body)\n\t}\n\n\treturn nil\n}\n\nfunc (r *Room) BroadcastDeleteSignal() {\n\tr.clientLock.RLock()\n\tdefer r.clientLock.RUnlock()\n\n\tfor _, client := range r.Clients {\n\t\tgo func(client *Client) {\n\t\t\terr := client.SendDeleteSignal()\n\t\t\tif err != nil {\n\t\t\t\tlog.Debugf(\"Error sending message. Err: %s\", err)\n\t\t\t}\n\t\t}(client)\n\t}\n}\n\ntype Client struct {\n\twsConn    *websocket.Conn\n\twriteLock sync.Mutex\n\n\troom *Room\n}\n\nfunc (c *Client) SendMessages(msgs ...Message) error {\n\tc.writeLock.Lock()\n\tdefer c.writeLock.Unlock()\n\n\toutgoing := OutgoingPayload{Ephemeral: msgs}\n\n\tbody, err := json.Marshal(outgoing)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = c.wsConn.WriteMessage(websocket.TextMessage, body)\n\tif err != nil {\n\t\tlog.Debugf(\"Error sending message to client. Removing client from room. Err: %s\", err)\n\t\tc.room.RemoveClient(c)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (c *Client) SendDeleteSignal() error {\n\tc.writeLock.Lock()\n\tdefer c.writeLock.Unlock()\n\n\toutgoing := OutgoingPayload{\n\t\tEphemeral: []Message{},\n\t\tFromServer: FromServer{\n\t\t\tAllMessagesDeleted: true,\n\t\t},\n\t}\n\n\tbody, err := json.Marshal(outgoing)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = c.wsConn.WriteMessage(websocket.TextMessage, body)\n\tif err != nil {\n\t\tlog.Debugf(\"Error sending message to client. Removing client from room. Err: %s\", err)\n\t\tc.room.RemoveClient(c)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (c *Client) SendError(errStr string, secretErr error) error {\n\tc.writeLock.Lock()\n\tdefer c.writeLock.Unlock()\n\n\treturn WSWriteError(c.wsConn, errStr, secretErr)\n}\n"
  },
  {
    "path": "room_test.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestRoomManager(t *testing.T) {\n\trooms := NewRoomManager(pgClient)\n\troomIDs := []string{}\n\twg := &sync.WaitGroup{}\n\n\tfor i := 0; i < 10; i++ {\n\t\troomID := fmt.Sprintf(\"room-%d\", i)\n\t\troomIDs = append(roomIDs, roomID)\n\n\t\twg.Add(1)\n\t\tgo func(roomID string) {\n\t\t\trooms.GetRoom(roomID)\n\t\t\twg.Done()\n\t\t}(roomID)\n\t}\n\n\twg.Wait()\n\tfor _, roomID := range roomIDs {\n\t\tassert.NotNil(t, rooms.rooms[roomID], fmt.Sprintf(\"RoomID: %v\\nRooms: %v\\n\", roomID, rooms))\n\t}\n}\n\nfunc TestRoomMessages(t *testing.T) {\n\tr := NewRoom(\"testing-room-testing-room-testing-room-testing\", pgClient)\n\twg := &sync.WaitGroup{}\n\n\tmsgs := [][]Message{}\n\texpectedMsgs := []Message{}\n\tfor i := 0; i < 10; i++ {\n\t\tmsgs = append(msgs, []Message{})\n\t\tfor n := 0; n < 10; n++ {\n\t\t\tmsgs[i] = append(msgs[i], Message{'a'})\n\t\t\texpectedMsgs = append(expectedMsgs, Message{'a'})\n\t\t}\n\t}\n\n\twg.Add(len(msgs) * 2)\n\tttlSecs := 60\n\tfor i := 0; i < 10; i++ {\n\t\tgo func(i int) {\n\t\t\terr := r.AddMessages(msgs[i], &ttlSecs)\n\t\t\tif err != nil {\n\t\t\t\tt.Logf(\"Error from AddMessages: %s\", err)\n\n\t\t\t\t// FALLTHROUGH\n\t\t\t}\n\t\t\twg.Done()\n\t\t}(i)\n\n\t\tgo func() {\n\t\t\t_, err := r.GetMessages()\n\t\t\tif err != nil {\n\t\t\t\tt.Logf(\"Error from GetMessages: %s\", err)\n\n\t\t\t\t// FALLTHROUGH\n\t\t\t}\n\t\t\twg.Done()\n\t\t}()\n\t}\n\n\twg.Wait()\n\n\tgotMsgs, _ := r.GetMessages()\n\tassert.Equal(t, expectedMsgs, gotMsgs)\n}\n\nfunc TestRoomClients(t *testing.T) {\n\tr := NewRoom(\"testing-room-testing-room-testing-room-testing\", pgClient)\n\tclients := []*Client{}\n\twg := &sync.WaitGroup{}\n\n\tfor i := 0; i < 10; i++ {\n\t\tclient := &Client{}\n\t\tclients = append(clients, client)\n\n\t\twg.Add(1)\n\t\tgo func(c *Client) {\n\t\t\tr.AddClient(c)\n\t\t\twg.Done()\n\t\t}(client)\n\t}\n\n\twg.Wait()\n\tassert.Equal(t, clients, r.Clients)\n\n\tfor _, client := range clients {\n\t\twg.Add(1)\n\t\tgo func(c *Client) {\n\t\t\tr.RemoveClient(c)\n\t\t\twg.Done()\n\t\t}(client)\n\t}\n\n\twg.Wait()\n\tassert.Empty(t, r.Clients)\n}\n\n// TODO\nfunc TestRoomBroadcastMessages(t *testing.T) {}\n"
  },
  {
    "path": "server.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/cryptag/gosecure/canary\"\n\t\"github.com/cryptag/gosecure/content\"\n\t\"github.com/cryptag/gosecure/csp\"\n\t\"github.com/cryptag/gosecure/frame\"\n\t\"github.com/cryptag/gosecure/hsts\"\n\t\"github.com/cryptag/gosecure/referrer\"\n\t\"github.com/cryptag/gosecure/xss\"\n\t\"github.com/cryptag/leapchat/miniware\"\n\n\tminilock \"github.com/cryptag/go-minilock\"\n\t\"github.com/cryptag/go-minilock/taber\"\n\t\"github.com/gorilla/mux\"\n\t\"github.com/justinas/alice\"\n\tuuid \"github.com/nu7hatch/gouuid\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"golang.org/x/crypto/acme/autocert\"\n)\n\nconst (\n\tMINILOCK_ID_KEY = \"minilock_id\"\n)\n\nfunc NewRouter(m *miniware.Mapper) *mux.Router {\n\tr := mux.NewRouter()\n\n\t// pgClient defined in room.go\n\tr.HandleFunc(\"/api/login\", Login(m, pgClient)).Methods(\"GET\")\n\n\tmsgsHandler := miniware.Auth(\n\t\thttp.HandlerFunc(WSMessagesHandler(AllRooms)),\n\t\tm,\n\t)\n\tr.HandleFunc(\"/api/ws/messages/all\", msgsHandler).Methods(\"GET\")\n\n\tr.PathPrefix(\"/\").Handler(gzipHandler(http.FileServer(http.Dir(\"./\" + BUILD_DIR)))).Methods(\"GET\")\n\n\thttp.Handle(\"/\", r)\n\treturn r\n}\n\nfunc NewServer(m *miniware.Mapper, httpAddr string) *http.Server {\n\tr := NewRouter(m)\n\n\treturn &http.Server{\n\t\tAddr:         httpAddr,\n\t\tReadTimeout:  5 * time.Second,\n\t\tWriteTimeout: 10 * time.Second,\n\t\tIdleTimeout:  120 * time.Second,\n\t\tHandler:      r,\n\t}\n}\n\nfunc ProductionServer(srv *http.Server, httpsAddr, domain string, manager *autocert.Manager, iframeOrigin string) {\n\tgotWarrant := false\n\tmiddleware := alice.New(canary.GetHandler(&gotWarrant),\n\t\tcsp.GetCustomHandlerStyleUnsafeInline(domain, domain),\n\t\thsts.PreloadHandler, frame.GetHandler(iframeOrigin),\n\t\tcontent.GetHandler, xss.GetHandler, referrer.NoHandler)\n\n\tsrv.Handler = middleware.Then(manager.HTTPHandler(srv.Handler))\n\n\tsrv.Addr = httpsAddr\n\tsrv.TLSConfig = manager.TLSConfig()\n}\n\nfunc Login(m *miniware.Mapper, pgClient *PGClient) func(w http.ResponseWriter, req *http.Request) {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {\n\t\tmID, keypair, err := parseMinilockID(req)\n\t\tif err != nil {\n\t\t\tWriteErrorStatus(w, \"Error: invalid miniLock ID\",\n\t\t\t\terr, http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\n\t\terr = PGRoom{RoomID: mID}.Create(pgClient)\n\t\tif err != nil && !strings.Contains(err.Error(),\n\t\t\t\"duplicate key value violates unique constraint\") {\n\n\t\t\tWriteErrorStatus(w, \"Error creating new room\",\n\t\t\t\terr, http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Infof(\"Login: `%s` is trying to log in\\n\", mID)\n\n\t\tnewUUID, err := uuid.NewV4()\n\t\tif err != nil {\n\t\t\tWriteError(w, \"Error generating new auth token; sorry!\", err)\n\t\t\treturn\n\t\t}\n\n\t\tauthToken := newUUID.String()\n\n\t\terr = m.SetMinilockID(authToken, mID)\n\t\tif err != nil {\n\t\t\tWriteError(w, \"Error saving new auth token; sorry!\", err)\n\t\t\treturn\n\t\t}\n\n\t\tfilename := \"type:authtoken\"\n\t\tcontents := []byte(authToken)\n\t\tsender := randomServerKey\n\t\trecipient := keypair\n\n\t\tencAuthToken, err := minilock.EncryptFileContents(filename, contents,\n\t\t\tsender, recipient)\n\t\tif err != nil {\n\t\t\tWriteError(w, \"Error encrypting auth token to you; sorry!\", err)\n\t\t\treturn\n\t\t}\n\n\t\tw.Write(encAuthToken)\n\t})\n}\n\nfunc parseMinilockID(req *http.Request) (string, *taber.Keys, error) {\n\tmID := req.Header.Get(\"X-Minilock-Id\")\n\n\t// Validate miniLock ID by trying to generate public key from it\n\tkeypair, err := taber.FromID(mID)\n\tif err != nil {\n\t\treturn \"\", nil, fmt.Errorf(\"Error validating miniLock ID: %v\", err)\n\t}\n\n\treturn mID, keypair, nil\n}\n\nfunc redirectToHTTPS(httpAddr, httpsPort, domain string, manager *autocert.Manager) {\n\tsrv := &http.Server{\n\t\tAddr:         httpAddr,\n\t\tReadTimeout:  5 * time.Second,\n\t\tWriteTimeout: 5 * time.Second,\n\t\tIdleTimeout:  5 * time.Second,\n\t\tHandler: manager.HTTPHandler(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {\n\t\t\tw.Header().Set(\"Connection\", \"close\")\n\t\t\turl := \"https://\" + domain + \":\" + httpsPort + req.URL.String()\n\t\t\tif httpsPort == \"443\" {\n\t\t\t\turl = \"https://\" + domain + req.URL.String()\n\t\t\t}\n\t\t\thttp.Redirect(w, req, url, http.StatusFound)\n\t\t})),\n\t}\n\tlog.Infof(\"Listening on %v\\n\", httpAddr)\n\tlog.Fatal(srv.ListenAndServe())\n}\n\nfunc getAutocertManager(domain string) *autocert.Manager {\n\tdomains := []string{domain}\n\t// Support both website.com and www.website.com\n\tif strings.HasPrefix(domain, \"www.\") {\n\t\tdomains = append(domains, domain[len(\"www.\"):])\n\t} else {\n\t\tdomains = append(domains, \"www.\" + domain)\n\t}\n\n\treturn &autocert.Manager{\n\t\tPrompt:     autocert.AcceptTOS,\n\t\tHostPolicy: autocert.HostWhitelist(domains...),\n\t\tCache:      autocert.DirCache(\"./\" + domain),\n\t}\n}\n"
  },
  {
    "path": "server_test.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestParseMinilockID(t *testing.T) {\n\t// request without header returns Error\n\treq := httptest.NewRequest(http.MethodGet, \"/\", nil)\n\n\tmID, keypair, err := parseMinilockID(req)\n\n\tassert.Equal(t, \"\", mID, fmt.Sprintf(\"mID was not an empty string: %v\\n\", mID))\n\tassert.Nil(t, keypair, fmt.Sprintf(\"keypair was unexpectedly not nil: %v\\n\", keypair))\n\tassert.NotNil(t, err, fmt.Sprintf(\"err was unexpectedly nil: %v\\n\", err))\n\n\t// request with invalid header value returns Error\n\tinvalidMiniLockId := \"2aSQkrU5hp\"\n\treq.Header.Set(\"X-Minilock-Id\", invalidMiniLockId)\n\n\tmID, keypair, err = parseMinilockID(req)\n\n\tassert.Equal(t, \"\", mID, fmt.Sprintf(\"mID was not an empty string: %v\\n\", mID))\n\tassert.Nil(t, keypair, fmt.Sprintf(\"keypair was unexpectedly not nil: %v\\n\", keypair))\n\tassert.NotNil(t, err, fmt.Sprintf(\"err was unexpectedly nil: %v\\n\", err))\n\n\t// request with valid header value returns value, nil Error\n\tvalidMiniLockId := \"s9dDgRKVWvnkpifRXiSgFGj9QLgq1BZ3qvzCsnxPFDrQG\"\n\treq.Header.Set(\"X-Minilock-Id\", validMiniLockId)\n\n\tmID, keypair, err = parseMinilockID(req)\n\n\tassert.Equal(t, validMiniLockId, mID, fmt.Sprintf(\"mID was unexpected an empty string: %v\\n\", mID))\n\tassert.NotNil(t, keypair, fmt.Sprintf(\"keypair was unexpectedly nil: %v\\n\", keypair))\n\tassert.Nil(t, err, fmt.Sprintf(\"err was unexpectedly not nil: %v\\n\", err))\n\n}\n"
  },
  {
    "path": "src/components/App.js",
    "content": "import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport {\n  setUsername,\n  initConnection,\n  initChat\n} from '../store/actions/chatActions';\n\nimport Header from './layout/Header';\n\nimport ChatContainer from './chat/ChatContainer';\n\nimport PincodeModal from './modals/PincodeModal';\nimport UsernameModal from './modals/Username';\n\n// evaluate on initial render only, not on every re-render.\nconst isNewRoom = Boolean(!document.location.hash);\n\nclass App extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      modals: {\n        username: {\n          isVisible: false\n        },\n        pincode: {\n          isVisible: false\n        }\n      }\n    };\n\n  }\n\n  componentDidMount() {\n    this.props.initChat();\n    this.connectIfNeeded();\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    this.connectIfNeeded();\n  }\n\n  connectIfNeeded() {\n    if (!this.props.pincodeRequired && this.props.shouldConnect){\n      this.onInitConnection();\n    }\n  }\n\n  onSetPincode = (pincode = \"\") => {\n    if (!pincode || pincode.endsWith(\"--\")) {\n      this.onError('Invalid pincode!');\n      return;\n    }\n    this.onInitConnection(pincode);\n  };\n\n  createDeviceSession(passphrase) {\n    document.location.hash = '#' + passphrase;\n  }\n\n  onInitConnection(pincode='') {\n    const urlHash = document.location.hash + pincode;\n    this.props.initConnection(this.createDeviceSession, urlHash);\n  }\n\n  onToggleModalVisibility = (modalName, isVisible) => {\n    let modalsState = {...this.state.modals};\n    modalsState[modalName].isVisible = isVisible;\n    this.setState({\n      modals: modalsState\n    });\n  };\n\n  onClosePincodeModal = () => {\n    this.setState({\n      showPincodeModal: false\n    });\n  };\n\n  render() {\n    const {\n      username,\n      pincodeRequired,\n      previousUsername,\n      authenticating,\n      connecting,\n      connected,\n    } = this.props;\n\n    let showUsernameModal = this.state.modals.username.isVisible;\n    showUsernameModal = !pincodeRequired && (showUsernameModal || username === '');\n\n    const chatInputFocus = !pincodeRequired && !showUsernameModal && username !== '';\n\n    return (\n      <div id=\"page\">\n        <Header\n          username={username}\n          onToggleModalVisibility={this.onToggleModalVisibility} />\n\n        {pincodeRequired && <PincodeModal\n          showModal={pincodeRequired}\n          onSetPincode={this.onSetPincode}\n          onToggleModalVisibility={this.onToggleModalVisibility} />}\n\n        {showUsernameModal && <UsernameModal\n          previousUsername={previousUsername}\n          username={username}\n          isVisible={showUsernameModal}\n          isNewRoom={isNewRoom}\n          setUsername={this.props.setUsername}\n          connecting={connecting}\n          connected={connected}\n          onToggleModalVisibility={this.onToggleModalVisibility} />}\n\n        <main className=\"encloser\">\n\n          <ChatContainer\n            messageInputFocus={chatInputFocus}\n            onToggleModalVisibility={this.onToggleModalVisibility} />\n\n        </main>\n\n      </div>\n    );\n  }\n}\n\nApp.propTypes = {};\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    username: reduxState.chat.username,\n    previousUsername: reduxState.chat.previousUsername,\n    pincodeRequired: reduxState.chat.pincodeRequired,\n    shouldConnect: reduxState.chat.shouldConnect,\n    connecting: reduxState.chat.connecting,\n    connected: reduxState.chat.connected,\n  };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n  return {\n    initChat: () => dispatch(initChat()),\n    initConnection: (createDeviceSession, urlHash) => dispatch(initConnection(createDeviceSession, urlHash)),\n    setUsername: (username) => dispatch(setUsername(username)),\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(App);"
  },
  {
    "path": "src/components/chat/AutoSuggest.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport emoji from '../../utils/emoji_convertor';\nimport md from '../../utils/link_attr_blank';\nimport MentionSuggestions from './MentionSuggestions';\nimport EmojiSuggestions from './EmojiSuggestions';\n\nconst AutoSuggest = ({ chat }) => {\n\n  const isMentions = chat.suggestionWord[0] === '@';\n\n  return (\n    <div className=\"suggestions-container\">\n      <div className=\"suggestions-header\">\n        { isMentions\n          ? 'User'\n          :'Emoji'\n        } matching <strong>\"{chat.suggestionWord}\"</strong>\n        <span className=\"header-help\">\n          <strong>↑</strong><strong>↓ </strong> to navigate\n          <span className=\"inline-margin\"><strong> ↵ </strong> to select</span>\n        </span>\n      </div>\n      { isMentions\n        ? <MentionSuggestions />\n        : <EmojiSuggestions />\n      }\n    </div>\n  );\n};\n\n\nexport default connect(({ chat }) => ({chat}))(AutoSuggest);\n"
  },
  {
    "path": "src/components/chat/ChatContainer.js",
    "content": "import React, { Component } from 'react';\nimport { PropTypes } from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport MessageBox from './MessageBox';\nimport MessageForm from './MessageForm';\nimport AutoSuggest from './AutoSuggest';\nimport AlertContainer from '../general/AlertContainer';\n\nconst ChatContainer = ({\n  suggestions,\n  messageInputFocus,\n  onToggleModalVisibility\n}) => {\n\n  return (\n    <div className=\"content\">\n\n      <AlertContainer />\n\n      <MessageBox />\n\n      {suggestions.length > 0 && <AutoSuggest />}\n\n      <MessageForm\n        shouldHaveFocus={messageInputFocus}\n        onToggleModalVisibility={onToggleModalVisibility} />\n\n    </div>\n  );\n};\n\nChatContainer.propTypes = {\n  messageInputFocus: PropTypes.bool.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired,\n};\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    suggestions: reduxState.chat.suggestions,\n  };\n};\n\nexport default connect(mapStateToProps)(ChatContainer);\n"
  },
  {
    "path": "src/components/chat/ChatRoom.js",
    "content": "import React, { Component } from 'react';\n\nclass ChatRoom extends Component {\n  onSelectRoom(){\n    let roomKey = this.props.chatRoom.key;\n    this.props.onSelectRoom(roomKey);\n  }\n\n  render(){\n    let chatRoom = this.props.chatRoom;\n    return (\n      <li>\n        <a href=\"#\" onClick={this.onSelectRoom.bind(this)}>{chatRoom.roomname}</a>\n      </li>\n    );\n  }\n}\n\n// class ChatRoom extends Component {\n//   render(){\n//     let username = this.props.username;\n//     let room = this.props.room;\n//\n//     return (\n//      <div className=\"chatroom\">\n//         {(room.messages || []).map(message => {\n//           let fromMe = (message.from === username);\n//           return (\n//             <div key={message.key} className={fromMe ? 'chat-outgoing' : 'chat-incoming'}>\n//               {message.from}: {message.msg}\n//             </div>\n//           )\n//         })}\n//       </div>\n//     )\n//   }\n// }\n\nexport default ChatRoom;\n"
  },
  {
    "path": "src/components/chat/EmojiSuggestions.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport { addSuggestion } from '../../store/actions/chatActions';\nimport emoji from '../../utils/emoji_convertor';\nimport md from '../../utils/link_attr_blank';\nimport { scrollIntoViewOptions } from '../../utils/suggestions';\n\nconst EmojiSuggestions = ({ addSuggestion, chat }) => (\n  <ul>\n    {chat.suggestions.map((emoj, i) => {\n      const suggestion = emoji.replace_colons(emoj.name) + emoj.name;\n      const suggestionMD = suggestion.replace(/<span class=\"emoji emoji-sizer\" style=\"background-image:url\\((\\/static\\/img\\/emoji\\/apple\\/64\\/.*?)\\)\" data-codepoints=\"(?:.*?)\"><\\/span>/g, '![emoji]($1)');\n      const renderItem = md.renderInline(suggestionMD);\n      const activeItem = chat.highlightedSuggestion === i;\n      let props = {\n        key : i,\n        onClick : (e) => addSuggestion(emoj.name),\n        className : activeItem ? 'active': '',\n      };\n      if (activeItem) {\n        props.ref = (item) => {\n          if (item) item.scrollIntoView(scrollIntoViewOptions);\n        };\n      }\n      return (<li {...props} dangerouslySetInnerHTML={{__html: renderItem}}></li>);\n    })}\n  </ul>\n);\n\n\n\nexport default connect(({ chat }) => ({chat}), { addSuggestion })(EmojiSuggestions);\n"
  },
  {
    "path": "src/components/chat/MentionSuggestions.js",
    "content": "import React from 'react';\nimport { connect } from 'react-redux';\nimport { addSuggestion } from '../../store/actions/chatActions';\nimport { scrollIntoViewOptions } from '../../utils/suggestions';\nimport { UserStatusIconBubble } from './UserStatusIcons';\nconst MentionSuggestions = ({ chat, addSuggestion }) => (\n  <ul>\n    {chat.suggestions.map((user, i) => {\n      const activeItem = chat.highlightedSuggestion === i;\n      const mention = user.name;\n\n      let props = {\n        key : i,\n        onClick : (e) => addSuggestion(mention),\n        className : activeItem ? 'active': '',\n      };\n      if (activeItem) {\n        props.ref = (item) => {\n          if (item) item.scrollIntoView(scrollIntoViewOptions);\n        };\n      }\n      return <li {...props}>\n        <UserStatusIconBubble status={user.status} />\n        {mention.slice(1)}\n      </li>;\n    })}\n  </ul>\n);\n\nexport default connect(({ chat }) => ({chat}), { addSuggestion })(MentionSuggestions);\n"
  },
  {
    "path": "src/components/chat/Message.js",
    "content": "import React, { Component } from 'react';\nimport emoji from '../../utils/emoji_convertor';\nimport md from '../../utils/link_attr_blank';\n\nclass Message extends Component {\n\n  render() {\n    let { message, username } = this.props;\n    let fromMe = message.from === username;\n    let messageClass = fromMe ? 'chat-outgoing' : 'chat-incoming';\n\n    let emojified = emoji.replace_colons(message.msg);\n\n    // Convert `emoji.replace_colons`-generated <span> tags to Markdown\n    let emojiMD = emojified.replace(\n      /<span class=\"emoji emoji-sizer\" style=\"background-image:url\\((\\/static\\/img\\/emoji\\/apple\\/64\\/)(.*?)(\\.png)\\)\" data-codepoints=\"(?:.*?)\"><\\/span>/g,\n      (match, $1, $2, $3) => {\n        // Example:\n        //\n        // $1 == /static/img/emoji/apple/64/\n        // $2 == 1f604\n        // $3 == .png\n        // emoji.data[$2][3][0] == smile\n        // return '![:smile:](/static/img/emoji/apple/64/1f604.png)'\n        let emojiName = 'emoji';\n        let emojiNameArray = null;\n\n        // Sometimes $2 looks something like 1f604-1f604-1f604-1f604\n        const parts = ($2).split('-');\n        const partsLength = parts.length;\n        for (let i = partsLength; i > 0; i--) {\n          emojiNameArray = emoji.data[parts.slice(0, i).join('-')];\n          if (emojiNameArray) {\n            break;\n          }\n        }\n\n        if (emojiNameArray &&\n            emojiNameArray.length >= 4 &&\n            emojiNameArray[3].length >= 1) {\n\n          emojiName = emojiNameArray[3][0];\n        }\n\n        return '![:' + emojiName + ':](' + $1 + $2 + $3 + ')';\n      }\n    );\n\n    // Render escaped HTML/Markdown\n    let linked = md.render(emojiMD);\n\n    return (\n      <li className={'chat-message ' + messageClass} key={message.key}>\n        <span className=\"username\">{message.from}</span>\n        <div dangerouslySetInnerHTML={{__html: linked}}>\n        </div>\n      </li>\n    );\n  }\n}\n\nexport default Message;\n"
  },
  {
    "path": "src/components/chat/MessageBox.js",
    "content": "import React, { Component } from 'react';\n\nimport MessageList from './MessageList';\nimport { connect } from 'react-redux';\nimport { closePicker } from '../../store/actions/chatActions';\nimport { playNotification } from '../../utils/audio';\n\nclass MessageBox extends Component {\n  constructor(props){\n    super(props);\n\n    this.messagesEnd = null;\n\n    this.state = {\n      notifiedIds: []\n    };\n  }\n\n  onNewMessages = () => {\n    if (this.props.isAudioEnabled){\n      playNotification();\n    }\n    this.scrollToBottom();\n  };\n\n  scrollToBottom = () => {\n    this.messagesEnd && this.messagesEnd.scrollIntoView();\n  };\n\n  // Separate function to set reference because of https://reactjs.org/docs/refs-and-the-dom.html#caveats\n  setMessagesEndRef = (element) => {\n    this.messagesEnd = element;\n  };\n\n  render(){\n    let { messages, username, closePicker } = this.props;\n\n    return (\n      <div className=\"message-box\" onClick={closePicker}>\n        <div className=\"message-list\">\n          <MessageList\n            onNewMessages={() => this.onNewMessages()}\n            messages={messages}\n            username={username} />\n        </div>\n        <div style={{float: \"left\", clear: \"both\"}}\n          ref={this.setMessagesEndRef}>\n        </div>\n      </div>\n    );\n  }\n}\n\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    messages: reduxState.chat.messages,\n    username: reduxState.chat.username,\n    isAudioEnabled: reduxState.settings.isAudioEnabled,\n  };\n};\n\nexport default connect(mapStateToProps, { closePicker })(MessageBox);\n"
  },
  {
    "path": "src/components/chat/MessageForm.js",
    "content": "import React, { Component } from 'react';\nimport { PropTypes } from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport { Button } from 'react-bootstrap';\nimport { FaArrowAltCircleRight } from 'react-icons/fa';\nimport { FaSmile } from 'react-icons/fa';\nimport { Picker } from 'emoji-mart';\n\nimport emoji from '../../constants/emoji';\nimport { emojiSuggestions, mentionSuggestions } from '../../utils/suggestions';\nimport {\n  messageUpdate,\n  clearMessage,\n  togglePicker,\n  addEmoji,\n  closePicker,\n  startSuggestions,\n  stopSuggestions,\n  downSuggestion,\n  upSuggestion,\n  addSuggestion,\n  sendMessage,\n} from '../../store/actions/chatActions';\n\nimport ToggleAudioIcon from './toolbar/ToggleAudioIcon';\nimport InviteIcon from './toolbar/InviteIcon';\nimport OpenSearchIcon from './toolbar/OpenSearchIcon';\n\nclass MessageForm extends Component {\n  constructor(props) {\n    super(props);\n\n    this.messageInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.resolveFocus();\n  }\n\n  componentDidUpdate() {\n    this.resolveFocus();\n  }\n\n  resolveFocus() {\n    if (this.props.shouldHaveFocus) {\n      this.messageInput.current.focus();\n    }\n  }\n\n  onKeyPress = (e) => {\n    const cursorIndex = this.messageInput.current.selectionStart;\n    const { suggestionStart, suggestions, highlightedSuggestion, statuses} = this.props;\n    // Send on <enter> unless <shift-enter> has been pressed\n    if (e.key === 'Enter' && !e.nativeEvent.shiftKey) {\n      if (suggestions.length > 0) {\n        const selected = suggestions[highlightedSuggestion];\n        e.preventDefault();\n        return this.props.addSuggestion(selected.name);\n      }\n      this.onSendMessage(e);\n      this.props.closePicker();\n    }\n    if (e.key === ':' && suggestionStart === null) {\n      this.props.startSuggestions(cursorIndex, emojiSuggestions);\n    }\n    if (e.key === '@' && suggestionStart === null) {\n      this.props.startSuggestions(cursorIndex, mentionSuggestions, statuses);\n    }\n    if(e.nativeEvent.code === 'Space' && suggestionStart !== null) {\n      this.props.stopSuggestions();\n    }\n  };\n\n  onKeyDown = (e) => {\n    const { message, suggestionWord, statuses } = this.props;\n    const cursorIndex = this.messageInput.current.selectionStart;\n    const before = message.slice(0, cursorIndex - 1);\n    const word = suggestionWord;\n    const filterSuggestions = word[0] === '@'\n      ? mentionSuggestions\n      : emojiSuggestions;\n    if (e.key === 'Backspace' && before.endsWith(word) && word) {\n      const start = before.length - word.length;\n      this.props.startSuggestions(start, filterSuggestions, statuses);\n    }\n  };\n\n  isPayloadValid(message) {\n    if (message && message.length > 0) {\n      return true;\n    }\n    return false;\n  }\n\n  onSendMessage = (e) => {\n    e.preventDefault();\n\n    const { message, username } = this.props;\n\n    if (!this.isPayloadValid(message)) {\n      return false;\n    }\n\n    this.props.sendMessage({ message, username });\n    this.props.clearMessage();\n  };\n\n  backgroundImageFn = (set, sheetSize) => {\n    if (set !== 'apple' || sheetSize !== 64) {\n      console.log('WARNING: using set \"apple\" and sheetSize 64 rather than',\n        set, 'and', sheetSize, 'as was requested');\n    }\n    return '/' + emoji.EMOJI_APPLE_64_SHEET;\n  };\n\n  addEmoji = (emoji) => {\n    const cursorIndex = this.messageInput.current.selectionStart;\n    this.props.addEmoji(emoji.colons, cursorIndex);\n  };\n\n  handleKeyDown = (e) => {\n    const { suggestions, suggestionStart } = this.props;\n    const cursorIndex = this.messageInput.current.selectionStart;\n    if (e.key === 'Backspace' && cursorIndex - suggestionStart === 1) {\n      this.props.stopSuggestions();\n    }\n    if (e.key === 'ArrowUp' && suggestions.length > 0) {\n      e.preventDefault();\n      this.props.upSuggestion();\n    }\n    if (e.key === 'ArrowDown' && suggestions.length > 0) {\n      e.preventDefault();\n      this.props.downSuggestion();\n    }\n  };\n\n  onMessageUpdate = (e) => {\n    const message = e.target.value;\n    this.props.messageUpdate(message);\n  };\n\n  render() {\n    const {\n      message,\n      showEmojiPicker,\n      username,\n      messages,\n    } = this.props;\n\n    const {\n      togglePicker,\n      isAudioEnabled,\n      onSetIsAudioEnabled } = this.props;\n\n    return (\n      <div className=\"message-form\">\n        <form role=\"form\" className=\"form\" onSubmit={this.onSendMessage}>\n          {showEmojiPicker && <Picker\n            emojiSize={24}\n            perLine={9}\n            skin={1}\n            set={'apple'}\n            autoFocus={false}\n            include={[]}\n            exclude={['nature', 'places', 'flags']}\n            emoji={\"\"}\n            title={\"LeapChat\"}\n            backgroundImageFn={this.backgroundImageFn}\n            onClick={this.addEmoji} />}\n\n          <div>\n            <div className=\"chat-icons\">\n              <FaSmile size={24}\n                className=\"emoji-picker-icon\"\n                onClick={togglePicker} />\n\n              <ToggleAudioIcon\n                isAudioEnabled={isAudioEnabled}\n                onSetIsAudioEnabled={onSetIsAudioEnabled} />\n\n              <OpenSearchIcon\n                username={username}\n                messages={messages} />\n\n              <InviteIcon />\n\n              <div className=\"right-chat-icons\"></div>\n            </div>\n\n            \n            <div className=\"message\" onKeyDown={this.handleKeyDown}>\n              <textarea\n                className=\"form-control\"\n                onChange={this.onMessageUpdate}\n                onKeyPress={this.onKeyPress}\n                onKeyDown={this.onKeyDown}\n                name=\"message\"\n                value={message}\n                ref={this.messageInput}\n                placeholder=\"Enter message\">\n              </textarea>\n              <Button variant=\"default\" onClick={this.onSendMessage}>\n                <FaArrowAltCircleRight size={30} />\n              </Button>\n            </div>\n\n          </div>\n        </form>\n\n      </div>\n    );\n  }\n}\n\nMessageForm.propType = {\n  shouldHaveFocus: PropTypes.bool.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired,\n};\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    isAudioEnabled: reduxState.settings.isAudioEnabled,\n    ...reduxState.chat,\n  };\n};\n\nexport default connect(mapStateToProps, {\n  messageUpdate,\n  clearMessage,\n  togglePicker,\n  addEmoji,\n  closePicker,\n  startSuggestions,\n  stopSuggestions,\n  downSuggestion,\n  upSuggestion,\n  addSuggestion,\n  sendMessage,\n})(MessageForm);\n"
  },
  {
    "path": "src/components/chat/MessageList.js",
    "content": "import React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\n\nimport Message from './Message';\n\nclass MessageList extends Component {\n\n  shouldComponentUpdate(nextProps, nextState) {\n    return nextProps.messages.length > 0 \n      && nextProps.messages\n        .map(m => m.id)\n        .concat(this.props.messages.map(m => m.id))\n        .reduce((acc, id) => {\n          if(!acc.indexOf(id) === -1){\n            acc.push(id);\n          }\n          return acc;\n        }, [])\n        .length !== this.props.messages;\n  }\n\n  componentDidUpdate(){\n    this.props.onNewMessages();\n  }\n\n  render() {\n    const { messages, username } = this.props;\n\n    return (\n      <ul>\n        {messages.map((message, i) => {\n          return (\n            <Message\n              key={i}\n              message={message}\n              username={username} />\n          );\n        })}\n      </ul>\n    );\n  }\n}\n\nexport default MessageList;\n"
  },
  {
    "path": "src/components/chat/UserIcon.js",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { FaUsers } from 'react-icons/fa';\n\nconst UserIcon = ({ onToggleUserList }) => {\n\n  return (\n    <div className=\"users-icon\">\n      <FaUsers size={30} onClick={onToggleUserList} />\n    </div>\n  );\n};\n\nUserIcon.propTypes = {\n  onToggleUserList: PropTypes.func.isRequired\n};\n\nexport default UserIcon;\n"
  },
  {
    "path": "src/components/chat/UserList.js",
    "content": "import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from \"react-redux\";\n\nimport { Button } from 'react-bootstrap';\nimport { FaShareAlt } from 'react-icons/fa';\n\nimport { UserStatusIcon } from './UserStatusIcons';\n\nimport SharingModal from '../modals/SharingModal';\n\nconst UserList = ({\n  username,\n  statuses,\n  displayUserList,\n  onToggleModalVisibility,\n}) => {\n  const [showSharingModal, setShowSharingModal] = useState(false);\n  const currentUsername = username;\n\n  const userStatuses = Object.keys(statuses).map(username => {\n    const status = statuses[username];\n    return { status, username };\n  });\n\n  const styleUserList = () => {\n    return { display: displayUserList ? \"block\" : \"none\" };\n  };\n\n  return (\n    <div className=\"users-list\" style={styleUserList()}>\n      <ul>\n        {userStatuses.map((userStatus, i) => {\n          return (\n            <li key={i}>\n              <UserStatusIcon\n                username={userStatus.username}\n                status={userStatus.status}\n                isCurrentUser={userStatus.username === currentUsername}\n                onToggleModalVisibility={onToggleModalVisibility} />\n            </li>\n          );\n        })}\n      </ul>\n      <div className=\"invite-users\" >\n        <Button\n          className=\"icon-button\"\n          variant=\"link\"\n          onClick={() => setShowSharingModal(true)}>\n          Invite Users <FaShareAlt size={15} />\n        </Button>\n        {showSharingModal && <SharingModal\n          isVisible={showSharingModal}\n          onClose={() => setShowSharingModal(false)} />}\n      </div>\n      \n    </div>\n  );\n};\n\nUserList.propTypes = {\n  username: PropTypes.string.isRequired,\n  displayUserList: PropTypes.bool.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = (reduxState) => ({\n  statuses: reduxState.chat.statuses\n});\n\nexport default connect(mapStateToProps)(UserList);\n"
  },
  {
    "path": "src/components/chat/UserStatusIcons.js",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\n\nimport { FaCircle } from 'react-icons/fa';\nimport { FaMinusCircle } from 'react-icons/fa';\nimport { FaEdit } from 'react-icons/fa';\n\nconst editUsernameTooltip = (\n  <Tooltip id=\"edit-username-tooltip\">Edit Username</Tooltip>\n);\n\nexport const UserStatusIconBubble = ({ status }) => {\n  let statusIcon = <FaMinusCircle style={styleOffline} />;\n  if (status === 'viewing') {\n    statusIcon = <FaCircle style={styleViewing} />;\n  } else if (status === 'online') {\n    statusIcon = <FaCircle style={styleOnline} />;\n  }\n  return (\n    <>\n      {statusIcon}\n    </>\n  );\n};\n\nUserStatusIconBubble.propTypes = {\n  status: PropTypes.string.isRequired,\n};\n\n\nexport const UserStatusIcon = ({\n  username,\n  status,\n  isCurrentUser,\n  onToggleModalVisibility\n}) => {\n\n  const onShowUsernameModal = () => {\n    onToggleModalVisibility('username', true);\n  };\n\n  return (\n    <div style={styleUserStatus}>\n      <UserStatusIconBubble status={status} />\n      {username}\n      {isCurrentUser && <span>&nbsp;(me)</span> }\n      <span style={styleEditUsername} data-testid=\"edit-username\">\n        {isCurrentUser &&\n          // <OverlayTrigger placement=\"bottom\" overlay={editUsernameTooltip} delayShow={300} delayHide={150}>\n          // </OverlayTrigger>\n          <FaEdit onClick={onShowUsernameModal} size={19} />\n        }\n      </span>\n    </div>\n  );\n};\n\nUserStatusIcon.propTypes = {\n  username: PropTypes.string.isRequired,\n  status: PropTypes.string.isRequired,\n  isCurrentUser: PropTypes.bool.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired\n};\n\nconst styleUserStatus = {\n  display: 'flex',\n  flexDirection: 'row',\n  alignItems: 'center'\n};\n\nconst styleDots = {\n  marginTop: '.2em',\n  marginRight: '.2em',\n  marginBottom: '.2em'\n};\n\nconst styleViewing = Object.assign(\n  { color: 'green' },\n  styleDots\n);\n\nconst styleOnline = Object.assign(\n  { color: 'yellow' },\n  styleDots\n);\n\nconst styleOffline = Object.assign(\n  { color: 'gray' },\n  styleDots\n);\n\nconst styleEditUsername = {\n  cursor: 'pointer',\n  marginLeft: 'auto',\n  marginRight: '2px'  // For optical vertical alignment with gear icon\n};"
  },
  {
    "path": "src/components/chat/toolbar/InviteIcon.js",
    "content": "import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\n\nimport { FaShareAltSquare } from 'react-icons/fa';\n\nimport SharingModal from '../../modals/SharingModal';\n\nconst shareChatTooltip = (\n  <Tooltip id=\"share-chat\">Invite to Chat</Tooltip>\n);\n\nconst InviteIcon = () => {\n\n  const [showSharingModal, setShowSharingModal] = useState(false);\n\n  return (\n    <div className=\"sharing\">\n      {/* <OverlayTrigger overlay={shareChatTooltip} placement=\"top\" delayShow={300} delayHide={150}> */}\n      {/* </OverlayTrigger> */}\n      <FaShareAltSquare size={24} onClick={() => setShowSharingModal(true)} />\n      {showSharingModal && <SharingModal\n        isVisible={showSharingModal}\n        onClose={() => setShowSharingModal(false)} />}\n    </div>\n  );\n};\n\nInviteIcon.propTypes = {};\n\nexport default InviteIcon;\n"
  },
  {
    "path": "src/components/chat/toolbar/OpenSearchIcon.js",
    "content": "import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\nimport { FaSearch } from 'react-icons/fa';\n\nimport SearchModal from '../../modals/SearchModal';\n\nconst OpenSearchIcon = ({ username, messages }) => {\n  const [showSearchModal, setShowSearchModal] = useState(false);\n\n  const openTooltip = (\n    <Tooltip id=\"open-message-search\">Search Content</Tooltip>\n  );\n\n  return (\n    <div className=\"open-message-search\">\n      {/* <OverlayTrigger overlay={openTooltip} placement=\"top\" delayShow={300} delayHide={150}> */}\n      {/* </OverlayTrigger> */}\n      <FaSearch\n        size={24}\n        onClick={() => setShowSearchModal(true)} />\n      {showSearchModal && <SearchModal \n        username={username}\n        isVisible={showSearchModal}\n        messages={messages}\n        onClose={() => setShowSearchModal(false)} />}\n    </div>\n  );\n};\n\nOpenSearchIcon.propTypes = {\n  username: PropTypes.string.isRequired,\n  messages: PropTypes.array.isRequired,\n};\n\nexport default OpenSearchIcon;\n"
  },
  {
    "path": "src/components/chat/toolbar/ToggleAudioIcon.js",
    "content": "import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\n\nimport { FaVolumeUp } from 'react-icons/fa';\nimport { FaVolumeMute } from 'react-icons/fa';\nimport { disableAudio, enableAudio } from '../../../store/actions/settingsActions';\n\nconst disableAudioTooltip = (\n  <Tooltip id=\"mute-audio\">Mute Audio</Tooltip>\n);\n\nconst enableAudioTooltip = (\n  <Tooltip id=\"enable-audio\">Enable Audio</Tooltip>\n);\n\nconst DisableAudioIcon = ({ onSetIsAudioEnabled }) => (\n  // <OverlayTrigger overlay={disableAudioTooltip} placement=\"top\" delayShow={300} delayHide={150}>\n  // </OverlayTrigger>\n  <FaVolumeUp size={24} onClick={() => disableAudio()} />\n);\n\nconst EnableAudioIcon = ({ onSetIsAudioEnabled }) => (\n  // <OverlayTrigger overlay={enableAudioTooltip} placement=\"top\" delayShow={300} delayHide={150}>\n  // </OverlayTrigger>\n  <FaVolumeMute size={24} onClick={() => enableAudio()} />\n);\n\nconst ToggleAudioIcon = ({\n  isAudioEnabled,\n  enableAudio,\n  disableAudio,\n}) => {\n  return (\n    <div className=\"toggle-audio\">\n      {isAudioEnabled && <FaVolumeUp size={24} onClick={() => disableAudio()} />}\n      {!isAudioEnabled && <FaVolumeMute size={24} onClick={() => enableAudio()} />}\n    </div>\n  );\n};\n\nToggleAudioIcon.propTypes = {};\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    isAudioEnabled: reduxState.settings.isAudioEnabled,\n  };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n  return {\n    enableAudio: () => dispatch(enableAudio()),\n    disableAudio: () => dispatch(disableAudio()),\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ToggleAudioIcon);\n"
  },
  {
    "path": "src/components/general/AlertContainer.js",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport { Alert } from 'react-bootstrap';\n\nimport { dismissAlert } from '../../store/actions/alertActions';\n\n// https://v4-alpha.getbootstrap.com/components/alerts/#examples\nconst alertStyles = ['success', 'danger', 'warning', 'info'];\n\nconst AlertContainer = ({\n  alertMessage,\n  alertStyle,\n  dismissAlert,\n  alertRenderSeconds,\n}) => {\n  if (!alertStyles.includes(alertStyle)){\n    alertStyle = 'success';\n  }\n\n  if (alertRenderSeconds && alertRenderSeconds > 0) {\n    // auto-dismiss option\n    setTimeout(() => {\n      dismissAlert();\n    }, alertRenderSeconds * 1000);\n  }\n\n  return (\n    <div className=\"alert-container\" style={{marginRight: '10px'}}>\n      {alertMessage && <Alert\n        variant={alertStyle}\n        onClose={dismissAlert}\n        dismissible>\n        {alertMessage}\n      </Alert>}\n    </div>\n  );\n};\n\nAlertContainer.propTypes = {};\n\nconst mapStateToProps = (reduxState) => {\n  return {\n    ...reduxState.alert,\n  };\n};\n\nconst mapDispatchToProps = (dispatch) => {\n  return {\n    dismissAlert: () => dispatch(dismissAlert()),\n  };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AlertContainer);\n"
  },
  {
    "path": "src/components/general/Throbber.js",
    "content": "import React, { Component } from 'react';\nimport ReactDOM from 'react-dom';\n\nconst throbberDotStyles = {\n  'margin': '10px',\n  'height': '20px',\n  'width': '20px',\n  'borderRadius': '10px',\n  'backgroundColor': '#999',\n  'float': 'left',\n  'transform': 'scale(0.7)'\n};\n\n\nclass Throbber extends Component {\n  componentDidMount(){\n\n    this.animateLoadingDots();\n\n  }\n\n  // this is messy, just a test animating react elements\n  // by their ref directly.\n  animateLoadingDots(){\n    let keyframes = [\n      { 'transform': 'scale(0.7)' },\n      { 'transform': 'scale(1.0)' },\n      { 'transform': 'scale(0.7)' },\n    ];\n\n    let properties = {\n      duration: 1000,\n      iterations: Infinity\n    };\n\n    let firstDot = ReactDOM.findDOMNode(this.refs.firstDot);\n    firstDot.animate(keyframes, properties);\n\n    properties['delay'] = 200;\n\n    let secondDot = ReactDOM.findDOMNode(this.refs.secondDot);\n    secondDot.animate(keyframes, properties);\n\n    properties['delay'] = 400;\n\n    let thirdDot = ReactDOM.findDOMNode(this.refs.thirdDot);\n    thirdDot.animate(keyframes, properties);\n  }\n\n  render(){\n    return (\n      <div className=\"row\">\n        <div className=\"col-md-12 throbber\" title=\"Your content is loading...\">\n          <div style={throbberDotStyles} ref=\"firstDot\"></div>\n          <div style={throbberDotStyles} ref=\"secondDot\"></div>\n          <div style={throbberDotStyles} ref=\"thirdDot\"></div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Throbber;\n"
  },
  {
    "path": "src/components/layout/ChatRoom.js",
    "content": "import React, { Component } from 'react';\n\nclass ChatRoom extends Component {\n  render(){\n    let username = this.props.username;\n    let rooms = this.props.rooms;\n\n    return (\n      <div key={this.props.room.key} className=\"chatroom\">\n        {(this.props.room.messages || []).map(message => {\n          let fromMe = (message.from === username);\n          return (\n            <div key={message.key} className={fromMe ? 'chat-outgoing' : 'chat-incoming'}>\n              {message.from}: {message.msg}\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n}\n\nexport default ChatRoom;\n"
  },
  {
    "path": "src/components/layout/Header.js",
    "content": "import React, { Component, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport UserIcon from '../chat/UserIcon';\nimport UserList from '../chat/UserList';\nimport Logo from './Logo';\nimport Settings from './Settings';\nimport Info from './Info';\nimport { closePicker } from '../../store/actions/chatActions';\n\nconst Header = ({\n  username,\n  onToggleModalVisibility\n}) => {\n  const [showUserList, setShowUserList] = useState(false);\n\n  const onToggleUserList = () => {\n    setShowUserList((current) => !current);\n  };\n\n  return (\n    <header onClick={closePicker}>\n      <div className=\"logo-container\">\n        <div id=\"logo-info\">\n          <Logo />\n          <Info />\n        </div>\n        <Settings />\n      </div>\n      <UserIcon onToggleUserList={onToggleUserList} />\n      <UserList\n        username={username}\n        displayUserList={showUserList}\n        onToggleModalVisibility={onToggleModalVisibility} />\n    </header>\n  );\n};\n\nHeader.propTypes = {\n  username: PropTypes.string.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired\n};\n\nexport default connect(null, { closePicker })(Header);\n"
  },
  {
    "path": "src/components/layout/Info.js",
    "content": "import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\n\nimport { FaInfoCircle } from 'react-icons/fa';\n\nimport InfoModal from '../modals/InfoModal';\n\nconst infoTooltip = (\n  <Tooltip id=\"open-info-tooltip\">Open LeapChat Info</Tooltip>\n);\n\nconst Info = () => {\n  const [showInfoModal, setShowInfoModal] = useState(false);\n\n  return (\n    <div className=\"info\">\n      <FaInfoCircle onClick={() => setShowInfoModal(true)} size={19}/>\n      {showInfoModal && <InfoModal\n        isVisible={showInfoModal}\n        onClose={() => setShowInfoModal(false)} />}\n    </div>\n  );\n};\n\nInfo.propTypes = {};\n\nexport default Info;\n"
  },
  {
    "path": "src/components/layout/Logo.js",
    "content": "import React from 'react';\n\nconst Logo = () => {\n  return (\n    <div className=\"logo\">\n      LeapChat\n    </div>\n  );\n};\n\nexport default Logo;"
  },
  {
    "path": "src/components/layout/Settings.js",
    "content": "import React, { useState } from 'react';\nimport { PropTypes } from 'prop-types';\n\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap';\n\nimport { FaCog } from 'react-icons/fa';\n\nimport SettingsModal from '../modals/SettingsModal';\n\nconst settingsTooltip = (\n  <Tooltip id=\"open-settings-tooltip\">Open Settings</Tooltip>\n);\n\nconst Settings = () => {\n  const [showSettingsModal, setShowSettingsModal] = useState(false);\n\n  return (\n    <div className=\"settings\" >\n      {/* <OverlayTrigger placement=\"bottom\" overlay={settingsTooltip} delayShow={300} delayHide={150}> */}\n      {/* </OverlayTrigger> */}\n      <FaCog size={27} onClick={() => setShowSettingsModal(true)} />\n      {showSettingsModal && <SettingsModal \n        isVisible={showSettingsModal}\n        onClose={() => setShowSettingsModal(false)} />}\n    </div>\n  );\n};\n\nSettings.propTypes = {};\n\nexport default Settings;\n"
  },
  {
    "path": "src/components/modals/InfoModal.js",
    "content": "import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal } from 'react-bootstrap';\n\nconst InfoModal = ({ isVisible, onClose }) => {\n\n  return (\n    <Modal size=\"lg\" show={isVisible} onHide={onClose}>\n      <Modal.Header closeButton>\n        <Modal.Title>\n          <h3>Welcome to LeapChat!</h3>\n        </Modal.Title>\n      </Modal.Header>\n      <Modal.Body>\n        <h4>LeapChat: encrypted, ephemeral, in-browser chat.</h4>\n        <p>Just visit <a href=\"https://www.leapchat.org/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">leapchat.org</a> and a new, secure chat room will instantly be created for you. And once you're in, just link people to that page to invite them to join you!</p>\n        <h3>\n          Why LeapChat?\n        </h3>\n        <p>\n          You shouldn't have to sacrifice your privacy and personal information just to chat online. Slack, HipChat, and others make you create an account with your email address, their software doesn't encrypt your messages (they can see everything), and the messages last forever unless you manually delete them.\n          In contrast, LeapChat <em>does</em> encrypt your messages (even we can't see them!), <em>doesn't</em> require you to hand over your email address, and messages last for a maximum of 90 days (this will soon be configurable to a shorter duration).\n          Plus, you can host LeapChat on your own server, since it's <a href=\"https://github.com/cryptag/leapchat\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">open source</a>!\n        </p>\n        <h3>\n          How does it work?\n        </h3>\n        <div>\n          When you click on a link to a LeapChat room:\n          <ol>\n            <li>\n              Your browser loads the HTML, CSS, and JavaScript from the server (e.g., leapchat.org)\n            </li>\n            <li>\n              That JavaScript code then grabs the long passphrase at the end of the URL (the \"URL hash\" -- everything after the `#`), then passes it to <a href=\"https://web.archive.org/web/20180508023310/https://minilock.io/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">miniLock</a>, which then deterministically generates a keypair from that passphrase\n            </li>\n            <li>\n              That cryptographic keypair is then used by your browser (and every other chat participant) to encrypt and decrypt messages to and from the people you're chatting with\n            </li>\n          </ol>\n          The server can't even see your username!  That's encrypted, too, and is attached to the messages you send.\n        </div>\n        <h3>\n          Can I type markdown in my messages?\n        </h3>\n        <p>\n          <em>Yup!</em> To learn about Markdown syntax, like surrounding words with **double asterisks** to make them <b>bold</b>, or with _underscores_ to make them <i>italicized</i>, <a href=\"https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">check out this guide</a>.\n        </p>\n      </Modal.Body>\n    </Modal>\n  );\n};\n\nInfoModal.propTypes = {\n  onClose: PropTypes.func.isRequired\n};\n\nexport default InfoModal;"
  },
  {
    "path": "src/components/modals/PincodeModal.js",
    "content": "import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Modal, Button } from 'react-bootstrap';\n\nimport { genPassphrase } from '../../data/minishare';\n\nclass PincodeModal extends PureComponent {\n \n  componentDidMount() {\n    this.pincodeInput.focus();\n  }\n  \n  componentDidUpdate(){\n    if(this.props.showModal){\n      this.pincodeInput.focus();\n    }\n  }\n\n  onPincodeKeyPress = (e) => {\n    if (e.which === 13) {\n      this.onSetPincodeClick();\n    }\n  };\n\n  isPincodeValid(pincode) {\n    if (!pincode || pincode.endsWith(\"--\")) {\n      return false;\n    }\n    return true;\n  }\n\n  onSetPincodeClick = (e) => {\n    const pincode = this.pincodeInput.value;\n\n    if (!this.isPincodeValid(pincode)) {\n      alert('Invalid pincode!');\n    } else {\n      this.props.onSetPincode(pincode);\n    }\n  };\n\n  setRandomPincodeInForm = () => {\n    this.pincodeInput.value = genPassphrase(2);\n  };\n\n  onClose = () => {\n    this.props.onToggleModalVisibility('pincode', false);\n  };\n\n  render() {\n    let { showModal, pincode } = this.props;\n\n    return (\n      <div>\n        <Modal size=\"lg\" show={showModal} onHide={this.onClose}>\n          <Modal.Header>\n            <Modal.Title>Set Pincode</Modal.Title>\n          </Modal.Header>\n          <Modal.Body>\n            <div className=\"form-group\">\n              <input \n                type=\"text\" \n                className=\"form-control\" \n                ref={(input) => { this.pincodeInput = input; }}\n                defaultValue={pincode} \n                placeholder=\"Enter pincode or password\" \n                onKeyPress={this.onPincodeKeyPress} \n                autoFocus={true} />\n              <br />\n              <Button size=\"sm\" variant=\"primary\" onClick={this.setRandomPincodeInForm}>Generate Random Pincode</Button>\n            </div>\n          </Modal.Body>\n          <Modal.Footer>\n            {pincode && <Button onClick={this.onClose}>Cancel</Button>}\n            <Button onClick={this.onSetPincodeClick} variant=\"primary\">Set Pincode</Button>\n          </Modal.Footer>\n        </Modal>\n      </div>\n    );\n  }\n}\n\n\nPincodeModal.propType = {\n  showModal: PropTypes.bool.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired,\n  onSetPincode: PropTypes.func.isRequired\n};\n\nexport default PincodeModal;\n"
  },
  {
    "path": "src/components/modals/SearchModal.js",
    "content": "import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Modal, Popover, OverlayTrigger } from 'react-bootstrap';\nimport { FaInfoCircle } from 'react-icons/fa';\n\nimport MiniSearch from 'minisearch';\n\nimport Message from '../chat/Message';\n\nconst searchInfoPopover = (\n  <Popover id=\"search-info-popover\" title=\"Search Message History\">\n    Your messages are encrypted in transit and in storage on our servers. So \n    how can you search them?\n    <br /><br />\n    Simple! The search happens entirely in the browser. So you can rest easy.\n  </Popover>\n);\n\n\nclass SearchModal extends Component {\n  constructor(props) {\n    super(props);\n\n    const miniSearch = this.indexAllMessages(props.messages);\n\n    this.state = {\n      username: this.props.username,\n      isVisible: this.props.isVisible,\n      miniSearch: miniSearch,\n      isLoadingResults: false,\n      searchResults: []\n    };\n  }\n\n  indexAllMessages(messages) {\n    const miniSearch = new MiniSearch({\n      fields: ['msg', 'from'], // fields to index for full-text search\n      storeFields: ['msg', 'from'] // fields to return with search results\n    });\n\n    messages = this.props.messages.map((message, i) => {\n      return {\"id\": i, ...message};\n    });\n    miniSearch.addAll(messages);\n\n    return miniSearch;\n  };\n  \n  getSearchResults = (e) => {\n    this.setState({\n      isLoadingResults: true\n    });\n    let searchResults = this.state.miniSearch.search(e.target.value);\n    this.setState({\n      searchResults: searchResults,\n      isLoadingResults: false\n    });\n  };\n\n  render() {\n    const {\n      isVisible,\n      searchResults,\n      isLoadingResults,\n      username } = this.state;\n\n    searchResults.sort((a, b) => a.score > b.score);\n\n    return (\n      <div>\n        <Modal size=\"lg\" show={isVisible} onHide={this.props.onClose}>\n          <Modal.Header closeButton>\n            Search{' '}\n            <FaInfoCircle size=\"15\" />\n            {/* <OverlayTrigger trigger=\"click\" placement=\"bottom\" overlay={searchInfoPopover}> */}\n            {/* </OverlayTrigger> */}\n          </Modal.Header>\n          <Modal.Body>\n            <div className=\"form-group\">\n              <form>\n                <label htmlFor=\"message-search\">Search messages</label>\n                <input \n                  id=\"message-search\"\n                  type=\"search\"\n                  className=\"form-control\"\n                  placeholder=\"Enter search text\" \n                  onChange={this.getSearchResults} \n                  autoFocus={true} />\n              </form>\n            </div>\n            <hr />\n            {isLoadingResults && <div>\n              <Throbber />\n              <h4>Loading results...</h4>\n            </div>}\n            {searchResults.length > 0 && <div className=\"search-results\">\n              <ul>\n                {searchResults.map((result, i) => {\n                  return <Message key={i} username={username} message={result} />;\n                })}\n              </ul>\n            </div>}\n            \n  \n          </Modal.Body>\n        </Modal>\n      </div>\n    );\n  }\n}\n\nSearchModal.propTypes = {\n  username: PropTypes.string.isRequired,\n  isVisible: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  messages: PropTypes.array.isRequired,\n};\n\nexport default SearchModal;"
  },
  {
    "path": "src/components/modals/SettingsModal.js",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Modal, Button, OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { FaExternalLinkAlt } from 'react-icons/fa';\n\nimport { chatHandler } from '../../store/epics/chatEpics';\n\nconst onDeleteAllMsgs = (e) => {\n  if (window.confirm(\"Are you sure you want to delete every existing chat message from this chat room? This action cannot be undone.\")) {\n    chatHandler.sendDeleteAllMessagesSignalToServer();\n  }\n};\n\nconst SettingsModal = ({\n  isVisible,\n  onClose\n}) => {\n\n  return (\n    <div>\n      <Modal size=\"lg\" show={isVisible} onHide={onClose}>\n        <Modal.Header closeButton>\n          <Modal.Title>Settings</Modal.Title>\n        </Modal.Header>\n        <Modal.Body>\n          <h3>Feedback</h3>\n          <p>\n            Do you have feedback or suggestions on how we can improve LeapChat? We're listening!{' '}\n            <a href=\"https://github.com/cryptag/leapchat/issues\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">\n              Share your feedback here.{' '}<FaExternalLinkAlt size={15} />\n            </a>\n          </p>\n          <hr />\n          <h3 style={{ color: 'red' }}>Danger Zone</h3>\n          <p>\n            By clicking here, you will delete all messages in this chat from the server, for all users, forever.\n          </p>\n          <Button onClick={onDeleteAllMsgs} variant=\"danger\">\n            Delete All Messages Forever\n          </Button>\n\n        </Modal.Body>\n        <Modal.Footer>\n          \n        </Modal.Footer>\n      </Modal>\n    </div>\n  );\n};\n\nSettingsModal.propTypes = {\n  isVisible: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n\n};\n\nexport default SettingsModal;"
  },
  {
    "path": "src/components/modals/SharingModal.js",
    "content": "import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Modal, Button, OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { FaShareAlt } from 'react-icons/fa';\nimport { FaShareAltSquare } from 'react-icons/fa';\n\nconst onCopyShareLink = (e) => {\n  navigator.clipboard.writeText(window.location.href);\n};\n\nconst onShareLink = (e) => {\n  navigator.share({\n    url: window.location.href,\n    title: \"LeapChat\",\n    text: \"Join me on LeapChat\"\n  });\n};\n\nconst copyLinkTooltip = (\n  <Tooltip id=\"confirm-copy\">\n    <strong>Link copied!</strong>\n  </Tooltip>\n);\n\nconst SharingModal = ({\n  isVisible,\n  onClose\n}) => {\n  return (\n    <div>\n      <Modal size=\"lg\" show={isVisible} onHide={onClose}>\n        <Modal.Header closeButton>\n          <Modal.Title>Invite to Chat</Modal.Title>\n        </Modal.Header>\n        <Modal.Body>\n          { navigator.share && <div>\n            <h3>Share Link</h3>\n            <p>\n              Invite with a link shared via SMS, Email, etc.\n            </p>\n            <Button className=\"icon-button\" onClick={onShareLink} variant=\"primary\">\n              Share Link <FaShareAltSquare />\n            </Button>\n            <hr />\n          </div>\n          }\n\n          <h3>Copy Link</h3>\n          <p>Invite with a link copied to your clipboard.</p>\n          <div className=\"input-group share-copy-link\">\n            <input className=\"form-control current-href\" type=\"text\" readOnly value={window.location.href} />\n            <OverlayTrigger\n              trigger=\"click\"\n              overlay={copyLinkTooltip}\n              placement=\"top\"\n              delay={{ show: 300, hide: 150 }}>\n              <Button className=\"icon-button\" variant=\"primary\" onClick={onCopyShareLink}>\n                Copy to Clipboard\n                <FaShareAlt size={15} />\n              </Button>\n            </OverlayTrigger>\n          </div>\n        </Modal.Body>\n      </Modal>\n    </div>\n  );\n};\n\nSharingModal.propTypes = {\n  isVisible: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n\n};\n\nexport default SharingModal;"
  },
  {
    "path": "src/components/modals/Username.js",
    "content": "import React, { useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\n\nimport { Modal, Button, Alert, ProgressBar } from 'react-bootstrap';\n\nimport { generateRandomUsername } from '../../data/username';\n\nimport { enableAudio } from '../../store/actions/settingsActions';\n\nexport const MAX_USERNAME_LENGTH = 45;\n\nconst UsernameModal = ({\n  isVisible,\n  isNewRoom,\n  previousUsername,\n  username,\n  onToggleModalVisibility,\n  setUsername,\n  enableAudio,\n  connecting,\n  connected,\n}) => {\n  const usernameInput = useRef(null);\n\n  const [failMessage, setFailMessage ] = useState(\"\");\n\n  const onClose = () => {\n    onToggleModalVisibility('username', false);\n  };\n\n  const setRandomUsernameInForm = () => {\n    usernameInput.current.value = generateRandomUsername();\n    usernameInput.current.focus();\n  };\n\n  const isUsernameValid = () => {\n    const usernameFromForm = usernameInput.current.value;\n    if (!usernameFromForm || usernameFromForm.length === 0) {\n      setFailMessage(\"Must not be empty\");\n      return false;\n    } else if (usernameFromForm.length > MAX_USERNAME_LENGTH) {\n      setFailMessage(`Length must not exceed ${MAX_USERNAME_LENGTH}`);\n      return false;\n    }\n    setFailMessage(\"\");\n    return true;\n  };\n\n  const onUsernameKeyUp = (e) => {\n    if (e.which === 13) {\n      onSetUsername();\n    }\n  };\n\n  const setDefaultAudio = () => {\n    // set the audio to the user's previously selected preference; enable by default\n    let isAudioEnabled = JSON.parse(localStorage.getItem('isAudioEnabled') || 'true');\n    if (isAudioEnabled){\n      enableAudio();\n    }\n  };\n\n  const onSetUsername = () => {\n    if (isUsernameValid()) {\n      setUsername(usernameInput.current.value);\n      setDefaultAudio();\n      onClose();\n    }\n  };\n\n  let progress = 0;\n  let statusMessage = (\n    <p>Cranking a bunch of gears.</p>\n  );\n\n  if (connecting) {\n    progress = 50;\n    statusMessage = <p>Creating a secure connection with LeapChat servers.</p>;\n  } else if (connected) {\n    progress = 95;\n    statusMessage = <p>Connected!</p>;\n  }\n\n  return (\n    <div>\n      <Modal size=\"lg\" show={isVisible} onHide={onClose}>\n        <Modal.Header>\n          <Modal.Title>Set Username</Modal.Title>\n        </Modal.Header>\n        <Modal.Body>\n          <div data-testid=\"set-username-form\" className=\"form-group\">\n            {/* username is empty on initial page load, not on subsequent 'edit username' opens */}\n            {!username && isNewRoom && <Alert\n              variant=\"success\">\n              New room created!\n            </Alert>}\n            {!username && !isNewRoom && <Alert\n              variant=\"success\">\n              Successfully joined room!\n            </Alert>}\n            <label className=\"form-label\" htmlFor=\"username\">Username</label>\n            <input \n              style={{marginBottom: \"10px\"}}\n              id=\"username\"\n              type=\"text\"\n              className=\"form-control\"\n              ref={usernameInput}\n              defaultValue={ username || previousUsername }\n              placeholder=\"Enter username (e.g., trinity)\" \n              onKeyUp={onUsernameKeyUp}\n              autoFocus={true}\n              autoComplete=\"off\" />\n            \n            {failMessage && <div className=\"alert alert-danger\" role=\"alert\" >\n              <br />\n              <strong>Invalid Username: </strong>\n              {failMessage}\n            </div>}\n            <Button size=\"sm\" variant=\"primary\" onClick={setRandomUsernameInForm}>Generate Random Username</Button>\n          </div>\n          {!connected && <div className=\"progress-indicator\" style={{marginTop: '20px'}}>\n            {statusMessage}\n            <ProgressBar animated now={progress} label={`${progress}%`} />\n          </div>}\n        </Modal.Body>\n        <Modal.Footer>\n          {username && <Button variant=\"light\" onClick={onClose}>Cancel</Button>}\n          <Button data-testid=\"set-username\" onClick={onSetUsername} variant=\"primary\" disabled={!connected}>Set Username</Button>\n        </Modal.Footer>\n      </Modal>\n    </div>\n  );\n};\n\nUsernameModal.propTypes = {\n  isVisible: PropTypes.bool.isRequired,\n  isNewRoom: PropTypes.bool.isRequired,\n  previousUsername: PropTypes.string.isRequired,\n  username: PropTypes.string.isRequired,\n  onToggleModalVisibility: PropTypes.func.isRequired,\n  setUsername: PropTypes.func.isRequired,\n  connecting: PropTypes.bool.isRequired,\n  connected: PropTypes.bool.isRequired,\n};\n\nconst mapDispatchToProps = (dispatch) => {\n  return {\n    enableAudio: () => dispatch(enableAudio()),\n  };\n};\n\nexport default connect(null, mapDispatchToProps)(UsernameModal);\n"
  },
  {
    "path": "src/constants/emoji.js",
    "content": "exports.EMOJI_APPLE_64_PATH = 'static/img/emoji/apple/64/';\nexports.EMOJI_APPLE_64_SHEET = 'static/img/emoji/apple/sheets/64.png';\n"
  },
  {
    "path": "src/constants/messaging.js",
    "content": "export const SERVER_ERROR_PREFIX = \"Error from server: \";\nexport const AUTH_ERROR = \"Error authorizing you\"; // Must match Go's miniware.AuthError\nexport const ON_CLOSE_RECONNECT_MESSAGE = \"Message WebSocket closed. Reconnecting...\";\nexport const ONE_MINUTE = 60 * 1000;\n\nexport const USER_STATUS_DELAY_MS = 10 * ONE_MINUTE;\n\nexport const PARANOID_USERNAME = ' ';\nexport const USERNAME_KEY = 'username';\n"
  },
  {
    "path": "src/data/constants.js",
    "content": "export const adjectives = [\"Abdominal\", \"Able\", \"Abnormal\", \"Abrasive\", \"Active\", \"Affected\", \"Agnostic\", \"Agreeable\", \"Alienable\", \"Alive\", \"Ambiguous\", \"Ambitious\", \"Amendable\", \"Amiable\", \"Amiss\", \"Amniotic\", \"Amusable\", \"Angelfish\", \"Angelic\", \"Angular\", \"Antarctic\", \"Antitrust\", \"Antiviral\", \"Arbitrary\", \"Arguable\", \"Armful\", \"Arrive\", \"Arrogant\", \"Astonish\", \"Atonable\", \"Atrocious\", \"Attentive\", \"Attic\", \"Atypical\", \"Audacious\", \"Audible\", \"Authentic\", \"Autistic\", \"Automatic\", \"Available\", \"Average\", \"Aware\", \"Babble\", \"Bagful\", \"Banish\", \"Bankable\", \"Bauble\", \"Blissful\", \"Bluish\", \"Boastful\", \"Bobble\", \"Bodacious\", \"Botanical\", \"Bountiful\", \"Bronchial\", \"Bubble\", \"Bullish\", \"Cable\", \"Canal\", \"Canary\", \"Capable\", \"Capillary\", \"Captive\", \"Cardinal\", \"Catatonic\", \"Catchable\", \"Catfish\", \"Cathedral\", \"Caucasian\", \"Cautious\", \"Celestial\", \"Celtic\", \"Chewable\", \"Childish\", \"Chive\", \"Circular\", \"Citable\", \"Clean\", \"Clear\", \"Clerical\", \"Climatic\", \"Closable\", \"Coastal\", \"Cognitive\", \"Cohesive\", \"Comic\", \"Composite\", \"Concerned\", \"Conducive\", \"Confident\", \"Congenial\", \"Conical\", \"Constable\", \"Constant\", \"Copious\", \"Coral\", \"Coronary\", \"Corporal\", \"Corporate\", \"Corral\", \"Corrosive\", \"Couch\", \"Countable\", \"Cranial\", \"Crawfish\", \"Crayfish\", \"Creatable\", \"Creative\", \"Credible\", \"Crouch\", \"Crucial\", \"Crushable\", \"Cryptic\", \"Cubical\", \"Culinary\", \"Culpable\", \"Cultural\", \"Cupid\", \"Curable\", \"Cursive\", \"Custodian\", \"Customary\", \"Cyclic\", \"Daily\", \"Debatable\", \"Decal\", \"Deceptive\", \"Decidable\", \"Defective\", \"Deferral\", \"Delicious\", \"Delirious\", \"Deniable\", \"Denial\", \"Deprive\", \"Devious\", \"Dexterous\", \"Diabetic\", \"Diary\", \"Diffusive\", \"Diocese\", \"Disabled\", \"Dividable\", \"Divisible\", \"Divisive\", \"Doable\", \"Domestic\", \"Drainable\", \"Dramatic\", \"Drastic\", \"Dreadful\", \"Dreary\", \"Dribble\", \"Drinkable\", \"Drippy\", \"Drivable\", \"Drop-down\", \"Durable\", \"Dutiful\", \"Earful\", \"Earthy\", \"Easeful\", \"Eatable\", \"Eccentric\", \"Economic\", \"Effective\", \"Egotistic\", \"Elastic\", \"Elderly\", \"Electable\", \"Elective\", \"Eligible\", \"Elliptic\", \"Elusive\", \"Embellish\", \"Empathic\", \"Emphatic\", \"Empirical\", \"Enable\", \"Endurable\", \"Energetic\", \"Enigmatic\", \"Enjoyable\", \"Enviable\", \"Envious\", \"Epidemic\", \"Epidermal\", \"Epidural\", \"Epileptic\", \"Equal\", \"Equivocal\", \"Erasable\", \"Ergonomic\", \"Erratic\", \"Escapable\", \"Essential\", \"Establish\", \"Eternal\", \"Evasive\", \"Everyday\", \"Excitable\", \"Exclusive\", \"Excusable\", \"Exemplary\", \"Expansive\", \"Expensive\", \"Expletive\", \"Exposable\", \"External\", \"Fable\", \"Fabulous\", \"Facial\", \"Factual\", \"False\", \"Fanatic\", \"Fantastic\", \"Favorable\", \"Federal\", \"Feeble\", \"Ferocious\", \"Festive\", \"Financial\", \"Flammable\", \"Flavorful\", \"Floral\", \"Flyable\", \"Fondue\", \"Frantic\", \"Fraternal\", \"Freezable\", \"French\", \"Fresh\", \"Fretful\", \"Frightful\", \"Frivolous\", \"Generic\", \"Generous\", \"Gigantic\", \"Glacial\", \"Glamorous\", \"Gleeful\", \"Glorious\", \"Glutinous\", \"Good\", \"Gorgeous\", \"Gothic\", \"Graceful\", \"Gracious\", \"Granular\", \"Green\", \"Grievous\", \"Grumble\", \"Guidable\", \"Gullible\", \"Habitable\", \"Habitual\", \"Happy\", \"Harmful\", \"Helpful\", \"Humble\", \"Humongous\", \"Humorous\", \"Hungry\", \"Hybrid\", \"Hypnotic\", \"Icky\", \"Identical\", \"Illusive\", \"Imaginary\", \"Immovable\", \"Impaired\", \"Imperial\", \"Impish\", \"Implosive\", \"Impulse\", \"Impulsive\", \"Irregular\", \"Irritable\", \"Itinerary\", \"Jovial\", \"Joyous\", \"Judicial\", \"Judiciary\", \"Jumble\", \"Jumbo\", \"Junior\", \"Kinetic\", \"Kissable\", \"Laborious\", \"Landlady\", \"Lantern\", \"Large\", \"Last\", \"Lavish\", \"Laxative\", \"Legal\", \"Legible\", \"Letdown\", \"Liable\", \"Librarian\", \"Library\", \"Likely\", \"Little\", \"Livable\", \"Lucrative\", \"Ludicrous\", \"Luminous\", \"Lumpish\", \"Lustrous\", \"Luxurious\", \"Magical\", \"Magician\", \"Magnetic\", \"Majestic\", \"Mammal\", \"Mammary\", \"Mannish\", \"Manual\", \"Many\", \"Marital\", \"Marsupial\", \"Marvelous\", \"Massive\", \"Maternal\", \"Molecular\", \"Monetary\", \"Monstrous\", \"Monthly\", \"Mortician\", \"Mortuary\", \"Mountable\", \"Mournful\", \"Movable\", \"Much\", \"Mumble\", \"Municipal\", \"Mural\", \"Muscular\", \"Music\", \"Mutable\", \"Mutual\", \"Nappy\", \"Natural\", \"Nautical\", \"Negative\", \"Nervous\", \"Neurotic\", \"Next\", \"Nibble\", \"Nimble\", \"Ninth\", \"Numeral\", \"Numeric\", \"Numerous\", \"Obituary\", \"Oblivious\", \"Obnoxious\", \"Obsessive\", \"Obtrusive\", \"Obvious\", \"Olive\", \"Ominous\", \"Operable\", \"Operative\", \"Other\", \"Ouch\", \"Ovary\", \"Overall\", \"Overdrive\", \"Overdue\", \"Palatable\", \"Palpable\", \"Parasitic\", \"Passable\", \"Passive\", \"Paternal\", \"Payable\", \"Pebble\", \"Pecan\", \"Pediatric\", \"Pelican\", \"Perceive\", \"Perennial\", \"Perpetual\", \"Plausible\", \"Playable\", \"Pliable\", \"Plural\", \"Polish\", \"Poppy\", \"Porous\", \"Portable\", \"Possible\", \"Postal\", \"Pouch\", \"Preamble\", \"Pregnant\", \"Preppy\", \"Previous\", \"Primary\", \"Private\", \"Proactive\", \"Probable\", \"Probiotic\", \"Provable\", \"Psychic\", \"Public\", \"Pulmonary\", \"Punctual\", \"Puppy\", \"Pursuable\", \"Quarterly\", \"Quiet\", \"Quizzical\", \"Quotable\", \"Radial\", \"Radish\", \"Ramble\", \"Rare\", \"Rascal\", \"Reactive\", \"Reburial\", \"Rebuttal\", \"Recital\", \"Reckless\", \"Reclusive\", \"Rectal\", \"Referable\", \"Refinish\", \"Refurbish\", \"Refurnish\", \"Refutable\", \"Regretful\", \"Regular\", \"Relatable\", \"Related\", \"Relative\", \"Reliable\", \"Relic\", \"Relish\", \"Relive\", \"Reluctant\", \"Remedial\", \"Remindful\", \"Removable\", \"Renewable\", \"Rentable\", \"Rental\", \"Reptilian\", \"Repulsive\", \"Reputable\", \"Resemble\", \"Residual\", \"Residue\", \"Resistant\", \"Retail\", \"Retinal\", \"Retouch\", \"Retrial\", \"Reusable\", \"Revisable\", \"Revivable\", \"Revocable\", \"Rigid\", \"Rival\", \"Robust\", \"Rockfish\", \"Rocky\", \"Rosy\", \"Roundish\", \"Routine\", \"Rubble\", \"Rumble\", \"Rural\", \"Sacred\", \"Salaried\", \"Salary\", \"Salutary\", \"Sanctuary\", \"Sandfish\", \"Sanitary\", \"Sappy\", \"Sarcastic\", \"Satiable\", \"Satirical\", \"Satisfied\", \"Savior\", \"Scary\", \"Scenic\", \"Schematic\", \"Scrabble\", \"Scribble\", \"Second\", \"Secret\", \"Sectional\", \"Secular\", \"Sedative\", \"Seismic\", \"Selective\", \"Semantic\", \"Semifinal\", \"Senior\", \"Sensitive\", \"Sensuous\", \"Septic\", \"Seventh\", \"Shakable\", \"Siamese\", \"Siberian\", \"Singular\", \"Sinuous\", \"Sizable\", \"Skeletal\", \"Skeptic\", \"Skillful\", \"Sleek\", \"Sliceable\", \"Sloppy\", \"Spearfish\", \"Spendable\", \"Spherical\", \"Spinal\", \"Spiral\", \"Spiritual\", \"Spotty\", \"Squabble\", \"Squeamish\", \"Stable\", \"Stainable\", \"Starfish\", \"Static\", \"Statistic\", \"Steep\", \"Steerable\", \"Stellar\", \"Stoppable\", \"Storable\", \"Strenuous\", \"Strive\", \"Stubble\", \"Stubborn\", \"Stumble\", \"Subarctic\", \"Subatomic\", \"Subject\", \"Subsonic\", \"Subtotal\", \"Such\", \"Sudden\", \"Suitable\", \"Sulphuric\", \"Superior\", \"Surgical\", \"Survive\", \"Swear\", \"Swimmable\", \"Symphonic\", \"Synthetic\", \"Tactical\", \"Thespian\", \"Thimble\", \"Tiny\", \"Treble\", \"Tremble\", \"Tribunal\", \"Tributary\", \"Trivial\", \"Tropical\", \"Trouble\", \"Trustable\", \"Twistable\", \"Umbilical\", \"Unable\", \"Unboxed\", \"Uncurious\", \"Uneasy\", \"Uneatable\", \"Unequal\", \"Unethical\", \"Unfixable\", \"Unfixed\", \"Unhappy\", \"Unhealthy\", \"Unhelpful\", \"Unisexual\", \"Unlawful\", \"Unlikable\", \"Unlivable\", \"Unlovable\", \"Unlucky\", \"Unmindful\", \"Unmixable\", \"Unmixed\", \"Unmoral\", \"Unmovable\", \"Unnamable\", \"Unnatural\", \"Unpopular\", \"Unrelated\", \"Unsafe\", \"Unselfish\", \"Unsocial\", \"Unstable\", \"Unsteady\", \"Unstylish\", \"Untaxed\", \"Unusable\", \"Unused\", \"Unusual\", \"Unviable\", \"Unvocal\", \"Unwary\", \"Usable\", \"Useable\", \"Usual\", \"Valid\", \"Variable\", \"Various\", \"Vascular\", \"Vehicular\", \"Vengeful\", \"Venomous\", \"Vertical\", \"Viable\", \"Viewable\", \"Vigorous\", \"Viral\", \"Virtual\", \"Virtuous\", \"Viscous\", \"Visible\", \"Vivacious\", \"Washable\", \"Whacky\", \"Whimsical\", \"Whole\", \"Wieldable\", \"Wish\", \"Wistful\", \"Wobble\", \"Worried\", \"Wrongful\", \"Yiddish\", \"Zealous\", \"Zippy\"];\n\nexport const nouns = [\"Abacus\", \"Ability\", \"Ablaze\", \"Abrasion\", \"Abreast\", \"Abridge\", \"Abroad\", \"Absence\", \"Absentee\", \"Absinthe\", \"Absolute\", \"Abstain\", \"Abstract\", \"Accent\", \"Acclaim\", \"Acclimate\", \"Accompany\", \"Account\", \"Accuracy\", \"Accurate\", \"Accustom\", \"Acetone\", \"Achiness\", \"Acid\", \"Acquaint\", \"Acquire\", \"Acre\", \"Acrobat\", \"Acronym\", \"Action\", \"Activate\", \"Activator\", \"Activism\", \"Activist\", \"Activity\", \"Actress\", \"Acuteness\", \"Aeration\", \"Aerosol\", \"Aerospace\", \"Afar\", \"Affair\", \"Affection\", \"Affidavit\", \"Affiliate\", \"Affirm\", \"Affix\", \"Affluent\", \"Afford\", \"Affront\", \"Aflame\", \"Afloat\", \"Aflutter\", \"Afoot\", \"Afterlife\", \"Aftermath\", \"Aftermost\", \"Afternoon\", \"Ageless\", \"Agency\", \"Agenda\", \"Agent\", \"Aggregate\", \"Aghast\", \"Agile\", \"Agility\", \"Agony\", \"Agreement\", \"Aground\", \"Ahead\", \"Ahoy\", \"Aide\", \"Aim\", \"Ajar\", \"Alabaster\", \"Alarm\", \"Album\", \"Alfalfa\", \"Algebra\", \"Algorithm\", \"Alibi\", \"Alienate\", \"Alkaline\", \"Almanac\", \"Almighty\", \"Aloe\", \"Aloha\", \"Aloof\", \"Alphabet\", \"Alright\", \"Altitude\", \"Alto\", \"Aluminum\", \"Amaze\", \"Ambiance\", \"Ambiguity\", \"Ambition\", \"Ambulance\", \"Ambush\", \"Amendment\", \"Amenity\", \"Amino\", \"Ammonium\", \"Amnesty\", \"Amount\", \"Amperage\", \"Ample\", \"Amplifier\", \"Amply\", \"Amuck\", \"Amulet\", \"Amusement\", \"Anaconda\", \"Anagram\", \"Anatomist\", \"Anatomy\", \"Anchor\", \"Anchovy\", \"Ancient\", \"Android\", \"Anemia\", \"Aneurism\", \"Anger\", \"Angler\", \"Angriness\", \"Animal\", \"Animate\", \"Animation\", \"Animator\", \"Anime\", \"Animosity\", \"Ankle\", \"Annex\", \"Annotate\", \"Announcer\", \"Annuity\", \"Anointer\", \"Antacid\", \"Anteater\", \"Antelope\", \"Antennae\", \"Anthem\", \"Anthill\", \"Anthology\", \"Antibody\", \"Antidote\", \"Antihero\", \"Antiquity\", \"Antirust\", \"Antitoxic\", \"Antivirus\", \"Antler\", \"Antonym\", \"Antsy\", \"Anvil\", \"Anybody\", \"Anyhow\", \"Anyone\", \"Anyplace\", \"Anything\", \"Aorta\", \"Apache\", \"Appease\", \"Appendage\", \"Appendix\", \"Appetite\", \"Appetizer\", \"Applaud\", \"Applause\", \"Appliance\", \"Applicant\", \"Appointee\", \"Appraisal\", \"Approach\", \"Approval\", \"Apricot\", \"Aptitude\", \"Aqua\", \"Aqueduct\", \"Arbitrate\", \"Area\", \"Arena\", \"Argue\", \"Arise\", \"Armadillo\", \"Armband\", \"Armchair\", \"Armhole\", \"Armless\", \"Armoire\", \"Armory\", \"Army\", \"Aroma\", \"Arousal\", \"Arrange\", \"Array\", \"Arrest\", \"Arrival\", \"Arrogance\", \"Arson\", \"Art\", \"Ascension\", \"Ascent\", \"Ascertain\", \"Ashen\", \"Ashy\", \"Askew\", \"Asparagus\", \"Aspect\", \"Aspirate\", \"Aspire\", \"Aspirin\", \"Astound\", \"Astrology\", \"Astronaut\", \"Astronomy\", \"Astute\", \"Atom\", \"Atop\", \"Atrium\", \"Atrophy\", \"Attach\", \"Attain\", \"Attempt\", \"Attendant\", \"Attendee\", \"Attention\", \"Attire\", \"Attitude\", \"Attractor\", \"Attribute\", \"Auction\", \"Audacity\", \"Audience\", \"Audio\", \"Audition\", \"Author\", \"Autism\", \"Autograph\", \"Automaker\", \"Autopilot\", \"Avalanche\", \"Avatar\", \"Avenge\", \"Avenue\", \"Aversion\", \"Avert\", \"Aviation\", \"Aviator\", \"Avid\", \"Avoid\", \"Await\", \"Award\", \"Awhile\", \"Awoke\", \"Awry\", \"Axis\", \"Baboon\", \"Backache\", \"Backdrop\", \"Backer\", \"Backfield\", \"Backfire\", \"Backhand\", \"Backlash\", \"Backless\", \"Backlight\", \"Backlog\", \"Backpack\", \"Backroom\", \"Backshift\", \"Backspace\", \"Backspin\", \"Backstab\", \"Backstage\", \"Backtalk\", \"Backtrack\", \"Backup\", \"Backwash\", \"Backwater\", \"Bacon\", \"Bacterium\", \"Badass\", \"Badge\", \"Badland\", \"Badness\", \"Baffle\", \"Baggage\", \"Bagginess\", \"Bagpipe\", \"Baguette\", \"Bakery\", \"Bakeshop\", \"Balance\", \"Balcony\", \"Balmy\", \"Bamboo\", \"Banister\", \"Banjo\", \"Bankbook\", \"Banker\", \"Banking\", \"Banknote\", \"Bankroll\", \"Banner\", \"Bannister\", \"Banshee\", \"Banter\", \"Barbecue\", \"Barcode\", \"Barge\", \"Bargraph\", \"Barista\", \"Baritone\", \"Barmaid\", \"Barn\", \"Barometer\", \"Barrack\", \"Barrel\", \"Barrette\", \"Barricade\", \"Barrier\", \"Barstool\", \"Bartender\", \"Barterer\", \"Bash\", \"Basil\", \"Basis\", \"Basket\", \"Batboy\", \"Batch\", \"Bath\", \"Battalion\", \"Battery\", \"Bazooka\", \"Bladder\", \"Blade\", \"Blah\", \"Blame\", \"Blandness\", \"Blank\", \"Blaspheme\", \"Blasphemy\", \"Blast\", \"Blatancy\", \"Blazer\", \"Bleach\", \"Bleep\", \"Bless\", \"Blimp\", \"Blinker\", \"Blip\", \"Blitz\", \"Blob\", \"Blog\", \"Blot\", \"Bluff\", \"Blunderer\", \"Blunt\", \"Blurb\", \"Blurt\", \"Blush\", \"Blustery\", \"Boaster\", \"Boat\", \"Bobcat\", \"Bobtail\", \"Body\", \"Boggle\", \"Boil\", \"Bok\", \"Bolster\", \"Bolt\", \"Bonanza\", \"Bondless\", \"Bonehead\", \"Boneless\", \"Boney\", \"Bonfire\", \"Bonnet\", \"Bonsai\", \"Bonus\", \"Bony\", \"Book\", \"Bootlace\", \"Bootleg\", \"Boozy\", \"Borax\", \"Borrower\", \"Botanist\", \"Botany\", \"Botch\", \"Bottle\", \"Bottom\", \"Bounce\", \"Bouncy\", \"Boundless\", \"Bovine\", \"Boxcar\", \"Boxer\", \"Breach\", \"Breath\", \"Breeder\", \"Breeze\", \"Breezy\", \"Brewery\", \"Brewing\", \"Briar\", \"Bribe\", \"Brick\", \"Brigade\", \"Brilliant\", \"Brink\", \"Brisket\", \"Briskness\", \"Broadband\", \"Broadcast\", \"Broadness\", \"Broiler\", \"Broker\", \"Bronco\", \"Bronze\", \"Brook\", \"Broom\", \"Browbeat\", \"Browse\", \"Brunch\", \"Brunette\", \"Brunt\", \"Brush\", \"Brute\", \"Buccaneer\", \"Bucket\", \"Buckle\", \"Buckwheat\", \"Buddhism\", \"Buddhist\", \"Buffalo\", \"Buffer\", \"Buffoon\", \"Bulb\", \"Bulge\", \"Bulginess\", \"Bulgur\", \"Bulk\", \"Bulldog\", \"Bulldozer\", \"Bullfight\", \"Bullfrog\", \"Bullion\", \"Bullseye\", \"Bullwhip\", \"Bunch\", \"Bungee\", \"Bunion\", \"Bunkmate\", \"Bunny\", \"Bunt\", \"Busboy\", \"Busload\", \"Bust\", \"Busybody\", \"Buzz\", \"Cabbage\", \"Cabbie\", \"Cabdriver\", \"Cache\", \"Cackle\", \"Cacti\", \"Cactus\", \"Caddie\", \"Cadet\", \"Cadillac\", \"Cadmium\", \"Cage\", \"Calamari\", \"Calamity\", \"Calcium\", \"Calculate\", \"Calculus\", \"Calibrate\", \"Calm\", \"Caloric\", \"Calorie\", \"Calzone\", \"Camcorder\", \"Cameo\", \"Camera\", \"Camisole\", \"Camper\", \"Campfire\", \"Campsite\", \"Campus\", \"Cancel\", \"Candle\", \"Candy\", \"Cane\", \"Canine\", \"Canister\", \"Cannabis\", \"Cannon\", \"Canola\", \"Canon\", \"Canopener\", \"Canopy\", \"Canteen\", \"Canyon\", \"Capacity\", \"Cape\", \"Capital\", \"Capitol\", \"Capricorn\", \"Capsule\", \"Caption\", \"Captivate\", \"Captivity\", \"Capture\", \"Caramel\", \"Carat\", \"Caravan\", \"Carbon\", \"Cardboard\", \"Cardiac\", \"Cardigan\", \"Cardstock\", \"Caregiver\", \"Careless\", \"Caress\", \"Caretaker\", \"Cargo\", \"Carless\", \"Carload\", \"Carmaker\", \"Carnage\", \"Carnation\", \"Carnival\", \"Carnivore\", \"Carol\", \"Carpentry\", \"Carpool\", \"Carport\", \"Carrot\", \"Carrousel\", \"Carry\", \"Cartel\", \"Cartload\", \"Carton\", \"Cartoon\", \"Cartridge\", \"Cartwheel\", \"Carve\", \"Carwash\", \"Cascade\", \"Case\", \"Cash\", \"Casino\", \"Casket\", \"Cassette\", \"Casualty\", \"Catacomb\", \"Catalog\", \"Catalyst\", \"Catalyze\", \"Catapult\", \"Cataract\", \"Catcall\", \"Catcher\", \"Catchy\", \"Caterer\", \"Catfight\", \"Cathouse\", \"Catlike\", \"Catnap\", \"Catnip\", \"Catsup\", \"Cattail\", \"Catty\", \"Catwalk\", \"Caucus\", \"Causal\", \"Causation\", \"Cause\", \"Caution\", \"Cavalier\", \"Cavalry\", \"Caviar\", \"Cavity\", \"Cedar\", \"Celery\", \"Celibacy\", \"Celibate\", \"Cement\", \"Census\", \"Ceremony\", \"Certainty\", \"Cesarean\", \"Cesspool\", \"Chafe\", \"Chain\", \"Chair\", \"Chalice\", \"Challenge\", \"Chamomile\", \"Champion\", \"Chance\", \"Change\", \"Chant\", \"Chaos\", \"Chaperone\", \"Chaplain\", \"Chapter\", \"Character\", \"Charbroil\", \"Charcoal\", \"Charger\", \"Chariot\", \"Charity\", \"Charm\", \"Charter\", \"Chase\", \"Chaste\", \"Chastise\", \"Chastity\", \"Chatroom\", \"Chatter\", \"Chatty\", \"Cheddar\", \"Cheek\", \"Cheer\", \"Cheese\", \"Cheesy\", \"Chef\", \"Chemist\", \"Chemo\", \"Cherisher\", \"Cherub\", \"Chess\", \"Chevy\", \"Chewer\", \"Chewy\", \"Chief\", \"Childcare\", \"Childhood\", \"Childless\", \"Childlike\", \"Chili\", \"Chill\", \"Chimp\", \"Chip\", \"Chirpy\", \"Chivalry\", \"Chloride\", \"Chlorine\", \"Choice\", \"Chokehold\", \"Chomp\", \"Chooser\", \"Choosy\", \"Chop\", \"Chowder\", \"Chowtime\", \"Chrome\", \"Chubby\", \"Chuck\", \"Chug\", \"Chummy\", \"Chump\", \"Chunk\", \"Churn\", \"Chute\", \"Cider\", \"Cilantro\", \"Cinch\", \"Cinema\", \"Cinnamon\", \"Circle\", \"Circulate\", \"Circus\", \"Citadel\", \"Citation\", \"Citizen\", \"Citric\", \"Citrus\", \"Civic\", \"Civil\", \"Clad\", \"Claim\", \"Clammy\", \"Clamor\", \"Clamp\", \"Clamshell\", \"Clang\", \"Clapper\", \"Clarinet\", \"Clarity\", \"Clash\", \"Clasp\", \"Class\", \"Clatter\", \"Clause\", \"Clavicle\", \"Claw\", \"Clay\", \"Cleat\", \"Cleaver\", \"Cleft\", \"Clench\", \"Clergyman\", \"Clerk\", \"Clever\", \"Clicker\", \"Client\", \"Climate\", \"Clinic\", \"Clip\", \"Clique\", \"Cloak\", \"Clock\", \"Clone\", \"Closure\", \"Clothing\", \"Cloud\", \"Clover\", \"Clubhouse\", \"Clump\", \"Clumsy\", \"Clunky\", \"Clutch\", \"Clutter\", \"Coach\", \"Coagulant\", \"Coaster\", \"Coastland\", \"Coastline\", \"Coat\", \"Coauthor\", \"Cobalt\", \"Cobbler\", \"Cobweb\", \"Cocoa\", \"Coconut\", \"Cod\", \"Coeditor\", \"Coerce\", \"Coexist\", \"Coffee\", \"Cofounder\", \"Cognition\", \"Cogwheel\", \"Coherence\", \"Coherent\", \"Coil\", \"Coke\", \"Cola\", \"Cold\", \"Coleslaw\", \"Coliseum\", \"Collage\", \"Collapse\", \"Collar\", \"Collector\", \"Collide\", \"Collision\", \"Colonial\", \"Colonist\", \"Colony\", \"Colossal\", \"Colt\", \"Coma\", \"Comfort\", \"Comfy\", \"Comma\", \"Commence\", \"Commend\", \"Comment\", \"Commode\", \"Commodity\", \"Commodore\", \"Common\", \"Commotion\", \"Commute\", \"Compacter\", \"Compactor\", \"Companion\", \"Company\", \"Compare\", \"Compel\", \"Compile\", \"Comply\", \"Component\", \"Composer\", \"Compost\", \"Composure\", \"Compound\", \"Compress\", \"Comrade\", \"Conceal\", \"Concept\", \"Concert\", \"Conch\", \"Concierge\", \"Concise\", \"Conclude\", \"Concrete\", \"Concur\", \"Condense\", \"Condiment\", \"Condition\", \"Condone\", \"Conductor\", \"Conduit\", \"Cone\", \"Confess\", \"Confidant\", \"Confider\", \"Configure\", \"Confirm\", \"Conflict\", \"Conform\", \"Confound\", \"Confront\", \"Confusion\", \"Conjure\", \"Conjuror\", \"Connector\", \"Consensus\", \"Consent\", \"Console\", \"Consonant\", \"Constrain\", \"Constrict\", \"Construct\", \"Consult\", \"Consumer\", \"Contact\", \"Container\", \"Contempt\", \"Contest\", \"Context\", \"Contort\", \"Contour\", \"Contrite\", \"Control\", \"Contusion\", \"Convene\", \"Convent\", \"Copartner\", \"Cope\", \"Copier\", \"Copilot\", \"Copper\", \"Copy\", \"Cork\", \"Cornball\", \"Cornbread\", \"Corncob\", \"Cornea\", \"Corner\", \"Cornfield\", \"Cornhusk\", \"Cornmeal\", \"Cornstalk\", \"Corny\", \"Coroner\", \"Correct\", \"Corridor\", \"Corrode\", \"Corsage\", \"Corset\", \"Cortex\", \"Cosigner\", \"Cosmos\", \"Cosponsor\", \"Cost\", \"Cottage\", \"Cotton\", \"Cough\", \"Countdown\", \"Countless\", \"Country\", \"Courier\", \"Covenant\", \"Cover\", \"Coyness\", \"Coziness\", \"Cozy\", \"Crabgrass\", \"Crablike\", \"Crabmeat\", \"Cradle\", \"Crafter\", \"Craftsman\", \"Craftwork\", \"Crafty\", \"Cramp\", \"Cranberry\", \"Cranium\", \"Crank\", \"Crate\", \"Crayon\", \"Craziness\", \"Crazy\", \"Creamer\", \"Creamlike\", \"Crease\", \"Create\", \"Creation\", \"Creature\", \"Credit\", \"Creed\", \"Creme\", \"Creole\", \"Crepe\", \"Crept\", \"Crescent\", \"Crestless\", \"Crevice\", \"Crewless\", \"Crewman\", \"Crewmate\", \"Crib\", \"Cricket\", \"Crier\", \"Crimp\", \"Cringe\", \"Crinkle\", \"Crinkly\", \"Crisply\", \"Crispness\", \"Crispy\", \"Critter\", \"Croak\", \"Crock\", \"Crook\", \"Croon\", \"Crop\", \"Cross\", \"Crouton\", \"Crowbar\", \"Crowd\", \"Crown\", \"Crudeness\", \"Cruelness\", \"Cruelty\", \"Crumb\", \"Crummy\", \"Crumpet\", \"Cruncher\", \"Crunchy\", \"Crusader\", \"Crusher\", \"Crust\", \"Crux\", \"Crystal\", \"Cubbyhole\", \"Cube\", \"Cubicle\", \"Cuddle\", \"Cufflink\", \"Culminate\", \"Culprit\", \"Cultivate\", \"Culture\", \"Cupbearer\", \"Curator\", \"Curdle\", \"Cure\", \"Curfew\", \"Curler\", \"Curliness\", \"Curry\", \"Curse\", \"Cursor\", \"Curtain\", \"Curtsy\", \"Curvature\", \"Curve\", \"Curvy\", \"Cushy\", \"Cusp\", \"Custard\", \"Custody\", \"Customer\", \"Cut\", \"Cycle\", \"Cycling\", \"Cyclist\", \"Cylinder\", \"Cymbal\", \"Cytoplasm\", \"Cytoplast\", \"Dab\", \"Dad\", \"Daffodil\", \"Dagger\", \"Dainty\", \"Dairy\", \"Daisy\", \"Dance\", \"Dandelion\", \"Dander\", \"Dandruff\", \"Danger\", \"Dangle\", \"Daredevil\", \"Darkness\", \"Darkroom\", \"Darn\", \"Dart\", \"Darwinism\", \"Dash\", \"Datebook\", \"Daughter\", \"Dawdler\", \"Dawn\", \"Daybreak\", \"Daycare\", \"Daydream\", \"Daylight\", \"Daylong\", \"Dayroom\", \"Daytime\", \"Dazzler\", \"Deacon\", \"Deafness\", \"Dealer\", \"Dealmaker\", \"Dealt\", \"Dean\", \"Debate\", \"Debit\", \"Debrief\", \"Debtless\", \"Debtor\", \"Debug\", \"Debunk\", \"Decade\", \"Decaf\", \"Decathlon\", \"Decay\", \"Deceit\", \"Deceiver\", \"Decency\", \"Decent\", \"Deception\", \"Decibel\", \"Decimal\", \"Decimeter\", \"Decipher\", \"Deck\", \"Decline\", \"Decode\", \"Decorator\", \"Decoy\", \"Decrease\", \"Decree\", \"Dedicate\", \"Dedicator\", \"Deduce\", \"Deduct\", \"Deed\", \"Deem\", \"Deeply\", \"Deepness\", \"Deface\", \"Defame\", \"Default\", \"Defeat\", \"Defection\", \"Defendant\", \"Defender\", \"Defense\", \"Defensive\", \"Defiance\", \"Defiant\", \"Defile\", \"Define\", \"Definite\", \"Deflate\", \"Deflation\", \"Deflator\", \"Deflector\", \"Defog\", \"Defraud\", \"Defrost\", \"Defuse\", \"Defy\", \"Degrease\", \"Degree\", \"Dehydrate\", \"Deity\", \"Delay\", \"Delegate\", \"Delegator\", \"Deletion\", \"Delicacy\", \"Delicate\", \"Delirium\", \"Deliverer\", \"Delivery\", \"Delouse\", \"Deluge\", \"Delusion\", \"Deluxe\", \"Demeanor\", \"Demise\", \"Democracy\", \"Demote\", \"Demotion\", \"Denim\", \"Denote\", \"Dense\", \"Density\", \"Dental\", \"Dentist\", \"Denture\", \"Deny\", \"Deodorant\", \"Departure\", \"Depict\", \"Depletion\", \"Deploy\", \"Deport\", \"Depravity\", \"Deprecate\", \"Depress\", \"Depth\", \"Deputy\", \"Derail\", \"Desecrate\", \"Deserve\", \"Designate\", \"Designer\", \"Deskbound\", \"Desktop\", \"Deskwork\", \"Desolate\", \"Despair\", \"Despise\", \"Destiny\", \"Destitute\", \"Destruct\", \"Detail\", \"Detection\", \"Detective\", \"Detector\", \"Detention\", \"Detergent\", \"Detonate\", \"Detonator\", \"Detract\", \"Deuce\", \"Devalue\", \"Deviancy\", \"Deviant\", \"Deviate\", \"Deviation\", \"Deviator\", \"Device\", \"Devotee\", \"Devotion\", \"Devourer\", \"Dexterity\", \"Diabolic\", \"Diagnosis\", \"Diagram\", \"Dial\", \"Diameter\", \"Diaper\", \"Diaphragm\", \"Dice\", \"Dictate\", \"Dictation\", \"Dictator\", \"Difficult\", \"Diffuser\", \"Diffusion\", \"Dig\", \"Dilation\", \"Diligence\", \"Diligent\", \"Dill\", \"Dilute\", \"Dime\", \"Dimmer\", \"Dimness\", \"Dimple\", \"Diner\", \"Dingbat\", \"Dinghy\", \"Dinginess\", \"Dingo\", \"Dingy\", \"Dinner\", \"Dioxide\", \"Diploma\", \"Dipper\", \"Direction\", \"Directive\", \"Directory\", \"Direness\", \"Dirtiness\", \"Disallow\", \"Disarm\", \"Disarray\", \"Disaster\", \"Disband\", \"Disbelief\", \"Disburse\", \"Discard\", \"Discern\", \"Discharge\", \"Discolor\", \"Discount\", \"Discourse\", \"Discover\", \"Discuss\", \"Disdain\", \"Disengage\", \"Disfigure\", \"Disgrace\", \"Dish\", \"Disinfect\", \"Disjoin\", \"Disk\", \"Dislike\", \"Dislocate\", \"Dislodge\", \"Disloyal\", \"Dismantle\", \"Dismay\", \"Dismount\", \"Disobey\", \"Disorder\", \"Disown\", \"Disparate\", \"Disparity\", \"Dispatch\", \"Dispense\", \"Dispersal\", \"Disperser\", \"Displace\", \"Display\", \"Displease\", \"Disposal\", \"Dispute\", \"Disregard\", \"Dissuade\", \"Distance\", \"Distant\", \"Distaste\", \"Distill\", \"Distort\", \"Distract\", \"Distress\", \"Distrust\", \"Ditch\", \"Ditto\", \"Ditzy\", \"Dividend\", \"Divinity\", \"Division\", \"Divorcee\", \"Dizziness\", \"Dizzy\", \"Docile\", \"Dock\", \"Doctrine\", \"Document\", \"Dodge\", \"Dodgy\", \"Dole\", \"Dollar\", \"Dollhouse\", \"Dolphin\", \"Domain\", \"Domelike\", \"Dominion\", \"Donation\", \"Donator\", \"Donor\", \"Donut\", \"Doodle\", \"Doorframe\", \"Doorknob\", \"Doorman\", \"Doormat\", \"Doornail\", \"Doorpost\", \"Doorstep\", \"Doorstop\", \"Doorway\", \"Doozy\", \"Dork\", \"Dormitory\", \"Dorsal\", \"Dosage\", \"Douche\", \"Dowry\", \"Doze\", \"Drab\", \"Dragonfly\", \"Dragster\", \"Drainage\", \"Drainer\", \"Drainpipe\", \"Drank\", \"Drapery\", \"Draw\", \"Dreadlock\", \"Dreamboat\", \"Dreamland\", \"Dreamless\", \"Dreamlike\", \"Dreamt\", \"Dreamy\", \"Drench\", \"Dress\", \"Drier\", \"Drift\", \"Driller\", \"Drilling\", \"Driver\", \"Driveway\", \"Drizzle\", \"Drizzly\", \"Drone\", \"Drool\", \"Droop\", \"Dropbox\", \"Dropkick\", \"Droplet\", \"Dropout\", \"Dropper\", \"Drown\", \"Drudge\", \"Drum\", \"Dry\", \"Duchess\", \"Duckbill\", \"Ducktail\", \"Ducky\", \"Duct\", \"Dude\", \"Duffel\", \"Dugout\", \"Duh\", \"Duller\", \"Dullness\", \"Duly\", \"Dumpster\", \"Duo\", \"Dupe\", \"Duplicate\", \"Duplicity\", \"Duration\", \"Duress\", \"Dusk\", \"Dust\", \"Duty\", \"Duvet\", \"Dwarf\", \"Dweeb\", \"Dweller\", \"Dwindle\", \"Dynamite\", \"Dynasty\", \"Dyslexia\", \"Dyslexic\", \"Eagle\", \"Earache\", \"Eardrum\", \"Earflap\", \"Earlobe\", \"Earmark\", \"Earmuff\", \"Earphone\", \"Earpiece\", \"Earshot\", \"Earthen\", \"Earthlike\", \"Earthworm\", \"Earwig\", \"Easel\", \"Easiness\", \"Eastbound\", \"Eastcoast\", \"Easter\", \"Eastward\", \"Eatery\", \"Ebay\", \"Ebony\", \"Ebook\", \"Ecard\", \"Echo\", \"Eclair\", \"Eclipse\", \"Ecologist\", \"Ecology\", \"Economist\", \"Economy\", \"Ecosystem\", \"Edge\", \"Edginess\", \"Edgy\", \"Edition\", \"Editor\", \"Education\", \"Educator\", \"Eel\", \"Efficient\", \"Effort\", \"Eggbeater\", \"Eggnog\", \"Eggplant\", \"Eggshell\", \"Egomaniac\", \"Egotism\", \"Eject\", \"Elaborate\", \"Elbow\", \"Eldercare\", \"Election\", \"Elephant\", \"Elevate\", \"Elevation\", \"Elevator\", \"Elf\", \"Eliminate\", \"Elitism\", \"Elixir\", \"Elk\", \"Ellipse\", \"Elm\", \"Elope\", \"Eloquence\", \"Eloquent\", \"Elude\", \"Email\", \"Embargo\", \"Embark\", \"Embassy\", \"Embezzle\", \"Emblaze\", \"Emblem\", \"Embody\", \"Embolism\", \"Emboss\", \"Embroider\", \"Emcee\", \"Emerald\", \"Emergency\", \"Emission\", \"Emit\", \"Emote\", \"Emoticon\", \"Emotion\", \"Empathy\", \"Emperor\", \"Emphasis\", \"Employee\", \"Employer\", \"Emporium\", \"Empower\", \"Emptier\", \"Emptiness\", \"Emu\", \"Enactment\", \"Enamel\", \"Enchilada\", \"Encircle\", \"Enclosure\", \"Encode\", \"Encore\", \"Encounter\", \"Encourage\", \"Encroach\", \"Encrust\", \"Encrypt\", \"Endanger\", \"Endless\", \"Endnote\", \"Endocrine\", \"Endorphin\", \"Endorse\", \"Endowment\", \"Endpoint\", \"Endurance\", \"Enforcer\", \"Engine\", \"Engorge\", \"Engraver\", \"Engross\", \"Engulf\", \"Enhance\", \"Enjoyer\", \"Enjoyment\", \"Enquirer\", \"Enrage\", \"Enrich\", \"Enroll\", \"Ensnare\", \"Ensure\", \"Entail\", \"Entertain\", \"Entire\", \"Entitle\", \"Entity\", \"Entomb\", \"Entourage\", \"Entrap\", \"Entree\", \"Entrench\", \"Entrust\", \"Entwine\", \"Enunciate\", \"Envelope\", \"Envision\", \"Envoy\", \"Envy\", \"Enzyme\", \"Epic\", \"Epidermis\", \"Epilepsy\", \"Epilogue\", \"Epiphany\", \"Episode\", \"Equate\", \"Equation\", \"Equator\", \"Equinox\", \"Equipment\", \"Equity\", \"Eradicate\", \"Eraser\", \"Erasure\", \"Errand\", \"Errant\", \"Error\", \"Escalate\", \"Escalator\", \"Escapade\", \"Escapist\", \"Eskimo\", \"Esophagus\", \"Espionage\", \"Espresso\", \"Esquire\", \"Essay\", \"Essence\", \"Estimate\", \"Estimator\", \"Estrogen\", \"Eternity\", \"Ethanol\", \"Ether\", \"Euphemism\", \"Evacuate\", \"Evacuee\", \"Evade\", \"Evaluate\", \"Evaluator\", \"Evaporate\", \"Evasion\", \"Everglade\", \"Evergreen\", \"Everybody\", \"Everyone\", \"Evict\", \"Evidence\", \"Evident\", \"Evil\", \"Evoke\", \"Evolution\", \"Evolve\", \"Exact\", \"Example\", \"Excavate\", \"Excavator\", \"Exception\", \"Excess\", \"Exclaim\", \"Exclude\", \"Exclusion\", \"Excretion\", \"Excretory\", \"Excursion\", \"Excuse\", \"Exemption\", \"Exerciser\", \"Exert\", \"Exfoliate\", \"Exhale\", \"Exhaust\", \"Exhume\", \"Exile\", \"Exit\", \"Exodus\", \"Exonerate\", \"Exorcism\", \"Exorcist\", \"Expand\", \"Expanse\", \"Expansion\", \"Expectant\", \"Expediter\", \"Expel\", \"Expend\", \"Expert\", \"Expire\", \"Explain\", \"Explicit\", \"Explode\", \"Explore\", \"Exponent\", \"Exporter\", \"Exposure\", \"Express\", \"Expulsion\", \"Exquisite\", \"Extent\", \"Extenuate\", \"Exterior\", \"Extinct\", \"Extortion\", \"Extradite\", \"Extrovert\", \"Extrude\", \"Exuberant\", \"Fabric\", \"Facebook\", \"Faceless\", \"Facelift\", \"Faceplate\", \"Facility\", \"Facsimile\", \"Faction\", \"Factoid\", \"Factor\", \"Factsheet\", \"Faculty\", \"Fade\", \"Falcon\", \"Fall\", \"Falsify\", \"Fame\", \"Familiar\", \"Famine\", \"Fanciness\", \"Fancy\", \"Fanfare\", \"Fang\", \"Fantasize\", \"Fantasy\", \"Fascism\", \"Fastball\", \"Faster\", \"Fastness\", \"Faucet\", \"Favorite\", \"Fax\", \"Feast\", \"Feed\", \"Feel\", \"Feisty\", \"Feline\", \"Felt-tip\", \"Feminine\", \"Feminism\", \"Feminist\", \"Feminize\", \"Femur\", \"Fence\", \"Fender\", \"Ferment\", \"Fernlike\", \"Ferocity\", \"Ferris\", \"Ferry\", \"Fervor\", \"Fester\", \"Festival\", \"Festivity\", \"Fetal\", \"Fetch\", \"Fever\", \"Fiction\", \"Fiddle\", \"Fidelity\", \"Fidgety\", \"Fifteen\", \"Fifty\", \"Figment\", \"Figure\", \"Figurine\", \"Filler\", \"Film\", \"Filter\", \"Filth\", \"Filtrate\", \"Finale\", \"Finalist\", \"Finalize\", \"Finance\", \"Finch\", \"Fineness\", \"Finer\", \"Finicky\", \"Finisher\", \"Finite\", \"Finless\", \"Finlike\", \"Fit\", \"Flaccid\", \"Flagman\", \"Flagpole\", \"Flagship\", \"Flagstick\", \"Flagstone\", \"Flail\", \"Flaky\", \"Flame\", \"Flap\", \"Flashback\", \"Flashbulb\", \"Flashcard\", \"Flask\", \"Flatfoot\", \"Flatness\", \"Flatterer\", \"Flattery\", \"Flattop\", \"Flatware\", \"Flatworm\", \"Flaxseed\", \"Fleshy\", \"Flick\", \"Flier\", \"Flight\", \"Flinch\", \"Flint\", \"Flip\", \"Flirt\", \"Float\", \"Flock\", \"Flop\", \"Florist\", \"Floss\", \"Flounder\", \"Flyaway\", \"Flyer\", \"Flyover\", \"Flypaper\", \"Foam\", \"Foe\", \"Fog\", \"Foil\", \"Folic\", \"Folk\", \"Follicle\", \"Fondness\", \"Font\", \"Food\", \"Fool\", \"Footage\", \"Football\", \"Footbath\", \"Footboard\", \"Footer\", \"Footgear\", \"Foothill\", \"Foothold\", \"Footless\", \"Footman\", \"Footnote\", \"Footpad\", \"Footpath\", \"Footprint\", \"Footsie\", \"Footsore\", \"Footwear\", \"Footwork\", \"Fossil\", \"Foster\", \"Founder\", \"Fountain\", \"Fox\", \"Foyer\", \"Fraction\", \"Fracture\", \"Fragile\", \"Fragility\", \"Fragment\", \"Fragrance\", \"Fragrant\", \"Frail\", \"Frame\", \"Freebase\", \"Freebee\", \"Freebie\", \"Freedom\", \"Freefall\", \"Freehand\", \"Freeload\", \"Freemason\", \"Freeness\", \"Freestyle\", \"Freeware\", \"Freeway\", \"Freewill\", \"Freight\", \"Frenzy\", \"Frequency\", \"Frequent\", \"Friction\", \"Fridge\", \"Friend\", \"Frigidity\", \"Frill\", \"Fringe\", \"Frisbee\", \"Frisk\", \"Fritter\", \"Frolic\", \"Front\", \"Frostbite\", \"Frostlike\", \"Frosty\", \"Fructose\", \"Frugality\", \"Fruit\", \"Frustrate\", \"Gab\", \"Gaffe\", \"Gag\", \"Gala\", \"Gallery\", \"Gallon\", \"Gallstone\", \"Galore\", \"Game\", \"Gamma\", \"Gander\", \"Gangway\", \"Gap\", \"Garage\", \"Garbage\", \"Garden\", \"Gargle\", \"Garland\", \"Garment\", \"Garnet\", \"Garter\", \"Gatherer\", \"Gauntlet\", \"Gauze\", \"Gawk\", \"Gecko\", \"Geek\", \"Geiger\", \"Gem\", \"Gender\", \"Genre\", \"Gentile\", \"Gentleman\", \"Geography\", \"Geologist\", \"Geology\", \"Geometry\", \"Geranium\", \"Gerbil\", \"Germicide\", \"Germinate\", \"Germless\", \"Germproof\", \"Gestate\", \"Gestation\", \"Gesture\", \"Getaway\", \"Getup\", \"Giant\", \"Giblet\", \"Giddiness\", \"Gift\", \"Gigabyte\", \"Gigahertz\", \"Giggle\", \"Gigolo\", \"Gimmick\", \"Giver\", \"Gizmo\", \"Glade\", \"Gladiator\", \"Glamour\", \"Glance\", \"Glandular\", \"Glare\", \"Glass\", \"Glaucoma\", \"Glider\", \"Glimmer\", \"Glimpse\", \"Glitch\", \"Glitter\", \"Glitzy\", \"Gloater\", \"Glory\", \"Gloss\", \"Glowworm\", \"Gnat\", \"Goal\", \"Goldmine\", \"Goldsmith\", \"Golf\", \"Goliath\", \"Gonad\", \"Gone\", \"Gooey\", \"Goofball\", \"Goofiness\", \"Goofy\", \"Google\", \"Goon\", \"Gopher\", \"Gore\", \"Gory\", \"Gossip\", \"Gout\", \"Grab\", \"Graceless\", \"Gradation\", \"Grader\", \"Gradient\", \"Graduate\", \"Grain\", \"Granddad\", \"Grandkid\", \"Grandma\", \"Grandpa\", \"Grandson\", \"Granny\", \"Grant\", \"Grape\", \"Graph\", \"Grapple\", \"Grasp\", \"Grass\", \"Gratitude\", \"Gratuity\", \"Gravel\", \"Graveness\", \"Graveyard\", \"Gravitate\", \"Gravity\", \"Gray\", \"Greedless\", \"Greedy\", \"Greeter\", \"Greyhound\", \"Grid\", \"Grief\", \"Grievance\", \"Grill\", \"Grimace\", \"Grime\", \"Griminess\", \"Grimy\", \"Grinch\", \"Grip\", \"Grit\", \"Groin\", \"Groom\", \"Groovy\", \"Grope\", \"Ground\", \"Grout\", \"Grower\", \"Growl\", \"Grub\", \"Grudge\", \"Gruffly\", \"Grunge\", \"Grunt\", \"Guacamole\", \"Guidance\", \"Guileless\", \"Guise\", \"Gulp\", \"Gumball\", \"Gumdrop\", \"Gumminess\", \"Gummy\", \"Gurgle\", \"Guru\", \"Gush\", \"Gusto\", \"Gusty\", \"Gutless\", \"Gutter\", \"Guy\", \"Guzzler\", \"Gyration\", \"Habitant\", \"Habitat\", \"Hacker\", \"Haggler\", \"Haiku\", \"Half\", \"Halogen\", \"Halt\", \"Hamburger\", \"Hamlet\", \"Hammock\", \"Hamper\", \"Hamster\", \"Handbag\", \"Handball\", \"Handbook\", \"Handbrake\", \"Handcart\", \"Handclap\", \"Handclasp\", \"Handcraft\", \"Handcuff\", \"Handful\", \"Handgrip\", \"Handgun\", \"Handiness\", \"Handiwork\", \"Handlebar\", \"Handler\", \"Handmade\", \"Handoff\", \"Handpick\", \"Handprint\", \"Handrail\", \"Handset\", \"Handsfree\", \"Handshake\", \"Handstand\", \"Handwash\", \"Handwork\", \"Handyman\", \"Hangnail\", \"Hangout\", \"Hangover\", \"Hangup\", \"Hankie\", \"Hanky\", \"Haphazard\", \"Happiness\", \"Harbor\", \"Hardcopy\", \"Hardcore\", \"Hardcover\", \"Harddisk\", \"Hardener\", \"Hardhead\", \"Hardiness\", \"Hardness\", \"Hardship\", \"Hardware\", \"Hardwood\", \"Hardy\", \"Harmless\", \"Harmony\", \"Harness\", \"Harpist\", \"Harsh\", \"Hash\", \"Hassle\", \"Haste\", \"Hastiness\", \"Hatbox\", \"Hatchback\", \"Hatchery\", \"Hatchet\", \"Hate\", \"Hatless\", \"Haunt\", \"Hazard\", \"Hazelnut\", \"Haziness\", \"Hazy\", \"Headache\", \"Headband\", \"Headboard\", \"Headcount\", \"Headdress\", \"Header\", \"Headgear\", \"Headlamp\", \"Headless\", \"Headlock\", \"Headphone\", \"Headpiece\", \"Headroom\", \"Headscarf\", \"Headset\", \"Headsman\", \"Headstand\", \"Headstone\", \"Headway\", \"Headwear\", \"Heat\", \"Heaviness\", \"Hedge\", \"Heftiness\", \"Helium\", \"Helmet\", \"Helper\", \"Helpless\", \"Helpline\", \"Hemlock\", \"Hemstitch\", \"Hence\", \"Henchman\", \"Herbicide\", \"Heritage\", \"Hermit\", \"Heroism\", \"Hesitancy\", \"Hesitant\", \"Hesitate\", \"Hexagon\", \"Hexagram\", \"Hubcap\", \"Huff\", \"Hug\", \"Hula\", \"Hulk\", \"Hull\", \"Humid\", \"Humiliate\", \"Humility\", \"Hummus\", \"Humorist\", \"Humorless\", \"Humpback\", \"Humvee\", \"Hunchback\", \"Hunger\", \"Hunk\", \"Hunter\", \"Huntress\", \"Huntsman\", \"Hurdle\", \"Hurler\", \"Hurray\", \"Hurry\", \"Husband\", \"Hush\", \"Huskiness\", \"Hut\", \"Hydrant\", \"Hydration\", \"Hydrogen\", \"Hydroxide\", \"Hyperlink\", \"Hypertext\", \"Hyphen\", \"Hypnosis\", \"Hypnotism\", \"Hypnotist\", \"Hypocrisy\", \"Ibuprofen\", \"Ice\", \"Iciness\", \"Icon\", \"Icy\", \"Idealism\", \"Idealist\", \"Idealness\", \"Identity\", \"Ideology\", \"Idiocy\", \"Idiom\", \"Igloo\", \"Ignition\", \"Ignore\", \"Illusion\", \"Image\", \"Imbecile\", \"Imitate\", \"Imitation\", \"Immature\", \"Immerse\", \"Immersion\", \"Imminent\", \"Immobile\", \"Immortal\", \"Immunity\", \"Impale\", \"Impart\", \"Impatient\", \"Impeach\", \"Imperfect\", \"Implant\", \"Implement\", \"Implicate\", \"Implicit\", \"Implode\", \"Implosion\", \"Imply\", \"Impolite\", \"Important\", \"Importer\", \"Impotence\", \"Impotency\", \"Impotent\", \"Impound\", \"Imprecise\", \"Imprint\", \"Imprison\", \"Impromptu\", \"Improvise\", \"Imprudent\", \"Impure\", \"Impurity\", \"Iodine\", \"Ion\", \"Ipad\", \"Iphone\", \"Ipod\", \"Irate\", \"Irk\", \"Iron\", \"Irrigate\", \"Irritant\", \"Irritate\", \"Islamist\", \"Isolation\", \"Isotope\", \"Issue\", \"Item\", \"Ivory\", \"Ivy\", \"Jab\", \"Jackal\", \"Jacket\", \"Jackknife\", \"Jackpot\", \"Jailbird\", \"Jailbreak\", \"Jailer\", \"Jailhouse\", \"Jalapeno\", \"Jam\", \"Janitor\", \"Jargon\", \"Jasmine\", \"Jaundice\", \"Jaunt\", \"Java\", \"Jawless\", \"Jawline\", \"Jaybird\", \"Jaywalker\", \"Jazz\", \"Jeep\", \"Jester\", \"Jet\", \"Jiffy\", \"Jigsaw\", \"Jimmy\", \"Jingle\", \"Jinx\", \"Jittery\", \"Job\", \"Jockey\", \"Jockstrap\", \"Jogger\", \"Jokester\", \"Jolliness\", \"Jolt\", \"Jot\", \"Joyride\", \"Joystick\", \"Jubilance\", \"Jubilant\", \"Judo\", \"Juggle\", \"Jugular\", \"Juice\", \"Juiciness\", \"Juicy\", \"Jukebox\", \"Jump\", \"Junction\", \"Juncture\", \"Juniper\", \"Junkie\", \"Junkman\", \"Junkyard\", \"Jurist\", \"Juror\", \"Jury\", \"Justice\", \"Justifier\", \"Justness\", \"Juvenile\", \"Keenness\", \"Kerchief\", \"Kilometer\", \"Kindness\", \"Kinship\", \"Knapsack\", \"Laborer\", \"Labrador\", \"Ladder\", \"Ladybug\", \"Ladylike\", \"Lagoon\", \"Lair\", \"Lance\", \"Landfall\", \"Landfill\", \"Landless\", \"Landline\", \"Landlord\", \"Landmark\", \"Landmass\", \"Landmine\", \"Landowner\", \"Landscape\", \"Landside\", \"Landslide\", \"Language\", \"Lankiness\", \"Lanky\", \"Lapdog\", \"Lard\", \"Lark\", \"Lash\", \"Lasso\", \"Latch\", \"Lather\", \"Latitude\", \"Latrine\", \"Latter\", \"Launch\", \"Launder\", \"Laundry\", \"Laurel\", \"Lavender\", \"Laziness\", \"Lazy\", \"Lecturer\", \"Legacy\", \"Lego\", \"Legroom\", \"Legwarmer\", \"Legwork\", \"Lemon\", \"Length\", \"Lent\", \"Leotard\", \"Lethargic\", \"Lethargy\", \"Letter\", \"Lettuce\", \"Level\", \"Leverage\", \"Levitate\", \"Levitator\", \"Liability\", \"Liberty\", \"Licorice\", \"Lid\", \"Life\", \"Lifter\", \"Liftoff\", \"Ligament\", \"Likeness\", \"Lilac\", \"Limb\", \"Limeade\", \"Limelight\", \"Limit\", \"Limpness\", \"Line\", \"Lingo\", \"Linguist\", \"Linoleum\", \"Lint\", \"Lion\", \"Lip\", \"Liquefy\", \"Liqueur\", \"Liquid\", \"Lisp\", \"List\", \"Litigate\", \"Litigator\", \"Litmus\", \"Litter\", \"Liver\", \"Livestock\", \"Lizard\", \"Lubricant\", \"Lubricate\", \"Lucid\", \"Luckiness\", \"Luckless\", \"Lukewarm\", \"Lullaby\", \"Luminance\", \"Lumpiness\", \"Lunacy\", \"Lunar\", \"Lunchbox\", \"Luncheon\", \"Lunchroom\", \"Lunchtime\", \"Lung\", \"Lurch\", \"Lure\", \"Luridness\", \"Lurk\", \"Lushness\", \"Luster\", \"Lustiness\", \"Lusty\", \"Luxury\", \"Lyricism\", \"Lyricist\", \"Macarena\", \"Macaroni\", \"Macaw\", \"Mace\", \"Machine\", \"Machinist\", \"Magazine\", \"Magenta\", \"Magma\", \"Magnesium\", \"Magnetism\", \"Magnify\", \"Magnitude\", \"Mahogany\", \"Majesty\", \"Majorette\", \"Majority\", \"Makeover\", \"Maker\", \"Makeshift\", \"Malt\", \"Mama\", \"Mammogram\", \"Manager\", \"Manatee\", \"Mandarin\", \"Mandate\", \"Mandatory\", \"Mandolin\", \"Manger\", \"Mangle\", \"Mango\", \"Mangy\", \"Manhandle\", \"Manhole\", \"Manhood\", \"Manhunt\", \"Manicure\", \"Manifesto\", \"Manila\", \"Mankind\", \"Manlike\", \"Manliness\", \"Manmade\", \"Manor\", \"Manpower\", \"Mantis\", \"Map\", \"Marathon\", \"Mardi\", \"Margarine\", \"Margin\", \"Marigold\", \"Marine\", \"Maritime\", \"Marlin\", \"Marmalade\", \"Maroon\", \"Marrow\", \"Marry\", \"Marshland\", \"Marshy\", \"Marxism\", \"Mascot\", \"Masculine\", \"Massager\", \"Mastiff\", \"Matador\", \"Matchbook\", \"Matchbox\", \"Matcher\", \"Matchless\", \"Material\", \"Maternity\", \"Math\", \"Matriarch\", \"Matrimony\", \"Matrix\", \"Matter\", \"Maturity\", \"Mauve\", \"Maverick\", \"Maximum\", \"Mayday\", \"Mayflower\", \"Moaner\", \"Mobile\", \"Mobility\", \"Mobster\", \"Mocha\", \"Mocker\", \"Mockup\", \"Modify\", \"Modular\", \"Modulator\", \"Module\", \"Moistness\", \"Moisture\", \"Molar\", \"Mold\", \"Molecule\", \"Molehill\", \"Mollusk\", \"Mom\", \"Monastery\", \"Moneyless\", \"Moneywise\", \"Mongoose\", \"Mongrel\", \"Monitor\", \"Monkhood\", \"Monogamy\", \"Monogram\", \"Monologue\", \"Monopoly\", \"Monorail\", \"Monotone\", \"Monotype\", \"Monoxide\", \"Monsieur\", \"Monsoon\", \"Monument\", \"Moocher\", \"Moodiness\", \"Moonbeam\", \"Moonlight\", \"Moonlike\", \"Moonlit\", \"Moonrise\", \"Moonscape\", \"Moonshine\", \"Moonstone\", \"Moonwalk\", \"Mop\", \"Morale\", \"Morality\", \"Morbidity\", \"Morphine\", \"Morse\", \"Mortality\", \"Mortify\", \"Mosaic\", \"Mossy\", \"Mothball\", \"Mothproof\", \"Motion\", \"Motivate\", \"Motivator\", \"Motive\", \"Motocross\", \"Motto\", \"Mountain\", \"Mourner\", \"Mouse\", \"Mousiness\", \"Moustache\", \"Mousy\", \"Mouth\", \"Move\", \"Movie\", \"Mower\", \"Muck\", \"Mud\", \"Mug\", \"Mulberry\", \"Mulch\", \"Mule\", \"Multiple\", \"Multiply\", \"Multitask\", \"Multitude\", \"Mumbo\", \"Mummify\", \"Mummy\", \"Mundane\", \"Muppet\", \"Murkiness\", \"Murky\", \"Museum\", \"Mushiness\", \"Mushroom\", \"Mushy\", \"Musket\", \"Muskiness\", \"Musky\", \"Mustang\", \"Mustard\", \"Muster\", \"Mustiness\", \"Musty\", \"Mutate\", \"Mutation\", \"Mute\", \"Mutilator\", \"Mutiny\", \"Mutt\", \"Muzzle\", \"Myspace\", \"Mystify\", \"Myth\", \"Nacho\", \"Nag\", \"Nail\", \"Name\", \"Nanny\", \"Nanometer\", \"Nape\", \"Narrow\", \"Nastiness\", \"Native\", \"Nativity\", \"Nature\", \"Naturist\", \"Navigate\", \"Navigator\", \"Nearness\", \"Neatness\", \"Nebula\", \"Nebulizer\", \"Nectar\", \"Negate\", \"Negation\", \"Neglector\", \"Negligee\", \"Negligent\", \"Negotiate\", \"Nemesis\", \"Neon\", \"Nephew\", \"Nerd\", \"Nervy\", \"Net\", \"Neurology\", \"Neuron\", \"Neurosis\", \"Neuter\", \"Neutron\", \"Nickname\", \"Nicotine\", \"Niece\", \"Nifty\", \"Nineteen\", \"Ninetieth\", \"Ninja\", \"Nintendo\", \"Nuclear\", \"Nuclei\", \"Nucleus\", \"Nugget\", \"Numbness\", \"Numerate\", \"Numerator\", \"Nursery\", \"Nursing\", \"Nurture\", \"Nutcase\", \"Nutlike\", \"Nutmeg\", \"Nutrient\", \"Nutshell\", \"Nuttiness\", \"Nuzzle\", \"Nylon\", \"Oaf\", \"Oak\", \"Oasis\", \"Oat\", \"Obedience\", \"Obedient\", \"Object\", \"Obligate\", \"Oblivion\", \"Oboe\", \"Obscure\", \"Obscurity\", \"Observant\", \"Observer\", \"Obsession\", \"Obsolete\", \"Obstacle\", \"Obstinate\", \"Obstruct\", \"Obtain\", \"Obtuse\", \"Occultist\", \"Occupancy\", \"Occupant\", \"Occupy\", \"Ocelot\", \"Octagon\", \"Octane\", \"Octopus\", \"Ogle\", \"Oil\", \"Oink\", \"Ointment\", \"Okay\", \"Old\", \"Omega\", \"Omission\", \"Omit\", \"Omnivore\", \"Onboard\", \"Onion\", \"Online\", \"Onlooker\", \"Onscreen\", \"Onset\", \"Onshore\", \"Onslaught\", \"Onstage\", \"Onward\", \"Onyx\", \"Ooze\", \"Oozy\", \"Opacity\", \"Opal\", \"Operate\", \"Operating\", \"Operation\", \"Operator\", \"Opium\", \"Opossum\", \"Opponent\", \"Oppose\", \"Opposite\", \"Oppressor\", \"Opt\", \"Osmosis\", \"Otter\", \"Ounce\", \"Outage\", \"Outback\", \"Outbid\", \"Outboard\", \"Outbound\", \"Outbreak\", \"Outcast\", \"Outclass\", \"Outcome\", \"Outer\", \"Outfield\", \"Outfit\", \"Outflank\", \"Outgrow\", \"Outhouse\", \"Outlast\", \"Outlet\", \"Outline\", \"Outlook\", \"Outmatch\", \"Outmost\", \"Outpost\", \"Outpour\", \"Output\", \"Outrage\", \"Outrank\", \"Outreach\", \"Outright\", \"Outscore\", \"Outsell\", \"Outshine\", \"Outshoot\", \"Outsider\", \"Outsmart\", \"Outsource\", \"Outthink\", \"Outward\", \"Outweigh\", \"Outwit\", \"Oval\", \"Overact\", \"Overarch\", \"Overbid\", \"Overbill\", \"Overbite\", \"Overboard\", \"Overbook\", \"Overbuilt\", \"Overcast\", \"Overcoat\", \"Overcome\", \"Overcook\", \"Overcrowd\", \"Overdraft\", \"Overdrawn\", \"Overdress\", \"Overeager\", \"Overeater\", \"Overexert\", \"Overfed\", \"Overfeed\", \"Overfill\", \"Overfull\", \"Overhand\", \"Overhang\", \"Overhaul\", \"Overhead\", \"Overheat\", \"Overhung\", \"Overkill\", \"Overlabor\", \"Overlaid\", \"Overlap\", \"Overlay\", \"Overload\", \"Overlook\", \"Overlord\", \"Overnight\", \"Overpass\", \"Overpay\", \"Overplant\", \"Overplay\", \"Overpower\", \"Overprice\", \"Overrate\", \"Overreach\", \"Overreact\", \"Overripe\", \"Overrule\", \"Overrun\", \"Overshoot\", \"Overshot\", \"Oversight\", \"Oversleep\", \"Oversold\", \"Overspend\", \"Overstate\", \"Overstay\", \"Overstep\", \"Overstock\", \"Overstuff\", \"Oversweet\", \"Overtake\", \"Overthrow\", \"Overtime\", \"Overtone\", \"Overture\", \"Overturn\", \"Overuse\", \"Overvalue\", \"Overview\", \"Overwrite\", \"Owl\", \"Oxford\", \"Oxidant\", \"Oxidation\", \"Oxygen\", \"Oxymoron\", \"Oyster\", \"Ozone\", \"Pacemaker\", \"Pacifier\", \"Pacifism\", \"Pacifist\", \"Padlock\", \"Pagan\", \"Pager\", \"Pajamas\", \"Palace\", \"Palm\", \"Palpitate\", \"Paltry\", \"Pamperer\", \"Pamphlet\", \"Panama\", \"Panda\", \"Pang\", \"Panic\", \"Panorama\", \"Panther\", \"Pantomime\", \"Pantry\", \"Paparazzi\", \"Papaya\", \"Paper\", \"Papyrus\", \"Parabola\", \"Parachute\", \"Parade\", \"Paradox\", \"Paragraph\", \"Parakeet\", \"Paralegal\", \"Paralysis\", \"Paralyze\", \"Paramedic\", \"Parameter\", \"Parasail\", \"Parasite\", \"Parcel\", \"Parchment\", \"Pardon\", \"Parka\", \"Parkway\", \"Parlor\", \"Parole\", \"Parrot\", \"Parsley\", \"Parsnip\", \"Partition\", \"Partner\", \"Partridge\", \"Passage\", \"Passcode\", \"Passenger\", \"Passion\", \"Passivism\", \"Passover\", \"Passport\", \"Password\", \"Pasta\", \"Pastel\", \"Pastime\", \"Pastor\", \"Pastrami\", \"Pasture\", \"Pasty\", \"Patchwork\", \"Patchy\", \"Paternity\", \"Path\", \"Patience\", \"Patient\", \"Patio\", \"Patriarch\", \"Patriot\", \"Patrol\", \"Patronage\", \"Pauper\", \"Pavement\", \"Paver\", \"Pavestone\", \"Pavilion\", \"Payback\", \"Paycheck\", \"Payday\", \"Payee\", \"Payer\", \"Payment\", \"Payphone\", \"Payroll\", \"Pectin\", \"Peculiar\", \"Pedicure\", \"Pedigree\", \"Pedometer\", \"Pegboard\", \"Pellet\", \"Pelt\", \"Pelvis\", \"Penalty\", \"Pencil\", \"Pendant\", \"Penholder\", \"Penknife\", \"Pennant\", \"Penniless\", \"Penny\", \"Penpal\", \"Pension\", \"Pentagram\", \"Pep\", \"Percent\", \"Perch\", \"Percolate\", \"Perfume\", \"Periscope\", \"Perjurer\", \"Perjury\", \"Perkiness\", \"Perky\", \"Perm\", \"Peroxide\", \"Persecute\", \"Persuader\", \"Pesky\", \"Peso\", \"Pessimism\", \"Pessimist\", \"Pester\", \"Pesticide\", \"Petal\", \"Petition\", \"Petri\", \"Petroleum\", \"Petticoat\", \"Pettiness\", \"Petty\", \"Petunia\", \"Phantom\", \"Phobia\", \"Phonebook\", \"Phoney\", \"Phoniness\", \"Phony\", \"Phosphate\", \"Photo\", \"Phrase\", \"Placard\", \"Placate\", \"Plank\", \"Planner\", \"Plant\", \"Plasma\", \"Plaster\", \"Plastic\", \"Platform\", \"Platinum\", \"Platonic\", \"Platter\", \"Platypus\", \"Playback\", \"Player\", \"Playful\", \"Playgroup\", \"Playhouse\", \"Playlist\", \"Playmaker\", \"Playmate\", \"Playoff\", \"Playroom\", \"Playset\", \"Playtime\", \"Plaza\", \"Pleat\", \"Pledge\", \"Plentiful\", \"Plenty\", \"Plod\", \"Plot\", \"Ploy\", \"Pluck\", \"Plug\", \"Plunder\", \"Plutonium\", \"Plywood\", \"Poach\", \"Pod\", \"Poem\", \"Poet\", \"Pogo\", \"Pointer\", \"Pointless\", \"Pointy\", \"Poise\", \"Poison\", \"Poker\", \"Polar\", \"Policy\", \"Polio\", \"Polka\", \"Polo\", \"Polyester\", \"Polygon\", \"Polygraph\", \"Polymer\", \"Poncho\", \"Pond\", \"Pony\", \"Popcorn\", \"Pope\", \"Poplar\", \"Popper\", \"Popsicle\", \"Populace\", \"Popular\", \"Populate\", \"Porcupine\", \"Pork\", \"Porridge\", \"Portal\", \"Portfolio\", \"Porthole\", \"Portion\", \"Portside\", \"Poser\", \"Posh\", \"Possum\", \"Postage\", \"Postbox\", \"Postcard\", \"Poster\", \"Postnasal\", \"Posture\", \"Pounce\", \"Pound\", \"Pout\", \"Powdery\", \"Power\", \"Powwow\", \"Pox\", \"Prance\", \"Pranker\", \"Prankster\", \"Prayer\", \"Preacher\", \"Preachy\", \"Precinct\", \"Precision\", \"Precook\", \"Precut\", \"Predator\", \"Predefine\", \"Predict\", \"Preface\", \"Prefix\", \"Preflight\", \"Pregame\", \"Pregnancy\", \"Prelaunch\", \"Prelaw\", \"Prelude\", \"Premium\", \"Prenatal\", \"Preoccupy\", \"Preorder\", \"Prepaid\", \"Prepay\", \"Preplan\", \"Preschool\", \"Prescribe\", \"Preseason\", \"Preset\", \"Preshow\", \"Presoak\", \"Press\", \"Presume\", \"Preteen\", \"Pretender\", \"Pretense\", \"Pretext\", \"Pretzel\", \"Prevail\", \"Prevalent\", \"Prevent\", \"Preview\", \"Prewar\", \"Prideful\", \"Primal\", \"Primate\", \"Primer\", \"Primp\", \"Princess\", \"Print\", \"Prism\", \"Prison\", \"Prissy\", \"Pristine\", \"Privacy\", \"Probation\", \"Probe\", \"Problem\", \"Procedure\", \"Process\", \"Proclaim\", \"Procreate\", \"Procurer\", \"Prodigal\", \"Prodigy\", \"Product\", \"Profane\", \"Profanity\", \"Profile\", \"Profound\", \"Progeny\", \"Prognosis\", \"Program\", \"Progress\", \"Projector\", \"Prologue\", \"Promenade\", \"Prominent\", \"Promoter\", \"Promotion\", \"Prompter\", \"Prone\", \"Prong\", \"Pronounce\", \"Pronto\", \"Proofread\", \"Proofs\", \"Propeller\", \"Property\", \"Proponent\", \"Proposal\", \"Prorate\", \"Protector\", \"Protegee\", \"Proton\", \"Prototype\", \"Protozoan\", \"Protract\", \"Protrude\", \"Proud\", \"Provider\", \"Province\", \"Provoke\", \"Provolone\", \"Prowess\", \"Prowler\", \"Proximity\", \"Proxy\", \"Prozac\", \"Prude\", \"Prune\", \"Pry\", \"Publisher\", \"Pucker\", \"Pueblo\", \"Pug\", \"Pull\", \"Pulp\", \"Pulsate\", \"Pulse\", \"Puma\", \"Pumice\", \"Pummel\", \"Punch\", \"Punctuate\", \"Pungent\", \"Punisher\", \"Punk\", \"Pupil\", \"Puppet\", \"Purchase\", \"Pureblood\", \"Pureness\", \"Purgatory\", \"Purge\", \"Purifier\", \"Purist\", \"Puritan\", \"Purity\", \"Purple\", \"Purr\", \"Purse\", \"Pursuant\", \"Pursuit\", \"Purveyor\", \"Pushcart\", \"Pushchair\", \"Pusher\", \"Pushiness\", \"Pushover\", \"Pushpin\", \"Pushup\", \"Pushy\", \"Putdown\", \"Putt\", \"Puzzle\", \"Pyramid\", \"Pyromania\", \"Python\", \"Quack\", \"Quadrant\", \"Quail\", \"Quake\", \"Qualifier\", \"Quality\", \"Qualm\", \"Quantum\", \"Quarrel\", \"Quarry\", \"Quartet\", \"Quench\", \"Query\", \"Quicken\", \"Quickness\", \"Quicksand\", \"Quickstep\", \"Quill\", \"Quilt\", \"Quintet\", \"Quintuple\", \"Quirk\", \"Quit\", \"Quiver\", \"Quotation\", \"Quote\", \"Rabid\", \"Race\", \"Racism\", \"Rack\", \"Racoon\", \"Radar\", \"Radiance\", \"Radiation\", \"Radiator\", \"Radio\", \"Raffle\", \"Raft\", \"Rage\", \"Ragweed\", \"Raider\", \"Railcar\", \"Railroad\", \"Railway\", \"Raisin\", \"Ramp\", \"Ramrod\", \"Ranch\", \"Rancidity\", \"Random\", \"Ranger\", \"Ransack\", \"Rarity\", \"Rash\", \"Ravage\", \"Ravine\", \"Ravioli\", \"Reabsorb\", \"Reach\", \"Reacquire\", \"Reaction\", \"Reactor\", \"Reaffirm\", \"Ream\", \"Reanalyze\", \"Reapply\", \"Reappoint\", \"Rearrange\", \"Rearview\", \"Reason\", \"Reassign\", \"Reassure\", \"Reattach\", \"Rebalance\", \"Rebate\", \"Rebel\", \"Rebirth\", \"Reboot\", \"Rebound\", \"Rebuff\", \"Rebuilt\", \"Recall\", \"Recant\", \"Recapture\", \"Recast\", \"Recede\", \"Recent\", \"Recess\", \"Recharger\", \"Recipient\", \"Recite\", \"Reclaim\", \"Recliner\", \"Recluse\", \"Recoil\", \"Recollect\", \"Recolor\", \"Reconcile\", \"Reconfirm\", \"Reconvene\", \"Recopy\", \"Record\", \"Recount\", \"Recoup\", \"Recovery\", \"Recreate\", \"Rectangle\", \"Recycler\", \"Reemerge\", \"Reenact\", \"Reenter\", \"Reentry\", \"Reexamine\", \"Reference\", \"Refill\", \"Refinance\", \"Refinery\", \"Reflector\", \"Reflux\", \"Refold\", \"Reformat\", \"Reformer\", \"Reformist\", \"Refract\", \"Refrain\", \"Refreeze\", \"Refresh\", \"Refund\", \"Refusal\", \"Refuse\", \"Refute\", \"Regain\", \"Reggae\", \"Regime\", \"Region\", \"Register\", \"Registrar\", \"Registry\", \"Regress\", \"Regroup\", \"Regulator\", \"Rehab\", \"Reheat\", \"Rehire\", \"Rehydrate\", \"Reimburse\", \"Reissue\", \"Reiterate\", \"Rejoice\", \"Rejoin\", \"Relapse\", \"Relation\", \"Relax\", \"Relay\", \"Relearn\", \"Release\", \"Reliance\", \"Reliant\", \"Relight\", \"Reload\", \"Relock\", \"Remark\", \"Remarry\", \"Rematch\", \"Remedy\", \"Reminder\", \"Remission\", \"Remix\", \"Remnant\", \"Remodeler\", \"Remold\", \"Remorse\", \"Removal\", \"Remover\", \"Rename\", \"Renderer\", \"Rendition\", \"Renegade\", \"Renewal\", \"Renounce\", \"Renovate\", \"Renovator\", \"Renter\", \"Reoccupy\", \"Reoccur\", \"Reorder\", \"Repackage\", \"Repaint\", \"Repair\", \"Repayment\", \"Repeal\", \"Repeater\", \"Repent\", \"Rephrase\", \"Replace\", \"Replay\", \"Replica\", \"Reply\", \"Reporter\", \"Repossess\", \"Repost\", \"Reprimand\", \"Reprint\", \"Reprise\", \"Reproach\", \"Reprocess\", \"Reprogram\", \"Reptile\", \"Repugnant\", \"Repulsion\", \"Request\", \"Require\", \"Requisite\", \"Reroute\", \"Resale\", \"Resample\", \"Rescuer\", \"Reseal\", \"Research\", \"Reselect\", \"Reseller\", \"Resent\", \"Reshape\", \"Reshoot\", \"Reshuffle\", \"Residence\", \"Residency\", \"Resident\", \"Resilient\", \"Resolute\", \"Resonant\", \"Resonate\", \"Resort\", \"Resource\", \"Respect\", \"Resubmit\", \"Result\", \"Resupply\", \"Resurface\", \"Resurrect\", \"Retainer\", \"Retaliate\", \"Retention\", \"Rethink\", \"Retiree\", \"Retold\", \"Retool\", \"Retrace\", \"Retract\", \"Retrain\", \"Retread\", \"Retreat\", \"Retrieval\", \"Retriever\", \"Retry\", \"Return\", \"Retype\", \"Reunion\", \"Reunite\", \"Reuse\", \"Reveal\", \"Reveler\", \"Revenge\", \"Revenue\", \"Reverb\", \"Reverence\", \"Reversal\", \"Reverse\", \"Reversion\", \"Revert\", \"Revise\", \"Revision\", \"Revisit\", \"Revival\", \"Reviver\", \"Revoke\", \"Revolt\", \"Revolver\", \"Reward\", \"Rewash\", \"Rewind\", \"Rewire\", \"Reword\", \"Rework\", \"Rewrap\", \"Rhyme\", \"Ribbon\", \"Ribcage\", \"Rice\", \"Richness\", \"Rickety\", \"Ricotta\", \"Riddance\", \"Ridden\", \"Ride\", \"Rift\", \"Rigor\", \"Rimless\", \"Rind\", \"Rinse\", \"Riot\", \"Ripcord\", \"Ripeness\", \"Ripple\", \"Riptide\", \"Rise\", \"Risk\", \"Risotto\", \"Ritalin\", \"Ritzy\", \"Riverbank\", \"Riverboat\", \"Riverside\", \"Riveter\", \"Roamer\", \"Roast\", \"Robe\", \"Robin\", \"Rockband\", \"Rocker\", \"Rocket\", \"Rockiness\", \"Rocklike\", \"Rockslide\", \"Rockstar\", \"Rogue\", \"Roman\", \"Romp\", \"Rope\", \"Roster\", \"Rotunda\", \"Roulette\", \"Roundness\", \"Roundup\", \"Roundworm\", \"Rover\", \"Royal\", \"Rubdown\", \"Ruby\", \"Ruckus\", \"Rudder\", \"Rug\", \"Rule\", \"Rummage\", \"Rumor\", \"Runaround\", \"Rundown\", \"Runner\", \"Runny\", \"Runt\", \"Rupture\", \"Ruse\", \"Rush\", \"Rust\", \"Rut\", \"Sabbath\", \"Sabotage\", \"Sacrament\", \"Sacrifice\", \"Sadden\", \"Saddlebag\", \"Sadness\", \"Safari\", \"Safeguard\", \"Safehouse\", \"Safeness\", \"Saffron\", \"Saga\", \"Sage\", \"Saggy\", \"Said\", \"Saint\", \"Sake\", \"Salad\", \"Salami\", \"Saline\", \"Salon\", \"Saloon\", \"Salsa\", \"Salt\", \"Salute\", \"Salvage\", \"Salvation\", \"Same\", \"Sample\", \"Sanction\", \"Sanctity\", \"Sandal\", \"Sandbag\", \"Sandbank\", \"Sandbar\", \"Sandblast\", \"Sandbox\", \"Sandlot\", \"Sandpaper\", \"Sandpit\", \"Sandstone\", \"Sandstorm\", \"Sandworm\", \"Sandy\", \"Sanitizer\", \"Sank\", \"Sappiness\", \"Sarcasm\", \"Sardine\", \"Sash\", \"Sasquatch\", \"Sassy\", \"Satchel\", \"Satin\", \"Satisfy\", \"Saturate\", \"Sauciness\", \"Saucy\", \"Sauna\", \"Savage\", \"Savanna\", \"Savor\", \"Saxophone\", \"Say\", \"Scabbed\", \"Scabby\", \"Scale\", \"Scallion\", \"Scallop\", \"Scam\", \"Scandal\", \"Scanner\", \"Scant\", \"Scapegoat\", \"Scarce\", \"Scarcity\", \"Scarecrow\", \"Scarf\", \"Scariness\", \"Scavenger\", \"Schedule\", \"Scheme\", \"Schnapps\", \"Scholar\", \"Science\", \"Scientist\", \"Scion\", \"Scoff\", \"Scone\", \"Scoop\", \"Scooter\", \"Scope\", \"Scorch\", \"Scorebook\", \"Scorecard\", \"Scoreless\", \"Scorer\", \"Scorn\", \"Scorpion\", \"Scotch\", \"Scoundrel\", \"Scrambler\", \"Scrap\", \"Scratch\", \"Scrawny\", \"Screen\", \"Scribe\", \"Scrimmage\", \"Script\", \"Scroll\", \"Scrooge\", \"Scrounger\", \"Scrubbed\", \"Scruffy\", \"Scrunch\", \"Scrutiny\", \"Scuba\", \"Scuff\", \"Sculptor\", \"Sculpture\", \"Scurvy\", \"Scuttle\", \"Seclusion\", \"Secrecy\", \"Sector\", \"Security\", \"Sedan\", \"Sedate\", \"Sedation\", \"Sediment\", \"Seduce\", \"Segment\", \"Seldom\", \"Selection\", \"Selector\", \"Self\", \"Seltzer\", \"Semester\", \"Semicolon\", \"Seminar\", \"Semisweet\", \"Senator\", \"Sensation\", \"Sepia\", \"Septum\", \"Sequel\", \"Sequence\", \"Sequester\", \"Sermon\", \"Serotonin\", \"Serpent\", \"Serve\", \"Sesame\", \"Setback\", \"Setup\", \"Sevenfold\", \"Seventeen\", \"Seventy\", \"Severity\", \"Shabby\", \"Shack\", \"Shadiness\", \"Shadow\", \"Shady\", \"Shaft\", \"Shakiness\", \"Shaky\", \"Shale\", \"Shallot\", \"Shallow\", \"Shame\", \"Shampoo\", \"Shamrock\", \"Shank\", \"Shanty\", \"Shape\", \"Share\", \"Sharpener\", \"Sharper\", \"Sharpie\", \"Sharply\", \"Sharpness\", \"Shawl\", \"Sheath\", \"Sheep\", \"Sheet\", \"Shelf\", \"Shell\", \"Shelter\", \"Shelve\", \"Sherry\", \"Shield\", \"Shifter\", \"Shiftless\", \"Shifty\", \"Shimmer\", \"Shimmy\", \"Shindig\", \"Shine\", \"Shingle\", \"Shininess\", \"Ship\", \"Shirt\", \"Shock\", \"Shone\", \"Shoplift\", \"Shopper\", \"Shoptalk\", \"Shore\", \"Shortage\", \"Shortcake\", \"Shortcut\", \"Shorter\", \"Shorthand\", \"Shortlist\", \"Shortness\", \"Shorty\", \"Shout\", \"Showbiz\", \"Showcase\", \"Showdown\", \"Shower\", \"Showgirl\", \"Showman\", \"Shown\", \"Showoff\", \"Showpiece\", \"Showplace\", \"Showroom\", \"Showy\", \"Shrank\", \"Shrapnel\", \"Shredder\", \"Shriek\", \"Shrill\", \"Shrimp\", \"Shrine\", \"Shrivel\", \"Shrubbery\", \"Shrug\", \"Shrunk\", \"Shudder\", \"Shuffle\", \"Shun\", \"Shush\", \"Shut\", \"Shy\", \"Sierra\", \"Siesta\", \"Sift\", \"Silencer\", \"Silent\", \"Silica\", \"Silicon\", \"Silk\", \"Silliness\", \"Silo\", \"Silt\", \"Silver\", \"Simile\", \"Simple\", \"Simply\", \"Sincerity\", \"Singer\", \"Single\", \"Sinister\", \"Sinless\", \"Sinner\", \"Sip\", \"Sister\", \"Sitcom\", \"Sitter\", \"Situation\", \"Sixfold\", \"Sixteen\", \"Sixtieth\", \"Sixtyfold\", \"Size\", \"Sizzle\", \"Skater\", \"Skedaddle\", \"Skeleton\", \"Sketch\", \"Skewer\", \"Skid\", \"Skier\", \"Skillet\", \"Skimmer\", \"Skincare\", \"Skinhead\", \"Skinless\", \"Skinny\", \"Skintight\", \"Skipper\", \"Skirmish\", \"Skirt\", \"Skittle\", \"Skydiver\", \"Skylight\", \"Skyline\", \"Skype\", \"Skyrocket\", \"Skyward\", \"Slab\", \"Slacker\", \"Slackness\", \"Slain\", \"Slam\", \"Slander\", \"Slang\", \"Slapstick\", \"Slate\", \"Slather\", \"Slaw\", \"Sleep\", \"Sleet\", \"Sleeve\", \"Slept\", \"Slicer\", \"Slick\", \"Slider\", \"Slideshow\", \"Slimness\", \"Slimy\", \"Slingshot\", \"Slinky\", \"Slip\", \"Slit\", \"Sliver\", \"Slobbery\", \"Slogan\", \"Slot\", \"Slouchy\", \"Sludge\", \"Slug\", \"Slum\", \"Slurp\", \"Slush\", \"Sly\", \"Small\", \"Smartness\", \"Smasher\", \"Smashup\", \"Smell\", \"Smile\", \"Smirk\", \"Smite\", \"Smock\", \"Smog\", \"Smokeless\", \"Smokiness\", \"Smoky\", \"Smolder\", \"Smother\", \"Smudge\", \"Smudgy\", \"Smuggler\", \"Smugness\", \"Snack\", \"Snap\", \"Snare\", \"Snazzy\", \"Sneak\", \"Sneer\", \"Sneeze\", \"Snide\", \"Sniff\", \"Snippet\", \"Snitch\", \"Snooper\", \"Snooze\", \"Snore\", \"Snorkel\", \"Snort\", \"Snout\", \"Snowbird\", \"Snowboard\", \"Snowbound\", \"Snowcap\", \"Snowdrift\", \"Snowdrop\", \"Snowfall\", \"Snowfield\", \"Snowflake\", \"Snowiness\", \"Snowless\", \"Snowman\", \"Snowplow\", \"Snowshoe\", \"Snowstorm\", \"Snowsuit\", \"Snowy\", \"Snub\", \"Snuff\", \"Snuggle\", \"Snugness\", \"Speak\", \"Spearhead\", \"Spearman\", \"Spearmint\", \"Spectacle\", \"Spectator\", \"Spectrum\", \"Speculate\", \"Speech\", \"Speed\", \"Spellbind\", \"Speller\", \"Spender\", \"Spending\", \"Spent\", \"Spew\", \"Sphinx\", \"Spider\", \"Spiffy\", \"Spill\", \"Spilt\", \"Spinach\", \"Spindle\", \"Spinner\", \"Spinout\", \"Spinster\", \"Spiny\", \"Spiritism\", \"Splashy\", \"Splatter\", \"Spleen\", \"Splendid\", \"Splendor\", \"Splice\", \"Splinter\", \"Splotchy\", \"Splurge\", \"Spoilage\", \"Spoiler\", \"Spokesman\", \"Sponge\", \"Spongy\", \"Sponsor\", \"Spoof\", \"Spooky\", \"Spool\", \"Spoon\", \"Spore\", \"Sporty\", \"Spotless\", \"Spotlight\", \"Spotter\", \"Spousal\", \"Spouse\", \"Spout\", \"Sprain\", \"Sprang\", \"Sprawl\", \"Spray\", \"Spree\", \"Sprig\", \"Spring\", \"Sprinkler\", \"Sprint\", \"Sprite\", \"Sprout\", \"Spruce\", \"Sprung\", \"Spry\", \"Spud\", \"Sputter\", \"Spyglass\", \"Squad\", \"Squall\", \"Squander\", \"Squash\", \"Squatter\", \"Squeak\", \"Squealer\", \"Squeegee\", \"Squeeze\", \"Squid\", \"Squiggle\", \"Squint\", \"Squire\", \"Squirt\", \"Squishier\", \"Squishy\", \"Stability\", \"Stack\", \"Stadium\", \"Staff\", \"Stage\", \"Stagnant\", \"Stagnate\", \"Stainless\", \"Stalemate\", \"Staleness\", \"Stallion\", \"Stammer\", \"Stamp\", \"Stand\", \"Stank\", \"Staple\", \"Starboard\", \"Starch\", \"Stardom\", \"Stardust\", \"Stargazer\", \"Stark\", \"Starless\", \"Starlet\", \"Starlight\", \"Starlit\", \"Starry\", \"Starship\", \"Starter\", \"Startle\", \"Startup\", \"Stash\", \"State\", \"Statue\", \"Stature\", \"Status\", \"Statute\", \"Statutory\", \"Staunch\", \"Steadfast\", \"Steam\", \"Steed\", \"Steersman\", \"Stegosaur\", \"Stem\", \"Stench\", \"Stencil\", \"Step\", \"Stereo\", \"Sterile\", \"Sterility\", \"Sterling\", \"Sternness\", \"Sternum\", \"Stew\", \"Stick\", \"Stiffen\", \"Stiffly\", \"Stiffness\", \"Stifle\", \"Stillness\", \"Stilt\", \"Stimulant\", \"Stimulate\", \"Stimulus\", \"Stinger\", \"Stingray\", \"Stingy\", \"Stinky\", \"Stipend\", \"Stipulate\", \"Stir\", \"Stitch\", \"Stock\", \"Stoic\", \"Stoke\", \"Stole\", \"Stomp\", \"Stonewall\", \"Stoneware\", \"Stonework\", \"Stony\", \"Stood\", \"Stooge\", \"Stool\", \"Stoop\", \"Stoplight\", \"Stoppage\", \"Stopper\", \"Stopwatch\", \"Storage\", \"Storeroom\", \"Storewide\", \"Storm\", \"Stout\", \"Stowaway\", \"Straddle\", \"Straggler\", \"Strainer\", \"Stranger\", \"Strangle\", \"Strategic\", \"Strategy\", \"Stratus\", \"Straw\", \"Stray\", \"Streak\", \"Stream\", \"Strength\", \"Strep\", \"Stress\", \"Stretch\", \"Strewn\", \"Strict\", \"Stride\", \"Strife\", \"Strike\", \"Strobe\", \"Strode\", \"Stroller\", \"Strongbox\", \"Strongman\", \"Struck\", \"Structure\", \"Strudel\", \"Struggle\", \"Strum\", \"Strung\", \"Strut\", \"Stubbed\", \"Stucco\", \"Stuck\", \"Student\", \"Studio\", \"Study\", \"Stuffed\", \"Stuffy\", \"Stump\", \"Stung\", \"Stunner\", \"Stunt\", \"Stupor\", \"Sturdy\", \"Stylist\", \"Stylus\", \"Subdivide\", \"Subfloor\", \"Subgroup\", \"Subheader\", \"Sublease\", \"Sublet\", \"Sublevel\", \"Sublime\", \"Submarine\", \"Submerge\", \"Submitter\", \"Subpanel\", \"Subpar\", \"Subplot\", \"Subprime\", \"Subscribe\", \"Subscript\", \"Subsector\", \"Subside\", \"Subsidy\", \"Subsoil\", \"Substance\", \"Subsystem\", \"Subtext\", \"Subtitle\", \"Subtract\", \"Subtype\", \"Suburb\", \"Subway\", \"Subwoofer\", \"Subzero\", \"Succulent\", \"Suction\", \"Sudoku\", \"Sufferer\", \"Suffice\", \"Suffix\", \"Suffocate\", \"Suffrage\", \"Sugar\", \"Suggest\", \"Suitcase\", \"Suitor\", \"Sulfate\", \"Sulfide\", \"Sulfite\", \"Sulfur\", \"Sulk\", \"Sullen\", \"Sulphate\", \"Sultry\", \"Superbowl\", \"Superglue\", \"Superhero\", \"Superjet\", \"Superman\", \"Supermom\", \"Supervise\", \"Supper\", \"Supplier\", \"Supply\", \"Support\", \"Supremacy\", \"Surcharge\", \"Sureness\", \"Surface\", \"Surfboard\", \"Surfer\", \"Surgery\", \"Surname\", \"Surpass\", \"Surplus\", \"Surprise\", \"Surreal\", \"Surrender\", \"Surrogate\", \"Surround\", \"Survey\", \"Survival\", \"Survivor\", \"Sushi\", \"Suspect\", \"Suspend\", \"Suspense\", \"Sustainer\", \"Swab\", \"Swagger\", \"Swampland\", \"Swan\", \"Swarm\", \"Sway\", \"Sweat\", \"Sweep\", \"Swept\", \"Swerve\", \"Swifter\", \"Swiftness\", \"Swimmer\", \"Swimsuit\", \"Swimwear\", \"Swinger\", \"Swipe\", \"Swirl\", \"Switch\", \"Swivel\", \"Swizzle\", \"Swoop\", \"Swore\", \"Swung\", \"Sycamore\", \"Sympathy\", \"Symphony\", \"Symptom\", \"Synapse\", \"Syndrome\", \"Synergy\", \"Synopsis\", \"Synthesis\", \"Syrup\", \"System\", \"T-shirt\", \"Tabasco\", \"Tabby\", \"Tableful\", \"Tablet\", \"Tableware\", \"Tabloid\", \"Tackiness\", \"Tackle\", \"Tacky\", \"Taco\", \"Tactful\", \"Tactile\", \"Tactless\", \"Tadpole\", \"Taekwondo\", \"Tag\", \"Talcum\", \"Talisman\", \"Tall\", \"Talon\", \"Tamale\", \"Tameness\", \"Tamer\", \"Tamper\", \"Tank\", \"Tannery\", \"Tantrum\", \"Tapeless\", \"Tapestry\", \"Tapioca\", \"Tarantula\", \"Target\", \"Tarmac\", \"Tarot\", \"Tartar\", \"Tartness\", \"Task\", \"Tassel\", \"Taste\", \"Tastiness\", \"Tasty\", \"Tattle\", \"Tattoo\", \"Taunt\", \"Tavern\", \"Thank\", \"Thaw\", \"Theater\", \"Thee\", \"Theft\", \"Theme\", \"Theology\", \"Thermal\", \"Thermos\", \"Thesaurus\", \"Thesis\", \"Thicken\", \"Thicket\", \"Thickness\", \"Thigh\", \"Thinner\", \"Thinness\", \"Thirsty\", \"Thirteen\", \"Thirty\", \"Thong\", \"Thorn\", \"Thrash\", \"Thread\", \"Threefold\", \"Thrift\", \"Thrill\", \"Thrive\", \"Throat\", \"Throng\", \"Throttle\", \"Throwaway\", \"Throwback\", \"Thrower\", \"Thud\", \"Thumb\", \"Tiara\", \"Tibia\", \"Tidal\", \"Tidbit\", \"Tidiness\", \"Tidy\", \"Tiger\", \"Tightness\", \"Tightrope\", \"Tightwad\", \"Tigress\", \"Tile\", \"Till\", \"Tilt\", \"Timid\", \"Timing\", \"Timothy\", \"Tinderbox\", \"Tinfoil\", \"Tingle\", \"Tinker\", \"Tinsel\", \"Tinsmith\", \"Tint\", \"Tinwork\", \"Tipoff\", \"Tipper\", \"Tiptop\", \"Tissue\", \"Trace\", \"Track\", \"Traction\", \"Tractor\", \"Trading\", \"Tradition\", \"Traffic\", \"Tragedy\", \"Trailside\", \"Train\", \"Traitor\", \"Trance\", \"Tranquil\", \"Transfer\", \"Transform\", \"Translate\", \"Transpire\", \"Transport\", \"Trapdoor\", \"Trapeze\", \"Trapezoid\", \"Trapper\", \"Trash\", \"Travel\", \"Traverse\", \"Travesty\", \"Tray\", \"Treachery\", \"Treadmill\", \"Treason\", \"Treat\", \"Tree\", \"Trekker\", \"Tremor\", \"Trench\", \"Trend\", \"Trespass\", \"Triage\", \"Trial\", \"Triangle\", \"Tribesman\", \"Tribune\", \"Tribute\", \"Trickery\", \"Trickle\", \"Trickster\", \"Tricky\", \"Tricolor\", \"Tricycle\", \"Trident\", \"Trifle\", \"Trillion\", \"Trilogy\", \"Trimester\", \"Trimmer\", \"Trimness\", \"Trinity\", \"Trio\", \"Tripod\", \"Triumph\", \"Trodden\", \"Trombone\", \"Trophy\", \"Trout\", \"Trowel\", \"Truce\", \"Truck\", \"Truffle\", \"Trump\", \"Trustee\", \"Trustful\", \"Trustless\", \"Truth\", \"Tubby\", \"Tubeless\", \"Tubular\", \"Tug\", \"Tuition\", \"Tulip\", \"Tumble\", \"Tummy\", \"Turban\", \"Turbine\", \"Turbofan\", \"Turbojet\", \"Turbulent\", \"Turf\", \"Turkey\", \"Turmoil\", \"Turret\", \"Turtle\", \"Tusk\", \"Tutor\", \"Tutu\", \"Tux\", \"Tweak\", \"Tweed\", \"Tweet\", \"Twelve\", \"Twentieth\", \"Twenty\", \"Twerp\", \"Twiddle\", \"Twig\", \"Twilight\", \"Twine\", \"Twirl\", \"Twister\", \"Twisty\", \"Twitch\", \"Twitter\", \"Tycoon\", \"Tyke\", \"Udder\", \"Ultimate\", \"Ultimatum\", \"Ultra\", \"Umbrella\", \"Umpire\", \"Unafraid\", \"Unaware\", \"Unbalance\", \"Unbend\", \"Unbent\", \"Unblock\", \"Unbridle\", \"Unbundle\", \"Unbutton\", \"Uncanny\", \"Uncertain\", \"Unchain\", \"Uncheck\", \"Uncivil\", \"Unclad\", \"Unclasp\", \"Uncle\", \"Unclip\", \"Uncloak\", \"Unclog\", \"Uncommon\", \"Uncork\", \"Uncouple\", \"Uncouth\", \"Uncover\", \"Uncut\", \"Undead\", \"Underage\", \"Underarm\", \"Undercoat\", \"Undercook\", \"Undercut\", \"Underdog\", \"Underdone\", \"Underfed\", \"Underfeed\", \"Underfoot\", \"Undergo\", \"Undergrad\", \"Underhand\", \"Underline\", \"Undermine\", \"Undermost\", \"Underpaid\", \"Underpass\", \"Underpay\", \"Underrate\", \"Undertone\", \"Undertook\", \"Undertow\", \"Underuse\", \"Underwent\", \"Underwire\", \"Undone\", \"Undress\", \"Unearth\", \"Unease\", \"Unfair\", \"Unfold\", \"Unfreeze\", \"Unglue\", \"Unheard\", \"Unhidden\", \"Unhinge\", \"Unholy\", \"Unhook\", \"Unicycle\", \"Unifier\", \"Uninstall\", \"Unison\", \"Unit\", \"Universal\", \"Universe\", \"Unkempt\", \"Unlatch\", \"Unleash\", \"Unlit\", \"Unloader\", \"Unmade\", \"Unnerve\", \"Unpack\", \"Unpaid\", \"Unplug\", \"Unquote\", \"Unread\", \"Unreal\", \"Unripe\", \"Unroll\", \"Unruly\", \"Unsaddle\", \"Unsaid\", \"Unsavory\", \"Unscrew\", \"Unseen\", \"Unselect\", \"Unsent\", \"Unshackle\", \"Unsheathe\", \"Unsnap\", \"Unsold\", \"Unstaffed\", \"Unstitch\", \"Unstuck\", \"Unstuffed\", \"Unsubtle\", \"Unsure\", \"Unthread\", \"Untidy\", \"Untie\", \"Untold\", \"Untrue\", \"Untruth\", \"Untwist\", \"Unwelcome\", \"Unwell\", \"Unwieldy\", \"Unworthy\", \"Unwound\", \"Unzip\", \"Upbeat\", \"Upchuck\", \"Upcountry\", \"Update\", \"Upfront\", \"Upgrade\", \"Upheaval\", \"Upheld\", \"Uphill\", \"Uphold\", \"Upload\", \"Upright\", \"Upriver\", \"Uproar\", \"Uproot\", \"Upscale\", \"Upstage\", \"Upstart\", \"Upstate\", \"Upstream\", \"Upstroke\", \"Uptight\", \"Uranium\", \"Urban\", \"Urethane\", \"Urgency\", \"Urgent\", \"Urologist\", \"Urology\", \"Usage\", \"User\", \"Usher\", \"Utensil\", \"Utility\", \"Utmost\", \"Utopia\", \"Utter\", \"Vacancy\", \"Vacant\", \"Vacate\", \"Vacation\", \"Vagabond\", \"Vagrancy\", \"Vagueness\", \"Valiant\", \"Valium\", \"Value\", \"Vanilla\", \"Vanity\", \"Vantage\", \"Vaporizer\", \"Variety\", \"Varmint\", \"Varsity\", \"Vaseline\", \"Vastness\", \"Veal\", \"Veggie\", \"Velcro\", \"Velocity\", \"Velvet\", \"Vendetta\", \"Vendor\", \"Ventricle\", \"Venture\", \"Venue\", \"Venus\", \"Verdict\", \"Verse\", \"Version\", \"Versus\", \"Vertebrae\", \"Vertigo\", \"Vessel\", \"Veteran\", \"Veto\", \"Viability\", \"Vicinity\", \"Victory\", \"Video\", \"Viewer\", \"Viewless\", \"Viewpoint\", \"Village\", \"Villain\", \"Vindicate\", \"Vineyard\", \"Vintage\", \"Violate\", \"Violation\", \"Violator\", \"Violet\", \"Violin\", \"Viper\", \"Virus\", \"Viscosity\", \"Viselike\", \"Vision\", \"Visitor\", \"Visor\", \"Vista\", \"Vitality\", \"Vividness\", \"Vixen\", \"Vocalist\", \"Vocation\", \"Voice\", \"Void\", \"Volatile\", \"Voltage\", \"Voter\", \"Voucher\", \"Vowel\", \"Voyage\", \"Wackiness\", \"Wad\", \"Wafer\", \"Waffle\", \"Wager\", \"Waggle\", \"Wagon\", \"Walk\", \"Walmart\", \"Walnut\", \"Walrus\", \"Waltz\", \"Wand\", \"Wannabe\", \"Wasabi\", \"Washbasin\", \"Washboard\", \"Washbowl\", \"Washday\", \"Washroom\", \"Washstand\", \"Washtub\", \"Wasp\", \"Watch\", \"Water\", \"Waviness\", \"Wharf\", \"Wheat\", \"Whiff\", \"Whinny\", \"Whiny\", \"Whoopee\", \"Wick\", \"Widow\", \"Width\", \"Wielder\", \"Wife\", \"Wifi\", \"Wildcard\", \"Wildcat\", \"Wilder\", \"Wildfire\", \"Wildfowl\", \"Wildland\", \"Wildlife\", \"Wildness\", \"Wilt\", \"Wimp\", \"Wince\", \"Winner\", \"Winter\", \"Wipe\", \"Wireless\", \"Wiry\", \"Wisdom\", \"Wise\", \"Wispy\", \"Wizard\", \"Wok\", \"Wolf\", \"Wolverine\", \"Womanhood\", \"Womanless\", \"Womb\", \"Woof\", \"Wool\", \"Woozy\", \"Word\", \"Work\", \"Worry\", \"Wow\", \"Wrangle\", \"Wrath\", \"Wreath\", \"Wreckage\", \"Wrecker\", \"Wrench\", \"Wriggle\", \"Wrinkle\", \"Wrist\", \"Wrongdoer\", \"Wrongness\", \"Xbox\", \"Xerox\", \"Yahoo\", \"Yam\", \"Yard\", \"Yarn\", \"Yeah\", \"Yearbook\", \"Yeast\", \"Yelp\", \"Yen\", \"Yesterday\", \"Yield\", \"Yin\", \"Yippee\", \"Yo-yo\", \"Yodel\", \"Yoga\", \"Yogurt\", \"Yonder\", \"Yoyo\", \"Yummy\", \"Zap\", \"Zebra\", \"Zen\", \"Zeppelin\", \"Zero\", \"Zesty\", \"Zipfile\", \"Zit\", \"Zodiac\", \"Zombie\", \"Zone\", \"Zookeeper\", \"Zoologist\", \"Zoology\", \"Zoom\"];\n"
  },
  {
    "path": "src/data/effWordlist.js",
    "content": "// From https://www.eff.org/deeplinks/2016/07/new-wordlists-random-passphrases\n// Used by github.com/cryptag/cryptag/share\nconst effWordlist = [\n  \"Aardvark\", \"Abandoned\", \"Abbreviate\", \"Abdomen\", \"Abhorrence\", \"Abiding\", \"Abnormal\", \"Abrasion\", \"Absorbing\", \"Abundant\", \"Abyss\", \"Academy\", \"Accountant\", \"Acetone\", \"Achiness\", \"Acid\", \"Acoustics\", \"Acquire\", \"Acrobat\", \"Actress\", \"Acuteness\", \"Aerosol\", \"Aesthetic\", \"Affidavit\", \"Afloat\", \"Afraid\", \"Aftershave\", \"Again\", \"Agency\", \"Aggressor\", \"Aghast\", \"Agitate\", \"Agnostic\", \"Agonizing\", \"Agreeing\", \"Aidless\", \"Aimlessly\", \"Ajar\", \"Alarmclock\", \"Albatross\", \"Alchemy\", \"Alfalfa\", \"Algae\", \"Aliens\", \"Alkaline\", \"Almanac\", \"Alongside\", \"Alphabet\", \"Already\", \"Also\", \"Altitude\", \"Aluminum\", \"Always\", \"Amazingly\", \"Ambulance\", \"Amendment\", \"Amiable\", \"Ammunition\", \"Amnesty\", \"Amoeba\", \"Amplifier\", \"Amuser\", \"Anagram\", \"Anchor\", \"Android\", \"Anesthesia\", \"Angelfish\", \"Animal\", \"Anklet\", \"Announcer\", \"Anonymous\", \"Answer\", \"Antelope\", \"Anxiety\", \"Anyplace\", \"Aorta\", \"Apartment\", \"Apnea\", \"Apostrophe\", \"Apple\", \"Apricot\", \"Aquamarine\", \"Arachnid\", \"Arbitrate\", \"Ardently\", \"Arena\", \"Argument\", \"Aristocrat\", \"Armchair\", \"Aromatic\", \"Arrowhead\", \"Arsonist\", \"Artichoke\", \"Asbestos\", \"Ascend\", \"Aseptic\", \"Ashamed\", \"Asinine\", \"Asleep\", \"Asocial\", \"Asparagus\", \"Astronaut\", \"Asymmetric\", \"Atlas\", \"Atmosphere\", \"Atom\", \"Atrocious\", \"Attic\", \"Atypical\", \"Auctioneer\", \"Auditorium\", \"Augmented\", \"Auspicious\", \"Automobile\", \"Auxiliary\", \"Avalanche\", \"Avenue\", \"Aviator\", \"Avocado\", \"Awareness\", \"Awhile\", \"Awkward\", \"Awning\", \"Awoke\", \"Axially\", \"Azalea\", \"Babbling\", \"Backpack\", \"Badass\", \"Bagpipe\", \"Bakery\", \"Balancing\", \"Bamboo\", \"Banana\", \"Barracuda\", \"Basket\", \"Bathrobe\", \"Bazooka\", \"Blade\", \"Blender\", \"Blimp\", \"Blouse\", \"Blurred\", \"Boatyard\", \"Bobcat\", \"Body\", \"Bogusness\", \"Bohemian\", \"Boiler\", \"Bonnet\", \"Boots\", \"Borough\", \"Bossiness\", \"Bottle\", \"Bouquet\", \"Boxlike\", \"Breath\", \"Briefcase\", \"Broom\", \"Brushes\", \"Bubblegum\", \"Buckle\", \"Buddhist\", \"Buffalo\", \"Bullfrog\", \"Bunny\", \"Busboy\", \"Buzzard\", \"Cabin\", \"Cactus\", \"Cadillac\", \"Cafeteria\", \"Cage\", \"Cahoots\", \"Cajoling\", \"Cakewalk\", \"Calculator\", \"Camera\", \"Canister\", \"Capsule\", \"Carrot\", \"Cashew\", \"Cathedral\", \"Caucasian\", \"Caviar\", \"Ceasefire\", \"Cedar\", \"Celery\", \"Cement\", \"Census\", \"Ceramics\", \"Cesspool\", \"Chalkboard\", \"Cheesecake\", \"Chimney\", \"Chlorine\", \"Chopsticks\", \"Chrome\", \"Chute\", \"Cilantro\", \"Cinnamon\", \"Circle\", \"Cityscape\", \"Civilian\", \"Clay\", \"Clergyman\", \"Clipboard\", \"Clock\", \"Clubhouse\", \"Coathanger\", \"Cobweb\", \"Coconut\", \"Codeword\", \"Coexistent\", \"Coffeecake\", \"Cognitive\", \"Cohabitate\", \"Collarbone\", \"Computer\", \"Confetti\", \"Copier\", \"Cornea\", \"Cosmetics\", \"Cotton\", \"Couch\", \"Coverless\", \"Coyote\", \"Coziness\", \"Crawfish\", \"Crewmember\", \"Crib\", \"Croissant\", \"Crumble\", \"Crystal\", \"Cubical\", \"Cucumber\", \"Cuddly\", \"Cufflink\", \"Cuisine\", \"Culprit\", \"Cup\", \"Curry\", \"Cushion\", \"Cuticle\", \"Cybernetic\", \"Cyclist\", \"Cylinder\", \"Cymbal\", \"Cynicism\", \"Cypress\", \"Cytoplasm\", \"Dachshund\", \"Daffodil\", \"Dagger\", \"Dairy\", \"Dalmatian\", \"Dandelion\", \"Dartboard\", \"Dastardly\", \"Datebook\", \"Daughter\", \"Dawn\", \"Daytime\", \"Dazzler\", \"Dealer\", \"Debris\", \"Decal\", \"Dedicate\", \"Deepness\", \"Defrost\", \"Degree\", \"Dehydrator\", \"Deliverer\", \"Democrat\", \"Dentist\", \"Deodorant\", \"Depot\", \"Deranged\", \"Desktop\", \"Detergent\", \"Device\", \"Dexterity\", \"Diamond\", \"Dibs\", \"Dictionary\", \"Diffuser\", \"Digit\", \"Dilated\", \"Dimple\", \"Dinnerware\", \"Dioxide\", \"Diploma\", \"Directory\", \"Dishcloth\", \"Ditto\", \"Dividers\", \"Dizziness\", \"Doctor\", \"Dodge\", \"Doll\", \"Dominoes\", \"Donut\", \"Doorstep\", \"Dorsal\", \"Double\", \"Downstairs\", \"Dozed\", \"Drainpipe\", \"Dresser\", \"Driftwood\", \"Droppings\", \"Drum\", \"Dryer\", \"Dubiously\", \"Duckling\", \"Duffel\", \"Dugout\", \"Dumpster\", \"Duplex\", \"Durable\", \"Dustpan\", \"Dutiful\", \"Duvet\", \"Dwarfism\", \"Dwelling\", \"Dwindling\", \"Dynamite\", \"Dyslexia\", \"Eagerness\", \"Earlobe\", \"Easel\", \"Eavesdrop\", \"Ebook\", \"Eccentric\", \"Echoless\", \"Eclipse\", \"Ecosystem\", \"Ecstasy\", \"Edged\", \"Editor\", \"Educator\", \"Eelworm\", \"Eerie\", \"Effects\", \"Eggnog\", \"Egomaniac\", \"Ejection\", \"Elastic\", \"Elbow\", \"Elderly\", \"Elephant\", \"Elfishly\", \"Eliminator\", \"Elk\", \"Elliptical\", \"Elongated\", \"Elsewhere\", \"Elusive\", \"Elves\", \"Emancipate\", \"Embroidery\", \"Emcee\", \"Emerald\", \"Emission\", \"Emoticon\", \"Emperor\", \"Emulate\", \"Enactment\", \"Enchilada\", \"Endorphin\", \"Energy\", \"Enforcer\", \"Engine\", \"Enhance\", \"Enigmatic\", \"Enjoyably\", \"Enlarged\", \"Enormous\", \"Enquirer\", \"Enrollment\", \"Ensemble\", \"Entryway\", \"Enunciate\", \"Envoy\", \"Enzyme\", \"Epidemic\", \"Equipment\", \"Erasable\", \"Ergonomic\", \"Erratic\", \"Eruption\", \"Escalator\", \"Eskimo\", \"Esophagus\", \"Espresso\", \"Essay\", \"Estrogen\", \"Etching\", \"Eternal\", \"Ethics\", \"Etiquette\", \"Eucalyptus\", \"Eulogy\", \"Euphemism\", \"Euthanize\", \"Evacuation\", \"Evergreen\", \"Evidence\", \"Evolution\", \"Exam\", \"Excerpt\", \"Exerciser\", \"Exfoliate\", \"Exhale\", \"Exist\", \"Exorcist\", \"Explode\", \"Exquisite\", \"Exterior\", \"Exuberant\", \"Fabric\", \"Factory\", \"Faded\", \"Failsafe\", \"Falcon\", \"Family\", \"Fanfare\", \"Fasten\", \"Faucet\", \"Favorite\", \"Feasibly\", \"February\", \"Federal\", \"Feedback\", \"Feigned\", \"Feline\", \"Femur\", \"Fence\", \"Ferret\", \"Festival\", \"Fettuccine\", \"Feudalist\", \"Feverish\", \"Fiberglass\", \"Fictitious\", \"Fiddle\", \"Figurine\", \"Fillet\", \"Finalist\", \"Fiscally\", \"Fixture\", \"Flashlight\", \"Fleshiness\", \"Flight\", \"Florist\", \"Flypaper\", \"Foamless\", \"Focus\", \"Foggy\", \"Folksong\", \"Fondue\", \"Footpath\", \"Fossil\", \"Fountain\", \"Fox\", \"Fragment\", \"Freeway\", \"Fridge\", \"Frosting\", \"Fruit\", \"Fryingpan\", \"Gadget\", \"Gainfully\", \"Gallstone\", \"Gamekeeper\", \"Gangway\", \"Garlic\", \"Gaslight\", \"Gathering\", \"Gauntlet\", \"Gearbox\", \"Gecko\", \"Gem\", \"Generator\", \"Geographer\", \"Gerbil\", \"Gesture\", \"Getaway\", \"Geyser\", \"Ghoulishly\", \"Gibberish\", \"Giddiness\", \"Giftshop\", \"Gigabyte\", \"Gimmick\", \"Giraffe\", \"Giveaway\", \"Gizmo\", \"Glasses\", \"Gleeful\", \"Glisten\", \"Glove\", \"Glucose\", \"Glycerin\", \"Gnarly\", \"Gnomish\", \"Goatskin\", \"Goggles\", \"Goldfish\", \"Gong\", \"Gooey\", \"Gorgeous\", \"Gosling\", \"Gothic\", \"Gourmet\", \"Governor\", \"Grape\", \"Greyhound\", \"Grill\", \"Groundhog\", \"Grumbling\", \"Guacamole\", \"Guerrilla\", \"Guitar\", \"Gullible\", \"Gumdrop\", \"Gurgling\", \"Gusto\", \"Gutless\", \"Gymnast\", \"Gynecology\", \"Gyration\", \"Habitat\", \"Hacking\", \"Haggard\", \"Haiku\", \"Halogen\", \"Hamburger\", \"Handgun\", \"Happiness\", \"Hardhat\", \"Hastily\", \"Hatchling\", \"Haughty\", \"Hazelnut\", \"Headband\", \"Hedgehog\", \"Hefty\", \"Heinously\", \"Helmet\", \"Hemoglobin\", \"Henceforth\", \"Herbs\", \"Hesitation\", \"Hexagon\", \"Hubcap\", \"Huddling\", \"Huff\", \"Hugeness\", \"Hullabaloo\", \"Human\", \"Hunter\", \"Hurricane\", \"Hushing\", \"Hyacinth\", \"Hybrid\", \"Hydrant\", \"Hygienist\", \"Hypnotist\", \"Ibuprofen\", \"Icepack\", \"Icing\", \"Iconic\", \"Identical\", \"Idiocy\", \"Idly\", \"Igloo\", \"Ignition\", \"Iguana\", \"Illuminate\", \"Imaging\", \"Imbecile\", \"Imitator\", \"Immigrant\", \"Imprint\", \"Iodine\", \"Ionosphere\", \"Ipad\", \"Iphone\", \"Iridescent\", \"Irksome\", \"Iron\", \"Irrigation\", \"Island\", \"Isotope\", \"Issueless\", \"Italicize\", \"Itemizer\", \"Itinerary\", \"Itunes\", \"Ivory\", \"Jabbering\", \"Jackrabbit\", \"Jaguar\", \"Jailhouse\", \"Jalapeno\", \"Jamboree\", \"Janitor\", \"Jarring\", \"Jasmine\", \"Jaundice\", \"Jawbreaker\", \"Jaywalker\", \"Jazz\", \"Jealous\", \"Jeep\", \"Jelly\", \"Jeopardize\", \"Jersey\", \"Jetski\", \"Jezebel\", \"Jiffy\", \"Jigsaw\", \"Jingling\", \"Jobholder\", \"Jockstrap\", \"Jogging\", \"John\", \"Joinable\", \"Jokingly\", \"Journal\", \"Jovial\", \"Joystick\", \"Jubilant\", \"Judiciary\", \"Juggle\", \"Juice\", \"Jujitsu\", \"Jukebox\", \"Jumpiness\", \"Junkyard\", \"Juror\", \"Justifying\", \"Juvenile\", \"Kabob\", \"Kamikaze\", \"Kangaroo\", \"Karate\", \"Kayak\", \"Keepsake\", \"Kennel\", \"Kerosene\", \"Ketchup\", \"Khaki\", \"Kickstand\", \"Kilogram\", \"Kimono\", \"Kingdom\", \"Kiosk\", \"Kissing\", \"Kite\", \"Kleenex\", \"Knapsack\", \"Kneecap\", \"Knickers\", \"Koala\", \"Krypton\", \"Laboratory\", \"Ladder\", \"Lakefront\", \"Lantern\", \"Laptop\", \"Laryngitis\", \"Lasagna\", \"Latch\", \"Laundry\", \"Lavender\", \"Laxative\", \"Lazybones\", \"Lecturer\", \"Leftover\", \"Leggings\", \"Leisure\", \"Lemon\", \"Length\", \"Leopard\", \"Leprechaun\", \"Lettuce\", \"Leukemia\", \"Levers\", \"Lewdness\", \"Liability\", \"Library\", \"Licorice\", \"Lifeboat\", \"Lightbulb\", \"Likewise\", \"Lilac\", \"Limousine\", \"Lint\", \"Lioness\", \"Lipstick\", \"Liquid\", \"Listless\", \"Litter\", \"Liverwurst\", \"Lizard\", \"Llama\", \"Luau\", \"Lubricant\", \"Lucidity\", \"Ludicrous\", \"Luggage\", \"Lukewarm\", \"Lullaby\", \"Lumberjack\", \"Lunchbox\", \"Luridness\", \"Luscious\", \"Luxurious\", \"Lyrics\", \"Macaroni\", \"Maestro\", \"Magazine\", \"Mahogany\", \"Maimed\", \"Majority\", \"Makeover\", \"Malformed\", \"Mammal\", \"Mango\", \"Mapmaker\", \"Marbles\", \"Massager\", \"Matchstick\", \"Maverick\", \"Maximum\", \"Mayonnaise\", \"Moaning\", \"Mobilize\", \"Moccasin\", \"Modify\", \"Moisture\", \"Molecule\", \"Momentum\", \"Monastery\", \"Moonshine\", \"Mortuary\", \"Mosquito\", \"Motorcycle\", \"Mousetrap\", \"Movie\", \"Mower\", \"Mozzarella\", \"Muckiness\", \"Mudflow\", \"Mugshot\", \"Mule\", \"Mummy\", \"Mundane\", \"Muppet\", \"Mural\", \"Mustard\", \"Mutation\", \"Myriad\", \"Myspace\", \"Myth\", \"Nail\", \"Namesake\", \"Nanosecond\", \"Napkin\", \"Narrator\", \"Nastiness\", \"Natives\", \"Nautically\", \"Navigate\", \"Nearest\", \"Nebula\", \"Nectar\", \"Nefarious\", \"Negotiator\", \"Neither\", \"Nemesis\", \"Neoliberal\", \"Nephew\", \"Nervously\", \"Nest\", \"Netting\", \"Neuron\", \"Nevermore\", \"Nextdoor\", \"Nicotine\", \"Niece\", \"Nimbleness\", \"Nintendo\", \"Nirvana\", \"Nuclear\", \"Nugget\", \"Nuisance\", \"Nullify\", \"Numbing\", \"Nuptials\", \"Nursery\", \"Nutcracker\", \"Nylon\", \"Oasis\", \"Oat\", \"Obediently\", \"Obituary\", \"Object\", \"Obliterate\", \"Obnoxious\", \"Observer\", \"Obtain\", \"Obvious\", \"Occupation\", \"Oceanic\", \"Octopus\", \"Ocular\", \"Office\", \"Oftentimes\", \"Oiliness\", \"Ointment\", \"Older\", \"Olympics\", \"Omissible\", \"Omnivorous\", \"Oncoming\", \"Onion\", \"Onlooker\", \"Onstage\", \"Onward\", \"Onyx\", \"Oomph\", \"Opaquely\", \"Opera\", \"Opium\", \"Opossum\", \"Opponent\", \"Optical\", \"Opulently\", \"Oscillator\", \"Osmosis\", \"Ostrich\", \"Otherwise\", \"Ought\", \"Outhouse\", \"Ovation\", \"Oven\", \"Owlish\", \"Oxford\", \"Oxidize\", \"Oxygen\", \"Oyster\", \"Ozone\", \"Pacemaker\", \"Padlock\", \"Pageant\", \"Pajamas\", \"Palm\", \"Pamphlet\", \"Pantyhose\", \"Paprika\", \"Parakeet\", \"Passport\", \"Patio\", \"Pauper\", \"Pavement\", \"Payphone\", \"Pebble\", \"Peculiarly\", \"Pedometer\", \"Pegboard\", \"Pelican\", \"Penguin\", \"Peony\", \"Pepperoni\", \"Peroxide\", \"Pesticide\", \"Petroleum\", \"Pewter\", \"Pharmacy\", \"Pheasant\", \"Phonebook\", \"Phrasing\", \"Physician\", \"Plank\", \"Pledge\", \"Plotted\", \"Plug\", \"Plywood\", \"Pneumonia\", \"Podiatrist\", \"Poetic\", \"Pogo\", \"Poison\", \"Poking\", \"Policeman\", \"Poncho\", \"Popcorn\", \"Porcupine\", \"Postcard\", \"Poultry\", \"Powerboat\", \"Prairie\", \"Pretzel\", \"Princess\", \"Propeller\", \"Prune\", \"Pry\", \"Pseudo\", \"Psychopath\", \"Publisher\", \"Pucker\", \"Pueblo\", \"Pulley\", \"Pumpkin\", \"Punchbowl\", \"Puppy\", \"Purse\", \"Pushup\", \"Putt\", \"Puzzle\", \"Pyramid\", \"Python\", \"Quarters\", \"Quesadilla\", \"Quilt\", \"Quote\", \"Racoon\", \"Radish\", \"Ragweed\", \"Railroad\", \"Rampantly\", \"Rancidity\", \"Rarity\", \"Raspberry\", \"Ravishing\", \"Rearrange\", \"Rebuilt\", \"Receipt\", \"Reentry\", \"Refinery\", \"Register\", \"Rehydrate\", \"Reimburse\", \"Rejoicing\", \"Rekindle\", \"Relic\", \"Remote\", \"Renovator\", \"Reopen\", \"Reporter\", \"Request\", \"Rerun\", \"Reservoir\", \"Retriever\", \"Reunion\", \"Revolver\", \"Rewrite\", \"Rhapsody\", \"Rhetoric\", \"Rhino\", \"Rhubarb\", \"Rhyme\", \"Ribbon\", \"Riches\", \"Ridden\", \"Rigidness\", \"Rimmed\", \"Riptide\", \"Riskily\", \"Ritzy\", \"Riverboat\", \"Roamer\", \"Robe\", \"Rocket\", \"Romancer\", \"Ropelike\", \"Rotisserie\", \"Roundtable\", \"Royal\", \"Rubber\", \"Rudderless\", \"Rugby\", \"Ruined\", \"Rulebook\", \"Rummage\", \"Running\", \"Rupture\", \"Rustproof\", \"Sabotage\", \"Sacrifice\", \"Saddlebag\", \"Saffron\", \"Sainthood\", \"Saltshaker\", \"Samurai\", \"Sandworm\", \"Sapphire\", \"Sardine\", \"Sassy\", \"Satchel\", \"Sauna\", \"Savage\", \"Saxophone\", \"Scarf\", \"Scenario\", \"Schoolbook\", \"Scientist\", \"Scooter\", \"Scrapbook\", \"Sculpture\", \"Scythe\", \"Secretary\", \"Sedative\", \"Segregator\", \"Seismology\", \"Selected\", \"Semicolon\", \"Senator\", \"Septum\", \"Sequence\", \"Serpent\", \"Sesame\", \"Settler\", \"Severely\", \"Shack\", \"Shelf\", \"Shirt\", \"Shovel\", \"Shrimp\", \"Shuttle\", \"Shyness\", \"Siamese\", \"Sibling\", \"Siesta\", \"Silicon\", \"Simmering\", \"Singles\", \"Sisterhood\", \"Sitcom\", \"Sixfold\", \"Sizable\", \"Skateboard\", \"Skeleton\", \"Skies\", \"Skulk\", \"Skylight\", \"Slapping\", \"Sled\", \"Slingshot\", \"Sloth\", \"Slumbering\", \"Smartphone\", \"Smelliness\", \"Smitten\", \"Smokestack\", \"Smudge\", \"Snapshot\", \"Sneezing\", \"Sniff\", \"Snowsuit\", \"Snugness\", \"Speakers\", \"Sphinx\", \"Spider\", \"Splashing\", \"Sponge\", \"Sprout\", \"Spur\", \"Spyglass\", \"Squirrel\", \"Statue\", \"Steamboat\", \"Stingray\", \"Stopwatch\", \"Strawberry\", \"Student\", \"Stylus\", \"Suave\", \"Subway\", \"Suction\", \"Suds\", \"Suffocate\", \"Sugar\", \"Suitcase\", \"Sulphur\", \"Superstore\", \"Surfer\", \"Sushi\", \"Swan\", \"Sweatshirt\", \"Swimwear\", \"Sword\", \"Sycamore\", \"Syllable\", \"Symphony\", \"Synagogue\", \"Syringes\", \"Systemize\", \"Tablespoon\", \"Taco\", \"Tadpole\", \"Taekwondo\", \"Tagalong\", \"Takeout\", \"Tallness\", \"Tamale\", \"Tanned\", \"Tapestry\", \"Tarantula\", \"Tastebud\", \"Tattoo\", \"Tavern\", \"Thaw\", \"Theater\", \"Thimble\", \"Thorn\", \"Throat\", \"Thumb\", \"Thwarting\", \"Tiara\", \"Tidbit\", \"Tiebreaker\", \"Tiger\", \"Timid\", \"Tinsel\", \"Tiptoeing\", \"Tirade\", \"Tissue\", \"Tractor\", \"Tree\", \"Tripod\", \"Trousers\", \"Trucks\", \"Tryout\", \"Tubeless\", \"Tuesday\", \"Tugboat\", \"Tulip\", \"Tumbleweed\", \"Tupperware\", \"Turtle\", \"Tusk\", \"Tutorial\", \"Tuxedo\", \"Tweezers\", \"Twins\", \"Tyrannical\", \"Ultrasound\", \"Umbrella\", \"Umpire\", \"Unarmored\", \"Unbuttoned\", \"Uncle\", \"Underwear\", \"Unevenness\", \"Unflavored\", \"Ungloved\", \"Unhinge\", \"Unicycle\", \"Unjustly\", \"Unknown\", \"Unlocking\", \"Unmarked\", \"Unnoticed\", \"Unopened\", \"Unpaved\", \"Unquenched\", \"Unroll\", \"Unscrewing\", \"Untied\", \"Unusual\", \"Unveiled\", \"Unwrinkled\", \"Unyielding\", \"Unzip\", \"Upbeat\", \"Upcountry\", \"Update\", \"Upfront\", \"Upgrade\", \"Upholstery\", \"Upkeep\", \"Upload\", \"Uppercut\", \"Upright\", \"Upstairs\", \"Uptown\", \"Upwind\", \"Uranium\", \"Urban\", \"Urchin\", \"Urethane\", \"Urgent\", \"Urologist\", \"Username\", \"Usher\", \"Utensil\", \"Utility\", \"Utmost\", \"Utopia\", \"Utterance\", \"Vacuum\", \"Vagrancy\", \"Valuables\", \"Vanquished\", \"Vaporizer\", \"Varied\", \"Vaseline\", \"Vegetable\", \"Vehicle\", \"Velcro\", \"Vendor\", \"Vertebrae\", \"Vestibule\", \"Veteran\", \"Vexingly\", \"Vicinity\", \"Videogame\", \"Viewfinder\", \"Vigilante\", \"Village\", \"Vinegar\", \"Violin\", \"Viperfish\", \"Virus\", \"Visor\", \"Vitamins\", \"Vivacious\", \"Vixen\", \"Vocalist\", \"Vogue\", \"Voicemail\", \"Volleyball\", \"Voucher\", \"Voyage\", \"Vulnerable\", \"Waffle\", \"Wagon\", \"Wakeup\", \"Walrus\", \"Wanderer\", \"Wasp\", \"Water\", \"Waving\", \"Wheat\", \"Whisper\", \"Wholesaler\", \"Wick\", \"Widow\", \"Wielder\", \"Wifeless\", \"Wikipedia\", \"Wildcat\", \"Windmill\", \"Wipeout\", \"Wired\", \"Wishbone\", \"Wizardry\", \"Wobbliness\", \"Wolverine\", \"Womb\", \"Woolworker\", \"Workbasket\", \"Wound\", \"Wrangle\", \"Wreckage\", \"Wristwatch\", \"Wrongdoing\", \"Xerox\", \"Xylophone\", \"Yacht\", \"Yahoo\", \"Yard\", \"Yearbook\", \"Yesterday\", \"Yiddish\", \"Yield\", \"Yo-yo\", \"Yodel\", \"Yogurt\", \"Yuppie\", \"Zealot\", \"Zebra\", \"Zeppelin\", \"Zestfully\", \"Zigzagged\", \"Zillion\", \"Zipping\", \"Zirconium\", \"Zodiac\", \"Zombie\", \"Zookeeper\", \"Zucchini\",\n];\n\nexport default effWordlist;\n"
  },
  {
    "path": "src/data/minishare.js",
    "content": "const crypto = window.crypto || window.msCrypto;\n\nimport effWordlist from './effWordlist';\n\n// Excluding max\n//\n// Mostly from https://github.com/chancejs/chancejs/issues/232#issuecomment-182500222\nfunction randomIntsInRange(min, max, numInts){\n  let rand = new Uint32Array(numInts);\n  crypto.getRandomValues(rand);\n\n  let ints = new Uint32Array(numInts);\n  var zeroToOne = 0.0;\n\n  for(let i = 0; i < numInts; i++){\n    zeroToOne = rand[i]/(0xffffffff + 1);\n    // TODO: Do security audit of this for timing attacks\n    ints[i] = Math.floor(zeroToOne * (max - min)) + min;\n  }\n\n  return ints;\n}\n\nexport function genPassphrase(numWords=25){\n  let words = new Array(numWords);\n  let ndxs = randomIntsInRange(0, effWordlist.length, numWords);\n\n  for(let i = 0; i < numWords; i++){\n    words[i] = effWordlist[ndxs[i]];\n  }\n\n  return words.join(\"\");\n}\n"
  },
  {
    "path": "src/data/username.js",
    "content": "import { nouns, adjectives } from './constants';\n\nfunction getRandomAdjective(){\n  return adjectives[Math.floor(Math.random()*adjectives.length)];\n}\n\nfunction getRandomNoun(){\n  return nouns[Math.floor(Math.random()*nouns.length)];\n}\n\nexport function generateRandomUsername(){\n  return getRandomAdjective() + getRandomNoun();\n}"
  },
  {
    "path": "src/index-template.ejs",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n  <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width\">\n\n  <title>\n    <%= htmlWebpackPlugin.options.title %>\n  </title>\n</head>\n\n<body>\n  <div id=\"root\">\n  </div>\n\n  <audio id=\"notification-audio\" src=\"/notification_gertz.wav\"></audio>\n</body>\n\n</html>"
  },
  {
    "path": "src/index.js",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { Provider } from 'react-redux';\n\nimport { createStore, compose, applyMiddleware } from 'redux';\nimport { createEpicMiddleware } from 'redux-observable';\nimport rootReducer from './store/reducers';\nimport rootEpic from './store/epics';\n\nimport 'bootstrap/dist/css/bootstrap.css';\nimport './utils/vh_fix';\nimport './static/sass/main.scss';\nimport './static/fonts/Lato.ttf';\nimport './static/audio/notification_gertz.wav';\nimport './utils/detect_browser';\nimport './utils/origin_polyfill';\nimport App from './components/App';\n\nconst composeEnhancers =\n  typeof window === 'object' &&\n    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?   \n    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n      // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...\n    }) : compose;\n\nconst epicMiddleware = createEpicMiddleware(rootEpic);\nconst enhancer = composeEnhancers(\n  applyMiddleware(epicMiddleware)\n);\n\nconst store = createStore(rootReducer, enhancer);\n\nif (module.hot) {\n  module.hot.accept('./reducers', () =>\n    store.replaceReducer(require('./reducers'))\n  );\n}\n\nconst root = createRoot(\n  document.getElementById('root')\n);\n\nroot.render(\n  <Provider store={store}>\n    <App />\n  </Provider>\n);\n\n"
  },
  {
    "path": "src/static/assets.json",
    "content": "{\n\t\"stylesheets\": [\n\t\t\"static/lib/bootstrap/dist/css/bootstrap.css\",\n\t\t\"static/css/main.css\"\n\t],\n\t\"scripts\": [\n\t\t\"static/lib/jquery/dist/jquery.js\",\n\t\t\"static/lib/bootstrap/dist/js/bootstrap.js\",\n\t\t\"static/lib/fetch/fetch.js\",\n\t\t\"static/js/crypto/blake2s.js\",\n\t\t\"static/js/crypto/nacl.js\",\n\t\t\"static/js/crypto/nacl-stream.js\",\n\t\t\"static/js/crypto/scrypt.js\",\n\t\t\"static/js/base58.js\",\n\t\t\"static/js/miniLock.js\",\n\t\t\"static/js/ui.js\",\n\t\t\"build/app.js\"\n\t]\n}"
  },
  {
    "path": "src/static/css/Lato.css",
    "content": "@font-face {\n    font-family: 'Lato';\n    font-style: normal;\n    font-weight: 400;\n    src: local(\"Lato Regular\"), local(\"Lato-Regular\"), url(Lato.ttf) format(\"truetype\");\n}\n"
  },
  {
    "path": "src/static/js/emoji-fixed.js",
    "content": "\"use strict\";\n\n;(function() {\n\n  var root = this;\n  var previous_emoji = root.EmojiConvertor;\n\n\n  /**\n\t * @global\n\t * @namespace\n\t */\n\n  var emoji = function(){\n\n    var self = this;\n\n    /**\n\t\t * The set of images to use for graphical emoji.\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type {string}\n\t\t */\n    self.img_set = 'apple';\n\n    /**\n\t\t * Configuration details for different image sets. This includes a path to a directory containing the\n\t\t * individual images (`path`) and a URL to sprite sheets (`sheet`). All of these images can be found\n\t\t * in the [emoji-data repository]{@link https://github.com/iamcal/emoji-data}. Using a CDN for these\n\t\t * is not a bad idea.\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type {object}\n\t\t */\n    self.img_sets = {\n      'apple' : {'path' : '/emoji-data/img-apple-64/', 'sheet' : '/emoji-data/sheet_apple_64.png', 'sheet_size' : 64, 'mask' : 1},\n      'google' : {'path' : '/emoji-data/img-google-64/', 'sheet' : '/emoji-data/sheet_google_64.png', 'sheet_size' : 64, 'mask' : 2},\n      'twitter' : {'path' : '/emoji-data/img-twitter-64/', 'sheet' : '/emoji-data/sheet_twitter_64.png', 'sheet_size' : 64, 'mask' : 4},\n      'facebook' : {'path' : '/emoji-data/img-facebook-64/', 'sheet' : '/emoji-data/sheet_facebook_64.png', 'sheet_size' : 64, 'mask' : 8},\n      'messenger' : {'path' : '/emoji-data/img-messenger-64/', 'sheet' : '/emoji-data/sheet_messenger_64.png', 'sheet_size' : 64, 'mask' : 16},\n    };\n\n    /**\n\t\t * Use a CSS class instead of specifying a sprite or background image for\n\t\t * the span representing the emoticon. This requires a CSS sheet with\n\t\t * emoticon data-uris.\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t * @todo document how to build the CSS stylesheet self requires.\n\t\t */\n    self.use_css_imgs = false;\n\n    /**\n\t\t * Instead of replacing emoticons with the appropriate representations,\n\t\t * replace them with their colon string representation.\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.colons_mode = false;\n    self.text_mode = false;\n\n    /**\n\t\t * If true, sets the \"title\" property on the span or image that gets\n\t\t * inserted for the emoticon.\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.include_title = false;\n\n    /**\n\t\t * If true, sets the text of the span or image that gets inserted for the\n\t\t * emoticon.\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.include_text = false;\n\n    /**\n\t\t * If the platform supports native emoticons, use those instead\n\t\t * of the fallbacks.\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.allow_native = true;\n\n    /**\n\t\t * Wrap native with a <span class=\"emoji-native\"></span> to allow styling\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.wrap_native = false;\n\n    /**\n\t\t * Set to true to use CSS sprites instead of individual images on\n\t\t * platforms that support it.\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.use_sheet = false;\n\n    /**\n\t\t *\n\t\t * Set to true to avoid black & white native Windows emoji being used.\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.avoid_ms_emoji = true;\n\n    /**\n\t\t *\n\t\t * Set to true to allow :CAPITALIZATION:\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type bool\n\t\t */\n    self.allow_caps = false;\n\n\n    /**\n\t\t *\n\t\t * Suffix to allow for individual image cache busting\n\t\t *\n\t\t * @memberof emoji\n\t\t * @type string\n\t\t */\n    self.img_suffix = '';\n\n\n    // Keeps track of what has been initialized.\n    /** @private */\n    self.inits = {};\n    self.map = {};\n\n    // discover the environment settings\n    self.init_env();\n\n    return self;\n  };\n\n  emoji.prototype.noConflict = function(){\n    root.EmojiConvertor = previous_emoji;\n    return emoji;\n  };\n\n\n  /**\n\t * @memberof emoji\n\t * @param {string} str A string potentially containing ascii emoticons\n\t * (ie. `:)`)\n\t *\n\t * @returns {string} A new string with all emoticons in `str`\n\t * replaced by a representatation that's supported by the current\n\t * environtment.\n\t */\n  emoji.prototype.replace_emoticons = function(str){\n    var self = this;\n    var colonized = self.replace_emoticons_with_colons(str);\n    return self.replace_colons(colonized);\n  };\n\n  /**\n\t * @memberof emoji\n\t * @param {string} str A string potentially containing ascii emoticons\n\t * (ie. `:)`)\n\t *\n\t * @returns {string} A new string with all emoticons in `str`\n\t * replaced by their colon string representations (ie. `:smile:`)\n\t */\n  emoji.prototype.replace_emoticons_with_colons = function(str){\n    var self = this;\n    self.init_emoticons();\n    var _prev_offset = 0;\n    var emoticons_with_parens = [];\n    var str_replaced = str.replace(self.rx_emoticons, function(m, $1, emoticon, offset){\n      var prev_offset = _prev_offset;\n      _prev_offset = offset + m.length;\n\n      var has_open_paren = emoticon.indexOf('(') !== -1;\n      var has_close_paren = emoticon.indexOf(')') !== -1;\n\n      /*\n\t\t\t * Track paren-having emoticons for fixing later\n\t\t\t */\n      if ((has_open_paren || has_close_paren) && emoticons_with_parens.indexOf(emoticon) == -1) {\n        emoticons_with_parens.push(emoticon);\n      }\n\n      /*\n\t\t\t * Look for preceding open paren for emoticons that contain a close paren\n\t\t\t * This prevents matching \"8)\" inside \"(around 7 - 8)\"\n\t\t\t */\n      if (has_close_paren && !has_open_paren) {\n        var piece = str.substring(prev_offset, offset);\n        if (piece.indexOf('(') !== -1 && piece.indexOf(')') === -1) return m;\n      }\n\n      /*\n\t\t\t * See if we're in a numbered list\n\t\t\t * This prevents matching \"8)\" inside \"7) foo\\n8) bar\"\n\t\t\t */\n      if (m === '\\n8)') {\n        var before_match = str.substring(0, offset);\n        if (/\\n?(6\\)|7\\))/.test(before_match)) return m;\n      }\n\n      var val = self.data[self.map.emoticons[emoticon]][3][0];\n      return val ? $1+':'+val+':' : m;\n    });\n\n    /*\n\t\t * Come back and fix emoticons we ignored because they were inside parens.\n\t\t * It's useful to do self at the end so we don't get tripped up by other,\n\t\t * normal emoticons\n\t\t */\n    if (emoticons_with_parens.length) {\n      var escaped_emoticons = emoticons_with_parens.map(self.escape_rx);\n      var parenthetical_rx = new RegExp('(\\\\(.+)('+escaped_emoticons.join('|')+')(.+\\\\))', 'g');\n\n      str_replaced = str_replaced.replace(parenthetical_rx, function(m, $1, emoticon, $2) {\n        var val = self.data[self.map.emoticons[emoticon]][3][0];\n        return val ? $1+':'+val+':'+$2 : m;\n      });\n    }\n\n    return str_replaced;\n  };\n\n  /**\n\t * @memberof emoji\n\t * @param {string} str A string potentially containing colon string\n\t * representations of emoticons (ie. `:smile:`)\n\t *\n\t * @returns {string} A new string with all colon string emoticons replaced\n\t * with the appropriate representation.\n\t */\n  emoji.prototype.replace_colons = function(str){\n    var self = this;\n    self.init_colons();\n\n    return str.replace(self.rx_colons, function(m){\n      var idx = m.substr(1, m.length-2);\n      if (self.allow_caps) idx = idx.toLowerCase();\n\n      // special case - an emoji with a skintone modified\n      if (idx.indexOf('::skin-tone-') > -1){\n\n        var skin_tone = idx.substr(-1, 1);\n        var skin_idx = 'skin-tone-'+skin_tone;\n        var skin_val = self.map.colons[skin_idx];\n\n        idx = idx.substr(0, idx.length - 13);\n\n        var val = self.map.colons[idx];\n        if (val){\n          return self.replacement(val, idx, ':', {\n            'idx'\t\t: skin_val,\n            'actual'\t: skin_idx,\n            'wrapper'\t: ':'\n          });\n        }else{\n          return ':' + idx + ':' + self.replacement(skin_val, skin_idx, ':');\n        }\n      }else{\n        var val = self.map.colons[idx];\n        return val ? self.replacement(val, idx, ':') : m;\n      }\n    });\n  };\n\n  /**\n\t * @memberof emoji\n\t * @param {string} str A string potentially containing unified unicode\n\t * emoticons. (ie. 😄)\n\t *\n\t * @returns {string} A new string with all unicode emoticons replaced with\n\t * the appropriate representation for the current environment.\n\t */\n  emoji.prototype.replace_unified = function(str){\n    var self = this;\n    self.init_unified();\n    return str.replace(self.rx_unified, function(m, p1, p2){\n\n      var val = self.map.unified[p1];\n      if (val){\n        var idx = null;\n        if (p2 == '\\uD83C\\uDFFB') idx = '1f3fb';\n        if (p2 == '\\uD83C\\uDFFC') idx = '1f3fc';\n        if (p2 == '\\uD83C\\uDFFD') idx = '1f3fd';\n        if (p2 == '\\uD83C\\uDFFE') idx = '1f3fe';\n        if (p2 == '\\uD83C\\uDFFF') idx = '1f3ff';\n        if (idx){\n          return self.replacement(val, null, null, {\n            idx\t: idx,\n            actual\t: p2,\n            wrapper\t: ''\n          });\n        }\n        return self.replacement(val);\n      }\n\n      val = self.map.unified_vars[p1];\n      if (val){\n        return self.replacement(val[0], null, null, {\n          'idx'\t\t: val[1],\n          'actual'\t: '',\n          'wrapper'\t: '',\n        });\n      }\n\n      return m;\n    });\n  };\n\n  emoji.prototype.addAliases = function(map){\n    var self = this;\n\n    self.init_colons();\n    for (var i in map){\n      self.map.colons[i] = map[i];\n    }\n  };\n\n  emoji.prototype.removeAliases = function(list){\n    var self = this;\n\n    for (var i=0; i<list.length; i++){\n      var alias = list[i];\n\n      // first, delete the alias mapping\n      delete self.map.colons[alias];\n\n      // now reset it to the default, if one exists\n      finder_block: {\n        for (var j in self.data){\n          for (var k=0; k<self.data[j][3].length; k++){\n            if (alias == self.data[j][3][k]){\n              self.map.colons[alias] = j;\n              break finder_block;\n            }\n          }\n        }\n      }\n    }\n  };\n\n\n  // Does the actual replacement of a character with the appropriate\n  /** @private */\n  emoji.prototype.replacement = function(idx, actual, wrapper, variation, is_extra){\n    var self = this;\n\n    var full_idx = idx;\n\n    // for emoji with variation modifiers, set `extra` to the standalone output for the\n    // modifier (used if we can't combine the glyph) and set variation_idx to key of the\n    // variation modifier (used below)\n    var extra = '';\n    var var_idx = null;\n    if (typeof variation === 'object'){\n      extra = self.replacement(variation.idx, variation.actual, variation.wrapper, undefined, true);\n      var_idx = variation.idx;\n    }\n\n    // deal with simple modes (colons and text) first\n    wrapper = wrapper || '';\n    if (self.colons_mode) return ':'+self.data[idx][3][0]+':'+extra;\n    var text_name = (actual) ? wrapper+actual+wrapper : self.data[idx][8] || wrapper+self.data[idx][3][0]+wrapper;\n    if (self.text_mode) return text_name + extra;\n\n    // figure out which images and code points to use, based on the skin variations. this information is also used for\n    // unified native output mode\n    var img = self.find_image(idx, var_idx);\n\n    // native modes next.\n    // for variations selectors, we just need to output them raw, which `extra` will contain. since softbank and google don't\n    // support skin variations, we'll keep `extra` around, every if we have a valid variation selector\n    self.init_env();\n    if (self.replace_mode == 'softbank' && self.allow_native && self.data[idx][1]) return self.format_native(self.data[idx][1] + extra, !is_extra);\n    if (self.replace_mode == 'google'   && self.allow_native && self.data[idx][2]) return self.format_native(self.data[idx][2] + extra, !is_extra);\n\n    // for unified (and images, below), we can use the variation info and throw away the `extra` contents\n    if (img.is_var){\n      extra = '';\n    }\n    if (self.replace_mode == 'unified' && self.allow_native) return self.format_native(img.unified + extra, !is_extra);\n\n\n    // finally deal with image modes.\n    // the call to .find_image() earlier checked if the image set and particular emoji supports variations,\n    // otherwise we can return it as a separate image (already calculated in `extra`).\n    // first we set up the params we'll use if we can't use a variation.\n    var title = self.include_title ? ' title=\"'+(actual || self.data[idx][3][0])+'\"' : '';\n    var text  = self.include_text  ? wrapper+(actual || self.data[idx][3][0])+wrapper : '';\n\n    // custom image for this glyph?\n    if (self.data[idx][7]){\n      img.path = self.data[idx][7];\n      img.px = null;\n      img.py = null;\n      img.is_var = false;\n    }\n\n    // if we're displaying a variation, include it in the text\n    if (img.is_var && self.include_text && variation && variation.actual && variation.wrapper) {\n      text += variation.wrapper+variation.actual+variation.wrapper;\n    }\n\n    // output\n    if (self.supports_css) {\n      if (self.use_sheet && img.px != null && img.py != null){\n        var sheet_size = self.sheet_size * (img.sheet_size+2); // size of image in pixels\n        var sheet_x = 100 * (((img.px * (img.sheet_size+2)) + 1) / (sheet_size - img.sheet_size));\n        var sheet_y = 100 * (((img.py * (img.sheet_size+2)) + 1) / (sheet_size - img.sheet_size));\n        var sheet_sz = 100 * (sheet_size / img.sheet_size);\n\n        var style = 'background: url('+img.sheet+');background-position:'+(sheet_x)+'% '+(sheet_y)+'%;background-size:'+sheet_sz+'% '+sheet_sz+'%';\n        return '<span class=\"emoji-outer emoji-sizer\"><span class=\"emoji-inner\" style=\"'+style+'\"'+title+' data-codepoints=\"'+img.full_idx+'\">'+text+'</span></span>'+extra;\n      }else if (self.use_css_imgs){\n        return '<span class=\"emoji emoji-'+idx+'\"'+title+' data-codepoints=\"'+img.full_idx+'\">'+text+'</span>'+extra;\n      }else{\n        return '<span class=\"emoji emoji-sizer\" style=\"background-image:url('+img.path+')\"'+title+' data-codepoints=\"'+img.full_idx+'\">'+text+'</span>'+extra;\n      }\n    }\n    return '<img src=\"'+img.path+'\" class=\"emoji\" data-codepoints=\"'+img.full_idx+'\" '+title+'/>'+extra;\n  };\n\n  // Wraps the output of a native endpoint, if configured\n  /** @private */\n  emoji.prototype.format_native = function(native, allow_wrap){\n    var self = this;\n\n    if (self.wrap_native && allow_wrap){\n      return '<span class=\"emoji-native\">'+ native + '</span>';\n    }\n    return native;\n  };\n\n  // Finds the best image to display, taking into account image set precedence and obsoletes\n  /** @private */\n  emoji.prototype.find_image = function(idx, var_idx){\n    var self = this;\n\n    // set up some initial state\n    var out = {\n      'path'\t\t: '',\n      'sheet'\t\t: '',\n      'sheet_size'\t: 0,\n      'px'\t\t: self.data[idx][4],\n      'py'\t\t: self.data[idx][5],\n      'full_idx'\t: idx,\n      'is_var'\t: false,\n      'unified'\t: self.data[idx][0][0]\n    };\n    var use_mask = self.data[idx][6];\n\n    // can we use a variation?\n    if (var_idx && self.variations_data[idx] && self.variations_data[idx][var_idx]){\n      var var_data = self.variations_data[idx][var_idx];\n\n      out.px = var_data[1];\n      out.py = var_data[2];\n      out.full_idx = var_data[0];\n      out.is_var = true;\n      out.unified = var_data[4];\n      use_mask = var_data[3];\n    }\n\n    // this matches `build/build_image.php` `in emoji-data`, so that sheet and images modes always\n    // agree about the image to use.\n    var try_order = [self.img_set, 'apple', 'google', 'twitter', 'facebook', 'messenger'];\n\n    // for each image set, see if we have the image we need. otherwise check for an obsolete in\n    // that image set\n    for (var j=0; j<try_order.length; j++){\n      if (use_mask & self.img_sets[try_order[j]].mask){\n        out.path = self.img_sets[try_order[j]].path+out.full_idx+'.png' + self.img_suffix;\n        // if we're not changing glyph, use our base set for sheets - it has every glyph\n        out.sheet = self.img_sets[self.img_set].sheet;\n        out.sheet_size = self.img_sets[self.img_set].sheet_size;\n        return out;\n      }\n      if (self.obsoletes_data[out.full_idx]){\n        var ob_data = self.obsoletes_data[out.full_idx];\n\n        if (ob_data[3] & self.img_sets[try_order[j]].mask){\n          out.path = self.img_sets[try_order[j]].path+ob_data[0]+'.png' + self.img_suffix;\n          out.sheet = self.img_sets[try_order[j]].sheet;\n          out.sheet_size = self.img_sets[try_order[j]].sheet_size;\n          out.px = ob_data[1];\n          out.py = ob_data[2];\n          return out;\n        }\n      }\n    }\n\n    return out;\n  };\n\n  // Initializes the text emoticon data\n  /** @private */\n  emoji.prototype.init_emoticons = function(){\n    var self = this;\n    if (self.inits.emoticons) return;\n    self.init_colons(); // we require this for the emoticons map\n    self.inits.emoticons = 1;\n\n    var a = [];\n    self.map.emoticons = {};\n    for (var i in self.emoticons_data){\n      // because we never see some characters in our text except as entities, we must do some replacing\n      var emoticon = i.replace(/\\&/g, '&amp;').replace(/\\</g, '&lt;').replace(/\\>/g, '&gt;');\n\n      if (!self.map.colons[self.emoticons_data[i]]) continue;\n\n      self.map.emoticons[emoticon] = self.map.colons[self.emoticons_data[i]];\n      a.push(self.escape_rx(emoticon));\n    }\n    self.rx_emoticons = new RegExp(('(^|\\\\s)('+a.join('|')+')(?=$|[\\\\s|\\\\?\\\\.,!])'), 'g');\n  };\n\n  // Initializes the colon string data\n  /** @private */\n  emoji.prototype.init_colons = function(){\n    var self = this;\n    if (self.inits.colons) return;\n    self.inits.colons = 1;\n    self.rx_colons = new RegExp('\\:[a-zA-Z0-9-_+]+\\:(\\:skin-tone-[2-6]\\:)?', 'g');\n    self.map.colons = {};\n    for (var i in self.data){\n      for (var j=0; j<self.data[i][3].length; j++){\n        self.map.colons[self.data[i][3][j]] = i;\n      }\n    }\n  };\n\n  // initializes the unified unicode emoticon data\n  /** @private */\n  emoji.prototype.init_unified = function(){\n    var self = this;\n    if (self.inits.unified) return;\n    self.inits.unified = 1;\n\n    var a = [];\n    self.map.unified = {};\n    self.map.unified_vars = {};\n\n    for (var i in self.data){\n      for (var j=0; j<self.data[i][0].length; j++){\n        a.push(self.data[i][0][j].replace('*', '\\\\*'));\n        self.map.unified[self.data[i][0][j]] = i;\n      }\n    }\n    for (var i in self.variations_data){\n      // skip simple append-style skin tones\n      if (self.variations_data[i]['1f3fb'][0] == i+'-1f3fb') continue;\n\n      for (var k in self.variations_data[i]){\n        for (var j=0; j<self.variations_data[i][k][4].length; j++){\n          a.push(self.variations_data[i][k][4][j].replace('*', '\\\\*'));\n          self.map.unified_vars[self.variations_data[i][k][4][j]] = [i, k];\n        }\n      }\n    }\n\n    a = a.sort(function(a,b){\n\t\t\t return b.length - a.length;\n    });\n\n    self.rx_unified = new RegExp('('+a.join('|')+')(\\uD83C[\\uDFFB-\\uDFFF])?', \"g\");\n  };\n\n  // initializes the environment, figuring out what representation\n  // of emoticons is best.\n  /** @private */\n  emoji.prototype.init_env = function(){\n    var self = this;\n    if (self.inits.env) return;\n    self.inits.env = 1;\n    self.replace_mode = 'img';\n    self.supports_css = false;\n    if (typeof(navigator) !== 'undefined') {\n      var ua = navigator.userAgent;\n      if (typeof window !== 'undefined' && window.getComputedStyle){\n        try {\n          var st = window.getComputedStyle(document.body);\n          if (st['background-size'] || st['backgroundSize']){\n            self.supports_css = true;\n          }\n        } catch(e){\n          // Swallow an exception caused by hidden iFrames on Firefox\n          // https://github.com/iamcal/js-emoji/issues/73\n          if (ua.match(/Firefox/i)){\n            self.supports_css = true;\n          }\n        }\n      }\n      if (navigator.product.match(/ReactNative/i)){\n        self.replace_mode = 'unified';\n        return;\n      }\n      if (ua.match(/(iPhone|iPod|iPad|iPhone\\s+Simulator)/i)){\n        if (ua.match(/OS\\s+[12345]/i)){\n          self.replace_mode = 'softbank';\n          return;\n        }\n        if (ua.match(/OS\\s+[6789]/i)){\n          self.replace_mode = 'unified';\n          return;\n        }\n      }\n      if (ua.match(/Mac OS X 10[._ ](?:[789]|1\\d)/i)){\n        self.replace_mode = 'unified';\n        return;\n      }\n      if (!self.avoid_ms_emoji){\n        if (ua.match(/Windows NT 6.[1-9]/i) || ua.match(/Windows NT 10.[0-9]/i)){\n          if (!ua.match(/Chrome/i) && !ua.match(/MSIE 8/i)){\n            self.replace_mode = 'unified';\n            return;\n          }\n        }\n      }\n    }\n\n    // Need a better way to detect android devices that actually\n    // support emoji.\n    if (false && ua.match(/Android/i)){\n      self.replace_mode = 'google';\n      return;\n    }\n    if (self.supports_css){\n      self.replace_mode = 'css';\n    }\n    // nothing fancy detected - use images\n  };\n  /** @private */\n  emoji.prototype.escape_rx = function(text){\n    return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n  };\n  emoji.prototype.sheet_size = 52;\n  /** @private */\n  emoji.prototype.data = {\n    \"0023-fe0f-20e3\":[[\"\\u0023\\uFE0F\\u20E3\",\"\\u0023\\u20E3\"],\"\\uE210\",\"\\uDBBA\\uDC2C\",[\"hash\"],0,0,7,0],\n    \"002a-fe0f-20e3\":[[\"\\u002A\\uFE0F\\u20E3\",\"\\u002A\\u20E3\"],\"\",\"\",[\"keycap_star\"],0,1,7,0],\n    \"0030-fe0f-20e3\":[[\"\\u0030\\uFE0F\\u20E3\",\"\\u0030\\u20E3\"],\"\\uE225\",\"\\uDBBA\\uDC37\",[\"zero\"],0,2,7,0],\n    \"0031-fe0f-20e3\":[[\"\\u0031\\uFE0F\\u20E3\",\"\\u0031\\u20E3\"],\"\\uE21C\",\"\\uDBBA\\uDC2E\",[\"one\"],0,3,7,0],\n    \"0032-fe0f-20e3\":[[\"\\u0032\\uFE0F\\u20E3\",\"\\u0032\\u20E3\"],\"\\uE21D\",\"\\uDBBA\\uDC2F\",[\"two\"],0,4,7,0],\n    \"0033-fe0f-20e3\":[[\"\\u0033\\uFE0F\\u20E3\",\"\\u0033\\u20E3\"],\"\\uE21E\",\"\\uDBBA\\uDC30\",[\"three\"],0,5,7,0],\n    \"0034-fe0f-20e3\":[[\"\\u0034\\uFE0F\\u20E3\",\"\\u0034\\u20E3\"],\"\\uE21F\",\"\\uDBBA\\uDC31\",[\"four\"],0,6,7,0],\n    \"0035-fe0f-20e3\":[[\"\\u0035\\uFE0F\\u20E3\",\"\\u0035\\u20E3\"],\"\\uE220\",\"\\uDBBA\\uDC32\",[\"five\"],0,7,7,0],\n    \"0036-fe0f-20e3\":[[\"\\u0036\\uFE0F\\u20E3\",\"\\u0036\\u20E3\"],\"\\uE221\",\"\\uDBBA\\uDC33\",[\"six\"],0,8,7,0],\n    \"0037-fe0f-20e3\":[[\"\\u0037\\uFE0F\\u20E3\",\"\\u0037\\u20E3\"],\"\\uE222\",\"\\uDBBA\\uDC34\",[\"seven\"],0,9,7,0],\n    \"0038-fe0f-20e3\":[[\"\\u0038\\uFE0F\\u20E3\",\"\\u0038\\u20E3\"],\"\\uE223\",\"\\uDBBA\\uDC35\",[\"eight\"],0,10,7,0],\n    \"0039-fe0f-20e3\":[[\"\\u0039\\uFE0F\\u20E3\",\"\\u0039\\u20E3\"],\"\\uE224\",\"\\uDBBA\\uDC36\",[\"nine\"],0,11,7,0],\n    \"00a9\":[[\"\\u00A9\\uFE0F\",\"\\u00A9\"],\"\\uE24E\",\"\\uDBBA\\uDF29\",[\"copyright\"],0,12,3,0],\n    \"00ae\":[[\"\\u00AE\\uFE0F\",\"\\u00AE\"],\"\\uE24F\",\"\\uDBBA\\uDF2D\",[\"registered\"],0,13,3,0],\n    \"1f004\":[[\"\\uD83C\\uDC04\"],\"\\uE12D\",\"\\uDBBA\\uDC0B\",[\"mahjong\"],0,14,31,0],\n    \"1f0cf\":[[\"\\uD83C\\uDCCF\"],\"\",\"\\uDBBA\\uDC12\",[\"black_joker\"],0,15,31,0],\n    \"1f170\":[[\"\\uD83C\\uDD70\\uFE0F\",\"\\uD83C\\uDD70\"],\"\\uE532\",\"\\uDBB9\\uDD0B\",[\"a\"],0,16,31,0],\n    \"1f171\":[[\"\\uD83C\\uDD71\\uFE0F\",\"\\uD83C\\uDD71\"],\"\\uE533\",\"\\uDBB9\\uDD0C\",[\"b\"],0,17,31,0],\n    \"1f17e\":[[\"\\uD83C\\uDD7E\\uFE0F\",\"\\uD83C\\uDD7E\"],\"\\uE535\",\"\\uDBB9\\uDD0E\",[\"o2\"],0,18,31,0],\n    \"1f17f\":[[\"\\uD83C\\uDD7F\\uFE0F\",\"\\uD83C\\uDD7F\"],\"\\uE14F\",\"\\uDBB9\\uDFF6\",[\"parking\"],0,19,31,0],\n    \"1f18e\":[[\"\\uD83C\\uDD8E\"],\"\\uE534\",\"\\uDBB9\\uDD0D\",[\"ab\"],0,20,31,0],\n    \"1f191\":[[\"\\uD83C\\uDD91\"],\"\",\"\\uDBBA\\uDF84\",[\"cl\"],0,21,31,0],\n    \"1f192\":[[\"\\uD83C\\uDD92\"],\"\\uE214\",\"\\uDBBA\\uDF38\",[\"cool\"],0,22,31,0],\n    \"1f193\":[[\"\\uD83C\\uDD93\"],\"\",\"\\uDBBA\\uDF21\",[\"free\"],0,23,31,0],\n    \"1f194\":[[\"\\uD83C\\uDD94\"],\"\\uE229\",\"\\uDBBA\\uDF81\",[\"id\"],0,24,31,0],\n    \"1f195\":[[\"\\uD83C\\uDD95\"],\"\\uE212\",\"\\uDBBA\\uDF36\",[\"new\"],0,25,31,0],\n    \"1f196\":[[\"\\uD83C\\uDD96\"],\"\",\"\\uDBBA\\uDF28\",[\"ng\"],0,26,31,0],\n    \"1f197\":[[\"\\uD83C\\uDD97\"],\"\\uE24D\",\"\\uDBBA\\uDF27\",[\"ok\"],0,27,31,0],\n    \"1f198\":[[\"\\uD83C\\uDD98\"],\"\",\"\\uDBBA\\uDF4F\",[\"sos\"],0,28,31,0],\n    \"1f199\":[[\"\\uD83C\\uDD99\"],\"\\uE213\",\"\\uDBBA\\uDF37\",[\"up\"],0,29,31,0],\n    \"1f19a\":[[\"\\uD83C\\uDD9A\"],\"\\uE12E\",\"\\uDBBA\\uDF32\",[\"vs\"],0,30,31,0],\n    \"1f1e6-1f1e8\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-ac\"],0,31,31,0],\n    \"1f1e6-1f1e9\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-ad\"],0,32,31,0],\n    \"1f1e6-1f1ea\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ae\"],0,33,31,0],\n    \"1f1e6-1f1eb\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-af\"],0,34,31,0],\n    \"1f1e6-1f1ec\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-ag\"],0,35,31,0],\n    \"1f1e6-1f1ee\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-ai\"],0,36,31,0],\n    \"1f1e6-1f1f1\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-al\"],0,37,31,0],\n    \"1f1e6-1f1f2\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-am\"],0,38,31,0],\n    \"1f1e6-1f1f4\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-ao\"],0,39,31,0],\n    \"1f1e6-1f1f6\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF6\"],\"\",\"\",[\"flag-aq\"],0,40,31,0],\n    \"1f1e6-1f1f7\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-ar\"],0,41,31,0],\n    \"1f1e6-1f1f8\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-as\"],0,42,31,0],\n    \"1f1e6-1f1f9\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-at\"],0,43,31,0],\n    \"1f1e6-1f1fa\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-au\"],0,44,31,0],\n    \"1f1e6-1f1fc\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-aw\"],0,45,31,0],\n    \"1f1e6-1f1fd\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDFD\"],\"\",\"\",[\"flag-ax\"],0,46,31,0],\n    \"1f1e6-1f1ff\":[[\"\\uD83C\\uDDE6\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-az\"],0,47,31,0],\n    \"1f1e7-1f1e6\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ba\"],0,48,15,0],\n    \"1f1e7-1f1e7\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDE7\"],\"\",\"\",[\"flag-bb\"],0,49,31,0],\n    \"1f1e7-1f1e9\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-bd\"],0,50,31,0],\n    \"1f1e7-1f1ea\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-be\"],0,51,31,0],\n    \"1f1e7-1f1eb\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-bf\"],1,0,31,0],\n    \"1f1e7-1f1ec\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-bg\"],1,1,31,0],\n    \"1f1e7-1f1ed\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDED\"],\"\",\"\",[\"flag-bh\"],1,2,31,0],\n    \"1f1e7-1f1ee\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-bi\"],1,3,31,0],\n    \"1f1e7-1f1ef\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDEF\"],\"\",\"\",[\"flag-bj\"],1,4,31,0],\n    \"1f1e7-1f1f1\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-bl\"],1,5,29,0],\n    \"1f1e7-1f1f2\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-bm\"],1,6,31,0],\n    \"1f1e7-1f1f3\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-bn\"],1,7,15,0],\n    \"1f1e7-1f1f4\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-bo\"],1,8,31,0],\n    \"1f1e7-1f1f6\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF6\"],\"\",\"\",[\"flag-bq\"],1,9,29,0],\n    \"1f1e7-1f1f7\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-br\"],1,10,31,0],\n    \"1f1e7-1f1f8\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-bs\"],1,11,31,0],\n    \"1f1e7-1f1f9\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-bt\"],1,12,31,0],\n    \"1f1e7-1f1fb\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-bv\"],1,13,31,0],\n    \"1f1e7-1f1fc\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-bw\"],1,14,31,0],\n    \"1f1e7-1f1fe\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-by\"],1,15,31,0],\n    \"1f1e7-1f1ff\":[[\"\\uD83C\\uDDE7\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-bz\"],1,16,31,0],\n    \"1f1e8-1f1e6\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ca\"],1,17,31,0],\n    \"1f1e8-1f1e8\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-cc\"],1,18,31,0],\n    \"1f1e8-1f1e9\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-cd\"],1,19,31,0],\n    \"1f1e8-1f1eb\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-cf\"],1,20,31,0],\n    \"1f1e8-1f1ec\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-cg\"],1,21,31,0],\n    \"1f1e8-1f1ed\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDED\"],\"\",\"\",[\"flag-ch\"],1,22,31,0],\n    \"1f1e8-1f1ee\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-ci\"],1,23,31,0],\n    \"1f1e8-1f1f0\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-ck\"],1,24,31,0],\n    \"1f1e8-1f1f1\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-cl\"],1,25,31,0],\n    \"1f1e8-1f1f2\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-cm\"],1,26,31,0],\n    \"1f1e8-1f1f3\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF3\"],\"\\uE513\",\"\\uDBB9\\uDCED\",[\"cn\",\"flag-cn\"],1,27,31,0],\n    \"1f1e8-1f1f4\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-co\"],1,28,31,0],\n    \"1f1e8-1f1f5\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF5\"],\"\",\"\",[\"flag-cp\"],1,29,15,0],\n    \"1f1e8-1f1f7\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-cr\"],1,30,31,0],\n    \"1f1e8-1f1fa\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-cu\"],1,31,31,0],\n    \"1f1e8-1f1fb\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-cv\"],1,32,31,0],\n    \"1f1e8-1f1fc\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-cw\"],1,33,31,0],\n    \"1f1e8-1f1fd\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFD\"],\"\",\"\",[\"flag-cx\"],1,34,31,0],\n    \"1f1e8-1f1fe\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-cy\"],1,35,31,0],\n    \"1f1e8-1f1ff\":[[\"\\uD83C\\uDDE8\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-cz\"],1,36,31,0],\n    \"1f1e9-1f1ea\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDEA\"],\"\\uE50E\",\"\\uDBB9\\uDCE8\",[\"de\",\"flag-de\"],1,37,31,0],\n    \"1f1e9-1f1ec\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-dg\"],1,38,29,0],\n    \"1f1e9-1f1ef\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDEF\"],\"\",\"\",[\"flag-dj\"],1,39,31,0],\n    \"1f1e9-1f1f0\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-dk\"],1,40,31,0],\n    \"1f1e9-1f1f2\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-dm\"],1,41,31,0],\n    \"1f1e9-1f1f4\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-do\"],1,42,31,0],\n    \"1f1e9-1f1ff\":[[\"\\uD83C\\uDDE9\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-dz\"],1,43,31,0],\n    \"1f1ea-1f1e6\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ea\"],1,44,29,0],\n    \"1f1ea-1f1e8\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-ec\"],1,45,31,0],\n    \"1f1ea-1f1ea\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ee\"],1,46,31,0],\n    \"1f1ea-1f1ec\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-eg\"],1,47,31,0],\n    \"1f1ea-1f1ed\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDED\"],\"\",\"\",[\"flag-eh\"],1,48,29,0],\n    \"1f1ea-1f1f7\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-er\"],1,49,31,0],\n    \"1f1ea-1f1f8\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDF8\"],\"\\uE511\",\"\\uDBB9\\uDCEB\",[\"es\",\"flag-es\"],1,50,31,0],\n    \"1f1ea-1f1f9\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-et\"],1,51,31,0],\n    \"1f1ea-1f1fa\":[[\"\\uD83C\\uDDEA\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-eu\"],2,0,31,0],\n    \"1f1eb-1f1ee\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-fi\"],2,1,31,0],\n    \"1f1eb-1f1ef\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDEF\"],\"\",\"\",[\"flag-fj\"],2,2,31,0],\n    \"1f1eb-1f1f0\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-fk\"],2,3,29,0],\n    \"1f1eb-1f1f2\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-fm\"],2,4,31,0],\n    \"1f1eb-1f1f4\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-fo\"],2,5,31,0],\n    \"1f1eb-1f1f7\":[[\"\\uD83C\\uDDEB\\uD83C\\uDDF7\"],\"\\uE50D\",\"\\uDBB9\\uDCE7\",[\"fr\",\"flag-fr\"],2,6,31,0],\n    \"1f1ec-1f1e6\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ga\"],2,7,31,0],\n    \"1f1ec-1f1e7\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDE7\"],\"\\uE510\",\"\\uDBB9\\uDCEA\",[\"gb\",\"uk\",\"flag-gb\"],2,8,31,0],\n    \"1f1ec-1f1e9\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-gd\"],2,9,31,0],\n    \"1f1ec-1f1ea\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ge\"],2,10,31,0],\n    \"1f1ec-1f1eb\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-gf\"],2,11,29,0],\n    \"1f1ec-1f1ec\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-gg\"],2,12,31,0],\n    \"1f1ec-1f1ed\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDED\"],\"\",\"\",[\"flag-gh\"],2,13,31,0],\n    \"1f1ec-1f1ee\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-gi\"],2,14,31,0],\n    \"1f1ec-1f1f1\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-gl\"],2,15,31,0],\n    \"1f1ec-1f1f2\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-gm\"],2,16,31,0],\n    \"1f1ec-1f1f3\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-gn\"],2,17,31,0],\n    \"1f1ec-1f1f5\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF5\"],\"\",\"\",[\"flag-gp\"],2,18,29,0],\n    \"1f1ec-1f1f6\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF6\"],\"\",\"\",[\"flag-gq\"],2,19,31,0],\n    \"1f1ec-1f1f7\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-gr\"],2,20,31,0],\n    \"1f1ec-1f1f8\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-gs\"],2,21,29,0],\n    \"1f1ec-1f1f9\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-gt\"],2,22,31,0],\n    \"1f1ec-1f1fa\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-gu\"],2,23,31,0],\n    \"1f1ec-1f1fc\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-gw\"],2,24,31,0],\n    \"1f1ec-1f1fe\":[[\"\\uD83C\\uDDEC\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-gy\"],2,25,31,0],\n    \"1f1ed-1f1f0\":[[\"\\uD83C\\uDDED\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-hk\"],2,26,31,0],\n    \"1f1ed-1f1f2\":[[\"\\uD83C\\uDDED\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-hm\"],2,27,31,0],\n    \"1f1ed-1f1f3\":[[\"\\uD83C\\uDDED\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-hn\"],2,28,31,0],\n    \"1f1ed-1f1f7\":[[\"\\uD83C\\uDDED\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-hr\"],2,29,31,0],\n    \"1f1ed-1f1f9\":[[\"\\uD83C\\uDDED\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-ht\"],2,30,31,0],\n    \"1f1ed-1f1fa\":[[\"\\uD83C\\uDDED\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-hu\"],2,31,31,0],\n    \"1f1ee-1f1e8\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-ic\"],2,32,31,0],\n    \"1f1ee-1f1e9\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-id\"],2,33,31,0],\n    \"1f1ee-1f1ea\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ie\"],2,34,31,0],\n    \"1f1ee-1f1f1\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-il\"],2,35,31,0],\n    \"1f1ee-1f1f2\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-im\"],2,36,31,0],\n    \"1f1ee-1f1f3\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-in\"],2,37,31,0],\n    \"1f1ee-1f1f4\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-io\"],2,38,31,0],\n    \"1f1ee-1f1f6\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF6\"],\"\",\"\",[\"flag-iq\"],2,39,31,0],\n    \"1f1ee-1f1f7\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-ir\"],2,40,31,0],\n    \"1f1ee-1f1f8\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-is\"],2,41,31,0],\n    \"1f1ee-1f1f9\":[[\"\\uD83C\\uDDEE\\uD83C\\uDDF9\"],\"\\uE50F\",\"\\uDBB9\\uDCE9\",[\"it\",\"flag-it\"],2,42,31,0],\n    \"1f1ef-1f1ea\":[[\"\\uD83C\\uDDEF\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-je\"],2,43,31,0],\n    \"1f1ef-1f1f2\":[[\"\\uD83C\\uDDEF\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-jm\"],2,44,31,0],\n    \"1f1ef-1f1f4\":[[\"\\uD83C\\uDDEF\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-jo\"],2,45,31,0],\n    \"1f1ef-1f1f5\":[[\"\\uD83C\\uDDEF\\uD83C\\uDDF5\"],\"\\uE50B\",\"\\uDBB9\\uDCE5\",[\"jp\",\"flag-jp\"],2,46,31,0],\n    \"1f1f0-1f1ea\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ke\"],2,47,31,0],\n    \"1f1f0-1f1ec\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-kg\"],2,48,31,0],\n    \"1f1f0-1f1ed\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDED\"],\"\",\"\",[\"flag-kh\"],2,49,31,0],\n    \"1f1f0-1f1ee\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-ki\"],2,50,31,0],\n    \"1f1f0-1f1f2\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-km\"],2,51,31,0],\n    \"1f1f0-1f1f3\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-kn\"],3,0,31,0],\n    \"1f1f0-1f1f5\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDF5\"],\"\",\"\",[\"flag-kp\"],3,1,31,0],\n    \"1f1f0-1f1f7\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDF7\"],\"\\uE514\",\"\\uDBB9\\uDCEE\",[\"kr\",\"flag-kr\"],3,2,31,0],\n    \"1f1f0-1f1fc\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-kw\"],3,3,31,0],\n    \"1f1f0-1f1fe\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-ky\"],3,4,31,0],\n    \"1f1f0-1f1ff\":[[\"\\uD83C\\uDDF0\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-kz\"],3,5,31,0],\n    \"1f1f1-1f1e6\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-la\"],3,6,31,0],\n    \"1f1f1-1f1e7\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDE7\"],\"\",\"\",[\"flag-lb\"],3,7,31,0],\n    \"1f1f1-1f1e8\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-lc\"],3,8,31,0],\n    \"1f1f1-1f1ee\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-li\"],3,9,31,0],\n    \"1f1f1-1f1f0\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-lk\"],3,10,31,0],\n    \"1f1f1-1f1f7\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-lr\"],3,11,31,0],\n    \"1f1f1-1f1f8\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-ls\"],3,12,31,0],\n    \"1f1f1-1f1f9\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-lt\"],3,13,31,0],\n    \"1f1f1-1f1fa\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-lu\"],3,14,31,0],\n    \"1f1f1-1f1fb\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-lv\"],3,15,31,0],\n    \"1f1f1-1f1fe\":[[\"\\uD83C\\uDDF1\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-ly\"],3,16,31,0],\n    \"1f1f2-1f1e6\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ma\"],3,17,31,0],\n    \"1f1f2-1f1e8\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-mc\"],3,18,31,0],\n    \"1f1f2-1f1e9\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-md\"],3,19,31,0],\n    \"1f1f2-1f1ea\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-me\"],3,20,31,0],\n    \"1f1f2-1f1eb\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-mf\"],3,21,29,0],\n    \"1f1f2-1f1ec\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-mg\"],3,22,31,0],\n    \"1f1f2-1f1ed\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDED\"],\"\",\"\",[\"flag-mh\"],3,23,31,0],\n    \"1f1f2-1f1f0\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-mk\"],3,24,31,0],\n    \"1f1f2-1f1f1\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-ml\"],3,25,31,0],\n    \"1f1f2-1f1f2\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-mm\"],3,26,31,0],\n    \"1f1f2-1f1f3\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-mn\"],3,27,31,0],\n    \"1f1f2-1f1f4\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-mo\"],3,28,31,0],\n    \"1f1f2-1f1f5\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF5\"],\"\",\"\",[\"flag-mp\"],3,29,31,0],\n    \"1f1f2-1f1f6\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF6\"],\"\",\"\",[\"flag-mq\"],3,30,29,0],\n    \"1f1f2-1f1f7\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-mr\"],3,31,31,0],\n    \"1f1f2-1f1f8\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-ms\"],3,32,31,0],\n    \"1f1f2-1f1f9\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-mt\"],3,33,31,0],\n    \"1f1f2-1f1fa\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-mu\"],3,34,31,0],\n    \"1f1f2-1f1fb\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-mv\"],3,35,31,0],\n    \"1f1f2-1f1fc\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-mw\"],3,36,31,0],\n    \"1f1f2-1f1fd\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFD\"],\"\",\"\",[\"flag-mx\"],3,37,31,0],\n    \"1f1f2-1f1fe\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-my\"],3,38,31,0],\n    \"1f1f2-1f1ff\":[[\"\\uD83C\\uDDF2\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-mz\"],3,39,31,0],\n    \"1f1f3-1f1e6\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-na\"],3,40,31,0],\n    \"1f1f3-1f1e8\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-nc\"],3,41,29,0],\n    \"1f1f3-1f1ea\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ne\"],3,42,31,0],\n    \"1f1f3-1f1eb\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-nf\"],3,43,31,0],\n    \"1f1f3-1f1ec\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-ng\"],3,44,31,0],\n    \"1f1f3-1f1ee\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-ni\"],3,45,31,0],\n    \"1f1f3-1f1f1\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-nl\"],3,46,31,0],\n    \"1f1f3-1f1f4\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-no\"],3,47,31,0],\n    \"1f1f3-1f1f5\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDF5\"],\"\",\"\",[\"flag-np\"],3,48,31,0],\n    \"1f1f3-1f1f7\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-nr\"],3,49,31,0],\n    \"1f1f3-1f1fa\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-nu\"],3,50,31,0],\n    \"1f1f3-1f1ff\":[[\"\\uD83C\\uDDF3\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-nz\"],3,51,31,0],\n    \"1f1f4-1f1f2\":[[\"\\uD83C\\uDDF4\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-om\"],4,0,31,0],\n    \"1f1f5-1f1e6\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-pa\"],4,1,31,0],\n    \"1f1f5-1f1ea\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-pe\"],4,2,31,0],\n    \"1f1f5-1f1eb\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-pf\"],4,3,31,0],\n    \"1f1f5-1f1ec\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-pg\"],4,4,31,0],\n    \"1f1f5-1f1ed\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDED\"],\"\",\"\",[\"flag-ph\"],4,5,31,0],\n    \"1f1f5-1f1f0\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-pk\"],4,6,31,0],\n    \"1f1f5-1f1f1\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-pl\"],4,7,31,0],\n    \"1f1f5-1f1f2\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-pm\"],4,8,29,0],\n    \"1f1f5-1f1f3\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-pn\"],4,9,31,0],\n    \"1f1f5-1f1f7\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-pr\"],4,10,31,0],\n    \"1f1f5-1f1f8\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-ps\"],4,11,31,0],\n    \"1f1f5-1f1f9\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-pt\"],4,12,31,0],\n    \"1f1f5-1f1fc\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-pw\"],4,13,31,0],\n    \"1f1f5-1f1fe\":[[\"\\uD83C\\uDDF5\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-py\"],4,14,31,0],\n    \"1f1f6-1f1e6\":[[\"\\uD83C\\uDDF6\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-qa\"],4,15,31,0],\n    \"1f1f7-1f1ea\":[[\"\\uD83C\\uDDF7\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-re\"],4,16,29,0],\n    \"1f1f7-1f1f4\":[[\"\\uD83C\\uDDF7\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-ro\"],4,17,31,0],\n    \"1f1f7-1f1f8\":[[\"\\uD83C\\uDDF7\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-rs\"],4,18,31,0],\n    \"1f1f7-1f1fa\":[[\"\\uD83C\\uDDF7\\uD83C\\uDDFA\"],\"\\uE512\",\"\\uDBB9\\uDCEC\",[\"ru\",\"flag-ru\"],4,19,31,0],\n    \"1f1f7-1f1fc\":[[\"\\uD83C\\uDDF7\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-rw\"],4,20,31,0],\n    \"1f1f8-1f1e6\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-sa\"],4,21,31,0],\n    \"1f1f8-1f1e7\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDE7\"],\"\",\"\",[\"flag-sb\"],4,22,31,0],\n    \"1f1f8-1f1e8\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-sc\"],4,23,31,0],\n    \"1f1f8-1f1e9\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-sd\"],4,24,31,0],\n    \"1f1f8-1f1ea\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-se\"],4,25,31,0],\n    \"1f1f8-1f1ec\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-sg\"],4,26,31,0],\n    \"1f1f8-1f1ed\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDED\"],\"\",\"\",[\"flag-sh\"],4,27,31,0],\n    \"1f1f8-1f1ee\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-si\"],4,28,31,0],\n    \"1f1f8-1f1ef\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDEF\"],\"\",\"\",[\"flag-sj\"],4,29,31,0],\n    \"1f1f8-1f1f0\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-sk\"],4,30,31,0],\n    \"1f1f8-1f1f1\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-sl\"],4,31,31,0],\n    \"1f1f8-1f1f2\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-sm\"],4,32,31,0],\n    \"1f1f8-1f1f3\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-sn\"],4,33,31,0],\n    \"1f1f8-1f1f4\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-so\"],4,34,31,0],\n    \"1f1f8-1f1f7\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-sr\"],4,35,31,0],\n    \"1f1f8-1f1f8\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-ss\"],4,36,31,0],\n    \"1f1f8-1f1f9\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-st\"],4,37,31,0],\n    \"1f1f8-1f1fb\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-sv\"],4,38,31,0],\n    \"1f1f8-1f1fd\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDFD\"],\"\",\"\",[\"flag-sx\"],4,39,31,0],\n    \"1f1f8-1f1fe\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-sy\"],4,40,31,0],\n    \"1f1f8-1f1ff\":[[\"\\uD83C\\uDDF8\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-sz\"],4,41,31,0],\n    \"1f1f9-1f1e6\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ta\"],4,42,31,0],\n    \"1f1f9-1f1e8\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-tc\"],4,43,31,0],\n    \"1f1f9-1f1e9\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDE9\"],\"\",\"\",[\"flag-td\"],4,44,31,0],\n    \"1f1f9-1f1eb\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-tf\"],4,45,29,0],\n    \"1f1f9-1f1ec\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-tg\"],4,46,31,0],\n    \"1f1f9-1f1ed\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDED\"],\"\",\"\",[\"flag-th\"],4,47,31,0],\n    \"1f1f9-1f1ef\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDEF\"],\"\",\"\",[\"flag-tj\"],4,48,31,0],\n    \"1f1f9-1f1f0\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-tk\"],4,49,31,0],\n    \"1f1f9-1f1f1\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF1\"],\"\",\"\",[\"flag-tl\"],4,50,31,0],\n    \"1f1f9-1f1f2\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-tm\"],4,51,31,0],\n    \"1f1f9-1f1f3\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-tn\"],5,0,31,0],\n    \"1f1f9-1f1f4\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF4\"],\"\",\"\",[\"flag-to\"],5,1,31,0],\n    \"1f1f9-1f1f7\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF7\"],\"\",\"\",[\"flag-tr\"],5,2,31,0],\n    \"1f1f9-1f1f9\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-tt\"],5,3,31,0],\n    \"1f1f9-1f1fb\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDFB\"],\"\",\"\",[\"flag-tv\"],5,4,31,0],\n    \"1f1f9-1f1fc\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-tw\"],5,5,31,0],\n    \"1f1f9-1f1ff\":[[\"\\uD83C\\uDDF9\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-tz\"],5,6,31,0],\n    \"1f1fa-1f1e6\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-ua\"],5,7,31,0],\n    \"1f1fa-1f1ec\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-ug\"],5,8,31,0],\n    \"1f1fa-1f1f2\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-um\"],5,9,31,0],\n    \"1f1fa-1f1f3\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-un\"],5,10,14,0],\n    \"1f1fa-1f1f8\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDF8\"],\"\\uE50C\",\"\\uDBB9\\uDCE6\",[\"us\",\"flag-us\"],5,11,31,0],\n    \"1f1fa-1f1fe\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDFE\"],\"\",\"\",[\"flag-uy\"],5,12,31,0],\n    \"1f1fa-1f1ff\":[[\"\\uD83C\\uDDFA\\uD83C\\uDDFF\"],\"\",\"\",[\"flag-uz\"],5,13,31,0],\n    \"1f1fb-1f1e6\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-va\"],5,14,31,0],\n    \"1f1fb-1f1e8\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDE8\"],\"\",\"\",[\"flag-vc\"],5,15,31,0],\n    \"1f1fb-1f1ea\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ve\"],5,16,31,0],\n    \"1f1fb-1f1ec\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDEC\"],\"\",\"\",[\"flag-vg\"],5,17,31,0],\n    \"1f1fb-1f1ee\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDEE\"],\"\",\"\",[\"flag-vi\"],5,18,31,0],\n    \"1f1fb-1f1f3\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDF3\"],\"\",\"\",[\"flag-vn\"],5,19,31,0],\n    \"1f1fb-1f1fa\":[[\"\\uD83C\\uDDFB\\uD83C\\uDDFA\"],\"\",\"\",[\"flag-vu\"],5,20,31,0],\n    \"1f1fc-1f1eb\":[[\"\\uD83C\\uDDFC\\uD83C\\uDDEB\"],\"\",\"\",[\"flag-wf\"],5,21,29,0],\n    \"1f1fc-1f1f8\":[[\"\\uD83C\\uDDFC\\uD83C\\uDDF8\"],\"\",\"\",[\"flag-ws\"],5,22,31,0],\n    \"1f1fd-1f1f0\":[[\"\\uD83C\\uDDFD\\uD83C\\uDDF0\"],\"\",\"\",[\"flag-xk\"],5,23,29,0],\n    \"1f1fe-1f1ea\":[[\"\\uD83C\\uDDFE\\uD83C\\uDDEA\"],\"\",\"\",[\"flag-ye\"],5,24,31,0],\n    \"1f1fe-1f1f9\":[[\"\\uD83C\\uDDFE\\uD83C\\uDDF9\"],\"\",\"\",[\"flag-yt\"],5,25,29,0],\n    \"1f1ff-1f1e6\":[[\"\\uD83C\\uDDFF\\uD83C\\uDDE6\"],\"\",\"\",[\"flag-za\"],5,26,31,0],\n    \"1f1ff-1f1f2\":[[\"\\uD83C\\uDDFF\\uD83C\\uDDF2\"],\"\",\"\",[\"flag-zm\"],5,27,31,0],\n    \"1f1ff-1f1fc\":[[\"\\uD83C\\uDDFF\\uD83C\\uDDFC\"],\"\",\"\",[\"flag-zw\"],5,28,31,0],\n    \"1f201\":[[\"\\uD83C\\uDE01\"],\"\\uE203\",\"\\uDBBA\\uDF24\",[\"koko\"],5,29,31,0],\n    \"1f202\":[[\"\\uD83C\\uDE02\\uFE0F\",\"\\uD83C\\uDE02\"],\"\\uE228\",\"\\uDBBA\\uDF3F\",[\"sa\"],5,30,31,0],\n    \"1f21a\":[[\"\\uD83C\\uDE1A\"],\"\\uE216\",\"\\uDBBA\\uDF3A\",[\"u7121\"],5,31,31,0],\n    \"1f22f\":[[\"\\uD83C\\uDE2F\"],\"\\uE22C\",\"\\uDBBA\\uDF40\",[\"u6307\"],5,32,31,0],\n    \"1f232\":[[\"\\uD83C\\uDE32\"],\"\",\"\\uDBBA\\uDF2E\",[\"u7981\"],5,33,31,0],\n    \"1f233\":[[\"\\uD83C\\uDE33\"],\"\\uE22B\",\"\\uDBBA\\uDF2F\",[\"u7a7a\"],5,34,31,0],\n    \"1f234\":[[\"\\uD83C\\uDE34\"],\"\",\"\\uDBBA\\uDF30\",[\"u5408\"],5,35,31,0],\n    \"1f235\":[[\"\\uD83C\\uDE35\"],\"\\uE22A\",\"\\uDBBA\\uDF31\",[\"u6e80\"],5,36,31,0],\n    \"1f236\":[[\"\\uD83C\\uDE36\"],\"\\uE215\",\"\\uDBBA\\uDF39\",[\"u6709\"],5,37,31,0],\n    \"1f237\":[[\"\\uD83C\\uDE37\\uFE0F\",\"\\uD83C\\uDE37\"],\"\\uE217\",\"\\uDBBA\\uDF3B\",[\"u6708\"],5,38,31,0],\n    \"1f238\":[[\"\\uD83C\\uDE38\"],\"\\uE218\",\"\\uDBBA\\uDF3C\",[\"u7533\"],5,39,31,0],\n    \"1f239\":[[\"\\uD83C\\uDE39\"],\"\\uE227\",\"\\uDBBA\\uDF3E\",[\"u5272\"],5,40,31,0],\n    \"1f23a\":[[\"\\uD83C\\uDE3A\"],\"\\uE22D\",\"\\uDBBA\\uDF41\",[\"u55b6\"],5,41,31,0],\n    \"1f250\":[[\"\\uD83C\\uDE50\"],\"\\uE226\",\"\\uDBBA\\uDF3D\",[\"ideograph_advantage\"],5,42,31,0],\n    \"1f251\":[[\"\\uD83C\\uDE51\"],\"\",\"\\uDBBA\\uDF50\",[\"accept\"],5,43,31,0],\n    \"1f300\":[[\"\\uD83C\\uDF00\"],\"\\uE443\",\"\\uDBB8\\uDC05\",[\"cyclone\"],5,44,31,0],\n    \"1f301\":[[\"\\uD83C\\uDF01\"],\"\",\"\\uDBB8\\uDC06\",[\"foggy\"],5,45,31,0],\n    \"1f302\":[[\"\\uD83C\\uDF02\"],\"\\uE43C\",\"\\uDBB8\\uDC07\",[\"closed_umbrella\"],5,46,31,0],\n    \"1f303\":[[\"\\uD83C\\uDF03\"],\"\\uE44B\",\"\\uDBB8\\uDC08\",[\"night_with_stars\"],5,47,31,0],\n    \"1f304\":[[\"\\uD83C\\uDF04\"],\"\\uE04D\",\"\\uDBB8\\uDC09\",[\"sunrise_over_mountains\"],5,48,31,0],\n    \"1f305\":[[\"\\uD83C\\uDF05\"],\"\\uE449\",\"\\uDBB8\\uDC0A\",[\"sunrise\"],5,49,31,0],\n    \"1f306\":[[\"\\uD83C\\uDF06\"],\"\\uE146\",\"\\uDBB8\\uDC0B\",[\"city_sunset\"],5,50,31,0],\n    \"1f307\":[[\"\\uD83C\\uDF07\"],\"\\uE44A\",\"\\uDBB8\\uDC0C\",[\"city_sunrise\"],5,51,31,0],\n    \"1f308\":[[\"\\uD83C\\uDF08\"],\"\\uE44C\",\"\\uDBB8\\uDC0D\",[\"rainbow\"],6,0,31,0],\n    \"1f309\":[[\"\\uD83C\\uDF09\"],\"\",\"\\uDBB8\\uDC10\",[\"bridge_at_night\"],6,1,31,0],\n    \"1f30a\":[[\"\\uD83C\\uDF0A\"],\"\\uE43E\",\"\\uDBB8\\uDC38\",[\"ocean\"],6,2,31,0],\n    \"1f30b\":[[\"\\uD83C\\uDF0B\"],\"\",\"\\uDBB8\\uDC3A\",[\"volcano\"],6,3,31,0],\n    \"1f30c\":[[\"\\uD83C\\uDF0C\"],\"\",\"\\uDBB8\\uDC3B\",[\"milky_way\"],6,4,31,0],\n    \"1f30d\":[[\"\\uD83C\\uDF0D\"],\"\",\"\",[\"earth_africa\"],6,5,31,0],\n    \"1f30e\":[[\"\\uD83C\\uDF0E\"],\"\",\"\",[\"earth_americas\"],6,6,31,0],\n    \"1f30f\":[[\"\\uD83C\\uDF0F\"],\"\",\"\\uDBB8\\uDC39\",[\"earth_asia\"],6,7,31,0],\n    \"1f310\":[[\"\\uD83C\\uDF10\"],\"\",\"\",[\"globe_with_meridians\"],6,8,31,0],\n    \"1f311\":[[\"\\uD83C\\uDF11\"],\"\",\"\\uDBB8\\uDC11\",[\"new_moon\"],6,9,31,0],\n    \"1f312\":[[\"\\uD83C\\uDF12\"],\"\",\"\",[\"waxing_crescent_moon\"],6,10,31,0],\n    \"1f313\":[[\"\\uD83C\\uDF13\"],\"\",\"\\uDBB8\\uDC13\",[\"first_quarter_moon\"],6,11,31,0],\n    \"1f314\":[[\"\\uD83C\\uDF14\"],\"\",\"\\uDBB8\\uDC12\",[\"moon\",\"waxing_gibbous_moon\"],6,12,31,0],\n    \"1f315\":[[\"\\uD83C\\uDF15\"],\"\",\"\\uDBB8\\uDC15\",[\"full_moon\"],6,13,31,0],\n    \"1f316\":[[\"\\uD83C\\uDF16\"],\"\",\"\",[\"waning_gibbous_moon\"],6,14,31,0],\n    \"1f317\":[[\"\\uD83C\\uDF17\"],\"\",\"\",[\"last_quarter_moon\"],6,15,31,0],\n    \"1f318\":[[\"\\uD83C\\uDF18\"],\"\",\"\",[\"waning_crescent_moon\"],6,16,31,0],\n    \"1f319\":[[\"\\uD83C\\uDF19\"],\"\\uE04C\",\"\\uDBB8\\uDC14\",[\"crescent_moon\"],6,17,31,0],\n    \"1f31a\":[[\"\\uD83C\\uDF1A\"],\"\",\"\",[\"new_moon_with_face\"],6,18,31,0],\n    \"1f31b\":[[\"\\uD83C\\uDF1B\"],\"\",\"\\uDBB8\\uDC16\",[\"first_quarter_moon_with_face\"],6,19,31,0],\n    \"1f31c\":[[\"\\uD83C\\uDF1C\"],\"\",\"\",[\"last_quarter_moon_with_face\"],6,20,31,0],\n    \"1f31d\":[[\"\\uD83C\\uDF1D\"],\"\",\"\",[\"full_moon_with_face\"],6,21,31,0],\n    \"1f31e\":[[\"\\uD83C\\uDF1E\"],\"\",\"\",[\"sun_with_face\"],6,22,31,0],\n    \"1f31f\":[[\"\\uD83C\\uDF1F\"],\"\\uE335\",\"\\uDBBA\\uDF69\",[\"star2\"],6,23,31,0],\n    \"1f320\":[[\"\\uD83C\\uDF20\"],\"\",\"\\uDBBA\\uDF6A\",[\"stars\"],6,24,31,0],\n    \"1f321\":[[\"\\uD83C\\uDF21\\uFE0F\",\"\\uD83C\\uDF21\"],\"\",\"\",[\"thermometer\"],6,25,15,0],\n    \"1f324\":[[\"\\uD83C\\uDF24\\uFE0F\",\"\\uD83C\\uDF24\"],\"\",\"\",[\"mostly_sunny\",\"sun_small_cloud\"],6,26,15,0],\n    \"1f325\":[[\"\\uD83C\\uDF25\\uFE0F\",\"\\uD83C\\uDF25\"],\"\",\"\",[\"barely_sunny\",\"sun_behind_cloud\"],6,27,15,0],\n    \"1f326\":[[\"\\uD83C\\uDF26\\uFE0F\",\"\\uD83C\\uDF26\"],\"\",\"\",[\"partly_sunny_rain\",\"sun_behind_rain_cloud\"],6,28,15,0],\n    \"1f327\":[[\"\\uD83C\\uDF27\\uFE0F\",\"\\uD83C\\uDF27\"],\"\",\"\",[\"rain_cloud\"],6,29,15,0],\n    \"1f328\":[[\"\\uD83C\\uDF28\\uFE0F\",\"\\uD83C\\uDF28\"],\"\",\"\",[\"snow_cloud\"],6,30,15,0],\n    \"1f329\":[[\"\\uD83C\\uDF29\\uFE0F\",\"\\uD83C\\uDF29\"],\"\",\"\",[\"lightning\",\"lightning_cloud\"],6,31,15,0],\n    \"1f32a\":[[\"\\uD83C\\uDF2A\\uFE0F\",\"\\uD83C\\uDF2A\"],\"\",\"\",[\"tornado\",\"tornado_cloud\"],6,32,15,0],\n    \"1f32b\":[[\"\\uD83C\\uDF2B\\uFE0F\",\"\\uD83C\\uDF2B\"],\"\",\"\",[\"fog\"],6,33,15,0],\n    \"1f32c\":[[\"\\uD83C\\uDF2C\\uFE0F\",\"\\uD83C\\uDF2C\"],\"\",\"\",[\"wind_blowing_face\"],6,34,15,0],\n    \"1f32d\":[[\"\\uD83C\\uDF2D\"],\"\",\"\",[\"hotdog\"],6,35,15,0],\n    \"1f32e\":[[\"\\uD83C\\uDF2E\"],\"\",\"\",[\"taco\"],6,36,15,0],\n    \"1f32f\":[[\"\\uD83C\\uDF2F\"],\"\",\"\",[\"burrito\"],6,37,15,0],\n    \"1f330\":[[\"\\uD83C\\uDF30\"],\"\",\"\\uDBB8\\uDC4C\",[\"chestnut\"],6,38,31,0],\n    \"1f331\":[[\"\\uD83C\\uDF31\"],\"\",\"\\uDBB8\\uDC3E\",[\"seedling\"],6,39,31,0],\n    \"1f332\":[[\"\\uD83C\\uDF32\"],\"\",\"\",[\"evergreen_tree\"],6,40,31,0],\n    \"1f333\":[[\"\\uD83C\\uDF33\"],\"\",\"\",[\"deciduous_tree\"],6,41,31,0],\n    \"1f334\":[[\"\\uD83C\\uDF34\"],\"\\uE307\",\"\\uDBB8\\uDC47\",[\"palm_tree\"],6,42,31,0],\n    \"1f335\":[[\"\\uD83C\\uDF35\"],\"\\uE308\",\"\\uDBB8\\uDC48\",[\"cactus\"],6,43,31,0],\n    \"1f336\":[[\"\\uD83C\\uDF36\\uFE0F\",\"\\uD83C\\uDF36\"],\"\",\"\",[\"hot_pepper\"],6,44,15,0],\n    \"1f337\":[[\"\\uD83C\\uDF37\"],\"\\uE304\",\"\\uDBB8\\uDC3D\",[\"tulip\"],6,45,31,0],\n    \"1f338\":[[\"\\uD83C\\uDF38\"],\"\\uE030\",\"\\uDBB8\\uDC40\",[\"cherry_blossom\"],6,46,31,0],\n    \"1f339\":[[\"\\uD83C\\uDF39\"],\"\\uE032\",\"\\uDBB8\\uDC41\",[\"rose\"],6,47,31,0],\n    \"1f33a\":[[\"\\uD83C\\uDF3A\"],\"\\uE303\",\"\\uDBB8\\uDC45\",[\"hibiscus\"],6,48,31,0],\n    \"1f33b\":[[\"\\uD83C\\uDF3B\"],\"\\uE305\",\"\\uDBB8\\uDC46\",[\"sunflower\"],6,49,31,0],\n    \"1f33c\":[[\"\\uD83C\\uDF3C\"],\"\",\"\\uDBB8\\uDC4D\",[\"blossom\"],6,50,31,0],\n    \"1f33d\":[[\"\\uD83C\\uDF3D\"],\"\",\"\\uDBB8\\uDC4A\",[\"corn\"],6,51,31,0],\n    \"1f33e\":[[\"\\uD83C\\uDF3E\"],\"\\uE444\",\"\\uDBB8\\uDC49\",[\"ear_of_rice\"],7,0,31,0],\n    \"1f33f\":[[\"\\uD83C\\uDF3F\"],\"\",\"\\uDBB8\\uDC4E\",[\"herb\"],7,1,31,0],\n    \"1f340\":[[\"\\uD83C\\uDF40\"],\"\\uE110\",\"\\uDBB8\\uDC3C\",[\"four_leaf_clover\"],7,2,31,0],\n    \"1f341\":[[\"\\uD83C\\uDF41\"],\"\\uE118\",\"\\uDBB8\\uDC3F\",[\"maple_leaf\"],7,3,31,0],\n    \"1f342\":[[\"\\uD83C\\uDF42\"],\"\\uE119\",\"\\uDBB8\\uDC42\",[\"fallen_leaf\"],7,4,31,0],\n    \"1f343\":[[\"\\uD83C\\uDF43\"],\"\\uE447\",\"\\uDBB8\\uDC43\",[\"leaves\"],7,5,31,0],\n    \"1f344\":[[\"\\uD83C\\uDF44\"],\"\",\"\\uDBB8\\uDC4B\",[\"mushroom\"],7,6,31,0],\n    \"1f345\":[[\"\\uD83C\\uDF45\"],\"\\uE349\",\"\\uDBB8\\uDC55\",[\"tomato\"],7,7,31,0],\n    \"1f346\":[[\"\\uD83C\\uDF46\"],\"\\uE34A\",\"\\uDBB8\\uDC56\",[\"eggplant\"],7,8,31,0],\n    \"1f347\":[[\"\\uD83C\\uDF47\"],\"\",\"\\uDBB8\\uDC59\",[\"grapes\"],7,9,31,0],\n    \"1f348\":[[\"\\uD83C\\uDF48\"],\"\",\"\\uDBB8\\uDC57\",[\"melon\"],7,10,31,0],\n    \"1f349\":[[\"\\uD83C\\uDF49\"],\"\\uE348\",\"\\uDBB8\\uDC54\",[\"watermelon\"],7,11,31,0],\n    \"1f34a\":[[\"\\uD83C\\uDF4A\"],\"\\uE346\",\"\\uDBB8\\uDC52\",[\"tangerine\"],7,12,31,0],\n    \"1f34b\":[[\"\\uD83C\\uDF4B\"],\"\",\"\",[\"lemon\"],7,13,31,0],\n    \"1f34c\":[[\"\\uD83C\\uDF4C\"],\"\",\"\\uDBB8\\uDC50\",[\"banana\"],7,14,31,0],\n    \"1f34d\":[[\"\\uD83C\\uDF4D\"],\"\",\"\\uDBB8\\uDC58\",[\"pineapple\"],7,15,31,0],\n    \"1f34e\":[[\"\\uD83C\\uDF4E\"],\"\\uE345\",\"\\uDBB8\\uDC51\",[\"apple\"],7,16,31,0],\n    \"1f34f\":[[\"\\uD83C\\uDF4F\"],\"\",\"\\uDBB8\\uDC5B\",[\"green_apple\"],7,17,31,0],\n    \"1f350\":[[\"\\uD83C\\uDF50\"],\"\",\"\",[\"pear\"],7,18,31,0],\n    \"1f351\":[[\"\\uD83C\\uDF51\"],\"\",\"\\uDBB8\\uDC5A\",[\"peach\"],7,19,31,0],\n    \"1f352\":[[\"\\uD83C\\uDF52\"],\"\",\"\\uDBB8\\uDC4F\",[\"cherries\"],7,20,31,0],\n    \"1f353\":[[\"\\uD83C\\uDF53\"],\"\\uE347\",\"\\uDBB8\\uDC53\",[\"strawberry\"],7,21,31,0],\n    \"1f354\":[[\"\\uD83C\\uDF54\"],\"\\uE120\",\"\\uDBBA\\uDD60\",[\"hamburger\"],7,22,31,0],\n    \"1f355\":[[\"\\uD83C\\uDF55\"],\"\",\"\\uDBBA\\uDD75\",[\"pizza\"],7,23,31,0],\n    \"1f356\":[[\"\\uD83C\\uDF56\"],\"\",\"\\uDBBA\\uDD72\",[\"meat_on_bone\"],7,24,31,0],\n    \"1f357\":[[\"\\uD83C\\uDF57\"],\"\",\"\\uDBBA\\uDD76\",[\"poultry_leg\"],7,25,31,0],\n    \"1f358\":[[\"\\uD83C\\uDF58\"],\"\\uE33D\",\"\\uDBBA\\uDD69\",[\"rice_cracker\"],7,26,31,0],\n    \"1f359\":[[\"\\uD83C\\uDF59\"],\"\\uE342\",\"\\uDBBA\\uDD61\",[\"rice_ball\"],7,27,31,0],\n    \"1f35a\":[[\"\\uD83C\\uDF5A\"],\"\\uE33E\",\"\\uDBBA\\uDD6A\",[\"rice\"],7,28,31,0],\n    \"1f35b\":[[\"\\uD83C\\uDF5B\"],\"\\uE341\",\"\\uDBBA\\uDD6C\",[\"curry\"],7,29,31,0],\n    \"1f35c\":[[\"\\uD83C\\uDF5C\"],\"\\uE340\",\"\\uDBBA\\uDD63\",[\"ramen\"],7,30,31,0],\n    \"1f35d\":[[\"\\uD83C\\uDF5D\"],\"\\uE33F\",\"\\uDBBA\\uDD6B\",[\"spaghetti\"],7,31,31,0],\n    \"1f35e\":[[\"\\uD83C\\uDF5E\"],\"\\uE339\",\"\\uDBBA\\uDD64\",[\"bread\"],7,32,31,0],\n    \"1f35f\":[[\"\\uD83C\\uDF5F\"],\"\\uE33B\",\"\\uDBBA\\uDD67\",[\"fries\"],7,33,31,0],\n    \"1f360\":[[\"\\uD83C\\uDF60\"],\"\",\"\\uDBBA\\uDD74\",[\"sweet_potato\"],7,34,31,0],\n    \"1f361\":[[\"\\uD83C\\uDF61\"],\"\\uE33C\",\"\\uDBBA\\uDD68\",[\"dango\"],7,35,31,0],\n    \"1f362\":[[\"\\uD83C\\uDF62\"],\"\\uE343\",\"\\uDBBA\\uDD6D\",[\"oden\"],7,36,31,0],\n    \"1f363\":[[\"\\uD83C\\uDF63\"],\"\\uE344\",\"\\uDBBA\\uDD6E\",[\"sushi\"],7,37,31,0],\n    \"1f364\":[[\"\\uD83C\\uDF64\"],\"\",\"\\uDBBA\\uDD7F\",[\"fried_shrimp\"],7,38,31,0],\n    \"1f365\":[[\"\\uD83C\\uDF65\"],\"\",\"\\uDBBA\\uDD73\",[\"fish_cake\"],7,39,31,0],\n    \"1f366\":[[\"\\uD83C\\uDF66\"],\"\\uE33A\",\"\\uDBBA\\uDD66\",[\"icecream\"],7,40,31,0],\n    \"1f367\":[[\"\\uD83C\\uDF67\"],\"\\uE43F\",\"\\uDBBA\\uDD71\",[\"shaved_ice\"],7,41,31,0],\n    \"1f368\":[[\"\\uD83C\\uDF68\"],\"\",\"\\uDBBA\\uDD77\",[\"ice_cream\"],7,42,31,0],\n    \"1f369\":[[\"\\uD83C\\uDF69\"],\"\",\"\\uDBBA\\uDD78\",[\"doughnut\"],7,43,31,0],\n    \"1f36a\":[[\"\\uD83C\\uDF6A\"],\"\",\"\\uDBBA\\uDD79\",[\"cookie\"],7,44,31,0],\n    \"1f36b\":[[\"\\uD83C\\uDF6B\"],\"\",\"\\uDBBA\\uDD7A\",[\"chocolate_bar\"],7,45,31,0],\n    \"1f36c\":[[\"\\uD83C\\uDF6C\"],\"\",\"\\uDBBA\\uDD7B\",[\"candy\"],7,46,31,0],\n    \"1f36d\":[[\"\\uD83C\\uDF6D\"],\"\",\"\\uDBBA\\uDD7C\",[\"lollipop\"],7,47,31,0],\n    \"1f36e\":[[\"\\uD83C\\uDF6E\"],\"\",\"\\uDBBA\\uDD7D\",[\"custard\"],7,48,31,0],\n    \"1f36f\":[[\"\\uD83C\\uDF6F\"],\"\",\"\\uDBBA\\uDD7E\",[\"honey_pot\"],7,49,31,0],\n    \"1f370\":[[\"\\uD83C\\uDF70\"],\"\\uE046\",\"\\uDBBA\\uDD62\",[\"cake\"],7,50,31,0],\n    \"1f371\":[[\"\\uD83C\\uDF71\"],\"\\uE34C\",\"\\uDBBA\\uDD6F\",[\"bento\"],7,51,31,0],\n    \"1f372\":[[\"\\uD83C\\uDF72\"],\"\\uE34D\",\"\\uDBBA\\uDD70\",[\"stew\"],8,0,31,0],\n    \"1f373\":[[\"\\uD83C\\uDF73\"],\"\\uE147\",\"\\uDBBA\\uDD65\",[\"fried_egg\",\"cooking\"],8,1,31,0],\n    \"1f374\":[[\"\\uD83C\\uDF74\"],\"\\uE043\",\"\\uDBBA\\uDD80\",[\"fork_and_knife\"],8,2,31,0],\n    \"1f375\":[[\"\\uD83C\\uDF75\"],\"\\uE338\",\"\\uDBBA\\uDD84\",[\"tea\"],8,3,31,0],\n    \"1f376\":[[\"\\uD83C\\uDF76\"],\"\\uE30B\",\"\\uDBBA\\uDD85\",[\"sake\"],8,4,31,0],\n    \"1f377\":[[\"\\uD83C\\uDF77\"],\"\",\"\\uDBBA\\uDD86\",[\"wine_glass\"],8,5,31,0],\n    \"1f378\":[[\"\\uD83C\\uDF78\"],\"\\uE044\",\"\\uDBBA\\uDD82\",[\"cocktail\"],8,6,31,0],\n    \"1f379\":[[\"\\uD83C\\uDF79\"],\"\",\"\\uDBBA\\uDD88\",[\"tropical_drink\"],8,7,31,0],\n    \"1f37a\":[[\"\\uD83C\\uDF7A\"],\"\\uE047\",\"\\uDBBA\\uDD83\",[\"beer\"],8,8,31,0],\n    \"1f37b\":[[\"\\uD83C\\uDF7B\"],\"\\uE30C\",\"\\uDBBA\\uDD87\",[\"beers\"],8,9,31,0],\n    \"1f37c\":[[\"\\uD83C\\uDF7C\"],\"\",\"\",[\"baby_bottle\"],8,10,31,0],\n    \"1f37d\":[[\"\\uD83C\\uDF7D\\uFE0F\",\"\\uD83C\\uDF7D\"],\"\",\"\",[\"knife_fork_plate\"],8,11,15,0],\n    \"1f37e\":[[\"\\uD83C\\uDF7E\"],\"\",\"\",[\"champagne\"],8,12,15,0],\n    \"1f37f\":[[\"\\uD83C\\uDF7F\"],\"\",\"\",[\"popcorn\"],8,13,15,0],\n    \"1f380\":[[\"\\uD83C\\uDF80\"],\"\\uE314\",\"\\uDBB9\\uDD0F\",[\"ribbon\"],8,14,31,0],\n    \"1f381\":[[\"\\uD83C\\uDF81\"],\"\\uE112\",\"\\uDBB9\\uDD10\",[\"gift\"],8,15,31,0],\n    \"1f382\":[[\"\\uD83C\\uDF82\"],\"\\uE34B\",\"\\uDBB9\\uDD11\",[\"birthday\"],8,16,31,0],\n    \"1f383\":[[\"\\uD83C\\uDF83\"],\"\\uE445\",\"\\uDBB9\\uDD1F\",[\"jack_o_lantern\"],8,17,31,0],\n    \"1f384\":[[\"\\uD83C\\uDF84\"],\"\\uE033\",\"\\uDBB9\\uDD12\",[\"christmas_tree\"],8,18,31,0],\n    \"1f385\":[[\"\\uD83C\\uDF85\"],\"\\uE448\",\"\\uDBB9\\uDD13\",[\"santa\"],8,19,31,0],\n    \"1f386\":[[\"\\uD83C\\uDF86\"],\"\\uE117\",\"\\uDBB9\\uDD15\",[\"fireworks\"],8,25,31,0],\n    \"1f387\":[[\"\\uD83C\\uDF87\"],\"\\uE440\",\"\\uDBB9\\uDD1D\",[\"sparkler\"],8,26,31,0],\n    \"1f388\":[[\"\\uD83C\\uDF88\"],\"\\uE310\",\"\\uDBB9\\uDD16\",[\"balloon\"],8,27,31,0],\n    \"1f389\":[[\"\\uD83C\\uDF89\"],\"\\uE312\",\"\\uDBB9\\uDD17\",[\"tada\"],8,28,31,0],\n    \"1f38a\":[[\"\\uD83C\\uDF8A\"],\"\",\"\\uDBB9\\uDD20\",[\"confetti_ball\"],8,29,31,0],\n    \"1f38b\":[[\"\\uD83C\\uDF8B\"],\"\",\"\\uDBB9\\uDD21\",[\"tanabata_tree\"],8,30,31,0],\n    \"1f38c\":[[\"\\uD83C\\uDF8C\"],\"\\uE143\",\"\\uDBB9\\uDD14\",[\"crossed_flags\"],8,31,31,0],\n    \"1f38d\":[[\"\\uD83C\\uDF8D\"],\"\\uE436\",\"\\uDBB9\\uDD18\",[\"bamboo\"],8,32,31,0],\n    \"1f38e\":[[\"\\uD83C\\uDF8E\"],\"\\uE438\",\"\\uDBB9\\uDD19\",[\"dolls\"],8,33,31,0],\n    \"1f38f\":[[\"\\uD83C\\uDF8F\"],\"\\uE43B\",\"\\uDBB9\\uDD1C\",[\"flags\"],8,34,31,0],\n    \"1f390\":[[\"\\uD83C\\uDF90\"],\"\\uE442\",\"\\uDBB9\\uDD1E\",[\"wind_chime\"],8,35,31,0],\n    \"1f391\":[[\"\\uD83C\\uDF91\"],\"\\uE446\",\"\\uDBB8\\uDC17\",[\"rice_scene\"],8,36,31,0],\n    \"1f392\":[[\"\\uD83C\\uDF92\"],\"\\uE43A\",\"\\uDBB9\\uDD1B\",[\"school_satchel\"],8,37,31,0],\n    \"1f393\":[[\"\\uD83C\\uDF93\"],\"\\uE439\",\"\\uDBB9\\uDD1A\",[\"mortar_board\"],8,38,31,0],\n    \"1f396\":[[\"\\uD83C\\uDF96\\uFE0F\",\"\\uD83C\\uDF96\"],\"\",\"\",[\"medal\"],8,39,15,0],\n    \"1f397\":[[\"\\uD83C\\uDF97\\uFE0F\",\"\\uD83C\\uDF97\"],\"\",\"\",[\"reminder_ribbon\"],8,40,15,0],\n    \"1f399\":[[\"\\uD83C\\uDF99\\uFE0F\",\"\\uD83C\\uDF99\"],\"\",\"\",[\"studio_microphone\"],8,41,15,0],\n    \"1f39a\":[[\"\\uD83C\\uDF9A\\uFE0F\",\"\\uD83C\\uDF9A\"],\"\",\"\",[\"level_slider\"],8,42,15,0],\n    \"1f39b\":[[\"\\uD83C\\uDF9B\\uFE0F\",\"\\uD83C\\uDF9B\"],\"\",\"\",[\"control_knobs\"],8,43,15,0],\n    \"1f39e\":[[\"\\uD83C\\uDF9E\\uFE0F\",\"\\uD83C\\uDF9E\"],\"\",\"\",[\"film_frames\"],8,44,15,0],\n    \"1f39f\":[[\"\\uD83C\\uDF9F\\uFE0F\",\"\\uD83C\\uDF9F\"],\"\",\"\",[\"admission_tickets\"],8,45,15,0],\n    \"1f3a0\":[[\"\\uD83C\\uDFA0\"],\"\",\"\\uDBB9\\uDFFC\",[\"carousel_horse\"],8,46,31,0],\n    \"1f3a1\":[[\"\\uD83C\\uDFA1\"],\"\\uE124\",\"\\uDBB9\\uDFFD\",[\"ferris_wheel\"],8,47,31,0],\n    \"1f3a2\":[[\"\\uD83C\\uDFA2\"],\"\\uE433\",\"\\uDBB9\\uDFFE\",[\"roller_coaster\"],8,48,31,0],\n    \"1f3a3\":[[\"\\uD83C\\uDFA3\"],\"\",\"\\uDBB9\\uDFFF\",[\"fishing_pole_and_fish\"],8,49,31,0],\n    \"1f3a4\":[[\"\\uD83C\\uDFA4\"],\"\\uE03C\",\"\\uDBBA\\uDC00\",[\"microphone\"],8,50,31,0],\n    \"1f3a5\":[[\"\\uD83C\\uDFA5\"],\"\\uE03D\",\"\\uDBBA\\uDC01\",[\"movie_camera\"],8,51,31,0],\n    \"1f3a6\":[[\"\\uD83C\\uDFA6\"],\"\\uE507\",\"\\uDBBA\\uDC02\",[\"cinema\"],9,0,31,0],\n    \"1f3a7\":[[\"\\uD83C\\uDFA7\"],\"\\uE30A\",\"\\uDBBA\\uDC03\",[\"headphones\"],9,1,31,0],\n    \"1f3a8\":[[\"\\uD83C\\uDFA8\"],\"\\uE502\",\"\\uDBBA\\uDC04\",[\"art\"],9,2,31,0],\n    \"1f3a9\":[[\"\\uD83C\\uDFA9\"],\"\\uE503\",\"\\uDBBA\\uDC05\",[\"tophat\"],9,3,31,0],\n    \"1f3aa\":[[\"\\uD83C\\uDFAA\"],\"\",\"\\uDBBA\\uDC06\",[\"circus_tent\"],9,4,31,0],\n    \"1f3ab\":[[\"\\uD83C\\uDFAB\"],\"\\uE125\",\"\\uDBBA\\uDC07\",[\"ticket\"],9,5,31,0],\n    \"1f3ac\":[[\"\\uD83C\\uDFAC\"],\"\\uE324\",\"\\uDBBA\\uDC08\",[\"clapper\"],9,6,31,0],\n    \"1f3ad\":[[\"\\uD83C\\uDFAD\"],\"\",\"\\uDBBA\\uDC09\",[\"performing_arts\"],9,7,31,0],\n    \"1f3ae\":[[\"\\uD83C\\uDFAE\"],\"\",\"\\uDBBA\\uDC0A\",[\"video_game\"],9,8,31,0],\n    \"1f3af\":[[\"\\uD83C\\uDFAF\"],\"\\uE130\",\"\\uDBBA\\uDC0C\",[\"dart\"],9,9,31,0],\n    \"1f3b0\":[[\"\\uD83C\\uDFB0\"],\"\\uE133\",\"\\uDBBA\\uDC0D\",[\"slot_machine\"],9,10,31,0],\n    \"1f3b1\":[[\"\\uD83C\\uDFB1\"],\"\\uE42C\",\"\\uDBBA\\uDC0E\",[\"8ball\"],9,11,31,0],\n    \"1f3b2\":[[\"\\uD83C\\uDFB2\"],\"\",\"\\uDBBA\\uDC0F\",[\"game_die\"],9,12,31,0],\n    \"1f3b3\":[[\"\\uD83C\\uDFB3\"],\"\",\"\\uDBBA\\uDC10\",[\"bowling\"],9,13,31,0],\n    \"1f3b4\":[[\"\\uD83C\\uDFB4\"],\"\",\"\\uDBBA\\uDC11\",[\"flower_playing_cards\"],9,14,31,0],\n    \"1f3b5\":[[\"\\uD83C\\uDFB5\"],\"\\uE03E\",\"\\uDBBA\\uDC13\",[\"musical_note\"],9,15,31,0],\n    \"1f3b6\":[[\"\\uD83C\\uDFB6\"],\"\\uE326\",\"\\uDBBA\\uDC14\",[\"notes\"],9,16,31,0],\n    \"1f3b7\":[[\"\\uD83C\\uDFB7\"],\"\\uE040\",\"\\uDBBA\\uDC15\",[\"saxophone\"],9,17,31,0],\n    \"1f3b8\":[[\"\\uD83C\\uDFB8\"],\"\\uE041\",\"\\uDBBA\\uDC16\",[\"guitar\"],9,18,31,0],\n    \"1f3b9\":[[\"\\uD83C\\uDFB9\"],\"\",\"\\uDBBA\\uDC17\",[\"musical_keyboard\"],9,19,31,0],\n    \"1f3ba\":[[\"\\uD83C\\uDFBA\"],\"\\uE042\",\"\\uDBBA\\uDC18\",[\"trumpet\"],9,20,31,0],\n    \"1f3bb\":[[\"\\uD83C\\uDFBB\"],\"\",\"\\uDBBA\\uDC19\",[\"violin\"],9,21,31,0],\n    \"1f3bc\":[[\"\\uD83C\\uDFBC\"],\"\",\"\\uDBBA\\uDC1A\",[\"musical_score\"],9,22,31,0],\n    \"1f3bd\":[[\"\\uD83C\\uDFBD\"],\"\",\"\\uDBB9\\uDFD0\",[\"running_shirt_with_sash\"],9,23,31,0],\n    \"1f3be\":[[\"\\uD83C\\uDFBE\"],\"\\uE015\",\"\\uDBB9\\uDFD3\",[\"tennis\"],9,24,31,0],\n    \"1f3bf\":[[\"\\uD83C\\uDFBF\"],\"\\uE013\",\"\\uDBB9\\uDFD5\",[\"ski\"],9,25,31,0],\n    \"1f3c0\":[[\"\\uD83C\\uDFC0\"],\"\\uE42A\",\"\\uDBB9\\uDFD6\",[\"basketball\"],9,26,31,0],\n    \"1f3c1\":[[\"\\uD83C\\uDFC1\"],\"\\uE132\",\"\\uDBB9\\uDFD7\",[\"checkered_flag\"],9,27,31,0],\n    \"1f3c2\":[[\"\\uD83C\\uDFC2\"],\"\",\"\\uDBB9\\uDFD8\",[\"snowboarder\"],9,28,31,0],\n    \"1f3c3-200d-2640-fe0f\":[[\"\\uD83C\\uDFC3\\u200D\\u2640\\uFE0F\",\"\\uD83C\\uDFC3\\u200D\\u2640\"],\"\",\"\",[\"woman-running\"],9,34,15,0],\n    \"1f3c3-200d-2642-fe0f\":[[\"\\uD83C\\uDFC3\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\u200D\\u2642\",\"\\uD83C\\uDFC3\"],\"\",\"\",[\"man-running\",\"runner\",\"running\"],9,40,15,0],\n    \"1f3c4-200d-2640-fe0f\":[[\"\\uD83C\\uDFC4\\u200D\\u2640\\uFE0F\",\"\\uD83C\\uDFC4\\u200D\\u2640\"],\"\",\"\",[\"woman-surfing\"],10,0,15,0],\n    \"1f3c4-200d-2642-fe0f\":[[\"\\uD83C\\uDFC4\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\u200D\\u2642\",\"\\uD83C\\uDFC4\"],\"\",\"\",[\"man-surfing\",\"surfer\"],10,6,15,0],\n    \"1f3c5\":[[\"\\uD83C\\uDFC5\"],\"\",\"\",[\"sports_medal\"],10,18,15,0],\n    \"1f3c6\":[[\"\\uD83C\\uDFC6\"],\"\\uE131\",\"\\uDBB9\\uDFDB\",[\"trophy\"],10,19,31,0],\n    \"1f3c7\":[[\"\\uD83C\\uDFC7\"],\"\",\"\",[\"horse_racing\"],10,20,31,0],\n    \"1f3c8\":[[\"\\uD83C\\uDFC8\"],\"\\uE42B\",\"\\uDBB9\\uDFDD\",[\"football\"],10,26,31,0],\n    \"1f3c9\":[[\"\\uD83C\\uDFC9\"],\"\",\"\",[\"rugby_football\"],10,27,31,0],\n    \"1f3ca-200d-2640-fe0f\":[[\"\\uD83C\\uDFCA\\u200D\\u2640\\uFE0F\",\"\\uD83C\\uDFCA\\u200D\\u2640\"],\"\",\"\",[\"woman-swimming\"],10,28,15,0],\n    \"1f3ca-200d-2642-fe0f\":[[\"\\uD83C\\uDFCA\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\u200D\\u2642\",\"\\uD83C\\uDFCA\"],\"\",\"\",[\"man-swimming\",\"swimmer\"],10,34,15,0],\n    \"1f3cb-fe0f-200d-2640-fe0f\":[[\"\\uD83C\\uDFCB\\uFE0F\\u200D\\u2640\\uFE0F\"],\"\",\"\",[\"woman-lifting-weights\"],10,46,7,0],\n    \"1f3cb-fe0f-200d-2642-fe0f\":[[\"\\uD83C\\uDFCB\\uFE0F\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uFE0F\",\"\\uD83C\\uDFCB\"],\"\",\"\",[\"man-lifting-weights\",\"weight_lifter\"],11,0,7,0],\n    \"1f3cc-fe0f-200d-2640-fe0f\":[[\"\\uD83C\\uDFCC\\uFE0F\\u200D\\u2640\\uFE0F\"],\"\",\"\",[\"woman-golfing\"],11,12,7,0],\n    \"1f3cc-fe0f-200d-2642-fe0f\":[[\"\\uD83C\\uDFCC\\uFE0F\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uFE0F\",\"\\uD83C\\uDFCC\"],\"\",\"\",[\"man-golfing\",\"golfer\"],11,18,7,0],\n    \"1f3cd\":[[\"\\uD83C\\uDFCD\\uFE0F\",\"\\uD83C\\uDFCD\"],\"\",\"\",[\"racing_motorcycle\"],11,30,15,0],\n    \"1f3ce\":[[\"\\uD83C\\uDFCE\\uFE0F\",\"\\uD83C\\uDFCE\"],\"\",\"\",[\"racing_car\"],11,31,15,0],\n    \"1f3cf\":[[\"\\uD83C\\uDFCF\"],\"\",\"\",[\"cricket_bat_and_ball\"],11,32,15,0],\n    \"1f3d0\":[[\"\\uD83C\\uDFD0\"],\"\",\"\",[\"volleyball\"],11,33,15,0],\n    \"1f3d1\":[[\"\\uD83C\\uDFD1\"],\"\",\"\",[\"field_hockey_stick_and_ball\"],11,34,15,0],\n    \"1f3d2\":[[\"\\uD83C\\uDFD2\"],\"\",\"\",[\"ice_hockey_stick_and_puck\"],11,35,15,0],\n    \"1f3d3\":[[\"\\uD83C\\uDFD3\"],\"\",\"\",[\"table_tennis_paddle_and_ball\"],11,36,15,0],\n    \"1f3d4\":[[\"\\uD83C\\uDFD4\\uFE0F\",\"\\uD83C\\uDFD4\"],\"\",\"\",[\"snow_capped_mountain\"],11,37,15,0],\n    \"1f3d5\":[[\"\\uD83C\\uDFD5\\uFE0F\",\"\\uD83C\\uDFD5\"],\"\",\"\",[\"camping\"],11,38,15,0],\n    \"1f3d6\":[[\"\\uD83C\\uDFD6\\uFE0F\",\"\\uD83C\\uDFD6\"],\"\",\"\",[\"beach_with_umbrella\"],11,39,15,0],\n    \"1f3d7\":[[\"\\uD83C\\uDFD7\\uFE0F\",\"\\uD83C\\uDFD7\"],\"\",\"\",[\"building_construction\"],11,40,15,0],\n    \"1f3d8\":[[\"\\uD83C\\uDFD8\\uFE0F\",\"\\uD83C\\uDFD8\"],\"\",\"\",[\"house_buildings\"],11,41,15,0],\n    \"1f3d9\":[[\"\\uD83C\\uDFD9\\uFE0F\",\"\\uD83C\\uDFD9\"],\"\",\"\",[\"cityscape\"],11,42,15,0],\n    \"1f3da\":[[\"\\uD83C\\uDFDA\\uFE0F\",\"\\uD83C\\uDFDA\"],\"\",\"\",[\"derelict_house_building\"],11,43,15,0],\n    \"1f3db\":[[\"\\uD83C\\uDFDB\\uFE0F\",\"\\uD83C\\uDFDB\"],\"\",\"\",[\"classical_building\"],11,44,15,0],\n    \"1f3dc\":[[\"\\uD83C\\uDFDC\\uFE0F\",\"\\uD83C\\uDFDC\"],\"\",\"\",[\"desert\"],11,45,15,0],\n    \"1f3dd\":[[\"\\uD83C\\uDFDD\\uFE0F\",\"\\uD83C\\uDFDD\"],\"\",\"\",[\"desert_island\"],11,46,15,0],\n    \"1f3de\":[[\"\\uD83C\\uDFDE\\uFE0F\",\"\\uD83C\\uDFDE\"],\"\",\"\",[\"national_park\"],11,47,15,0],\n    \"1f3df\":[[\"\\uD83C\\uDFDF\\uFE0F\",\"\\uD83C\\uDFDF\"],\"\",\"\",[\"stadium\"],11,48,15,0],\n    \"1f3e0\":[[\"\\uD83C\\uDFE0\"],\"\\uE036\",\"\\uDBB9\\uDCB0\",[\"house\"],11,49,31,0],\n    \"1f3e1\":[[\"\\uD83C\\uDFE1\"],\"\",\"\\uDBB9\\uDCB1\",[\"house_with_garden\"],11,50,31,0],\n    \"1f3e2\":[[\"\\uD83C\\uDFE2\"],\"\\uE038\",\"\\uDBB9\\uDCB2\",[\"office\"],11,51,31,0],\n    \"1f3e3\":[[\"\\uD83C\\uDFE3\"],\"\\uE153\",\"\\uDBB9\\uDCB3\",[\"post_office\"],12,0,31,0],\n    \"1f3e4\":[[\"\\uD83C\\uDFE4\"],\"\",\"\",[\"european_post_office\"],12,1,31,0],\n    \"1f3e5\":[[\"\\uD83C\\uDFE5\"],\"\\uE155\",\"\\uDBB9\\uDCB4\",[\"hospital\"],12,2,31,0],\n    \"1f3e6\":[[\"\\uD83C\\uDFE6\"],\"\\uE14D\",\"\\uDBB9\\uDCB5\",[\"bank\"],12,3,31,0],\n    \"1f3e7\":[[\"\\uD83C\\uDFE7\"],\"\\uE154\",\"\\uDBB9\\uDCB6\",[\"atm\"],12,4,31,0],\n    \"1f3e8\":[[\"\\uD83C\\uDFE8\"],\"\\uE158\",\"\\uDBB9\\uDCB7\",[\"hotel\"],12,5,31,0],\n    \"1f3e9\":[[\"\\uD83C\\uDFE9\"],\"\\uE501\",\"\\uDBB9\\uDCB8\",[\"love_hotel\"],12,6,31,0],\n    \"1f3ea\":[[\"\\uD83C\\uDFEA\"],\"\\uE156\",\"\\uDBB9\\uDCB9\",[\"convenience_store\"],12,7,31,0],\n    \"1f3eb\":[[\"\\uD83C\\uDFEB\"],\"\\uE157\",\"\\uDBB9\\uDCBA\",[\"school\"],12,8,31,0],\n    \"1f3ec\":[[\"\\uD83C\\uDFEC\"],\"\\uE504\",\"\\uDBB9\\uDCBD\",[\"department_store\"],12,9,31,0],\n    \"1f3ed\":[[\"\\uD83C\\uDFED\"],\"\\uE508\",\"\\uDBB9\\uDCC0\",[\"factory\"],12,10,31,0],\n    \"1f3ee\":[[\"\\uD83C\\uDFEE\"],\"\",\"\\uDBB9\\uDCC2\",[\"izakaya_lantern\",\"lantern\"],12,11,31,0],\n    \"1f3ef\":[[\"\\uD83C\\uDFEF\"],\"\\uE505\",\"\\uDBB9\\uDCBE\",[\"japanese_castle\"],12,12,31,0],\n    \"1f3f0\":[[\"\\uD83C\\uDFF0\"],\"\\uE506\",\"\\uDBB9\\uDCBF\",[\"european_castle\"],12,13,31,0],\n    \"1f3f3-fe0f-200d-1f308\":[[\"\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08\",\"\\uD83C\\uDFF3\\u200D\\uD83C\\uDF08\"],\"\",\"\",[\"rainbow-flag\"],12,14,31,0],\n    \"1f3f3\":[[\"\\uD83C\\uDFF3\\uFE0F\",\"\\uD83C\\uDFF3\"],\"\",\"\",[\"waving_white_flag\"],12,15,15,0],\n    \"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":[[\"\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67\\uDB40\\uDC7F\"],\"\",\"\",[\"flag-england\"],12,16,15,0],\n    \"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":[[\"\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74\\uDB40\\uDC7F\"],\"\",\"\",[\"flag-scotland\"],12,17,15,0],\n    \"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":[[\"\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73\\uDB40\\uDC7F\"],\"\",\"\",[\"flag-wales\"],12,18,15,0],\n    \"1f3f4\":[[\"\\uD83C\\uDFF4\"],\"\",\"\",[\"waving_black_flag\"],12,19,15,0],\n    \"1f3f5\":[[\"\\uD83C\\uDFF5\\uFE0F\",\"\\uD83C\\uDFF5\"],\"\",\"\",[\"rosette\"],12,20,15,0],\n    \"1f3f7\":[[\"\\uD83C\\uDFF7\\uFE0F\",\"\\uD83C\\uDFF7\"],\"\",\"\",[\"label\"],12,21,15,0],\n    \"1f3f8\":[[\"\\uD83C\\uDFF8\"],\"\",\"\",[\"badminton_racquet_and_shuttlecock\"],12,22,15,0],\n    \"1f3f9\":[[\"\\uD83C\\uDFF9\"],\"\",\"\",[\"bow_and_arrow\"],12,23,15,0],\n    \"1f3fa\":[[\"\\uD83C\\uDFFA\"],\"\",\"\",[\"amphora\"],12,24,15,0],\n    \"1f3fb\":[[\"\\uD83C\\uDFFB\"],\"\",\"\",[\"skin-tone-2\"],12,25,15,0],\n    \"1f3fc\":[[\"\\uD83C\\uDFFC\"],\"\",\"\",[\"skin-tone-3\"],12,26,15,0],\n    \"1f3fd\":[[\"\\uD83C\\uDFFD\"],\"\",\"\",[\"skin-tone-4\"],12,27,15,0],\n    \"1f3fe\":[[\"\\uD83C\\uDFFE\"],\"\",\"\",[\"skin-tone-5\"],12,28,15,0],\n    \"1f3ff\":[[\"\\uD83C\\uDFFF\"],\"\",\"\",[\"skin-tone-6\"],12,29,15,0],\n    \"1f400\":[[\"\\uD83D\\uDC00\"],\"\",\"\",[\"rat\"],12,30,31,0],\n    \"1f401\":[[\"\\uD83D\\uDC01\"],\"\",\"\",[\"mouse2\"],12,31,31,0],\n    \"1f402\":[[\"\\uD83D\\uDC02\"],\"\",\"\",[\"ox\"],12,32,31,0],\n    \"1f403\":[[\"\\uD83D\\uDC03\"],\"\",\"\",[\"water_buffalo\"],12,33,31,0],\n    \"1f404\":[[\"\\uD83D\\uDC04\"],\"\",\"\",[\"cow2\"],12,34,31,0],\n    \"1f405\":[[\"\\uD83D\\uDC05\"],\"\",\"\",[\"tiger2\"],12,35,31,0],\n    \"1f406\":[[\"\\uD83D\\uDC06\"],\"\",\"\",[\"leopard\"],12,36,31,0],\n    \"1f407\":[[\"\\uD83D\\uDC07\"],\"\",\"\",[\"rabbit2\"],12,37,31,0],\n    \"1f408\":[[\"\\uD83D\\uDC08\"],\"\",\"\",[\"cat2\"],12,38,31,0],\n    \"1f409\":[[\"\\uD83D\\uDC09\"],\"\",\"\",[\"dragon\"],12,39,31,0],\n    \"1f40a\":[[\"\\uD83D\\uDC0A\"],\"\",\"\",[\"crocodile\"],12,40,31,0],\n    \"1f40b\":[[\"\\uD83D\\uDC0B\"],\"\",\"\",[\"whale2\"],12,41,31,0],\n    \"1f40c\":[[\"\\uD83D\\uDC0C\"],\"\",\"\\uDBB8\\uDDB9\",[\"snail\"],12,42,31,0],\n    \"1f40d\":[[\"\\uD83D\\uDC0D\"],\"\\uE52D\",\"\\uDBB8\\uDDD3\",[\"snake\"],12,43,31,0],\n    \"1f40e\":[[\"\\uD83D\\uDC0E\"],\"\\uE134\",\"\\uDBB9\\uDFDC\",[\"racehorse\"],12,44,31,0],\n    \"1f40f\":[[\"\\uD83D\\uDC0F\"],\"\",\"\",[\"ram\"],12,45,31,0],\n    \"1f410\":[[\"\\uD83D\\uDC10\"],\"\",\"\",[\"goat\"],12,46,31,0],\n    \"1f411\":[[\"\\uD83D\\uDC11\"],\"\\uE529\",\"\\uDBB8\\uDDCF\",[\"sheep\"],12,47,31,0],\n    \"1f412\":[[\"\\uD83D\\uDC12\"],\"\\uE528\",\"\\uDBB8\\uDDCE\",[\"monkey\"],12,48,31,0],\n    \"1f413\":[[\"\\uD83D\\uDC13\"],\"\",\"\",[\"rooster\"],12,49,31,0],\n    \"1f414\":[[\"\\uD83D\\uDC14\"],\"\\uE52E\",\"\\uDBB8\\uDDD4\",[\"chicken\"],12,50,31,0],\n    \"1f415\":[[\"\\uD83D\\uDC15\"],\"\",\"\",[\"dog2\"],12,51,31,0],\n    \"1f416\":[[\"\\uD83D\\uDC16\"],\"\",\"\",[\"pig2\"],13,0,31,0],\n    \"1f417\":[[\"\\uD83D\\uDC17\"],\"\\uE52F\",\"\\uDBB8\\uDDD5\",[\"boar\"],13,1,31,0],\n    \"1f418\":[[\"\\uD83D\\uDC18\"],\"\\uE526\",\"\\uDBB8\\uDDCC\",[\"elephant\"],13,2,31,0],\n    \"1f419\":[[\"\\uD83D\\uDC19\"],\"\\uE10A\",\"\\uDBB8\\uDDC5\",[\"octopus\"],13,3,31,0],\n    \"1f41a\":[[\"\\uD83D\\uDC1A\"],\"\\uE441\",\"\\uDBB8\\uDDC6\",[\"shell\"],13,4,31,0],\n    \"1f41b\":[[\"\\uD83D\\uDC1B\"],\"\\uE525\",\"\\uDBB8\\uDDCB\",[\"bug\"],13,5,31,0],\n    \"1f41c\":[[\"\\uD83D\\uDC1C\"],\"\",\"\\uDBB8\\uDDDA\",[\"ant\"],13,6,31,0],\n    \"1f41d\":[[\"\\uD83D\\uDC1D\"],\"\",\"\\uDBB8\\uDDE1\",[\"bee\",\"honeybee\"],13,7,31,0],\n    \"1f41e\":[[\"\\uD83D\\uDC1E\"],\"\",\"\\uDBB8\\uDDE2\",[\"beetle\"],13,8,31,0],\n    \"1f41f\":[[\"\\uD83D\\uDC1F\"],\"\\uE019\",\"\\uDBB8\\uDDBD\",[\"fish\"],13,9,31,0],\n    \"1f420\":[[\"\\uD83D\\uDC20\"],\"\\uE522\",\"\\uDBB8\\uDDC9\",[\"tropical_fish\"],13,10,31,0],\n    \"1f421\":[[\"\\uD83D\\uDC21\"],\"\",\"\\uDBB8\\uDDD9\",[\"blowfish\"],13,11,31,0],\n    \"1f422\":[[\"\\uD83D\\uDC22\"],\"\",\"\\uDBB8\\uDDDC\",[\"turtle\"],13,12,31,0],\n    \"1f423\":[[\"\\uD83D\\uDC23\"],\"\",\"\\uDBB8\\uDDDD\",[\"hatching_chick\"],13,13,31,0],\n    \"1f424\":[[\"\\uD83D\\uDC24\"],\"\\uE523\",\"\\uDBB8\\uDDBA\",[\"baby_chick\"],13,14,31,0],\n    \"1f425\":[[\"\\uD83D\\uDC25\"],\"\",\"\\uDBB8\\uDDBB\",[\"hatched_chick\"],13,15,31,0],\n    \"1f426\":[[\"\\uD83D\\uDC26\"],\"\\uE521\",\"\\uDBB8\\uDDC8\",[\"bird\"],13,16,31,0],\n    \"1f427\":[[\"\\uD83D\\uDC27\"],\"\\uE055\",\"\\uDBB8\\uDDBC\",[\"penguin\"],13,17,31,0],\n    \"1f428\":[[\"\\uD83D\\uDC28\"],\"\\uE527\",\"\\uDBB8\\uDDCD\",[\"koala\"],13,18,31,0],\n    \"1f429\":[[\"\\uD83D\\uDC29\"],\"\",\"\\uDBB8\\uDDD8\",[\"poodle\"],13,19,31,0],\n    \"1f42a\":[[\"\\uD83D\\uDC2A\"],\"\",\"\",[\"dromedary_camel\"],13,20,31,0],\n    \"1f42b\":[[\"\\uD83D\\uDC2B\"],\"\\uE530\",\"\\uDBB8\\uDDD6\",[\"camel\"],13,21,31,0],\n    \"1f42c\":[[\"\\uD83D\\uDC2C\"],\"\\uE520\",\"\\uDBB8\\uDDC7\",[\"dolphin\",\"flipper\"],13,22,31,0],\n    \"1f42d\":[[\"\\uD83D\\uDC2D\"],\"\\uE053\",\"\\uDBB8\\uDDC2\",[\"mouse\"],13,23,31,0],\n    \"1f42e\":[[\"\\uD83D\\uDC2E\"],\"\\uE52B\",\"\\uDBB8\\uDDD1\",[\"cow\"],13,24,31,0],\n    \"1f42f\":[[\"\\uD83D\\uDC2F\"],\"\\uE050\",\"\\uDBB8\\uDDC0\",[\"tiger\"],13,25,31,0],\n    \"1f430\":[[\"\\uD83D\\uDC30\"],\"\\uE52C\",\"\\uDBB8\\uDDD2\",[\"rabbit\"],13,26,31,0],\n    \"1f431\":[[\"\\uD83D\\uDC31\"],\"\\uE04F\",\"\\uDBB8\\uDDB8\",[\"cat\"],13,27,31,0],\n    \"1f432\":[[\"\\uD83D\\uDC32\"],\"\",\"\\uDBB8\\uDDDE\",[\"dragon_face\"],13,28,31,0],\n    \"1f433\":[[\"\\uD83D\\uDC33\"],\"\\uE054\",\"\\uDBB8\\uDDC3\",[\"whale\"],13,29,31,0],\n    \"1f434\":[[\"\\uD83D\\uDC34\"],\"\\uE01A\",\"\\uDBB8\\uDDBE\",[\"horse\"],13,30,31,0],\n    \"1f435\":[[\"\\uD83D\\uDC35\"],\"\\uE109\",\"\\uDBB8\\uDDC4\",[\"monkey_face\"],13,31,31,0],\n    \"1f436\":[[\"\\uD83D\\uDC36\"],\"\\uE052\",\"\\uDBB8\\uDDB7\",[\"dog\"],13,32,31,0],\n    \"1f437\":[[\"\\uD83D\\uDC37\"],\"\\uE10B\",\"\\uDBB8\\uDDBF\",[\"pig\"],13,33,31,0],\n    \"1f438\":[[\"\\uD83D\\uDC38\"],\"\\uE531\",\"\\uDBB8\\uDDD7\",[\"frog\"],13,34,31,0],\n    \"1f439\":[[\"\\uD83D\\uDC39\"],\"\\uE524\",\"\\uDBB8\\uDDCA\",[\"hamster\"],13,35,31,0],\n    \"1f43a\":[[\"\\uD83D\\uDC3A\"],\"\\uE52A\",\"\\uDBB8\\uDDD0\",[\"wolf\"],13,36,31,0],\n    \"1f43b\":[[\"\\uD83D\\uDC3B\"],\"\\uE051\",\"\\uDBB8\\uDDC1\",[\"bear\"],13,37,31,0],\n    \"1f43c\":[[\"\\uD83D\\uDC3C\"],\"\",\"\\uDBB8\\uDDDF\",[\"panda_face\"],13,38,31,0],\n    \"1f43d\":[[\"\\uD83D\\uDC3D\"],\"\",\"\\uDBB8\\uDDE0\",[\"pig_nose\"],13,39,31,0],\n    \"1f43e\":[[\"\\uD83D\\uDC3E\"],\"\",\"\\uDBB8\\uDDDB\",[\"feet\",\"paw_prints\"],13,40,31,0],\n    \"1f43f\":[[\"\\uD83D\\uDC3F\\uFE0F\",\"\\uD83D\\uDC3F\"],\"\",\"\",[\"chipmunk\"],13,41,15,0],\n    \"1f440\":[[\"\\uD83D\\uDC40\"],\"\\uE419\",\"\\uDBB8\\uDD90\",[\"eyes\"],13,42,31,0],\n    \"1f441-fe0f-200d-1f5e8-fe0f\":[[\"\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F\"],\"\",\"\",[\"eye-in-speech-bubble\"],13,43,3,0],\n    \"1f441\":[[\"\\uD83D\\uDC41\\uFE0F\",\"\\uD83D\\uDC41\"],\"\",\"\",[\"eye\"],13,44,15,0],\n    \"1f442\":[[\"\\uD83D\\uDC42\"],\"\\uE41B\",\"\\uDBB8\\uDD91\",[\"ear\"],13,45,31,0],\n    \"1f443\":[[\"\\uD83D\\uDC43\"],\"\\uE41A\",\"\\uDBB8\\uDD92\",[\"nose\"],13,51,31,0],\n    \"1f444\":[[\"\\uD83D\\uDC44\"],\"\\uE41C\",\"\\uDBB8\\uDD93\",[\"lips\"],14,5,31,0],\n    \"1f445\":[[\"\\uD83D\\uDC45\"],\"\",\"\\uDBB8\\uDD94\",[\"tongue\"],14,6,31,0],\n    \"1f446\":[[\"\\uD83D\\uDC46\"],\"\\uE22E\",\"\\uDBBA\\uDF99\",[\"point_up_2\"],14,7,31,0],\n    \"1f447\":[[\"\\uD83D\\uDC47\"],\"\\uE22F\",\"\\uDBBA\\uDF9A\",[\"point_down\"],14,13,31,0],\n    \"1f448\":[[\"\\uD83D\\uDC48\"],\"\\uE230\",\"\\uDBBA\\uDF9B\",[\"point_left\"],14,19,31,0],\n    \"1f449\":[[\"\\uD83D\\uDC49\"],\"\\uE231\",\"\\uDBBA\\uDF9C\",[\"point_right\"],14,25,31,0],\n    \"1f44a\":[[\"\\uD83D\\uDC4A\"],\"\\uE00D\",\"\\uDBBA\\uDF96\",[\"facepunch\",\"punch\"],14,31,31,0],\n    \"1f44b\":[[\"\\uD83D\\uDC4B\"],\"\\uE41E\",\"\\uDBBA\\uDF9D\",[\"wave\"],14,37,31,0],\n    \"1f44c\":[[\"\\uD83D\\uDC4C\"],\"\\uE420\",\"\\uDBBA\\uDF9F\",[\"ok_hand\"],14,43,31,0],\n    \"1f44d\":[[\"\\uD83D\\uDC4D\"],\"\\uE00E\",\"\\uDBBA\\uDF97\",[\"+1\",\"thumbsup\"],14,49,31,0],\n    \"1f44e\":[[\"\\uD83D\\uDC4E\"],\"\\uE421\",\"\\uDBBA\\uDFA0\",[\"-1\",\"thumbsdown\"],15,3,31,0],\n    \"1f44f\":[[\"\\uD83D\\uDC4F\"],\"\\uE41F\",\"\\uDBBA\\uDF9E\",[\"clap\"],15,9,31,0],\n    \"1f450\":[[\"\\uD83D\\uDC50\"],\"\\uE422\",\"\\uDBBA\\uDFA1\",[\"open_hands\"],15,15,31,0],\n    \"1f451\":[[\"\\uD83D\\uDC51\"],\"\\uE10E\",\"\\uDBB9\\uDCD1\",[\"crown\"],15,21,31,0],\n    \"1f452\":[[\"\\uD83D\\uDC52\"],\"\\uE318\",\"\\uDBB9\\uDCD4\",[\"womans_hat\"],15,22,31,0],\n    \"1f453\":[[\"\\uD83D\\uDC53\"],\"\",\"\\uDBB9\\uDCCE\",[\"eyeglasses\"],15,23,31,0],\n    \"1f454\":[[\"\\uD83D\\uDC54\"],\"\\uE302\",\"\\uDBB9\\uDCD3\",[\"necktie\"],15,24,31,0],\n    \"1f455\":[[\"\\uD83D\\uDC55\"],\"\\uE006\",\"\\uDBB9\\uDCCF\",[\"shirt\",\"tshirt\"],15,25,31,0],\n    \"1f456\":[[\"\\uD83D\\uDC56\"],\"\",\"\\uDBB9\\uDCD0\",[\"jeans\"],15,26,31,0],\n    \"1f457\":[[\"\\uD83D\\uDC57\"],\"\\uE319\",\"\\uDBB9\\uDCD5\",[\"dress\"],15,27,31,0],\n    \"1f458\":[[\"\\uD83D\\uDC58\"],\"\\uE321\",\"\\uDBB9\\uDCD9\",[\"kimono\"],15,28,31,0],\n    \"1f459\":[[\"\\uD83D\\uDC59\"],\"\\uE322\",\"\\uDBB9\\uDCDA\",[\"bikini\"],15,29,31,0],\n    \"1f45a\":[[\"\\uD83D\\uDC5A\"],\"\",\"\\uDBB9\\uDCDB\",[\"womans_clothes\"],15,30,31,0],\n    \"1f45b\":[[\"\\uD83D\\uDC5B\"],\"\",\"\\uDBB9\\uDCDC\",[\"purse\"],15,31,31,0],\n    \"1f45c\":[[\"\\uD83D\\uDC5C\"],\"\\uE323\",\"\\uDBB9\\uDCF0\",[\"handbag\"],15,32,31,0],\n    \"1f45d\":[[\"\\uD83D\\uDC5D\"],\"\",\"\\uDBB9\\uDCF1\",[\"pouch\"],15,33,31,0],\n    \"1f45e\":[[\"\\uD83D\\uDC5E\"],\"\",\"\\uDBB9\\uDCCC\",[\"mans_shoe\",\"shoe\"],15,34,31,0],\n    \"1f45f\":[[\"\\uD83D\\uDC5F\"],\"\\uE007\",\"\\uDBB9\\uDCCD\",[\"athletic_shoe\"],15,35,31,0],\n    \"1f460\":[[\"\\uD83D\\uDC60\"],\"\\uE13E\",\"\\uDBB9\\uDCD6\",[\"high_heel\"],15,36,31,0],\n    \"1f461\":[[\"\\uD83D\\uDC61\"],\"\\uE31A\",\"\\uDBB9\\uDCD7\",[\"sandal\"],15,37,31,0],\n    \"1f462\":[[\"\\uD83D\\uDC62\"],\"\\uE31B\",\"\\uDBB9\\uDCD8\",[\"boot\"],15,38,31,0],\n    \"1f463\":[[\"\\uD83D\\uDC63\"],\"\\uE536\",\"\\uDBB9\\uDD53\",[\"footprints\"],15,39,31,0],\n    \"1f464\":[[\"\\uD83D\\uDC64\"],\"\",\"\\uDBB8\\uDD9A\",[\"bust_in_silhouette\"],15,40,31,0],\n    \"1f465\":[[\"\\uD83D\\uDC65\"],\"\",\"\",[\"busts_in_silhouette\"],15,41,31,0],\n    \"1f466\":[[\"\\uD83D\\uDC66\"],\"\\uE001\",\"\\uDBB8\\uDD9B\",[\"boy\"],15,42,31,0],\n    \"1f467\":[[\"\\uD83D\\uDC67\"],\"\\uE002\",\"\\uDBB8\\uDD9C\",[\"girl\"],15,48,31,0],\n    \"1f468-200d-1f33e\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDF3E\"],\"\",\"\",[\"male-farmer\"],16,2,15,0],\n    \"1f468-200d-1f373\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDF73\"],\"\",\"\",[\"male-cook\"],16,8,15,0],\n    \"1f468-200d-1f393\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDF93\"],\"\",\"\",[\"male-student\"],16,14,15,0],\n    \"1f468-200d-1f3a4\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDFA4\"],\"\",\"\",[\"male-singer\"],16,20,15,0],\n    \"1f468-200d-1f3a8\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDFA8\"],\"\",\"\",[\"male-artist\"],16,26,15,0],\n    \"1f468-200d-1f3eb\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDFEB\"],\"\",\"\",[\"male-teacher\"],16,32,15,0],\n    \"1f468-200d-1f3ed\":[[\"\\uD83D\\uDC68\\u200D\\uD83C\\uDFED\"],\"\",\"\",[\"male-factory-worker\"],16,38,15,0],\n    \"1f468-200d-1f466-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-boy-boy\"],16,44,15,0],\n    \"1f468-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-boy\"],16,45,15,0],\n    \"1f468-200d-1f467-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-girl-boy\"],16,46,15,0],\n    \"1f468-200d-1f467-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-girl-girl\"],16,47,15,0],\n    \"1f468-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-girl\"],16,48,15,0],\n    \"1f468-200d-1f468-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC68\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-man-boy\"],16,49,31,0],\n    \"1f468-200d-1f468-200d-1f466-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC68\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-man-boy-boy\"],16,50,31,0],\n    \"1f468-200d-1f468-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-man-girl\"],16,51,31,0],\n    \"1f468-200d-1f468-200d-1f467-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-man-girl-boy\"],17,0,31,0],\n    \"1f468-200d-1f468-200d-1f467-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC68\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-man-girl-girl\"],17,1,31,0],\n    \"1f468-200d-1f469-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\",\"\\uD83D\\uDC6A\"],\"\",\"\",[\"man-woman-boy\",\"family\"],17,2,31,0],\n    \"1f468-200d-1f469-200d-1f466-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-woman-boy-boy\"],17,3,31,0],\n    \"1f468-200d-1f469-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-woman-girl\"],17,4,31,0],\n    \"1f468-200d-1f469-200d-1f467-200d-1f466\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"man-woman-girl-boy\"],17,5,31,0],\n    \"1f468-200d-1f469-200d-1f467-200d-1f467\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"man-woman-girl-girl\"],17,6,31,0],\n    \"1f468-200d-1f4bb\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDCBB\"],\"\",\"\",[\"male-technologist\"],17,7,15,0],\n    \"1f468-200d-1f4bc\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDCBC\"],\"\",\"\",[\"male-office-worker\"],17,13,15,0],\n    \"1f468-200d-1f527\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDD27\"],\"\",\"\",[\"male-mechanic\"],17,19,15,0],\n    \"1f468-200d-1f52c\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDD2C\"],\"\",\"\",[\"male-scientist\"],17,25,15,0],\n    \"1f468-200d-1f680\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDE80\"],\"\",\"\",[\"male-astronaut\"],17,31,15,0],\n    \"1f468-200d-1f692\":[[\"\\uD83D\\uDC68\\u200D\\uD83D\\uDE92\"],\"\",\"\",[\"male-firefighter\"],17,37,15,0],\n    \"1f468-200d-2695-fe0f\":[[\"\\uD83D\\uDC68\\u200D\\u2695\\uFE0F\",\"\\uD83D\\uDC68\\u200D\\u2695\"],\"\",\"\",[\"male-doctor\"],17,43,15,0],\n    \"1f468-200d-2696-fe0f\":[[\"\\uD83D\\uDC68\\u200D\\u2696\\uFE0F\",\"\\uD83D\\uDC68\\u200D\\u2696\"],\"\",\"\",[\"male-judge\"],17,49,15,0],\n    \"1f468-200d-2708-fe0f\":[[\"\\uD83D\\uDC68\\u200D\\u2708\\uFE0F\",\"\\uD83D\\uDC68\\u200D\\u2708\"],\"\",\"\",[\"male-pilot\"],18,3,15,0],\n    \"1f468-200d-2764-fe0f-200d-1f468\":[[\"\\uD83D\\uDC68\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC68\\u200D\\u2764\\u200D\\uD83D\\uDC68\"],\"\",\"\",[\"man-heart-man\"],18,9,31,0],\n    \"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468\":[[\"\\uD83D\\uDC68\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC68\\u200D\\u2764\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68\"],\"\",\"\",[\"man-kiss-man\"],18,10,31,0],\n    \"1f468\":[[\"\\uD83D\\uDC68\"],\"\\uE004\",\"\\uDBB8\\uDD9D\",[\"man\"],18,11,31,0],\n    \"1f469-200d-1f33e\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDF3E\"],\"\",\"\",[\"female-farmer\"],18,17,15,0],\n    \"1f469-200d-1f373\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDF73\"],\"\",\"\",[\"female-cook\"],18,23,15,0],\n    \"1f469-200d-1f393\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDF93\"],\"\",\"\",[\"female-student\"],18,29,15,0],\n    \"1f469-200d-1f3a4\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDFA4\"],\"\",\"\",[\"female-singer\"],18,35,15,0],\n    \"1f469-200d-1f3a8\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDFA8\"],\"\",\"\",[\"female-artist\"],18,41,15,0],\n    \"1f469-200d-1f3eb\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDFEB\"],\"\",\"\",[\"female-teacher\"],18,47,15,0],\n    \"1f469-200d-1f3ed\":[[\"\\uD83D\\uDC69\\u200D\\uD83C\\uDFED\"],\"\",\"\",[\"female-factory-worker\"],19,1,15,0],\n    \"1f469-200d-1f466-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-boy-boy\"],19,7,15,0],\n    \"1f469-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-boy\"],19,8,15,0],\n    \"1f469-200d-1f467-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-girl-boy\"],19,9,15,0],\n    \"1f469-200d-1f467-200d-1f467\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"woman-girl-girl\"],19,10,15,0],\n    \"1f469-200d-1f467\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"woman-girl\"],19,11,15,0],\n    \"1f469-200d-1f469-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-woman-boy\"],19,12,31,0],\n    \"1f469-200d-1f469-200d-1f466-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-woman-boy-boy\"],19,13,31,0],\n    \"1f469-200d-1f469-200d-1f467\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"woman-woman-girl\"],19,14,31,0],\n    \"1f469-200d-1f469-200d-1f467-200d-1f466\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC66\"],\"\",\"\",[\"woman-woman-girl-boy\"],19,15,31,0],\n    \"1f469-200d-1f469-200d-1f467-200d-1f467\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D\\uD83D\\uDC67\"],\"\",\"\",[\"woman-woman-girl-girl\"],19,16,31,0],\n    \"1f469-200d-1f4bb\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDCBB\"],\"\",\"\",[\"female-technologist\"],19,17,15,0],\n    \"1f469-200d-1f4bc\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDCBC\"],\"\",\"\",[\"female-office-worker\"],19,23,15,0],\n    \"1f469-200d-1f527\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDD27\"],\"\",\"\",[\"female-mechanic\"],19,29,15,0],\n    \"1f469-200d-1f52c\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDD2C\"],\"\",\"\",[\"female-scientist\"],19,35,15,0],\n    \"1f469-200d-1f680\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDE80\"],\"\",\"\",[\"female-astronaut\"],19,41,15,0],\n    \"1f469-200d-1f692\":[[\"\\uD83D\\uDC69\\u200D\\uD83D\\uDE92\"],\"\",\"\",[\"female-firefighter\"],19,47,15,0],\n    \"1f469-200d-2695-fe0f\":[[\"\\uD83D\\uDC69\\u200D\\u2695\\uFE0F\",\"\\uD83D\\uDC69\\u200D\\u2695\"],\"\",\"\",[\"female-doctor\"],20,1,15,0],\n    \"1f469-200d-2696-fe0f\":[[\"\\uD83D\\uDC69\\u200D\\u2696\\uFE0F\",\"\\uD83D\\uDC69\\u200D\\u2696\"],\"\",\"\",[\"female-judge\"],20,7,15,0],\n    \"1f469-200d-2708-fe0f\":[[\"\\uD83D\\uDC69\\u200D\\u2708\\uFE0F\",\"\\uD83D\\uDC69\\u200D\\u2708\"],\"\",\"\",[\"female-pilot\"],20,13,15,0],\n    \"1f469-200d-2764-fe0f-200d-1f468\":[[\"\\uD83D\\uDC69\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC69\\u200D\\u2764\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC91\"],\"\",\"\",[\"woman-heart-man\",\"couple_with_heart\"],20,19,15,0],\n    \"1f469-200d-2764-fe0f-200d-1f469\":[[\"\\uD83D\\uDC69\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC69\",\"\\uD83D\\uDC69\\u200D\\u2764\\u200D\\uD83D\\uDC69\"],\"\",\"\",[\"woman-heart-woman\"],20,20,31,0],\n    \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468\":[[\"\\uD83D\\uDC69\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC69\\u200D\\u2764\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68\",\"\\uD83D\\uDC8F\"],\"\",\"\",[\"woman-kiss-man\",\"couplekiss\"],20,21,15,0],\n    \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469\":[[\"\\uD83D\\uDC69\\u200D\\u2764\\uFE0F\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC69\",\"\\uD83D\\uDC69\\u200D\\u2764\\u200D\\uD83D\\uDC8B\\u200D\\uD83D\\uDC69\"],\"\",\"\",[\"woman-kiss-woman\"],20,22,31,0],\n    \"1f469\":[[\"\\uD83D\\uDC69\"],\"\\uE005\",\"\\uDBB8\\uDD9E\",[\"woman\"],20,23,31,0],\n    \"1f46b\":[[\"\\uD83D\\uDC6B\"],\"\\uE428\",\"\\uDBB8\\uDDA0\",[\"couple\",\"man_and_woman_holding_hands\"],20,30,31,0],\n    \"1f46c\":[[\"\\uD83D\\uDC6C\"],\"\",\"\",[\"two_men_holding_hands\"],20,31,31,0],\n    \"1f46d\":[[\"\\uD83D\\uDC6D\"],\"\",\"\",[\"two_women_holding_hands\"],20,32,31,0],\n    \"1f46e-200d-2640-fe0f\":[[\"\\uD83D\\uDC6E\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC6E\\u200D\\u2640\"],\"\",\"\",[\"female-police-officer\"],20,33,15,0],\n    \"1f46e-200d-2642-fe0f\":[[\"\\uD83D\\uDC6E\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\u200D\\u2642\",\"\\uD83D\\uDC6E\"],\"\",\"\",[\"male-police-officer\",\"cop\"],20,39,15,0],\n    \"1f46f-200d-2640-fe0f\":[[\"\\uD83D\\uDC6F\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC6F\\u200D\\u2640\",\"\\uD83D\\uDC6F\"],\"\",\"\",[\"woman-with-bunny-ears-partying\",\"dancers\"],20,51,15,0],\n    \"1f46f-200d-2642-fe0f\":[[\"\\uD83D\\uDC6F\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6F\\u200D\\u2642\"],\"\",\"\",[\"man-with-bunny-ears-partying\"],21,0,15,0],\n    \"1f470\":[[\"\\uD83D\\uDC70\"],\"\",\"\\uDBB8\\uDDA3\",[\"bride_with_veil\"],21,2,31,0],\n    \"1f471-200d-2640-fe0f\":[[\"\\uD83D\\uDC71\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC71\\u200D\\u2640\"],\"\",\"\",[\"blond-haired-woman\"],21,8,15,0],\n    \"1f471-200d-2642-fe0f\":[[\"\\uD83D\\uDC71\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\u200D\\u2642\",\"\\uD83D\\uDC71\"],\"\",\"\",[\"blond-haired-man\",\"person_with_blond_hair\"],21,14,15,0],\n    \"1f472\":[[\"\\uD83D\\uDC72\"],\"\\uE516\",\"\\uDBB8\\uDDA5\",[\"man_with_gua_pi_mao\"],21,26,31,0],\n    \"1f473-200d-2640-fe0f\":[[\"\\uD83D\\uDC73\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC73\\u200D\\u2640\"],\"\",\"\",[\"woman-wearing-turban\"],21,32,15,0],\n    \"1f473-200d-2642-fe0f\":[[\"\\uD83D\\uDC73\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\u200D\\u2642\",\"\\uD83D\\uDC73\"],\"\",\"\",[\"man-wearing-turban\",\"man_with_turban\"],21,38,15,0],\n    \"1f474\":[[\"\\uD83D\\uDC74\"],\"\\uE518\",\"\\uDBB8\\uDDA7\",[\"older_man\"],21,50,31,0],\n    \"1f475\":[[\"\\uD83D\\uDC75\"],\"\\uE519\",\"\\uDBB8\\uDDA8\",[\"older_woman\"],22,4,31,0],\n    \"1f476\":[[\"\\uD83D\\uDC76\"],\"\\uE51A\",\"\\uDBB8\\uDDA9\",[\"baby\"],22,10,31,0],\n    \"1f477-200d-2640-fe0f\":[[\"\\uD83D\\uDC77\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC77\\u200D\\u2640\"],\"\",\"\",[\"female-construction-worker\"],22,16,15,0],\n    \"1f477-200d-2642-fe0f\":[[\"\\uD83D\\uDC77\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\u200D\\u2642\",\"\\uD83D\\uDC77\"],\"\",\"\",[\"male-construction-worker\",\"construction_worker\"],22,22,15,0],\n    \"1f478\":[[\"\\uD83D\\uDC78\"],\"\\uE51C\",\"\\uDBB8\\uDDAB\",[\"princess\"],22,34,31,0],\n    \"1f479\":[[\"\\uD83D\\uDC79\"],\"\",\"\\uDBB8\\uDDAC\",[\"japanese_ogre\"],22,40,31,0],\n    \"1f47a\":[[\"\\uD83D\\uDC7A\"],\"\",\"\\uDBB8\\uDDAD\",[\"japanese_goblin\"],22,41,31,0],\n    \"1f47b\":[[\"\\uD83D\\uDC7B\"],\"\\uE11B\",\"\\uDBB8\\uDDAE\",[\"ghost\"],22,42,31,0],\n    \"1f47c\":[[\"\\uD83D\\uDC7C\"],\"\\uE04E\",\"\\uDBB8\\uDDAF\",[\"angel\"],22,43,31,0],\n    \"1f47d\":[[\"\\uD83D\\uDC7D\"],\"\\uE10C\",\"\\uDBB8\\uDDB0\",[\"alien\"],22,49,31,0],\n    \"1f47e\":[[\"\\uD83D\\uDC7E\"],\"\\uE12B\",\"\\uDBB8\\uDDB1\",[\"space_invader\"],22,50,31,0],\n    \"1f47f\":[[\"\\uD83D\\uDC7F\"],\"\\uE11A\",\"\\uDBB8\\uDDB2\",[\"imp\"],22,51,31,0],\n    \"1f480\":[[\"\\uD83D\\uDC80\"],\"\\uE11C\",\"\\uDBB8\\uDDB3\",[\"skull\"],23,0,31,0],\n    \"1f481-200d-2640-fe0f\":[[\"\\uD83D\\uDC81\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\u200D\\u2640\",\"\\uD83D\\uDC81\"],\"\",\"\",[\"woman-tipping-hand\",\"information_desk_person\"],23,1,15,0],\n    \"1f481-200d-2642-fe0f\":[[\"\\uD83D\\uDC81\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC81\\u200D\\u2642\"],\"\",\"\",[\"man-tipping-hand\"],23,7,15,0],\n    \"1f482-200d-2640-fe0f\":[[\"\\uD83D\\uDC82\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC82\\u200D\\u2640\"],\"\",\"\",[\"female-guard\"],23,19,15,0],\n    \"1f482-200d-2642-fe0f\":[[\"\\uD83D\\uDC82\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\u200D\\u2642\",\"\\uD83D\\uDC82\"],\"\",\"\",[\"male-guard\",\"guardsman\"],23,25,15,0],\n    \"1f483\":[[\"\\uD83D\\uDC83\"],\"\\uE51F\",\"\\uDBB8\\uDDB6\",[\"dancer\"],23,37,31,0],\n    \"1f484\":[[\"\\uD83D\\uDC84\"],\"\\uE31C\",\"\\uDBB8\\uDD95\",[\"lipstick\"],23,43,31,0],\n    \"1f485\":[[\"\\uD83D\\uDC85\"],\"\\uE31D\",\"\\uDBB8\\uDD96\",[\"nail_care\"],23,44,31,0],\n    \"1f486-200d-2640-fe0f\":[[\"\\uD83D\\uDC86\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\u200D\\u2640\",\"\\uD83D\\uDC86\"],\"\",\"\",[\"woman-getting-massage\",\"massage\"],23,50,15,0],\n    \"1f486-200d-2642-fe0f\":[[\"\\uD83D\\uDC86\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC86\\u200D\\u2642\"],\"\",\"\",[\"man-getting-massage\"],24,4,15,0],\n    \"1f487-200d-2640-fe0f\":[[\"\\uD83D\\uDC87\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\u200D\\u2640\",\"\\uD83D\\uDC87\"],\"\",\"\",[\"woman-getting-haircut\",\"haircut\"],24,16,15,0],\n    \"1f487-200d-2642-fe0f\":[[\"\\uD83D\\uDC87\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC87\\u200D\\u2642\"],\"\",\"\",[\"man-getting-haircut\"],24,22,15,0],\n    \"1f488\":[[\"\\uD83D\\uDC88\"],\"\\uE320\",\"\\uDBB8\\uDD99\",[\"barber\"],24,34,31,0],\n    \"1f489\":[[\"\\uD83D\\uDC89\"],\"\\uE13B\",\"\\uDBB9\\uDD09\",[\"syringe\"],24,35,31,0],\n    \"1f48a\":[[\"\\uD83D\\uDC8A\"],\"\\uE30F\",\"\\uDBB9\\uDD0A\",[\"pill\"],24,36,31,0],\n    \"1f48b\":[[\"\\uD83D\\uDC8B\"],\"\\uE003\",\"\\uDBBA\\uDC23\",[\"kiss\"],24,37,31,0],\n    \"1f48c\":[[\"\\uD83D\\uDC8C\"],\"\",\"\\uDBBA\\uDC24\",[\"love_letter\"],24,38,31,0],\n    \"1f48d\":[[\"\\uD83D\\uDC8D\"],\"\\uE034\",\"\\uDBBA\\uDC25\",[\"ring\"],24,39,31,0],\n    \"1f48e\":[[\"\\uD83D\\uDC8E\"],\"\\uE035\",\"\\uDBBA\\uDC26\",[\"gem\"],24,40,31,0],\n    \"1f490\":[[\"\\uD83D\\uDC90\"],\"\\uE306\",\"\\uDBBA\\uDC28\",[\"bouquet\"],24,42,31,0],\n    \"1f492\":[[\"\\uD83D\\uDC92\"],\"\\uE43D\",\"\\uDBBA\\uDC2A\",[\"wedding\"],24,44,31,0],\n    \"1f493\":[[\"\\uD83D\\uDC93\"],\"\\uE327\",\"\\uDBBA\\uDF0D\",[\"heartbeat\"],24,45,31,0],\n    \"1f494\":[[\"\\uD83D\\uDC94\"],\"\\uE023\",\"\\uDBBA\\uDF0E\",[\"broken_heart\"],24,46,31,0,\"<\\/3\"],\n    \"1f495\":[[\"\\uD83D\\uDC95\"],\"\",\"\\uDBBA\\uDF0F\",[\"two_hearts\"],24,47,31,0],\n    \"1f496\":[[\"\\uD83D\\uDC96\"],\"\",\"\\uDBBA\\uDF10\",[\"sparkling_heart\"],24,48,31,0],\n    \"1f497\":[[\"\\uD83D\\uDC97\"],\"\\uE328\",\"\\uDBBA\\uDF11\",[\"heartpulse\"],24,49,31,0],\n    \"1f498\":[[\"\\uD83D\\uDC98\"],\"\\uE329\",\"\\uDBBA\\uDF12\",[\"cupid\"],24,50,31,0],\n    \"1f499\":[[\"\\uD83D\\uDC99\"],\"\\uE32A\",\"\\uDBBA\\uDF13\",[\"blue_heart\"],24,51,31,0,\"<3\"],\n    \"1f49a\":[[\"\\uD83D\\uDC9A\"],\"\\uE32B\",\"\\uDBBA\\uDF14\",[\"green_heart\"],25,0,31,0,\"<3\"],\n    \"1f49b\":[[\"\\uD83D\\uDC9B\"],\"\\uE32C\",\"\\uDBBA\\uDF15\",[\"yellow_heart\"],25,1,31,0,\"<3\"],\n    \"1f49c\":[[\"\\uD83D\\uDC9C\"],\"\\uE32D\",\"\\uDBBA\\uDF16\",[\"purple_heart\"],25,2,31,0,\"<3\"],\n    \"1f49d\":[[\"\\uD83D\\uDC9D\"],\"\\uE437\",\"\\uDBBA\\uDF17\",[\"gift_heart\"],25,3,31,0],\n    \"1f49e\":[[\"\\uD83D\\uDC9E\"],\"\",\"\\uDBBA\\uDF18\",[\"revolving_hearts\"],25,4,31,0],\n    \"1f49f\":[[\"\\uD83D\\uDC9F\"],\"\\uE204\",\"\\uDBBA\\uDF19\",[\"heart_decoration\"],25,5,31,0],\n    \"1f4a0\":[[\"\\uD83D\\uDCA0\"],\"\",\"\\uDBBA\\uDF55\",[\"diamond_shape_with_a_dot_inside\"],25,6,31,0],\n    \"1f4a1\":[[\"\\uD83D\\uDCA1\"],\"\\uE10F\",\"\\uDBBA\\uDF56\",[\"bulb\"],25,7,31,0],\n    \"1f4a2\":[[\"\\uD83D\\uDCA2\"],\"\\uE334\",\"\\uDBBA\\uDF57\",[\"anger\"],25,8,31,0],\n    \"1f4a3\":[[\"\\uD83D\\uDCA3\"],\"\\uE311\",\"\\uDBBA\\uDF58\",[\"bomb\"],25,9,31,0],\n    \"1f4a4\":[[\"\\uD83D\\uDCA4\"],\"\\uE13C\",\"\\uDBBA\\uDF59\",[\"zzz\"],25,10,31,0],\n    \"1f4a5\":[[\"\\uD83D\\uDCA5\"],\"\",\"\\uDBBA\\uDF5A\",[\"boom\",\"collision\"],25,11,31,0],\n    \"1f4a6\":[[\"\\uD83D\\uDCA6\"],\"\\uE331\",\"\\uDBBA\\uDF5B\",[\"sweat_drops\"],25,12,31,0],\n    \"1f4a7\":[[\"\\uD83D\\uDCA7\"],\"\",\"\\uDBBA\\uDF5C\",[\"droplet\"],25,13,31,0],\n    \"1f4a8\":[[\"\\uD83D\\uDCA8\"],\"\\uE330\",\"\\uDBBA\\uDF5D\",[\"dash\"],25,14,31,0],\n    \"1f4a9\":[[\"\\uD83D\\uDCA9\"],\"\\uE05A\",\"\\uDBB9\\uDCF4\",[\"hankey\",\"poop\",\"shit\"],25,15,31,0],\n    \"1f4aa\":[[\"\\uD83D\\uDCAA\"],\"\\uE14C\",\"\\uDBBA\\uDF5E\",[\"muscle\"],25,16,31,0],\n    \"1f4ab\":[[\"\\uD83D\\uDCAB\"],\"\",\"\\uDBBA\\uDF5F\",[\"dizzy\"],25,22,31,0],\n    \"1f4ac\":[[\"\\uD83D\\uDCAC\"],\"\",\"\\uDBB9\\uDD32\",[\"speech_balloon\"],25,23,31,0],\n    \"1f4ad\":[[\"\\uD83D\\uDCAD\"],\"\",\"\",[\"thought_balloon\"],25,24,31,0],\n    \"1f4ae\":[[\"\\uD83D\\uDCAE\"],\"\",\"\\uDBBA\\uDF7A\",[\"white_flower\"],25,25,31,0],\n    \"1f4af\":[[\"\\uD83D\\uDCAF\"],\"\",\"\\uDBBA\\uDF7B\",[\"100\"],25,26,31,0],\n    \"1f4b0\":[[\"\\uD83D\\uDCB0\"],\"\\uE12F\",\"\\uDBB9\\uDCDD\",[\"moneybag\"],25,27,31,0],\n    \"1f4b1\":[[\"\\uD83D\\uDCB1\"],\"\\uE149\",\"\\uDBB9\\uDCDE\",[\"currency_exchange\"],25,28,31,0],\n    \"1f4b2\":[[\"\\uD83D\\uDCB2\"],\"\",\"\\uDBB9\\uDCE0\",[\"heavy_dollar_sign\"],25,29,31,0],\n    \"1f4b3\":[[\"\\uD83D\\uDCB3\"],\"\",\"\\uDBB9\\uDCE1\",[\"credit_card\"],25,30,31,0],\n    \"1f4b4\":[[\"\\uD83D\\uDCB4\"],\"\",\"\\uDBB9\\uDCE2\",[\"yen\"],25,31,31,0],\n    \"1f4b5\":[[\"\\uD83D\\uDCB5\"],\"\",\"\\uDBB9\\uDCE3\",[\"dollar\"],25,32,31,0],\n    \"1f4b6\":[[\"\\uD83D\\uDCB6\"],\"\",\"\",[\"euro\"],25,33,31,0],\n    \"1f4b7\":[[\"\\uD83D\\uDCB7\"],\"\",\"\",[\"pound\"],25,34,31,0],\n    \"1f4b8\":[[\"\\uD83D\\uDCB8\"],\"\",\"\\uDBB9\\uDCE4\",[\"money_with_wings\"],25,35,31,0],\n    \"1f4b9\":[[\"\\uD83D\\uDCB9\"],\"\\uE14A\",\"\\uDBB9\\uDCDF\",[\"chart\"],25,36,31,0],\n    \"1f4ba\":[[\"\\uD83D\\uDCBA\"],\"\\uE11F\",\"\\uDBB9\\uDD37\",[\"seat\"],25,37,31,0],\n    \"1f4bb\":[[\"\\uD83D\\uDCBB\"],\"\\uE00C\",\"\\uDBB9\\uDD38\",[\"computer\"],25,38,31,0],\n    \"1f4bc\":[[\"\\uD83D\\uDCBC\"],\"\\uE11E\",\"\\uDBB9\\uDD3B\",[\"briefcase\"],25,39,31,0],\n    \"1f4bd\":[[\"\\uD83D\\uDCBD\"],\"\\uE316\",\"\\uDBB9\\uDD3C\",[\"minidisc\"],25,40,31,0],\n    \"1f4be\":[[\"\\uD83D\\uDCBE\"],\"\",\"\\uDBB9\\uDD3D\",[\"floppy_disk\"],25,41,31,0],\n    \"1f4bf\":[[\"\\uD83D\\uDCBF\"],\"\\uE126\",\"\\uDBBA\\uDC1D\",[\"cd\"],25,42,31,0],\n    \"1f4c0\":[[\"\\uD83D\\uDCC0\"],\"\\uE127\",\"\\uDBBA\\uDC1E\",[\"dvd\"],25,43,31,0],\n    \"1f4c1\":[[\"\\uD83D\\uDCC1\"],\"\",\"\\uDBB9\\uDD43\",[\"file_folder\"],25,44,31,0],\n    \"1f4c2\":[[\"\\uD83D\\uDCC2\"],\"\",\"\\uDBB9\\uDD44\",[\"open_file_folder\"],25,45,31,0],\n    \"1f4c3\":[[\"\\uD83D\\uDCC3\"],\"\",\"\\uDBB9\\uDD40\",[\"page_with_curl\"],25,46,31,0],\n    \"1f4c4\":[[\"\\uD83D\\uDCC4\"],\"\",\"\\uDBB9\\uDD41\",[\"page_facing_up\"],25,47,31,0],\n    \"1f4c5\":[[\"\\uD83D\\uDCC5\"],\"\",\"\\uDBB9\\uDD42\",[\"date\"],25,48,31,0],\n    \"1f4c6\":[[\"\\uD83D\\uDCC6\"],\"\",\"\\uDBB9\\uDD49\",[\"calendar\"],25,49,31,0],\n    \"1f4c7\":[[\"\\uD83D\\uDCC7\"],\"\",\"\\uDBB9\\uDD4D\",[\"card_index\"],25,50,31,0],\n    \"1f4c8\":[[\"\\uD83D\\uDCC8\"],\"\",\"\\uDBB9\\uDD4B\",[\"chart_with_upwards_trend\"],25,51,31,0],\n    \"1f4c9\":[[\"\\uD83D\\uDCC9\"],\"\",\"\\uDBB9\\uDD4C\",[\"chart_with_downwards_trend\"],26,0,31,0],\n    \"1f4ca\":[[\"\\uD83D\\uDCCA\"],\"\",\"\\uDBB9\\uDD4A\",[\"bar_chart\"],26,1,31,0],\n    \"1f4cb\":[[\"\\uD83D\\uDCCB\"],\"\",\"\\uDBB9\\uDD48\",[\"clipboard\"],26,2,31,0],\n    \"1f4cc\":[[\"\\uD83D\\uDCCC\"],\"\",\"\\uDBB9\\uDD4E\",[\"pushpin\"],26,3,31,0],\n    \"1f4cd\":[[\"\\uD83D\\uDCCD\"],\"\",\"\\uDBB9\\uDD3F\",[\"round_pushpin\"],26,4,31,0],\n    \"1f4ce\":[[\"\\uD83D\\uDCCE\"],\"\",\"\\uDBB9\\uDD3A\",[\"paperclip\"],26,5,31,0],\n    \"1f4cf\":[[\"\\uD83D\\uDCCF\"],\"\",\"\\uDBB9\\uDD50\",[\"straight_ruler\"],26,6,31,0],\n    \"1f4d0\":[[\"\\uD83D\\uDCD0\"],\"\",\"\\uDBB9\\uDD51\",[\"triangular_ruler\"],26,7,31,0],\n    \"1f4d1\":[[\"\\uD83D\\uDCD1\"],\"\",\"\\uDBB9\\uDD52\",[\"bookmark_tabs\"],26,8,31,0],\n    \"1f4d2\":[[\"\\uD83D\\uDCD2\"],\"\",\"\\uDBB9\\uDD4F\",[\"ledger\"],26,9,31,0],\n    \"1f4d3\":[[\"\\uD83D\\uDCD3\"],\"\",\"\\uDBB9\\uDD45\",[\"notebook\"],26,10,31,0],\n    \"1f4d4\":[[\"\\uD83D\\uDCD4\"],\"\",\"\\uDBB9\\uDD47\",[\"notebook_with_decorative_cover\"],26,11,31,0],\n    \"1f4d5\":[[\"\\uD83D\\uDCD5\"],\"\",\"\\uDBB9\\uDD02\",[\"closed_book\"],26,12,31,0],\n    \"1f4d6\":[[\"\\uD83D\\uDCD6\"],\"\\uE148\",\"\\uDBB9\\uDD46\",[\"book\",\"open_book\"],26,13,31,0],\n    \"1f4d7\":[[\"\\uD83D\\uDCD7\"],\"\",\"\\uDBB9\\uDCFF\",[\"green_book\"],26,14,31,0],\n    \"1f4d8\":[[\"\\uD83D\\uDCD8\"],\"\",\"\\uDBB9\\uDD00\",[\"blue_book\"],26,15,31,0],\n    \"1f4d9\":[[\"\\uD83D\\uDCD9\"],\"\",\"\\uDBB9\\uDD01\",[\"orange_book\"],26,16,31,0],\n    \"1f4da\":[[\"\\uD83D\\uDCDA\"],\"\",\"\\uDBB9\\uDD03\",[\"books\"],26,17,31,0],\n    \"1f4db\":[[\"\\uD83D\\uDCDB\"],\"\",\"\\uDBB9\\uDD04\",[\"name_badge\"],26,18,31,0],\n    \"1f4dc\":[[\"\\uD83D\\uDCDC\"],\"\",\"\\uDBB9\\uDCFD\",[\"scroll\"],26,19,31,0],\n    \"1f4dd\":[[\"\\uD83D\\uDCDD\"],\"\\uE301\",\"\\uDBB9\\uDD27\",[\"memo\",\"pencil\"],26,20,31,0],\n    \"1f4de\":[[\"\\uD83D\\uDCDE\"],\"\",\"\\uDBB9\\uDD24\",[\"telephone_receiver\"],26,21,31,0],\n    \"1f4df\":[[\"\\uD83D\\uDCDF\"],\"\",\"\\uDBB9\\uDD22\",[\"pager\"],26,22,31,0],\n    \"1f4e0\":[[\"\\uD83D\\uDCE0\"],\"\\uE00B\",\"\\uDBB9\\uDD28\",[\"fax\"],26,23,31,0],\n    \"1f4e1\":[[\"\\uD83D\\uDCE1\"],\"\\uE14B\",\"\\uDBB9\\uDD31\",[\"satellite_antenna\"],26,24,31,0],\n    \"1f4e2\":[[\"\\uD83D\\uDCE2\"],\"\\uE142\",\"\\uDBB9\\uDD2F\",[\"loudspeaker\"],26,25,31,0],\n    \"1f4e3\":[[\"\\uD83D\\uDCE3\"],\"\\uE317\",\"\\uDBB9\\uDD30\",[\"mega\"],26,26,31,0],\n    \"1f4e4\":[[\"\\uD83D\\uDCE4\"],\"\",\"\\uDBB9\\uDD33\",[\"outbox_tray\"],26,27,31,0],\n    \"1f4e5\":[[\"\\uD83D\\uDCE5\"],\"\",\"\\uDBB9\\uDD34\",[\"inbox_tray\"],26,28,31,0],\n    \"1f4e6\":[[\"\\uD83D\\uDCE6\"],\"\",\"\\uDBB9\\uDD35\",[\"package\"],26,29,31,0],\n    \"1f4e7\":[[\"\\uD83D\\uDCE7\"],\"\",\"\\uDBBA\\uDF92\",[\"e-mail\"],26,30,31,0],\n    \"1f4e8\":[[\"\\uD83D\\uDCE8\"],\"\",\"\\uDBB9\\uDD2A\",[\"incoming_envelope\"],26,31,31,0],\n    \"1f4e9\":[[\"\\uD83D\\uDCE9\"],\"\\uE103\",\"\\uDBB9\\uDD2B\",[\"envelope_with_arrow\"],26,32,31,0],\n    \"1f4ea\":[[\"\\uD83D\\uDCEA\"],\"\",\"\\uDBB9\\uDD2C\",[\"mailbox_closed\"],26,33,31,0],\n    \"1f4eb\":[[\"\\uD83D\\uDCEB\"],\"\\uE101\",\"\\uDBB9\\uDD2D\",[\"mailbox\"],26,34,31,0],\n    \"1f4ec\":[[\"\\uD83D\\uDCEC\"],\"\",\"\",[\"mailbox_with_mail\"],26,35,31,0],\n    \"1f4ed\":[[\"\\uD83D\\uDCED\"],\"\",\"\",[\"mailbox_with_no_mail\"],26,36,31,0],\n    \"1f4ee\":[[\"\\uD83D\\uDCEE\"],\"\\uE102\",\"\\uDBB9\\uDD2E\",[\"postbox\"],26,37,31,0],\n    \"1f4ef\":[[\"\\uD83D\\uDCEF\"],\"\",\"\",[\"postal_horn\"],26,38,31,0],\n    \"1f4f0\":[[\"\\uD83D\\uDCF0\"],\"\",\"\\uDBBA\\uDC22\",[\"newspaper\"],26,39,31,0],\n    \"1f4f1\":[[\"\\uD83D\\uDCF1\"],\"\\uE00A\",\"\\uDBB9\\uDD25\",[\"iphone\"],26,40,31,0],\n    \"1f4f2\":[[\"\\uD83D\\uDCF2\"],\"\\uE104\",\"\\uDBB9\\uDD26\",[\"calling\"],26,41,31,0],\n    \"1f4f3\":[[\"\\uD83D\\uDCF3\"],\"\\uE250\",\"\\uDBBA\\uDC39\",[\"vibration_mode\"],26,42,31,0],\n    \"1f4f4\":[[\"\\uD83D\\uDCF4\"],\"\\uE251\",\"\\uDBBA\\uDC3A\",[\"mobile_phone_off\"],26,43,31,0],\n    \"1f4f5\":[[\"\\uD83D\\uDCF5\"],\"\",\"\",[\"no_mobile_phones\"],26,44,31,0],\n    \"1f4f6\":[[\"\\uD83D\\uDCF6\"],\"\\uE20B\",\"\\uDBBA\\uDC38\",[\"signal_strength\"],26,45,31,0],\n    \"1f4f7\":[[\"\\uD83D\\uDCF7\"],\"\\uE008\",\"\\uDBB9\\uDCEF\",[\"camera\"],26,46,31,0],\n    \"1f4f8\":[[\"\\uD83D\\uDCF8\"],\"\",\"\",[\"camera_with_flash\"],26,47,15,0],\n    \"1f4f9\":[[\"\\uD83D\\uDCF9\"],\"\",\"\\uDBB9\\uDCF9\",[\"video_camera\"],26,48,31,0],\n    \"1f4fa\":[[\"\\uD83D\\uDCFA\"],\"\\uE12A\",\"\\uDBBA\\uDC1C\",[\"tv\"],26,49,31,0],\n    \"1f4fb\":[[\"\\uD83D\\uDCFB\"],\"\\uE128\",\"\\uDBBA\\uDC1F\",[\"radio\"],26,50,31,0],\n    \"1f4fc\":[[\"\\uD83D\\uDCFC\"],\"\\uE129\",\"\\uDBBA\\uDC20\",[\"vhs\"],26,51,31,0],\n    \"1f4fd\":[[\"\\uD83D\\uDCFD\\uFE0F\",\"\\uD83D\\uDCFD\"],\"\",\"\",[\"film_projector\"],27,0,15,0],\n    \"1f4ff\":[[\"\\uD83D\\uDCFF\"],\"\",\"\",[\"prayer_beads\"],27,1,15,0],\n    \"1f500\":[[\"\\uD83D\\uDD00\"],\"\",\"\",[\"twisted_rightwards_arrows\"],27,2,31,0],\n    \"1f501\":[[\"\\uD83D\\uDD01\"],\"\",\"\",[\"repeat\"],27,3,31,0],\n    \"1f502\":[[\"\\uD83D\\uDD02\"],\"\",\"\",[\"repeat_one\"],27,4,31,0],\n    \"1f503\":[[\"\\uD83D\\uDD03\"],\"\",\"\\uDBBA\\uDF91\",[\"arrows_clockwise\"],27,5,31,0],\n    \"1f504\":[[\"\\uD83D\\uDD04\"],\"\",\"\",[\"arrows_counterclockwise\"],27,6,31,0],\n    \"1f505\":[[\"\\uD83D\\uDD05\"],\"\",\"\",[\"low_brightness\"],27,7,31,0],\n    \"1f506\":[[\"\\uD83D\\uDD06\"],\"\",\"\",[\"high_brightness\"],27,8,31,0],\n    \"1f507\":[[\"\\uD83D\\uDD07\"],\"\",\"\",[\"mute\"],27,9,31,0],\n    \"1f508\":[[\"\\uD83D\\uDD08\"],\"\",\"\",[\"speaker\"],27,10,31,0],\n    \"1f509\":[[\"\\uD83D\\uDD09\"],\"\",\"\",[\"sound\"],27,11,31,0],\n    \"1f50a\":[[\"\\uD83D\\uDD0A\"],\"\\uE141\",\"\\uDBBA\\uDC21\",[\"loud_sound\"],27,12,31,0],\n    \"1f50b\":[[\"\\uD83D\\uDD0B\"],\"\",\"\\uDBB9\\uDCFC\",[\"battery\"],27,13,31,0],\n    \"1f50c\":[[\"\\uD83D\\uDD0C\"],\"\",\"\\uDBB9\\uDCFE\",[\"electric_plug\"],27,14,31,0],\n    \"1f50d\":[[\"\\uD83D\\uDD0D\"],\"\\uE114\",\"\\uDBBA\\uDF85\",[\"mag\"],27,15,31,0],\n    \"1f50e\":[[\"\\uD83D\\uDD0E\"],\"\",\"\\uDBBA\\uDF8D\",[\"mag_right\"],27,16,31,0],\n    \"1f50f\":[[\"\\uD83D\\uDD0F\"],\"\",\"\\uDBBA\\uDF90\",[\"lock_with_ink_pen\"],27,17,31,0],\n    \"1f510\":[[\"\\uD83D\\uDD10\"],\"\",\"\\uDBBA\\uDF8A\",[\"closed_lock_with_key\"],27,18,31,0],\n    \"1f511\":[[\"\\uD83D\\uDD11\"],\"\\uE03F\",\"\\uDBBA\\uDF82\",[\"key\"],27,19,31,0],\n    \"1f512\":[[\"\\uD83D\\uDD12\"],\"\\uE144\",\"\\uDBBA\\uDF86\",[\"lock\"],27,20,31,0],\n    \"1f513\":[[\"\\uD83D\\uDD13\"],\"\\uE145\",\"\\uDBBA\\uDF87\",[\"unlock\"],27,21,31,0],\n    \"1f514\":[[\"\\uD83D\\uDD14\"],\"\\uE325\",\"\\uDBB9\\uDCF2\",[\"bell\"],27,22,31,0],\n    \"1f515\":[[\"\\uD83D\\uDD15\"],\"\",\"\",[\"no_bell\"],27,23,31,0],\n    \"1f516\":[[\"\\uD83D\\uDD16\"],\"\",\"\\uDBBA\\uDF8F\",[\"bookmark\"],27,24,31,0],\n    \"1f517\":[[\"\\uD83D\\uDD17\"],\"\",\"\\uDBBA\\uDF4B\",[\"link\"],27,25,31,0],\n    \"1f518\":[[\"\\uD83D\\uDD18\"],\"\",\"\\uDBBA\\uDF8C\",[\"radio_button\"],27,26,31,0],\n    \"1f519\":[[\"\\uD83D\\uDD19\"],\"\",\"\\uDBBA\\uDF8E\",[\"back\"],27,27,31,0],\n    \"1f51a\":[[\"\\uD83D\\uDD1A\"],\"\",\"\\uDBB8\\uDC1A\",[\"end\"],27,28,31,0],\n    \"1f51b\":[[\"\\uD83D\\uDD1B\"],\"\",\"\\uDBB8\\uDC19\",[\"on\"],27,29,31,0],\n    \"1f51c\":[[\"\\uD83D\\uDD1C\"],\"\",\"\\uDBB8\\uDC18\",[\"soon\"],27,30,31,0],\n    \"1f51d\":[[\"\\uD83D\\uDD1D\"],\"\\uE24C\",\"\\uDBBA\\uDF42\",[\"top\"],27,31,31,0],\n    \"1f51e\":[[\"\\uD83D\\uDD1E\"],\"\\uE207\",\"\\uDBBA\\uDF25\",[\"underage\"],27,32,31,0],\n    \"1f51f\":[[\"\\uD83D\\uDD1F\"],\"\",\"\\uDBBA\\uDC3B\",[\"keycap_ten\"],27,33,31,0],\n    \"1f520\":[[\"\\uD83D\\uDD20\"],\"\",\"\\uDBBA\\uDF7C\",[\"capital_abcd\"],27,34,31,0],\n    \"1f521\":[[\"\\uD83D\\uDD21\"],\"\",\"\\uDBBA\\uDF7D\",[\"abcd\"],27,35,31,0],\n    \"1f522\":[[\"\\uD83D\\uDD22\"],\"\",\"\\uDBBA\\uDF7E\",[\"1234\"],27,36,31,0],\n    \"1f523\":[[\"\\uD83D\\uDD23\"],\"\",\"\\uDBBA\\uDF7F\",[\"symbols\"],27,37,31,0],\n    \"1f524\":[[\"\\uD83D\\uDD24\"],\"\",\"\\uDBBA\\uDF80\",[\"abc\"],27,38,31,0],\n    \"1f525\":[[\"\\uD83D\\uDD25\"],\"\\uE11D\",\"\\uDBB9\\uDCF6\",[\"fire\"],27,39,31,0],\n    \"1f526\":[[\"\\uD83D\\uDD26\"],\"\",\"\\uDBB9\\uDCFB\",[\"flashlight\"],27,40,31,0],\n    \"1f527\":[[\"\\uD83D\\uDD27\"],\"\",\"\\uDBB9\\uDCC9\",[\"wrench\"],27,41,31,0],\n    \"1f528\":[[\"\\uD83D\\uDD28\"],\"\\uE116\",\"\\uDBB9\\uDCCA\",[\"hammer\"],27,42,31,0],\n    \"1f529\":[[\"\\uD83D\\uDD29\"],\"\",\"\\uDBB9\\uDCCB\",[\"nut_and_bolt\"],27,43,31,0],\n    \"1f52a\":[[\"\\uD83D\\uDD2A\"],\"\",\"\\uDBB9\\uDCFA\",[\"hocho\",\"knife\"],27,44,31,0],\n    \"1f52b\":[[\"\\uD83D\\uDD2B\"],\"\\uE113\",\"\\uDBB9\\uDCF5\",[\"gun\"],27,45,31,0],\n    \"1f52c\":[[\"\\uD83D\\uDD2C\"],\"\",\"\",[\"microscope\"],27,46,31,0],\n    \"1f52d\":[[\"\\uD83D\\uDD2D\"],\"\",\"\",[\"telescope\"],27,47,31,0],\n    \"1f52e\":[[\"\\uD83D\\uDD2E\"],\"\",\"\\uDBB9\\uDCF7\",[\"crystal_ball\"],27,48,31,0],\n    \"1f52f\":[[\"\\uD83D\\uDD2F\"],\"\\uE23E\",\"\\uDBB9\\uDCF8\",[\"six_pointed_star\"],27,49,31,0],\n    \"1f530\":[[\"\\uD83D\\uDD30\"],\"\\uE209\",\"\\uDBB8\\uDC44\",[\"beginner\"],27,50,31,0],\n    \"1f531\":[[\"\\uD83D\\uDD31\"],\"\\uE031\",\"\\uDBB9\\uDCD2\",[\"trident\"],27,51,31,0],\n    \"1f532\":[[\"\\uD83D\\uDD32\"],\"\\uE21A\",\"\\uDBBA\\uDF64\",[\"black_square_button\"],28,0,31,0],\n    \"1f533\":[[\"\\uD83D\\uDD33\"],\"\\uE21B\",\"\\uDBBA\\uDF67\",[\"white_square_button\"],28,1,31,0],\n    \"1f534\":[[\"\\uD83D\\uDD34\"],\"\\uE219\",\"\\uDBBA\\uDF63\",[\"red_circle\"],28,2,31,0],\n    \"1f535\":[[\"\\uD83D\\uDD35\"],\"\",\"\\uDBBA\\uDF64\",[\"large_blue_circle\"],28,3,31,0],\n    \"1f536\":[[\"\\uD83D\\uDD36\"],\"\",\"\\uDBBA\\uDF73\",[\"large_orange_diamond\"],28,4,31,0],\n    \"1f537\":[[\"\\uD83D\\uDD37\"],\"\",\"\\uDBBA\\uDF74\",[\"large_blue_diamond\"],28,5,31,0],\n    \"1f538\":[[\"\\uD83D\\uDD38\"],\"\",\"\\uDBBA\\uDF75\",[\"small_orange_diamond\"],28,6,31,0],\n    \"1f539\":[[\"\\uD83D\\uDD39\"],\"\",\"\\uDBBA\\uDF76\",[\"small_blue_diamond\"],28,7,31,0],\n    \"1f53a\":[[\"\\uD83D\\uDD3A\"],\"\",\"\\uDBBA\\uDF78\",[\"small_red_triangle\"],28,8,31,0],\n    \"1f53b\":[[\"\\uD83D\\uDD3B\"],\"\",\"\\uDBBA\\uDF79\",[\"small_red_triangle_down\"],28,9,31,0],\n    \"1f53c\":[[\"\\uD83D\\uDD3C\"],\"\",\"\\uDBBA\\uDF01\",[\"arrow_up_small\"],28,10,31,0],\n    \"1f53d\":[[\"\\uD83D\\uDD3D\"],\"\",\"\\uDBBA\\uDF00\",[\"arrow_down_small\"],28,11,31,0],\n    \"1f549\":[[\"\\uD83D\\uDD49\\uFE0F\",\"\\uD83D\\uDD49\"],\"\",\"\",[\"om_symbol\"],28,12,15,0],\n    \"1f54a\":[[\"\\uD83D\\uDD4A\\uFE0F\",\"\\uD83D\\uDD4A\"],\"\",\"\",[\"dove_of_peace\"],28,13,15,0],\n    \"1f54b\":[[\"\\uD83D\\uDD4B\"],\"\",\"\",[\"kaaba\"],28,14,15,0],\n    \"1f54c\":[[\"\\uD83D\\uDD4C\"],\"\",\"\",[\"mosque\"],28,15,15,0],\n    \"1f54d\":[[\"\\uD83D\\uDD4D\"],\"\",\"\",[\"synagogue\"],28,16,15,0],\n    \"1f54e\":[[\"\\uD83D\\uDD4E\"],\"\",\"\",[\"menorah_with_nine_branches\"],28,17,15,0],\n    \"1f550\":[[\"\\uD83D\\uDD50\"],\"\\uE024\",\"\\uDBB8\\uDC1E\",[\"clock1\"],28,18,31,0],\n    \"1f551\":[[\"\\uD83D\\uDD51\"],\"\\uE025\",\"\\uDBB8\\uDC1F\",[\"clock2\"],28,19,31,0],\n    \"1f552\":[[\"\\uD83D\\uDD52\"],\"\\uE026\",\"\\uDBB8\\uDC20\",[\"clock3\"],28,20,31,0],\n    \"1f553\":[[\"\\uD83D\\uDD53\"],\"\\uE027\",\"\\uDBB8\\uDC21\",[\"clock4\"],28,21,31,0],\n    \"1f554\":[[\"\\uD83D\\uDD54\"],\"\\uE028\",\"\\uDBB8\\uDC22\",[\"clock5\"],28,22,31,0],\n    \"1f555\":[[\"\\uD83D\\uDD55\"],\"\\uE029\",\"\\uDBB8\\uDC23\",[\"clock6\"],28,23,31,0],\n    \"1f556\":[[\"\\uD83D\\uDD56\"],\"\\uE02A\",\"\\uDBB8\\uDC24\",[\"clock7\"],28,24,31,0],\n    \"1f557\":[[\"\\uD83D\\uDD57\"],\"\\uE02B\",\"\\uDBB8\\uDC25\",[\"clock8\"],28,25,31,0],\n    \"1f558\":[[\"\\uD83D\\uDD58\"],\"\\uE02C\",\"\\uDBB8\\uDC26\",[\"clock9\"],28,26,31,0],\n    \"1f559\":[[\"\\uD83D\\uDD59\"],\"\\uE02D\",\"\\uDBB8\\uDC27\",[\"clock10\"],28,27,31,0],\n    \"1f55a\":[[\"\\uD83D\\uDD5A\"],\"\\uE02E\",\"\\uDBB8\\uDC28\",[\"clock11\"],28,28,31,0],\n    \"1f55b\":[[\"\\uD83D\\uDD5B\"],\"\\uE02F\",\"\\uDBB8\\uDC29\",[\"clock12\"],28,29,31,0],\n    \"1f55c\":[[\"\\uD83D\\uDD5C\"],\"\",\"\",[\"clock130\"],28,30,31,0],\n    \"1f55d\":[[\"\\uD83D\\uDD5D\"],\"\",\"\",[\"clock230\"],28,31,31,0],\n    \"1f55e\":[[\"\\uD83D\\uDD5E\"],\"\",\"\",[\"clock330\"],28,32,31,0],\n    \"1f55f\":[[\"\\uD83D\\uDD5F\"],\"\",\"\",[\"clock430\"],28,33,31,0],\n    \"1f560\":[[\"\\uD83D\\uDD60\"],\"\",\"\",[\"clock530\"],28,34,31,0],\n    \"1f561\":[[\"\\uD83D\\uDD61\"],\"\",\"\",[\"clock630\"],28,35,31,0],\n    \"1f562\":[[\"\\uD83D\\uDD62\"],\"\",\"\",[\"clock730\"],28,36,31,0],\n    \"1f563\":[[\"\\uD83D\\uDD63\"],\"\",\"\",[\"clock830\"],28,37,31,0],\n    \"1f564\":[[\"\\uD83D\\uDD64\"],\"\",\"\",[\"clock930\"],28,38,31,0],\n    \"1f565\":[[\"\\uD83D\\uDD65\"],\"\",\"\",[\"clock1030\"],28,39,31,0],\n    \"1f566\":[[\"\\uD83D\\uDD66\"],\"\",\"\",[\"clock1130\"],28,40,31,0],\n    \"1f567\":[[\"\\uD83D\\uDD67\"],\"\",\"\",[\"clock1230\"],28,41,31,0],\n    \"1f56f\":[[\"\\uD83D\\uDD6F\\uFE0F\",\"\\uD83D\\uDD6F\"],\"\",\"\",[\"candle\"],28,42,15,0],\n    \"1f570\":[[\"\\uD83D\\uDD70\\uFE0F\",\"\\uD83D\\uDD70\"],\"\",\"\",[\"mantelpiece_clock\"],28,43,15,0],\n    \"1f573\":[[\"\\uD83D\\uDD73\\uFE0F\",\"\\uD83D\\uDD73\"],\"\",\"\",[\"hole\"],28,44,15,0],\n    \"1f574\":[[\"\\uD83D\\uDD74\\uFE0F\",\"\\uD83D\\uDD74\"],\"\",\"\",[\"man_in_business_suit_levitating\"],28,45,15,0],\n    \"1f575-fe0f-200d-2640-fe0f\":[[\"\\uD83D\\uDD75\\uFE0F\\u200D\\u2640\\uFE0F\"],\"\",\"\",[\"female-detective\"],28,51,7,0],\n    \"1f575-fe0f-200d-2642-fe0f\":[[\"\\uD83D\\uDD75\\uFE0F\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uFE0F\",\"\\uD83D\\uDD75\"],\"\",\"\",[\"male-detective\",\"sleuth_or_spy\"],29,5,7,0],\n    \"1f576\":[[\"\\uD83D\\uDD76\\uFE0F\",\"\\uD83D\\uDD76\"],\"\",\"\",[\"dark_sunglasses\"],29,17,15,0],\n    \"1f577\":[[\"\\uD83D\\uDD77\\uFE0F\",\"\\uD83D\\uDD77\"],\"\",\"\",[\"spider\"],29,18,15,0],\n    \"1f578\":[[\"\\uD83D\\uDD78\\uFE0F\",\"\\uD83D\\uDD78\"],\"\",\"\",[\"spider_web\"],29,19,15,0],\n    \"1f579\":[[\"\\uD83D\\uDD79\\uFE0F\",\"\\uD83D\\uDD79\"],\"\",\"\",[\"joystick\"],29,20,15,0],\n    \"1f57a\":[[\"\\uD83D\\uDD7A\"],\"\",\"\",[\"man_dancing\"],29,21,15,0],\n    \"1f587\":[[\"\\uD83D\\uDD87\\uFE0F\",\"\\uD83D\\uDD87\"],\"\",\"\",[\"linked_paperclips\"],29,27,15,0],\n    \"1f58a\":[[\"\\uD83D\\uDD8A\\uFE0F\",\"\\uD83D\\uDD8A\"],\"\",\"\",[\"lower_left_ballpoint_pen\"],29,28,15,0],\n    \"1f58b\":[[\"\\uD83D\\uDD8B\\uFE0F\",\"\\uD83D\\uDD8B\"],\"\",\"\",[\"lower_left_fountain_pen\"],29,29,15,0],\n    \"1f58c\":[[\"\\uD83D\\uDD8C\\uFE0F\",\"\\uD83D\\uDD8C\"],\"\",\"\",[\"lower_left_paintbrush\"],29,30,15,0],\n    \"1f58d\":[[\"\\uD83D\\uDD8D\\uFE0F\",\"\\uD83D\\uDD8D\"],\"\",\"\",[\"lower_left_crayon\"],29,31,15,0],\n    \"1f590\":[[\"\\uD83D\\uDD90\\uFE0F\",\"\\uD83D\\uDD90\"],\"\",\"\",[\"raised_hand_with_fingers_splayed\"],29,32,15,0],\n    \"1f595\":[[\"\\uD83D\\uDD95\"],\"\",\"\",[\"middle_finger\",\"reversed_hand_with_middle_finger_extended\"],29,38,15,0],\n    \"1f596\":[[\"\\uD83D\\uDD96\"],\"\",\"\",[\"spock-hand\"],29,44,15,0],\n    \"1f5a4\":[[\"\\uD83D\\uDDA4\"],\"\",\"\",[\"black_heart\"],29,50,15,0],\n    \"1f5a5\":[[\"\\uD83D\\uDDA5\\uFE0F\",\"\\uD83D\\uDDA5\"],\"\",\"\",[\"desktop_computer\"],29,51,15,0],\n    \"1f5a8\":[[\"\\uD83D\\uDDA8\\uFE0F\",\"\\uD83D\\uDDA8\"],\"\",\"\",[\"printer\"],30,0,15,0],\n    \"1f5b1\":[[\"\\uD83D\\uDDB1\\uFE0F\",\"\\uD83D\\uDDB1\"],\"\",\"\",[\"three_button_mouse\"],30,1,15,0],\n    \"1f5b2\":[[\"\\uD83D\\uDDB2\\uFE0F\",\"\\uD83D\\uDDB2\"],\"\",\"\",[\"trackball\"],30,2,15,0],\n    \"1f5bc\":[[\"\\uD83D\\uDDBC\\uFE0F\",\"\\uD83D\\uDDBC\"],\"\",\"\",[\"frame_with_picture\"],30,3,15,0],\n    \"1f5c2\":[[\"\\uD83D\\uDDC2\\uFE0F\",\"\\uD83D\\uDDC2\"],\"\",\"\",[\"card_index_dividers\"],30,4,15,0],\n    \"1f5c3\":[[\"\\uD83D\\uDDC3\\uFE0F\",\"\\uD83D\\uDDC3\"],\"\",\"\",[\"card_file_box\"],30,5,15,0],\n    \"1f5c4\":[[\"\\uD83D\\uDDC4\\uFE0F\",\"\\uD83D\\uDDC4\"],\"\",\"\",[\"file_cabinet\"],30,6,15,0],\n    \"1f5d1\":[[\"\\uD83D\\uDDD1\\uFE0F\",\"\\uD83D\\uDDD1\"],\"\",\"\",[\"wastebasket\"],30,7,15,0],\n    \"1f5d2\":[[\"\\uD83D\\uDDD2\\uFE0F\",\"\\uD83D\\uDDD2\"],\"\",\"\",[\"spiral_note_pad\"],30,8,15,0],\n    \"1f5d3\":[[\"\\uD83D\\uDDD3\\uFE0F\",\"\\uD83D\\uDDD3\"],\"\",\"\",[\"spiral_calendar_pad\"],30,9,15,0],\n    \"1f5dc\":[[\"\\uD83D\\uDDDC\\uFE0F\",\"\\uD83D\\uDDDC\"],\"\",\"\",[\"compression\"],30,10,15,0],\n    \"1f5dd\":[[\"\\uD83D\\uDDDD\\uFE0F\",\"\\uD83D\\uDDDD\"],\"\",\"\",[\"old_key\"],30,11,15,0],\n    \"1f5de\":[[\"\\uD83D\\uDDDE\\uFE0F\",\"\\uD83D\\uDDDE\"],\"\",\"\",[\"rolled_up_newspaper\"],30,12,15,0],\n    \"1f5e1\":[[\"\\uD83D\\uDDE1\\uFE0F\",\"\\uD83D\\uDDE1\"],\"\",\"\",[\"dagger_knife\"],30,13,15,0],\n    \"1f5e3\":[[\"\\uD83D\\uDDE3\\uFE0F\",\"\\uD83D\\uDDE3\"],\"\",\"\",[\"speaking_head_in_silhouette\"],30,14,15,0],\n    \"1f5e8\":[[\"\\uD83D\\uDDE8\\uFE0F\",\"\\uD83D\\uDDE8\"],\"\",\"\",[\"left_speech_bubble\"],30,15,15,0],\n    \"1f5ef\":[[\"\\uD83D\\uDDEF\\uFE0F\",\"\\uD83D\\uDDEF\"],\"\",\"\",[\"right_anger_bubble\"],30,16,15,0],\n    \"1f5f3\":[[\"\\uD83D\\uDDF3\\uFE0F\",\"\\uD83D\\uDDF3\"],\"\",\"\",[\"ballot_box_with_ballot\"],30,17,15,0],\n    \"1f5fa\":[[\"\\uD83D\\uDDFA\\uFE0F\",\"\\uD83D\\uDDFA\"],\"\",\"\",[\"world_map\"],30,18,15,0],\n    \"1f5fb\":[[\"\\uD83D\\uDDFB\"],\"\\uE03B\",\"\\uDBB9\\uDCC3\",[\"mount_fuji\"],30,19,31,0],\n    \"1f5fc\":[[\"\\uD83D\\uDDFC\"],\"\\uE509\",\"\\uDBB9\\uDCC4\",[\"tokyo_tower\"],30,20,31,0],\n    \"1f5fd\":[[\"\\uD83D\\uDDFD\"],\"\\uE51D\",\"\\uDBB9\\uDCC6\",[\"statue_of_liberty\"],30,21,31,0],\n    \"1f5fe\":[[\"\\uD83D\\uDDFE\"],\"\",\"\\uDBB9\\uDCC7\",[\"japan\"],30,22,31,0],\n    \"1f5ff\":[[\"\\uD83D\\uDDFF\"],\"\",\"\\uDBB9\\uDCC8\",[\"moyai\"],30,23,31,0],\n    \"1f600\":[[\"\\uD83D\\uDE00\"],\"\",\"\",[\"grinning\"],30,24,31,0,\":D\"],\n    \"1f601\":[[\"\\uD83D\\uDE01\"],\"\\uE404\",\"\\uDBB8\\uDF33\",[\"grin\"],30,25,31,0],\n    \"1f602\":[[\"\\uD83D\\uDE02\"],\"\\uE412\",\"\\uDBB8\\uDF34\",[\"joy\"],30,26,31,0],\n    \"1f603\":[[\"\\uD83D\\uDE03\"],\"\\uE057\",\"\\uDBB8\\uDF30\",[\"smiley\"],30,27,31,0,\":)\"],\n    \"1f604\":[[\"\\uD83D\\uDE04\"],\"\\uE415\",\"\\uDBB8\\uDF38\",[\"smile\"],30,28,31,0,\":)\"],\n    \"1f605\":[[\"\\uD83D\\uDE05\"],\"\",\"\\uDBB8\\uDF31\",[\"sweat_smile\"],30,29,31,0],\n    \"1f606\":[[\"\\uD83D\\uDE06\"],\"\",\"\\uDBB8\\uDF32\",[\"laughing\",\"satisfied\"],30,30,31,0],\n    \"1f607\":[[\"\\uD83D\\uDE07\"],\"\",\"\",[\"innocent\"],30,31,31,0],\n    \"1f608\":[[\"\\uD83D\\uDE08\"],\"\",\"\",[\"smiling_imp\"],30,32,31,0],\n    \"1f609\":[[\"\\uD83D\\uDE09\"],\"\\uE405\",\"\\uDBB8\\uDF47\",[\"wink\"],30,33,31,0,\";)\"],\n    \"1f60a\":[[\"\\uD83D\\uDE0A\"],\"\\uE056\",\"\\uDBB8\\uDF35\",[\"blush\"],30,34,31,0,\":)\"],\n    \"1f60b\":[[\"\\uD83D\\uDE0B\"],\"\",\"\\uDBB8\\uDF2B\",[\"yum\"],30,35,31,0],\n    \"1f60c\":[[\"\\uD83D\\uDE0C\"],\"\\uE40A\",\"\\uDBB8\\uDF3E\",[\"relieved\"],30,36,31,0],\n    \"1f60d\":[[\"\\uD83D\\uDE0D\"],\"\\uE106\",\"\\uDBB8\\uDF27\",[\"heart_eyes\"],30,37,31,0],\n    \"1f60e\":[[\"\\uD83D\\uDE0E\"],\"\",\"\",[\"sunglasses\"],30,38,31,0],\n    \"1f60f\":[[\"\\uD83D\\uDE0F\"],\"\\uE402\",\"\\uDBB8\\uDF43\",[\"smirk\"],30,39,31,0],\n    \"1f610\":[[\"\\uD83D\\uDE10\"],\"\",\"\",[\"neutral_face\"],30,40,31,0],\n    \"1f611\":[[\"\\uD83D\\uDE11\"],\"\",\"\",[\"expressionless\"],30,41,31,0],\n    \"1f612\":[[\"\\uD83D\\uDE12\"],\"\\uE40E\",\"\\uDBB8\\uDF26\",[\"unamused\"],30,42,31,0,\":(\"],\n    \"1f613\":[[\"\\uD83D\\uDE13\"],\"\\uE108\",\"\\uDBB8\\uDF44\",[\"sweat\"],30,43,31,0],\n    \"1f614\":[[\"\\uD83D\\uDE14\"],\"\\uE403\",\"\\uDBB8\\uDF40\",[\"pensive\"],30,44,31,0],\n    \"1f615\":[[\"\\uD83D\\uDE15\"],\"\",\"\",[\"confused\"],30,45,31,0],\n    \"1f616\":[[\"\\uD83D\\uDE16\"],\"\\uE407\",\"\\uDBB8\\uDF3F\",[\"confounded\"],30,46,31,0],\n    \"1f617\":[[\"\\uD83D\\uDE17\"],\"\",\"\",[\"kissing\"],30,47,31,0],\n    \"1f618\":[[\"\\uD83D\\uDE18\"],\"\\uE418\",\"\\uDBB8\\uDF2C\",[\"kissing_heart\"],30,48,31,0],\n    \"1f619\":[[\"\\uD83D\\uDE19\"],\"\",\"\",[\"kissing_smiling_eyes\"],30,49,31,0],\n    \"1f61a\":[[\"\\uD83D\\uDE1A\"],\"\\uE417\",\"\\uDBB8\\uDF2D\",[\"kissing_closed_eyes\"],30,50,31,0],\n    \"1f61b\":[[\"\\uD83D\\uDE1B\"],\"\",\"\",[\"stuck_out_tongue\"],30,51,31,0,\":p\"],\n    \"1f61c\":[[\"\\uD83D\\uDE1C\"],\"\\uE105\",\"\\uDBB8\\uDF29\",[\"stuck_out_tongue_winking_eye\"],31,0,31,0,\";p\"],\n    \"1f61d\":[[\"\\uD83D\\uDE1D\"],\"\\uE409\",\"\\uDBB8\\uDF2A\",[\"stuck_out_tongue_closed_eyes\"],31,1,31,0],\n    \"1f61e\":[[\"\\uD83D\\uDE1E\"],\"\\uE058\",\"\\uDBB8\\uDF23\",[\"disappointed\"],31,2,31,0,\":(\"],\n    \"1f61f\":[[\"\\uD83D\\uDE1F\"],\"\",\"\",[\"worried\"],31,3,31,0],\n    \"1f620\":[[\"\\uD83D\\uDE20\"],\"\\uE059\",\"\\uDBB8\\uDF20\",[\"angry\"],31,4,31,0],\n    \"1f621\":[[\"\\uD83D\\uDE21\"],\"\\uE416\",\"\\uDBB8\\uDF3D\",[\"rage\"],31,5,31,0],\n    \"1f622\":[[\"\\uD83D\\uDE22\"],\"\\uE413\",\"\\uDBB8\\uDF39\",[\"cry\"],31,6,31,0,\":'(\"],\n    \"1f623\":[[\"\\uD83D\\uDE23\"],\"\\uE406\",\"\\uDBB8\\uDF3C\",[\"persevere\"],31,7,31,0],\n    \"1f624\":[[\"\\uD83D\\uDE24\"],\"\",\"\\uDBB8\\uDF28\",[\"triumph\"],31,8,31,0],\n    \"1f625\":[[\"\\uD83D\\uDE25\"],\"\\uE401\",\"\\uDBB8\\uDF45\",[\"disappointed_relieved\"],31,9,31,0],\n    \"1f626\":[[\"\\uD83D\\uDE26\"],\"\",\"\",[\"frowning\"],31,10,31,0],\n    \"1f627\":[[\"\\uD83D\\uDE27\"],\"\",\"\",[\"anguished\"],31,11,31,0],\n    \"1f628\":[[\"\\uD83D\\uDE28\"],\"\\uE40B\",\"\\uDBB8\\uDF3B\",[\"fearful\"],31,12,31,0],\n    \"1f629\":[[\"\\uD83D\\uDE29\"],\"\",\"\\uDBB8\\uDF21\",[\"weary\"],31,13,31,0],\n    \"1f62a\":[[\"\\uD83D\\uDE2A\"],\"\\uE408\",\"\\uDBB8\\uDF42\",[\"sleepy\"],31,14,31,0],\n    \"1f62b\":[[\"\\uD83D\\uDE2B\"],\"\",\"\\uDBB8\\uDF46\",[\"tired_face\"],31,15,31,0],\n    \"1f62c\":[[\"\\uD83D\\uDE2C\"],\"\",\"\",[\"grimacing\"],31,16,31,0],\n    \"1f62d\":[[\"\\uD83D\\uDE2D\"],\"\\uE411\",\"\\uDBB8\\uDF3A\",[\"sob\"],31,17,31,0,\":'(\"],\n    \"1f62e\":[[\"\\uD83D\\uDE2E\"],\"\",\"\",[\"open_mouth\"],31,18,31,0],\n    \"1f62f\":[[\"\\uD83D\\uDE2F\"],\"\",\"\",[\"hushed\"],31,19,31,0],\n    \"1f630\":[[\"\\uD83D\\uDE30\"],\"\\uE40F\",\"\\uDBB8\\uDF25\",[\"cold_sweat\"],31,20,31,0],\n    \"1f631\":[[\"\\uD83D\\uDE31\"],\"\\uE107\",\"\\uDBB8\\uDF41\",[\"scream\"],31,21,31,0],\n    \"1f632\":[[\"\\uD83D\\uDE32\"],\"\\uE410\",\"\\uDBB8\\uDF22\",[\"astonished\"],31,22,31,0],\n    \"1f633\":[[\"\\uD83D\\uDE33\"],\"\\uE40D\",\"\\uDBB8\\uDF2F\",[\"flushed\"],31,23,31,0],\n    \"1f634\":[[\"\\uD83D\\uDE34\"],\"\",\"\",[\"sleeping\"],31,24,31,0],\n    \"1f635\":[[\"\\uD83D\\uDE35\"],\"\",\"\\uDBB8\\uDF24\",[\"dizzy_face\"],31,25,31,0],\n    \"1f636\":[[\"\\uD83D\\uDE36\"],\"\",\"\",[\"no_mouth\"],31,26,31,0],\n    \"1f637\":[[\"\\uD83D\\uDE37\"],\"\\uE40C\",\"\\uDBB8\\uDF2E\",[\"mask\"],31,27,31,0],\n    \"1f638\":[[\"\\uD83D\\uDE38\"],\"\",\"\\uDBB8\\uDF49\",[\"smile_cat\"],31,28,31,0],\n    \"1f639\":[[\"\\uD83D\\uDE39\"],\"\",\"\\uDBB8\\uDF4A\",[\"joy_cat\"],31,29,31,0],\n    \"1f63a\":[[\"\\uD83D\\uDE3A\"],\"\",\"\\uDBB8\\uDF48\",[\"smiley_cat\"],31,30,31,0],\n    \"1f63b\":[[\"\\uD83D\\uDE3B\"],\"\",\"\\uDBB8\\uDF4C\",[\"heart_eyes_cat\"],31,31,31,0],\n    \"1f63c\":[[\"\\uD83D\\uDE3C\"],\"\",\"\\uDBB8\\uDF4F\",[\"smirk_cat\"],31,32,31,0],\n    \"1f63d\":[[\"\\uD83D\\uDE3D\"],\"\",\"\\uDBB8\\uDF4B\",[\"kissing_cat\"],31,33,31,0],\n    \"1f63e\":[[\"\\uD83D\\uDE3E\"],\"\",\"\\uDBB8\\uDF4E\",[\"pouting_cat\"],31,34,31,0],\n    \"1f63f\":[[\"\\uD83D\\uDE3F\"],\"\",\"\\uDBB8\\uDF4D\",[\"crying_cat_face\"],31,35,31,0],\n    \"1f640\":[[\"\\uD83D\\uDE40\"],\"\",\"\\uDBB8\\uDF50\",[\"scream_cat\"],31,36,31,0],\n    \"1f641\":[[\"\\uD83D\\uDE41\"],\"\",\"\",[\"slightly_frowning_face\"],31,37,15,0],\n    \"1f642\":[[\"\\uD83D\\uDE42\"],\"\",\"\",[\"slightly_smiling_face\"],31,38,31,0],\n    \"1f643\":[[\"\\uD83D\\uDE43\"],\"\",\"\",[\"upside_down_face\"],31,39,15,0],\n    \"1f644\":[[\"\\uD83D\\uDE44\"],\"\",\"\",[\"face_with_rolling_eyes\"],31,40,15,0],\n    \"1f645-200d-2640-fe0f\":[[\"\\uD83D\\uDE45\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\u200D\\u2640\",\"\\uD83D\\uDE45\"],\"\",\"\",[\"woman-gesturing-no\",\"no_good\"],31,41,15,0],\n    \"1f645-200d-2642-fe0f\":[[\"\\uD83D\\uDE45\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE45\\u200D\\u2642\"],\"\",\"\",[\"man-gesturing-no\"],31,47,15,0],\n    \"1f646-200d-2640-fe0f\":[[\"\\uD83D\\uDE46\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\u200D\\u2640\",\"\\uD83D\\uDE46\"],\"\",\"\",[\"woman-gesturing-ok\",\"ok_woman\"],32,7,15,0],\n    \"1f646-200d-2642-fe0f\":[[\"\\uD83D\\uDE46\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE46\\u200D\\u2642\"],\"\",\"\",[\"man-gesturing-ok\"],32,13,15,0],\n    \"1f647-200d-2640-fe0f\":[[\"\\uD83D\\uDE47\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE47\\u200D\\u2640\"],\"\",\"\",[\"woman-bowing\"],32,25,15,0],\n    \"1f647-200d-2642-fe0f\":[[\"\\uD83D\\uDE47\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\u200D\\u2642\",\"\\uD83D\\uDE47\"],\"\",\"\",[\"man-bowing\",\"bow\"],32,31,15,0],\n    \"1f648\":[[\"\\uD83D\\uDE48\"],\"\",\"\\uDBB8\\uDF54\",[\"see_no_evil\"],32,43,31,0],\n    \"1f649\":[[\"\\uD83D\\uDE49\"],\"\",\"\\uDBB8\\uDF56\",[\"hear_no_evil\"],32,44,31,0],\n    \"1f64a\":[[\"\\uD83D\\uDE4A\"],\"\",\"\\uDBB8\\uDF55\",[\"speak_no_evil\"],32,45,31,0],\n    \"1f64b-200d-2640-fe0f\":[[\"\\uD83D\\uDE4B\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\u200D\\u2640\",\"\\uD83D\\uDE4B\"],\"\",\"\",[\"woman-raising-hand\",\"raising_hand\"],32,46,15,0],\n    \"1f64b-200d-2642-fe0f\":[[\"\\uD83D\\uDE4B\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE4B\\u200D\\u2642\"],\"\",\"\",[\"man-raising-hand\"],33,0,15,0],\n    \"1f64c\":[[\"\\uD83D\\uDE4C\"],\"\\uE427\",\"\\uDBB8\\uDF58\",[\"raised_hands\"],33,12,31,0],\n    \"1f64d-200d-2640-fe0f\":[[\"\\uD83D\\uDE4D\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\u200D\\u2640\",\"\\uD83D\\uDE4D\"],\"\",\"\",[\"woman-frowning\",\"person_frowning\"],33,18,15,0],\n    \"1f64d-200d-2642-fe0f\":[[\"\\uD83D\\uDE4D\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE4D\\u200D\\u2642\"],\"\",\"\",[\"man-frowning\"],33,24,15,0],\n    \"1f64e-200d-2640-fe0f\":[[\"\\uD83D\\uDE4E\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\u200D\\u2640\",\"\\uD83D\\uDE4E\"],\"\",\"\",[\"woman-pouting\",\"person_with_pouting_face\"],33,36,15,0],\n    \"1f64e-200d-2642-fe0f\":[[\"\\uD83D\\uDE4E\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE4E\\u200D\\u2642\"],\"\",\"\",[\"man-pouting\"],33,42,15,0],\n    \"1f64f\":[[\"\\uD83D\\uDE4F\"],\"\\uE41D\",\"\\uDBB8\\uDF5B\",[\"pray\"],34,2,31,0],\n    \"1f680\":[[\"\\uD83D\\uDE80\"],\"\\uE10D\",\"\\uDBB9\\uDFED\",[\"rocket\"],34,8,31,0],\n    \"1f681\":[[\"\\uD83D\\uDE81\"],\"\",\"\",[\"helicopter\"],34,9,31,0],\n    \"1f682\":[[\"\\uD83D\\uDE82\"],\"\",\"\",[\"steam_locomotive\"],34,10,31,0],\n    \"1f683\":[[\"\\uD83D\\uDE83\"],\"\\uE01E\",\"\\uDBB9\\uDFDF\",[\"railway_car\"],34,11,31,0],\n    \"1f684\":[[\"\\uD83D\\uDE84\"],\"\\uE435\",\"\\uDBB9\\uDFE2\",[\"bullettrain_side\"],34,12,31,0],\n    \"1f685\":[[\"\\uD83D\\uDE85\"],\"\\uE01F\",\"\\uDBB9\\uDFE3\",[\"bullettrain_front\"],34,13,31,0],\n    \"1f686\":[[\"\\uD83D\\uDE86\"],\"\",\"\",[\"train2\"],34,14,31,0],\n    \"1f687\":[[\"\\uD83D\\uDE87\"],\"\\uE434\",\"\\uDBB9\\uDFE0\",[\"metro\"],34,15,31,0],\n    \"1f688\":[[\"\\uD83D\\uDE88\"],\"\",\"\",[\"light_rail\"],34,16,31,0],\n    \"1f689\":[[\"\\uD83D\\uDE89\"],\"\\uE039\",\"\\uDBB9\\uDFEC\",[\"station\"],34,17,31,0],\n    \"1f68a\":[[\"\\uD83D\\uDE8A\"],\"\",\"\",[\"tram\"],34,18,31,0],\n    \"1f68b\":[[\"\\uD83D\\uDE8B\"],\"\",\"\",[\"train\"],34,19,31,0],\n    \"1f68c\":[[\"\\uD83D\\uDE8C\"],\"\\uE159\",\"\\uDBB9\\uDFE6\",[\"bus\"],34,20,31,0],\n    \"1f68d\":[[\"\\uD83D\\uDE8D\"],\"\",\"\",[\"oncoming_bus\"],34,21,31,0],\n    \"1f68e\":[[\"\\uD83D\\uDE8E\"],\"\",\"\",[\"trolleybus\"],34,22,31,0],\n    \"1f68f\":[[\"\\uD83D\\uDE8F\"],\"\\uE150\",\"\\uDBB9\\uDFE7\",[\"busstop\"],34,23,31,0],\n    \"1f690\":[[\"\\uD83D\\uDE90\"],\"\",\"\",[\"minibus\"],34,24,31,0],\n    \"1f691\":[[\"\\uD83D\\uDE91\"],\"\\uE431\",\"\\uDBB9\\uDFF3\",[\"ambulance\"],34,25,31,0],\n    \"1f692\":[[\"\\uD83D\\uDE92\"],\"\\uE430\",\"\\uDBB9\\uDFF2\",[\"fire_engine\"],34,26,31,0],\n    \"1f693\":[[\"\\uD83D\\uDE93\"],\"\\uE432\",\"\\uDBB9\\uDFF4\",[\"police_car\"],34,27,31,0],\n    \"1f694\":[[\"\\uD83D\\uDE94\"],\"\",\"\",[\"oncoming_police_car\"],34,28,31,0],\n    \"1f695\":[[\"\\uD83D\\uDE95\"],\"\\uE15A\",\"\\uDBB9\\uDFEF\",[\"taxi\"],34,29,31,0],\n    \"1f696\":[[\"\\uD83D\\uDE96\"],\"\",\"\",[\"oncoming_taxi\"],34,30,31,0],\n    \"1f697\":[[\"\\uD83D\\uDE97\"],\"\\uE01B\",\"\\uDBB9\\uDFE4\",[\"car\",\"red_car\"],34,31,31,0],\n    \"1f698\":[[\"\\uD83D\\uDE98\"],\"\",\"\",[\"oncoming_automobile\"],34,32,31,0],\n    \"1f699\":[[\"\\uD83D\\uDE99\"],\"\\uE42E\",\"\\uDBB9\\uDFE5\",[\"blue_car\"],34,33,31,0],\n    \"1f69a\":[[\"\\uD83D\\uDE9A\"],\"\\uE42F\",\"\\uDBB9\\uDFF1\",[\"truck\"],34,34,31,0],\n    \"1f69b\":[[\"\\uD83D\\uDE9B\"],\"\",\"\",[\"articulated_lorry\"],34,35,31,0],\n    \"1f69c\":[[\"\\uD83D\\uDE9C\"],\"\",\"\",[\"tractor\"],34,36,31,0],\n    \"1f69d\":[[\"\\uD83D\\uDE9D\"],\"\",\"\",[\"monorail\"],34,37,31,0],\n    \"1f69e\":[[\"\\uD83D\\uDE9E\"],\"\",\"\",[\"mountain_railway\"],34,38,31,0],\n    \"1f69f\":[[\"\\uD83D\\uDE9F\"],\"\",\"\",[\"suspension_railway\"],34,39,31,0],\n    \"1f6a0\":[[\"\\uD83D\\uDEA0\"],\"\",\"\",[\"mountain_cableway\"],34,40,31,0],\n    \"1f6a1\":[[\"\\uD83D\\uDEA1\"],\"\",\"\",[\"aerial_tramway\"],34,41,31,0],\n    \"1f6a2\":[[\"\\uD83D\\uDEA2\"],\"\\uE202\",\"\\uDBB9\\uDFE8\",[\"ship\"],34,42,31,0],\n    \"1f6a3-200d-2640-fe0f\":[[\"\\uD83D\\uDEA3\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDEA3\\u200D\\u2640\"],\"\",\"\",[\"woman-rowing-boat\"],34,43,15,0],\n    \"1f6a3-200d-2642-fe0f\":[[\"\\uD83D\\uDEA3\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\u200D\\u2642\",\"\\uD83D\\uDEA3\"],\"\",\"\",[\"man-rowing-boat\",\"rowboat\"],34,49,15,0],\n    \"1f6a4\":[[\"\\uD83D\\uDEA4\"],\"\\uE135\",\"\\uDBB9\\uDFEE\",[\"speedboat\"],35,9,31,0],\n    \"1f6a5\":[[\"\\uD83D\\uDEA5\"],\"\\uE14E\",\"\\uDBB9\\uDFF7\",[\"traffic_light\"],35,10,31,0],\n    \"1f6a6\":[[\"\\uD83D\\uDEA6\"],\"\",\"\",[\"vertical_traffic_light\"],35,11,31,0],\n    \"1f6a7\":[[\"\\uD83D\\uDEA7\"],\"\\uE137\",\"\\uDBB9\\uDFF8\",[\"construction\"],35,12,31,0],\n    \"1f6a8\":[[\"\\uD83D\\uDEA8\"],\"\",\"\\uDBB9\\uDFF9\",[\"rotating_light\"],35,13,31,0],\n    \"1f6a9\":[[\"\\uD83D\\uDEA9\"],\"\",\"\\uDBBA\\uDF22\",[\"triangular_flag_on_post\"],35,14,31,0],\n    \"1f6aa\":[[\"\\uD83D\\uDEAA\"],\"\",\"\\uDBB9\\uDCF3\",[\"door\"],35,15,31,0],\n    \"1f6ab\":[[\"\\uD83D\\uDEAB\"],\"\",\"\\uDBBA\\uDF48\",[\"no_entry_sign\"],35,16,31,0],\n    \"1f6ac\":[[\"\\uD83D\\uDEAC\"],\"\\uE30E\",\"\\uDBBA\\uDF1E\",[\"smoking\"],35,17,31,0],\n    \"1f6ad\":[[\"\\uD83D\\uDEAD\"],\"\\uE208\",\"\\uDBBA\\uDF1F\",[\"no_smoking\"],35,18,31,0],\n    \"1f6ae\":[[\"\\uD83D\\uDEAE\"],\"\",\"\",[\"put_litter_in_its_place\"],35,19,31,0],\n    \"1f6af\":[[\"\\uD83D\\uDEAF\"],\"\",\"\",[\"do_not_litter\"],35,20,31,0],\n    \"1f6b0\":[[\"\\uD83D\\uDEB0\"],\"\",\"\",[\"potable_water\"],35,21,31,0],\n    \"1f6b1\":[[\"\\uD83D\\uDEB1\"],\"\",\"\",[\"non-potable_water\"],35,22,31,0],\n    \"1f6b2\":[[\"\\uD83D\\uDEB2\"],\"\\uE136\",\"\\uDBB9\\uDFEB\",[\"bike\"],35,23,31,0],\n    \"1f6b3\":[[\"\\uD83D\\uDEB3\"],\"\",\"\",[\"no_bicycles\"],35,24,31,0],\n    \"1f6b4-200d-2640-fe0f\":[[\"\\uD83D\\uDEB4\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDEB4\\u200D\\u2640\"],\"\",\"\",[\"woman-biking\"],35,25,15,0],\n    \"1f6b4-200d-2642-fe0f\":[[\"\\uD83D\\uDEB4\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\u200D\\u2642\",\"\\uD83D\\uDEB4\"],\"\",\"\",[\"man-biking\",\"bicyclist\"],35,31,15,0],\n    \"1f6b5-200d-2640-fe0f\":[[\"\\uD83D\\uDEB5\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDEB5\\u200D\\u2640\"],\"\",\"\",[\"woman-mountain-biking\"],35,43,15,0],\n    \"1f6b5-200d-2642-fe0f\":[[\"\\uD83D\\uDEB5\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\u200D\\u2642\",\"\\uD83D\\uDEB5\"],\"\",\"\",[\"man-mountain-biking\",\"mountain_bicyclist\"],35,49,15,0],\n    \"1f6b6-200d-2640-fe0f\":[[\"\\uD83D\\uDEB6\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDEB6\\u200D\\u2640\"],\"\",\"\",[\"woman-walking\"],36,9,15,0],\n    \"1f6b6-200d-2642-fe0f\":[[\"\\uD83D\\uDEB6\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\u200D\\u2642\",\"\\uD83D\\uDEB6\"],\"\",\"\",[\"man-walking\",\"walking\"],36,15,15,0],\n    \"1f6b7\":[[\"\\uD83D\\uDEB7\"],\"\",\"\",[\"no_pedestrians\"],36,27,31,0],\n    \"1f6b8\":[[\"\\uD83D\\uDEB8\"],\"\",\"\",[\"children_crossing\"],36,28,31,0],\n    \"1f6b9\":[[\"\\uD83D\\uDEB9\"],\"\\uE138\",\"\\uDBBA\\uDF33\",[\"mens\"],36,29,31,0],\n    \"1f6ba\":[[\"\\uD83D\\uDEBA\"],\"\\uE139\",\"\\uDBBA\\uDF34\",[\"womens\"],36,30,31,0],\n    \"1f6bb\":[[\"\\uD83D\\uDEBB\"],\"\\uE151\",\"\\uDBB9\\uDD06\",[\"restroom\"],36,31,31,0],\n    \"1f6bc\":[[\"\\uD83D\\uDEBC\"],\"\\uE13A\",\"\\uDBBA\\uDF35\",[\"baby_symbol\"],36,32,31,0],\n    \"1f6bd\":[[\"\\uD83D\\uDEBD\"],\"\\uE140\",\"\\uDBB9\\uDD07\",[\"toilet\"],36,33,31,0],\n    \"1f6be\":[[\"\\uD83D\\uDEBE\"],\"\\uE309\",\"\\uDBB9\\uDD08\",[\"wc\"],36,34,31,0],\n    \"1f6bf\":[[\"\\uD83D\\uDEBF\"],\"\",\"\",[\"shower\"],36,35,31,0],\n    \"1f6c0\":[[\"\\uD83D\\uDEC0\"],\"\\uE13F\",\"\\uDBB9\\uDD05\",[\"bath\"],36,36,31,0],\n    \"1f6c1\":[[\"\\uD83D\\uDEC1\"],\"\",\"\",[\"bathtub\"],36,42,31,0],\n    \"1f6c2\":[[\"\\uD83D\\uDEC2\"],\"\",\"\",[\"passport_control\"],36,43,31,0],\n    \"1f6c3\":[[\"\\uD83D\\uDEC3\"],\"\",\"\",[\"customs\"],36,44,31,0],\n    \"1f6c4\":[[\"\\uD83D\\uDEC4\"],\"\",\"\",[\"baggage_claim\"],36,45,31,0],\n    \"1f6c5\":[[\"\\uD83D\\uDEC5\"],\"\",\"\",[\"left_luggage\"],36,46,31,0],\n    \"1f6cb\":[[\"\\uD83D\\uDECB\\uFE0F\",\"\\uD83D\\uDECB\"],\"\",\"\",[\"couch_and_lamp\"],36,47,15,0],\n    \"1f6cc\":[[\"\\uD83D\\uDECC\"],\"\",\"\",[\"sleeping_accommodation\"],36,48,15,0],\n    \"1f6cd\":[[\"\\uD83D\\uDECD\\uFE0F\",\"\\uD83D\\uDECD\"],\"\",\"\",[\"shopping_bags\"],37,2,15,0],\n    \"1f6ce\":[[\"\\uD83D\\uDECE\\uFE0F\",\"\\uD83D\\uDECE\"],\"\",\"\",[\"bellhop_bell\"],37,3,15,0],\n    \"1f6cf\":[[\"\\uD83D\\uDECF\\uFE0F\",\"\\uD83D\\uDECF\"],\"\",\"\",[\"bed\"],37,4,15,0],\n    \"1f6d0\":[[\"\\uD83D\\uDED0\"],\"\",\"\",[\"place_of_worship\"],37,5,15,0],\n    \"1f6d1\":[[\"\\uD83D\\uDED1\"],\"\",\"\",[\"octagonal_sign\"],37,6,15,0],\n    \"1f6d2\":[[\"\\uD83D\\uDED2\"],\"\",\"\",[\"shopping_trolley\"],37,7,15,0],\n    \"1f6e0\":[[\"\\uD83D\\uDEE0\\uFE0F\",\"\\uD83D\\uDEE0\"],\"\",\"\",[\"hammer_and_wrench\"],37,8,15,0],\n    \"1f6e1\":[[\"\\uD83D\\uDEE1\\uFE0F\",\"\\uD83D\\uDEE1\"],\"\",\"\",[\"shield\"],37,9,15,0],\n    \"1f6e2\":[[\"\\uD83D\\uDEE2\\uFE0F\",\"\\uD83D\\uDEE2\"],\"\",\"\",[\"oil_drum\"],37,10,15,0],\n    \"1f6e3\":[[\"\\uD83D\\uDEE3\\uFE0F\",\"\\uD83D\\uDEE3\"],\"\",\"\",[\"motorway\"],37,11,15,0],\n    \"1f6e4\":[[\"\\uD83D\\uDEE4\\uFE0F\",\"\\uD83D\\uDEE4\"],\"\",\"\",[\"railway_track\"],37,12,15,0],\n    \"1f6e5\":[[\"\\uD83D\\uDEE5\\uFE0F\",\"\\uD83D\\uDEE5\"],\"\",\"\",[\"motor_boat\"],37,13,15,0],\n    \"1f6e9\":[[\"\\uD83D\\uDEE9\\uFE0F\",\"\\uD83D\\uDEE9\"],\"\",\"\",[\"small_airplane\"],37,14,15,0],\n    \"1f6eb\":[[\"\\uD83D\\uDEEB\"],\"\",\"\",[\"airplane_departure\"],37,15,15,0],\n    \"1f6ec\":[[\"\\uD83D\\uDEEC\"],\"\",\"\",[\"airplane_arriving\"],37,16,15,0],\n    \"1f6f0\":[[\"\\uD83D\\uDEF0\\uFE0F\",\"\\uD83D\\uDEF0\"],\"\",\"\",[\"satellite\"],37,17,15,0],\n    \"1f6f3\":[[\"\\uD83D\\uDEF3\\uFE0F\",\"\\uD83D\\uDEF3\"],\"\",\"\",[\"passenger_ship\"],37,18,15,0],\n    \"1f6f4\":[[\"\\uD83D\\uDEF4\"],\"\",\"\",[\"scooter\"],37,19,15,0],\n    \"1f6f5\":[[\"\\uD83D\\uDEF5\"],\"\",\"\",[\"motor_scooter\"],37,20,15,0],\n    \"1f6f6\":[[\"\\uD83D\\uDEF6\"],\"\",\"\",[\"canoe\"],37,21,15,0],\n    \"1f6f7\":[[\"\\uD83D\\uDEF7\"],\"\",\"\",[\"sled\"],37,22,15,0],\n    \"1f6f8\":[[\"\\uD83D\\uDEF8\"],\"\",\"\",[\"flying_saucer\"],37,23,15,0],\n    \"1f910\":[[\"\\uD83E\\uDD10\"],\"\",\"\",[\"zipper_mouth_face\"],37,24,15,0],\n    \"1f911\":[[\"\\uD83E\\uDD11\"],\"\",\"\",[\"money_mouth_face\"],37,25,15,0],\n    \"1f912\":[[\"\\uD83E\\uDD12\"],\"\",\"\",[\"face_with_thermometer\"],37,26,15,0],\n    \"1f913\":[[\"\\uD83E\\uDD13\"],\"\",\"\",[\"nerd_face\"],37,27,15,0],\n    \"1f914\":[[\"\\uD83E\\uDD14\"],\"\",\"\",[\"thinking_face\"],37,28,15,0],\n    \"1f915\":[[\"\\uD83E\\uDD15\"],\"\",\"\",[\"face_with_head_bandage\"],37,29,15,0],\n    \"1f916\":[[\"\\uD83E\\uDD16\"],\"\",\"\",[\"robot_face\"],37,30,15,0],\n    \"1f917\":[[\"\\uD83E\\uDD17\"],\"\",\"\",[\"hugging_face\"],37,31,15,0],\n    \"1f918\":[[\"\\uD83E\\uDD18\"],\"\",\"\",[\"the_horns\",\"sign_of_the_horns\"],37,32,15,0],\n    \"1f919\":[[\"\\uD83E\\uDD19\"],\"\",\"\",[\"call_me_hand\"],37,38,15,0],\n    \"1f91a\":[[\"\\uD83E\\uDD1A\"],\"\",\"\",[\"raised_back_of_hand\"],37,44,15,0],\n    \"1f91b\":[[\"\\uD83E\\uDD1B\"],\"\",\"\",[\"left-facing_fist\"],37,50,15,0],\n    \"1f91c\":[[\"\\uD83E\\uDD1C\"],\"\",\"\",[\"right-facing_fist\"],38,4,15,0],\n    \"1f91d\":[[\"\\uD83E\\uDD1D\"],\"\",\"\",[\"handshake\"],38,10,15,0],\n    \"1f91e\":[[\"\\uD83E\\uDD1E\"],\"\",\"\",[\"crossed_fingers\",\"hand_with_index_and_middle_fingers_crossed\"],38,11,15,0],\n    \"1f91f\":[[\"\\uD83E\\uDD1F\"],\"\",\"\",[\"i_love_you_hand_sign\"],38,17,15,0],\n    \"1f920\":[[\"\\uD83E\\uDD20\"],\"\",\"\",[\"face_with_cowboy_hat\"],38,23,15,0],\n    \"1f921\":[[\"\\uD83E\\uDD21\"],\"\",\"\",[\"clown_face\"],38,24,15,0],\n    \"1f922\":[[\"\\uD83E\\uDD22\"],\"\",\"\",[\"nauseated_face\"],38,25,15,0],\n    \"1f923\":[[\"\\uD83E\\uDD23\"],\"\",\"\",[\"rolling_on_the_floor_laughing\"],38,26,15,0],\n    \"1f924\":[[\"\\uD83E\\uDD24\"],\"\",\"\",[\"drooling_face\"],38,27,15,0],\n    \"1f925\":[[\"\\uD83E\\uDD25\"],\"\",\"\",[\"lying_face\"],38,28,15,0],\n    \"1f926-200d-2640-fe0f\":[[\"\\uD83E\\uDD26\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD26\\u200D\\u2640\"],\"\",\"\",[\"woman-facepalming\"],38,29,15,0],\n    \"1f926-200d-2642-fe0f\":[[\"\\uD83E\\uDD26\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD26\\u200D\\u2642\"],\"\",\"\",[\"man-facepalming\"],38,35,15,0],\n    \"1f926\":[[\"\\uD83E\\uDD26\"],\"\",\"\",[\"face_palm\"],38,41,7,0],\n    \"1f927\":[[\"\\uD83E\\uDD27\"],\"\",\"\",[\"sneezing_face\"],38,47,15,0],\n    \"1f928\":[[\"\\uD83E\\uDD28\"],\"\",\"\",[\"face_with_raised_eyebrow\",\"face_with_one_eyebrow_raised\"],38,48,15,0],\n    \"1f929\":[[\"\\uD83E\\uDD29\"],\"\",\"\",[\"star-struck\",\"grinning_face_with_star_eyes\"],38,49,15,0],\n    \"1f92a\":[[\"\\uD83E\\uDD2A\"],\"\",\"\",[\"zany_face\",\"grinning_face_with_one_large_and_one_small_eye\"],38,50,15,0],\n    \"1f92b\":[[\"\\uD83E\\uDD2B\"],\"\",\"\",[\"shushing_face\",\"face_with_finger_covering_closed_lips\"],38,51,15,0],\n    \"1f92c\":[[\"\\uD83E\\uDD2C\"],\"\",\"\",[\"face_with_symbols_on_mouth\",\"serious_face_with_symbols_covering_mouth\"],39,0,15,0],\n    \"1f92d\":[[\"\\uD83E\\uDD2D\"],\"\",\"\",[\"face_with_hand_over_mouth\",\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"],39,1,15,0],\n    \"1f92e\":[[\"\\uD83E\\uDD2E\"],\"\",\"\",[\"face_vomiting\",\"face_with_open_mouth_vomiting\"],39,2,15,0],\n    \"1f92f\":[[\"\\uD83E\\uDD2F\"],\"\",\"\",[\"exploding_head\",\"shocked_face_with_exploding_head\"],39,3,15,0],\n    \"1f930\":[[\"\\uD83E\\uDD30\"],\"\",\"\",[\"pregnant_woman\"],39,4,15,0],\n    \"1f931\":[[\"\\uD83E\\uDD31\"],\"\",\"\",[\"breast-feeding\"],39,10,15,0],\n    \"1f932\":[[\"\\uD83E\\uDD32\"],\"\",\"\",[\"palms_up_together\"],39,16,15,0],\n    \"1f933\":[[\"\\uD83E\\uDD33\"],\"\",\"\",[\"selfie\"],39,22,15,0],\n    \"1f934\":[[\"\\uD83E\\uDD34\"],\"\",\"\",[\"prince\"],39,28,15,0],\n    \"1f935\":[[\"\\uD83E\\uDD35\"],\"\",\"\",[\"man_in_tuxedo\"],39,34,15,0],\n    \"1f936\":[[\"\\uD83E\\uDD36\"],\"\",\"\",[\"mrs_claus\",\"mother_christmas\"],39,40,15,0],\n    \"1f937-200d-2640-fe0f\":[[\"\\uD83E\\uDD37\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD37\\u200D\\u2640\"],\"\",\"\",[\"woman-shrugging\"],39,46,15,0],\n    \"1f937-200d-2642-fe0f\":[[\"\\uD83E\\uDD37\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD37\\u200D\\u2642\"],\"\",\"\",[\"man-shrugging\"],40,0,15,0],\n    \"1f937\":[[\"\\uD83E\\uDD37\"],\"\",\"\",[\"shrug\"],40,6,7,0],\n    \"1f938-200d-2640-fe0f\":[[\"\\uD83E\\uDD38\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD38\\u200D\\u2640\"],\"\",\"\",[\"woman-cartwheeling\"],40,12,15,0],\n    \"1f938-200d-2642-fe0f\":[[\"\\uD83E\\uDD38\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD38\\u200D\\u2642\"],\"\",\"\",[\"man-cartwheeling\"],40,18,15,0],\n    \"1f938\":[[\"\\uD83E\\uDD38\"],\"\",\"\",[\"person_doing_cartwheel\"],40,24,7,0],\n    \"1f939-200d-2640-fe0f\":[[\"\\uD83E\\uDD39\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD39\\u200D\\u2640\"],\"\",\"\",[\"woman-juggling\"],40,30,7,0],\n    \"1f939-200d-2642-fe0f\":[[\"\\uD83E\\uDD39\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD39\\u200D\\u2642\"],\"\",\"\",[\"man-juggling\"],40,36,7,0],\n    \"1f939\":[[\"\\uD83E\\uDD39\"],\"\",\"\",[\"juggling\"],40,42,15,0],\n    \"1f93a\":[[\"\\uD83E\\uDD3A\"],\"\",\"\",[\"fencer\"],40,48,15,0],\n    \"1f93c-200d-2640-fe0f\":[[\"\\uD83E\\uDD3C\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD3C\\u200D\\u2640\"],\"\",\"\",[\"woman-wrestling\"],40,49,15,0],\n    \"1f93c-200d-2642-fe0f\":[[\"\\uD83E\\uDD3C\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD3C\\u200D\\u2642\"],\"\",\"\",[\"man-wrestling\"],40,50,15,0],\n    \"1f93c\":[[\"\\uD83E\\uDD3C\"],\"\",\"\",[\"wrestlers\"],40,51,7,0],\n    \"1f93d-200d-2640-fe0f\":[[\"\\uD83E\\uDD3D\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD3D\\u200D\\u2640\"],\"\",\"\",[\"woman-playing-water-polo\"],41,0,15,0],\n    \"1f93d-200d-2642-fe0f\":[[\"\\uD83E\\uDD3D\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD3D\\u200D\\u2642\"],\"\",\"\",[\"man-playing-water-polo\"],41,6,15,0],\n    \"1f93d\":[[\"\\uD83E\\uDD3D\"],\"\",\"\",[\"water_polo\"],41,12,7,0],\n    \"1f93e-200d-2640-fe0f\":[[\"\\uD83E\\uDD3E\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDD3E\\u200D\\u2640\"],\"\",\"\",[\"woman-playing-handball\"],41,18,15,0],\n    \"1f93e-200d-2642-fe0f\":[[\"\\uD83E\\uDD3E\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDD3E\\u200D\\u2642\"],\"\",\"\",[\"man-playing-handball\"],41,24,15,0],\n    \"1f93e\":[[\"\\uD83E\\uDD3E\"],\"\",\"\",[\"handball\"],41,30,7,0],\n    \"1f940\":[[\"\\uD83E\\uDD40\"],\"\",\"\",[\"wilted_flower\"],41,36,15,0],\n    \"1f941\":[[\"\\uD83E\\uDD41\"],\"\",\"\",[\"drum_with_drumsticks\"],41,37,15,0],\n    \"1f942\":[[\"\\uD83E\\uDD42\"],\"\",\"\",[\"clinking_glasses\"],41,38,15,0],\n    \"1f943\":[[\"\\uD83E\\uDD43\"],\"\",\"\",[\"tumbler_glass\"],41,39,15,0],\n    \"1f944\":[[\"\\uD83E\\uDD44\"],\"\",\"\",[\"spoon\"],41,40,15,0],\n    \"1f945\":[[\"\\uD83E\\uDD45\"],\"\",\"\",[\"goal_net\"],41,41,15,0],\n    \"1f947\":[[\"\\uD83E\\uDD47\"],\"\",\"\",[\"first_place_medal\"],41,42,15,0],\n    \"1f948\":[[\"\\uD83E\\uDD48\"],\"\",\"\",[\"second_place_medal\"],41,43,15,0],\n    \"1f949\":[[\"\\uD83E\\uDD49\"],\"\",\"\",[\"third_place_medal\"],41,44,15,0],\n    \"1f94a\":[[\"\\uD83E\\uDD4A\"],\"\",\"\",[\"boxing_glove\"],41,45,15,0],\n    \"1f94b\":[[\"\\uD83E\\uDD4B\"],\"\",\"\",[\"martial_arts_uniform\"],41,46,15,0],\n    \"1f94c\":[[\"\\uD83E\\uDD4C\"],\"\",\"\",[\"curling_stone\"],41,47,15,0],\n    \"1f950\":[[\"\\uD83E\\uDD50\"],\"\",\"\",[\"croissant\"],41,48,15,0],\n    \"1f951\":[[\"\\uD83E\\uDD51\"],\"\",\"\",[\"avocado\"],41,49,15,0],\n    \"1f952\":[[\"\\uD83E\\uDD52\"],\"\",\"\",[\"cucumber\"],41,50,15,0],\n    \"1f953\":[[\"\\uD83E\\uDD53\"],\"\",\"\",[\"bacon\"],41,51,15,0],\n    \"1f954\":[[\"\\uD83E\\uDD54\"],\"\",\"\",[\"potato\"],42,0,15,0],\n    \"1f955\":[[\"\\uD83E\\uDD55\"],\"\",\"\",[\"carrot\"],42,1,15,0],\n    \"1f956\":[[\"\\uD83E\\uDD56\"],\"\",\"\",[\"baguette_bread\"],42,2,15,0],\n    \"1f957\":[[\"\\uD83E\\uDD57\"],\"\",\"\",[\"green_salad\"],42,3,15,0],\n    \"1f958\":[[\"\\uD83E\\uDD58\"],\"\",\"\",[\"shallow_pan_of_food\"],42,4,15,0],\n    \"1f959\":[[\"\\uD83E\\uDD59\"],\"\",\"\",[\"stuffed_flatbread\"],42,5,15,0],\n    \"1f95a\":[[\"\\uD83E\\uDD5A\"],\"\",\"\",[\"egg\"],42,6,15,0],\n    \"1f95b\":[[\"\\uD83E\\uDD5B\"],\"\",\"\",[\"glass_of_milk\"],42,7,15,0],\n    \"1f95c\":[[\"\\uD83E\\uDD5C\"],\"\",\"\",[\"peanuts\"],42,8,15,0],\n    \"1f95d\":[[\"\\uD83E\\uDD5D\"],\"\",\"\",[\"kiwifruit\"],42,9,15,0],\n    \"1f95e\":[[\"\\uD83E\\uDD5E\"],\"\",\"\",[\"pancakes\"],42,10,15,0],\n    \"1f95f\":[[\"\\uD83E\\uDD5F\"],\"\",\"\",[\"dumpling\"],42,11,15,0],\n    \"1f960\":[[\"\\uD83E\\uDD60\"],\"\",\"\",[\"fortune_cookie\"],42,12,15,0],\n    \"1f961\":[[\"\\uD83E\\uDD61\"],\"\",\"\",[\"takeout_box\"],42,13,15,0],\n    \"1f962\":[[\"\\uD83E\\uDD62\"],\"\",\"\",[\"chopsticks\"],42,14,15,0],\n    \"1f963\":[[\"\\uD83E\\uDD63\"],\"\",\"\",[\"bowl_with_spoon\"],42,15,15,0],\n    \"1f964\":[[\"\\uD83E\\uDD64\"],\"\",\"\",[\"cup_with_straw\"],42,16,15,0],\n    \"1f965\":[[\"\\uD83E\\uDD65\"],\"\",\"\",[\"coconut\"],42,17,15,0],\n    \"1f966\":[[\"\\uD83E\\uDD66\"],\"\",\"\",[\"broccoli\"],42,18,15,0],\n    \"1f967\":[[\"\\uD83E\\uDD67\"],\"\",\"\",[\"pie\"],42,19,15,0],\n    \"1f968\":[[\"\\uD83E\\uDD68\"],\"\",\"\",[\"pretzel\"],42,20,15,0],\n    \"1f969\":[[\"\\uD83E\\uDD69\"],\"\",\"\",[\"cut_of_meat\"],42,21,15,0],\n    \"1f96a\":[[\"\\uD83E\\uDD6A\"],\"\",\"\",[\"sandwich\"],42,22,15,0],\n    \"1f96b\":[[\"\\uD83E\\uDD6B\"],\"\",\"\",[\"canned_food\"],42,23,15,0],\n    \"1f980\":[[\"\\uD83E\\uDD80\"],\"\",\"\",[\"crab\"],42,24,15,0],\n    \"1f981\":[[\"\\uD83E\\uDD81\"],\"\",\"\",[\"lion_face\"],42,25,15,0],\n    \"1f982\":[[\"\\uD83E\\uDD82\"],\"\",\"\",[\"scorpion\"],42,26,15,0],\n    \"1f983\":[[\"\\uD83E\\uDD83\"],\"\",\"\",[\"turkey\"],42,27,15,0],\n    \"1f984\":[[\"\\uD83E\\uDD84\"],\"\",\"\",[\"unicorn_face\"],42,28,15,0],\n    \"1f985\":[[\"\\uD83E\\uDD85\"],\"\",\"\",[\"eagle\"],42,29,15,0],\n    \"1f986\":[[\"\\uD83E\\uDD86\"],\"\",\"\",[\"duck\"],42,30,15,0],\n    \"1f987\":[[\"\\uD83E\\uDD87\"],\"\",\"\",[\"bat\"],42,31,15,0],\n    \"1f988\":[[\"\\uD83E\\uDD88\"],\"\",\"\",[\"shark\"],42,32,15,0],\n    \"1f989\":[[\"\\uD83E\\uDD89\"],\"\",\"\",[\"owl\"],42,33,15,0],\n    \"1f98a\":[[\"\\uD83E\\uDD8A\"],\"\",\"\",[\"fox_face\"],42,34,15,0],\n    \"1f98b\":[[\"\\uD83E\\uDD8B\"],\"\",\"\",[\"butterfly\"],42,35,15,0],\n    \"1f98c\":[[\"\\uD83E\\uDD8C\"],\"\",\"\",[\"deer\"],42,36,15,0],\n    \"1f98d\":[[\"\\uD83E\\uDD8D\"],\"\",\"\",[\"gorilla\"],42,37,15,0],\n    \"1f98e\":[[\"\\uD83E\\uDD8E\"],\"\",\"\",[\"lizard\"],42,38,15,0],\n    \"1f98f\":[[\"\\uD83E\\uDD8F\"],\"\",\"\",[\"rhinoceros\"],42,39,15,0],\n    \"1f990\":[[\"\\uD83E\\uDD90\"],\"\",\"\",[\"shrimp\"],42,40,15,0],\n    \"1f991\":[[\"\\uD83E\\uDD91\"],\"\",\"\",[\"squid\"],42,41,15,0],\n    \"1f992\":[[\"\\uD83E\\uDD92\"],\"\",\"\",[\"giraffe_face\"],42,42,15,0],\n    \"1f993\":[[\"\\uD83E\\uDD93\"],\"\",\"\",[\"zebra_face\"],42,43,15,0],\n    \"1f994\":[[\"\\uD83E\\uDD94\"],\"\",\"\",[\"hedgehog\"],42,44,15,0],\n    \"1f995\":[[\"\\uD83E\\uDD95\"],\"\",\"\",[\"sauropod\"],42,45,15,0],\n    \"1f996\":[[\"\\uD83E\\uDD96\"],\"\",\"\",[\"t-rex\"],42,46,15,0],\n    \"1f997\":[[\"\\uD83E\\uDD97\"],\"\",\"\",[\"cricket\"],42,47,15,0],\n    \"1f9c0\":[[\"\\uD83E\\uDDC0\"],\"\",\"\",[\"cheese_wedge\"],42,48,15,0],\n    \"1f9d0\":[[\"\\uD83E\\uDDD0\"],\"\",\"\",[\"face_with_monocle\"],42,49,15,0],\n    \"1f9d1\":[[\"\\uD83E\\uDDD1\"],\"\",\"\",[\"adult\"],42,50,15,0],\n    \"1f9d2\":[[\"\\uD83E\\uDDD2\"],\"\",\"\",[\"child\"],43,4,15,0],\n    \"1f9d3\":[[\"\\uD83E\\uDDD3\"],\"\",\"\",[\"older_adult\"],43,10,15,0],\n    \"1f9d4\":[[\"\\uD83E\\uDDD4\"],\"\",\"\",[\"bearded_person\"],43,16,15,0],\n    \"1f9d5\":[[\"\\uD83E\\uDDD5\"],\"\",\"\",[\"person_with_headscarf\"],43,22,15,0],\n    \"1f9d6-200d-2640-fe0f\":[[\"\\uD83E\\uDDD6\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD6\\u200D\\u2640\"],\"\",\"\",[\"woman_in_steamy_room\"],43,28,15,0],\n    \"1f9d6-200d-2642-fe0f\":[[\"\\uD83E\\uDDD6\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\u200D\\u2642\",\"\\uD83E\\uDDD6\"],\"\",\"\",[\"man_in_steamy_room\",\"person_in_steamy_room\"],43,34,15,0],\n    \"1f9d7-200d-2640-fe0f\":[[\"\\uD83E\\uDDD7\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\u200D\\u2640\",\"\\uD83E\\uDDD7\"],\"\",\"\",[\"woman_climbing\",\"person_climbing\"],43,46,15,0],\n    \"1f9d7-200d-2642-fe0f\":[[\"\\uD83E\\uDDD7\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD7\\u200D\\u2642\"],\"\",\"\",[\"man_climbing\"],44,0,15,0],\n    \"1f9d8-200d-2640-fe0f\":[[\"\\uD83E\\uDDD8\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\u200D\\u2640\",\"\\uD83E\\uDDD8\"],\"\",\"\",[\"woman_in_lotus_position\",\"person_in_lotus_position\"],44,12,15,0],\n    \"1f9d8-200d-2642-fe0f\":[[\"\\uD83E\\uDDD8\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD8\\u200D\\u2642\"],\"\",\"\",[\"man_in_lotus_position\"],44,18,15,0],\n    \"1f9d9-200d-2640-fe0f\":[[\"\\uD83E\\uDDD9\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\u200D\\u2640\",\"\\uD83E\\uDDD9\"],\"\",\"\",[\"female_mage\",\"mage\"],44,30,15,0],\n    \"1f9d9-200d-2642-fe0f\":[[\"\\uD83E\\uDDD9\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD9\\u200D\\u2642\"],\"\",\"\",[\"male_mage\"],44,36,15,0],\n    \"1f9da-200d-2640-fe0f\":[[\"\\uD83E\\uDDDA\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\u200D\\u2640\",\"\\uD83E\\uDDDA\"],\"\",\"\",[\"female_fairy\",\"fairy\"],44,48,15,0],\n    \"1f9da-200d-2642-fe0f\":[[\"\\uD83E\\uDDDA\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDA\\u200D\\u2642\"],\"\",\"\",[\"male_fairy\"],45,2,15,0],\n    \"1f9db-200d-2640-fe0f\":[[\"\\uD83E\\uDDDB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\u200D\\u2640\",\"\\uD83E\\uDDDB\"],\"\",\"\",[\"female_vampire\",\"vampire\"],45,14,15,0],\n    \"1f9db-200d-2642-fe0f\":[[\"\\uD83E\\uDDDB\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDB\\u200D\\u2642\"],\"\",\"\",[\"male_vampire\"],45,20,15,0],\n    \"1f9dc-200d-2640-fe0f\":[[\"\\uD83E\\uDDDC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDC\\u200D\\u2640\"],\"\",\"\",[\"mermaid\"],45,32,15,0],\n    \"1f9dc-200d-2642-fe0f\":[[\"\\uD83E\\uDDDC\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\u200D\\u2642\",\"\\uD83E\\uDDDC\"],\"\",\"\",[\"merman\",\"merperson\"],45,38,15,0],\n    \"1f9dd-200d-2640-fe0f\":[[\"\\uD83E\\uDDDD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDD\\u200D\\u2640\"],\"\",\"\",[\"female_elf\"],45,50,15,0],\n    \"1f9dd-200d-2642-fe0f\":[[\"\\uD83E\\uDDDD\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\u200D\\u2642\",\"\\uD83E\\uDDDD\"],\"\",\"\",[\"male_elf\",\"elf\"],46,4,15,0],\n    \"1f9de-200d-2640-fe0f\":[[\"\\uD83E\\uDDDE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDE\\u200D\\u2640\"],\"\",\"\",[\"female_genie\"],46,16,15,0],\n    \"1f9de-200d-2642-fe0f\":[[\"\\uD83E\\uDDDE\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDE\\u200D\\u2642\",\"\\uD83E\\uDDDE\"],\"\",\"\",[\"male_genie\",\"genie\"],46,17,15,0],\n    \"1f9df-200d-2640-fe0f\":[[\"\\uD83E\\uDDDF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDF\\u200D\\u2640\"],\"\",\"\",[\"female_zombie\"],46,19,15,0],\n    \"1f9df-200d-2642-fe0f\":[[\"\\uD83E\\uDDDF\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDF\\u200D\\u2642\",\"\\uD83E\\uDDDF\"],\"\",\"\",[\"male_zombie\",\"zombie\"],46,20,15,0],\n    \"1f9e0\":[[\"\\uD83E\\uDDE0\"],\"\",\"\",[\"brain\"],46,22,15,0],\n    \"1f9e1\":[[\"\\uD83E\\uDDE1\"],\"\",\"\",[\"orange_heart\"],46,23,15,0],\n    \"1f9e2\":[[\"\\uD83E\\uDDE2\"],\"\",\"\",[\"billed_cap\"],46,24,15,0],\n    \"1f9e3\":[[\"\\uD83E\\uDDE3\"],\"\",\"\",[\"scarf\"],46,25,15,0],\n    \"1f9e4\":[[\"\\uD83E\\uDDE4\"],\"\",\"\",[\"gloves\"],46,26,15,0],\n    \"1f9e5\":[[\"\\uD83E\\uDDE5\"],\"\",\"\",[\"coat\"],46,27,15,0],\n    \"1f9e6\":[[\"\\uD83E\\uDDE6\"],\"\",\"\",[\"socks\"],46,28,15,0],\n    \"203c\":[[\"\\u203C\\uFE0F\",\"\\u203C\"],\"\",\"\\uDBBA\\uDF06\",[\"bangbang\"],46,29,31,0],\n    \"2049\":[[\"\\u2049\\uFE0F\",\"\\u2049\"],\"\",\"\\uDBBA\\uDF05\",[\"interrobang\"],46,30,31,0],\n    \"2122\":[[\"\\u2122\\uFE0F\",\"\\u2122\"],\"\\uE537\",\"\\uDBBA\\uDF2A\",[\"tm\"],46,31,31,0],\n    \"2139\":[[\"\\u2139\\uFE0F\",\"\\u2139\"],\"\",\"\\uDBBA\\uDF47\",[\"information_source\"],46,32,31,0],\n    \"2194\":[[\"\\u2194\\uFE0F\",\"\\u2194\"],\"\",\"\\uDBBA\\uDEF6\",[\"left_right_arrow\"],46,33,31,0],\n    \"2195\":[[\"\\u2195\\uFE0F\",\"\\u2195\"],\"\",\"\\uDBBA\\uDEF7\",[\"arrow_up_down\"],46,34,31,0],\n    \"2196\":[[\"\\u2196\\uFE0F\",\"\\u2196\"],\"\\uE237\",\"\\uDBBA\\uDEF2\",[\"arrow_upper_left\"],46,35,31,0],\n    \"2197\":[[\"\\u2197\\uFE0F\",\"\\u2197\"],\"\\uE236\",\"\\uDBBA\\uDEF0\",[\"arrow_upper_right\"],46,36,31,0],\n    \"2198\":[[\"\\u2198\\uFE0F\",\"\\u2198\"],\"\\uE238\",\"\\uDBBA\\uDEF1\",[\"arrow_lower_right\"],46,37,31,0],\n    \"2199\":[[\"\\u2199\\uFE0F\",\"\\u2199\"],\"\\uE239\",\"\\uDBBA\\uDEF3\",[\"arrow_lower_left\"],46,38,31,0],\n    \"21a9\":[[\"\\u21A9\\uFE0F\",\"\\u21A9\"],\"\",\"\\uDBBA\\uDF83\",[\"leftwards_arrow_with_hook\"],46,39,31,0],\n    \"21aa\":[[\"\\u21AA\\uFE0F\",\"\\u21AA\"],\"\",\"\\uDBBA\\uDF88\",[\"arrow_right_hook\"],46,40,31,0],\n    \"231a\":[[\"\\u231A\"],\"\",\"\\uDBB8\\uDC1D\",[\"watch\"],46,41,31,0],\n    \"231b\":[[\"\\u231B\"],\"\",\"\\uDBB8\\uDC1C\",[\"hourglass\"],46,42,31,0],\n    \"2328\":[[\"\\u2328\\uFE0F\",\"\\u2328\"],\"\",\"\",[\"keyboard\"],46,43,15,0],\n    \"23cf\":[[\"\\u23CF\\uFE0F\",\"\\u23CF\"],\"\",\"\",[\"eject\"],46,44,15,0],\n    \"23e9\":[[\"\\u23E9\"],\"\\uE23C\",\"\\uDBBA\\uDEFE\",[\"fast_forward\"],46,45,31,0],\n    \"23ea\":[[\"\\u23EA\"],\"\\uE23D\",\"\\uDBBA\\uDEFF\",[\"rewind\"],46,46,31,0],\n    \"23eb\":[[\"\\u23EB\"],\"\",\"\\uDBBA\\uDF03\",[\"arrow_double_up\"],46,47,31,0],\n    \"23ec\":[[\"\\u23EC\"],\"\",\"\\uDBBA\\uDF02\",[\"arrow_double_down\"],46,48,31,0],\n    \"23ed\":[[\"\\u23ED\\uFE0F\",\"\\u23ED\"],\"\",\"\",[\"black_right_pointing_double_triangle_with_vertical_bar\"],46,49,15,0],\n    \"23ee\":[[\"\\u23EE\\uFE0F\",\"\\u23EE\"],\"\",\"\",[\"black_left_pointing_double_triangle_with_vertical_bar\"],46,50,15,0],\n    \"23ef\":[[\"\\u23EF\\uFE0F\",\"\\u23EF\"],\"\",\"\",[\"black_right_pointing_triangle_with_double_vertical_bar\"],46,51,15,0],\n    \"23f0\":[[\"\\u23F0\"],\"\",\"\\uDBB8\\uDC2A\",[\"alarm_clock\"],47,0,31,0],\n    \"23f1\":[[\"\\u23F1\\uFE0F\",\"\\u23F1\"],\"\",\"\",[\"stopwatch\"],47,1,15,0],\n    \"23f2\":[[\"\\u23F2\\uFE0F\",\"\\u23F2\"],\"\",\"\",[\"timer_clock\"],47,2,15,0],\n    \"23f3\":[[\"\\u23F3\"],\"\",\"\\uDBB8\\uDC1B\",[\"hourglass_flowing_sand\"],47,3,31,0],\n    \"23f8\":[[\"\\u23F8\\uFE0F\",\"\\u23F8\"],\"\",\"\",[\"double_vertical_bar\"],47,4,15,0],\n    \"23f9\":[[\"\\u23F9\\uFE0F\",\"\\u23F9\"],\"\",\"\",[\"black_square_for_stop\"],47,5,15,0],\n    \"23fa\":[[\"\\u23FA\\uFE0F\",\"\\u23FA\"],\"\",\"\",[\"black_circle_for_record\"],47,6,15,0],\n    \"24c2\":[[\"\\u24C2\\uFE0F\",\"\\u24C2\"],\"\",\"\\uDBB9\\uDFE1\",[\"m\"],47,7,31,0],\n    \"25aa\":[[\"\\u25AA\\uFE0F\",\"\\u25AA\"],\"\",\"\\uDBBA\\uDF6E\",[\"black_small_square\"],47,8,31,0],\n    \"25ab\":[[\"\\u25AB\\uFE0F\",\"\\u25AB\"],\"\",\"\\uDBBA\\uDF6D\",[\"white_small_square\"],47,9,31,0],\n    \"25b6\":[[\"\\u25B6\\uFE0F\",\"\\u25B6\"],\"\\uE23A\",\"\\uDBBA\\uDEFC\",[\"arrow_forward\"],47,10,31,0],\n    \"25c0\":[[\"\\u25C0\\uFE0F\",\"\\u25C0\"],\"\\uE23B\",\"\\uDBBA\\uDEFD\",[\"arrow_backward\"],47,11,31,0],\n    \"25fb\":[[\"\\u25FB\\uFE0F\",\"\\u25FB\"],\"\",\"\\uDBBA\\uDF71\",[\"white_medium_square\"],47,12,31,0],\n    \"25fc\":[[\"\\u25FC\\uFE0F\",\"\\u25FC\"],\"\",\"\\uDBBA\\uDF72\",[\"black_medium_square\"],47,13,31,0],\n    \"25fd\":[[\"\\u25FD\"],\"\",\"\\uDBBA\\uDF6F\",[\"white_medium_small_square\"],47,14,31,0],\n    \"25fe\":[[\"\\u25FE\"],\"\",\"\\uDBBA\\uDF70\",[\"black_medium_small_square\"],47,15,31,0],\n    \"2600\":[[\"\\u2600\\uFE0F\",\"\\u2600\"],\"\\uE04A\",\"\\uDBB8\\uDC00\",[\"sunny\"],47,16,31,0],\n    \"2601\":[[\"\\u2601\\uFE0F\",\"\\u2601\"],\"\\uE049\",\"\\uDBB8\\uDC01\",[\"cloud\"],47,17,31,0],\n    \"2602\":[[\"\\u2602\\uFE0F\",\"\\u2602\"],\"\",\"\",[\"umbrella\"],47,18,15,0],\n    \"2603\":[[\"\\u2603\\uFE0F\",\"\\u2603\"],\"\",\"\",[\"snowman\"],47,19,15,0],\n    \"2604\":[[\"\\u2604\\uFE0F\",\"\\u2604\"],\"\",\"\",[\"comet\"],47,20,15,0],\n    \"260e\":[[\"\\u260E\\uFE0F\",\"\\u260E\"],\"\\uE009\",\"\\uDBB9\\uDD23\",[\"phone\",\"telephone\"],47,21,31,0],\n    \"2611\":[[\"\\u2611\\uFE0F\",\"\\u2611\"],\"\",\"\\uDBBA\\uDF8B\",[\"ballot_box_with_check\"],47,22,31,0],\n    \"2614\":[[\"\\u2614\"],\"\\uE04B\",\"\\uDBB8\\uDC02\",[\"umbrella_with_rain_drops\"],47,23,31,0],\n    \"2615\":[[\"\\u2615\"],\"\\uE045\",\"\\uDBBA\\uDD81\",[\"coffee\"],47,24,31,0],\n    \"2618\":[[\"\\u2618\\uFE0F\",\"\\u2618\"],\"\",\"\",[\"shamrock\"],47,25,15,0],\n    \"261d\":[[\"\\u261D\\uFE0F\",\"\\u261D\"],\"\\uE00F\",\"\\uDBBA\\uDF98\",[\"point_up\"],47,26,31,0],\n    \"2620\":[[\"\\u2620\\uFE0F\",\"\\u2620\"],\"\",\"\",[\"skull_and_crossbones\"],47,32,15,0],\n    \"2622\":[[\"\\u2622\\uFE0F\",\"\\u2622\"],\"\",\"\",[\"radioactive_sign\"],47,33,15,0],\n    \"2623\":[[\"\\u2623\\uFE0F\",\"\\u2623\"],\"\",\"\",[\"biohazard_sign\"],47,34,15,0],\n    \"2626\":[[\"\\u2626\\uFE0F\",\"\\u2626\"],\"\",\"\",[\"orthodox_cross\"],47,35,15,0],\n    \"262a\":[[\"\\u262A\\uFE0F\",\"\\u262A\"],\"\",\"\",[\"star_and_crescent\"],47,36,15,0],\n    \"262e\":[[\"\\u262E\\uFE0F\",\"\\u262E\"],\"\",\"\",[\"peace_symbol\"],47,37,15,0],\n    \"262f\":[[\"\\u262F\\uFE0F\",\"\\u262F\"],\"\",\"\",[\"yin_yang\"],47,38,15,0],\n    \"2638\":[[\"\\u2638\\uFE0F\",\"\\u2638\"],\"\",\"\",[\"wheel_of_dharma\"],47,39,15,0],\n    \"2639\":[[\"\\u2639\\uFE0F\",\"\\u2639\"],\"\",\"\",[\"white_frowning_face\"],47,40,15,0],\n    \"263a\":[[\"\\u263A\\uFE0F\",\"\\u263A\"],\"\\uE414\",\"\\uDBB8\\uDF36\",[\"relaxed\"],47,41,31,0],\n    \"2640\":[[\"\\u2640\\uFE0F\",\"\\u2640\"],\"\",\"\",[\"female_sign\"],47,42,14,0],\n    \"2642\":[[\"\\u2642\\uFE0F\",\"\\u2642\"],\"\",\"\",[\"male_sign\"],47,43,14,0],\n    \"2648\":[[\"\\u2648\"],\"\\uE23F\",\"\\uDBB8\\uDC2B\",[\"aries\"],47,44,31,0],\n    \"2649\":[[\"\\u2649\"],\"\\uE240\",\"\\uDBB8\\uDC2C\",[\"taurus\"],47,45,31,0],\n    \"264a\":[[\"\\u264A\"],\"\\uE241\",\"\\uDBB8\\uDC2D\",[\"gemini\"],47,46,31,0],\n    \"264b\":[[\"\\u264B\"],\"\\uE242\",\"\\uDBB8\\uDC2E\",[\"cancer\"],47,47,31,0],\n    \"264c\":[[\"\\u264C\"],\"\\uE243\",\"\\uDBB8\\uDC2F\",[\"leo\"],47,48,31,0],\n    \"264d\":[[\"\\u264D\"],\"\\uE244\",\"\\uDBB8\\uDC30\",[\"virgo\"],47,49,31,0],\n    \"264e\":[[\"\\u264E\"],\"\\uE245\",\"\\uDBB8\\uDC31\",[\"libra\"],47,50,31,0],\n    \"264f\":[[\"\\u264F\"],\"\\uE246\",\"\\uDBB8\\uDC32\",[\"scorpius\"],47,51,31,0],\n    \"2650\":[[\"\\u2650\"],\"\\uE247\",\"\\uDBB8\\uDC33\",[\"sagittarius\"],48,0,31,0],\n    \"2651\":[[\"\\u2651\"],\"\\uE248\",\"\\uDBB8\\uDC34\",[\"capricorn\"],48,1,31,0],\n    \"2652\":[[\"\\u2652\"],\"\\uE249\",\"\\uDBB8\\uDC35\",[\"aquarius\"],48,2,31,0],\n    \"2653\":[[\"\\u2653\"],\"\\uE24A\",\"\\uDBB8\\uDC36\",[\"pisces\"],48,3,31,0],\n    \"2660\":[[\"\\u2660\\uFE0F\",\"\\u2660\"],\"\\uE20E\",\"\\uDBBA\\uDF1B\",[\"spades\"],48,4,31,0],\n    \"2663\":[[\"\\u2663\\uFE0F\",\"\\u2663\"],\"\\uE20F\",\"\\uDBBA\\uDF1D\",[\"clubs\"],48,5,31,0],\n    \"2665\":[[\"\\u2665\\uFE0F\",\"\\u2665\"],\"\\uE20C\",\"\\uDBBA\\uDF1A\",[\"hearts\"],48,6,31,0],\n    \"2666\":[[\"\\u2666\\uFE0F\",\"\\u2666\"],\"\\uE20D\",\"\\uDBBA\\uDF1C\",[\"diamonds\"],48,7,31,0],\n    \"2668\":[[\"\\u2668\\uFE0F\",\"\\u2668\"],\"\\uE123\",\"\\uDBB9\\uDFFA\",[\"hotsprings\"],48,8,31,0],\n    \"267b\":[[\"\\u267B\\uFE0F\",\"\\u267B\"],\"\",\"\\uDBBA\\uDF2C\",[\"recycle\"],48,9,31,0],\n    \"267f\":[[\"\\u267F\"],\"\\uE20A\",\"\\uDBBA\\uDF20\",[\"wheelchair\"],48,10,31,0],\n    \"2692\":[[\"\\u2692\\uFE0F\",\"\\u2692\"],\"\",\"\",[\"hammer_and_pick\"],48,11,15,0],\n    \"2693\":[[\"\\u2693\"],\"\",\"\\uDBB9\\uDCC1\",[\"anchor\"],48,12,31,0],\n    \"2694\":[[\"\\u2694\\uFE0F\",\"\\u2694\"],\"\",\"\",[\"crossed_swords\"],48,13,15,0],\n    \"2695\":[[\"\\u2695\\uFE0F\",\"\\u2695\"],\"\",\"\",[\"medical_symbol\",\"staff_of_aesculapius\"],48,14,14,0],\n    \"2696\":[[\"\\u2696\\uFE0F\",\"\\u2696\"],\"\",\"\",[\"scales\"],48,15,15,0],\n    \"2697\":[[\"\\u2697\\uFE0F\",\"\\u2697\"],\"\",\"\",[\"alembic\"],48,16,15,0],\n    \"2699\":[[\"\\u2699\\uFE0F\",\"\\u2699\"],\"\",\"\",[\"gear\"],48,17,15,0],\n    \"269b\":[[\"\\u269B\\uFE0F\",\"\\u269B\"],\"\",\"\",[\"atom_symbol\"],48,18,15,0],\n    \"269c\":[[\"\\u269C\\uFE0F\",\"\\u269C\"],\"\",\"\",[\"fleur_de_lis\"],48,19,15,0],\n    \"26a0\":[[\"\\u26A0\\uFE0F\",\"\\u26A0\"],\"\\uE252\",\"\\uDBBA\\uDF23\",[\"warning\"],48,20,31,0],\n    \"26a1\":[[\"\\u26A1\"],\"\\uE13D\",\"\\uDBB8\\uDC04\",[\"zap\"],48,21,31,0],\n    \"26aa\":[[\"\\u26AA\"],\"\",\"\\uDBBA\\uDF65\",[\"white_circle\"],48,22,31,0],\n    \"26ab\":[[\"\\u26AB\"],\"\",\"\\uDBBA\\uDF66\",[\"black_circle\"],48,23,31,0],\n    \"26b0\":[[\"\\u26B0\\uFE0F\",\"\\u26B0\"],\"\",\"\",[\"coffin\"],48,24,15,0],\n    \"26b1\":[[\"\\u26B1\\uFE0F\",\"\\u26B1\"],\"\",\"\",[\"funeral_urn\"],48,25,15,0],\n    \"26bd\":[[\"\\u26BD\"],\"\\uE018\",\"\\uDBB9\\uDFD4\",[\"soccer\"],48,26,31,0],\n    \"26be\":[[\"\\u26BE\"],\"\\uE016\",\"\\uDBB9\\uDFD1\",[\"baseball\"],48,27,31,0],\n    \"26c4\":[[\"\\u26C4\"],\"\\uE048\",\"\\uDBB8\\uDC03\",[\"snowman_without_snow\"],48,28,31,0],\n    \"26c5\":[[\"\\u26C5\"],\"\",\"\\uDBB8\\uDC0F\",[\"partly_sunny\"],48,29,31,0],\n    \"26c8\":[[\"\\u26C8\\uFE0F\",\"\\u26C8\"],\"\",\"\",[\"thunder_cloud_and_rain\"],48,30,15,0],\n    \"26ce\":[[\"\\u26CE\"],\"\\uE24B\",\"\\uDBB8\\uDC37\",[\"ophiuchus\"],48,31,31,0],\n    \"26cf\":[[\"\\u26CF\\uFE0F\",\"\\u26CF\"],\"\",\"\",[\"pick\"],48,32,15,0],\n    \"26d1\":[[\"\\u26D1\\uFE0F\",\"\\u26D1\"],\"\",\"\",[\"helmet_with_white_cross\"],48,33,15,0],\n    \"26d3\":[[\"\\u26D3\\uFE0F\",\"\\u26D3\"],\"\",\"\",[\"chains\"],48,34,15,0],\n    \"26d4\":[[\"\\u26D4\"],\"\",\"\\uDBBA\\uDF26\",[\"no_entry\"],48,35,31,0],\n    \"26e9\":[[\"\\u26E9\\uFE0F\",\"\\u26E9\"],\"\",\"\",[\"shinto_shrine\"],48,36,15,0],\n    \"26ea\":[[\"\\u26EA\"],\"\\uE037\",\"\\uDBB9\\uDCBB\",[\"church\"],48,37,31,0],\n    \"26f0\":[[\"\\u26F0\\uFE0F\",\"\\u26F0\"],\"\",\"\",[\"mountain\"],48,38,15,0],\n    \"26f1\":[[\"\\u26F1\\uFE0F\",\"\\u26F1\"],\"\",\"\",[\"umbrella_on_ground\"],48,39,15,0],\n    \"26f2\":[[\"\\u26F2\"],\"\\uE121\",\"\\uDBB9\\uDCBC\",[\"fountain\"],48,40,31,0],\n    \"26f3\":[[\"\\u26F3\"],\"\\uE014\",\"\\uDBB9\\uDFD2\",[\"golf\"],48,41,31,0],\n    \"26f4\":[[\"\\u26F4\\uFE0F\",\"\\u26F4\"],\"\",\"\",[\"ferry\"],48,42,15,0],\n    \"26f5\":[[\"\\u26F5\"],\"\\uE01C\",\"\\uDBB9\\uDFEA\",[\"boat\",\"sailboat\"],48,43,31,0],\n    \"26f7\":[[\"\\u26F7\\uFE0F\",\"\\u26F7\"],\"\",\"\",[\"skier\"],48,44,15,0],\n    \"26f8\":[[\"\\u26F8\\uFE0F\",\"\\u26F8\"],\"\",\"\",[\"ice_skate\"],48,45,15,0],\n    \"26f9-fe0f-200d-2640-fe0f\":[[\"\\u26F9\\uFE0F\\u200D\\u2640\\uFE0F\"],\"\",\"\",[\"woman-bouncing-ball\"],48,46,7,0],\n    \"26f9-fe0f-200d-2642-fe0f\":[[\"\\u26F9\\uFE0F\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uFE0F\",\"\\u26F9\"],\"\",\"\",[\"man-bouncing-ball\",\"person_with_ball\"],49,0,7,0],\n    \"26fa\":[[\"\\u26FA\"],\"\\uE122\",\"\\uDBB9\\uDFFB\",[\"tent\"],49,12,31,0],\n    \"26fd\":[[\"\\u26FD\"],\"\\uE03A\",\"\\uDBB9\\uDFF5\",[\"fuelpump\"],49,13,31,0],\n    \"2702\":[[\"\\u2702\\uFE0F\",\"\\u2702\"],\"\\uE313\",\"\\uDBB9\\uDD3E\",[\"scissors\"],49,14,31,0],\n    \"2705\":[[\"\\u2705\"],\"\",\"\\uDBBA\\uDF4A\",[\"white_check_mark\"],49,15,31,0],\n    \"2708\":[[\"\\u2708\\uFE0F\",\"\\u2708\"],\"\\uE01D\",\"\\uDBB9\\uDFE9\",[\"airplane\"],49,16,31,0],\n    \"2709\":[[\"\\u2709\\uFE0F\",\"\\u2709\"],\"\",\"\\uDBB9\\uDD29\",[\"email\",\"envelope\"],49,17,31,0],\n    \"270a\":[[\"\\u270A\"],\"\\uE010\",\"\\uDBBA\\uDF93\",[\"fist\"],49,18,31,0],\n    \"270b\":[[\"\\u270B\"],\"\\uE012\",\"\\uDBBA\\uDF95\",[\"hand\",\"raised_hand\"],49,24,31,0],\n    \"270c\":[[\"\\u270C\\uFE0F\",\"\\u270C\"],\"\\uE011\",\"\\uDBBA\\uDF94\",[\"v\"],49,30,31,0],\n    \"270d\":[[\"\\u270D\\uFE0F\",\"\\u270D\"],\"\",\"\",[\"writing_hand\"],49,36,15,0],\n    \"270f\":[[\"\\u270F\\uFE0F\",\"\\u270F\"],\"\",\"\\uDBB9\\uDD39\",[\"pencil2\"],49,42,31,0],\n    \"2712\":[[\"\\u2712\\uFE0F\",\"\\u2712\"],\"\",\"\\uDBB9\\uDD36\",[\"black_nib\"],49,43,31,0],\n    \"2714\":[[\"\\u2714\\uFE0F\",\"\\u2714\"],\"\",\"\\uDBBA\\uDF49\",[\"heavy_check_mark\"],49,44,31,0],\n    \"2716\":[[\"\\u2716\\uFE0F\",\"\\u2716\"],\"\",\"\\uDBBA\\uDF53\",[\"heavy_multiplication_x\"],49,45,31,0],\n    \"271d\":[[\"\\u271D\\uFE0F\",\"\\u271D\"],\"\",\"\",[\"latin_cross\"],49,46,15,0],\n    \"2721\":[[\"\\u2721\\uFE0F\",\"\\u2721\"],\"\",\"\",[\"star_of_david\"],49,47,15,0],\n    \"2728\":[[\"\\u2728\"],\"\\uE32E\",\"\\uDBBA\\uDF60\",[\"sparkles\"],49,48,31,0],\n    \"2733\":[[\"\\u2733\\uFE0F\",\"\\u2733\"],\"\\uE206\",\"\\uDBBA\\uDF62\",[\"eight_spoked_asterisk\"],49,49,31,0],\n    \"2734\":[[\"\\u2734\\uFE0F\",\"\\u2734\"],\"\\uE205\",\"\\uDBBA\\uDF61\",[\"eight_pointed_black_star\"],49,50,31,0],\n    \"2744\":[[\"\\u2744\\uFE0F\",\"\\u2744\"],\"\",\"\\uDBB8\\uDC0E\",[\"snowflake\"],49,51,31,0],\n    \"2747\":[[\"\\u2747\\uFE0F\",\"\\u2747\"],\"\",\"\\uDBBA\\uDF77\",[\"sparkle\"],50,0,31,0],\n    \"274c\":[[\"\\u274C\"],\"\\uE333\",\"\\uDBBA\\uDF45\",[\"x\"],50,1,31,0],\n    \"274e\":[[\"\\u274E\"],\"\",\"\\uDBBA\\uDF46\",[\"negative_squared_cross_mark\"],50,2,31,0],\n    \"2753\":[[\"\\u2753\"],\"\\uE020\",\"\\uDBBA\\uDF09\",[\"question\"],50,3,31,0],\n    \"2754\":[[\"\\u2754\"],\"\\uE336\",\"\\uDBBA\\uDF0A\",[\"grey_question\"],50,4,31,0],\n    \"2755\":[[\"\\u2755\"],\"\\uE337\",\"\\uDBBA\\uDF0B\",[\"grey_exclamation\"],50,5,31,0],\n    \"2757\":[[\"\\u2757\"],\"\\uE021\",\"\\uDBBA\\uDF04\",[\"exclamation\",\"heavy_exclamation_mark\"],50,6,31,0],\n    \"2763\":[[\"\\u2763\\uFE0F\",\"\\u2763\"],\"\",\"\",[\"heavy_heart_exclamation_mark_ornament\"],50,7,15,0],\n    \"2764\":[[\"\\u2764\\uFE0F\",\"\\u2764\"],\"\\uE022\",\"\\uDBBA\\uDF0C\",[\"heart\"],50,8,31,0,\"<3\"],\n    \"2795\":[[\"\\u2795\"],\"\",\"\\uDBBA\\uDF51\",[\"heavy_plus_sign\"],50,9,31,0],\n    \"2796\":[[\"\\u2796\"],\"\",\"\\uDBBA\\uDF52\",[\"heavy_minus_sign\"],50,10,31,0],\n    \"2797\":[[\"\\u2797\"],\"\",\"\\uDBBA\\uDF54\",[\"heavy_division_sign\"],50,11,31,0],\n    \"27a1\":[[\"\\u27A1\\uFE0F\",\"\\u27A1\"],\"\\uE234\",\"\\uDBBA\\uDEFA\",[\"arrow_right\"],50,12,31,0],\n    \"27b0\":[[\"\\u27B0\"],\"\",\"\\uDBBA\\uDF08\",[\"curly_loop\"],50,13,31,0],\n    \"27bf\":[[\"\\u27BF\"],\"\\uE211\",\"\\uDBBA\\uDC2B\",[\"loop\"],50,14,31,0],\n    \"2934\":[[\"\\u2934\\uFE0F\",\"\\u2934\"],\"\",\"\\uDBBA\\uDEF4\",[\"arrow_heading_up\"],50,15,31,0],\n    \"2935\":[[\"\\u2935\\uFE0F\",\"\\u2935\"],\"\",\"\\uDBBA\\uDEF5\",[\"arrow_heading_down\"],50,16,31,0],\n    \"2b05\":[[\"\\u2B05\\uFE0F\",\"\\u2B05\"],\"\\uE235\",\"\\uDBBA\\uDEFB\",[\"arrow_left\"],50,17,31,0],\n    \"2b06\":[[\"\\u2B06\\uFE0F\",\"\\u2B06\"],\"\\uE232\",\"\\uDBBA\\uDEF8\",[\"arrow_up\"],50,18,31,0],\n    \"2b07\":[[\"\\u2B07\\uFE0F\",\"\\u2B07\"],\"\\uE233\",\"\\uDBBA\\uDEF9\",[\"arrow_down\"],50,19,31,0],\n    \"2b1b\":[[\"\\u2B1B\"],\"\",\"\\uDBBA\\uDF6C\",[\"black_large_square\"],50,20,31,0],\n    \"2b1c\":[[\"\\u2B1C\"],\"\",\"\\uDBBA\\uDF6B\",[\"white_large_square\"],50,21,31,0],\n    \"2b50\":[[\"\\u2B50\"],\"\\uE32F\",\"\\uDBBA\\uDF68\",[\"star\"],50,22,31,0],\n    \"2b55\":[[\"\\u2B55\"],\"\\uE332\",\"\\uDBBA\\uDF44\",[\"o\"],50,23,31,0],\n    \"3030\":[[\"\\u3030\\uFE0F\",\"\\u3030\"],\"\",\"\\uDBBA\\uDF07\",[\"wavy_dash\"],50,24,31,0],\n    \"303d\":[[\"\\u303D\\uFE0F\",\"\\u303D\"],\"\\uE12C\",\"\\uDBBA\\uDC1B\",[\"part_alternation_mark\"],50,25,31,0],\n    \"3297\":[[\"\\u3297\\uFE0F\",\"\\u3297\"],\"\\uE30D\",\"\\uDBBA\\uDF43\",[\"congratulations\"],50,26,31,0],\n    \"3299\":[[\"\\u3299\\uFE0F\",\"\\u3299\"],\"\\uE315\",\"\\uDBBA\\uDF2B\",[\"secret\"],50,27,31,0]\n  };\n  /** @private */\n  emoji.prototype.emoticons_data = {\n    \":o)\":\"monkey_face\",\n    \"<\\/3\":\"broken_heart\",\n    \"=)\":\"smiley\",\n    \"=-)\":\"smiley\",\n    \"C:\":\"smile\",\n    \"c:\":\"smile\",\n    \":D\":\"smile\",\n    \":-D\":\"smile\",\n    \":>\":\"laughing\",\n    \":->\":\"laughing\",\n    \";)\":\"wink\",\n    \";-)\":\"wink\",\n    \"8)\":\"sunglasses\",\n    \":|\":\"neutral_face\",\n    \":-|\":\"neutral_face\",\n    \":\\\\\":\"confused\",\n    \":-\\\\\":\"confused\",\n    \":\\/\":\"confused\",\n    \":-\\/\":\"confused\",\n    \":*\":\"kissing_heart\",\n    \":-*\":\"kissing_heart\",\n    \":p\":\"stuck_out_tongue\",\n    \":-p\":\"stuck_out_tongue\",\n    \":P\":\"stuck_out_tongue\",\n    \":-P\":\"stuck_out_tongue\",\n    \":b\":\"stuck_out_tongue\",\n    \":-b\":\"stuck_out_tongue\",\n    \";p\":\"stuck_out_tongue_winking_eye\",\n    \";-p\":\"stuck_out_tongue_winking_eye\",\n    \";b\":\"stuck_out_tongue_winking_eye\",\n    \";-b\":\"stuck_out_tongue_winking_eye\",\n    \";P\":\"stuck_out_tongue_winking_eye\",\n    \";-P\":\"stuck_out_tongue_winking_eye\",\n    \"):\":\"disappointed\",\n    \":(\":\"disappointed\",\n    \":-(\":\"disappointed\",\n    \">:(\":\"angry\",\n    \">:-(\":\"angry\",\n    \":'(\":\"cry\",\n    \"D:\":\"anguished\",\n    \":o\":\"open_mouth\",\n    \":-o\":\"open_mouth\",\n    \":O\":\"open_mouth\",\n    \":-O\":\"open_mouth\",\n    \":)\":\"slightly_smiling_face\",\n    \"(:\":\"slightly_smiling_face\",\n    \":-)\":\"slightly_smiling_face\",\n    \"<3\":\"heart\"\n  };\n  /** @private */\n  emoji.prototype.variations_data = {\n    \"1f385\":{\"1f3fb\":[\"1f385-1f3fb\",8,20,31,[\"\\uD83C\\uDF85\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f385-1f3fc\",8,21,31,[\"\\uD83C\\uDF85\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f385-1f3fd\",8,22,31,[\"\\uD83C\\uDF85\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f385-1f3fe\",8,23,31,[\"\\uD83C\\uDF85\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f385-1f3ff\",8,24,31,[\"\\uD83C\\uDF85\\uD83C\\uDFFF\"]]},\n    \"1f3c2\":{\"1f3fb\":[\"1f3c2-1f3fb\",9,29,31,[\"\\uD83C\\uDFC2\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3c2-1f3fc\",9,30,31,[\"\\uD83C\\uDFC2\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3c2-1f3fd\",9,31,31,[\"\\uD83C\\uDFC2\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3c2-1f3fe\",9,32,31,[\"\\uD83C\\uDFC2\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3c2-1f3ff\",9,33,31,[\"\\uD83C\\uDFC2\\uD83C\\uDFFF\"]]},\n    \"1f3c3-200d-2640-fe0f\":{\"1f3fb\":[\"1f3c3-1f3fb-200d-2640-fe0f\",9,35,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f3c3-1f3fc-200d-2640-fe0f\",9,36,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f3c3-1f3fd-200d-2640-fe0f\",9,37,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f3c3-1f3fe-200d-2640-fe0f\",9,38,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f3c3-1f3ff-200d-2640-fe0f\",9,39,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f3c3-200d-2642-fe0f\":{\"1f3fb\":[\"1f3c3-1f3fb-200d-2642-fe0f\",9,41,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3c3-1f3fc-200d-2642-fe0f\",9,42,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3c3-1f3fd-200d-2642-fe0f\",9,43,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3c3-1f3fe-200d-2642-fe0f\",9,44,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3c3-1f3ff-200d-2642-fe0f\",9,45,7,[\"\\uD83C\\uDFC3\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC3\\uD83C\\uDFFF\"]]},\n    \"1f3c4-200d-2640-fe0f\":{\"1f3fb\":[\"1f3c4-1f3fb-200d-2640-fe0f\",10,1,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f3c4-1f3fc-200d-2640-fe0f\",10,2,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f3c4-1f3fd-200d-2640-fe0f\",10,3,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f3c4-1f3fe-200d-2640-fe0f\",10,4,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f3c4-1f3ff-200d-2640-fe0f\",10,5,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f3c4-200d-2642-fe0f\":{\"1f3fb\":[\"1f3c4-1f3fb-200d-2642-fe0f\",10,7,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3c4-1f3fc-200d-2642-fe0f\",10,8,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3c4-1f3fd-200d-2642-fe0f\",10,9,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3c4-1f3fe-200d-2642-fe0f\",10,10,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3c4-1f3ff-200d-2642-fe0f\",10,11,7,[\"\\uD83C\\uDFC4\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFC4\\uD83C\\uDFFF\"]]},\n    \"1f3c7\":{\"1f3fb\":[\"1f3c7-1f3fb\",10,21,31,[\"\\uD83C\\uDFC7\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3c7-1f3fc\",10,22,31,[\"\\uD83C\\uDFC7\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3c7-1f3fd\",10,23,31,[\"\\uD83C\\uDFC7\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3c7-1f3fe\",10,24,31,[\"\\uD83C\\uDFC7\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3c7-1f3ff\",10,25,31,[\"\\uD83C\\uDFC7\\uD83C\\uDFFF\"]]},\n    \"1f3ca-200d-2640-fe0f\":{\"1f3fb\":[\"1f3ca-1f3fb-200d-2640-fe0f\",10,29,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f3ca-1f3fc-200d-2640-fe0f\",10,30,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f3ca-1f3fd-200d-2640-fe0f\",10,31,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f3ca-1f3fe-200d-2640-fe0f\",10,32,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f3ca-1f3ff-200d-2640-fe0f\",10,33,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f3ca-200d-2642-fe0f\":{\"1f3fb\":[\"1f3ca-1f3fb-200d-2642-fe0f\",10,35,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3ca-1f3fc-200d-2642-fe0f\",10,36,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3ca-1f3fd-200d-2642-fe0f\",10,37,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3ca-1f3fe-200d-2642-fe0f\",10,38,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3ca-1f3ff-200d-2642-fe0f\",10,39,7,[\"\\uD83C\\uDFCA\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCA\\uD83C\\uDFFF\"]]},\n    \"1f3cb-fe0f-200d-2640-fe0f\":{\"1f3fb\":[\"1f3cb-1f3fb-200d-2640-fe0f\",10,47,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f3cb-1f3fc-200d-2640-fe0f\",10,48,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f3cb-1f3fd-200d-2640-fe0f\",10,49,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f3cb-1f3fe-200d-2640-fe0f\",10,50,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f3cb-1f3ff-200d-2640-fe0f\",10,51,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f3cb-fe0f-200d-2642-fe0f\":{\"1f3fb\":[\"1f3cb-1f3fb-200d-2642-fe0f\",11,1,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3cb-1f3fc-200d-2642-fe0f\",11,2,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3cb-1f3fd-200d-2642-fe0f\",11,3,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3cb-1f3fe-200d-2642-fe0f\",11,4,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3cb-1f3ff-200d-2642-fe0f\",11,5,7,[\"\\uD83C\\uDFCB\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCB\\uD83C\\uDFFF\"]]},\n    \"1f3cc-fe0f-200d-2640-fe0f\":{\"1f3fb\":[\"1f3cc-1f3fb-200d-2640-fe0f\",11,13,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f3cc-1f3fc-200d-2640-fe0f\",11,14,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f3cc-1f3fd-200d-2640-fe0f\",11,15,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f3cc-1f3fe-200d-2640-fe0f\",11,16,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f3cc-1f3ff-200d-2640-fe0f\",11,17,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f3cc-fe0f-200d-2642-fe0f\":{\"1f3fb\":[\"1f3cc-1f3fb-200d-2642-fe0f\",11,19,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f3cc-1f3fc-200d-2642-fe0f\",11,20,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f3cc-1f3fd-200d-2642-fe0f\",11,21,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f3cc-1f3fe-200d-2642-fe0f\",11,22,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f3cc-1f3ff-200d-2642-fe0f\",11,23,7,[\"\\uD83C\\uDFCC\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83C\\uDFCC\\uD83C\\uDFFF\"]]},\n    \"1f442\":{\"1f3fb\":[\"1f442-1f3fb\",13,46,31,[\"\\uD83D\\uDC42\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f442-1f3fc\",13,47,31,[\"\\uD83D\\uDC42\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f442-1f3fd\",13,48,31,[\"\\uD83D\\uDC42\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f442-1f3fe\",13,49,31,[\"\\uD83D\\uDC42\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f442-1f3ff\",13,50,31,[\"\\uD83D\\uDC42\\uD83C\\uDFFF\"]]},\n    \"1f443\":{\"1f3fb\":[\"1f443-1f3fb\",14,0,31,[\"\\uD83D\\uDC43\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f443-1f3fc\",14,1,31,[\"\\uD83D\\uDC43\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f443-1f3fd\",14,2,31,[\"\\uD83D\\uDC43\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f443-1f3fe\",14,3,31,[\"\\uD83D\\uDC43\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f443-1f3ff\",14,4,31,[\"\\uD83D\\uDC43\\uD83C\\uDFFF\"]]},\n    \"1f446\":{\"1f3fb\":[\"1f446-1f3fb\",14,8,31,[\"\\uD83D\\uDC46\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f446-1f3fc\",14,9,31,[\"\\uD83D\\uDC46\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f446-1f3fd\",14,10,31,[\"\\uD83D\\uDC46\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f446-1f3fe\",14,11,31,[\"\\uD83D\\uDC46\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f446-1f3ff\",14,12,31,[\"\\uD83D\\uDC46\\uD83C\\uDFFF\"]]},\n    \"1f447\":{\"1f3fb\":[\"1f447-1f3fb\",14,14,31,[\"\\uD83D\\uDC47\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f447-1f3fc\",14,15,31,[\"\\uD83D\\uDC47\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f447-1f3fd\",14,16,31,[\"\\uD83D\\uDC47\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f447-1f3fe\",14,17,31,[\"\\uD83D\\uDC47\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f447-1f3ff\",14,18,31,[\"\\uD83D\\uDC47\\uD83C\\uDFFF\"]]},\n    \"1f448\":{\"1f3fb\":[\"1f448-1f3fb\",14,20,31,[\"\\uD83D\\uDC48\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f448-1f3fc\",14,21,31,[\"\\uD83D\\uDC48\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f448-1f3fd\",14,22,31,[\"\\uD83D\\uDC48\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f448-1f3fe\",14,23,31,[\"\\uD83D\\uDC48\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f448-1f3ff\",14,24,31,[\"\\uD83D\\uDC48\\uD83C\\uDFFF\"]]},\n    \"1f449\":{\"1f3fb\":[\"1f449-1f3fb\",14,26,31,[\"\\uD83D\\uDC49\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f449-1f3fc\",14,27,31,[\"\\uD83D\\uDC49\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f449-1f3fd\",14,28,31,[\"\\uD83D\\uDC49\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f449-1f3fe\",14,29,31,[\"\\uD83D\\uDC49\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f449-1f3ff\",14,30,31,[\"\\uD83D\\uDC49\\uD83C\\uDFFF\"]]},\n    \"1f44a\":{\"1f3fb\":[\"1f44a-1f3fb\",14,32,31,[\"\\uD83D\\uDC4A\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44a-1f3fc\",14,33,31,[\"\\uD83D\\uDC4A\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44a-1f3fd\",14,34,31,[\"\\uD83D\\uDC4A\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44a-1f3fe\",14,35,31,[\"\\uD83D\\uDC4A\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44a-1f3ff\",14,36,31,[\"\\uD83D\\uDC4A\\uD83C\\uDFFF\"]]},\n    \"1f44b\":{\"1f3fb\":[\"1f44b-1f3fb\",14,38,31,[\"\\uD83D\\uDC4B\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44b-1f3fc\",14,39,31,[\"\\uD83D\\uDC4B\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44b-1f3fd\",14,40,31,[\"\\uD83D\\uDC4B\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44b-1f3fe\",14,41,31,[\"\\uD83D\\uDC4B\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44b-1f3ff\",14,42,31,[\"\\uD83D\\uDC4B\\uD83C\\uDFFF\"]]},\n    \"1f44c\":{\"1f3fb\":[\"1f44c-1f3fb\",14,44,31,[\"\\uD83D\\uDC4C\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44c-1f3fc\",14,45,31,[\"\\uD83D\\uDC4C\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44c-1f3fd\",14,46,31,[\"\\uD83D\\uDC4C\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44c-1f3fe\",14,47,31,[\"\\uD83D\\uDC4C\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44c-1f3ff\",14,48,31,[\"\\uD83D\\uDC4C\\uD83C\\uDFFF\"]]},\n    \"1f44d\":{\"1f3fb\":[\"1f44d-1f3fb\",14,50,31,[\"\\uD83D\\uDC4D\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44d-1f3fc\",14,51,31,[\"\\uD83D\\uDC4D\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44d-1f3fd\",15,0,31,[\"\\uD83D\\uDC4D\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44d-1f3fe\",15,1,31,[\"\\uD83D\\uDC4D\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44d-1f3ff\",15,2,31,[\"\\uD83D\\uDC4D\\uD83C\\uDFFF\"]]},\n    \"1f44e\":{\"1f3fb\":[\"1f44e-1f3fb\",15,4,31,[\"\\uD83D\\uDC4E\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44e-1f3fc\",15,5,31,[\"\\uD83D\\uDC4E\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44e-1f3fd\",15,6,31,[\"\\uD83D\\uDC4E\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44e-1f3fe\",15,7,31,[\"\\uD83D\\uDC4E\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44e-1f3ff\",15,8,31,[\"\\uD83D\\uDC4E\\uD83C\\uDFFF\"]]},\n    \"1f44f\":{\"1f3fb\":[\"1f44f-1f3fb\",15,10,31,[\"\\uD83D\\uDC4F\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f44f-1f3fc\",15,11,31,[\"\\uD83D\\uDC4F\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f44f-1f3fd\",15,12,31,[\"\\uD83D\\uDC4F\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f44f-1f3fe\",15,13,31,[\"\\uD83D\\uDC4F\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f44f-1f3ff\",15,14,31,[\"\\uD83D\\uDC4F\\uD83C\\uDFFF\"]]},\n    \"1f450\":{\"1f3fb\":[\"1f450-1f3fb\",15,16,31,[\"\\uD83D\\uDC50\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f450-1f3fc\",15,17,31,[\"\\uD83D\\uDC50\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f450-1f3fd\",15,18,31,[\"\\uD83D\\uDC50\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f450-1f3fe\",15,19,31,[\"\\uD83D\\uDC50\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f450-1f3ff\",15,20,31,[\"\\uD83D\\uDC50\\uD83C\\uDFFF\"]]},\n    \"1f466\":{\"1f3fb\":[\"1f466-1f3fb\",15,43,31,[\"\\uD83D\\uDC66\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f466-1f3fc\",15,44,31,[\"\\uD83D\\uDC66\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f466-1f3fd\",15,45,31,[\"\\uD83D\\uDC66\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f466-1f3fe\",15,46,31,[\"\\uD83D\\uDC66\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f466-1f3ff\",15,47,31,[\"\\uD83D\\uDC66\\uD83C\\uDFFF\"]]},\n    \"1f467\":{\"1f3fb\":[\"1f467-1f3fb\",15,49,31,[\"\\uD83D\\uDC67\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f467-1f3fc\",15,50,31,[\"\\uD83D\\uDC67\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f467-1f3fd\",15,51,31,[\"\\uD83D\\uDC67\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f467-1f3fe\",16,0,31,[\"\\uD83D\\uDC67\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f467-1f3ff\",16,1,31,[\"\\uD83D\\uDC67\\uD83C\\uDFFF\"]]},\n    \"1f468-200d-1f33e\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f33e\",16,3,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDF3E\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f33e\",16,4,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDF3E\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f33e\",16,5,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDF3E\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f33e\",16,6,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDF3E\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f33e\",16,7,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDF3E\"]]},\n    \"1f468-200d-1f373\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f373\",16,9,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDF73\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f373\",16,10,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDF73\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f373\",16,11,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDF73\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f373\",16,12,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDF73\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f373\",16,13,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDF73\"]]},\n    \"1f468-200d-1f393\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f393\",16,15,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f393\",16,16,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDF93\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f393\",16,17,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDF93\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f393\",16,18,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDF93\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f393\",16,19,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDF93\"]]},\n    \"1f468-200d-1f3a4\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f3a4\",16,21,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDFA4\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f3a4\",16,22,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDFA4\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f3a4\",16,23,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDFA4\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f3a4\",16,24,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDFA4\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f3a4\",16,25,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDFA4\"]]},\n    \"1f468-200d-1f3a8\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f3a8\",16,27,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDFA8\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f3a8\",16,28,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDFA8\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f3a8\",16,29,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDFA8\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f3a8\",16,30,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDFA8\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f3a8\",16,31,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDFA8\"]]},\n    \"1f468-200d-1f3eb\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f3eb\",16,33,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDFEB\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f3eb\",16,34,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDFEB\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f3eb\",16,35,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDFEB\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f3eb\",16,36,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDFEB\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f3eb\",16,37,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDFEB\"]]},\n    \"1f468-200d-1f3ed\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f3ed\",16,39,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83C\\uDFED\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f3ed\",16,40,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83C\\uDFED\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f3ed\",16,41,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83C\\uDFED\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f3ed\",16,42,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83C\\uDFED\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f3ed\",16,43,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83C\\uDFED\"]]},\n    \"1f468-200d-1f4bb\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f4bb\",17,8,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDCBB\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f4bb\",17,9,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDCBB\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f4bb\",17,10,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDCBB\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f4bb\",17,11,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDCBB\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f4bb\",17,12,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDCBB\"]]},\n    \"1f468-200d-1f4bc\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f4bc\",17,14,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDCBC\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f4bc\",17,15,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDCBC\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f4bc\",17,16,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDCBC\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f4bc\",17,17,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDCBC\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f4bc\",17,18,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDCBC\"]]},\n    \"1f468-200d-1f527\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f527\",17,20,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDD27\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f527\",17,21,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDD27\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f527\",17,22,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDD27\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f527\",17,23,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDD27\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f527\",17,24,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDD27\"]]},\n    \"1f468-200d-1f52c\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f52c\",17,26,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDD2C\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f52c\",17,27,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDD2C\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f52c\",17,28,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDD2C\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f52c\",17,29,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDD2C\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f52c\",17,30,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDD2C\"]]},\n    \"1f468-200d-1f680\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f680\",17,32,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDE80\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f680\",17,33,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDE80\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f680\",17,34,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDE80\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f680\",17,35,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDE80\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f680\",17,36,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDE80\"]]},\n    \"1f468-200d-1f692\":{\"1f3fb\":[\"1f468-1f3fb-200d-1f692\",17,38,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\uD83D\\uDE92\"]],\"1f3fc\":[\"1f468-1f3fc-200d-1f692\",17,39,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\uD83D\\uDE92\"]],\"1f3fd\":[\"1f468-1f3fd-200d-1f692\",17,40,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\uD83D\\uDE92\"]],\"1f3fe\":[\"1f468-1f3fe-200d-1f692\",17,41,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\uD83D\\uDE92\"]],\"1f3ff\":[\"1f468-1f3ff-200d-1f692\",17,42,15,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\uD83D\\uDE92\"]]},\n    \"1f468-200d-2695-fe0f\":{\"1f3fb\":[\"1f468-1f3fb-200d-2695-fe0f\",17,44,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\u2695\\uFE0F\"]],\"1f3fc\":[\"1f468-1f3fc-200d-2695-fe0f\",17,45,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\u2695\\uFE0F\"]],\"1f3fd\":[\"1f468-1f3fd-200d-2695-fe0f\",17,46,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\u2695\\uFE0F\"]],\"1f3fe\":[\"1f468-1f3fe-200d-2695-fe0f\",17,47,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\u2695\\uFE0F\"]],\"1f3ff\":[\"1f468-1f3ff-200d-2695-fe0f\",17,48,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\u2695\\uFE0F\"]]},\n    \"1f468-200d-2696-fe0f\":{\"1f3fb\":[\"1f468-1f3fb-200d-2696-fe0f\",17,50,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\u2696\\uFE0F\"]],\"1f3fc\":[\"1f468-1f3fc-200d-2696-fe0f\",17,51,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\u2696\\uFE0F\"]],\"1f3fd\":[\"1f468-1f3fd-200d-2696-fe0f\",18,0,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\u2696\\uFE0F\"]],\"1f3fe\":[\"1f468-1f3fe-200d-2696-fe0f\",18,1,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\u2696\\uFE0F\"]],\"1f3ff\":[\"1f468-1f3ff-200d-2696-fe0f\",18,2,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\u2696\\uFE0F\"]]},\n    \"1f468-200d-2708-fe0f\":{\"1f3fb\":[\"1f468-1f3fb-200d-2708-fe0f\",18,4,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\\u200D\\u2708\\uFE0F\"]],\"1f3fc\":[\"1f468-1f3fc-200d-2708-fe0f\",18,5,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\\u200D\\u2708\\uFE0F\"]],\"1f3fd\":[\"1f468-1f3fd-200d-2708-fe0f\",18,6,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\\u200D\\u2708\\uFE0F\"]],\"1f3fe\":[\"1f468-1f3fe-200d-2708-fe0f\",18,7,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\\u200D\\u2708\\uFE0F\"]],\"1f3ff\":[\"1f468-1f3ff-200d-2708-fe0f\",18,8,7,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\\u200D\\u2708\\uFE0F\"]]},\n    \"1f468\":{\"1f3fb\":[\"1f468-1f3fb\",18,12,31,[\"\\uD83D\\uDC68\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f468-1f3fc\",18,13,31,[\"\\uD83D\\uDC68\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f468-1f3fd\",18,14,31,[\"\\uD83D\\uDC68\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f468-1f3fe\",18,15,31,[\"\\uD83D\\uDC68\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f468-1f3ff\",18,16,31,[\"\\uD83D\\uDC68\\uD83C\\uDFFF\"]]},\n    \"1f469-200d-1f33e\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f33e\",18,18,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF3E\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f33e\",18,19,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDF3E\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f33e\",18,20,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDF3E\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f33e\",18,21,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDF3E\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f33e\",18,22,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDF3E\"]]},\n    \"1f469-200d-1f373\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f373\",18,24,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF73\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f373\",18,25,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDF73\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f373\",18,26,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDF73\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f373\",18,27,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDF73\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f373\",18,28,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDF73\"]]},\n    \"1f469-200d-1f393\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f393\",18,30,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f393\",18,31,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDF93\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f393\",18,32,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDF93\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f393\",18,33,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDF93\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f393\",18,34,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDF93\"]]},\n    \"1f469-200d-1f3a4\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f3a4\",18,36,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDFA4\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f3a4\",18,37,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDFA4\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f3a4\",18,38,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDFA4\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f3a4\",18,39,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDFA4\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f3a4\",18,40,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDFA4\"]]},\n    \"1f469-200d-1f3a8\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f3a8\",18,42,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDFA8\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f3a8\",18,43,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDFA8\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f3a8\",18,44,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDFA8\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f3a8\",18,45,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDFA8\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f3a8\",18,46,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDFA8\"]]},\n    \"1f469-200d-1f3eb\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f3eb\",18,48,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDFEB\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f3eb\",18,49,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDFEB\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f3eb\",18,50,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDFEB\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f3eb\",18,51,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDFEB\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f3eb\",19,0,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDFEB\"]]},\n    \"1f469-200d-1f3ed\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f3ed\",19,2,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDFED\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f3ed\",19,3,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83C\\uDFED\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f3ed\",19,4,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83C\\uDFED\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f3ed\",19,5,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83C\\uDFED\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f3ed\",19,6,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83C\\uDFED\"]]},\n    \"1f469-200d-1f4bb\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f4bb\",19,18,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDCBB\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f4bb\",19,19,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDCBB\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f4bb\",19,20,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDCBB\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f4bb\",19,21,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDCBB\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f4bb\",19,22,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDCBB\"]]},\n    \"1f469-200d-1f4bc\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f4bc\",19,24,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDCBC\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f4bc\",19,25,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDCBC\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f4bc\",19,26,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDCBC\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f4bc\",19,27,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDCBC\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f4bc\",19,28,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDCBC\"]]},\n    \"1f469-200d-1f527\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f527\",19,30,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDD27\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f527\",19,31,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDD27\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f527\",19,32,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDD27\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f527\",19,33,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDD27\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f527\",19,34,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDD27\"]]},\n    \"1f469-200d-1f52c\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f52c\",19,36,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDD2C\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f52c\",19,37,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDD2C\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f52c\",19,38,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDD2C\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f52c\",19,39,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDD2C\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f52c\",19,40,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDD2C\"]]},\n    \"1f469-200d-1f680\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f680\",19,42,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDE80\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f680\",19,43,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDE80\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f680\",19,44,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDE80\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f680\",19,45,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDE80\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f680\",19,46,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDE80\"]]},\n    \"1f469-200d-1f692\":{\"1f3fb\":[\"1f469-1f3fb-200d-1f692\",19,48,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83D\\uDE92\"]],\"1f3fc\":[\"1f469-1f3fc-200d-1f692\",19,49,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83D\\uDE92\"]],\"1f3fd\":[\"1f469-1f3fd-200d-1f692\",19,50,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83D\\uDE92\"]],\"1f3fe\":[\"1f469-1f3fe-200d-1f692\",19,51,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83D\\uDE92\"]],\"1f3ff\":[\"1f469-1f3ff-200d-1f692\",20,0,15,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83D\\uDE92\"]]},\n    \"1f469-200d-2695-fe0f\":{\"1f3fb\":[\"1f469-1f3fb-200d-2695-fe0f\",20,2,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\u2695\\uFE0F\"]],\"1f3fc\":[\"1f469-1f3fc-200d-2695-fe0f\",20,3,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\u2695\\uFE0F\"]],\"1f3fd\":[\"1f469-1f3fd-200d-2695-fe0f\",20,4,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\u2695\\uFE0F\"]],\"1f3fe\":[\"1f469-1f3fe-200d-2695-fe0f\",20,5,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\u2695\\uFE0F\"]],\"1f3ff\":[\"1f469-1f3ff-200d-2695-fe0f\",20,6,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\u2695\\uFE0F\"]]},\n    \"1f469-200d-2696-fe0f\":{\"1f3fb\":[\"1f469-1f3fb-200d-2696-fe0f\",20,8,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\u2696\\uFE0F\"]],\"1f3fc\":[\"1f469-1f3fc-200d-2696-fe0f\",20,9,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\u2696\\uFE0F\"]],\"1f3fd\":[\"1f469-1f3fd-200d-2696-fe0f\",20,10,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\u2696\\uFE0F\"]],\"1f3fe\":[\"1f469-1f3fe-200d-2696-fe0f\",20,11,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\u2696\\uFE0F\"]],\"1f3ff\":[\"1f469-1f3ff-200d-2696-fe0f\",20,12,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\u2696\\uFE0F\"]]},\n    \"1f469-200d-2708-fe0f\":{\"1f3fb\":[\"1f469-1f3fb-200d-2708-fe0f\",20,14,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\u2708\\uFE0F\"]],\"1f3fc\":[\"1f469-1f3fc-200d-2708-fe0f\",20,15,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\u2708\\uFE0F\"]],\"1f3fd\":[\"1f469-1f3fd-200d-2708-fe0f\",20,16,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\u2708\\uFE0F\"]],\"1f3fe\":[\"1f469-1f3fe-200d-2708-fe0f\",20,17,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\u2708\\uFE0F\"]],\"1f3ff\":[\"1f469-1f3ff-200d-2708-fe0f\",20,18,7,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\u2708\\uFE0F\"]]},\n    \"1f469\":{\"1f3fb\":[\"1f469-1f3fb\",20,24,31,[\"\\uD83D\\uDC69\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f469-1f3fc\",20,25,31,[\"\\uD83D\\uDC69\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f469-1f3fd\",20,26,31,[\"\\uD83D\\uDC69\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f469-1f3fe\",20,27,31,[\"\\uD83D\\uDC69\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f469-1f3ff\",20,28,31,[\"\\uD83D\\uDC69\\uD83C\\uDFFF\"]]},\n    \"1f46e-200d-2640-fe0f\":{\"1f3fb\":[\"1f46e-1f3fb-200d-2640-fe0f\",20,34,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f46e-1f3fc-200d-2640-fe0f\",20,35,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f46e-1f3fd-200d-2640-fe0f\",20,36,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f46e-1f3fe-200d-2640-fe0f\",20,37,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f46e-1f3ff-200d-2640-fe0f\",20,38,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f46e-200d-2642-fe0f\":{\"1f3fb\":[\"1f46e-1f3fb-200d-2642-fe0f\",20,40,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f46e-1f3fc-200d-2642-fe0f\",20,41,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f46e-1f3fd-200d-2642-fe0f\",20,42,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f46e-1f3fe-200d-2642-fe0f\",20,43,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f46e-1f3ff-200d-2642-fe0f\",20,44,7,[\"\\uD83D\\uDC6E\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC6E\\uD83C\\uDFFF\"]]},\n    \"1f470\":{\"1f3fb\":[\"1f470-1f3fb\",21,3,31,[\"\\uD83D\\uDC70\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f470-1f3fc\",21,4,31,[\"\\uD83D\\uDC70\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f470-1f3fd\",21,5,31,[\"\\uD83D\\uDC70\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f470-1f3fe\",21,6,31,[\"\\uD83D\\uDC70\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f470-1f3ff\",21,7,31,[\"\\uD83D\\uDC70\\uD83C\\uDFFF\"]]},\n    \"1f471-200d-2640-fe0f\":{\"1f3fb\":[\"1f471-1f3fb-200d-2640-fe0f\",21,9,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f471-1f3fc-200d-2640-fe0f\",21,10,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f471-1f3fd-200d-2640-fe0f\",21,11,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f471-1f3fe-200d-2640-fe0f\",21,12,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f471-1f3ff-200d-2640-fe0f\",21,13,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f471-200d-2642-fe0f\":{\"1f3fb\":[\"1f471-1f3fb-200d-2642-fe0f\",21,15,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f471-1f3fc-200d-2642-fe0f\",21,16,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f471-1f3fd-200d-2642-fe0f\",21,17,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f471-1f3fe-200d-2642-fe0f\",21,18,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f471-1f3ff-200d-2642-fe0f\",21,19,7,[\"\\uD83D\\uDC71\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC71\\uD83C\\uDFFF\"]]},\n    \"1f472\":{\"1f3fb\":[\"1f472-1f3fb\",21,27,31,[\"\\uD83D\\uDC72\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f472-1f3fc\",21,28,31,[\"\\uD83D\\uDC72\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f472-1f3fd\",21,29,31,[\"\\uD83D\\uDC72\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f472-1f3fe\",21,30,31,[\"\\uD83D\\uDC72\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f472-1f3ff\",21,31,31,[\"\\uD83D\\uDC72\\uD83C\\uDFFF\"]]},\n    \"1f473-200d-2640-fe0f\":{\"1f3fb\":[\"1f473-1f3fb-200d-2640-fe0f\",21,33,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f473-1f3fc-200d-2640-fe0f\",21,34,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f473-1f3fd-200d-2640-fe0f\",21,35,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f473-1f3fe-200d-2640-fe0f\",21,36,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f473-1f3ff-200d-2640-fe0f\",21,37,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f473-200d-2642-fe0f\":{\"1f3fb\":[\"1f473-1f3fb-200d-2642-fe0f\",21,39,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f473-1f3fc-200d-2642-fe0f\",21,40,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f473-1f3fd-200d-2642-fe0f\",21,41,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f473-1f3fe-200d-2642-fe0f\",21,42,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f473-1f3ff-200d-2642-fe0f\",21,43,7,[\"\\uD83D\\uDC73\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC73\\uD83C\\uDFFF\"]]},\n    \"1f474\":{\"1f3fb\":[\"1f474-1f3fb\",21,51,31,[\"\\uD83D\\uDC74\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f474-1f3fc\",22,0,31,[\"\\uD83D\\uDC74\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f474-1f3fd\",22,1,31,[\"\\uD83D\\uDC74\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f474-1f3fe\",22,2,31,[\"\\uD83D\\uDC74\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f474-1f3ff\",22,3,31,[\"\\uD83D\\uDC74\\uD83C\\uDFFF\"]]},\n    \"1f475\":{\"1f3fb\":[\"1f475-1f3fb\",22,5,31,[\"\\uD83D\\uDC75\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f475-1f3fc\",22,6,31,[\"\\uD83D\\uDC75\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f475-1f3fd\",22,7,31,[\"\\uD83D\\uDC75\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f475-1f3fe\",22,8,31,[\"\\uD83D\\uDC75\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f475-1f3ff\",22,9,31,[\"\\uD83D\\uDC75\\uD83C\\uDFFF\"]]},\n    \"1f476\":{\"1f3fb\":[\"1f476-1f3fb\",22,11,31,[\"\\uD83D\\uDC76\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f476-1f3fc\",22,12,31,[\"\\uD83D\\uDC76\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f476-1f3fd\",22,13,31,[\"\\uD83D\\uDC76\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f476-1f3fe\",22,14,31,[\"\\uD83D\\uDC76\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f476-1f3ff\",22,15,31,[\"\\uD83D\\uDC76\\uD83C\\uDFFF\"]]},\n    \"1f477-200d-2640-fe0f\":{\"1f3fb\":[\"1f477-1f3fb-200d-2640-fe0f\",22,17,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f477-1f3fc-200d-2640-fe0f\",22,18,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f477-1f3fd-200d-2640-fe0f\",22,19,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f477-1f3fe-200d-2640-fe0f\",22,20,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f477-1f3ff-200d-2640-fe0f\",22,21,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f477-200d-2642-fe0f\":{\"1f3fb\":[\"1f477-1f3fb-200d-2642-fe0f\",22,23,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f477-1f3fc-200d-2642-fe0f\",22,24,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f477-1f3fd-200d-2642-fe0f\",22,25,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f477-1f3fe-200d-2642-fe0f\",22,26,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f477-1f3ff-200d-2642-fe0f\",22,27,7,[\"\\uD83D\\uDC77\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC77\\uD83C\\uDFFF\"]]},\n    \"1f478\":{\"1f3fb\":[\"1f478-1f3fb\",22,35,31,[\"\\uD83D\\uDC78\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f478-1f3fc\",22,36,31,[\"\\uD83D\\uDC78\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f478-1f3fd\",22,37,31,[\"\\uD83D\\uDC78\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f478-1f3fe\",22,38,31,[\"\\uD83D\\uDC78\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f478-1f3ff\",22,39,31,[\"\\uD83D\\uDC78\\uD83C\\uDFFF\"]]},\n    \"1f47c\":{\"1f3fb\":[\"1f47c-1f3fb\",22,44,31,[\"\\uD83D\\uDC7C\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f47c-1f3fc\",22,45,31,[\"\\uD83D\\uDC7C\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f47c-1f3fd\",22,46,31,[\"\\uD83D\\uDC7C\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f47c-1f3fe\",22,47,31,[\"\\uD83D\\uDC7C\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f47c-1f3ff\",22,48,31,[\"\\uD83D\\uDC7C\\uD83C\\uDFFF\"]]},\n    \"1f481-200d-2640-fe0f\":{\"1f3fb\":[\"1f481-1f3fb-200d-2640-fe0f\",23,2,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f481-1f3fc-200d-2640-fe0f\",23,3,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f481-1f3fd-200d-2640-fe0f\",23,4,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f481-1f3fe-200d-2640-fe0f\",23,5,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f481-1f3ff-200d-2640-fe0f\",23,6,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC81\\uD83C\\uDFFF\"]]},\n    \"1f481-200d-2642-fe0f\":{\"1f3fb\":[\"1f481-1f3fb-200d-2642-fe0f\",23,8,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f481-1f3fc-200d-2642-fe0f\",23,9,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f481-1f3fd-200d-2642-fe0f\",23,10,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f481-1f3fe-200d-2642-fe0f\",23,11,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f481-1f3ff-200d-2642-fe0f\",23,12,7,[\"\\uD83D\\uDC81\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f482-200d-2640-fe0f\":{\"1f3fb\":[\"1f482-1f3fb-200d-2640-fe0f\",23,20,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f482-1f3fc-200d-2640-fe0f\",23,21,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f482-1f3fd-200d-2640-fe0f\",23,22,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f482-1f3fe-200d-2640-fe0f\",23,23,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f482-1f3ff-200d-2640-fe0f\",23,24,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f482-200d-2642-fe0f\":{\"1f3fb\":[\"1f482-1f3fb-200d-2642-fe0f\",23,26,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f482-1f3fc-200d-2642-fe0f\",23,27,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f482-1f3fd-200d-2642-fe0f\",23,28,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f482-1f3fe-200d-2642-fe0f\",23,29,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f482-1f3ff-200d-2642-fe0f\",23,30,7,[\"\\uD83D\\uDC82\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDC82\\uD83C\\uDFFF\"]]},\n    \"1f483\":{\"1f3fb\":[\"1f483-1f3fb\",23,38,31,[\"\\uD83D\\uDC83\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f483-1f3fc\",23,39,31,[\"\\uD83D\\uDC83\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f483-1f3fd\",23,40,31,[\"\\uD83D\\uDC83\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f483-1f3fe\",23,41,31,[\"\\uD83D\\uDC83\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f483-1f3ff\",23,42,31,[\"\\uD83D\\uDC83\\uD83C\\uDFFF\"]]},\n    \"1f485\":{\"1f3fb\":[\"1f485-1f3fb\",23,45,31,[\"\\uD83D\\uDC85\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f485-1f3fc\",23,46,31,[\"\\uD83D\\uDC85\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f485-1f3fd\",23,47,31,[\"\\uD83D\\uDC85\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f485-1f3fe\",23,48,31,[\"\\uD83D\\uDC85\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f485-1f3ff\",23,49,31,[\"\\uD83D\\uDC85\\uD83C\\uDFFF\"]]},\n    \"1f486-200d-2640-fe0f\":{\"1f3fb\":[\"1f486-1f3fb-200d-2640-fe0f\",23,51,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f486-1f3fc-200d-2640-fe0f\",24,0,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f486-1f3fd-200d-2640-fe0f\",24,1,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f486-1f3fe-200d-2640-fe0f\",24,2,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f486-1f3ff-200d-2640-fe0f\",24,3,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC86\\uD83C\\uDFFF\"]]},\n    \"1f486-200d-2642-fe0f\":{\"1f3fb\":[\"1f486-1f3fb-200d-2642-fe0f\",24,5,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f486-1f3fc-200d-2642-fe0f\",24,6,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f486-1f3fd-200d-2642-fe0f\",24,7,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f486-1f3fe-200d-2642-fe0f\",24,8,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f486-1f3ff-200d-2642-fe0f\",24,9,7,[\"\\uD83D\\uDC86\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f487-200d-2640-fe0f\":{\"1f3fb\":[\"1f487-1f3fb-200d-2640-fe0f\",24,17,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f487-1f3fc-200d-2640-fe0f\",24,18,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f487-1f3fd-200d-2640-fe0f\",24,19,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f487-1f3fe-200d-2640-fe0f\",24,20,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f487-1f3ff-200d-2640-fe0f\",24,21,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDC87\\uD83C\\uDFFF\"]]},\n    \"1f487-200d-2642-fe0f\":{\"1f3fb\":[\"1f487-1f3fb-200d-2642-fe0f\",24,23,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f487-1f3fc-200d-2642-fe0f\",24,24,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f487-1f3fd-200d-2642-fe0f\",24,25,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f487-1f3fe-200d-2642-fe0f\",24,26,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f487-1f3ff-200d-2642-fe0f\",24,27,7,[\"\\uD83D\\uDC87\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f4aa\":{\"1f3fb\":[\"1f4aa-1f3fb\",25,17,31,[\"\\uD83D\\uDCAA\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f4aa-1f3fc\",25,18,31,[\"\\uD83D\\uDCAA\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f4aa-1f3fd\",25,19,31,[\"\\uD83D\\uDCAA\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f4aa-1f3fe\",25,20,31,[\"\\uD83D\\uDCAA\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f4aa-1f3ff\",25,21,31,[\"\\uD83D\\uDCAA\\uD83C\\uDFFF\"]]},\n    \"1f574\":{\"1f3fb\":[\"1f574-1f3fb\",28,46,15,[\"\\uD83D\\uDD74\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f574-1f3fc\",28,47,15,[\"\\uD83D\\uDD74\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f574-1f3fd\",28,48,15,[\"\\uD83D\\uDD74\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f574-1f3fe\",28,49,15,[\"\\uD83D\\uDD74\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f574-1f3ff\",28,50,15,[\"\\uD83D\\uDD74\\uD83C\\uDFFF\"]]},\n    \"1f575-fe0f-200d-2640-fe0f\":{\"1f3fb\":[\"1f575-1f3fb-200d-2640-fe0f\",29,0,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f575-1f3fc-200d-2640-fe0f\",29,1,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f575-1f3fd-200d-2640-fe0f\",29,2,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f575-1f3fe-200d-2640-fe0f\",29,3,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f575-1f3ff-200d-2640-fe0f\",29,4,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f575-fe0f-200d-2642-fe0f\":{\"1f3fb\":[\"1f575-1f3fb-200d-2642-fe0f\",29,6,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f575-1f3fc-200d-2642-fe0f\",29,7,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f575-1f3fd-200d-2642-fe0f\",29,8,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f575-1f3fe-200d-2642-fe0f\",29,9,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f575-1f3ff-200d-2642-fe0f\",29,10,7,[\"\\uD83D\\uDD75\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDD75\\uD83C\\uDFFF\"]]},\n    \"1f57a\":{\"1f3fb\":[\"1f57a-1f3fb\",29,22,15,[\"\\uD83D\\uDD7A\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f57a-1f3fc\",29,23,15,[\"\\uD83D\\uDD7A\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f57a-1f3fd\",29,24,15,[\"\\uD83D\\uDD7A\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f57a-1f3fe\",29,25,15,[\"\\uD83D\\uDD7A\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f57a-1f3ff\",29,26,15,[\"\\uD83D\\uDD7A\\uD83C\\uDFFF\"]]},\n    \"1f590\":{\"1f3fb\":[\"1f590-1f3fb\",29,33,15,[\"\\uD83D\\uDD90\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f590-1f3fc\",29,34,15,[\"\\uD83D\\uDD90\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f590-1f3fd\",29,35,15,[\"\\uD83D\\uDD90\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f590-1f3fe\",29,36,15,[\"\\uD83D\\uDD90\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f590-1f3ff\",29,37,15,[\"\\uD83D\\uDD90\\uD83C\\uDFFF\"]]},\n    \"1f595\":{\"1f3fb\":[\"1f595-1f3fb\",29,39,15,[\"\\uD83D\\uDD95\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f595-1f3fc\",29,40,15,[\"\\uD83D\\uDD95\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f595-1f3fd\",29,41,15,[\"\\uD83D\\uDD95\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f595-1f3fe\",29,42,15,[\"\\uD83D\\uDD95\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f595-1f3ff\",29,43,15,[\"\\uD83D\\uDD95\\uD83C\\uDFFF\"]]},\n    \"1f596\":{\"1f3fb\":[\"1f596-1f3fb\",29,45,15,[\"\\uD83D\\uDD96\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f596-1f3fc\",29,46,15,[\"\\uD83D\\uDD96\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f596-1f3fd\",29,47,15,[\"\\uD83D\\uDD96\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f596-1f3fe\",29,48,15,[\"\\uD83D\\uDD96\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f596-1f3ff\",29,49,15,[\"\\uD83D\\uDD96\\uD83C\\uDFFF\"]]},\n    \"1f645-200d-2640-fe0f\":{\"1f3fb\":[\"1f645-1f3fb-200d-2640-fe0f\",31,42,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f645-1f3fc-200d-2640-fe0f\",31,43,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f645-1f3fd-200d-2640-fe0f\",31,44,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f645-1f3fe-200d-2640-fe0f\",31,45,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f645-1f3ff-200d-2640-fe0f\",31,46,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE45\\uD83C\\uDFFF\"]]},\n    \"1f645-200d-2642-fe0f\":{\"1f3fb\":[\"1f645-1f3fb-200d-2642-fe0f\",31,48,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f645-1f3fc-200d-2642-fe0f\",31,49,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f645-1f3fd-200d-2642-fe0f\",31,50,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f645-1f3fe-200d-2642-fe0f\",31,51,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f645-1f3ff-200d-2642-fe0f\",32,0,7,[\"\\uD83D\\uDE45\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f646-200d-2640-fe0f\":{\"1f3fb\":[\"1f646-1f3fb-200d-2640-fe0f\",32,8,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f646-1f3fc-200d-2640-fe0f\",32,9,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f646-1f3fd-200d-2640-fe0f\",32,10,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f646-1f3fe-200d-2640-fe0f\",32,11,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f646-1f3ff-200d-2640-fe0f\",32,12,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE46\\uD83C\\uDFFF\"]]},\n    \"1f646-200d-2642-fe0f\":{\"1f3fb\":[\"1f646-1f3fb-200d-2642-fe0f\",32,14,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f646-1f3fc-200d-2642-fe0f\",32,15,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f646-1f3fd-200d-2642-fe0f\",32,16,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f646-1f3fe-200d-2642-fe0f\",32,17,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f646-1f3ff-200d-2642-fe0f\",32,18,7,[\"\\uD83D\\uDE46\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f647-200d-2640-fe0f\":{\"1f3fb\":[\"1f647-1f3fb-200d-2640-fe0f\",32,26,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f647-1f3fc-200d-2640-fe0f\",32,27,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f647-1f3fd-200d-2640-fe0f\",32,28,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f647-1f3fe-200d-2640-fe0f\",32,29,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f647-1f3ff-200d-2640-fe0f\",32,30,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f647-200d-2642-fe0f\":{\"1f3fb\":[\"1f647-1f3fb-200d-2642-fe0f\",32,32,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f647-1f3fc-200d-2642-fe0f\",32,33,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f647-1f3fd-200d-2642-fe0f\",32,34,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f647-1f3fe-200d-2642-fe0f\",32,35,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f647-1f3ff-200d-2642-fe0f\",32,36,7,[\"\\uD83D\\uDE47\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDE47\\uD83C\\uDFFF\"]]},\n    \"1f64b-200d-2640-fe0f\":{\"1f3fb\":[\"1f64b-1f3fb-200d-2640-fe0f\",32,47,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f64b-1f3fc-200d-2640-fe0f\",32,48,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f64b-1f3fd-200d-2640-fe0f\",32,49,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f64b-1f3fe-200d-2640-fe0f\",32,50,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f64b-1f3ff-200d-2640-fe0f\",32,51,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4B\\uD83C\\uDFFF\"]]},\n    \"1f64b-200d-2642-fe0f\":{\"1f3fb\":[\"1f64b-1f3fb-200d-2642-fe0f\",33,1,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f64b-1f3fc-200d-2642-fe0f\",33,2,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f64b-1f3fd-200d-2642-fe0f\",33,3,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f64b-1f3fe-200d-2642-fe0f\",33,4,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f64b-1f3ff-200d-2642-fe0f\",33,5,7,[\"\\uD83D\\uDE4B\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f64c\":{\"1f3fb\":[\"1f64c-1f3fb\",33,13,31,[\"\\uD83D\\uDE4C\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f64c-1f3fc\",33,14,31,[\"\\uD83D\\uDE4C\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f64c-1f3fd\",33,15,31,[\"\\uD83D\\uDE4C\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f64c-1f3fe\",33,16,31,[\"\\uD83D\\uDE4C\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f64c-1f3ff\",33,17,31,[\"\\uD83D\\uDE4C\\uD83C\\uDFFF\"]]},\n    \"1f64d-200d-2640-fe0f\":{\"1f3fb\":[\"1f64d-1f3fb-200d-2640-fe0f\",33,19,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f64d-1f3fc-200d-2640-fe0f\",33,20,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f64d-1f3fd-200d-2640-fe0f\",33,21,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f64d-1f3fe-200d-2640-fe0f\",33,22,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f64d-1f3ff-200d-2640-fe0f\",33,23,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4D\\uD83C\\uDFFF\"]]},\n    \"1f64d-200d-2642-fe0f\":{\"1f3fb\":[\"1f64d-1f3fb-200d-2642-fe0f\",33,25,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f64d-1f3fc-200d-2642-fe0f\",33,26,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f64d-1f3fd-200d-2642-fe0f\",33,27,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f64d-1f3fe-200d-2642-fe0f\",33,28,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f64d-1f3ff-200d-2642-fe0f\",33,29,7,[\"\\uD83D\\uDE4D\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f64e-200d-2640-fe0f\":{\"1f3fb\":[\"1f64e-1f3fb-200d-2640-fe0f\",33,37,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f64e-1f3fc-200d-2640-fe0f\",33,38,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f64e-1f3fd-200d-2640-fe0f\",33,39,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f64e-1f3fe-200d-2640-fe0f\",33,40,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f64e-1f3ff-200d-2640-fe0f\",33,41,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83D\\uDE4E\\uD83C\\uDFFF\"]]},\n    \"1f64e-200d-2642-fe0f\":{\"1f3fb\":[\"1f64e-1f3fb-200d-2642-fe0f\",33,43,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f64e-1f3fc-200d-2642-fe0f\",33,44,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f64e-1f3fd-200d-2642-fe0f\",33,45,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f64e-1f3fe-200d-2642-fe0f\",33,46,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f64e-1f3ff-200d-2642-fe0f\",33,47,7,[\"\\uD83D\\uDE4E\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f64f\":{\"1f3fb\":[\"1f64f-1f3fb\",34,3,31,[\"\\uD83D\\uDE4F\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f64f-1f3fc\",34,4,31,[\"\\uD83D\\uDE4F\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f64f-1f3fd\",34,5,31,[\"\\uD83D\\uDE4F\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f64f-1f3fe\",34,6,31,[\"\\uD83D\\uDE4F\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f64f-1f3ff\",34,7,31,[\"\\uD83D\\uDE4F\\uD83C\\uDFFF\"]]},\n    \"1f6a3-200d-2640-fe0f\":{\"1f3fb\":[\"1f6a3-1f3fb-200d-2640-fe0f\",34,44,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f6a3-1f3fc-200d-2640-fe0f\",34,45,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f6a3-1f3fd-200d-2640-fe0f\",34,46,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f6a3-1f3fe-200d-2640-fe0f\",34,47,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f6a3-1f3ff-200d-2640-fe0f\",34,48,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f6a3-200d-2642-fe0f\":{\"1f3fb\":[\"1f6a3-1f3fb-200d-2642-fe0f\",34,50,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6a3-1f3fc-200d-2642-fe0f\",34,51,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6a3-1f3fd-200d-2642-fe0f\",35,0,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6a3-1f3fe-200d-2642-fe0f\",35,1,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6a3-1f3ff-200d-2642-fe0f\",35,2,7,[\"\\uD83D\\uDEA3\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEA3\\uD83C\\uDFFF\"]]},\n    \"1f6b4-200d-2640-fe0f\":{\"1f3fb\":[\"1f6b4-1f3fb-200d-2640-fe0f\",35,26,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f6b4-1f3fc-200d-2640-fe0f\",35,27,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f6b4-1f3fd-200d-2640-fe0f\",35,28,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f6b4-1f3fe-200d-2640-fe0f\",35,29,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f6b4-1f3ff-200d-2640-fe0f\",35,30,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f6b4-200d-2642-fe0f\":{\"1f3fb\":[\"1f6b4-1f3fb-200d-2642-fe0f\",35,32,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6b4-1f3fc-200d-2642-fe0f\",35,33,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6b4-1f3fd-200d-2642-fe0f\",35,34,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6b4-1f3fe-200d-2642-fe0f\",35,35,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6b4-1f3ff-200d-2642-fe0f\",35,36,7,[\"\\uD83D\\uDEB4\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB4\\uD83C\\uDFFF\"]]},\n    \"1f6b5-200d-2640-fe0f\":{\"1f3fb\":[\"1f6b5-1f3fb-200d-2640-fe0f\",35,44,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f6b5-1f3fc-200d-2640-fe0f\",35,45,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f6b5-1f3fd-200d-2640-fe0f\",35,46,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f6b5-1f3fe-200d-2640-fe0f\",35,47,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f6b5-1f3ff-200d-2640-fe0f\",35,48,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f6b5-200d-2642-fe0f\":{\"1f3fb\":[\"1f6b5-1f3fb-200d-2642-fe0f\",35,50,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6b5-1f3fc-200d-2642-fe0f\",35,51,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6b5-1f3fd-200d-2642-fe0f\",36,0,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6b5-1f3fe-200d-2642-fe0f\",36,1,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6b5-1f3ff-200d-2642-fe0f\",36,2,7,[\"\\uD83D\\uDEB5\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB5\\uD83C\\uDFFF\"]]},\n    \"1f6b6-200d-2640-fe0f\":{\"1f3fb\":[\"1f6b6-1f3fb-200d-2640-fe0f\",36,10,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f6b6-1f3fc-200d-2640-fe0f\",36,11,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f6b6-1f3fd-200d-2640-fe0f\",36,12,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f6b6-1f3fe-200d-2640-fe0f\",36,13,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f6b6-1f3ff-200d-2640-fe0f\",36,14,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f6b6-200d-2642-fe0f\":{\"1f3fb\":[\"1f6b6-1f3fb-200d-2642-fe0f\",36,16,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6b6-1f3fc-200d-2642-fe0f\",36,17,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6b6-1f3fd-200d-2642-fe0f\",36,18,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6b6-1f3fe-200d-2642-fe0f\",36,19,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6b6-1f3ff-200d-2642-fe0f\",36,20,7,[\"\\uD83D\\uDEB6\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83D\\uDEB6\\uD83C\\uDFFF\"]]},\n    \"1f6c0\":{\"1f3fb\":[\"1f6c0-1f3fb\",36,37,31,[\"\\uD83D\\uDEC0\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6c0-1f3fc\",36,38,31,[\"\\uD83D\\uDEC0\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6c0-1f3fd\",36,39,31,[\"\\uD83D\\uDEC0\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6c0-1f3fe\",36,40,31,[\"\\uD83D\\uDEC0\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6c0-1f3ff\",36,41,31,[\"\\uD83D\\uDEC0\\uD83C\\uDFFF\"]]},\n    \"1f6cc\":{\"1f3fb\":[\"1f6cc-1f3fb\",36,49,15,[\"\\uD83D\\uDECC\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f6cc-1f3fc\",36,50,15,[\"\\uD83D\\uDECC\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f6cc-1f3fd\",36,51,15,[\"\\uD83D\\uDECC\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f6cc-1f3fe\",37,0,15,[\"\\uD83D\\uDECC\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f6cc-1f3ff\",37,1,15,[\"\\uD83D\\uDECC\\uD83C\\uDFFF\"]]},\n    \"1f918\":{\"1f3fb\":[\"1f918-1f3fb\",37,33,15,[\"\\uD83E\\uDD18\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f918-1f3fc\",37,34,15,[\"\\uD83E\\uDD18\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f918-1f3fd\",37,35,15,[\"\\uD83E\\uDD18\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f918-1f3fe\",37,36,15,[\"\\uD83E\\uDD18\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f918-1f3ff\",37,37,15,[\"\\uD83E\\uDD18\\uD83C\\uDFFF\"]]},\n    \"1f919\":{\"1f3fb\":[\"1f919-1f3fb\",37,39,15,[\"\\uD83E\\uDD19\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f919-1f3fc\",37,40,15,[\"\\uD83E\\uDD19\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f919-1f3fd\",37,41,15,[\"\\uD83E\\uDD19\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f919-1f3fe\",37,42,15,[\"\\uD83E\\uDD19\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f919-1f3ff\",37,43,15,[\"\\uD83E\\uDD19\\uD83C\\uDFFF\"]]},\n    \"1f91a\":{\"1f3fb\":[\"1f91a-1f3fb\",37,45,15,[\"\\uD83E\\uDD1A\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f91a-1f3fc\",37,46,15,[\"\\uD83E\\uDD1A\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f91a-1f3fd\",37,47,15,[\"\\uD83E\\uDD1A\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f91a-1f3fe\",37,48,15,[\"\\uD83E\\uDD1A\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f91a-1f3ff\",37,49,15,[\"\\uD83E\\uDD1A\\uD83C\\uDFFF\"]]},\n    \"1f91b\":{\"1f3fb\":[\"1f91b-1f3fb\",37,51,15,[\"\\uD83E\\uDD1B\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f91b-1f3fc\",38,0,15,[\"\\uD83E\\uDD1B\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f91b-1f3fd\",38,1,15,[\"\\uD83E\\uDD1B\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f91b-1f3fe\",38,2,15,[\"\\uD83E\\uDD1B\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f91b-1f3ff\",38,3,15,[\"\\uD83E\\uDD1B\\uD83C\\uDFFF\"]]},\n    \"1f91c\":{\"1f3fb\":[\"1f91c-1f3fb\",38,5,15,[\"\\uD83E\\uDD1C\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f91c-1f3fc\",38,6,15,[\"\\uD83E\\uDD1C\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f91c-1f3fd\",38,7,15,[\"\\uD83E\\uDD1C\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f91c-1f3fe\",38,8,15,[\"\\uD83E\\uDD1C\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f91c-1f3ff\",38,9,15,[\"\\uD83E\\uDD1C\\uD83C\\uDFFF\"]]},\n    \"1f91e\":{\"1f3fb\":[\"1f91e-1f3fb\",38,12,15,[\"\\uD83E\\uDD1E\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f91e-1f3fc\",38,13,15,[\"\\uD83E\\uDD1E\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f91e-1f3fd\",38,14,15,[\"\\uD83E\\uDD1E\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f91e-1f3fe\",38,15,15,[\"\\uD83E\\uDD1E\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f91e-1f3ff\",38,16,15,[\"\\uD83E\\uDD1E\\uD83C\\uDFFF\"]]},\n    \"1f91f\":{\"1f3fb\":[\"1f91f-1f3fb\",38,18,15,[\"\\uD83E\\uDD1F\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f91f-1f3fc\",38,19,15,[\"\\uD83E\\uDD1F\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f91f-1f3fd\",38,20,15,[\"\\uD83E\\uDD1F\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f91f-1f3fe\",38,21,15,[\"\\uD83E\\uDD1F\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f91f-1f3ff\",38,22,15,[\"\\uD83E\\uDD1F\\uD83C\\uDFFF\"]]},\n    \"1f926-200d-2640-fe0f\":{\"1f3fb\":[\"1f926-1f3fb-200d-2640-fe0f\",38,30,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f926-1f3fc-200d-2640-fe0f\",38,31,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f926-1f3fd-200d-2640-fe0f\",38,32,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f926-1f3fe-200d-2640-fe0f\",38,33,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f926-1f3ff-200d-2640-fe0f\",38,34,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f926-200d-2642-fe0f\":{\"1f3fb\":[\"1f926-1f3fb-200d-2642-fe0f\",38,36,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f926-1f3fc-200d-2642-fe0f\",38,37,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f926-1f3fd-200d-2642-fe0f\",38,38,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f926-1f3fe-200d-2642-fe0f\",38,39,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f926-1f3ff-200d-2642-fe0f\",38,40,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f926\":{\"1f3fb\":[\"1f926-1f3fb\",38,42,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f926-1f3fc\",38,43,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f926-1f3fd\",38,44,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f926-1f3fe\",38,45,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f926-1f3ff\",38,46,7,[\"\\uD83E\\uDD26\\uD83C\\uDFFF\"]]},\n    \"1f930\":{\"1f3fb\":[\"1f930-1f3fb\",39,5,15,[\"\\uD83E\\uDD30\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f930-1f3fc\",39,6,15,[\"\\uD83E\\uDD30\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f930-1f3fd\",39,7,15,[\"\\uD83E\\uDD30\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f930-1f3fe\",39,8,15,[\"\\uD83E\\uDD30\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f930-1f3ff\",39,9,15,[\"\\uD83E\\uDD30\\uD83C\\uDFFF\"]]},\n    \"1f931\":{\"1f3fb\":[\"1f931-1f3fb\",39,11,15,[\"\\uD83E\\uDD31\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f931-1f3fc\",39,12,15,[\"\\uD83E\\uDD31\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f931-1f3fd\",39,13,15,[\"\\uD83E\\uDD31\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f931-1f3fe\",39,14,15,[\"\\uD83E\\uDD31\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f931-1f3ff\",39,15,15,[\"\\uD83E\\uDD31\\uD83C\\uDFFF\"]]},\n    \"1f932\":{\"1f3fb\":[\"1f932-1f3fb\",39,17,15,[\"\\uD83E\\uDD32\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f932-1f3fc\",39,18,15,[\"\\uD83E\\uDD32\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f932-1f3fd\",39,19,15,[\"\\uD83E\\uDD32\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f932-1f3fe\",39,20,15,[\"\\uD83E\\uDD32\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f932-1f3ff\",39,21,15,[\"\\uD83E\\uDD32\\uD83C\\uDFFF\"]]},\n    \"1f933\":{\"1f3fb\":[\"1f933-1f3fb\",39,23,15,[\"\\uD83E\\uDD33\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f933-1f3fc\",39,24,15,[\"\\uD83E\\uDD33\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f933-1f3fd\",39,25,15,[\"\\uD83E\\uDD33\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f933-1f3fe\",39,26,15,[\"\\uD83E\\uDD33\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f933-1f3ff\",39,27,15,[\"\\uD83E\\uDD33\\uD83C\\uDFFF\"]]},\n    \"1f934\":{\"1f3fb\":[\"1f934-1f3fb\",39,29,15,[\"\\uD83E\\uDD34\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f934-1f3fc\",39,30,15,[\"\\uD83E\\uDD34\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f934-1f3fd\",39,31,15,[\"\\uD83E\\uDD34\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f934-1f3fe\",39,32,15,[\"\\uD83E\\uDD34\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f934-1f3ff\",39,33,15,[\"\\uD83E\\uDD34\\uD83C\\uDFFF\"]]},\n    \"1f935\":{\"1f3fb\":[\"1f935-1f3fb\",39,35,15,[\"\\uD83E\\uDD35\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f935-1f3fc\",39,36,15,[\"\\uD83E\\uDD35\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f935-1f3fd\",39,37,15,[\"\\uD83E\\uDD35\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f935-1f3fe\",39,38,15,[\"\\uD83E\\uDD35\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f935-1f3ff\",39,39,15,[\"\\uD83E\\uDD35\\uD83C\\uDFFF\"]]},\n    \"1f936\":{\"1f3fb\":[\"1f936-1f3fb\",39,41,15,[\"\\uD83E\\uDD36\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f936-1f3fc\",39,42,15,[\"\\uD83E\\uDD36\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f936-1f3fd\",39,43,15,[\"\\uD83E\\uDD36\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f936-1f3fe\",39,44,15,[\"\\uD83E\\uDD36\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f936-1f3ff\",39,45,15,[\"\\uD83E\\uDD36\\uD83C\\uDFFF\"]]},\n    \"1f937-200d-2640-fe0f\":{\"1f3fb\":[\"1f937-1f3fb-200d-2640-fe0f\",39,47,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f937-1f3fc-200d-2640-fe0f\",39,48,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f937-1f3fd-200d-2640-fe0f\",39,49,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f937-1f3fe-200d-2640-fe0f\",39,50,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f937-1f3ff-200d-2640-fe0f\",39,51,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f937-200d-2642-fe0f\":{\"1f3fb\":[\"1f937-1f3fb-200d-2642-fe0f\",40,1,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f937-1f3fc-200d-2642-fe0f\",40,2,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f937-1f3fd-200d-2642-fe0f\",40,3,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f937-1f3fe-200d-2642-fe0f\",40,4,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f937-1f3ff-200d-2642-fe0f\",40,5,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f937\":{\"1f3fb\":[\"1f937-1f3fb\",40,7,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f937-1f3fc\",40,8,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f937-1f3fd\",40,9,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f937-1f3fe\",40,10,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f937-1f3ff\",40,11,7,[\"\\uD83E\\uDD37\\uD83C\\uDFFF\"]]},\n    \"1f938-200d-2640-fe0f\":{\"1f3fb\":[\"1f938-1f3fb-200d-2640-fe0f\",40,13,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f938-1f3fc-200d-2640-fe0f\",40,14,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f938-1f3fd-200d-2640-fe0f\",40,15,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f938-1f3fe-200d-2640-fe0f\",40,16,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f938-1f3ff-200d-2640-fe0f\",40,17,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f938-200d-2642-fe0f\":{\"1f3fb\":[\"1f938-1f3fb-200d-2642-fe0f\",40,19,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f938-1f3fc-200d-2642-fe0f\",40,20,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f938-1f3fd-200d-2642-fe0f\",40,21,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f938-1f3fe-200d-2642-fe0f\",40,22,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f938-1f3ff-200d-2642-fe0f\",40,23,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f938\":{\"1f3fb\":[\"1f938-1f3fb\",40,25,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f938-1f3fc\",40,26,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f938-1f3fd\",40,27,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f938-1f3fe\",40,28,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f938-1f3ff\",40,29,7,[\"\\uD83E\\uDD38\\uD83C\\uDFFF\"]]},\n    \"1f939-200d-2640-fe0f\":{\"1f3fb\":[\"1f939-1f3fb-200d-2640-fe0f\",40,31,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f939-1f3fc-200d-2640-fe0f\",40,32,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f939-1f3fd-200d-2640-fe0f\",40,33,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f939-1f3fe-200d-2640-fe0f\",40,34,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f939-1f3ff-200d-2640-fe0f\",40,35,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f939-200d-2642-fe0f\":{\"1f3fb\":[\"1f939-1f3fb-200d-2642-fe0f\",40,37,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f939-1f3fc-200d-2642-fe0f\",40,38,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f939-1f3fd-200d-2642-fe0f\",40,39,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f939-1f3fe-200d-2642-fe0f\",40,40,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f939-1f3ff-200d-2642-fe0f\",40,41,7,[\"\\uD83E\\uDD39\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f939\":{\"1f3fb\":[\"1f939-1f3fb\",40,43,15,[\"\\uD83E\\uDD39\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f939-1f3fc\",40,44,15,[\"\\uD83E\\uDD39\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f939-1f3fd\",40,45,15,[\"\\uD83E\\uDD39\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f939-1f3fe\",40,46,15,[\"\\uD83E\\uDD39\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f939-1f3ff\",40,47,15,[\"\\uD83E\\uDD39\\uD83C\\uDFFF\"]]},\n    \"1f93d-200d-2640-fe0f\":{\"1f3fb\":[\"1f93d-1f3fb-200d-2640-fe0f\",41,1,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f93d-1f3fc-200d-2640-fe0f\",41,2,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f93d-1f3fd-200d-2640-fe0f\",41,3,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f93d-1f3fe-200d-2640-fe0f\",41,4,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f93d-1f3ff-200d-2640-fe0f\",41,5,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f93d-200d-2642-fe0f\":{\"1f3fb\":[\"1f93d-1f3fb-200d-2642-fe0f\",41,7,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f93d-1f3fc-200d-2642-fe0f\",41,8,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f93d-1f3fd-200d-2642-fe0f\",41,9,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f93d-1f3fe-200d-2642-fe0f\",41,10,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f93d-1f3ff-200d-2642-fe0f\",41,11,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f93d\":{\"1f3fb\":[\"1f93d-1f3fb\",41,13,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f93d-1f3fc\",41,14,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f93d-1f3fd\",41,15,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f93d-1f3fe\",41,16,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f93d-1f3ff\",41,17,7,[\"\\uD83E\\uDD3D\\uD83C\\uDFFF\"]]},\n    \"1f93e-200d-2640-fe0f\":{\"1f3fb\":[\"1f93e-1f3fb-200d-2640-fe0f\",41,19,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f93e-1f3fc-200d-2640-fe0f\",41,20,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f93e-1f3fd-200d-2640-fe0f\",41,21,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f93e-1f3fe-200d-2640-fe0f\",41,22,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f93e-1f3ff-200d-2640-fe0f\",41,23,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f93e-200d-2642-fe0f\":{\"1f3fb\":[\"1f93e-1f3fb-200d-2642-fe0f\",41,25,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f93e-1f3fc-200d-2642-fe0f\",41,26,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f93e-1f3fd-200d-2642-fe0f\",41,27,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f93e-1f3fe-200d-2642-fe0f\",41,28,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f93e-1f3ff-200d-2642-fe0f\",41,29,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f93e\":{\"1f3fb\":[\"1f93e-1f3fb\",41,31,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f93e-1f3fc\",41,32,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f93e-1f3fd\",41,33,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f93e-1f3fe\",41,34,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f93e-1f3ff\",41,35,7,[\"\\uD83E\\uDD3E\\uD83C\\uDFFF\"]]},\n    \"1f9d1\":{\"1f3fb\":[\"1f9d1-1f3fb\",42,51,15,[\"\\uD83E\\uDDD1\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d1-1f3fc\",43,0,15,[\"\\uD83E\\uDDD1\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d1-1f3fd\",43,1,15,[\"\\uD83E\\uDDD1\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d1-1f3fe\",43,2,15,[\"\\uD83E\\uDDD1\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d1-1f3ff\",43,3,15,[\"\\uD83E\\uDDD1\\uD83C\\uDFFF\"]]},\n    \"1f9d2\":{\"1f3fb\":[\"1f9d2-1f3fb\",43,5,15,[\"\\uD83E\\uDDD2\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d2-1f3fc\",43,6,15,[\"\\uD83E\\uDDD2\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d2-1f3fd\",43,7,15,[\"\\uD83E\\uDDD2\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d2-1f3fe\",43,8,15,[\"\\uD83E\\uDDD2\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d2-1f3ff\",43,9,15,[\"\\uD83E\\uDDD2\\uD83C\\uDFFF\"]]},\n    \"1f9d3\":{\"1f3fb\":[\"1f9d3-1f3fb\",43,11,15,[\"\\uD83E\\uDDD3\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d3-1f3fc\",43,12,15,[\"\\uD83E\\uDDD3\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d3-1f3fd\",43,13,15,[\"\\uD83E\\uDDD3\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d3-1f3fe\",43,14,15,[\"\\uD83E\\uDDD3\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d3-1f3ff\",43,15,15,[\"\\uD83E\\uDDD3\\uD83C\\uDFFF\"]]},\n    \"1f9d4\":{\"1f3fb\":[\"1f9d4-1f3fb\",43,17,15,[\"\\uD83E\\uDDD4\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d4-1f3fc\",43,18,15,[\"\\uD83E\\uDDD4\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d4-1f3fd\",43,19,15,[\"\\uD83E\\uDDD4\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d4-1f3fe\",43,20,15,[\"\\uD83E\\uDDD4\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d4-1f3ff\",43,21,15,[\"\\uD83E\\uDDD4\\uD83C\\uDFFF\"]]},\n    \"1f9d5\":{\"1f3fb\":[\"1f9d5-1f3fb\",43,23,15,[\"\\uD83E\\uDDD5\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d5-1f3fc\",43,24,15,[\"\\uD83E\\uDDD5\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d5-1f3fd\",43,25,15,[\"\\uD83E\\uDDD5\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d5-1f3fe\",43,26,15,[\"\\uD83E\\uDDD5\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d5-1f3ff\",43,27,15,[\"\\uD83E\\uDDD5\\uD83C\\uDFFF\"]]},\n    \"1f9d6-200d-2640-fe0f\":{\"1f3fb\":[\"1f9d6-1f3fb-200d-2640-fe0f\",43,29,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f9d6-1f3fc-200d-2640-fe0f\",43,30,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f9d6-1f3fd-200d-2640-fe0f\",43,31,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f9d6-1f3fe-200d-2640-fe0f\",43,32,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f9d6-1f3ff-200d-2640-fe0f\",43,33,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f9d6-200d-2642-fe0f\":{\"1f3fb\":[\"1f9d6-1f3fb-200d-2642-fe0f\",43,35,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d6-1f3fc-200d-2642-fe0f\",43,36,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d6-1f3fd-200d-2642-fe0f\",43,37,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d6-1f3fe-200d-2642-fe0f\",43,38,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d6-1f3ff-200d-2642-fe0f\",43,39,7,[\"\\uD83E\\uDDD6\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDD6\\uD83C\\uDFFF\"]]},\n    \"1f9d7-200d-2640-fe0f\":{\"1f3fb\":[\"1f9d7-1f3fb-200d-2640-fe0f\",43,47,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d7-1f3fc-200d-2640-fe0f\",43,48,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d7-1f3fd-200d-2640-fe0f\",43,49,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d7-1f3fe-200d-2640-fe0f\",43,50,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d7-1f3ff-200d-2640-fe0f\",43,51,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD7\\uD83C\\uDFFF\"]]},\n    \"1f9d7-200d-2642-fe0f\":{\"1f3fb\":[\"1f9d7-1f3fb-200d-2642-fe0f\",44,1,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f9d7-1f3fc-200d-2642-fe0f\",44,2,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f9d7-1f3fd-200d-2642-fe0f\",44,3,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f9d7-1f3fe-200d-2642-fe0f\",44,4,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f9d7-1f3ff-200d-2642-fe0f\",44,5,7,[\"\\uD83E\\uDDD7\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f9d8-200d-2640-fe0f\":{\"1f3fb\":[\"1f9d8-1f3fb-200d-2640-fe0f\",44,13,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d8-1f3fc-200d-2640-fe0f\",44,14,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d8-1f3fd-200d-2640-fe0f\",44,15,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d8-1f3fe-200d-2640-fe0f\",44,16,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d8-1f3ff-200d-2640-fe0f\",44,17,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD8\\uD83C\\uDFFF\"]]},\n    \"1f9d8-200d-2642-fe0f\":{\"1f3fb\":[\"1f9d8-1f3fb-200d-2642-fe0f\",44,19,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f9d8-1f3fc-200d-2642-fe0f\",44,20,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f9d8-1f3fd-200d-2642-fe0f\",44,21,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f9d8-1f3fe-200d-2642-fe0f\",44,22,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f9d8-1f3ff-200d-2642-fe0f\",44,23,7,[\"\\uD83E\\uDDD8\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f9d9-200d-2640-fe0f\":{\"1f3fb\":[\"1f9d9-1f3fb-200d-2640-fe0f\",44,31,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9d9-1f3fc-200d-2640-fe0f\",44,32,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9d9-1f3fd-200d-2640-fe0f\",44,33,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9d9-1f3fe-200d-2640-fe0f\",44,34,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9d9-1f3ff-200d-2640-fe0f\",44,35,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDD9\\uD83C\\uDFFF\"]]},\n    \"1f9d9-200d-2642-fe0f\":{\"1f3fb\":[\"1f9d9-1f3fb-200d-2642-fe0f\",44,37,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f9d9-1f3fc-200d-2642-fe0f\",44,38,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f9d9-1f3fd-200d-2642-fe0f\",44,39,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f9d9-1f3fe-200d-2642-fe0f\",44,40,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f9d9-1f3ff-200d-2642-fe0f\",44,41,7,[\"\\uD83E\\uDDD9\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f9da-200d-2640-fe0f\":{\"1f3fb\":[\"1f9da-1f3fb-200d-2640-fe0f\",44,49,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9da-1f3fc-200d-2640-fe0f\",44,50,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9da-1f3fd-200d-2640-fe0f\",44,51,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9da-1f3fe-200d-2640-fe0f\",45,0,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9da-1f3ff-200d-2640-fe0f\",45,1,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDA\\uD83C\\uDFFF\"]]},\n    \"1f9da-200d-2642-fe0f\":{\"1f3fb\":[\"1f9da-1f3fb-200d-2642-fe0f\",45,3,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f9da-1f3fc-200d-2642-fe0f\",45,4,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f9da-1f3fd-200d-2642-fe0f\",45,5,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f9da-1f3fe-200d-2642-fe0f\",45,6,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f9da-1f3ff-200d-2642-fe0f\",45,7,7,[\"\\uD83E\\uDDDA\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f9db-200d-2640-fe0f\":{\"1f3fb\":[\"1f9db-1f3fb-200d-2640-fe0f\",45,15,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9db-1f3fc-200d-2640-fe0f\",45,16,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9db-1f3fd-200d-2640-fe0f\",45,17,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9db-1f3fe-200d-2640-fe0f\",45,18,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9db-1f3ff-200d-2640-fe0f\",45,19,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\",\"\\uD83E\\uDDDB\\uD83C\\uDFFF\"]]},\n    \"1f9db-200d-2642-fe0f\":{\"1f3fb\":[\"1f9db-1f3fb-200d-2642-fe0f\",45,21,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\"]],\"1f3fc\":[\"1f9db-1f3fc-200d-2642-fe0f\",45,22,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\"]],\"1f3fd\":[\"1f9db-1f3fd-200d-2642-fe0f\",45,23,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\"]],\"1f3fe\":[\"1f9db-1f3fe-200d-2642-fe0f\",45,24,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\"]],\"1f3ff\":[\"1f9db-1f3ff-200d-2642-fe0f\",45,25,7,[\"\\uD83E\\uDDDB\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\"]]},\n    \"1f9dc-200d-2640-fe0f\":{\"1f3fb\":[\"1f9dc-1f3fb-200d-2640-fe0f\",45,33,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f9dc-1f3fc-200d-2640-fe0f\",45,34,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f9dc-1f3fd-200d-2640-fe0f\",45,35,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f9dc-1f3fe-200d-2640-fe0f\",45,36,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f9dc-1f3ff-200d-2640-fe0f\",45,37,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f9dc-200d-2642-fe0f\":{\"1f3fb\":[\"1f9dc-1f3fb-200d-2642-fe0f\",45,39,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9dc-1f3fc-200d-2642-fe0f\",45,40,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9dc-1f3fd-200d-2642-fe0f\",45,41,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9dc-1f3fe-200d-2642-fe0f\",45,42,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9dc-1f3ff-200d-2642-fe0f\",45,43,7,[\"\\uD83E\\uDDDC\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDC\\uD83C\\uDFFF\"]]},\n    \"1f9dd-200d-2640-fe0f\":{\"1f3fb\":[\"1f9dd-1f3fb-200d-2640-fe0f\",45,51,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"1f9dd-1f3fc-200d-2640-fe0f\",46,0,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"1f9dd-1f3fd-200d-2640-fe0f\",46,1,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"1f9dd-1f3fe-200d-2640-fe0f\",46,2,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"1f9dd-1f3ff-200d-2640-fe0f\",46,3,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"1f9dd-200d-2642-fe0f\":{\"1f3fb\":[\"1f9dd-1f3fb-200d-2642-fe0f\",46,5,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\uD83C\\uDFFB\"]],\"1f3fc\":[\"1f9dd-1f3fc-200d-2642-fe0f\",46,6,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\uD83C\\uDFFC\"]],\"1f3fd\":[\"1f9dd-1f3fd-200d-2642-fe0f\",46,7,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\uD83C\\uDFFD\"]],\"1f3fe\":[\"1f9dd-1f3fe-200d-2642-fe0f\",46,8,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\uD83C\\uDFFE\"]],\"1f3ff\":[\"1f9dd-1f3ff-200d-2642-fe0f\",46,9,7,[\"\\uD83E\\uDDDD\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\uD83E\\uDDDD\\uD83C\\uDFFF\"]]},\n    \"261d\":{\"1f3fb\":[\"261d-1f3fb\",47,27,31,[\"\\u261D\\uD83C\\uDFFB\"]],\"1f3fc\":[\"261d-1f3fc\",47,28,31,[\"\\u261D\\uD83C\\uDFFC\"]],\"1f3fd\":[\"261d-1f3fd\",47,29,31,[\"\\u261D\\uD83C\\uDFFD\"]],\"1f3fe\":[\"261d-1f3fe\",47,30,31,[\"\\u261D\\uD83C\\uDFFE\"]],\"1f3ff\":[\"261d-1f3ff\",47,31,31,[\"\\u261D\\uD83C\\uDFFF\"]]},\n    \"26f9-fe0f-200d-2640-fe0f\":{\"1f3fb\":[\"26f9-1f3fb-200d-2640-fe0f\",48,47,7,[\"\\u26F9\\uD83C\\uDFFB\\u200D\\u2640\\uFE0F\"]],\"1f3fc\":[\"26f9-1f3fc-200d-2640-fe0f\",48,48,7,[\"\\u26F9\\uD83C\\uDFFC\\u200D\\u2640\\uFE0F\"]],\"1f3fd\":[\"26f9-1f3fd-200d-2640-fe0f\",48,49,7,[\"\\u26F9\\uD83C\\uDFFD\\u200D\\u2640\\uFE0F\"]],\"1f3fe\":[\"26f9-1f3fe-200d-2640-fe0f\",48,50,7,[\"\\u26F9\\uD83C\\uDFFE\\u200D\\u2640\\uFE0F\"]],\"1f3ff\":[\"26f9-1f3ff-200d-2640-fe0f\",48,51,7,[\"\\u26F9\\uD83C\\uDFFF\\u200D\\u2640\\uFE0F\"]]},\n    \"26f9-fe0f-200d-2642-fe0f\":{\"1f3fb\":[\"26f9-1f3fb-200d-2642-fe0f\",49,1,7,[\"\\u26F9\\uD83C\\uDFFB\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uD83C\\uDFFB\"]],\"1f3fc\":[\"26f9-1f3fc-200d-2642-fe0f\",49,2,7,[\"\\u26F9\\uD83C\\uDFFC\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uD83C\\uDFFC\"]],\"1f3fd\":[\"26f9-1f3fd-200d-2642-fe0f\",49,3,7,[\"\\u26F9\\uD83C\\uDFFD\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uD83C\\uDFFD\"]],\"1f3fe\":[\"26f9-1f3fe-200d-2642-fe0f\",49,4,7,[\"\\u26F9\\uD83C\\uDFFE\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uD83C\\uDFFE\"]],\"1f3ff\":[\"26f9-1f3ff-200d-2642-fe0f\",49,5,7,[\"\\u26F9\\uD83C\\uDFFF\\u200D\\u2642\\uFE0F\",\"\\u26F9\\uD83C\\uDFFF\"]]},\n    \"270a\":{\"1f3fb\":[\"270a-1f3fb\",49,19,31,[\"\\u270A\\uD83C\\uDFFB\"]],\"1f3fc\":[\"270a-1f3fc\",49,20,31,[\"\\u270A\\uD83C\\uDFFC\"]],\"1f3fd\":[\"270a-1f3fd\",49,21,31,[\"\\u270A\\uD83C\\uDFFD\"]],\"1f3fe\":[\"270a-1f3fe\",49,22,31,[\"\\u270A\\uD83C\\uDFFE\"]],\"1f3ff\":[\"270a-1f3ff\",49,23,31,[\"\\u270A\\uD83C\\uDFFF\"]]},\n    \"270b\":{\"1f3fb\":[\"270b-1f3fb\",49,25,31,[\"\\u270B\\uD83C\\uDFFB\"]],\"1f3fc\":[\"270b-1f3fc\",49,26,31,[\"\\u270B\\uD83C\\uDFFC\"]],\"1f3fd\":[\"270b-1f3fd\",49,27,31,[\"\\u270B\\uD83C\\uDFFD\"]],\"1f3fe\":[\"270b-1f3fe\",49,28,31,[\"\\u270B\\uD83C\\uDFFE\"]],\"1f3ff\":[\"270b-1f3ff\",49,29,31,[\"\\u270B\\uD83C\\uDFFF\"]]},\n    \"270c\":{\"1f3fb\":[\"270c-1f3fb\",49,31,31,[\"\\u270C\\uD83C\\uDFFB\"]],\"1f3fc\":[\"270c-1f3fc\",49,32,31,[\"\\u270C\\uD83C\\uDFFC\"]],\"1f3fd\":[\"270c-1f3fd\",49,33,31,[\"\\u270C\\uD83C\\uDFFD\"]],\"1f3fe\":[\"270c-1f3fe\",49,34,31,[\"\\u270C\\uD83C\\uDFFE\"]],\"1f3ff\":[\"270c-1f3ff\",49,35,31,[\"\\u270C\\uD83C\\uDFFF\"]]},\n    \"270d\":{\"1f3fb\":[\"270d-1f3fb\",49,37,15,[\"\\u270D\\uD83C\\uDFFB\"]],\"1f3fc\":[\"270d-1f3fc\",49,38,15,[\"\\u270D\\uD83C\\uDFFC\"]],\"1f3fd\":[\"270d-1f3fd\",49,39,15,[\"\\u270D\\uD83C\\uDFFD\"]],\"1f3fe\":[\"270d-1f3fe\",49,40,15,[\"\\u270D\\uD83C\\uDFFE\"]],\"1f3ff\":[\"270d-1f3ff\",49,41,15,[\"\\u270D\\uD83C\\uDFFF\"]]}\n  };\n  /** @private */\n  emoji.prototype.obsoletes_data = {\n    \"1f3c3-200d-2642-fe0f\":[\"1f3c3\",9,46,23],\n    \"1f3c3-1f3fb-200d-2642-fe0f\":[\"1f3c3-1f3fb\",9,47,23],\n    \"1f3c3-1f3fc-200d-2642-fe0f\":[\"1f3c3-1f3fc\",9,48,23],\n    \"1f3c3-1f3fd-200d-2642-fe0f\":[\"1f3c3-1f3fd\",9,49,23],\n    \"1f3c3-1f3fe-200d-2642-fe0f\":[\"1f3c3-1f3fe\",9,50,23],\n    \"1f3c3-1f3ff-200d-2642-fe0f\":[\"1f3c3-1f3ff\",9,51,23],\n    \"1f3c4-200d-2642-fe0f\":[\"1f3c4\",10,12,23],\n    \"1f3c4-1f3fb-200d-2642-fe0f\":[\"1f3c4-1f3fb\",10,13,23],\n    \"1f3c4-1f3fc-200d-2642-fe0f\":[\"1f3c4-1f3fc\",10,14,23],\n    \"1f3c4-1f3fd-200d-2642-fe0f\":[\"1f3c4-1f3fd\",10,15,23],\n    \"1f3c4-1f3fe-200d-2642-fe0f\":[\"1f3c4-1f3fe\",10,16,23],\n    \"1f3c4-1f3ff-200d-2642-fe0f\":[\"1f3c4-1f3ff\",10,17,23],\n    \"1f3ca-200d-2642-fe0f\":[\"1f3ca\",10,40,23],\n    \"1f3ca-1f3fb-200d-2642-fe0f\":[\"1f3ca-1f3fb\",10,41,23],\n    \"1f3ca-1f3fc-200d-2642-fe0f\":[\"1f3ca-1f3fc\",10,42,23],\n    \"1f3ca-1f3fd-200d-2642-fe0f\":[\"1f3ca-1f3fd\",10,43,23],\n    \"1f3ca-1f3fe-200d-2642-fe0f\":[\"1f3ca-1f3fe\",10,44,23],\n    \"1f3ca-1f3ff-200d-2642-fe0f\":[\"1f3ca-1f3ff\",10,45,23],\n    \"1f3cb-fe0f-200d-2642-fe0f\":[\"1f3cb\",11,6,7],\n    \"1f3cb-1f3fb-200d-2642-fe0f\":[\"1f3cb-1f3fb\",11,7,7],\n    \"1f3cb-1f3fc-200d-2642-fe0f\":[\"1f3cb-1f3fc\",11,8,7],\n    \"1f3cb-1f3fd-200d-2642-fe0f\":[\"1f3cb-1f3fd\",11,9,7],\n    \"1f3cb-1f3fe-200d-2642-fe0f\":[\"1f3cb-1f3fe\",11,10,7],\n    \"1f3cb-1f3ff-200d-2642-fe0f\":[\"1f3cb-1f3ff\",11,11,7],\n    \"1f3cc-fe0f-200d-2642-fe0f\":[\"1f3cc\",11,24,7],\n    \"1f3cc-1f3fb-200d-2642-fe0f\":[\"1f3cc-1f3fb\",11,25,7],\n    \"1f3cc-1f3fc-200d-2642-fe0f\":[\"1f3cc-1f3fc\",11,26,7],\n    \"1f3cc-1f3fd-200d-2642-fe0f\":[\"1f3cc-1f3fd\",11,27,7],\n    \"1f3cc-1f3fe-200d-2642-fe0f\":[\"1f3cc-1f3fe\",11,28,7],\n    \"1f3cc-1f3ff-200d-2642-fe0f\":[\"1f3cc-1f3ff\",11,29,7],\n    \"1f468-200d-1f469-200d-1f466\":[\"1f46a\",20,29,23],\n    \"1f46e-200d-2642-fe0f\":[\"1f46e\",20,45,23],\n    \"1f46e-1f3fb-200d-2642-fe0f\":[\"1f46e-1f3fb\",20,46,23],\n    \"1f46e-1f3fc-200d-2642-fe0f\":[\"1f46e-1f3fc\",20,47,23],\n    \"1f46e-1f3fd-200d-2642-fe0f\":[\"1f46e-1f3fd\",20,48,23],\n    \"1f46e-1f3fe-200d-2642-fe0f\":[\"1f46e-1f3fe\",20,49,23],\n    \"1f46e-1f3ff-200d-2642-fe0f\":[\"1f46e-1f3ff\",20,50,23],\n    \"1f46f-200d-2640-fe0f\":[\"1f46f\",21,1,23],\n    \"1f471-200d-2642-fe0f\":[\"1f471\",21,20,23],\n    \"1f471-1f3fb-200d-2642-fe0f\":[\"1f471-1f3fb\",21,21,23],\n    \"1f471-1f3fc-200d-2642-fe0f\":[\"1f471-1f3fc\",21,22,23],\n    \"1f471-1f3fd-200d-2642-fe0f\":[\"1f471-1f3fd\",21,23,23],\n    \"1f471-1f3fe-200d-2642-fe0f\":[\"1f471-1f3fe\",21,24,23],\n    \"1f471-1f3ff-200d-2642-fe0f\":[\"1f471-1f3ff\",21,25,23],\n    \"1f473-200d-2642-fe0f\":[\"1f473\",21,44,23],\n    \"1f473-1f3fb-200d-2642-fe0f\":[\"1f473-1f3fb\",21,45,23],\n    \"1f473-1f3fc-200d-2642-fe0f\":[\"1f473-1f3fc\",21,46,23],\n    \"1f473-1f3fd-200d-2642-fe0f\":[\"1f473-1f3fd\",21,47,23],\n    \"1f473-1f3fe-200d-2642-fe0f\":[\"1f473-1f3fe\",21,48,23],\n    \"1f473-1f3ff-200d-2642-fe0f\":[\"1f473-1f3ff\",21,49,23],\n    \"1f477-200d-2642-fe0f\":[\"1f477\",22,28,23],\n    \"1f477-1f3fb-200d-2642-fe0f\":[\"1f477-1f3fb\",22,29,23],\n    \"1f477-1f3fc-200d-2642-fe0f\":[\"1f477-1f3fc\",22,30,23],\n    \"1f477-1f3fd-200d-2642-fe0f\":[\"1f477-1f3fd\",22,31,23],\n    \"1f477-1f3fe-200d-2642-fe0f\":[\"1f477-1f3fe\",22,32,23],\n    \"1f477-1f3ff-200d-2642-fe0f\":[\"1f477-1f3ff\",22,33,23],\n    \"1f481-200d-2640-fe0f\":[\"1f481\",23,13,23],\n    \"1f481-1f3fb-200d-2640-fe0f\":[\"1f481-1f3fb\",23,14,23],\n    \"1f481-1f3fc-200d-2640-fe0f\":[\"1f481-1f3fc\",23,15,23],\n    \"1f481-1f3fd-200d-2640-fe0f\":[\"1f481-1f3fd\",23,16,23],\n    \"1f481-1f3fe-200d-2640-fe0f\":[\"1f481-1f3fe\",23,17,23],\n    \"1f481-1f3ff-200d-2640-fe0f\":[\"1f481-1f3ff\",23,18,23],\n    \"1f482-200d-2642-fe0f\":[\"1f482\",23,31,23],\n    \"1f482-1f3fb-200d-2642-fe0f\":[\"1f482-1f3fb\",23,32,23],\n    \"1f482-1f3fc-200d-2642-fe0f\":[\"1f482-1f3fc\",23,33,23],\n    \"1f482-1f3fd-200d-2642-fe0f\":[\"1f482-1f3fd\",23,34,23],\n    \"1f482-1f3fe-200d-2642-fe0f\":[\"1f482-1f3fe\",23,35,23],\n    \"1f482-1f3ff-200d-2642-fe0f\":[\"1f482-1f3ff\",23,36,23],\n    \"1f486-200d-2640-fe0f\":[\"1f486\",24,10,23],\n    \"1f486-1f3fb-200d-2640-fe0f\":[\"1f486-1f3fb\",24,11,23],\n    \"1f486-1f3fc-200d-2640-fe0f\":[\"1f486-1f3fc\",24,12,23],\n    \"1f486-1f3fd-200d-2640-fe0f\":[\"1f486-1f3fd\",24,13,23],\n    \"1f486-1f3fe-200d-2640-fe0f\":[\"1f486-1f3fe\",24,14,23],\n    \"1f486-1f3ff-200d-2640-fe0f\":[\"1f486-1f3ff\",24,15,23],\n    \"1f487-200d-2640-fe0f\":[\"1f487\",24,28,23],\n    \"1f487-1f3fb-200d-2640-fe0f\":[\"1f487-1f3fb\",24,29,23],\n    \"1f487-1f3fc-200d-2640-fe0f\":[\"1f487-1f3fc\",24,30,23],\n    \"1f487-1f3fd-200d-2640-fe0f\":[\"1f487-1f3fd\",24,31,23],\n    \"1f487-1f3fe-200d-2640-fe0f\":[\"1f487-1f3fe\",24,32,23],\n    \"1f487-1f3ff-200d-2640-fe0f\":[\"1f487-1f3ff\",24,33,23],\n    \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468\":[\"1f48f\",24,41,23],\n    \"1f469-200d-2764-fe0f-200d-1f468\":[\"1f491\",24,43,23],\n    \"1f575-fe0f-200d-2642-fe0f\":[\"1f575\",29,11,7],\n    \"1f575-1f3fb-200d-2642-fe0f\":[\"1f575-1f3fb\",29,12,7],\n    \"1f575-1f3fc-200d-2642-fe0f\":[\"1f575-1f3fc\",29,13,7],\n    \"1f575-1f3fd-200d-2642-fe0f\":[\"1f575-1f3fd\",29,14,7],\n    \"1f575-1f3fe-200d-2642-fe0f\":[\"1f575-1f3fe\",29,15,7],\n    \"1f575-1f3ff-200d-2642-fe0f\":[\"1f575-1f3ff\",29,16,7],\n    \"1f645-200d-2640-fe0f\":[\"1f645\",32,1,23],\n    \"1f645-1f3fb-200d-2640-fe0f\":[\"1f645-1f3fb\",32,2,23],\n    \"1f645-1f3fc-200d-2640-fe0f\":[\"1f645-1f3fc\",32,3,23],\n    \"1f645-1f3fd-200d-2640-fe0f\":[\"1f645-1f3fd\",32,4,23],\n    \"1f645-1f3fe-200d-2640-fe0f\":[\"1f645-1f3fe\",32,5,23],\n    \"1f645-1f3ff-200d-2640-fe0f\":[\"1f645-1f3ff\",32,6,23],\n    \"1f646-200d-2640-fe0f\":[\"1f646\",32,19,23],\n    \"1f646-1f3fb-200d-2640-fe0f\":[\"1f646-1f3fb\",32,20,23],\n    \"1f646-1f3fc-200d-2640-fe0f\":[\"1f646-1f3fc\",32,21,23],\n    \"1f646-1f3fd-200d-2640-fe0f\":[\"1f646-1f3fd\",32,22,23],\n    \"1f646-1f3fe-200d-2640-fe0f\":[\"1f646-1f3fe\",32,23,23],\n    \"1f646-1f3ff-200d-2640-fe0f\":[\"1f646-1f3ff\",32,24,23],\n    \"1f647-200d-2642-fe0f\":[\"1f647\",32,37,23],\n    \"1f647-1f3fb-200d-2642-fe0f\":[\"1f647-1f3fb\",32,38,23],\n    \"1f647-1f3fc-200d-2642-fe0f\":[\"1f647-1f3fc\",32,39,23],\n    \"1f647-1f3fd-200d-2642-fe0f\":[\"1f647-1f3fd\",32,40,23],\n    \"1f647-1f3fe-200d-2642-fe0f\":[\"1f647-1f3fe\",32,41,23],\n    \"1f647-1f3ff-200d-2642-fe0f\":[\"1f647-1f3ff\",32,42,23],\n    \"1f64b-200d-2640-fe0f\":[\"1f64b\",33,6,23],\n    \"1f64b-1f3fb-200d-2640-fe0f\":[\"1f64b-1f3fb\",33,7,23],\n    \"1f64b-1f3fc-200d-2640-fe0f\":[\"1f64b-1f3fc\",33,8,23],\n    \"1f64b-1f3fd-200d-2640-fe0f\":[\"1f64b-1f3fd\",33,9,23],\n    \"1f64b-1f3fe-200d-2640-fe0f\":[\"1f64b-1f3fe\",33,10,23],\n    \"1f64b-1f3ff-200d-2640-fe0f\":[\"1f64b-1f3ff\",33,11,23],\n    \"1f64d-200d-2640-fe0f\":[\"1f64d\",33,30,23],\n    \"1f64d-1f3fb-200d-2640-fe0f\":[\"1f64d-1f3fb\",33,31,23],\n    \"1f64d-1f3fc-200d-2640-fe0f\":[\"1f64d-1f3fc\",33,32,23],\n    \"1f64d-1f3fd-200d-2640-fe0f\":[\"1f64d-1f3fd\",33,33,23],\n    \"1f64d-1f3fe-200d-2640-fe0f\":[\"1f64d-1f3fe\",33,34,23],\n    \"1f64d-1f3ff-200d-2640-fe0f\":[\"1f64d-1f3ff\",33,35,23],\n    \"1f64e-200d-2640-fe0f\":[\"1f64e\",33,48,23],\n    \"1f64e-1f3fb-200d-2640-fe0f\":[\"1f64e-1f3fb\",33,49,23],\n    \"1f64e-1f3fc-200d-2640-fe0f\":[\"1f64e-1f3fc\",33,50,23],\n    \"1f64e-1f3fd-200d-2640-fe0f\":[\"1f64e-1f3fd\",33,51,23],\n    \"1f64e-1f3fe-200d-2640-fe0f\":[\"1f64e-1f3fe\",34,0,23],\n    \"1f64e-1f3ff-200d-2640-fe0f\":[\"1f64e-1f3ff\",34,1,23],\n    \"1f6a3-200d-2642-fe0f\":[\"1f6a3\",35,3,23],\n    \"1f6a3-1f3fb-200d-2642-fe0f\":[\"1f6a3-1f3fb\",35,4,7],\n    \"1f6a3-1f3fc-200d-2642-fe0f\":[\"1f6a3-1f3fc\",35,5,7],\n    \"1f6a3-1f3fd-200d-2642-fe0f\":[\"1f6a3-1f3fd\",35,6,7],\n    \"1f6a3-1f3fe-200d-2642-fe0f\":[\"1f6a3-1f3fe\",35,7,7],\n    \"1f6a3-1f3ff-200d-2642-fe0f\":[\"1f6a3-1f3ff\",35,8,7],\n    \"1f6b4-200d-2642-fe0f\":[\"1f6b4\",35,37,23],\n    \"1f6b4-1f3fb-200d-2642-fe0f\":[\"1f6b4-1f3fb\",35,38,23],\n    \"1f6b4-1f3fc-200d-2642-fe0f\":[\"1f6b4-1f3fc\",35,39,23],\n    \"1f6b4-1f3fd-200d-2642-fe0f\":[\"1f6b4-1f3fd\",35,40,23],\n    \"1f6b4-1f3fe-200d-2642-fe0f\":[\"1f6b4-1f3fe\",35,41,23],\n    \"1f6b4-1f3ff-200d-2642-fe0f\":[\"1f6b4-1f3ff\",35,42,23],\n    \"1f6b5-200d-2642-fe0f\":[\"1f6b5\",36,3,23],\n    \"1f6b5-1f3fb-200d-2642-fe0f\":[\"1f6b5-1f3fb\",36,4,23],\n    \"1f6b5-1f3fc-200d-2642-fe0f\":[\"1f6b5-1f3fc\",36,5,23],\n    \"1f6b5-1f3fd-200d-2642-fe0f\":[\"1f6b5-1f3fd\",36,6,23],\n    \"1f6b5-1f3fe-200d-2642-fe0f\":[\"1f6b5-1f3fe\",36,7,23],\n    \"1f6b5-1f3ff-200d-2642-fe0f\":[\"1f6b5-1f3ff\",36,8,23],\n    \"1f6b6-200d-2642-fe0f\":[\"1f6b6\",36,21,23],\n    \"1f6b6-1f3fb-200d-2642-fe0f\":[\"1f6b6-1f3fb\",36,22,23],\n    \"1f6b6-1f3fc-200d-2642-fe0f\":[\"1f6b6-1f3fc\",36,23,23],\n    \"1f6b6-1f3fd-200d-2642-fe0f\":[\"1f6b6-1f3fd\",36,24,23],\n    \"1f6b6-1f3fe-200d-2642-fe0f\":[\"1f6b6-1f3fe\",36,25,23],\n    \"1f6b6-1f3ff-200d-2642-fe0f\":[\"1f6b6-1f3ff\",36,26,23],\n    \"1f9d6-200d-2642-fe0f\":[\"1f9d6\",43,40,15],\n    \"1f9d6-1f3fb-200d-2642-fe0f\":[\"1f9d6-1f3fb\",43,41,15],\n    \"1f9d6-1f3fc-200d-2642-fe0f\":[\"1f9d6-1f3fc\",43,42,15],\n    \"1f9d6-1f3fd-200d-2642-fe0f\":[\"1f9d6-1f3fd\",43,43,15],\n    \"1f9d6-1f3fe-200d-2642-fe0f\":[\"1f9d6-1f3fe\",43,44,15],\n    \"1f9d6-1f3ff-200d-2642-fe0f\":[\"1f9d6-1f3ff\",43,45,15],\n    \"1f9d7-200d-2640-fe0f\":[\"1f9d7\",44,6,15],\n    \"1f9d7-1f3fb-200d-2640-fe0f\":[\"1f9d7-1f3fb\",44,7,15],\n    \"1f9d7-1f3fc-200d-2640-fe0f\":[\"1f9d7-1f3fc\",44,8,15],\n    \"1f9d7-1f3fd-200d-2640-fe0f\":[\"1f9d7-1f3fd\",44,9,15],\n    \"1f9d7-1f3fe-200d-2640-fe0f\":[\"1f9d7-1f3fe\",44,10,15],\n    \"1f9d7-1f3ff-200d-2640-fe0f\":[\"1f9d7-1f3ff\",44,11,15],\n    \"1f9d8-200d-2640-fe0f\":[\"1f9d8\",44,24,15],\n    \"1f9d8-1f3fb-200d-2640-fe0f\":[\"1f9d8-1f3fb\",44,25,15],\n    \"1f9d8-1f3fc-200d-2640-fe0f\":[\"1f9d8-1f3fc\",44,26,15],\n    \"1f9d8-1f3fd-200d-2640-fe0f\":[\"1f9d8-1f3fd\",44,27,15],\n    \"1f9d8-1f3fe-200d-2640-fe0f\":[\"1f9d8-1f3fe\",44,28,15],\n    \"1f9d8-1f3ff-200d-2640-fe0f\":[\"1f9d8-1f3ff\",44,29,15],\n    \"1f9d9-200d-2640-fe0f\":[\"1f9d9\",44,42,15],\n    \"1f9d9-1f3fb-200d-2640-fe0f\":[\"1f9d9-1f3fb\",44,43,15],\n    \"1f9d9-1f3fc-200d-2640-fe0f\":[\"1f9d9-1f3fc\",44,44,15],\n    \"1f9d9-1f3fd-200d-2640-fe0f\":[\"1f9d9-1f3fd\",44,45,15],\n    \"1f9d9-1f3fe-200d-2640-fe0f\":[\"1f9d9-1f3fe\",44,46,15],\n    \"1f9d9-1f3ff-200d-2640-fe0f\":[\"1f9d9-1f3ff\",44,47,15],\n    \"1f9da-200d-2640-fe0f\":[\"1f9da\",45,8,15],\n    \"1f9da-1f3fb-200d-2640-fe0f\":[\"1f9da-1f3fb\",45,9,7],\n    \"1f9da-1f3fc-200d-2640-fe0f\":[\"1f9da-1f3fc\",45,10,7],\n    \"1f9da-1f3fd-200d-2640-fe0f\":[\"1f9da-1f3fd\",45,11,7],\n    \"1f9da-1f3fe-200d-2640-fe0f\":[\"1f9da-1f3fe\",45,12,7],\n    \"1f9da-1f3ff-200d-2640-fe0f\":[\"1f9da-1f3ff\",45,13,7],\n    \"1f9db-200d-2640-fe0f\":[\"1f9db\",45,26,15],\n    \"1f9db-1f3fb-200d-2640-fe0f\":[\"1f9db-1f3fb\",45,27,7],\n    \"1f9db-1f3fc-200d-2640-fe0f\":[\"1f9db-1f3fc\",45,28,7],\n    \"1f9db-1f3fd-200d-2640-fe0f\":[\"1f9db-1f3fd\",45,29,7],\n    \"1f9db-1f3fe-200d-2640-fe0f\":[\"1f9db-1f3fe\",45,30,7],\n    \"1f9db-1f3ff-200d-2640-fe0f\":[\"1f9db-1f3ff\",45,31,7],\n    \"1f9dc-200d-2642-fe0f\":[\"1f9dc\",45,44,15],\n    \"1f9dc-1f3fb-200d-2642-fe0f\":[\"1f9dc-1f3fb\",45,45,15],\n    \"1f9dc-1f3fc-200d-2642-fe0f\":[\"1f9dc-1f3fc\",45,46,15],\n    \"1f9dc-1f3fd-200d-2642-fe0f\":[\"1f9dc-1f3fd\",45,47,15],\n    \"1f9dc-1f3fe-200d-2642-fe0f\":[\"1f9dc-1f3fe\",45,48,15],\n    \"1f9dc-1f3ff-200d-2642-fe0f\":[\"1f9dc-1f3ff\",45,49,15],\n    \"1f9dd-200d-2642-fe0f\":[\"1f9dd\",46,10,15],\n    \"1f9dd-1f3fb-200d-2642-fe0f\":[\"1f9dd-1f3fb\",46,11,15],\n    \"1f9dd-1f3fc-200d-2642-fe0f\":[\"1f9dd-1f3fc\",46,12,15],\n    \"1f9dd-1f3fd-200d-2642-fe0f\":[\"1f9dd-1f3fd\",46,13,15],\n    \"1f9dd-1f3fe-200d-2642-fe0f\":[\"1f9dd-1f3fe\",46,14,15],\n    \"1f9dd-1f3ff-200d-2642-fe0f\":[\"1f9dd-1f3ff\",46,15,15],\n    \"1f9de-200d-2642-fe0f\":[\"1f9de\",46,18,15],\n    \"1f9df-200d-2642-fe0f\":[\"1f9df\",46,21,15],\n    \"26f9-fe0f-200d-2642-fe0f\":[\"26f9\",49,6,7],\n    \"26f9-1f3fb-200d-2642-fe0f\":[\"26f9-1f3fb\",49,7,7],\n    \"26f9-1f3fc-200d-2642-fe0f\":[\"26f9-1f3fc\",49,8,7],\n    \"26f9-1f3fd-200d-2642-fe0f\":[\"26f9-1f3fd\",49,9,7],\n    \"26f9-1f3fe-200d-2642-fe0f\":[\"26f9-1f3fe\",49,10,7],\n    \"26f9-1f3ff-200d-2642-fe0f\":[\"26f9-1f3ff\",49,11,7]\n  };\n\n\n  // export\n  if (typeof exports !== 'undefined'){\n    if (typeof module !== 'undefined' && module.exports){\n      exports = module.exports = emoji;\n    }\n    exports.EmojiConvertor = emoji;\n  }else if (typeof define === 'function' && define.amd){\n    define(function() { return emoji; });\n  }else{\n    root.EmojiConvertor = emoji;\n  }\n\n}).call(function(){\n  return this || (typeof window !== 'undefined' ? window : global);\n}());\n"
  },
  {
    "path": "src/static/sass/_emojiPicker.scss",
    "content": ".emoji-mart,\n.emoji-mart * {\n  box-sizing: border-box;\n  line-height: 1.15;\n}\n\n.emoji-mart {\n  font-family: -apple-system, BlinkMacSystemFont, \"Helvetica Neue\", sans-serif;\n  font-size: 16px;\n  display: inline-block;\n  color: #222427;\n  border: 1px solid #d9d9d9;\n  border-radius: 5px;\n  background: #fff;\n  position: absolute;\n  bottom: 95px;\n  z-index: 94;\n}\n\n.emoji-mart .emoji-mart-emoji {\n  padding: 6px;\n}\n\n.emoji-mart-bar {\n  border: 0 solid #d9d9d9;\n  background-color: #f9f9f9;\n}\n.emoji-mart-bar:first-child {\n  border-bottom-width: 1px;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 5px;\n}\n.emoji-mart-bar:last-child {\n  border-top-width: 1px;\n  border-bottom-left-radius: 5px;\n  border-bottom-right-radius: 5px;\n}\n\n.emoji-mart-anchors {\n  display: flex;\n  justify-content: space-between;\n  padding: 0 6px;\n  color: #858585;\n  line-height: 0;\n}\n\n.emoji-mart-anchor {\n  position: relative;\n  flex: 1;\n  text-align: center;\n  padding: 12px 4px;\n  overflow: hidden;\n  transition: color .1s ease-out;\n}\n\n.emoji-mart-anchor:hover,\n.emoji-mart-anchor-selected {\n  color: #000000;\n}\n\n.emoji-mart-anchor-selected .emoji-mart-anchor-bar {\n  bottom: 0;\n  background-color: #ff0000 !important;\n}\n\n.emoji-mart-anchor-bar {\n  position: absolute;\n  bottom: -3px; left: 0;\n  width: 100%; height: 3px;\n}\n\n.emoji-mart-anchors i {\n  display: inline-block;\n  width: 100%;\n  max-width: 22px;\n}\n\n.emoji-mart-anchors svg {\n  fill: currentColor;\n  max-height: 18px;\n}\n\n.emoji-mart-scroll {\n  overflow-y: scroll;\n  height: 270px;\n  padding: 0 6px 6px 6px;\n}\n\n.emoji-mart-search {\n  margin-top: 6px;\n  padding: 0 6px;\n}\n.emoji-mart-search input {\n  font-size: 16px;\n  display: block;\n  width: 100%;\n  padding: .2em .6em;\n  border-radius: 25px;\n  border: 1px solid #d9d9d9;\n  outline: 0;\n}\n\n.emoji-mart-category .emoji-mart-emoji span {\n  z-index: 1;\n  position: relative;\n  text-align: center;\n  cursor: pointer;\n}\n\n .emoji-mart-category .emoji-mart-emoji:hover:before {\n  z-index: 0;\n  content: \"\";\n  position: absolute;\n  top: 0; left: 0;\n  width: 100%; height: 100%;\n  background-color: #f4f4f4;\n  border-radius: 100%;\n}\n\n.emoji-mart-category-label {\n   z-index: 2;\n   position: relative;\n  position: -webkit-sticky;\n   position: sticky;\n   top: 0;\n}\n\n.emoji-mart-category-label {\n  display: block;\n  width: 100%;\n  font-weight: 500;\n  padding: 5px 6px;\n  background-color: #fff;\n  background-color: rgba(255, 255, 255, .95);\n}\n\n.emoji-mart-emoji {\n  position: relative;\n  display: inline-block;\n  font-size: 0;\n  cursor: pointer;\n}\n\n.emoji-mart-no-results {\n  font-size: 14px;\n  text-align: center;\n  padding-top: 70px;\n  color: #858585;\n}\n.emoji-mart-no-results .emoji-mart-category-label {\n  display: none;\n}\n.emoji-mart-no-results .emoji-mart-no-results-label {\n  margin-top: .2em;\n}\n.emoji-mart-no-results .emoji-mart-emoji:hover:before {\n  content: none;\n}\n\n.emoji-mart-preview {\n  position: relative;\n  height: 70px;\n}\n\n.emoji-mart-preview-emoji,\n.emoji-mart-preview-data,\n.emoji-mart-preview-skins {\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n\n.emoji-mart-preview-emoji {\n  left: 12px;\n}\n\n.emoji-mart-preview-data {\n  left: 68px; right: 12px;\n  word-break: break-all;\n}\n\n.emoji-mart-preview-skins {\n  right: 30px;\n  text-align: right;\n}\n\n.emoji-mart-preview-name {\n  font-size: 14px;\n}\n\n.emoji-mart-preview-shortname {\n  font-size: 12px;\n  color: #888;\n}\n.emoji-mart-preview-shortname + .emoji-mart-preview-shortname,\n.emoji-mart-preview-shortname + .emoji-mart-preview-emoticon,\n.emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon {\n  margin-left: .5em;\n}\n\n.emoji-mart-preview-emoticon {\n  font-size: 11px;\n  color: #bbb;\n}\n\n.emoji-mart-title span {\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.emoji-mart-title .emoji-mart-emoji {\n  padding: 0;\n}\n\n.emoji-mart-title-label {\n  color: #999A9C;\n  font-size: 26px;\n  font-weight: 300;\n}\n\n.emoji-mart-skin-swatches {\n  font-size: 0;\n  padding: 2px 0;\n  border: 1px solid #d9d9d9;\n  border-radius: 12px;\n  background-color: #fff;\n}\n\n.emoji-mart-skin-swatches-opened .emoji-mart-skin-swatch {\n  width: 16px;\n  padding: 0 2px;\n}\n\n.emoji-mart-skin-swatches-opened .emoji-mart-skin-swatch-selected:after {\n  opacity: .75;\n}\n\n.emoji-mart-skin-swatch {\n  display: inline-block;\n  width: 0;\n  vertical-align: middle;\n  transition-property: width, padding;\n  transition-duration: .125s;\n  transition-timing-function: ease-out;\n}\n\n.emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s }\n.emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s }\n.emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s }\n.emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s }\n.emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s }\n.emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s }\n\n.emoji-mart-skin-swatch-selected {\n  position: relative;\n  width: 16px;\n  padding: 0 2px;\n}\n.emoji-mart-skin-swatch-selected:after {\n  content: \"\";\n  position: absolute;\n  top: 50%; left: 50%;\n  width: 4px; height: 4px;\n  margin: -2px 0 0 -2px;\n  background-color: #fff;\n  border-radius: 100%;\n  pointer-events: none;\n  opacity: 0;\n  transition: opacity .2s ease-out;\n}\n\n.emoji-mart-skin {\n  display: inline-block;\n  width: 100%; padding-top: 100%;\n  max-width: 12px;\n  border-radius: 100%;\n}\n\n.emoji-mart-skin-tone-1 { background-color: #ffc93a }\n.emoji-mart-skin-tone-2 { background-color: #fadcbc }\n.emoji-mart-skin-tone-3 { background-color: #e0bb95 }\n.emoji-mart-skin-tone-4 { background-color: #bf8f68 }\n.emoji-mart-skin-tone-5 { background-color: #9b643d }\n.emoji-mart-skin-tone-6 { background-color: #594539 }\n"
  },
  {
    "path": "src/static/sass/_layout.scss",
    "content": "html, body {\n  /* iOS viewport bug fix (bottom of screen covered by control bar) */\n  /* CSS var `--vh` set in JS; see `src/utils/vh_fix.js` */\n  min-height: 100vh;\n  min-height: fill-available;\n  min-height: calc(var(--vh, 1vh) * 100);\n  height: 100vh;\n  height: fill-available;\n  height: calc(var(--vh, 1vh) * 100);\n}\n\nhtml, body, ul {\n  padding: 0;\n  margin: 0; }\n\nbody {\n  color: #222;\n  font-size: 16px;\n  font-family: 'Lato', sans-serif;\n}\n\n// Desktop - Max height & width\n@media (min-width: 768px) {\n  #page {\n    display: flex;\n    flex-direction: row;\n    max-width: 100vw;\n    max-height: calc(var(--vh, 1vh) * 100);\n  }\n}\n\n// Mobile - Max & min height\n@media (max-width: 767px) {\n  #page {\n    display: flex;\n    flex-direction: column;\n    max-height: calc(var(--vh, 1vh) * 100);\n    min-height: calc(var(--vh, 1vh) * 100);\n  }\n}\n\n$funky-purple: #663399;\n\n\n.encloser {\n  display: flex;\n  flex-direction: row;\n}\n\n@media (max-width: 768px) {\n  .encloser {\n    flex-direction: column;\n  }\n}\n\n// HEADER - mobile settings\nheader {\n  display: flex;\n  background-color: $base-color;\n  color: #fff;\n  padding: 10px 10px 5px;\n  flex-direction: row;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  min-height: fit-content;\n\n  .users-icon {\n    order: -1;\n    flex-grow: 1;\n    svg {\n      cursor: pointer;\n    }\n  }\n\n  .users-list {\n    flex: 0 1 100%;\n\n    ul {\n      \n      list-style-type: none;\n      li {\n        svg {\n          float: left;\n        }\n      }\n    }\n\n    .invite-users {\n      margin-top: 15px;\n\n      button {\n        color: white;\n        border: solid 1px white;\n        border-radius: 5px;\n      }\n    }\n  }\n\n  .logo-container {\n    display: flex;\n    justify-content: space-between;\n    flex-grow: 1;\n  }\n\n  .logo {\n    text-align: center;\n    font-size: 24px;\n    font-weight: bold;\n  }\n\n  .settings {}\n}\n\n// HEADER - desktop settings\n@media (min-width: 768px) {\n  header {\n    flex: 1;\n    display: inline-flex;\n    max-width: 306px;\n    flex-direction: column;\n    justify-content: start;\n    height: calc(var(--vh, 1vh) * 100);\n\n    .logo-container {\n      margin-bottom: 15px;\n      order: -1;\n      flex-grow: 0;\n    }\n\n    .settings {\n      float: right;\n      margin-top: 3px;\n      margin-left: auto;\n      cursor: pointer;\n    }\n\n    .info {\n      float: left;\n    }\n\n    .users-icon {\n      display: none;\n    }\n\n    .users-list {\n      flex-grow: 0;\n      flex: none;\n      display: block !important;\n\n      ul {\n        \n        li {\n          margin-bottom: 1px;\n          word-wrap: break-word;\n        }\n      }\n    }\n  }\n  .modal-header {\n    border-bottom: none;\n  }\n  .message {\n    display: flex;\n    flex-direction: row;\n  }\n  .form-control {\n    flex-grow: 2;\n  }\n  .emoji-picker-icon {\n    cursor: pointer;\n  }\n\n  .form-label {\n    font-weight: bold;\n  }\n}\n\n.modal-content a {\n  color: $funky-purple;\n}\n\n// Sharing overlay - desktop settings\n@media (min-width: 768px) {\n  .share-copy-link {\n    .current-href {\n      width: 60%;\n    }\n  }\n}\n\n// Sharing overlay - mobile settings\n@media (max-width: 999px) {\n  .share-copy-link {\n    .current-href {\n      width: 100%;\n      border-radius: 7px !important;\n      margin-bottom: 5px;\n    }\n    .icon-button {\n      display: flex;\n      flex-direction: row;\n      justify-content: center;\n      align-items: center;\n      border-radius: 7px !important;\n      width: 100%;\n    }\n  }\n}\n\n// MAIN - mobile settings\nmain {\n\n  display: flex;\n  flex-grow: 1;\n  max-width: 100vw;\n\n  .content {\n    display: flex;\n    flex-direction: column;\n    flex-grow: 1;\n    position: relative;\n\n    .message-list {\n      padding: 0 15px;\n    }\n\n    .message-form {\n      padding: 5px;\n      background-color: white;\n      border-top: solid 1px #ccc;\n      margin-top: auto;\n\n      .message {\n        display: flex;\n\n        textarea {\n          /* this font-size disables zooming\n          on mobile safari, which breaks layout */\n          font-size: 16px;\n        }\n      }\n\n      button {\n        border: none;\n        padding: 5px;\n        float: right;\n        height: 54px;\n        vertical-align: bottom;\n        margin-left: 5px;\n\n        i {\n          color: #1e202f;\n        }\n      }\n    }\n  } // end .content\n} // end main\n\n.message-box,\n.search-results {\n  // scroll with flexbox needs revisiting\n  // for now, message box is viewport height\n  // less display height of message form\n  // + display height of header\n  //\n  // 157px is a magic number -- and one that works well on 2 desktop\n  // browsers, the Android native app (Capacitor), and the Android\n  // emulator.  We need to explicitly set the heights set more heights\n  // of things to avoid the magic number, methinks. --@elimisteve\n  height: calc(var(--vh, 1vh) * 100 - 157px - var(--androidTopBar, 0));\n  overflow-y: scroll;\n  padding-top: 5px;\n\n  ul {\n    margin-top: 10px;\n\n    li.chat-message {\n      display: inline-block;\n      border: solid 1px #aaa;\n      border-radius: 10px;\n      padding: 5px 10px;\n      margin-bottom: 6px;\n      width: 90%;\n      word-wrap: break-word;\n      box-shadow: 2px 1px 2px #aaa, -1px 0 1px #aaa;\n\n      .username {\n        display: block;\n        font-weight: bold;\n        font-size: 0.85em;\n      }\n\n      p {\n        margin: 0 0 3px;\n      }\n\n      &.chat-outgoing {\n        float: right;\n        color: white;\n        background-color: $funky-purple;\n\n        p {\n          margin: 2px 0;\n        }\n\n        .username {\n          display: none;\n        }\n\n        a {\n          text-decoration: underline;\n          color: white;\n        }\n\n        a:hover {\n          color: #ddd;\n        }\n      }\n\n      &.chat-incoming {\n        float: left;\n        color: #333;\n      }\n\n      ul {\n        list-style-type: disc;\n        margin-left: 20px;\n      }\n\n      img[src^='/static/img/emoji'] {\n        width: 24px;\n        height: 24px;\n        display: inline-block;\n        background-size: 100%;\n        vertical-align: bottom;\n      }\n    }\n  }\n}\n\n.search-results {\n  height: auto;\n  max-height: calc(var(--vh, 1vh) * 50);\n  padding-right: 10px;\n}\n\n\n// MAIN - desktop settings\n@media (min-width: 768px) {\n  main {\n    display: inline-flex;\n    flex: 1;\n    flex-direction: row;\n    justify-content: start;\n    height: calc(var(--vh, 1vh) * 100);\n    width: 50vw !important;\n\n    .content {\n      max-width: 100%;\n      .message-box{\n        // scroll with flexbox needs revisiting\n        // for now, message box is viewport height\n        // less display height of message form\n        height: calc(var(--vh, 1vh) * 100 - 70px);\n        box-shadow: inset 2px 2px 2px #aaa;\n      }\n    }\n  }\n}\n\n// Alert styles, overrides default bootstrap\n// styles for positioning\n.alert-container {\n  position: absolute;\n  top: 5px;\n  left: 10px;\n  right: 10px;\n  font-size: 14px;\n  z-index: 10;\n\n  .alert {\n\n\n    &.alert-dismissable {\n      .close {\n        right: auto;\n      }\n    }\n  }\n}\n\n// Info Positioning relative to Logo\n#logo-info {\n  display: inherit;\n  .info {\n    padding-left: 10px;\n    svg {\n      vertical-align: top;\n      cursor: pointer;\n    }\n  }\n}\n\n.search-results {\n  ul {\n    li.chat-message {\n    }\n  }\n}\n\n.icon-button {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: none;\n  }\n\n  svg {\n    margin: 0 6px;\n  }\n}\n\n\n// Cursor effect over Settings button\n.settings {\n  svg {\n    cursor: pointer;\n  }\n}\n\n// Override Bootstrap default\n.btn-primary,\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary:visited {\n  background-color: $funky-purple !important;\n  border-color: $funky-purple !important;\n}\n\n// Allows textarea to be dynamic instead of static\ntextarea {\n  box-sizing: border-box !important;\n  max-height: 40vh !important;\n  width: 100% !important;\n}\n\n// All widths\n.chat-icons {\n  display: flex;\n  flex-direction: row;\n  margin-bottom: 5px;\n  width: 100%;\n  padding-left: 5px;\n  gap: 10px;\n\n  .sharing,\n  .toggle-audio,\n  .open-message-search {\n    cursor: pointer;\n  }\n}\n.chat-icons .right-chat-icons {\n  display: flex;\n  flex-direction: row;\n  height: 100%;\n  margin-left: auto;\n}\n.right-chat-icons .delete-all-msgs {\n  display: flex;\n  flex-direction: row;\n  background-color: #c00;\n  color: white;\n}\n.delete-all-msgs:hover {\n  background-color: #e00;\n}\n"
  },
  {
    "path": "src/static/sass/_suggestions.scss",
    "content": ".suggestions-container {\n  left: 12px;\n  top: auto;\n  bottom: 95px;\n  width: 94%;\n  border: 1px solid #ccc;\n  border-bottom: none;\n  z-index: 100094;\n  position: absolute;\n  border-radius: 5px;\n  background: #fff;\n  ul {\n    overflow-y: scroll;\n    max-height: 40vh;\n    list-style-type: none;\n  }\n  img {\n    width: 20px;\n    margin-right: 5px;\n  }\n  li {\n    cursor: pointer;\n    padding: 3px;\n    font-size: 15px;\n  }\n  li:hover {\n    background-color: rgba(35, 154, 220, .5);\n  }\n  .active {\n    background-color: rgba(35, 154, 220, .5);\n  }\n  ::-webkit-scrollbar-track {\n    background-color: rgba(128, 128, 128, .5);\n  }\n}\n.suggestions-header {\n  border-bottom: 1px solid #ccc;\n  padding: 5px 10px 4px;\n  color: #7F7F83;\n  font-size: 14px;\n  background: #FaF8F6;\n  overflow: hidden;\n}\n.header-help {\n  float: right;\n}\n.inline-margin {\n  margin: auto 1rem;\n}\n::-webkit-scrollbar {\n  -webkit-appearance: none;\n  width: 7px;\n}\n::-webkit-scrollbar-thumb {\n  border-radius: 4px;\n  background-color: rgba(0, 0, 0, .5);\n  -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n}\n"
  },
  {
    "path": "src/static/sass/_variables.scss",
    "content": "$base-color: #111;\n"
  },
  {
    "path": "src/static/sass/main.scss",
    "content": "@import 'variables';\n@import 'layout';\n@import 'emojiPicker';\n@import 'suggestions';\n"
  },
  {
    "path": "src/store/actions/alertActions.js",
    "content": "export const ALERT_DISPLAY = 'ALERT_DISPLAY';\nexport const ALERT_DISMISS = 'ALERT_DISMISS';\n\nexport const alertSuccess = (message, alertRenderSeconds) =>\n  ({ type: ALERT_DISPLAY, style: 'success', message, alertRenderSeconds });\n\nexport const alertWarning = (message, alertRenderSeconds) =>\n  ({ type: ALERT_DISPLAY, style: 'warning', message, alertRenderSeconds });\n\nexport const alertDanger = (message, alertRenderSeconds) =>\n  ({ type: ALERT_DISPLAY, style: 'danger', message, alertRenderSeconds });\n\nexport const dismissAlert = () => \n  ({ type: ALERT_DISMISS });\n"
  },
  {
    "path": "src/store/actions/chatActions.js",
    "content": "\nexport const CHAT_INIT_CHAT = 'CHAT_INIT_CHAT';\nexport const CHAT_INIT_CONNECTION = 'CHAT_INIT_CONNECTION';\nexport const CHAT_DISCONNECTED = 'CHAT_DISCONNECTED';\nexport const CHAT_CONNECTION_INITIATED = 'CHAT_CONNECTION_INITIATED';\nexport const CHAT_SEND_MESSAGE = 'CHAT_SEND_MESSAGE';\nexport const CHAT_MESSAGE_SENT = 'CHAT_MESSAGE_SENT';\nexport const CHAT_ADD_MESSAGE = 'CHAT_ADD_MESSAGE';\nexport const CHAT_SET_USER_STATUS = 'CHAT_SET_USER_STATUS';\nexport const CHAT_USER_STATUS_SENT = 'CHAT_USER_STATUS_SENT';\nexport const CHAT_SET_USERNAME = 'CHAT_SET_USERNAME';\nexport const CHAT_USERNAME_SET = 'CHAT_USERNAME_SET';\n\nexport const initChat = () => ({ type: CHAT_INIT_CHAT });\n\nexport const initConnection = (createDeviceSession, urlHash ) =>\n  ({ type: CHAT_INIT_CONNECTION, createDeviceSession, urlHash });\n\nexport const disconnected = () =>\n  ({ type: CHAT_DISCONNECTED });\n\nexport const connectionInitiated = () =>\n  ({ type: CHAT_CONNECTION_INITIATED });\n\nexport const sendMessage = ({ message, username }) =>\n  ({ type: CHAT_SEND_MESSAGE, message, username });\n\nexport const messageSent = () =>\n  ({ type: CHAT_MESSAGE_SENT });\n\nexport const addMessage = ({ key, fromUsername, maybeSenderId, message }) =>\n  ({ type: CHAT_ADD_MESSAGE, key, fromUsername, maybeSenderId, message });\n\nexport const setUserStatus = ({ username, status }) =>\n  ({ type: CHAT_SET_USER_STATUS, username, status });\n\nexport const userStatusSent = () =>\n  ({ type: CHAT_USER_STATUS_SENT });\n\nexport const setUsername = (username) =>\n  ({ type: CHAT_SET_USERNAME, username });\n\nexport const usernameSet = (username) =>\n  ({ type: CHAT_USERNAME_SET, username });\n\nexport const messageUpdate = (message) =>\n  ({ type: 'CHAT_MESSAGE_UPDATE', message: message });\n\nexport const clearMessage = () =>\n  ({ type: 'CHAT_MESSAGE_CLEAR' });\n\nexport const togglePicker = () =>\n  ({ type: 'CHAT_TOGGLE_PICKER' });\n\nexport const addEmoji = (emoji, selectionStart) =>\n  ({ type: 'CHAT_ADD_EMOJI', emoji, selectionStart });\n\nexport const closePicker = () =>\n  ({ type: 'CHAT_CLOSE_PICKER' });\n\nexport const startSuggestions = (cursorIndex, filterSuggestions, list) =>\n  ({ type: 'CHAT_START_SUGGESTIONS', cursorIndex, filterSuggestions, list });\n\nexport const showSuggestions = (cursorIndex, value, filterSuggestions, list) =>\n  ({ type: 'CHAT_SHOW_SUGGESTIONS', suggestions: filterSuggestions(cursorIndex, value, list) });\n\nexport const addSuggestion = (suggestion) =>\n  ({ type: 'CHAT_ADD_SUGGESTION', suggestion });\n\nexport const stopSuggestions = () =>\n  ({ type: 'CHAT_STOP_SUGGESTIONS' });\n\nexport const downSuggestion = () =>\n  ({ type: 'CHAT_DOWN_SUGGESTION' });\n\nexport const upSuggestion = () =>\n  ({ type: 'CHAT_UP_SUGGESTION' });\n"
  },
  {
    "path": "src/store/actions/settingsActions.js",
    "content": "export const ENABLE_AUDIO = 'ENABLE_AUDIO';\nexport const DISABLE_AUDIO = 'DISABLE_AUDIO';\n\nexport const enableAudio = () =>\n  ({ type: ENABLE_AUDIO, isAudioEnabled: true });\n\nexport const disableAudio = () =>\n  ({ type: DISABLE_AUDIO, isAudioEnabled: false });"
  },
  {
    "path": "src/store/epics/chatEpics.js",
    "content": "\nimport {\n  CHAT_SET_USERNAME,\n  CHAT_INIT_CONNECTION,\n  CHAT_INIT_CHAT,\n  CHAT_SEND_MESSAGE,\n  connectionInitiated,\n  disconnected,\n  addMessage,\n  messageSent,\n  setUserStatus,\n  userStatusSent,\n  usernameSet,\n  showSuggestions,\n  stopSuggestions\n} from '../actions/chatActions';\n\nimport {\n  alertSuccess,\n  alertWarning\n} from '../actions/alertActions';\n\nimport { getPassphrase, getEmail } from '../../utils/encrypter';\nimport miniLock from '../../utils/miniLock';\n\nimport { USER_STATUS_DELAY_MS } from '../../constants/messaging';\nimport { persistUsername } from '../reducers/helpers/deviceState';\n\nimport ChatHandler from './helpers/ChatHandler';\nimport { combineEpics } from 'redux-observable';\nimport createDetectVisibilityObservable from './helpers/createDetectPageVisibilityObservable';\n\nimport { authUrl, wsUrl } from './helpers/urls';\n\nexport const chatHandler = new ChatHandler(wsUrl);\n\nimport { Observable } from 'rxjs/Observable';\nimport { ajax } from 'rxjs/observable/dom/ajax';\nimport 'rxjs/add/operator/partition';\nimport 'rxjs/add/operator/mergeMap';\nimport 'rxjs/add/operator/delay';\nimport 'rxjs/add/operator/throttleTime';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/operator/mapTo';\nimport 'rxjs/add/operator/catch';\nimport 'rxjs/add/operator/do';\nimport 'rxjs/add/operator/retry';\nimport 'rxjs/add/operator/pluck';\nimport 'rxjs/add/operator/filter';\nimport 'rxjs/add/operator/retryWhen';\nimport 'rxjs/add/observable/of';\nimport 'rxjs/add/observable/from';\nimport 'rxjs/add/observable/fromEvent';\nimport 'rxjs/add/observable/merge';\nimport 'rxjs/add/observable/if';\nimport 'rxjs/add/operator/takeUntil';\n\nconst messageEpic = (action$) =>\n  action$.ofType('CHAT_START_SUGGESTIONS')\n    .mergeMap(({ cursorIndex, filterSuggestions, list }) => {\n      return action$.ofType('CHAT_MESSAGE_UPDATE')\n        .map((msg) => showSuggestions(cursorIndex, msg.message, filterSuggestions, list))\n        .takeUntil(action$.ofType('CHAT_STOP_SUGGESTIONS'))\n        .catch((err) => console.error(err));\n    });\n\nconst suggestionEpic = (action$) =>\n  action$.ofType('CHAT_ADD_SUGGESTION')\n    .map(() => stopSuggestions())\n    .catch((err) => console.error(err));\n\nfunction createKeyPairObservable({ createDeviceSession, urlHash }) {\n  return Observable.create(function (observer) {\n    // 1. Get passphrase\n    const {\n      passphrase,\n      isNewPassphrase\n    } = getPassphrase(urlHash);\n\n    // 2. Get email based on passphrase\n    let email = getEmail(passphrase);\n    // 3. Decrypt to get key pair\n    miniLock.crypto.getKeyPair(passphrase, email, (keyPair) => {\n      miniLock.session.keys = keyPair;\n      miniLock.session.keyPairReady = true;\n      let mID = miniLock.crypto.getMiniLockID(keyPair.publicKey);\n      \n      // 4. When we have keypair, login on device:\n      if (isNewPassphrase) {\n        createDeviceSession(passphrase);\n      }\n\n      observer.next({ passphrase, keyPair, mID, isNewRoom: isNewPassphrase });\n      observer.complete();\n    });\n  });\n}\n\nfunction createDecryptMessageObservable({ message, mID, secretKey }) {\n  return Observable.create(function (observer) {\n    miniLock.crypto.decryptFile(message, mID, secretKey,\n      function (fileBlob, saveName, senderID) {\n        const reader = new FileReader();\n        reader.addEventListener(\"loadend\", () => {\n          const authToken = reader.result;\n          observer.next(authToken);\n          observer.complete();\n        });\n\n        reader.readAsText(fileBlob);\n      });\n  });\n}\n\nfunction getAuthRequestSettings({ mID }) {\n  const settings = {\n    url: authUrl,\n    responseType: 'blob',\n    headers: {\n      'X-Minilock-Id': mID\n    },\n    method: 'GET'\n  };\n  return settings;\n}\n\nconst connectionAlertTtlSeconds = 4;\n\nconst initConnectionEpic = (action$) =>\n  action$.ofType(CHAT_INIT_CONNECTION)\n    .mergeMap(createKeyPairObservable)\n    .mergeMap(({ keyPair, mID, isNewRoom, passphrase }) =>\n      ajax(getAuthRequestSettings({ mID }))\n        .map(ajaxResult => ({\n          message: ajaxResult.response,\n          mID,\n          secretKey: keyPair.secretKey\n        }))\n        .mergeMap(createDecryptMessageObservable)\n        .mergeMap(authToken =>\n          chatHandler.initConnection({\n            authToken,\n            secretKey: keyPair.secretKey,\n            mID\n          })\n        )\n        .mergeMap(() =>\n          Observable.merge(\n            chatHandler.getMessageSubject()\n              .map(addMessage),\n\n            chatHandler.getUserStatusSubject()\n              .map(setUserStatus),\n\n            Observable.of(\n              connectionInitiated(),\n              alertSuccess(\n                `${isNewRoom ? 'New room created.' : ''} Connected to server.`,\n                connectionAlertTtlSeconds\n              )\n            )\n          )\n        ).catch(error => {\n          console.error(error);\n          return Observable.from([\n            alertWarning('Lost connection to chat server. Trying to reconnect...'),\n            disconnected()\n          ]);\n        })\n    )\n    .catch(error => {\n      console.error(error);\n      return Observable.from([\n        alertWarning('Something went wrong when initiating. Trying again...'),\n        disconnected()\n      ]);\n    });\n\nconst setUsernameEpic = (action$, store) =>\n  action$.ofType(CHAT_SET_USERNAME)\n    .filter(action => action.username && !store.getState().chat.paranoidMode)\n    .mergeMap(action =>\n      Observable.of(action.username)\n        .do(username => {\n          const ttl = USER_STATUS_DELAY_MS / 1000;\n          chatHandler.sendUserStatus(username, 'viewing', ttl);\n        })\n        .retryWhen(error => error.delay(500))\n        .do(() => persistUsername(action.username))\n    )\n    .map(username => usernameSet(username));\n\nconst ownUserStatusEpic = (action$, store) =>\n  action$.ofType(CHAT_INIT_CHAT)\n    .mergeMap(() =>\n      createDetectVisibilityObservable()\n        .throttleTime(USER_STATUS_DELAY_MS)\n        .filter(() => store.getState().chat.username)\n        .do(status => {\n          const ttl = USER_STATUS_DELAY_MS / 1000;\n          const { chat: { username } } = store.getState();\n          chatHandler.sendUserStatus(username, status, ttl);\n        })\n        .map(() => userStatusSent())\n    )\n    .catch(error => {\n      console.error(error);\n      return Observable.of(alertWarning('Error sending user status.'));\n    });\n\nconst sendMessageEpic = action$ =>\n  action$.ofType(CHAT_SEND_MESSAGE)\n    .mergeMap(action =>\n\n      Observable.of(action)\n        .do(action => {\n          chatHandler.sendMessage(action.message, action.username);\n        })\n        .retryWhen(error => error.delay(1000))\n    )\n    .map(() => messageSent())\n    .catch(error => {\n      console.error(error);\n      return Observable.of(alertWarning('Error sending message.'));\n    });\n\nexport default combineEpics(\n  setUsernameEpic,\n  ownUserStatusEpic,\n  initConnectionEpic,\n  sendMessageEpic,\n  messageEpic,\n  suggestionEpic\n);\n"
  },
  {
    "path": "src/store/epics/helpers/ChatHandler.js",
    "content": "import atob from 'atob';\nimport btoa from 'btoa';\nimport guid from 'guid';\nimport miniLock from '../../../utils/miniLock';\nimport { nowUTC } from '../../../utils/time';\nimport { extractMessageMetadata } from '../../../utils/chat';\nimport { Subject } from 'rxjs/Subject';\nimport { Observable } from 'rxjs/Observable';\n\nimport 'rxjs/add/operator/mergeMap';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/operator/mapTo';\nimport 'rxjs/add/operator/catch';\nimport 'rxjs/add/operator/do';\nimport 'rxjs/add/observable/of';\nimport 'rxjs/add/observable/from';\nimport 'rxjs/add/observable/throw';\n\nclass ChatHandler {\n\n  constructor(wsUrl) {\n    this.wsUrl = wsUrl;\n    this.wsMessageSubject = null;\n    this.wsUserStatusSubject = null;\n  }\n\n  onWsClose = (event) => {\n    console.error('Websocket got close event', event);\n    this.wsMessageSubject.error(new Error('The websocket connection was closed!'));\n  };\n\n  onWsError = (event) => {\n    console.error('Websocket got error event', event);\n    this.wsMessageSubject.error(new Error('Error occurred on websocket connection!'));\n  };\n\n  onWsMessage = (event) => {\n    const data = JSON.parse(event.data);\n    if (data && data.ephemeral && data.ephemeral.length && data.ephemeral.length > 0) {\n      Observable.from(data.ephemeral)\n        .mergeMap(ephemeral =>\n          this.createDecryptEphemeralObservable({ ephemeral, mID: this.mID, secretKey: this.secretKey }))\n        .mergeMap(this.resolveIncomingMessageTypeObservable)\n        .catch(error => console.error('An error occurred in ChatHandler', error))\n        .subscribe();\n    }\n    if (data && data.from_server) {\n      if (data.from_server.all_messages_deleted) {\n        alert(\"All messages deleted from server! (Refresh this page to remove them from this browser tab.)\");\n      }\n    }\n  };\n\n  resolveIncomingMessageTypeObservable = (message) => {\n    if (message.meta.isChatMessage) {\n\n      const reader = new FileReader();\n      const chatMessageObservable =\n        Observable.fromEvent(reader, 'loadend')\n          .pluck('target', 'result')\n          .map(JSON.parse)\n          .do(contents => {\n            this.wsMessageSubject.next({\n              id: guid.create(),\n              fromUsername: message.meta.from,\n              maybeSenderId: message.maybeSenderId,\n              message: contents.msg\n            });\n          });\n\n      reader.readAsText(message.fileBlob);\n\n      return chatMessageObservable;\n\n    } else if (message.meta.isUserStatus) {\n\n      return Observable.of({\n        username: message.meta.from,\n        status: message.meta.status,\n        created: nowUTC()\n      }).do(status => this.wsUserStatusSubject.next(status));\n\n    } else {\n      return Observable.throw(new Error('Unrecognized data with type ' + message.tags.type));\n    }\n  };\n\n  createDecryptEphemeralObservable = ({ ephemeral, mID, secretKey }) => {\n    return Observable.create(function (observer) {\n      const binStr = atob(ephemeral);\n      const binStrLength = binStr.length;\n      const array = new Uint8Array(binStrLength);\n\n      for (let i = 0; i < binStrLength; i++) {\n        array[i] = binStr.charCodeAt(i);\n      }\n      const msg = new Blob([array], { type: 'application/octet-stream' });\n      miniLock.crypto.decryptFile(msg,\n        mID,\n        secretKey,\n        (fileBlob, saveName, senderID) => {\n\n          const tags = saveName.split('|||');\n          const meta = extractMessageMetadata(tags);\n\n          let maybeSenderId = '';\n          if (senderID !== this.mID) {\n            maybeSenderId = ' (' + senderID + ')';\n          }\n\n          observer.next({ fileBlob, saveName, meta, senderID, maybeSenderId });\n        });\n\n    });\n  };\n\n  send({ contents = {}, tags, ttl = 0 }) {\n    if (!this.ws) {\n      throw new Error('WebSocket connection not initialized!');\n    }\n    if (this.ws.readyState !== WebSocket.OPEN) {\n      throw new Error('WebSocket connection is initializing and is not open yet!');\n    }\n\n    const saveName = tags.join('|||');\n    const fileBlob = new Blob([JSON.stringify(contents)], { type: 'application/json' });\n    fileBlob.name = saveName;\n\n    const mID = this.mID;\n    const secretKey = this.secretKey;\n    miniLock.crypto.encryptFile(fileBlob, saveName, [mID],\n      mID,\n      secretKey,\n      this.sendMessageToServer.bind(this, ttl));\n  }\n\n  sendMessage(message, username) {\n    const contents = {\n      msg: message,\n      from: username,\n      type: 'chatmessage'\n    };\n    const tags = ['from:' + username, 'type:chatmessage'];\n    this.send({ contents, tags });\n  }\n\n  sendUserStatus = (username, status, ttl) => {\n    const tags = ['from:' + username, 'type:userstatus', 'status:' + status];\n    this.send({ tags, ttl });\n  };\n\n  sendDeleteAllMessagesSignalToServer = () => {\n    const msgForServer = {\n      to_server: {\n        delete_all_messages: true\n      }\n    };\n    this.ws.send(JSON.stringify(msgForServer));\n  };\n\n  sendMessageToServer = (ttl_secs, fileBlob, saveName, senderMinilockID) => {\n    const reader = new FileReader();\n    reader.addEventListener(\"loadend\", () => {\n      // From https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string#comment55137593_11562550\n      const b64encMinilockFile = btoa([].reduce.call(\n        new Uint8Array(reader.result),\n        function (p, c) {\n          return p + String.fromCharCode(c);\n        }, ''));\n\n      const msgForServer = {\n        ephemeral: [b64encMinilockFile]\n      };\n      if (ttl_secs > 0) {\n        msgForServer.to_server = {\n          ttl_secs: ttl_secs\n        };\n      }\n      this.ws.send(JSON.stringify(msgForServer));\n    });\n    reader.readAsArrayBuffer(fileBlob);\n  };\n\n  initConnectionNew = ({ mID, secretKey, authToken, isNewRoom }) => {\n    this.mID = mID;\n    this.secretKey = secretKey;\n    this.authToken = authToken;\n    this.wsMessageSubject = new Subject();\n    this.wsUserStatusSubject = new Subject();\n\n    return Observable.create(observer => {\n      this.ws = new WebSocket(this.wsUrl);\n      this.ws.onclose = this.onWsClose;\n      this.ws.onerror = this.onWsError;\n      this.ws.onmessage = this.onWsMessage;\n      this.ws.onopen = (event) => {\n        event.target.send(this.authToken);\n        observer.next(isNewRoom);\n        observer.complete();\n      };\n\n    });\n  };\n\n  initConnection = ({ mID, secretKey, authToken }) => {\n    this.mID = mID;\n    this.secretKey = secretKey;\n    this.authToken = authToken;\n    this.wsMessageSubject = new Subject();\n    this.wsUserStatusSubject = new Subject();\n\n    return Observable.create(observer => {\n      this.ws = new WebSocket(this.wsUrl);\n      this.ws.onclose = this.onWsClose;\n      this.ws.onerror = this.onWsError;\n      this.ws.onmessage = this.onWsMessage;\n      this.ws.onopen = (event) => {\n        event.target.send(this.authToken);\n        observer.next();\n        observer.complete();\n      };\n\n    });\n  };\n\n  cleanUp = () => {\n    this.wsMessageSubject.complete();\n    this.wsMessageSubject = null;\n    this.wsUserStatusSubject.complete();\n    this.wsUserStatusSubject = null;\n    this.ws.close();\n    this.ws = null;\n    this.mID = null;\n    this.secretKey = null;\n    this.authToken = null;\n  };\n\n  getMessageSubject = () => {\n    return this.wsMessageSubject;\n  };\n\n  getUserStatusSubject = () => {\n    return this.wsUserStatusSubject;\n  };\n\n}\n\nexport default ChatHandler;\n"
  },
  {
    "path": "src/store/epics/helpers/createDetectPageVisibilityObservable.js",
    "content": "import { Observable } from 'rxjs/Observable';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/observable/fromEvent';\nimport 'rxjs/add/observable/merge';\nimport 'rxjs/add/observable/of';\n\nexport default function createDetectPageVisibilityObservable() {\n\n  if (typeof document === \"undefined\") {\n    // make non-web versions a no-op for now\n    return new Observable((subscriber) => {\n      subscriber.next();\n      subscriber.complete();\n    });\n  }\n\n  let hiddenKeyName, visibilityChangeEventName;\n  if (typeof document.hidden !== \"undefined\") { // Opera 12.10 and Firefox 18 and later support\n    hiddenKeyName = \"hidden\";\n    visibilityChangeEventName = \"visibilitychange\";\n  } else if (typeof document.msHidden !== \"undefined\") {\n    hiddenKeyName = \"msHidden\";\n    visibilityChangeEventName = \"msvisibilitychange\";\n  } else if (typeof document.webkitHidden !== \"undefined\") {\n    hiddenKeyName = \"webkitHidden\";\n    visibilityChangeEventName = \"webkitvisibilitychange\";\n  }\n\n  const detectPageVisibilityObservable = Observable.merge(\n    Observable.fromEvent(document, visibilityChangeEventName)\n      .map(() => {\n        if (document[hiddenKeyName]) {\n          return 'online';\n        } else {\n          return 'viewing';\n        }\n      })\n  );\n\n  return detectPageVisibilityObservable;\n}\n"
  },
  {
    "path": "src/store/epics/helpers/urls.js",
    "content": "\nlet hostname;\nif (typeof window.location !== \"undefined\") {\n  hostname = window.location.origin;\n} else {\n  // hard-coded for mobile device scenarios\n  hostname = \"http://locahost:8080\";\n}\n\nexport const authUrl = `${hostname}/api/login`;\n\nconst wsHostname = hostname.replace('http', 'ws');\n\nexport const wsUrl = `${wsHostname}/api/ws/messages/all`;"
  },
  {
    "path": "src/store/epics/index.js",
    "content": "import { combineEpics } from 'redux-observable';\nimport chatEpics from './chatEpics';\n\nexport default combineEpics(\n  chatEpics\n);\n"
  },
  {
    "path": "src/store/reducers/alertReducer.js",
    "content": "import {\n  ALERT_DISPLAY,\n  ALERT_DISMISS\n} from '../actions/alertActions';\n\n\nconst initialState = {\n  alertMessage: '',\n  alertStyle: '',\n  alertRenderSeconds: 0,\n};\n\nfunction alertReducer(state = initialState, action) {\n\n  switch (action.type) {\n  case ALERT_DISPLAY:\n    return {\n      alertMessage: action.message,\n      alertStyle: action.style,\n      alertRenderSeconds: action?.alertRenderSeconds,\n    };\n\n  case ALERT_DISMISS:\n    return initialState;\n\n  default:\n    return state;\n  }\n}\n\nexport default alertReducer;\n"
  },
  {
    "path": "src/store/reducers/chatReducer.js",
    "content": "import {\n  CHAT_INIT_CONNECTION,\n  CHAT_CONNECTION_INITIATED,\n  CHAT_DISCONNECTED,\n  CHAT_ADD_MESSAGE,\n  CHAT_SET_USER_STATUS,\n  CHAT_USERNAME_SET\n} from '../actions/chatActions';\n\nimport { PARANOID_USERNAME } from '../../constants/messaging';\n\nimport {\n  getPersistedUsername,\n  getIsParanoidMode,\n  getIsPincodeRequired\n} from './helpers/deviceState';\n\nconst paranoidMode = getIsParanoidMode();\nconst pincodeRequired = getIsPincodeRequired();\nconst previousUsername = getPersistedUsername();\n\nconst initialState = {\n  connecting: false,\n  connected: false,\n  shouldConnect: true,\n  pincodeRequired,\n  paranoidMode,\n  username: paranoidMode ? PARANOID_USERNAME : '',\n  previousUsername: previousUsername,\n  status: '',\n  messages: [],\n  statuses: {},\n  message: '',\n  showEmojiPicker: false,\n  suggestionStart: null,\n  suggestions: [],\n  suggestionWord: '',\n  highlightedSuggestion: null\n};\n\nfunction chatReducer(state = initialState, action) {\n\n\n  switch (action.type) {\n\n  case CHAT_INIT_CONNECTION:\n    return Object.assign({}, state, {\n      messages: [],\n      connecting: true,\n      connected: false,\n      shouldConnect: false,\n      pincodeRequired: false,\n      ready: false\n    });\n\n  case CHAT_CONNECTION_INITIATED:\n    return Object.assign({}, state, {\n      connecting: false,\n      connected: true,\n      shouldConnect: false,\n    });\n\n  case CHAT_DISCONNECTED:\n    return Object.assign({}, state, {\n      connecting: false,\n      connected: false,\n      shouldConnect: true,\n      ready: false\n    });\n\n  case CHAT_ADD_MESSAGE:\n    return Object.assign({}, state, {\n      messages: [...state.messages, {\n        key: action.key,\n        from: action.fromUsername,\n        msg: action.message\n      }],\n      suggestionStart: null,\n      suggestions: []\n    });\n\n  case CHAT_SET_USER_STATUS:\n    return Object.assign({}, state, {\n      statuses: Object.assign({}, state.statuses, { [action.username]: action.status })\n    });\n\n  case CHAT_USERNAME_SET:\n    return Object.assign({}, state, {\n      username: state.paranoidMode ? PARANOID_USERNAME : action.username,\n      status: 'viewing',\n      previousUsername: ''\n    });\n\n  case 'CHAT_MESSAGE_UPDATE':\n    return Object.assign({}, state, {\n      message: action.message\n    });\n\n  case 'CHAT_MESSAGE_CLEAR':\n    return Object.assign({}, state, {\n      message: ''\n    });\n\n  case 'CHAT_TOGGLE_PICKER':\n    return Object.assign({}, state, {\n      showEmojiPicker: !state.showEmojiPicker\n    });\n\n  case 'CHAT_ADD_EMOJI':\n    const beforeEmoji = state.message.slice(0, action.selectionStart);\n    const afterEmoji = state.message.slice(action.selectionStart);\n    return Object.assign({}, state, {\n      showEmojiPicker: false,\n      message: beforeEmoji + action.emoji + ' ' + afterEmoji\n    });\n\n  case 'CHAT_CLOSE_PICKER':\n    return Object.assign({}, state, {\n      showEmojiPicker: false\n    });\n\n  case 'CHAT_START_SUGGESTIONS':\n    return Object.assign({}, state, {\n      suggestionStart: action.cursorIndex\n    });\n\n  case 'CHAT_SHOW_SUGGESTIONS':\n    return  action.suggestions ? Object.assign({}, state, {\n      suggestions: action.suggestions.slice(0, 25) || [],\n      suggestionWord: state.message.slice(state.suggestionStart),\n      highlightedSuggestion: 0\n    }) : state;\n\n  case 'CHAT_ADD_SUGGESTION':\n    const beforeSuggestion = state.message.slice(0, state.suggestionStart);\n    const afterSuggestion = state.message.slice(state.suggestionStart);\n    const formattedSuggestion = afterSuggestion.replace(state.suggestionWord, action.suggestion + ' ');\n    return Object.assign({}, state, {\n      message: beforeSuggestion + formattedSuggestion,\n      suggestionWord: action.suggestion\n    });\n\n  case 'CHAT_STOP_SUGGESTIONS':\n    return Object.assign({}, state, {\n      suggestionStart: null,\n      suggestions: []\n    });\n\n  case 'CHAT_DOWN_SUGGESTION':\n    return Object.assign({}, state, {\n      highlightedSuggestion: state.suggestions[state.highlightedSuggestion + 1]\n        ? ++state.highlightedSuggestion\n        : 0\n    });\n\n  case 'CHAT_UP_SUGGESTION':\n    return Object.assign({}, state, {\n      highlightedSuggestion: state.suggestions[state.highlightedSuggestion - 1]\n        ? --state.highlightedSuggestion\n        : state.suggestions.length - 1\n    });\n\n  default:\n    return state;\n  }\n}\n\nexport default chatReducer;\n"
  },
  {
    "path": "src/store/reducers/helpers/deviceState.js",
    "content": "import { USERNAME_KEY } from \"../../../constants/messaging\";\n\n\nexport const persistUsername = (username) => {\n  if (typeof localStorage !== \"undefined\"){\n    localStorage.setItem(USERNAME_KEY, username);\n  }\n};\n\nexport const getPersistedUsername = () => {\n  if (typeof localStorage !== \"undefined\"){\n    return localStorage.getItem(USERNAME_KEY) || '';\n  }\n  return '';\n};\n\nexport const getIsParanoidMode = () => {\n  if (typeof document !== \"undefined\"){\n    return document.location.hash.endsWith('----') || false;\n  }\n  return false;\n};\n\nexport const getIsPincodeRequired = () => {\n  if (typeof document !== \"undefined\") {\n    return document.location.hash.endsWith('--') || false;\n  }\n  return false;\n};\n"
  },
  {
    "path": "src/store/reducers/index.js",
    "content": "import { combineReducers } from 'redux';\nimport chatReducer from './chatReducer';\nimport alertReducer from './alertReducer';\nimport settingsReducer from './settingsReducer';\n\nexport default combineReducers({\n  chat: chatReducer,\n  alert: alertReducer,\n  settings: settingsReducer,\n});\n"
  },
  {
    "path": "src/store/reducers/settingsReducer.js",
    "content": "import {\n  ENABLE_AUDIO,\n  DISABLE_AUDIO,\n} from '../actions/settingsActions';\n\n\nconst initialState = {\n  // Default to false on initial render so audio doesn't attempt to play before \n  // user interacts with page (which triggers console.error)\n  isAudioEnabled: false\n};\n\nfunction settingsReducer(state = initialState, action) {\n\n  switch (action.type) {\n  case ENABLE_AUDIO:\n    localStorage.setItem(\"isAudioEnabled\", action.isAudioEnabled);\n    return {\n      isAudioEnabled: action.isAudioEnabled\n    };\n\n  case DISABLE_AUDIO:\n    localStorage.setItem(\"isAudioEnabled\", action.isAudioEnabled);\n    return {\n      isAudioEnabled: action.isAudioEnabled\n    };\n\n  default:\n    return state;\n  }\n}\n\nexport default settingsReducer;\n"
  },
  {
    "path": "src/utils/audio.js",
    "content": "export function playNotification(){\n  document.getElementById('notification-audio').play();\n}\n"
  },
  {
    "path": "src/utils/chat.js",
    "content": "import { tagByPrefix, tagByPrefixStripped, parseJSON, sortRowByCreated } from './tags';\n\nexport function extractMessageMetadata(tags) {\n  return {\n    isChatMessage: tags.indexOf('type:chatmessage') !== -1,\n    isUserStatus: tags.indexOf('type:userstatus') !== -1,\n    isPicture: tags.indexOf('type:picture') !== -1,\n    isRoomName: tags.indexOf('type:roomname') !== -1,\n    isRoomDescription: tags.indexOf('type:roomdescription') !== -1,\n    from: tagByPrefixStripped(tags, 'from:'),\n    to: tagByPrefixStripped(tags, 'to:'),\n    status: tagByPrefixStripped(tags, 'status:')\n  };\n}\n"
  },
  {
    "path": "src/utils/crypto/nacl.js",
    "content": "import crypto from 'crypto';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\n/* jshint newcap: false */\n\nconst nacl = {};\n\nvar gf = function (init) {\n  var i, r = new Float64Array(16);\n  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n  return r;\n};\n\n//  Pluggable, initialized in high-level API below.\nvar randombytes = function (/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n  gf1 = gf([1]),\n  _121665 = gf([0xdb41, 1]),\n  D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n  D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n  X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n  Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n  I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n  x[i] = (h >> 24) & 0xff;\n  x[i + 1] = (h >> 16) & 0xff;\n  x[i + 2] = (h >> 8) & 0xff;\n  x[i + 3] = h & 0xff;\n  x[i + 4] = (l >> 24) & 0xff;\n  x[i + 5] = (l >> 16) & 0xff;\n  x[i + 6] = (l >> 8) & 0xff;\n  x[i + 7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n  var i, d = 0;\n  for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i];\n  return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n  return vn(x, xi, y, yi, 16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n  return vn(x, xi, y, yi, 32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n  var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24,\n    j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24,\n    j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24,\n    j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24,\n    j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24,\n    j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24,\n    j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24,\n    j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24,\n    j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24,\n    j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24,\n    j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24,\n    j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24,\n    j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24,\n    j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24,\n    j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24,\n    j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24;\n\n  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n    x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n    x15 = j15, u;\n\n  for (var i = 0; i < 20; i += 2) {\n    u = x0 + x12 | 0;\n    x4 ^= u << 7 | u >>> (32 - 7);\n    u = x4 + x0 | 0;\n    x8 ^= u << 9 | u >>> (32 - 9);\n    u = x8 + x4 | 0;\n    x12 ^= u << 13 | u >>> (32 - 13);\n    u = x12 + x8 | 0;\n    x0 ^= u << 18 | u >>> (32 - 18);\n\n    u = x5 + x1 | 0;\n    x9 ^= u << 7 | u >>> (32 - 7);\n    u = x9 + x5 | 0;\n    x13 ^= u << 9 | u >>> (32 - 9);\n    u = x13 + x9 | 0;\n    x1 ^= u << 13 | u >>> (32 - 13);\n    u = x1 + x13 | 0;\n    x5 ^= u << 18 | u >>> (32 - 18);\n\n    u = x10 + x6 | 0;\n    x14 ^= u << 7 | u >>> (32 - 7);\n    u = x14 + x10 | 0;\n    x2 ^= u << 9 | u >>> (32 - 9);\n    u = x2 + x14 | 0;\n    x6 ^= u << 13 | u >>> (32 - 13);\n    u = x6 + x2 | 0;\n    x10 ^= u << 18 | u >>> (32 - 18);\n\n    u = x15 + x11 | 0;\n    x3 ^= u << 7 | u >>> (32 - 7);\n    u = x3 + x15 | 0;\n    x7 ^= u << 9 | u >>> (32 - 9);\n    u = x7 + x3 | 0;\n    x11 ^= u << 13 | u >>> (32 - 13);\n    u = x11 + x7 | 0;\n    x15 ^= u << 18 | u >>> (32 - 18);\n\n    u = x0 + x3 | 0;\n    x1 ^= u << 7 | u >>> (32 - 7);\n    u = x1 + x0 | 0;\n    x2 ^= u << 9 | u >>> (32 - 9);\n    u = x2 + x1 | 0;\n    x3 ^= u << 13 | u >>> (32 - 13);\n    u = x3 + x2 | 0;\n    x0 ^= u << 18 | u >>> (32 - 18);\n\n    u = x5 + x4 | 0;\n    x6 ^= u << 7 | u >>> (32 - 7);\n    u = x6 + x5 | 0;\n    x7 ^= u << 9 | u >>> (32 - 9);\n    u = x7 + x6 | 0;\n    x4 ^= u << 13 | u >>> (32 - 13);\n    u = x4 + x7 | 0;\n    x5 ^= u << 18 | u >>> (32 - 18);\n\n    u = x10 + x9 | 0;\n    x11 ^= u << 7 | u >>> (32 - 7);\n    u = x11 + x10 | 0;\n    x8 ^= u << 9 | u >>> (32 - 9);\n    u = x8 + x11 | 0;\n    x9 ^= u << 13 | u >>> (32 - 13);\n    u = x9 + x8 | 0;\n    x10 ^= u << 18 | u >>> (32 - 18);\n\n    u = x15 + x14 | 0;\n    x12 ^= u << 7 | u >>> (32 - 7);\n    u = x12 + x15 | 0;\n    x13 ^= u << 9 | u >>> (32 - 9);\n    u = x13 + x12 | 0;\n    x14 ^= u << 13 | u >>> (32 - 13);\n    u = x14 + x13 | 0;\n    x15 ^= u << 18 | u >>> (32 - 18);\n  }\n  x0 = x0 + j0 | 0;\n  x1 = x1 + j1 | 0;\n  x2 = x2 + j2 | 0;\n  x3 = x3 + j3 | 0;\n  x4 = x4 + j4 | 0;\n  x5 = x5 + j5 | 0;\n  x6 = x6 + j6 | 0;\n  x7 = x7 + j7 | 0;\n  x8 = x8 + j8 | 0;\n  x9 = x9 + j9 | 0;\n  x10 = x10 + j10 | 0;\n  x11 = x11 + j11 | 0;\n  x12 = x12 + j12 | 0;\n  x13 = x13 + j13 | 0;\n  x14 = x14 + j14 | 0;\n  x15 = x15 + j15 | 0;\n\n  o[0] = x0 >>> 0 & 0xff;\n  o[1] = x0 >>> 8 & 0xff;\n  o[2] = x0 >>> 16 & 0xff;\n  o[3] = x0 >>> 24 & 0xff;\n\n  o[4] = x1 >>> 0 & 0xff;\n  o[5] = x1 >>> 8 & 0xff;\n  o[6] = x1 >>> 16 & 0xff;\n  o[7] = x1 >>> 24 & 0xff;\n\n  o[8] = x2 >>> 0 & 0xff;\n  o[9] = x2 >>> 8 & 0xff;\n  o[10] = x2 >>> 16 & 0xff;\n  o[11] = x2 >>> 24 & 0xff;\n\n  o[12] = x3 >>> 0 & 0xff;\n  o[13] = x3 >>> 8 & 0xff;\n  o[14] = x3 >>> 16 & 0xff;\n  o[15] = x3 >>> 24 & 0xff;\n\n  o[16] = x4 >>> 0 & 0xff;\n  o[17] = x4 >>> 8 & 0xff;\n  o[18] = x4 >>> 16 & 0xff;\n  o[19] = x4 >>> 24 & 0xff;\n\n  o[20] = x5 >>> 0 & 0xff;\n  o[21] = x5 >>> 8 & 0xff;\n  o[22] = x5 >>> 16 & 0xff;\n  o[23] = x5 >>> 24 & 0xff;\n\n  o[24] = x6 >>> 0 & 0xff;\n  o[25] = x6 >>> 8 & 0xff;\n  o[26] = x6 >>> 16 & 0xff;\n  o[27] = x6 >>> 24 & 0xff;\n\n  o[28] = x7 >>> 0 & 0xff;\n  o[29] = x7 >>> 8 & 0xff;\n  o[30] = x7 >>> 16 & 0xff;\n  o[31] = x7 >>> 24 & 0xff;\n\n  o[32] = x8 >>> 0 & 0xff;\n  o[33] = x8 >>> 8 & 0xff;\n  o[34] = x8 >>> 16 & 0xff;\n  o[35] = x8 >>> 24 & 0xff;\n\n  o[36] = x9 >>> 0 & 0xff;\n  o[37] = x9 >>> 8 & 0xff;\n  o[38] = x9 >>> 16 & 0xff;\n  o[39] = x9 >>> 24 & 0xff;\n\n  o[40] = x10 >>> 0 & 0xff;\n  o[41] = x10 >>> 8 & 0xff;\n  o[42] = x10 >>> 16 & 0xff;\n  o[43] = x10 >>> 24 & 0xff;\n\n  o[44] = x11 >>> 0 & 0xff;\n  o[45] = x11 >>> 8 & 0xff;\n  o[46] = x11 >>> 16 & 0xff;\n  o[47] = x11 >>> 24 & 0xff;\n\n  o[48] = x12 >>> 0 & 0xff;\n  o[49] = x12 >>> 8 & 0xff;\n  o[50] = x12 >>> 16 & 0xff;\n  o[51] = x12 >>> 24 & 0xff;\n\n  o[52] = x13 >>> 0 & 0xff;\n  o[53] = x13 >>> 8 & 0xff;\n  o[54] = x13 >>> 16 & 0xff;\n  o[55] = x13 >>> 24 & 0xff;\n\n  o[56] = x14 >>> 0 & 0xff;\n  o[57] = x14 >>> 8 & 0xff;\n  o[58] = x14 >>> 16 & 0xff;\n  o[59] = x14 >>> 24 & 0xff;\n\n  o[60] = x15 >>> 0 & 0xff;\n  o[61] = x15 >>> 8 & 0xff;\n  o[62] = x15 >>> 16 & 0xff;\n  o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o, p, k, c) {\n  var j0 = c[0] & 0xff | (c[1] & 0xff) << 8 | (c[2] & 0xff) << 16 | (c[3] & 0xff) << 24,\n    j1 = k[0] & 0xff | (k[1] & 0xff) << 8 | (k[2] & 0xff) << 16 | (k[3] & 0xff) << 24,\n    j2 = k[4] & 0xff | (k[5] & 0xff) << 8 | (k[6] & 0xff) << 16 | (k[7] & 0xff) << 24,\n    j3 = k[8] & 0xff | (k[9] & 0xff) << 8 | (k[10] & 0xff) << 16 | (k[11] & 0xff) << 24,\n    j4 = k[12] & 0xff | (k[13] & 0xff) << 8 | (k[14] & 0xff) << 16 | (k[15] & 0xff) << 24,\n    j5 = c[4] & 0xff | (c[5] & 0xff) << 8 | (c[6] & 0xff) << 16 | (c[7] & 0xff) << 24,\n    j6 = p[0] & 0xff | (p[1] & 0xff) << 8 | (p[2] & 0xff) << 16 | (p[3] & 0xff) << 24,\n    j7 = p[4] & 0xff | (p[5] & 0xff) << 8 | (p[6] & 0xff) << 16 | (p[7] & 0xff) << 24,\n    j8 = p[8] & 0xff | (p[9] & 0xff) << 8 | (p[10] & 0xff) << 16 | (p[11] & 0xff) << 24,\n    j9 = p[12] & 0xff | (p[13] & 0xff) << 8 | (p[14] & 0xff) << 16 | (p[15] & 0xff) << 24,\n    j10 = c[8] & 0xff | (c[9] & 0xff) << 8 | (c[10] & 0xff) << 16 | (c[11] & 0xff) << 24,\n    j11 = k[16] & 0xff | (k[17] & 0xff) << 8 | (k[18] & 0xff) << 16 | (k[19] & 0xff) << 24,\n    j12 = k[20] & 0xff | (k[21] & 0xff) << 8 | (k[22] & 0xff) << 16 | (k[23] & 0xff) << 24,\n    j13 = k[24] & 0xff | (k[25] & 0xff) << 8 | (k[26] & 0xff) << 16 | (k[27] & 0xff) << 24,\n    j14 = k[28] & 0xff | (k[29] & 0xff) << 8 | (k[30] & 0xff) << 16 | (k[31] & 0xff) << 24,\n    j15 = c[12] & 0xff | (c[13] & 0xff) << 8 | (c[14] & 0xff) << 16 | (c[15] & 0xff) << 24;\n\n  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n    x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n    x15 = j15, u;\n\n  for (var i = 0; i < 20; i += 2) {\n    u = x0 + x12 | 0;\n    x4 ^= u << 7 | u >>> (32 - 7);\n    u = x4 + x0 | 0;\n    x8 ^= u << 9 | u >>> (32 - 9);\n    u = x8 + x4 | 0;\n    x12 ^= u << 13 | u >>> (32 - 13);\n    u = x12 + x8 | 0;\n    x0 ^= u << 18 | u >>> (32 - 18);\n\n    u = x5 + x1 | 0;\n    x9 ^= u << 7 | u >>> (32 - 7);\n    u = x9 + x5 | 0;\n    x13 ^= u << 9 | u >>> (32 - 9);\n    u = x13 + x9 | 0;\n    x1 ^= u << 13 | u >>> (32 - 13);\n    u = x1 + x13 | 0;\n    x5 ^= u << 18 | u >>> (32 - 18);\n\n    u = x10 + x6 | 0;\n    x14 ^= u << 7 | u >>> (32 - 7);\n    u = x14 + x10 | 0;\n    x2 ^= u << 9 | u >>> (32 - 9);\n    u = x2 + x14 | 0;\n    x6 ^= u << 13 | u >>> (32 - 13);\n    u = x6 + x2 | 0;\n    x10 ^= u << 18 | u >>> (32 - 18);\n\n    u = x15 + x11 | 0;\n    x3 ^= u << 7 | u >>> (32 - 7);\n    u = x3 + x15 | 0;\n    x7 ^= u << 9 | u >>> (32 - 9);\n    u = x7 + x3 | 0;\n    x11 ^= u << 13 | u >>> (32 - 13);\n    u = x11 + x7 | 0;\n    x15 ^= u << 18 | u >>> (32 - 18);\n\n    u = x0 + x3 | 0;\n    x1 ^= u << 7 | u >>> (32 - 7);\n    u = x1 + x0 | 0;\n    x2 ^= u << 9 | u >>> (32 - 9);\n    u = x2 + x1 | 0;\n    x3 ^= u << 13 | u >>> (32 - 13);\n    u = x3 + x2 | 0;\n    x0 ^= u << 18 | u >>> (32 - 18);\n\n    u = x5 + x4 | 0;\n    x6 ^= u << 7 | u >>> (32 - 7);\n    u = x6 + x5 | 0;\n    x7 ^= u << 9 | u >>> (32 - 9);\n    u = x7 + x6 | 0;\n    x4 ^= u << 13 | u >>> (32 - 13);\n    u = x4 + x7 | 0;\n    x5 ^= u << 18 | u >>> (32 - 18);\n\n    u = x10 + x9 | 0;\n    x11 ^= u << 7 | u >>> (32 - 7);\n    u = x11 + x10 | 0;\n    x8 ^= u << 9 | u >>> (32 - 9);\n    u = x8 + x11 | 0;\n    x9 ^= u << 13 | u >>> (32 - 13);\n    u = x9 + x8 | 0;\n    x10 ^= u << 18 | u >>> (32 - 18);\n\n    u = x15 + x14 | 0;\n    x12 ^= u << 7 | u >>> (32 - 7);\n    u = x12 + x15 | 0;\n    x13 ^= u << 9 | u >>> (32 - 9);\n    u = x13 + x12 | 0;\n    x14 ^= u << 13 | u >>> (32 - 13);\n    u = x14 + x13 | 0;\n    x15 ^= u << 18 | u >>> (32 - 18);\n  }\n\n  o[0] = x0 >>> 0 & 0xff;\n  o[1] = x0 >>> 8 & 0xff;\n  o[2] = x0 >>> 16 & 0xff;\n  o[3] = x0 >>> 24 & 0xff;\n\n  o[4] = x5 >>> 0 & 0xff;\n  o[5] = x5 >>> 8 & 0xff;\n  o[6] = x5 >>> 16 & 0xff;\n  o[7] = x5 >>> 24 & 0xff;\n\n  o[8] = x10 >>> 0 & 0xff;\n  o[9] = x10 >>> 8 & 0xff;\n  o[10] = x10 >>> 16 & 0xff;\n  o[11] = x10 >>> 24 & 0xff;\n\n  o[12] = x15 >>> 0 & 0xff;\n  o[13] = x15 >>> 8 & 0xff;\n  o[14] = x15 >>> 16 & 0xff;\n  o[15] = x15 >>> 24 & 0xff;\n\n  o[16] = x6 >>> 0 & 0xff;\n  o[17] = x6 >>> 8 & 0xff;\n  o[18] = x6 >>> 16 & 0xff;\n  o[19] = x6 >>> 24 & 0xff;\n\n  o[20] = x7 >>> 0 & 0xff;\n  o[21] = x7 >>> 8 & 0xff;\n  o[22] = x7 >>> 16 & 0xff;\n  o[23] = x7 >>> 24 & 0xff;\n\n  o[24] = x8 >>> 0 & 0xff;\n  o[25] = x8 >>> 8 & 0xff;\n  o[26] = x8 >>> 16 & 0xff;\n  o[27] = x8 >>> 24 & 0xff;\n\n  o[28] = x9 >>> 0 & 0xff;\n  o[29] = x9 >>> 8 & 0xff;\n  o[30] = x9 >>> 16 & 0xff;\n  o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out, inp, k, c) {\n  core_salsa20(out, inp, k, c);\n}\n\nfunction crypto_core_hsalsa20(out, inp, k, c) {\n  core_hsalsa20(out, inp, k, c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n// \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) {\n  var z = new Uint8Array(16), x = new Uint8Array(64);\n  var u, i;\n  for (i = 0; i < 16; i++) z[i] = 0;\n  for (i = 0; i < 8; i++) z[i] = n[i];\n  while (b >= 64) {\n    crypto_core_salsa20(x, z, k, sigma);\n    for (i = 0; i < 64; i++) c[cpos + i] = m[mpos + i] ^ x[i];\n    u = 1;\n    for (i = 8; i < 16; i++) {\n      u = u + (z[i] & 0xff) | 0;\n      z[i] = u & 0xff;\n      u >>>= 8;\n    }\n    b -= 64;\n    cpos += 64;\n    mpos += 64;\n  }\n  if (b > 0) {\n    crypto_core_salsa20(x, z, k, sigma);\n    for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i];\n  }\n  return 0;\n}\n\nfunction crypto_stream_salsa20(c, cpos, b, n, k) {\n  var z = new Uint8Array(16), x = new Uint8Array(64);\n  var u, i;\n  for (i = 0; i < 16; i++) z[i] = 0;\n  for (i = 0; i < 8; i++) z[i] = n[i];\n  while (b >= 64) {\n    crypto_core_salsa20(x, z, k, sigma);\n    for (i = 0; i < 64; i++) c[cpos + i] = x[i];\n    u = 1;\n    for (i = 8; i < 16; i++) {\n      u = u + (z[i] & 0xff) | 0;\n      z[i] = u & 0xff;\n      u >>>= 8;\n    }\n    b -= 64;\n    cpos += 64;\n  }\n  if (b > 0) {\n    crypto_core_salsa20(x, z, k, sigma);\n    for (i = 0; i < b; i++) c[cpos + i] = x[i];\n  }\n  return 0;\n}\n\nfunction crypto_stream(c, cpos, d, n, k) {\n  var s = new Uint8Array(32);\n  crypto_core_hsalsa20(s, n, k, sigma);\n  var sn = new Uint8Array(8);\n  for (var i = 0; i < 8; i++) sn[i] = n[i + 16];\n  return crypto_stream_salsa20(c, cpos, d, sn, s);\n}\n\nfunction crypto_stream_xor(c, cpos, m, mpos, d, n, k) {\n  var s = new Uint8Array(32);\n  crypto_core_hsalsa20(s, n, k, sigma);\n  var sn = new Uint8Array(8);\n  for (var i = 0; i < 8; i++) sn[i] = n[i + 16];\n  return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function (key) {\n  this.buffer = new Uint8Array(16);\n  this.r = new Uint16Array(10);\n  this.h = new Uint16Array(10);\n  this.pad = new Uint16Array(8);\n  this.leftover = 0;\n  this.fin = 0;\n\n  var t0, t1, t2, t3, t4, t5, t6, t7;\n\n  t0 = key[0] & 0xff | (key[1] & 0xff) << 8; this.r[0] = (t0) & 0x1fff;\n  t1 = key[2] & 0xff | (key[3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n  t2 = key[4] & 0xff | (key[5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n  t3 = key[6] & 0xff | (key[7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n  t4 = key[8] & 0xff | (key[9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n  this.r[5] = ((t4 >>> 1)) & 0x1ffe;\n  t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n  t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n  t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n  this.r[9] = ((t7 >>> 5)) & 0x007f;\n\n  this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n  this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n  this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n  this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n  this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n  this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n  this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n  this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function (m, mpos, bytes) {\n  var hibit = this.fin ? 0 : (1 << 11);\n  var t0, t1, t2, t3, t4, t5, t6, t7, c;\n  var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n  var h0 = this.h[0],\n    h1 = this.h[1],\n    h2 = this.h[2],\n    h3 = this.h[3],\n    h4 = this.h[4],\n    h5 = this.h[5],\n    h6 = this.h[6],\n    h7 = this.h[7],\n    h8 = this.h[8],\n    h9 = this.h[9];\n\n  var r0 = this.r[0],\n    r1 = this.r[1],\n    r2 = this.r[2],\n    r3 = this.r[3],\n    r4 = this.r[4],\n    r5 = this.r[5],\n    r6 = this.r[6],\n    r7 = this.r[7],\n    r8 = this.r[8],\n    r9 = this.r[9];\n\n  while (bytes >= 16) {\n    t0 = m[mpos + 0] & 0xff | (m[mpos + 1] & 0xff) << 8; h0 += (t0) & 0x1fff;\n    t1 = m[mpos + 2] & 0xff | (m[mpos + 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n    t2 = m[mpos + 4] & 0xff | (m[mpos + 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;\n    t3 = m[mpos + 6] & 0xff | (m[mpos + 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n    t4 = m[mpos + 8] & 0xff | (m[mpos + 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;\n    h5 += ((t4 >>> 1)) & 0x1fff;\n    t5 = m[mpos + 10] & 0xff | (m[mpos + 11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n    t6 = m[mpos + 12] & 0xff | (m[mpos + 13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;\n    t7 = m[mpos + 14] & 0xff | (m[mpos + 15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n    h9 += ((t7 >>> 5)) | hibit;\n\n    c = 0;\n\n    d0 = c;\n    d0 += h0 * r0;\n    d0 += h1 * (5 * r9);\n    d0 += h2 * (5 * r8);\n    d0 += h3 * (5 * r7);\n    d0 += h4 * (5 * r6);\n    c = (d0 >>> 13); d0 &= 0x1fff;\n    d0 += h5 * (5 * r5);\n    d0 += h6 * (5 * r4);\n    d0 += h7 * (5 * r3);\n    d0 += h8 * (5 * r2);\n    d0 += h9 * (5 * r1);\n    c += (d0 >>> 13); d0 &= 0x1fff;\n\n    d1 = c;\n    d1 += h0 * r1;\n    d1 += h1 * r0;\n    d1 += h2 * (5 * r9);\n    d1 += h3 * (5 * r8);\n    d1 += h4 * (5 * r7);\n    c = (d1 >>> 13); d1 &= 0x1fff;\n    d1 += h5 * (5 * r6);\n    d1 += h6 * (5 * r5);\n    d1 += h7 * (5 * r4);\n    d1 += h8 * (5 * r3);\n    d1 += h9 * (5 * r2);\n    c += (d1 >>> 13); d1 &= 0x1fff;\n\n    d2 = c;\n    d2 += h0 * r2;\n    d2 += h1 * r1;\n    d2 += h2 * r0;\n    d2 += h3 * (5 * r9);\n    d2 += h4 * (5 * r8);\n    c = (d2 >>> 13); d2 &= 0x1fff;\n    d2 += h5 * (5 * r7);\n    d2 += h6 * (5 * r6);\n    d2 += h7 * (5 * r5);\n    d2 += h8 * (5 * r4);\n    d2 += h9 * (5 * r3);\n    c += (d2 >>> 13); d2 &= 0x1fff;\n\n    d3 = c;\n    d3 += h0 * r3;\n    d3 += h1 * r2;\n    d3 += h2 * r1;\n    d3 += h3 * r0;\n    d3 += h4 * (5 * r9);\n    c = (d3 >>> 13); d3 &= 0x1fff;\n    d3 += h5 * (5 * r8);\n    d3 += h6 * (5 * r7);\n    d3 += h7 * (5 * r6);\n    d3 += h8 * (5 * r5);\n    d3 += h9 * (5 * r4);\n    c += (d3 >>> 13); d3 &= 0x1fff;\n\n    d4 = c;\n    d4 += h0 * r4;\n    d4 += h1 * r3;\n    d4 += h2 * r2;\n    d4 += h3 * r1;\n    d4 += h4 * r0;\n    c = (d4 >>> 13); d4 &= 0x1fff;\n    d4 += h5 * (5 * r9);\n    d4 += h6 * (5 * r8);\n    d4 += h7 * (5 * r7);\n    d4 += h8 * (5 * r6);\n    d4 += h9 * (5 * r5);\n    c += (d4 >>> 13); d4 &= 0x1fff;\n\n    d5 = c;\n    d5 += h0 * r5;\n    d5 += h1 * r4;\n    d5 += h2 * r3;\n    d5 += h3 * r2;\n    d5 += h4 * r1;\n    c = (d5 >>> 13); d5 &= 0x1fff;\n    d5 += h5 * r0;\n    d5 += h6 * (5 * r9);\n    d5 += h7 * (5 * r8);\n    d5 += h8 * (5 * r7);\n    d5 += h9 * (5 * r6);\n    c += (d5 >>> 13); d5 &= 0x1fff;\n\n    d6 = c;\n    d6 += h0 * r6;\n    d6 += h1 * r5;\n    d6 += h2 * r4;\n    d6 += h3 * r3;\n    d6 += h4 * r2;\n    c = (d6 >>> 13); d6 &= 0x1fff;\n    d6 += h5 * r1;\n    d6 += h6 * r0;\n    d6 += h7 * (5 * r9);\n    d6 += h8 * (5 * r8);\n    d6 += h9 * (5 * r7);\n    c += (d6 >>> 13); d6 &= 0x1fff;\n\n    d7 = c;\n    d7 += h0 * r7;\n    d7 += h1 * r6;\n    d7 += h2 * r5;\n    d7 += h3 * r4;\n    d7 += h4 * r3;\n    c = (d7 >>> 13); d7 &= 0x1fff;\n    d7 += h5 * r2;\n    d7 += h6 * r1;\n    d7 += h7 * r0;\n    d7 += h8 * (5 * r9);\n    d7 += h9 * (5 * r8);\n    c += (d7 >>> 13); d7 &= 0x1fff;\n\n    d8 = c;\n    d8 += h0 * r8;\n    d8 += h1 * r7;\n    d8 += h2 * r6;\n    d8 += h3 * r5;\n    d8 += h4 * r4;\n    c = (d8 >>> 13); d8 &= 0x1fff;\n    d8 += h5 * r3;\n    d8 += h6 * r2;\n    d8 += h7 * r1;\n    d8 += h8 * r0;\n    d8 += h9 * (5 * r9);\n    c += (d8 >>> 13); d8 &= 0x1fff;\n\n    d9 = c;\n    d9 += h0 * r9;\n    d9 += h1 * r8;\n    d9 += h2 * r7;\n    d9 += h3 * r6;\n    d9 += h4 * r5;\n    c = (d9 >>> 13); d9 &= 0x1fff;\n    d9 += h5 * r4;\n    d9 += h6 * r3;\n    d9 += h7 * r2;\n    d9 += h8 * r1;\n    d9 += h9 * r0;\n    c += (d9 >>> 13); d9 &= 0x1fff;\n\n    c = (((c << 2) + c)) | 0;\n    c = (c + d0) | 0;\n    d0 = c & 0x1fff;\n    c = (c >>> 13);\n    d1 += c;\n\n    h0 = d0;\n    h1 = d1;\n    h2 = d2;\n    h3 = d3;\n    h4 = d4;\n    h5 = d5;\n    h6 = d6;\n    h7 = d7;\n    h8 = d8;\n    h9 = d9;\n\n    mpos += 16;\n    bytes -= 16;\n  }\n  this.h[0] = h0;\n  this.h[1] = h1;\n  this.h[2] = h2;\n  this.h[3] = h3;\n  this.h[4] = h4;\n  this.h[5] = h5;\n  this.h[6] = h6;\n  this.h[7] = h7;\n  this.h[8] = h8;\n  this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function (mac, macpos) {\n  var g = new Uint16Array(10);\n  var c, mask, f, i;\n\n  if (this.leftover) {\n    i = this.leftover;\n    this.buffer[i++] = 1;\n    for (; i < 16; i++) this.buffer[i] = 0;\n    this.fin = 1;\n    this.blocks(this.buffer, 0, 16);\n  }\n\n  c = this.h[1] >>> 13;\n  this.h[1] &= 0x1fff;\n  for (i = 2; i < 10; i++) {\n    this.h[i] += c;\n    c = this.h[i] >>> 13;\n    this.h[i] &= 0x1fff;\n  }\n  this.h[0] += (c * 5);\n  c = this.h[0] >>> 13;\n  this.h[0] &= 0x1fff;\n  this.h[1] += c;\n  c = this.h[1] >>> 13;\n  this.h[1] &= 0x1fff;\n  this.h[2] += c;\n\n  g[0] = this.h[0] + 5;\n  c = g[0] >>> 13;\n  g[0] &= 0x1fff;\n  for (i = 1; i < 10; i++) {\n    g[i] = this.h[i] + c;\n    c = g[i] >>> 13;\n    g[i] &= 0x1fff;\n  }\n  g[9] -= (1 << 13);\n\n  mask = (g[9] >>> ((2 * 8) - 1)) - 1;\n  for (i = 0; i < 10; i++) g[i] &= mask;\n  mask = ~mask;\n  for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n  this.h[0] = ((this.h[0]) | (this.h[1] << 13)) & 0xffff;\n  this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10)) & 0xffff;\n  this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7)) & 0xffff;\n  this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4)) & 0xffff;\n  this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;\n  this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11)) & 0xffff;\n  this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8)) & 0xffff;\n  this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff;\n\n  f = this.h[0] + this.pad[0];\n  this.h[0] = f & 0xffff;\n  for (i = 1; i < 8; i++) {\n    f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n    this.h[i] = f & 0xffff;\n  }\n\n  mac[macpos + 0] = (this.h[0] >>> 0) & 0xff;\n  mac[macpos + 1] = (this.h[0] >>> 8) & 0xff;\n  mac[macpos + 2] = (this.h[1] >>> 0) & 0xff;\n  mac[macpos + 3] = (this.h[1] >>> 8) & 0xff;\n  mac[macpos + 4] = (this.h[2] >>> 0) & 0xff;\n  mac[macpos + 5] = (this.h[2] >>> 8) & 0xff;\n  mac[macpos + 6] = (this.h[3] >>> 0) & 0xff;\n  mac[macpos + 7] = (this.h[3] >>> 8) & 0xff;\n  mac[macpos + 8] = (this.h[4] >>> 0) & 0xff;\n  mac[macpos + 9] = (this.h[4] >>> 8) & 0xff;\n  mac[macpos + 10] = (this.h[5] >>> 0) & 0xff;\n  mac[macpos + 11] = (this.h[5] >>> 8) & 0xff;\n  mac[macpos + 12] = (this.h[6] >>> 0) & 0xff;\n  mac[macpos + 13] = (this.h[6] >>> 8) & 0xff;\n  mac[macpos + 14] = (this.h[7] >>> 0) & 0xff;\n  mac[macpos + 15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function (m, mpos, bytes) {\n  var i, want;\n\n  if (this.leftover) {\n    want = (16 - this.leftover);\n    if (want > bytes)\n      want = bytes;\n    for (i = 0; i < want; i++)\n      this.buffer[this.leftover + i] = m[mpos + i];\n    bytes -= want;\n    mpos += want;\n    this.leftover += want;\n    if (this.leftover < 16)\n      return;\n    this.blocks(buffer, 0, 16);\n    this.leftover = 0;\n  }\n\n  if (bytes >= 16) {\n    want = bytes - (bytes % 16);\n    this.blocks(m, mpos, want);\n    mpos += want;\n    bytes -= want;\n  }\n\n  if (bytes) {\n    for (i = 0; i < bytes; i++)\n      this.buffer[this.leftover + i] = m[mpos + i];\n    this.leftover += bytes;\n  }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n  var s = new poly1305(k);\n  s.update(m, mpos, n);\n  s.finish(out, outpos);\n  return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n  var x = new Uint8Array(16);\n  crypto_onetimeauth(x, 0, m, mpos, n, k);\n  return crypto_verify_16(h, hpos, x, 0);\n}\n\nfunction crypto_secretbox(c, m, d, n, k) {\n  var i;\n  if (d < 32) return -1;\n  crypto_stream_xor(c, 0, m, 0, d, n, k);\n  crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n  for (i = 0; i < 16; i++) c[i] = 0;\n  return 0;\n}\n\nfunction crypto_secretbox_open(m, c, d, n, k) {\n  var i;\n  var x = new Uint8Array(32);\n  if (d < 32) return -1;\n  crypto_stream(x, 0, 32, n, k);\n  if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1;\n  crypto_stream_xor(m, 0, c, 0, d, n, k);\n  for (i = 0; i < 32; i++) m[i] = 0;\n  return 0;\n}\n\nfunction set25519(r, a) {\n  var i;\n  for (i = 0; i < 16; i++) r[i] = a[i] | 0;\n}\n\nfunction car25519(o) {\n  var i, v, c = 1;\n  for (i = 0; i < 16; i++) {\n    v = o[i] + c + 65535;\n    c = Math.floor(v / 65536);\n    o[i] = v - c * 65536;\n  }\n  o[0] += c - 1 + 37 * (c - 1);\n}\n\nfunction sel25519(p, q, b) {\n  var t, c = ~(b - 1);\n  for (var i = 0; i < 16; i++) {\n    t = c & (p[i] ^ q[i]);\n    p[i] ^= t;\n    q[i] ^= t;\n  }\n}\n\nfunction pack25519(o, n) {\n  var i, j, b;\n  var m = gf(), t = gf();\n  for (i = 0; i < 16; i++) t[i] = n[i];\n  car25519(t);\n  car25519(t);\n  car25519(t);\n  for (j = 0; j < 2; j++) {\n    m[0] = t[0] - 0xffed;\n    for (i = 1; i < 15; i++) {\n      m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);\n      m[i - 1] &= 0xffff;\n    }\n    m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);\n    b = (m[15] >> 16) & 1;\n    m[14] &= 0xffff;\n    sel25519(t, m, 1 - b);\n  }\n  for (i = 0; i < 16; i++) {\n    o[2 * i] = t[i] & 0xff;\n    o[2 * i + 1] = t[i] >> 8;\n  }\n}\n\nfunction neq25519(a, b) {\n  var c = new Uint8Array(32), d = new Uint8Array(32);\n  pack25519(c, a);\n  pack25519(d, b);\n  return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n  var d = new Uint8Array(32);\n  pack25519(d, a);\n  return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n  var i;\n  for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8);\n  o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n  var v, c,\n    t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,\n    t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n    b0 = b[0],\n    b1 = b[1],\n    b2 = b[2],\n    b3 = b[3],\n    b4 = b[4],\n    b5 = b[5],\n    b6 = b[6],\n    b7 = b[7],\n    b8 = b[8],\n    b9 = b[9],\n    b10 = b[10],\n    b11 = b[11],\n    b12 = b[12],\n    b13 = b[13],\n    b14 = b[14],\n    b15 = b[15];\n\n  v = a[0];\n  t0 += v * b0;\n  t1 += v * b1;\n  t2 += v * b2;\n  t3 += v * b3;\n  t4 += v * b4;\n  t5 += v * b5;\n  t6 += v * b6;\n  t7 += v * b7;\n  t8 += v * b8;\n  t9 += v * b9;\n  t10 += v * b10;\n  t11 += v * b11;\n  t12 += v * b12;\n  t13 += v * b13;\n  t14 += v * b14;\n  t15 += v * b15;\n  v = a[1];\n  t1 += v * b0;\n  t2 += v * b1;\n  t3 += v * b2;\n  t4 += v * b3;\n  t5 += v * b4;\n  t6 += v * b5;\n  t7 += v * b6;\n  t8 += v * b7;\n  t9 += v * b8;\n  t10 += v * b9;\n  t11 += v * b10;\n  t12 += v * b11;\n  t13 += v * b12;\n  t14 += v * b13;\n  t15 += v * b14;\n  t16 += v * b15;\n  v = a[2];\n  t2 += v * b0;\n  t3 += v * b1;\n  t4 += v * b2;\n  t5 += v * b3;\n  t6 += v * b4;\n  t7 += v * b5;\n  t8 += v * b6;\n  t9 += v * b7;\n  t10 += v * b8;\n  t11 += v * b9;\n  t12 += v * b10;\n  t13 += v * b11;\n  t14 += v * b12;\n  t15 += v * b13;\n  t16 += v * b14;\n  t17 += v * b15;\n  v = a[3];\n  t3 += v * b0;\n  t4 += v * b1;\n  t5 += v * b2;\n  t6 += v * b3;\n  t7 += v * b4;\n  t8 += v * b5;\n  t9 += v * b6;\n  t10 += v * b7;\n  t11 += v * b8;\n  t12 += v * b9;\n  t13 += v * b10;\n  t14 += v * b11;\n  t15 += v * b12;\n  t16 += v * b13;\n  t17 += v * b14;\n  t18 += v * b15;\n  v = a[4];\n  t4 += v * b0;\n  t5 += v * b1;\n  t6 += v * b2;\n  t7 += v * b3;\n  t8 += v * b4;\n  t9 += v * b5;\n  t10 += v * b6;\n  t11 += v * b7;\n  t12 += v * b8;\n  t13 += v * b9;\n  t14 += v * b10;\n  t15 += v * b11;\n  t16 += v * b12;\n  t17 += v * b13;\n  t18 += v * b14;\n  t19 += v * b15;\n  v = a[5];\n  t5 += v * b0;\n  t6 += v * b1;\n  t7 += v * b2;\n  t8 += v * b3;\n  t9 += v * b4;\n  t10 += v * b5;\n  t11 += v * b6;\n  t12 += v * b7;\n  t13 += v * b8;\n  t14 += v * b9;\n  t15 += v * b10;\n  t16 += v * b11;\n  t17 += v * b12;\n  t18 += v * b13;\n  t19 += v * b14;\n  t20 += v * b15;\n  v = a[6];\n  t6 += v * b0;\n  t7 += v * b1;\n  t8 += v * b2;\n  t9 += v * b3;\n  t10 += v * b4;\n  t11 += v * b5;\n  t12 += v * b6;\n  t13 += v * b7;\n  t14 += v * b8;\n  t15 += v * b9;\n  t16 += v * b10;\n  t17 += v * b11;\n  t18 += v * b12;\n  t19 += v * b13;\n  t20 += v * b14;\n  t21 += v * b15;\n  v = a[7];\n  t7 += v * b0;\n  t8 += v * b1;\n  t9 += v * b2;\n  t10 += v * b3;\n  t11 += v * b4;\n  t12 += v * b5;\n  t13 += v * b6;\n  t14 += v * b7;\n  t15 += v * b8;\n  t16 += v * b9;\n  t17 += v * b10;\n  t18 += v * b11;\n  t19 += v * b12;\n  t20 += v * b13;\n  t21 += v * b14;\n  t22 += v * b15;\n  v = a[8];\n  t8 += v * b0;\n  t9 += v * b1;\n  t10 += v * b2;\n  t11 += v * b3;\n  t12 += v * b4;\n  t13 += v * b5;\n  t14 += v * b6;\n  t15 += v * b7;\n  t16 += v * b8;\n  t17 += v * b9;\n  t18 += v * b10;\n  t19 += v * b11;\n  t20 += v * b12;\n  t21 += v * b13;\n  t22 += v * b14;\n  t23 += v * b15;\n  v = a[9];\n  t9 += v * b0;\n  t10 += v * b1;\n  t11 += v * b2;\n  t12 += v * b3;\n  t13 += v * b4;\n  t14 += v * b5;\n  t15 += v * b6;\n  t16 += v * b7;\n  t17 += v * b8;\n  t18 += v * b9;\n  t19 += v * b10;\n  t20 += v * b11;\n  t21 += v * b12;\n  t22 += v * b13;\n  t23 += v * b14;\n  t24 += v * b15;\n  v = a[10];\n  t10 += v * b0;\n  t11 += v * b1;\n  t12 += v * b2;\n  t13 += v * b3;\n  t14 += v * b4;\n  t15 += v * b5;\n  t16 += v * b6;\n  t17 += v * b7;\n  t18 += v * b8;\n  t19 += v * b9;\n  t20 += v * b10;\n  t21 += v * b11;\n  t22 += v * b12;\n  t23 += v * b13;\n  t24 += v * b14;\n  t25 += v * b15;\n  v = a[11];\n  t11 += v * b0;\n  t12 += v * b1;\n  t13 += v * b2;\n  t14 += v * b3;\n  t15 += v * b4;\n  t16 += v * b5;\n  t17 += v * b6;\n  t18 += v * b7;\n  t19 += v * b8;\n  t20 += v * b9;\n  t21 += v * b10;\n  t22 += v * b11;\n  t23 += v * b12;\n  t24 += v * b13;\n  t25 += v * b14;\n  t26 += v * b15;\n  v = a[12];\n  t12 += v * b0;\n  t13 += v * b1;\n  t14 += v * b2;\n  t15 += v * b3;\n  t16 += v * b4;\n  t17 += v * b5;\n  t18 += v * b6;\n  t19 += v * b7;\n  t20 += v * b8;\n  t21 += v * b9;\n  t22 += v * b10;\n  t23 += v * b11;\n  t24 += v * b12;\n  t25 += v * b13;\n  t26 += v * b14;\n  t27 += v * b15;\n  v = a[13];\n  t13 += v * b0;\n  t14 += v * b1;\n  t15 += v * b2;\n  t16 += v * b3;\n  t17 += v * b4;\n  t18 += v * b5;\n  t19 += v * b6;\n  t20 += v * b7;\n  t21 += v * b8;\n  t22 += v * b9;\n  t23 += v * b10;\n  t24 += v * b11;\n  t25 += v * b12;\n  t26 += v * b13;\n  t27 += v * b14;\n  t28 += v * b15;\n  v = a[14];\n  t14 += v * b0;\n  t15 += v * b1;\n  t16 += v * b2;\n  t17 += v * b3;\n  t18 += v * b4;\n  t19 += v * b5;\n  t20 += v * b6;\n  t21 += v * b7;\n  t22 += v * b8;\n  t23 += v * b9;\n  t24 += v * b10;\n  t25 += v * b11;\n  t26 += v * b12;\n  t27 += v * b13;\n  t28 += v * b14;\n  t29 += v * b15;\n  v = a[15];\n  t15 += v * b0;\n  t16 += v * b1;\n  t17 += v * b2;\n  t18 += v * b3;\n  t19 += v * b4;\n  t20 += v * b5;\n  t21 += v * b6;\n  t22 += v * b7;\n  t23 += v * b8;\n  t24 += v * b9;\n  t25 += v * b10;\n  t26 += v * b11;\n  t27 += v * b12;\n  t28 += v * b13;\n  t29 += v * b14;\n  t30 += v * b15;\n\n  t0 += 38 * t16;\n  t1 += 38 * t17;\n  t2 += 38 * t18;\n  t3 += 38 * t19;\n  t4 += 38 * t20;\n  t5 += 38 * t21;\n  t6 += 38 * t22;\n  t7 += 38 * t23;\n  t8 += 38 * t24;\n  t9 += 38 * t25;\n  t10 += 38 * t26;\n  t11 += 38 * t27;\n  t12 += 38 * t28;\n  t13 += 38 * t29;\n  t14 += 38 * t30;\n  // t15 left as is\n\n  // first car\n  c = 1;\n  v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n  v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n  v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n  v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n  v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n  v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n  v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n  v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n  v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n  v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c - 1 + 37 * (c - 1);\n\n  // second car\n  c = 1;\n  v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n  v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n  v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n  v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n  v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n  v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n  v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n  v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n  v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n  v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c - 1 + 37 * (c - 1);\n\n  o[0] = t0;\n  o[1] = t1;\n  o[2] = t2;\n  o[3] = t3;\n  o[4] = t4;\n  o[5] = t5;\n  o[6] = t6;\n  o[7] = t7;\n  o[8] = t8;\n  o[9] = t9;\n  o[10] = t10;\n  o[11] = t11;\n  o[12] = t12;\n  o[13] = t13;\n  o[14] = t14;\n  o[15] = t15;\n}\n\nfunction S(o, a) {\n  M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n  var c = gf();\n  var a;\n  for (a = 0; a < 16; a++) c[a] = i[a];\n  for (a = 253; a >= 0; a--) {\n    S(c, c);\n    if (a !== 2 && a !== 4) M(c, c, i);\n  }\n  for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n  var c = gf();\n  var a;\n  for (a = 0; a < 16; a++) c[a] = i[a];\n  for (a = 250; a >= 0; a--) {\n    S(c, c);\n    if (a !== 1) M(c, c, i);\n  }\n  for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n  var z = new Uint8Array(32);\n  var x = new Float64Array(80), r, i;\n  var a = gf(), b = gf(), c = gf(),\n    d = gf(), e = gf(), f = gf();\n  for (i = 0; i < 31; i++) z[i] = n[i];\n  z[31] = (n[31] & 127) | 64;\n  z[0] &= 248;\n  unpack25519(x, p);\n  for (i = 0; i < 16; i++) {\n    b[i] = x[i];\n    d[i] = a[i] = c[i] = 0;\n  }\n  a[0] = d[0] = 1;\n  for (i = 254; i >= 0; --i) {\n    r = (z[i >>> 3] >>> (i & 7)) & 1;\n    sel25519(a, b, r);\n    sel25519(c, d, r);\n    A(e, a, c);\n    Z(a, a, c);\n    A(c, b, d);\n    Z(b, b, d);\n    S(d, e);\n    S(f, a);\n    M(a, c, a);\n    M(c, b, e);\n    A(e, a, c);\n    Z(a, a, c);\n    S(b, a);\n    Z(c, d, f);\n    M(a, c, _121665);\n    A(a, a, d);\n    M(c, c, a);\n    M(a, d, f);\n    M(d, b, x);\n    S(b, e);\n    sel25519(a, b, r);\n    sel25519(c, d, r);\n  }\n  for (i = 0; i < 16; i++) {\n    x[i + 16] = a[i];\n    x[i + 32] = c[i];\n    x[i + 48] = b[i];\n    x[i + 64] = d[i];\n  }\n  var x32 = x.subarray(32);\n  var x16 = x.subarray(16);\n  inv25519(x32, x32);\n  M(x16, x16, x32);\n  pack25519(q, x16);\n  return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n  return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n  randombytes(x, 32);\n  return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n  var s = new Uint8Array(32);\n  crypto_scalarmult(s, x, y);\n  return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n  var k = new Uint8Array(32);\n  crypto_box_beforenm(k, y, x);\n  return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n  var k = new Uint8Array(32);\n  crypto_box_beforenm(k, y, x);\n  return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n  var wh = new Int32Array(16), wl = new Int32Array(16),\n    bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n    bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n    th, tl, i, j, h, l, a, b, c, d;\n\n  var ah0 = hh[0],\n    ah1 = hh[1],\n    ah2 = hh[2],\n    ah3 = hh[3],\n    ah4 = hh[4],\n    ah5 = hh[5],\n    ah6 = hh[6],\n    ah7 = hh[7],\n\n    al0 = hl[0],\n    al1 = hl[1],\n    al2 = hl[2],\n    al3 = hl[3],\n    al4 = hl[4],\n    al5 = hl[5],\n    al6 = hl[6],\n    al7 = hl[7];\n\n  var pos = 0;\n  while (n >= 128) {\n    for (i = 0; i < 16; i++) {\n      j = 8 * i + pos;\n      wh[i] = (m[j + 0] << 24) | (m[j + 1] << 16) | (m[j + 2] << 8) | m[j + 3];\n      wl[i] = (m[j + 4] << 24) | (m[j + 5] << 16) | (m[j + 6] << 8) | m[j + 7];\n    }\n    for (i = 0; i < 80; i++) {\n      bh0 = ah0;\n      bh1 = ah1;\n      bh2 = ah2;\n      bh3 = ah3;\n      bh4 = ah4;\n      bh5 = ah5;\n      bh6 = ah6;\n      bh7 = ah7;\n\n      bl0 = al0;\n      bl1 = al1;\n      bl2 = al2;\n      bl3 = al3;\n      bl4 = al4;\n      bl5 = al5;\n      bl6 = al6;\n      bl7 = al7;\n\n      // add\n      h = ah7;\n      l = al7;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      // Sigma1\n      h = ((ah4 >>> 14) | (al4 << (32 - 14))) ^ ((ah4 >>> 18) | (al4 << (32 - 18))) ^ ((al4 >>> (41 - 32)) | (ah4 << (32 - (41 - 32))));\n      l = ((al4 >>> 14) | (ah4 << (32 - 14))) ^ ((al4 >>> 18) | (ah4 << (32 - 18))) ^ ((ah4 >>> (41 - 32)) | (al4 << (32 - (41 - 32))));\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // Ch\n      h = (ah4 & ah5) ^ (~ah4 & ah6);\n      l = (al4 & al5) ^ (~al4 & al6);\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // K\n      h = K[i * 2];\n      l = K[i * 2 + 1];\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // w\n      h = wh[i % 16];\n      l = wl[i % 16];\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      th = c & 0xffff | d << 16;\n      tl = a & 0xffff | b << 16;\n\n      // add\n      h = th;\n      l = tl;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      // Sigma0\n      h = ((ah0 >>> 28) | (al0 << (32 - 28))) ^ ((al0 >>> (34 - 32)) | (ah0 << (32 - (34 - 32)))) ^ ((al0 >>> (39 - 32)) | (ah0 << (32 - (39 - 32))));\n      l = ((al0 >>> 28) | (ah0 << (32 - 28))) ^ ((ah0 >>> (34 - 32)) | (al0 << (32 - (34 - 32)))) ^ ((ah0 >>> (39 - 32)) | (al0 << (32 - (39 - 32))));\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // Maj\n      h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n      l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      bh7 = (c & 0xffff) | (d << 16);\n      bl7 = (a & 0xffff) | (b << 16);\n\n      // add\n      h = bh3;\n      l = bl3;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      h = th;\n      l = tl;\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      bh3 = (c & 0xffff) | (d << 16);\n      bl3 = (a & 0xffff) | (b << 16);\n\n      ah1 = bh0;\n      ah2 = bh1;\n      ah3 = bh2;\n      ah4 = bh3;\n      ah5 = bh4;\n      ah6 = bh5;\n      ah7 = bh6;\n      ah0 = bh7;\n\n      al1 = bl0;\n      al2 = bl1;\n      al3 = bl2;\n      al4 = bl3;\n      al5 = bl4;\n      al6 = bl5;\n      al7 = bl6;\n      al0 = bl7;\n\n      if (i % 16 === 15) {\n        for (j = 0; j < 16; j++) {\n          // add\n          h = wh[j];\n          l = wl[j];\n\n          a = l & 0xffff; b = l >>> 16;\n          c = h & 0xffff; d = h >>> 16;\n\n          h = wh[(j + 9) % 16];\n          l = wl[(j + 9) % 16];\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          // sigma0\n          th = wh[(j + 1) % 16];\n          tl = wl[(j + 1) % 16];\n          h = ((th >>> 1) | (tl << (32 - 1))) ^ ((th >>> 8) | (tl << (32 - 8))) ^ (th >>> 7);\n          l = ((tl >>> 1) | (th << (32 - 1))) ^ ((tl >>> 8) | (th << (32 - 8))) ^ ((tl >>> 7) | (th << (32 - 7)));\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          // sigma1\n          th = wh[(j + 14) % 16];\n          tl = wl[(j + 14) % 16];\n          h = ((th >>> 19) | (tl << (32 - 19))) ^ ((tl >>> (61 - 32)) | (th << (32 - (61 - 32)))) ^ (th >>> 6);\n          l = ((tl >>> 19) | (th << (32 - 19))) ^ ((th >>> (61 - 32)) | (tl << (32 - (61 - 32)))) ^ ((tl >>> 6) | (th << (32 - 6)));\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          b += a >>> 16;\n          c += b >>> 16;\n          d += c >>> 16;\n\n          wh[j] = (c & 0xffff) | (d << 16);\n          wl[j] = (a & 0xffff) | (b << 16);\n        }\n      }\n    }\n\n    // add\n    h = ah0;\n    l = al0;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[0];\n    l = hl[0];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[0] = ah0 = (c & 0xffff) | (d << 16);\n    hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n    h = ah1;\n    l = al1;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[1];\n    l = hl[1];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[1] = ah1 = (c & 0xffff) | (d << 16);\n    hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n    h = ah2;\n    l = al2;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[2];\n    l = hl[2];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[2] = ah2 = (c & 0xffff) | (d << 16);\n    hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n    h = ah3;\n    l = al3;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[3];\n    l = hl[3];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[3] = ah3 = (c & 0xffff) | (d << 16);\n    hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n    h = ah4;\n    l = al4;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[4];\n    l = hl[4];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[4] = ah4 = (c & 0xffff) | (d << 16);\n    hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n    h = ah5;\n    l = al5;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[5];\n    l = hl[5];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[5] = ah5 = (c & 0xffff) | (d << 16);\n    hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n    h = ah6;\n    l = al6;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[6];\n    l = hl[6];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[6] = ah6 = (c & 0xffff) | (d << 16);\n    hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n    h = ah7;\n    l = al7;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[7];\n    l = hl[7];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[7] = ah7 = (c & 0xffff) | (d << 16);\n    hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n    pos += 128;\n    n -= 128;\n  }\n\n  return n;\n}\n\nfunction crypto_hash(out, m, n) {\n  var hh = new Int32Array(8),\n    hl = new Int32Array(8),\n    x = new Uint8Array(256),\n    i, b = n;\n\n  hh[0] = 0x6a09e667;\n  hh[1] = 0xbb67ae85;\n  hh[2] = 0x3c6ef372;\n  hh[3] = 0xa54ff53a;\n  hh[4] = 0x510e527f;\n  hh[5] = 0x9b05688c;\n  hh[6] = 0x1f83d9ab;\n  hh[7] = 0x5be0cd19;\n\n  hl[0] = 0xf3bcc908;\n  hl[1] = 0x84caa73b;\n  hl[2] = 0xfe94f82b;\n  hl[3] = 0x5f1d36f1;\n  hl[4] = 0xade682d1;\n  hl[5] = 0x2b3e6c1f;\n  hl[6] = 0xfb41bd6b;\n  hl[7] = 0x137e2179;\n\n  crypto_hashblocks_hl(hh, hl, m, n);\n  n %= 128;\n\n  for (i = 0; i < n; i++) x[i] = m[b - n + i];\n  x[n] = 128;\n\n  n = 256 - 128 * (n < 112 ? 1 : 0);\n  x[n - 9] = 0;\n  ts64(x, n - 8, (b / 0x20000000) | 0, b << 3);\n  crypto_hashblocks_hl(hh, hl, x, n);\n\n  for (i = 0; i < 8; i++) ts64(out, 8 * i, hh[i], hl[i]);\n\n  return 0;\n}\n\nfunction add(p, q) {\n  var a = gf(), b = gf(), c = gf(),\n    d = gf(), e = gf(), f = gf(),\n    g = gf(), h = gf(), t = gf();\n\n  Z(a, p[1], p[0]);\n  Z(t, q[1], q[0]);\n  M(a, a, t);\n  A(b, p[0], p[1]);\n  A(t, q[0], q[1]);\n  M(b, b, t);\n  M(c, p[3], q[3]);\n  M(c, c, D2);\n  M(d, p[2], q[2]);\n  A(d, d, d);\n  Z(e, b, a);\n  Z(f, d, c);\n  A(g, d, c);\n  A(h, b, a);\n\n  M(p[0], e, f);\n  M(p[1], h, g);\n  M(p[2], g, f);\n  M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n  var i;\n  for (i = 0; i < 4; i++) {\n    sel25519(p[i], q[i], b);\n  }\n}\n\nfunction pack(r, p) {\n  var tx = gf(), ty = gf(), zi = gf();\n  inv25519(zi, p[2]);\n  M(tx, p[0], zi);\n  M(ty, p[1], zi);\n  pack25519(r, ty);\n  r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n  var b, i;\n  set25519(p[0], gf0);\n  set25519(p[1], gf1);\n  set25519(p[2], gf1);\n  set25519(p[3], gf0);\n  for (i = 255; i >= 0; --i) {\n    b = (s[(i / 8) | 0] >> (i & 7)) & 1;\n    cswap(p, q, b);\n    add(q, p);\n    add(p, p);\n    cswap(p, q, b);\n  }\n}\n\nfunction scalarbase(p, s) {\n  var q = [gf(), gf(), gf(), gf()];\n  set25519(q[0], X);\n  set25519(q[1], Y);\n  set25519(q[2], gf1);\n  M(q[3], X, Y);\n  scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n  var d = new Uint8Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n  var i;\n\n  if (!seeded) randombytes(sk, 32);\n  crypto_hash(d, sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  scalarbase(p, d);\n  pack(pk, p);\n\n  for (i = 0; i < 32; i++) sk[i + 32] = pk[i];\n  return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n  var carry, i, j, k;\n  for (i = 63; i >= 32; --i) {\n    carry = 0;\n    for (j = i - 32, k = i - 12; j < k; ++j) {\n      x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n      carry = (x[j] + 128) >> 8;\n      x[j] -= carry * 256;\n    }\n    x[j] += carry;\n    x[i] = 0;\n  }\n  carry = 0;\n  for (j = 0; j < 32; j++) {\n    x[j] += carry - (x[31] >> 4) * L[j];\n    carry = x[j] >> 8;\n    x[j] &= 255;\n  }\n  for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n  for (i = 0; i < 32; i++) {\n    x[i + 1] += x[i] >> 8;\n    r[i] = x[i] & 255;\n  }\n}\n\nfunction reduce(r) {\n  var x = new Float64Array(64), i;\n  for (i = 0; i < 64; i++) x[i] = r[i];\n  for (i = 0; i < 64; i++) r[i] = 0;\n  modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n  var i, j, x = new Float64Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n\n  crypto_hash(d, sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  var smlen = n + 64;\n  for (i = 0; i < n; i++) sm[64 + i] = m[i];\n  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n  crypto_hash(r, sm.subarray(32), n + 32);\n  reduce(r);\n  scalarbase(p, r);\n  pack(sm, p);\n\n  for (i = 32; i < 64; i++) sm[i] = sk[i];\n  crypto_hash(h, sm, n + 64);\n  reduce(h);\n\n  for (i = 0; i < 64; i++) x[i] = 0;\n  for (i = 0; i < 32; i++) x[i] = r[i];\n  for (i = 0; i < 32; i++) {\n    for (j = 0; j < 32; j++) {\n      x[i + j] += h[i] * d[j];\n    }\n  }\n\n  modL(sm.subarray(32), x);\n  return smlen;\n}\n\nfunction unpackneg(r, p) {\n  var t = gf(), chk = gf(), num = gf(),\n    den = gf(), den2 = gf(), den4 = gf(),\n    den6 = gf();\n\n  set25519(r[2], gf1);\n  unpack25519(r[1], p);\n  S(num, r[1]);\n  M(den, num, D);\n  Z(num, num, r[2]);\n  A(den, r[2], den);\n\n  S(den2, den);\n  S(den4, den2);\n  M(den6, den4, den2);\n  M(t, den6, num);\n  M(t, t, den);\n\n  pow2523(t, t);\n  M(t, t, num);\n  M(t, t, den);\n  M(t, t, den);\n  M(r[0], t, den);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if (neq25519(chk, num)) M(r[0], r[0], I);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if (neq25519(chk, num)) return -1;\n\n  if (par25519(r[0]) === (p[31] >> 7)) Z(r[0], gf0, r[0]);\n\n  M(r[3], r[0], r[1]);\n  return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n  var i, mlen;\n  var t = new Uint8Array(32), h = new Uint8Array(64);\n  var p = [gf(), gf(), gf(), gf()],\n    q = [gf(), gf(), gf(), gf()];\n\n  mlen = -1;\n  if (n < 64) return -1;\n\n  if (unpackneg(q, pk)) return -1;\n\n  for (i = 0; i < n; i++) m[i] = sm[i];\n  for (i = 0; i < 32; i++) m[i + 32] = pk[i];\n  crypto_hash(h, m, n);\n  reduce(h);\n  scalarmult(p, q, h);\n\n  scalarbase(q, sm.subarray(32));\n  add(p, q);\n  pack(t, p);\n\n  n -= 64;\n  if (crypto_verify_32(sm, 0, t, 0)) {\n    for (i = 0; i < n; i++) m[i] = 0;\n    return -1;\n  }\n\n  for (i = 0; i < n; i++) m[i] = sm[i + 64];\n  mlen = n;\n  return mlen;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n  crypto_secretbox_NONCEBYTES = 24,\n  crypto_secretbox_ZEROBYTES = 32,\n  crypto_secretbox_BOXZEROBYTES = 16,\n  crypto_scalarmult_BYTES = 32,\n  crypto_scalarmult_SCALARBYTES = 32,\n  crypto_box_PUBLICKEYBYTES = 32,\n  crypto_box_SECRETKEYBYTES = 32,\n  crypto_box_BEFORENMBYTES = 32,\n  crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n  crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n  crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n  crypto_sign_BYTES = 64,\n  crypto_sign_PUBLICKEYBYTES = 32,\n  crypto_sign_SECRETKEYBYTES = 64,\n  crypto_sign_SEEDBYTES = 32,\n  crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n  crypto_core_hsalsa20: crypto_core_hsalsa20,\n  crypto_stream_xor: crypto_stream_xor,\n  crypto_stream: crypto_stream,\n  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n  crypto_stream_salsa20: crypto_stream_salsa20,\n  crypto_onetimeauth: crypto_onetimeauth,\n  crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n  crypto_verify_16: crypto_verify_16,\n  crypto_verify_32: crypto_verify_32,\n  crypto_secretbox: crypto_secretbox,\n  crypto_secretbox_open: crypto_secretbox_open,\n  crypto_scalarmult: crypto_scalarmult,\n  crypto_scalarmult_base: crypto_scalarmult_base,\n  crypto_box_beforenm: crypto_box_beforenm,\n  crypto_box_afternm: crypto_box_afternm,\n  crypto_box: crypto_box,\n  crypto_box_open: crypto_box_open,\n  crypto_box_keypair: crypto_box_keypair,\n  crypto_hash: crypto_hash,\n  crypto_sign: crypto_sign,\n  crypto_sign_keypair: crypto_sign_keypair,\n  crypto_sign_open: crypto_sign_open,\n\n  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n  crypto_sign_BYTES: crypto_sign_BYTES,\n  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n  crypto_hash_BYTES: crypto_hash_BYTES\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n  var t, i;\n  for (i = 0; i < arguments.length; i++) {\n    if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')\n      throw new TypeError('unexpected type ' + t + ', use Uint8Array');\n  }\n}\n\nnacl.util = {};\n\nnacl.util.decodeUTF8 = function (s) {\n  var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);\n  for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n  return b;\n};\n\nnacl.util.encodeUTF8 = function (arr) {\n  var i, s = [];\n  for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i]));\n  return decodeURIComponent(escape(s.join('')));\n};\n\nnacl.util.encodeBase64 = function (arr) {\n  if (typeof btoa === 'undefined') {\n    return (new Buffer(arr)).toString('base64');\n  } else {\n    var i, s = [], len = arr.length;\n    for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i]));\n    return btoa(s.join(''));\n  }\n};\n\nnacl.util.decodeBase64 = function (s) {\n  if (typeof atob === 'undefined') {\n    return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0));\n  } else {\n    var i, d = atob(s), b = new Uint8Array(d.length);\n    for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n    return b;\n  }\n};\n\nnacl.randomBytes = function (n) {\n  var b = new Uint8Array(n);\n  randombytes(b, n);\n  return b;\n};\n\nnacl.secretbox = function (msg, nonce, key) {\n  checkArrayTypes(msg, nonce, key);\n  checkLengths(key, nonce);\n  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n  var c = new Uint8Array(m.length);\n  for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i];\n  crypto_secretbox(c, m, m.length, nonce, key);\n  return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function (box, nonce, key) {\n  checkArrayTypes(box, nonce, key);\n  checkLengths(key, nonce);\n  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n  var m = new Uint8Array(c.length);\n  for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i];\n  if (c.length < 32) return false;\n  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;\n  return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function (n, p) {\n  checkArrayTypes(n, p);\n  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n  var q = new Uint8Array(crypto_scalarmult_BYTES);\n  crypto_scalarmult(q, n, p);\n  return q;\n};\n\nnacl.scalarMult.base = function (n) {\n  checkArrayTypes(n);\n  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n  var q = new Uint8Array(crypto_scalarmult_BYTES);\n  crypto_scalarmult_base(q, n);\n  return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function (msg, nonce, publicKey, secretKey) {\n  var k = nacl.box.before(publicKey, secretKey);\n  return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function (publicKey, secretKey) {\n  checkArrayTypes(publicKey, secretKey);\n  checkBoxLengths(publicKey, secretKey);\n  var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n  crypto_box_beforenm(k, publicKey, secretKey);\n  return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function (msg, nonce, publicKey, secretKey) {\n  var k = nacl.box.before(publicKey, secretKey);\n  return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function () {\n  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n  crypto_box_keypair(pk, sk);\n  return { publicKey: pk, secretKey: sk };\n};\n\nnacl.box.keyPair.fromSecretKey = function (secretKey) {\n  checkArrayTypes(secretKey);\n  if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n  crypto_scalarmult_base(pk, secretKey);\n  return { publicKey: pk, secretKey: new Uint8Array(secretKey) };\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function (msg, secretKey) {\n  checkArrayTypes(msg, secretKey);\n  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length);\n  crypto_sign(signedMsg, msg, msg.length, secretKey);\n  return signedMsg;\n};\n\nnacl.sign.open = function (signedMsg, publicKey) {\n  if (arguments.length !== 2)\n    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');\n  checkArrayTypes(signedMsg, publicKey);\n  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n    throw new Error('bad public key size');\n  var tmp = new Uint8Array(signedMsg.length);\n  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n  if (mlen < 0) return null;\n  var m = new Uint8Array(mlen);\n  for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n  return m;\n};\n\nnacl.sign.detached = function (msg, secretKey) {\n  var signedMsg = nacl.sign(msg, secretKey);\n  var sig = new Uint8Array(crypto_sign_BYTES);\n  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n  return sig;\n};\n\nnacl.sign.detached.verify = function (msg, sig, publicKey) {\n  checkArrayTypes(msg, sig, publicKey);\n  if (sig.length !== crypto_sign_BYTES)\n    throw new Error('bad signature size');\n  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n    throw new Error('bad public key size');\n  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n  var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n  var i;\n  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n  for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i];\n  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function () {\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n  crypto_sign_keypair(pk, sk);\n  return { publicKey: pk, secretKey: sk };\n};\n\nnacl.sign.keyPair.fromSecretKey = function (secretKey) {\n  checkArrayTypes(secretKey);\n  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i];\n  return { publicKey: pk, secretKey: new Uint8Array(secretKey) };\n};\n\nnacl.sign.keyPair.fromSeed = function (seed) {\n  checkArrayTypes(seed);\n  if (seed.length !== crypto_sign_SEEDBYTES)\n    throw new Error('bad seed size');\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n  for (var i = 0; i < 32; i++) sk[i] = seed[i];\n  crypto_sign_keypair(pk, sk, true);\n  return { publicKey: pk, secretKey: sk };\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function (msg) {\n  checkArrayTypes(msg);\n  var h = new Uint8Array(crypto_hash_BYTES);\n  crypto_hash(h, msg, msg.length);\n  return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function (x, y) {\n  checkArrayTypes(x, y);\n  // Zero length arguments are considered not equal.\n  if (x.length === 0 || y.length === 0) return false;\n  if (x.length !== y.length) return false;\n  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function (fn) {\n  randombytes = fn;\n};\n\nnacl.setPRNG(function (x, n) {\n  var i, v = crypto.randomBytes(n);\n  for (i = 0; i < n; i++) x[i] = v[i];\n});\n\n\nvar DEFAULT_MAX_CHUNK = 65535;\n\nvar ZEROBYTES = nacl.lowlevel.crypto_secretbox_ZEROBYTES;\nvar BOXZEROBYTES = nacl.lowlevel.crypto_secretbox_BOXZEROBYTES;\nvar secretbox = nacl.lowlevel.crypto_secretbox;\nvar secretbox_open = nacl.lowlevel.crypto_secretbox_open;\n\nfunction incrementChunkCounter(fullNonce) {\n  for (var i = 16; i < 24; i++) {\n    fullNonce[i]++;\n    if (fullNonce[i]) break;\n  }\n}\n\nfunction setLastChunkFlag(fullNonce) {\n  fullNonce[23] |= 0x80;\n}\n\nfunction clean() {\n  for (var i = 0; i < arguments.length; i++) {\n    var arg = arguments[i];\n    for (var j = 0; j < arg.length; j++) arg[j] = 0;\n  }\n}\n\nfunction readChunkLength(data, offset) {\n  offset |= 0;\n  if (data.length < offset + 4) return -1;\n  return data[offset] | data[offset + 1] << 8 |\n    data[offset + 2] << 16 | data[offset + 3] << 24;\n};\n\n\nfunction checkArgs(key, nonce, maxChunkLength) {\n  if (key.length !== 32) throw new Error('bad key length, must be 32 bytes');\n  if (nonce.length !== 16) throw new Error('bad nonce length, must be 16 bytes');\n  if (maxChunkLength >= 0xffffffff) throw new Error('max chunk length is too large');\n  if (maxChunkLength < 16) throw new Error('max chunk length is too small');\n}\n\nfunction StreamEncryptor(key, nonce, maxChunkLength) {\n  checkArgs(key, nonce, maxChunkLength);\n  this._key = key;\n  this._fullNonce = new Uint8Array(24);\n  this._fullNonce.set(nonce);\n  this._maxChunkLength = maxChunkLength || DEFAULT_MAX_CHUNK;\n  this._in = new Uint8Array(ZEROBYTES + this._maxChunkLength);\n  this._out = new Uint8Array(ZEROBYTES + this._maxChunkLength);\n  this._done = false;\n}\n\nStreamEncryptor.prototype.encryptChunk = function (chunk, isLast) {\n  if (this._done) throw new Error('called encryptChunk after last chunk');\n  var chunkLen = chunk.length;\n  if (chunkLen > this._maxChunkLength)\n    throw new Error('chunk is too large: ' + chunkLen + ' / ' + this._maxChunkLength);\n  for (var i = 0; i < ZEROBYTES; i++) this._in[i] = 0;\n  this._in.set(chunk, ZEROBYTES);\n  if (isLast) {\n    setLastChunkFlag(this._fullNonce);\n    this._done = true;\n  }\n  secretbox(this._out, this._in, chunkLen + ZEROBYTES, this._fullNonce, this._key);\n  incrementChunkCounter(this._fullNonce);\n  var encryptedChunk = this._out.subarray(BOXZEROBYTES - 4, BOXZEROBYTES - 4 + chunkLen + 16 + 4);\n  encryptedChunk[0] = (chunkLen >>> 0) & 0xff;\n  encryptedChunk[1] = (chunkLen >>> 8) & 0xff;\n  encryptedChunk[2] = (chunkLen >>> 16) & 0xff;\n  encryptedChunk[3] = (chunkLen >>> 24) & 0xff;\n  return new Uint8Array(encryptedChunk);\n};\n\nStreamEncryptor.prototype.clean = function () {\n  clean(this._fullNonce, this._in, this._out);\n};\n\nfunction StreamDecryptor(key, nonce, maxChunkLength) {\n  checkArgs(key, nonce, maxChunkLength);\n  this._key = key;\n  this._fullNonce = new Uint8Array(24);\n  this._fullNonce.set(nonce);\n  this._maxChunkLength = maxChunkLength || DEFAULT_MAX_CHUNK;\n  this._in = new Uint8Array(ZEROBYTES + this._maxChunkLength);\n  this._out = new Uint8Array(ZEROBYTES + this._maxChunkLength);\n  this._failed = false;\n  this._done = false;\n}\n\nStreamDecryptor.prototype._fail = function () {\n  this._failed = true;\n  this.clean();\n  return null;\n};\n\nStreamDecryptor.prototype.decryptChunk = function (encryptedChunk, isLast) {\n  if (this._failed) return null;\n  if (this._done) throw new Error('called decryptChunk after last chunk');\n  var encryptedChunkLen = encryptedChunk.length;\n  if (encryptedChunkLen < 4 + BOXZEROBYTES) return this._fail();\n  var chunkLen = readChunkLength(encryptedChunk);\n  if (chunkLen < 0 || chunkLen > this._maxChunkLength) return this._fail();\n  if (chunkLen + 4 + BOXZEROBYTES !== encryptedChunkLen) return this._fail();\n  for (var i = 0; i < BOXZEROBYTES; i++) this._in[i] = 0;\n  for (i = 0; i < encryptedChunkLen - 4; i++) this._in[BOXZEROBYTES + i] = encryptedChunk[i + 4];\n  if (isLast) {\n    setLastChunkFlag(this._fullNonce);\n    this._done = true;\n  }\n  if (secretbox_open(this._out, this._in, encryptedChunkLen + BOXZEROBYTES - 4,\n    this._fullNonce, this._key) !== 0) return this._fail();\n  incrementChunkCounter(this._fullNonce);\n  return new Uint8Array(this._out.subarray(ZEROBYTES, ZEROBYTES + chunkLen));\n};\n\nStreamDecryptor.prototype.clean = function () {\n  clean(this._fullNonce, this._in, this._out);\n};\n\nnacl.stream = {\n  createEncryptor: function (k, n, c) { return new StreamEncryptor(k, n, c); },\n  createDecryptor: function (k, n, c) { return new StreamDecryptor(k, n, c); },\n  readChunkLength: readChunkLength\n};\n\nexport default nacl;"
  },
  {
    "path": "src/utils/crypto/scrypt.js",
    "content": "/*!\n * Fast \"async\" scrypt implementation in JavaScript.\n * Copyright (c) 2013-2014 Dmitry Chestnykh | BSD License\n * https://github.com/dchest/scrypt-async-js\n */\n\n/*\n * Limitation: doesn't support parallelization parameter greater than 1.\n */\n\n/**\n * scrypt(password, salt, logN, r, dkLen, interruptStep, callback, encoding)\n *\n * Derives a key from password and salt and calls callback\n * with derived key as the only argument.\n *\n * @param {string|Array.<number>} password Password.\n * @param {string|Array.<number>} salt Salt.\n * @param {number} logN  CPU/memory cost parameter (1 to 31).\n * @param {number} r     Block size parameter.\n * @param {number} dkLen Length of derived key.\n * @param {number} interruptStep Steps to split calculation with timeouts (default 1000).\n * @param {function(string)} callback Callback function.\n * @param {string?} encoding Result encoding (\"base64\", \"hex\", or null).\n */\nfunction scrypt(password, salt, logN, r, dkLen, interruptStep, callback, encoding) {\n  'use strict';\n\n  function SHA256(m) {\n    /** @const */ var K = [\n      0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n      0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n      0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n      0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n      0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n      0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n      0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n      0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n      0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n      0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n      0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n      0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n      0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n    ];\n\n    var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a,\n      h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19,\n      w = new Array(64);\n\n    function blocks(p) {\n      var off = 0, len = p.length;\n      while (len >= 64) {\n        var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7,\n          u, i, j, t1, t2;\n\n        for (i = 0; i < 16; i++) {\n          j = off + i * 4;\n          w[i] = ((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n            ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff);\n        }\n\n        for (i = 16; i < 64; i++) {\n          u = w[i - 2];\n          t1 = ((u >>> 17) | (u << (32 - 17))) ^ ((u >>> 19) | (u << (32 - 19))) ^ (u >>> 10);\n\n          u = w[i - 15];\n          t2 = ((u >>> 7) | (u << (32 - 7))) ^ ((u >>> 18) | (u << (32 - 18))) ^ (u >>> 3);\n\n          w[i] = (((t1 + w[i - 7]) | 0) + ((t2 + w[i - 16]) | 0)) | 0;\n        }\n\n        for (i = 0; i < 64; i++) {\n          t1 = ((((((e >>> 6) | (e << (32 - 6))) ^ ((e >>> 11) | (e << (32 - 11))) ^\n            ((e >>> 25) | (e << (32 - 25)))) + ((e & f) ^ (~e & g))) | 0) +\n            ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n\n          t2 = ((((a >>> 2) | (a << (32 - 2))) ^ ((a >>> 13) | (a << (32 - 13))) ^\n            ((a >>> 22) | (a << (32 - 22)))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n\n          h = g;\n          g = f;\n          f = e;\n          e = (d + t1) | 0;\n          d = c;\n          c = b;\n          b = a;\n          a = (t1 + t2) | 0;\n        }\n\n        h0 = (h0 + a) | 0;\n        h1 = (h1 + b) | 0;\n        h2 = (h2 + c) | 0;\n        h3 = (h3 + d) | 0;\n        h4 = (h4 + e) | 0;\n        h5 = (h5 + f) | 0;\n        h6 = (h6 + g) | 0;\n        h7 = (h7 + h) | 0;\n\n        off += 64;\n        len -= 64;\n      }\n    }\n\n    blocks(m);\n\n    var i, bytesLeft = m.length % 64,\n      bitLenHi = (m.length / 0x20000000) | 0,\n      bitLenLo = m.length << 3,\n      numZeros = (bytesLeft < 56) ? 56 : 120,\n      p = m.slice(m.length - bytesLeft, m.length);\n\n    p.push(0x80);\n    for (i = bytesLeft + 1; i < numZeros; i++) p.push(0);\n    p.push((bitLenHi >>> 24) & 0xff);\n    p.push((bitLenHi >>> 16) & 0xff);\n    p.push((bitLenHi >>> 8) & 0xff);\n    p.push((bitLenHi >>> 0) & 0xff);\n    p.push((bitLenLo >>> 24) & 0xff);\n    p.push((bitLenLo >>> 16) & 0xff);\n    p.push((bitLenLo >>> 8) & 0xff);\n    p.push((bitLenLo >>> 0) & 0xff);\n\n    blocks(p);\n\n    return [\n      (h0 >>> 24) & 0xff, (h0 >>> 16) & 0xff, (h0 >>> 8) & 0xff, (h0 >>> 0) & 0xff,\n      (h1 >>> 24) & 0xff, (h1 >>> 16) & 0xff, (h1 >>> 8) & 0xff, (h1 >>> 0) & 0xff,\n      (h2 >>> 24) & 0xff, (h2 >>> 16) & 0xff, (h2 >>> 8) & 0xff, (h2 >>> 0) & 0xff,\n      (h3 >>> 24) & 0xff, (h3 >>> 16) & 0xff, (h3 >>> 8) & 0xff, (h3 >>> 0) & 0xff,\n      (h4 >>> 24) & 0xff, (h4 >>> 16) & 0xff, (h4 >>> 8) & 0xff, (h4 >>> 0) & 0xff,\n      (h5 >>> 24) & 0xff, (h5 >>> 16) & 0xff, (h5 >>> 8) & 0xff, (h5 >>> 0) & 0xff,\n      (h6 >>> 24) & 0xff, (h6 >>> 16) & 0xff, (h6 >>> 8) & 0xff, (h6 >>> 0) & 0xff,\n      (h7 >>> 24) & 0xff, (h7 >>> 16) & 0xff, (h7 >>> 8) & 0xff, (h7 >>> 0) & 0xff\n    ];\n  }\n\n  function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {\n    // compress password if it's longer than hash block length\n    password = password.length <= 64 ? password : SHA256(password);\n\n    var i, innerLen = 64 + salt.length + 4,\n      inner = new Array(innerLen),\n      outerKey = new Array(64),\n      dk = [];\n\n    // inner = (password ^ ipad) || salt || counter\n    for (i = 0; i < 64; i++) inner[i] = 0x36;\n    for (i = 0; i < password.length; i++) inner[i] ^= password[i];\n    for (i = 0; i < salt.length; i++) inner[64 + i] = salt[i];\n    for (i = innerLen - 4; i < innerLen; i++) inner[i] = 0;\n\n    // outerKey = password ^ opad\n    for (i = 0; i < 64; i++) outerKey[i] = 0x5c;\n    for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];\n\n    // increments counter inside inner\n    function incrementCounter() {\n      for (var i = innerLen - 1; i >= innerLen - 4; i--) {\n        inner[i]++;\n        if (inner[i] <= 0xff) return;\n        inner[i] = 0;\n      }\n    }\n\n    // output blocks = SHA256(outerKey || SHA256(inner)) ...\n    while (dkLen >= 32) {\n      incrementCounter();\n      dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));\n      dkLen -= 32;\n    }\n    if (dkLen > 0) {\n      incrementCounter();\n      dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));\n    }\n    return dk;\n  }\n\n  function salsaXOR(tmp, B, bin, bout) {\n    var j0 = tmp[0] ^ B[bin++],\n      j1 = tmp[1] ^ B[bin++],\n      j2 = tmp[2] ^ B[bin++],\n      j3 = tmp[3] ^ B[bin++],\n      j4 = tmp[4] ^ B[bin++],\n      j5 = tmp[5] ^ B[bin++],\n      j6 = tmp[6] ^ B[bin++],\n      j7 = tmp[7] ^ B[bin++],\n      j8 = tmp[8] ^ B[bin++],\n      j9 = tmp[9] ^ B[bin++],\n      j10 = tmp[10] ^ B[bin++],\n      j11 = tmp[11] ^ B[bin++],\n      j12 = tmp[12] ^ B[bin++],\n      j13 = tmp[13] ^ B[bin++],\n      j14 = tmp[14] ^ B[bin++],\n      j15 = tmp[15] ^ B[bin++],\n      u, i;\n\n    var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n      x15 = j15;\n\n    for (i = 0; i < 8; i += 2) {\n      u = x0 + x12; x4 ^= u << 7 | u >>> (32 - 7);\n      u = x4 + x0; x8 ^= u << 9 | u >>> (32 - 9);\n      u = x8 + x4; x12 ^= u << 13 | u >>> (32 - 13);\n      u = x12 + x8; x0 ^= u << 18 | u >>> (32 - 18);\n\n      u = x5 + x1; x9 ^= u << 7 | u >>> (32 - 7);\n      u = x9 + x5; x13 ^= u << 9 | u >>> (32 - 9);\n      u = x13 + x9; x1 ^= u << 13 | u >>> (32 - 13);\n      u = x1 + x13; x5 ^= u << 18 | u >>> (32 - 18);\n\n      u = x10 + x6; x14 ^= u << 7 | u >>> (32 - 7);\n      u = x14 + x10; x2 ^= u << 9 | u >>> (32 - 9);\n      u = x2 + x14; x6 ^= u << 13 | u >>> (32 - 13);\n      u = x6 + x2; x10 ^= u << 18 | u >>> (32 - 18);\n\n      u = x15 + x11; x3 ^= u << 7 | u >>> (32 - 7);\n      u = x3 + x15; x7 ^= u << 9 | u >>> (32 - 9);\n      u = x7 + x3; x11 ^= u << 13 | u >>> (32 - 13);\n      u = x11 + x7; x15 ^= u << 18 | u >>> (32 - 18);\n\n      u = x0 + x3; x1 ^= u << 7 | u >>> (32 - 7);\n      u = x1 + x0; x2 ^= u << 9 | u >>> (32 - 9);\n      u = x2 + x1; x3 ^= u << 13 | u >>> (32 - 13);\n      u = x3 + x2; x0 ^= u << 18 | u >>> (32 - 18);\n\n      u = x5 + x4; x6 ^= u << 7 | u >>> (32 - 7);\n      u = x6 + x5; x7 ^= u << 9 | u >>> (32 - 9);\n      u = x7 + x6; x4 ^= u << 13 | u >>> (32 - 13);\n      u = x4 + x7; x5 ^= u << 18 | u >>> (32 - 18);\n\n      u = x10 + x9; x11 ^= u << 7 | u >>> (32 - 7);\n      u = x11 + x10; x8 ^= u << 9 | u >>> (32 - 9);\n      u = x8 + x11; x9 ^= u << 13 | u >>> (32 - 13);\n      u = x9 + x8; x10 ^= u << 18 | u >>> (32 - 18);\n\n      u = x15 + x14; x12 ^= u << 7 | u >>> (32 - 7);\n      u = x12 + x15; x13 ^= u << 9 | u >>> (32 - 9);\n      u = x13 + x12; x14 ^= u << 13 | u >>> (32 - 13);\n      u = x14 + x13; x15 ^= u << 18 | u >>> (32 - 18);\n    }\n\n    B[bout++] = tmp[0] = (x0 + j0) | 0;\n    B[bout++] = tmp[1] = (x1 + j1) | 0;\n    B[bout++] = tmp[2] = (x2 + j2) | 0;\n    B[bout++] = tmp[3] = (x3 + j3) | 0;\n    B[bout++] = tmp[4] = (x4 + j4) | 0;\n    B[bout++] = tmp[5] = (x5 + j5) | 0;\n    B[bout++] = tmp[6] = (x6 + j6) | 0;\n    B[bout++] = tmp[7] = (x7 + j7) | 0;\n    B[bout++] = tmp[8] = (x8 + j8) | 0;\n    B[bout++] = tmp[9] = (x9 + j9) | 0;\n    B[bout++] = tmp[10] = (x10 + j10) | 0;\n    B[bout++] = tmp[11] = (x11 + j11) | 0;\n    B[bout++] = tmp[12] = (x12 + j12) | 0;\n    B[bout++] = tmp[13] = (x13 + j13) | 0;\n    B[bout++] = tmp[14] = (x14 + j14) | 0;\n    B[bout++] = tmp[15] = (x15 + j15) | 0;\n  }\n\n  function blockCopy(dst, di, src, si, len) {\n    while (len--) dst[di++] = src[si++];\n  }\n\n  function blockXOR(dst, di, src, si, len) {\n    while (len--) dst[di++] ^= src[si++];\n  }\n\n  function blockMix(tmp, B, bin, bout, r) {\n    blockCopy(tmp, 0, B, bin + (2 * r - 1) * 16, 16);\n    for (var i = 0; i < 2 * r; i += 2) {\n      salsaXOR(tmp, B, bin + i * 16, bout + i * 8);\n      salsaXOR(tmp, B, bin + i * 16 + 16, bout + i * 8 + r * 16);\n    }\n  }\n\n  function integerify(B, bi, r) {\n    return B[bi + (2 * r - 1) * 16];\n  }\n\n  function stringToUTF8Bytes(s) {\n    var arr = [];\n    for (var i = 0; i < s.length; i++) {\n      var c = s.charCodeAt(i);\n      if (c < 128) {\n        arr.push(c);\n      } else if (c > 127 && c < 2048) {\n        arr.push((c >> 6) | 192);\n        arr.push((c & 63) | 128);\n      } else {\n        arr.push((c >> 12) | 224);\n        arr.push(((c >> 6) & 63) | 128);\n        arr.push((c & 64) | 128);\n      }\n    }\n    return arr;\n  }\n\n  function bytesToHex(p) {\n    /** @const */\n    var enc = '0123456789abcdef'.split('');\n\n    var len = p.length,\n      arr = [],\n      i = 0;\n\n    for (; i < len; i++) {\n      arr.push(enc[(p[i] >>> 4) & 15]);\n      arr.push(enc[(p[i] >>> 0) & 15]);\n    }\n    return arr.join('');\n  }\n\n  function bytesToBase64(p) {\n    /** @const */\n    var enc = ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' +\n      '0123456789+/').split('');\n\n    var len = p.length,\n      arr = [],\n      i = 0,\n      a, b, c, t;\n\n    while (i < len) {\n      a = i < len ? p[i++] : 0;\n      b = i < len ? p[i++] : 0;\n      c = i < len ? p[i++] : 0;\n      t = (a << 16) + (b << 8) + c;\n      arr.push(enc[(t >>> 3 * 6) & 63]);\n      arr.push(enc[(t >>> 2 * 6) & 63]);\n      arr.push(enc[(t >>> 1 * 6) & 63]);\n      arr.push(enc[(t >>> 0 * 6) & 63]);\n    }\n    if (len % 3 > 0) {\n      arr[arr.length - 1] = '=';\n      if (len % 3 == 1) arr[arr.length - 2] = '=';\n    }\n    return arr.join('');\n  }\n\n\n  // Generate key.\n\n  // Set parallelization parameter to 1.\n  var p = 1;\n\n  if (logN < 1 || logN > 31)\n    throw new Error('scrypt: logN not be between 1 and 31');\n\n  var MAX_INT = (1 << 31) >>> 0,\n    N = (1 << logN) >>> 0,\n    XY, V, B, tmp;\n\n  if (r * p >= 1 << 30 || r > MAX_INT / 128 / p || r > MAX_INT / 256 || N > MAX_INT / 128 / r)\n    throw new Error('scrypt: parameters are too large');\n\n  // Decode strings.\n  if (typeof password == 'string')\n    password = stringToUTF8Bytes(password);\n  if (typeof salt == 'string')\n    salt = stringToUTF8Bytes(salt);\n\n  if (typeof Int32Array !== 'undefined') {\n    //XXX We can use Uint32Array, but Int32Array is faster in Safari.\n    XY = new Int32Array(64 * r);\n    V = new Int32Array(32 * N * r);\n    tmp = new Int32Array(16);\n  } else {\n    XY = [];\n    V = [];\n    tmp = new Array(16);\n  }\n  B = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);\n\n  var xi = 0, yi = 32 * r;\n\n  function smixStart() {\n    for (var i = 0; i < 32 * r; i++) {\n      var j = i * 4;\n      XY[xi + i] = ((B[j + 3] & 0xff) << 24) | ((B[j + 2] & 0xff) << 16) |\n        ((B[j + 1] & 0xff) << 8) | ((B[j + 0] & 0xff) << 0);\n    }\n  }\n\n  function smixStep1(start, end) {\n    for (var i = start; i < end; i += 2) {\n      blockCopy(V, i * (32 * r), XY, xi, 32 * r);\n      blockMix(tmp, XY, xi, yi, r);\n\n      blockCopy(V, (i + 1) * (32 * r), XY, yi, 32 * r);\n      blockMix(tmp, XY, yi, xi, r);\n    }\n  }\n\n  function smixStep2(start, end) {\n    for (var i = start; i < end; i += 2) {\n      var j = integerify(XY, xi, r) & (N - 1);\n      blockXOR(XY, xi, V, j * (32 * r), 32 * r);\n      blockMix(tmp, XY, xi, yi, r);\n\n      j = integerify(XY, yi, r) & (N - 1);\n      blockXOR(XY, yi, V, j * (32 * r), 32 * r);\n      blockMix(tmp, XY, yi, xi, r);\n    }\n  }\n\n  function smixFinish() {\n    for (var i = 0; i < 32 * r; i++) {\n      var j = XY[xi + i];\n      B[i * 4 + 0] = (j >>> 0) & 0xff;\n      B[i * 4 + 1] = (j >>> 8) & 0xff;\n      B[i * 4 + 2] = (j >>> 16) & 0xff;\n      B[i * 4 + 3] = (j >>> 24) & 0xff;\n    }\n  }\n\n  function interruptedFor(start, end, step, fn, donefn) {\n    (function performStep() {\n      setTimeout(function () {\n        fn(start, start + step < end ? start + step : end);\n        start += step;\n        if (start < end)\n          performStep();\n        else\n          donefn();\n      }, 0);\n    })();\n  }\n\n  // Note: step argument for interruptedFor must be divisible by\n  // two, since smixStepX work in increments of 2.\n  if (!interruptStep) interruptStep = 1000;\n\n  smixStart();\n  interruptedFor(0, N, interruptStep * 2, smixStep1, function () {\n    interruptedFor(0, N, interruptStep * 2, smixStep2, function () {\n      smixFinish();\n      var result = PBKDF2_HMAC_SHA256_OneIter(password, B, dkLen);\n      if (encoding == \"base64\")\n        callback(bytesToBase64(result));\n      else if (encoding == \"hex\")\n        callback(bytesToHex(result));\n      else\n        callback(result);\n    });\n  });\n}\n\nexport default scrypt;\n"
  },
  {
    "path": "src/utils/detect_browser.js",
    "content": "if (!window.browser) {\n  const ua = navigator.userAgent;\n  const browsers = ['Safari', 'MSIE', 'Firefox'];\n  for (var i = 0; i < browsers.length; i++) {\n    if (ua.indexOf(browsers[i]) > -1){\n      window.browser = browsers[i];\n      break;\n    }\n  }\n  let Chrome = ua.indexOf('Chrome') > -1;\n  if ((window.browser === 'Safari') && (Chrome)) window.browser = 'Chrome';\n}\n"
  },
  {
    "path": "src/utils/emoji_convertor.js",
    "content": "import { EmojiConvertor } from 'emoji-js';\nimport { EMOJI_APPLE_64_PATH, EMOJI_APPLE_64_SHEET } from '../constants/emoji';\n\nconst emoji = new EmojiConvertor();\n\nemoji.allow_native = false;\nemoji.img_sets.apple.path = '/' + EMOJI_APPLE_64_PATH;\nemoji.img_sets.apple.sheet = '/' + EMOJI_APPLE_64_SHEET;\n\nexport default emoji;\n"
  },
  {
    "path": "src/utils/encrypter.js",
    "content": "import { genPassphrase } from '../data/minishare';\n\nconst sha384 = require('js-sha512').sha384;\n\nconst emailDomain = '@cryptag.org';\n\nexport function getEmail(passphrase){\n  return sha384(passphrase) + emailDomain;\n}\n\nexport function getPassphrase(documentHash){\n  let isNewPassphrase = false;\n\n  let passphrase = documentHash || '#';\n  passphrase = passphrase.slice(1);\n\n  // Generate new passphrase for user if none specified (that is, if the\n  // URL hash is blank)\n  if (!passphrase){\n    passphrase = genPassphrase();\n    isNewPassphrase = true;\n  }\n\n  return {\n    passphrase,\n    isNewPassphrase\n  };\n}\n\n// TODO: Do smarter msgKey creation\nexport function generateMessageKey(i){\n  let date = new Date();\n  return date.toGMTString() + ' - ' + date.getSeconds() + '.' + date.getMilliseconds() + '.' + i;\n}\n"
  },
  {
    "path": "src/utils/link_attr_blank.js",
    "content": "const md = require('markdown-it')({\n  html: false,\n  linkify: true,\n  typographer: false\n});\n\nconst assignAttributes = (tokens, idx, attrObj) => {\n  Object.keys(attrObj).forEach((attr) => {\n    const aIndex = tokens[idx].attrIndex(attr);\n    if (aIndex < 0) {\n      tokens[idx].attrPush([attr, attrObj[attr]]); // add new attribute\n    } else {\n      tokens[idx].attrs[aIndex][1] = attrObj[attr]; // replace value of existing attr\n    }\n  });\n};\nconst defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) {\n  return self.renderToken(tokens, idx, options);\n};\n\nmd.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n  assignAttributes(tokens, idx, {\n    target: '_blank',\n    rel: 'nofollow noreferrer noopener'\n  });\n  // pass token to default renderer.\n  return defaultRender(tokens, idx, options, env, self);\n};\n\nexport default md;\n"
  },
  {
    "path": "src/utils/miniLock.js",
    "content": "import BLAKE2s from 'blake2s';\nimport Base58 from 'bs58';\nimport nacl from './crypto/nacl';\nimport scrypt from './crypto/scrypt';\n\nconst miniLock = {};\n\n// -----------------------\n// Settings\n// -----------------------\n\nminiLock.settings = {};\n\n// Minimum entropy for user key\nminiLock.settings.minKeyEntropy = 100;\n\n// This is where session variables are stored\nminiLock.session = {\n  keys: {},\n  keyPairReady: false\n};\n\n// -----------------------\n// Utility Functions\n// -----------------------\n\nminiLock.util = {};\n\n// Input: none\n// Result: Resets miniLock.session.currentFile\nminiLock.util.resetCurrentFile = function () {\n};\n\n// Input: String\n// Output: Boolean\n// Notes: Validates if string is a proper miniLock ID.\nminiLock.util.validateID = function (id) {\n  var base58Match = new RegExp(\n    '^[1-9ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$'\n  );\n  if (\n    (id.length > 55) ||\n  (id.length < 40)\n  ) {\n    return false;\n  }\n  if (!base58Match.test(id)) {\n    return false;\n  }\n  var bytes = Base58.decode(id);\n  if (bytes.length !== 33) {\n    return false;\n  }\n  var hash = new BLAKE2s(1);\n  hash.update(bytes.subarray(0, 32));\n  if (hash.digest()[0] !== bytes[32]) {\n    return false;\n  }\n  return true;\n};\n\n// Input: Nonce (Base64) (String), Expected nonce length in bytes (Number)\n// Output: Boolean\n// Notes: Validates if string is a proper nonce.\nminiLock.util.validateNonce = function (nonce, expectedLength) {\n  var base64Match = new RegExp(\n    '^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$'\n  );\n  if (\n    (nonce.length > 40) ||\n  (nonce.length < 10)\n  ) {\n    return false;\n  }\n  if (base64Match.test(nonce)) {\n    var bytes = nacl.util.decodeBase64(nonce);\n    return bytes.length === expectedLength;\n  }\n  return false;\n};\n\n// Input: String\n// Output: Boolean\n// Notes: Validates if string is a proper symmetric key.\nminiLock.util.validateKey = function (key) {\n  var base64Match = new RegExp(\n    '^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$'\n  );\n  if (\n    (key.length > 50) ||\n  (key.length < 40)\n  ) {\n    return false;\n  }\n  if (base64Match.test(key)) {\n    var bytes = nacl.util.decodeBase64(key);\n    return bytes.length === 32;\n  }\n  return false;\n};\n\nminiLock.util.validateEphemeral = miniLock.util.validateKey;\n\n// Input: none\n// Output: Random string suitable for use as filename.\nminiLock.util.getRandomFilename = function () {\n  var randomBytes = nacl.randomBytes(6);\n  return Base58.encode(randomBytes);\n};\n\n// Input: Filename (String)\n// Output: Whether filename extension looks suspicious (Boolean)\nminiLock.util.isFilenameSuspicious = function (filename) {\n  var suspicious = [\n    'exe', 'scr', 'url', 'com', 'pif', 'bat',\n    'xht', 'htm', 'html', 'xml', 'xhtml', 'js',\n    'sh', 'svg', 'gadget', 'msi', 'msp', 'hta',\n    'cpl', 'msc', 'jar', 'cmd', 'vb', 'vbs',\n    'jse', 'ws', 'wsf', 'wsc', 'wsh', 'ps1',\n    'ps2', 'ps1xml', 'ps2xml', 'psc1', 'scf', 'lnk',\n    'inf', 'reg', 'doc', 'xls', 'ppt', 'pdf',\n    'swf', 'fla', 'docm', 'dotm', 'xlsm', 'xltm',\n    'xlam', 'pptm', 'potm', 'ppam', 'ppsm', 'sldm',\n    'dll', 'dllx', 'rar', 'zip', '7z', 'gzip',\n    'gzip2', 'tar', 'fon', 'svgz', 'jnlp'\n  ];\n  var extension = filename.toLowerCase().match(/\\.\\w+$/);\n  if (!extension) {\n    return true;\n  }\n  extension = extension[0].substring(1);\n  return (suspicious.indexOf(extension) >= 0);\n};\n\n// Input: 4-byte little-endian Uint8Array\n// Output: ByteArray converter to number\nminiLock.util.byteArrayToNumber = function (byteArray) {\n  var n = 0;\n  for (var i = 3; i >= 0; i--) {\n    n += byteArray[i];\n    if (i > 0) {\n      n = n << 8;\n    }\n  }\n  return n;\n};\n\n// Input: Number\n// Output: Number as 4-byte little-endian Uint8Array\nminiLock.util.numberToByteArray = function (n) {\n  var byteArray = [0, 0, 0, 0];\n  for (var i = 0; i < byteArray.length; i++) {\n    byteArray[i] = n & 255;\n    n = n >> 8;\n  }\n  return new Uint8Array(byteArray);\n};\n\n// -----------------------\n// Cryptographic Functions\n// -----------------------\n\nminiLock.crypto = {};\n\n// Chunk size (in bytes)\n// Warning: Must not be less than 256 bytes\nminiLock.crypto.chunkSize = 1024 * 1024 * 1;\n\n// Input: User key hash (Uint8Array), Salt (Uint8Array), callback function\n// Result: Calls scrypt which returns\n//\t32 bytes of key material in a Uint8Array,\n//\twhich then passed to the callback.\nminiLock.crypto.getScryptKey = function (key, salt, callback) {\n  scrypt(key, salt, 17, 8, 32, 1000, function (keyBytes) {\n    return callback(nacl.util.decodeBase64(keyBytes));\n  }, 'base64');\n};\n\n// Input: User key, user email\n// Output: Whether key is strong enough\nminiLock.crypto.checkKeyStrength = function (key, email) {\n  var minEntropy = miniLock.settings.minKeyEntropy;\n  if (key.length < 32) { return false; }\n  if (key.match(email)) { return false; }\n  return (zxcvbn(key).entropy > minEntropy);\n};\n\n// Input: User key (String), User salt (email) (String), callback (function)\n// Result: Passes the following object to the callback:\n// {\n//\tpublicKey: Public encryption key (Uint8Array),\n//\tsecretKey: Secret encryption key (Uint8Array)\n// }\nminiLock.crypto.getKeyPair = function (key, salt, callback) {\n  var keyHash = new BLAKE2s(32);\n  keyHash.update(nacl.util.decodeUTF8(key));\n  salt = nacl.util.decodeUTF8(salt);\n  miniLock.crypto.getScryptKey(keyHash.digest(), salt, function (keyBytes) {\n    if (typeof (callback) === 'function') {\n      callback(nacl.box.keyPair.fromSecretKey(keyBytes));\n    }\n  });\n};\n\n// Input: none\n// Output: nonce for usage in encryption operations\nminiLock.crypto.getNonce = function () {\n  return nacl.randomBytes(24);\n};\n\n// Input: none\n// Output: File key for usage in nacl.secretbox() encryption operations\nminiLock.crypto.getFileKey = function () {\n  return nacl.randomBytes(32);\n};\n\n// Input: Public encryption key (Uint8Array)\n// Output: miniLock ID (Base58)\nminiLock.crypto.getMiniLockID = function (publicKey) {\n  if (publicKey.length !== 32) {\n    throw new Error('miniLock.crypto.getMiniLockID: invalid public key size');\n    return false;\n  }\n  var id = new Uint8Array(33);\n  for (var i = 0; i < publicKey.length; i++) {\n    id[i] = publicKey[i];\n  }\n  var hash = new BLAKE2s(1);\n  hash.update(publicKey);\n  id[32] = hash.digest()[0];\n  return Base58.encode(id);\n};\n\n// Input: Object:\n//\t{\n//\t\tname: File name,\n//\t\tsize: File size,\n//\t\tdata: File (ArrayBuffer),\n//\t}\n// saveName: Name to use when saving resulting file. '.minilock' extension will be added.\n// miniLockIDs: Array of (Base58) public IDs to encrypt for\n// myMiniLockID: Sender's miniLock ID (String)\n// mySecretKey: My secret key (Uint8Array)\n// callback: Name of the callback function to which encrypted result is passed.\n// Result: Sends file to be encrypted, with the result picked up\n//\t and sent to the specified callback.\nminiLock.crypto.encryptFile = function (\n  file,\n  saveName,\n  miniLockIDs,\n  myMiniLockID,\n  mySecretKey,\n  callback\n) {\n  var currentFile = miniLock.file.new();\n  currentFile.fileName = file.name;\n  saveName += '.minilock';\n  var fileKey = miniLock.crypto.getFileKey();\n  var fileNonce = miniLock.crypto.getNonce().subarray(0, 16);\n  currentFile.streamEncryptor = nacl.stream.createEncryptor(\n    fileKey,\n    fileNonce,\n    miniLock.crypto.chunkSize\n  );\n  var paddedFileName = new Uint8Array(256);\n  var fileNameBytes = nacl.util.decodeUTF8(file.name);\n  if (fileNameBytes.length > paddedFileName.length) {\n    throw new Error('miniLock: Encryption failed - file name is too long');\n  }\n  paddedFileName.set(fileNameBytes);\n  currentFile.hashObject = new BLAKE2s(32);\n  var encryptedChunk;\n  encryptedChunk = currentFile.streamEncryptor.encryptChunk(\n    paddedFileName,\n    false\n  );\n  if (!encryptedChunk) {\n    throw new Error('miniLock: Encryption failed - general encryption error');\n    return false;\n  }\n  currentFile.hashObject.update(encryptedChunk);\n  currentFile.encryptedChunks.push(encryptedChunk);\n  miniLock.crypto.encryptNextChunk(\n    file,\n    0,\n    saveName,\n    fileKey,\n    fileNonce,\n    miniLockIDs,\n    myMiniLockID,\n    mySecretKey,\n    currentFile,\n    callback\n  );\n};\n\n//\tInput:\n//\t\tEntire file object,\n//\t\tdata position on which to start decryption (number),\n//\t\tName to use when saving the file (String),\n//\t\tfileKey (Uint8Array),\n//\t\tfileNonce (Uint8Array),\n//\t\tminiLock IDs for which to encrypt (Array),\n//\t\tsender ID (Base58 string),\n//\t\tsender long-term secret key (Uint8Array),\n//\t\tcurrent file (Object; see miniLock.file.new() for its structure)\n//\t\tCallback to execute when last chunk has been decrypted.\n//\tResult: Will recursively encrypt until the last chunk,\n//\t\tat which point callbackOnComplete() is called.\n//\t\tCallback is passed these parameters:\n//\t\t\tfile: Decrypted file object (blob),\n//\t\t\tsaveName: File name for saving the file (String),\n//\t\t\tsenderID: Sender's miniLock ID (Base58 string)\nminiLock.crypto.encryptNextChunk = function (\n  file,\n  dataPosition,\n  saveName,\n  fileKey,\n  fileNonce,\n  miniLockIDs,\n  myMiniLockID,\n  mySecretKey,\n  currentFile,\n  callbackOnComplete\n) {\n  miniLock.file.read(\n    file,\n    dataPosition,\n    dataPosition + miniLock.crypto.chunkSize,\n    function (chunk) {\n      chunk = chunk.data;\n      var isLast = false;\n      if (dataPosition >= (file.size - miniLock.crypto.chunkSize)) {\n        isLast = true;\n      }\n      var encryptedChunk;\n      encryptedChunk = currentFile.streamEncryptor.encryptChunk(\n        chunk,\n        isLast\n      );\n      if (!encryptedChunk) {\n        throw new Error('miniLock: Encryption failed - general encryption error');\n        return false;\n      }\n      currentFile.hashObject.update(encryptedChunk);\n      currentFile.encryptedChunks.push(encryptedChunk);\n      if (isLast) {\n        currentFile.streamEncryptor.clean();\n        // Finish generating header so we can pass finished file to callback\n        var ephemeral = nacl.box.keyPair();\n        var header = {\n          version: 1,\n          ephemeral: nacl.util.encodeBase64(ephemeral.publicKey),\n          decryptInfo: {}\n        };\n        var decryptInfoNonces = [];\n        for (var u = 0; u < miniLockIDs.length; u++) {\n          decryptInfoNonces.push(\n            miniLock.crypto.getNonce()\n          );\n        }\n        for (var i = 0; i < miniLockIDs.length; i++) {\n          var decryptInfo = {\n            senderID: myMiniLockID,\n            recipientID: miniLockIDs[i],\n            fileInfo: {\n              fileKey: nacl.util.encodeBase64(fileKey),\n              fileNonce: nacl.util.encodeBase64(fileNonce),\n              fileHash: nacl.util.encodeBase64(\n                currentFile.hashObject.digest()\n              )\n            }\n          };\n          decryptInfo.fileInfo = nacl.util.encodeBase64(nacl.box(\n            nacl.util.decodeUTF8(JSON.stringify(decryptInfo.fileInfo)),\n            decryptInfoNonces[i],\n            Base58.decode(miniLockIDs[i]).subarray(0, 32),\n            mySecretKey\n          ));\n          decryptInfo = nacl.util.encodeBase64(nacl.box(\n            nacl.util.decodeUTF8(JSON.stringify(decryptInfo)),\n            decryptInfoNonces[i],\n            Base58.decode(miniLockIDs[i]).subarray(0, 32),\n            ephemeral.secretKey\n          ));\n          header.decryptInfo[\n            nacl.util.encodeBase64(decryptInfoNonces[i])\n          ] = decryptInfo;\n        }\n        header = JSON.stringify(header);\n        currentFile.encryptedChunks.unshift(\n          'miniLock',\n          miniLock.util.numberToByteArray(header.length),\n          header\n        );\n        return callbackOnComplete(\n          new Blob(currentFile.encryptedChunks),\n          saveName,\n          myMiniLockID\n        );\n      }\n      else {\n        dataPosition += miniLock.crypto.chunkSize;\n        return miniLock.crypto.encryptNextChunk(\n          file,\n          dataPosition,\n          saveName,\n          fileKey,\n          fileNonce,\n          miniLockIDs,\n          myMiniLockID,\n          mySecretKey,\n          currentFile,\n          callbackOnComplete\n        );\n      }\n    }\n  );\n};\n\n\n// Input: Object:\n//\t{\n//\t\tname: File name,\n//\t\tsize: File size,\n//\t\tdata: Encrypted file (ArrayBuffer),\n//\t}\n// myMiniLockID: Sender's miniLock ID (String)\n// mySecretKey: Sender's secret key (Uint8Array)\n// callback: Name of the callback function to which decrypted result is passed.\n// Result: Sends file to be decrypted, with the result picked up\n//\tand sent to the specified callback.\nminiLock.crypto.decryptFile = function (\n  file,\n  myMiniLockID,\n  mySecretKey,\n  callback\n) {\n  var currentFile = miniLock.file.new();\n  miniLock.file.read(file, 8, 12, function (headerLength) {\n    headerLength = miniLock.util.byteArrayToNumber(\n      headerLength.data\n    );\n    miniLock.file.read(file, 12, headerLength + 12, function (header) {\n      try {\n        header = nacl.util.encodeUTF8(header.data);\n        header = JSON.parse(header);\n      }\n      catch (error) {\n        throw new Error('miniLock: Decryption failed - could not parse header');\n        return false;\n      }\n      if (\n        !header.hasOwnProperty('version')\n    || header.version !== 1\n      ) {\n        throw new Error('miniLock: Decryption failed - invalid header version');\n        return false;\n      }\n      if (\n        !header.hasOwnProperty('ephemeral')\n    || !miniLock.util.validateEphemeral(header.ephemeral)\n      ) {\n        throw new Error('miniLock: Decryption failed - could not parse header');\n        return false;\n      }\n      // Attempt decryptInfo decryptions until one succeeds\n      var actualDecryptInfo = null;\n      var actualDecryptInfoNonce = null;\n      var actualFileInfo = null;\n      for (var i in header.decryptInfo) {\n        if (\n          ({}).hasOwnProperty.call(header.decryptInfo, i)\n     && miniLock.util.validateNonce(i, 24)\n        ) {\n          actualDecryptInfo = nacl.box.open(\n            nacl.util.decodeBase64(header.decryptInfo[i]),\n            nacl.util.decodeBase64(i),\n            nacl.util.decodeBase64(header.ephemeral),\n            mySecretKey\n          );\n          if (actualDecryptInfo) {\n            actualDecryptInfo = JSON.parse(\n              nacl.util.encodeUTF8(actualDecryptInfo)\n            );\n            actualDecryptInfoNonce = nacl.util.decodeBase64(i);\n            break;\n          }\n        }\n      }\n      if (\n        !actualDecryptInfo\n    || !({}).hasOwnProperty.call(actualDecryptInfo, 'recipientID')\n    || actualDecryptInfo.recipientID !== myMiniLockID\n      ) {\n        throw new Error('miniLock: Decryption failed - File is not encrypted for this recipient');\n        return false;\n      }\n      if (\n        !({}).hasOwnProperty.call(actualDecryptInfo, 'fileInfo')\n    || !({}).hasOwnProperty.call(actualDecryptInfo, 'senderID')\n    || !miniLock.util.validateID(actualDecryptInfo.senderID)\n      ) {\n        throw new Error('miniLock: Decryption failed - could not validate sender ID');\n        return false;\n      }\n      try {\n        actualFileInfo = nacl.box.open(\n          nacl.util.decodeBase64(actualDecryptInfo.fileInfo),\n          actualDecryptInfoNonce,\n          Base58.decode(actualDecryptInfo.senderID).subarray(0, 32),\n          mySecretKey\n        );\n        actualFileInfo = JSON.parse(\n          nacl.util.encodeUTF8(actualFileInfo)\n        );\n      }\n      catch (err) {\n        throw new Error('miniLock: Decryption failed - could not parse header');\n        return false;\n      }\n      // Begin actual ciphertext decryption\n      var dataPosition = 12 + headerLength;\n      currentFile.streamDecryptor = nacl.stream.createDecryptor(\n        nacl.util.decodeBase64(actualFileInfo.fileKey),\n        nacl.util.decodeBase64(actualFileInfo.fileNonce),\n        miniLock.crypto.chunkSize\n      );\n      miniLock.crypto.decryptNextChunk(\n        file,\n        dataPosition,\n        actualFileInfo,\n        actualDecryptInfo.senderID,\n        headerLength,\n        currentFile,\n        callback\n      );\n    });\n  });\n};\n\n//\tInput:\n//\t\tEntire file object,\n//\t\tdata position on which to start decryption (number),\n//\t\tfileInfo object (From header),\n//\t\tsender ID (Base58 string),\n//\t\theader length (in bytes) (number),\n//\t\tcurrent file (Object; see miniLock.file.new() for its structure)\n//\t\tCallback to execute when last chunk has been decrypted.\n//\tResult: Will recursively decrypt until the last chunk,\n//\t\tat which point callbackOnComplete() is called.\n//\t\tCallback is passed these parameters:\n//\t\t\tfile: Decrypted file object (blob),\n//\t\t\tsaveName: File name for saving the file (String),\n//\t\t\tsenderID: Sender's miniLock ID (Base58 string)\nminiLock.crypto.decryptNextChunk = function (\n  file,\n  dataPosition,\n  fileInfo,\n  senderID,\n  headerLength,\n  currentFile,\n  callbackOnComplete\n) {\n  miniLock.file.read(\n    file,\n    dataPosition,\n    dataPosition + 4 + 16 + miniLock.crypto.chunkSize,\n    function (chunk) {\n      chunk = chunk.data;\n      var actualChunkLength = miniLock.util.byteArrayToNumber(\n        chunk.subarray(0, 4)\n      );\n      if (actualChunkLength > chunk.length) {\n        throw new Error('miniLock: Decryption failed - general decryption error');\n        return false;\n      }\n      chunk = chunk.subarray(\n        0, actualChunkLength + 4 + 16\n      );\n      var decryptedChunk;\n      var isLast = false;\n      if (\n        dataPosition >= ((file.size) - (4 + 16 + actualChunkLength))\n      ) {\n        isLast = true;\n      }\n      if (dataPosition === (12 + headerLength)) {\n        // This is the first chunk, containing the filename\n        decryptedChunk = currentFile.streamDecryptor.decryptChunk(\n          chunk,\n          isLast\n        );\n        if (!decryptedChunk) {\n          throw new Error('miniLock: Decryption failed - general decryption error');\n          return false;\n        }\n        var fileName = nacl.util.encodeUTF8(decryptedChunk.subarray(0, 256));\n        while (\n          fileName[fileName.length - 1] === String.fromCharCode(0x00)\n        ) {\n          fileName = fileName.slice(0, -1);\n        }\n        currentFile.fileName = fileName;\n        currentFile.hashObject.update(chunk.subarray(0, 256 + 4 + 16));\n      }\n      else {\n        decryptedChunk = currentFile.streamDecryptor.decryptChunk(\n          chunk,\n          isLast\n        );\n        if (!decryptedChunk) {\n          throw new Error('miniLock: Decryption failed - general decryption error');\n          return false;\n        }\n        currentFile.decryptedChunks.push(decryptedChunk);\n        currentFile.hashObject.update(chunk);\n      }\n      dataPosition += chunk.length;\n      if (isLast) {\n        if (\n          !nacl.verify(\n            new Uint8Array(currentFile.hashObject.digest()),\n            nacl.util.decodeBase64(fileInfo.fileHash)\n          )\n        ) {\n          throw new Error('miniLock: Decryption failed - could not validate file contents after decryption');\n          return false;\n        }\n        else {\n          currentFile.streamDecryptor.clean();\n          return callbackOnComplete(\n            new Blob(currentFile.decryptedChunks),\n            currentFile.fileName,\n            senderID\n          );\n        }\n      }\n      else {\n        return miniLock.crypto.decryptNextChunk(\n          file,\n          dataPosition,\n          fileInfo,\n          senderID,\n          headerLength,\n          currentFile,\n          callbackOnComplete\n        );\n      }\n    }\n  );\n};\n\n// -----------------------\n// File Processing\n// -----------------------\n\nminiLock.file = {};\n\n// Input: File object, bounds within which to read, and callbacks\n// Output: Callback function executed with object:\n//\t{\n//\t\tname: File name,\n//\t\tsize: File size (bytes),\n//\t\tdata: File data within specified bounds (Uint8Array)\n//\t}\n// Error callback which is called in case of error (no parameters)\nminiLock.file.read = function (file, start, end, callback, errorCallback) {\n  var reader = new FileReader();\n  reader.onload = function (readerEvent) {\n    return callback({\n      name: file.name,\n      size: file.size,\n      data: new Uint8Array(readerEvent.target.result)\n    });\n  };\n  reader.onerror = function () {\n    if (typeof (errorCallback) === 'function') {\n      return errorCallback();\n    }\n    else {\n      throw new Error('miniLock: File read error');\n      return false;\n    }\n  };\n  reader.readAsArrayBuffer(file.slice(start, end));\n};\n\nminiLock.file.new = function () {\n  return {\n    fileObject: null,\n    fileName: '',\n    encryptedChunks: [],\n    decryptedChunks: [],\n    hashObject: new BLAKE2s(32),\n    streamEncryptor: null,\n    streamDecryptor: null\n  };\n};\n\nexport default miniLock;"
  },
  {
    "path": "src/utils/origin_polyfill.js",
    "content": "// window.location.origin polyfill, as per\n// https://stackoverflow.com/a/25495161/197160 --\nif (!window.location.origin) {\n  window.location.origin = window.location.protocol + \"//\" +\n    window.location.hostname +\n    (window.location.port ? ':' + window.location.port : '');\n}\n"
  },
  {
    "path": "src/utils/pagevisibility.js",
    "content": "// Derived from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\n\nexport function detectPageVisible(onVisible, onHidden, onClose){\n  //\n  // If user viewing page versus not\n  //\n\n  // Set the name of the hidden property and the change event for visibility\n  var hidden, visibilityChange;\n  if (typeof document.hidden !== \"undefined\") { // Opera 12.10 and Firefox 18 and later support\n    hidden = \"hidden\";\n    visibilityChange = \"visibilitychange\";\n  } else if (typeof document.msHidden !== \"undefined\") {\n    hidden = \"msHidden\";\n    visibilityChange = \"msvisibilitychange\";\n  } else if (typeof document.webkitHidden !== \"undefined\") {\n    hidden = \"webkitHidden\";\n    visibilityChange = \"webkitvisibilitychange\";\n  }\n\n  function handleVisibilityChange() {\n    if (document[hidden]) {\n      onHidden();\n    } else {\n      onVisible();\n    }\n  }\n\n  document.addEventListener(visibilityChange, handleVisibilityChange, false);\n\n  //\n  // If user closes tab or window\n  //\n\n  /*\n  window.onbeforeunload = function(e) {\n    onClose();  // Fires in some browsers, but not all\n\n    var msg = 'Do you want to leave this site?';\n    e.returnValue = msg;\n    return msg;\n  };\n  */\n}\n"
  },
  {
    "path": "src/utils/sessions.js",
    "content": "\n/**\n * Module intended to replace the init connection epic in chatEpics.js\n * Currently lacking connection retry capabilities on disconnect.\n * STRs: create a chat session in the browser, then kill the running \n *    leapchat binary, to simulate the server going away.\n * The 'disconnected' action can be dispatched on connection error,\n * however, this doesn't initiate a proper re-connect flow.\n * UNUSED FOR NOW.\n */\nimport { getEmail, getPassphrase } from '../utils/encrypter';\nimport miniLock from '../utils/miniLock';\n\n\nimport { disconnected } from '../store/actions/chatActions';\n\n// TODO: will be different host from a mobile device, probably if (!window)\nconst authUrl = `${window.location.origin}/api/login`;\n\n\nasync function connectWithAuthRequest(initiateConnection, mID, secretKey, isNewPassphrase) {\n  const response = await fetch(authUrl, {\n    method: \"GET\",\n    headers: {\n      'X-Minilock-Id': mID\n    }\n  });\n\n  const message = await response.blob();\n  miniLock.crypto.decryptFile(message, mID, secretKey,\n    function (fileBlob, saveName, senderID) {\n      const reader = new FileReader();\n      reader.addEventListener(\"loadend\", () => {\n        const authToken = reader.result;\n        initiateConnection({\n          authToken,\n          secretKey,\n          mID,\n          isNewRoom: isNewPassphrase,\n        });\n      });\n\n      reader.readAsText(fileBlob);\n    });\n}\n\nexport const initiateSessionAndConnect = (\n  initiateConnection,\n  createWebSession,\n  urlHash,\n) => {\n  // 1. Get passphrase\n  const {\n    passphrase,\n    isNewPassphrase\n  } = getPassphrase(urlHash);\n\n  // 2. Get email based on passphrase\n  let email = getEmail(passphrase);\n  // 3. Decrypt to get key pair\n  miniLock.crypto.getKeyPair(passphrase, email, async (keyPair) => {\n    miniLock.session.keys = keyPair;\n    miniLock.session.keyPairReady = true;\n    let mID = miniLock.crypto.getMiniLockID(keyPair.publicKey);\n    // 4. When we have keypair, create session on device\n    if (isNewPassphrase) {\n      await createWebSession(passphrase);\n    }\n\n    // 5. Initiate connection by doing auth dance\n    connectWithAuthRequest(initiateConnection, mID, keyPair.secretKey, isNewPassphrase);\n  });\n};"
  },
  {
    "path": "src/utils/suggestions.js",
    "content": "import { emojiIndex } from 'emoji-mart';\n\nexport const emojiSuggestions = (cursorStart, value) => {\n  const input = value.slice(cursorStart + 1);\n  const emojiSuggestions =  emojiIndex.search(input) || [];\n  const begin = [];\n  const end = [];\n  const colonInput = \":\" + input;\n  let suggestion;\n  for (var i = 0; i < emojiSuggestions.length; i++) {\n    suggestion = emojiSuggestions[i];\n    if (suggestion.colons.startsWith(colonInput)) {\n      begin.push({name: suggestion.colons});\n    } else {\n      end.push({name: suggestion.colons});\n    }\n  }\n  begin.sort(sortBySuggest);\n  end.sort(sortBySuggest);\n  return begin.concat(end);\n};\n\nexport const mentionSuggestions = (start, value, obj) => {\n  const users = Object.keys(obj);\n  const lowerCaseVal = value.slice( start + 1).toLowerCase();\n  let filteredMentions = [];\n  users.forEach((user) => {\n    const lowerCaseUser = user.toLowerCase();\n    if(lowerCaseUser.startsWith(lowerCaseVal)) {\n      filteredMentions.push({name: '@' + user, status: obj[user]});\n    }\n  });\n  return filteredMentions.sort(sortBySuggest);\n};\n\nconst sortBySuggest = (suggest1, suggest2) => {\n  return suggest1.name.localeCompare(suggest2.name);\n};\n\nexport const scrollIntoViewOptions = {behavior: 'instant', block: 'nearest'};\nif (window.browser === 'Firefox') {\n  delete(scrollIntoViewOptions.block);\n}\n"
  },
  {
    "path": "src/utils/tags.js",
    "content": "const utf8 = require('utf8');\nconst atob = require('atob');\nconst btoa = require('btoa');\n\nexport function tagByPrefix(plaintags, ...prefixes) {\n  let prefix = '';\n  for (let i = 0; i < prefixes.length; i++) {\n    prefix = prefixes[i];\n    for (let j = 0; j < plaintags.length; j++) {\n      if (plaintags[j].startsWith(prefix)) {\n        return plaintags[j];\n      }\n    }\n  }\n  return '';\n}\n\nexport function tagByPrefixStripped(plaintags, ...prefixes) {\n  let tag = '';\n  for (let i = 0; i < prefixes.length; i++) {\n    tag = tagByPrefix(plaintags, prefixes[i]);\n    if (tag !== '') {\n      return tag.slice(prefixes[i].length);\n    }\n  }\n\n  return '';\n}\n\nexport function tagsByPrefix(plaintags, prefix) {\n  let tags = [];\n  for (let i = 0; i < plaintags.length; i++) {\n    if (plaintags[i].startsWith(prefix)) {\n      tags.push(plaintags[i]);\n    }\n  }\n  return tags;\n}\n\nexport function tagsByPrefixStripped(plaintags, prefix) {\n  let stripped = [];\n  for (let i = 0; i < plaintags.length; i++) {\n    if (plaintags[i].startsWith(prefix)) {\n      // Strip off prefix\n      stripped.push(plaintags[i].slice(prefix.length));\n    }\n  }\n  return stripped;\n}\n\nexport function sortRowByCreated(row, nextRow){\n  let date = tagByPrefix(row.tags || row.plaintags, 'created:');\n  let next = tagByPrefix(nextRow.tags || nextRow.plaintags, 'created:');\n\n  return date.localeCompare(next);\n}\n\nexport function parseJSON(str){\n  return JSON.parse(utf8.decode(atob(str.unencrypted)));\n}\n\nexport function encodeObjForPost(obj){\n  return btoa(utf8.encode(JSON.stringify(obj)));\n}\n\nexport function cleanedFields(s){\n  let fields = s.trim().replace(',', ' ').split(/\\s+/g);\n  return fields.filter(f => f !== '');\n}\n"
  },
  {
    "path": "src/utils/time.js",
    "content": "export function nowUTC(){\n  return new Date(new Date().toUTCString().substr(0, 25));\n}\n"
  },
  {
    "path": "src/utils/vh_fix.js",
    "content": "import { Capacitor } from '@capacitor/core';\n\nfunction vh() {\n  return (window.innerHeight * 0.01) + 'px';\n}\ndocument.documentElement.style.setProperty('--vh', vh());\n\nvar lastHeight = window.innerHeight;\n\nwindow.addEventListener('resize', () => {\n  if (window.innerWidth > window.innerHeight ||\n      Math.abs(lastHeight - window.innerHeight) > 100) {\n    document.documentElement.style.setProperty(`--vh`, vh());\n    lastHeight = window.innerHeight;\n  }\n});\n\n\ndocument.documentElement.style.setProperty('--androidTopBar', '0px');\nif (Capacitor.isNativePlatform()) {\n  document.documentElement.style.setProperty('--androidTopBar', '36px');\n}\n"
  },
  {
    "path": "test/.setup.js",
    "content": "'use strict';\n\nrequire('@babel/register')();\n\nconst jsdom = require(\"jsdom\");\nconst { JSDOM } = jsdom;\n\n\nglobal.document = new JSDOM(`<!DOCTYPE html><html></html>`);\n\nglobal.window = document.window;\n\nglobal.navigator = window.navigator;\n\n"
  },
  {
    "path": "test/playwright/ChangeUsername.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst username = \"LeapChatUser\";\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n  await page.locator(\"#username\").fill(username);\n  await page.getByTestId(\"set-username\").click();\n});\n\ntest.describe(\"Opens username modal\", () => {\n  test(\"opens the user modal from user list\", async ({ page }) => {\n    await expect(page.locator(\"#username\")).not.toBeVisible();\n\n    await page.getByTestId(\"edit-username\").click();\n\n    await expect(page.locator(\"#username\")).toBeVisible();\n  });\n});\n"
  },
  {
    "path": "test/playwright/InfoModal.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst username = \"LeapChatUser\";\n\n\ntest.beforeEach(async ({ page }) => {\n  // set username\n  await page.goto(\"http://localhost:8080/\");\n  await page.locator(\"#username\").fill(username);\n  await page.getByTestId(\"set-username\").click();\n});\n\n\ntest.describe('Opens modal dialogs', () => {\n  test('can open and view info dialog', async ({ page }) => {\n    await expect(page.getByText(\"Welcome to LeapChat!\")).not.toBeVisible();\n\n    // open sesame\n    await page.locator(\".info\").click();\n    await expect(page.getByText(\"Welcome to LeapChat!\")).toBeVisible();\n\n    // shut yourself sesame\n    await page.locator(\".modal-header .btn-close\").click();\n    await expect(page.getByText(\"Welcome to LeapChat!\")).not.toBeVisible();\n  });\n});"
  },
  {
    "path": "test/playwright/InviteUsers.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst username = \"LeapChatUser\";\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n  await page.locator(\"#username\").fill(username);\n  await page.getByTestId(\"set-username\").click();\n});\n\ntest.describe(\"Opens sharing modal\", () => {\n  test(\"opens and closes the invite users modal by clicking gear icon\", async ({ page }) => {\n    await expect(page.getByText(\"Invite to Chat\")).not.toBeVisible();\n\n    await page.locator(\".sharing\").click();\n    await expect(page.getByText(\"Invite to Chat\")).toBeVisible();\n\n    await page.locator(\".modal-header .btn-close\").click();\n    await expect(page.getByText(\"Invite to Chat\")).not.toBeVisible();\n  });\n\n  test(\"opens and closes the invite users modal by clicking invite button in users list\", async ({ page }) => {\n    await expect(page.getByText(\"Invite to Chat\")).not.toBeVisible();\n\n    await page.locator(\".icon-button\").click();\n    await expect(page.getByText(\"Invite to Chat\")).toBeVisible();\n\n    await page.locator(\".modal-header .btn-close\").click();\n    await expect(page.getByText(\"Invite to Chat\")).not.toBeVisible();\n  });\n\n  test(\"copies invite link to browser clipboard\", async ({ page }) => {\n    await page.locator(\".sharing\").click();\n    await expect(page.getByText(\"Invite to Chat\")).toBeVisible();\n\n    // in order to check navigator.clipboard.readText(), we need to give playwright\n    //    permissions. Only chromium (not currently running) supports allowing this.\n    // Just check that we see the tooltip appear.\n\n    await expect(page.getByText(\"Link copied!\")).not.toBeVisible();\n    await page.locator(\".share-copy-link .icon-button\").click();\n    await expect(page.getByText(\"Link copied!\")).toBeVisible();\n    \n  });\n\n});\n"
  },
  {
    "path": "test/playwright/Message.spec.js",
    "content": ""
  },
  {
    "path": "test/playwright/SearchModal.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst username = \"LeapChatUser\";\n\nconst messages = [\n  \"Hey\",\n  \"Baa baa black sheep\",\n  \"Have you any wool?\",\n  \"Hello\",\n  \"Hello Hello\",\n  \"Hello Hello Hello\",\n  \"Hello!\",\n  \"What is up?\"\n];\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n  await page.locator(\"#username\").fill(username);\n  await page.getByTestId(\"set-username\").click();\n\n  for (let i = 0; i < messages.length; i++) {\n    await page.getByPlaceholder(\"Enter message\").fill(messages[i]);\n    await page.locator(\".message .btn-default\").click();\n  }\n});\n\ntest.describe(\"Message History Search Modal\", () => {\n  test(\"user can open and view the search modal\", async ({ page }) => {\n    await expect(page.locator(\"#message-search\")).not.toBeVisible();\n\n    await page.locator(\".open-message-search\").click();\n\n    await expect(page.locator(\"#message-search\")).toBeVisible();\n  });\n\n  test(\"user can enter text and view search results\", async ({ page }) => {\n    await page.locator(\".open-message-search\").click();\n\n    await page.locator(\"#message-search\").fill(\"black sheep\");\n    let resultsList = page.locator(\".search-results .chat-message\")\n    await expect(resultsList).toHaveCount(1);\n\n    await page.locator(\"#message-search\").fill(\"hello\");\n    resultsList = page.locator(\".search-results .chat-message\")\n    await expect(resultsList).toHaveCount(4);\n  });\n\n});\n"
  },
  {
    "path": "test/playwright/SetUsername.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nimport { MAX_USERNAME_LENGTH } from '../../src/components/modals/Username';\n\nconst username = \"LeapChatUser\";\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n});\n\ntest.describe('Sets an initial user name', () => {\n  test('sets username', async ({ page }) => {\n    await expect(page.locator(\".form-group .alert-success\")).toBeVisible();\n    await expect(page.locator(\".form-group .alert-success\")).toHaveText(/New room created/);\n\n    await page.locator(\"#username\").fill(username);\n    await page.getByTestId(\"set-username\").click();\n\n    await expect(page.locator(\"#username\")).not.toBeVisible();\n\n    await expect(page.locator(\".users-list\")).toContainText(username);\n  });\n\n  test(\"sees an error if username is empty\", async ({ page }) => {\n    await expect(page.locator(\".alert-danger\")).not.toBeVisible();\n    \n    await page.locator(\"#username\").fill(\"\");\n    await page.getByTestId(\"set-username\").click();\n    \n    await expect(page.locator(\".form-group .alert-danger\")).toBeVisible();\n    await expect(page.locator(\".form-group .alert-danger\")).toHaveText(/Must not be empty/);\n  });\n\n  test(\"sees an error if username is too long\", async ({ page }) => {\n    await expect(page.locator(\".alert-danger\")).not.toBeVisible();\n\n    const tooLongUsername = new Array(MAX_USERNAME_LENGTH + 3).join(\"X\");\n    \n    await page.locator(\"#username\").fill(tooLongUsername);\n    await page.getByTestId(\"set-username\").click();\n    \n    await expect(page.locator(\".alert-danger\")).toBeVisible();\n    const expectedError = new RegExp(`Length must not exceed ${MAX_USERNAME_LENGTH}`);\n    await expect(page.locator(\".alert-danger\")).toHaveText(expectedError);\n  });\n});\n"
  },
  {
    "path": "test/playwright/SettingsModal.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\nconst username = \"LeapChatUser\";\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n  await page.locator(\"#username\").fill(username);\n  await page.getByTestId(\"set-username\").click();\n});\n\ntest.describe(\"Opens settings modal\", () => {\n  test(\"opens and closes the settings modal by clicking gear icon\", async ({ page }) => {\n    await expect(page.getByText(\"Settings\")).not.toBeVisible();\n\n    await page.locator(\".settings\").click();\n    await expect(page.getByText(\"Settings\")).toBeVisible();\n\n    await page.locator(\".modal-header .btn-close\").click();\n    await expect(page.getByText(\"Settings\")).not.toBeVisible();\n  });\n\n  test(\"purges chat of all messages when delete all message button is clicked\", async ({ page }) => {\n    // TODO configure a whole mess of messages in the DOM from multiple users, then check that DOM is \n    //  cleared of all message bubble elements on page refresh.\n  });\n});\n"
  },
  {
    "path": "test/playwright/Welcome.spec.js",
    "content": "import { test, expect } from '@playwright/test';\n\ntest.beforeEach(async ({ page }) => {\n  await page.goto(\"http://localhost:8080/\");\n});\n\ntest.describe('Welcome', () => {\n  test('has title', async ({ page }) => {\n    // Expect a title \"to contain\" a substring.\n    await expect(page).toHaveTitle(/LeapChat/);\n\n    await expect(page.getByTestId(\"set-username-form\")).toBeVisible();\n  });\n});\n"
  },
  {
    "path": "test/utils/tags.test.js",
    "content": "import { expect } from 'chai';\n\nimport { tagByPrefix, cleanedFields } from '../../src/utils/tags';\n\ndescribe('tags', function () {\n\n  describe('#tagByPrefix', function () {\n    \n    it('returns first plaintag matching any prefix', function () {\n      let plaintags = ['chatmessage:hello', 'chatmessage:goodbye'];\n      let prefixes = ['invalidtype', 'chatmessage'];\n      let result = tagByPrefix(plaintags, ...prefixes);\n      expect(result).to.equal(plaintags[0]);\n\n      plaintags = ['invalidtype:something', 'picture:bytes']\n      prefixes = ['chatmessage', 'picture'];\n      result = tagByPrefix(plaintags, ...prefixes);\n      expect(result).to.equal(plaintags[1]);\n    });\n\n    it('returns empty string if no plaintag matches', function () {\n      let plaintags = ['chatmessage:hello', 'chatmessage:goodbye'];\n      let prefixes = ['invalidtype', 'otherinvalidtype'];\n      let result = tagByPrefix(plaintags, ...prefixes);\n      expect(result).to.equal('');\n    });\n\n  });\n\n  describe('#cleanedFields', function () {\n    it('converts empty string to empty array', function () {\n      let result = cleanedFields('');\n      expect(result).to.deep.equal([]);\n    });\n\n    it('converts string to array', function () {\n      let result = cleanedFields(' hello,there ');\n      expect(result).to.deep.equal(['hello', 'there']);\n    });\n\n    it('converts string with multi-whitespace separators to array', function () {\n      let result = cleanedFields(' hello,    there     world ');\n      expect(result).to.deep.equal(['hello', 'there', 'world']);\n    });\n  });\n\n});\n"
  },
  {
    "path": "webpack.config.base.js",
    "content": "const path = require('path');\nconst MiniCssExtractPlugin = require(\"mini-css-extract-plugin\");\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst CopyPlugin = require('copy-webpack-plugin');\nconst webpack = require('webpack');\nconst env = require('node-env-file');\nconst outputFolder = 'build';\n\nconst emoji = require('./src/constants/emoji');\n\nenv(__dirname + '/.env');\n\nmodule.exports = {\n  context: __dirname,\n  output: {\n    path: path.resolve(__dirname, outputFolder),\n    filename: '[name]_[chunkhash].bundle.js',\n    clean: true\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.(js|jsx)$/,\n        exclude: /node_modules/,\n        loader: 'babel-loader'\n      },\n      {\n        test: /\\.(eot|svg|ttf|woff|woff2)$/,\n        loader: 'file-loader',\n        options: {\n          'name': '[name].[ext]'\n        }\n      },\n      {\n        test: /\\.wav$/,\n        loader: 'file-loader',\n        options: {\n          'name': '[name].[ext]'\n        }\n      }\n    ]\n  },\n  resolve: {\n    extensions: ['.js', '.jsx', '.css', '.scss', '.json'],\n    modules: [\n      'node_modules'\n    ],\n    fallback: {\n      \"crypto\": require.resolve('crypto-browserify'),\n      \"stream\": require.resolve(\"stream-browserify\"),\n      buffer: require.resolve(\"buffer/\"),\n    }\n  },\n  plugins: [\n    new HtmlWebpackPlugin({\n      title: 'LeapChat',\n      template: './src/index-template.ejs'\n    }),\n    new webpack.ProvidePlugin({\n      Buffer: ['buffer', 'Buffer'],\n    }),\n    new MiniCssExtractPlugin({\n      filename: '[name].css',\n    }),\n    new CopyPlugin([\n      {\n        from: 'node_modules/emoji-datasource-apple/img/apple/64',\n        to: emoji.EMOJI_APPLE_64_PATH\n      },\n      {\n        from: 'node_modules/emoji-datasource-apple/img/apple/sheets/64.png',\n        to: emoji.EMOJI_APPLE_64_SHEET\n      },\n      {\n        from: 'src/static/js/emoji-fixed.js',\n        to: '../node_modules/emoji-js/lib/emoji.js'\n      }\n    ]),\n  ]\n}\n"
  },
  {
    "path": "webpack.config.dev.js",
    "content": "const config = require('./webpack.config.base');\n\nconst MiniCssExtractPlugin = require(\"mini-css-extract-plugin\");\n\nconfig.entry = './src';\n\nconfig.mode = \"development\";\n\nconfig.watch = true;\n\nconfig.watchOptions = {\n  aggregateTimeout: 300,\n  poll: 1000\n};\n\nconfig.module.rules = [\n  ...config.module.rules,\n  {\n    test: /\\.css$/i,\n    use: [MiniCssExtractPlugin.loader, \"css-loader\"],\n  },\n  {\n    test: /\\.s[ac]ss$/i,\n    use: [MiniCssExtractPlugin.loader, \"css-loader\", \"sass-loader\"],\n  }\n];\n\nconfig.devtool = 'source-map';\n\nmodule.exports = config;"
  },
  {
    "path": "webpack.config.prod.js",
    "content": "const webpack = require('webpack');\nconst config = require('./webpack.config.base');\nconst MiniCssExtractPlugin = require(\"mini-css-extract-plugin\");\n\nconfig.entry = {\n  main: './src',\n};\n\nconfig.mode = \"production\";\n\nconfig.module.rules = [\n  ...config.module.rules,\n\n  {\n    test: /\\.css$/,\n    use: [\n      MiniCssExtractPlugin.loader,\n      {\n        loader: 'css-loader',\n        options: {\n          importLoaders: 2\n        }\n      }\n    ]\n  },\n\n  {\n    test: /\\.scss$/,\n    use: [\n      MiniCssExtractPlugin.loader,\n      {\n        loader: 'css-loader',\n        options: {\n          importLoaders: 2\n        }\n      },\n      'sass-loader'\n    ]\n  },\n];\n\nconfig.optimization = {\n  minimize: true,\n  splitChunks: {\n    name: 'manifest',\n  },\n};\n\nconfig.plugins = [\n  ...config.plugins,\n  new webpack.DefinePlugin({\n    'process.env': {\n      NODE_ENV: JSON.stringify('production')\n    }\n  }),\n]\n\nmodule.exports = config;\n"
  }
]